Gagarin Cloud

cloud.gagarin由 gagarin.cloud 發布官方發布者v0.3.0更新於 Nov 4, 2026

Your agent ships the app. Alerts, logs, project memory and approval-gated deletes come with it.

已驗證Streamable HTTP可網頁執行雲端與基礎設施知識與記憶安全與監控

概覽

AI 產生的概覽

Gagarin Cloud 的遠端 MCP 伺服器,讓助理部署應用程式、開通後端服務、查看日誌與告警,並維護專案記憶。

可以做什麼
  • 在可存取的 HTTPS 位址上部署與回復應用程式,查看狀態與版本
  • 開通並連接 Postgres、Qdrant、Valkey、佇列、儲存桶等後端服務,並設定服務之間的存取關係
  • 讀取專案的告警、日誌與備份
  • 儲存、搜尋、更新、關聯與檢視專案記憶中的長期事實與決策
  • 提交執行任務並輪詢其狀態;刪除操作需人工以電子郵件核准
適用情境
適合讓編碼助理在對話中直接交付並維運 Gagarin 平台上的應用程式:部署已在映像檔倉庫中的映像、加入資料庫或佇列、查看日誌與告警,或透過專案記憶在多次工作階段間保留決策。
執行需求
遠端 streamable HTTP 端點;透過 GitHub 或 Google 的 OAuth 登入,或在 Authorization 標頭提供 Gagarin CLI 產生的 bearer 憑證。需要 Gagarin 帳號與專案。此處無法建置與推送映像檔,需在裝有 docker 與原始碼的機器上用 CLI 完成。
安裝前請注意
工具會操作真實基礎設施:部署、開通服務、修改網路存取規則、寫入記憶與提交執行任務。刪除需由人工透過電子郵件核准。伺服器在每次呼叫時把呼叫者自己的 bearer 權杖傳給 Gagarin API,因此憑證權限即生效範圍,應視為機密。伺服器端不保存任何憑證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Gagarin Cloud,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/cloud.gagarin%2Fgagarin/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "gagarin-cloud": {
      "type": "http",
      "url": "https://mcp.gagarin.cloud/mcp"
    }
  }
}

README

mcp

mcp.gagarin.cloud — deploy with ease, maintain without fear.

Add one URL to your agent and it can run your app at a live HTTPS address, give it Postgres, Qdrant, Valkey, a queue or a bucket, wire what may reach what, and roll back. Alerts, logs, backups and project memory come with it, and nothing is deleted without your approval by email. It is Gagarin's API, as tools: 51 of them, every one annotated so a client knows which to ask you about first. Building and pushing an image needs docker and the source, so that one step is gg ship on the machine that has them; everything after it is here.

https://mcp.gagarin.cloud/mcp

The Model Context Protocol is how an agent finds and calls a tool it was not built with. This is Gagarin's, and it exists so that adding Gagarin to a coding agent is a URL rather than an install — the one artefact that makes the platform installable rather than merely documented.

Two ways in, one implementation:

remotehttps://mcp.gagarin.cloud/mcp, streamable HTTP, credential in the Authorization header — put there by OAuth sign-in or by hand
localnpm run stdio from a clone of this repository, credential from GAGARIN_TOKEN or the file gg login wrote — for developing on this server, not a way to install it

Signing in

Remote, with OAuth. Give the client the URL and nothing else:

https://mcp.gagarin.cloud/mcp

Claude, ChatGPT and Claude Code prompt for sign-in when they connect: the client opens a browser and the human signs in with GitHub or Google. A request with no credential answers 401 with a WWW-Authenticate header pointing at /.well-known/oauth-protected-resource/mcp, which names api.gagarin.cloud as the authorization server. This server decides nothing about a token itself; the engine does, on every call. GAGARIN_MCP_ORIGIN and GAGARIN_ISSUER override the two public names for a development setup; they are separate from GAGARIN_API, which in the cluster is the in-cluster Service and no address a client could sign in at.

Remote, with a credential in a header. For a client that cannot sign in over OAuth, or a machine that should not: a credential from gg login or gg creds create.

jsonc
{  "mcpServers": {    "gagarin": {      "type": "http",      "url": "https://mcp.gagarin.cloud/mcp",      "headers": { "Authorization": "Bearer <your gagarin credential>" }    }  }}

Local, over stdio. npm run stdio from a clone runs the same tools over a pipe, reading the file gg login wrote, or GAGARIN_TOKEN if it is set. It is here to develop against, and is deliberately not published to npm: the point of this server is that adding Gagarin to an agent is a URL and not an install, and a package on somebody's laptop is a second copy of src/tools.ts that goes stale the day a tool changes.

A credential that has expired or been revoked is caught at the door too, because a client signs in again only on an HTTP 401: every POST asks the engine /v1/whoami with the caller's token first, and the engine's 401 becomes a 401 with error="invalid_token". One extra in-cluster call per request, and no cache — a remembered token is a stored token, and this server stores none. Any other failure there (the engine unreachable, a 5xx) is not a sign-in problem, so the request goes on and each tool reports it with the engine's own code.

Developing

npm installnpm run buildnpm test                 # builds, then node --test over dist/npm start                # the HTTP server on :8080npm run stdio            # the same tools over a pipe

What is here

pathwhat it is
src/api.tsthe whole of this server's contact with Gagarin: one request, one error envelope
src/tools.tsevery tool — each one a path, a shape, and the rule a caller needs before using it
src/server.tswhat a client is told on connect, and the gagarin://guide resource — including how memory is used and the .gagarin.json note that says which project a repository is
src/app.tsmcp.gagarin.cloud: stateless streamable HTTP, one server per request, and the OAuth protected-resource metadata
src/http.tsthe listener, its configuration and its drain
src/stdio.tsthe same tools over a pipe, for developing against from a clone
src/credentials.tsreads the credential file gg login wrote; never writes one
Dockerfilethe image mcp.gagarin.cloud runs. Its build stage runs the tests

Project memory

Every project carries a memory: small, durable facts an agent saves about a codebase — a decision and why, a convention, a gotcha — so the next session does not rediscover them. It is a built-in of the project, like its registry, and these tools are the only way to reach it: the memory service has no address of its own, no gg command and no console page. The engine decides who may read (viewer) and who may write (editor), on every call, like everything else.

toolwhat it does
memory_briefingwhat is known about a project, packed to a token budget — the first call on a project; focus and paths tailor it, and it ends with the last 7 days' changes
memory_searchhybrid semantic + keyword search; no query browses by rank
memory_getmemories in full, by id or key
memory_relatedwalk the links out from one memory
remembersave one fact; a near-duplicate is refused with the memories it collided with, and a key replaces the memory holding it
memory_updatechange fields, set or clear the key, pin, archive, confirm it still holds or dispute it
memory_link / memory_unlinkassociate two memories, or stop
memory_reviewhousekeeping: likely duplicates, orphans, oversized, stale, unread and disputed memories, distance to the cap

Export and import have no tool: they are for people and scripts, and a tool's definition costs tokens in every session whether it is called or not.

These answer the memory service's own text — a plain-text rendering packed to the budget — rather than the JSON around it. That is a narrower case of the rule below, not an exception to it: the rendering is still the engine's, and returning both would spend twice the tokens the service exists to save. A body without text comes back as JSON like any other answer.

It is a translator, and nothing else

It holds no credential of its own, has no database, and makes no decision the API does not make. Every tool is one call to api.gagarin.cloud carrying the caller's own bearer token, and every refusal is the engine's refusal passed through unedited.

That is the property everything else rests on: possessing this server grants nothing at all. It is what makes it safe to put a public endpoint in front of a single write gate, and nothing here may be changed in a way that weakens it.

Two consequences worth stating, because both look like omissions:

  • Answers are the engine's JSON, not a summary of it. Every service, ledger line and connection already carries a sentence written by the engine, precisely so a terminal and a dashboard cannot describe the same row differently. A third renderer here would be a third opinion to keep in step.
  • Errors are [code] message with a hint: line, which is what gg prints. One format, so an agent that has read the Gagarin skill recognises what comes back here without being taught a second one. When the engine sends more than the envelope — a memory_duplicate carries the near-duplicates — that is appended after the hint rather than dropped.

What it deliberately cannot do

Four things need a machine, and offering them here would produce failures that read like platform faults:

  • Build and push an image. gg ship — build, push and deploy fused — shells out to docker where the source is. deploy here runs an image that is already in Gagarin's registry: a tag CI pushed, or a restatement. Getting one there is the CLI's job.
  • Open a tunnel. gg connect binds a local port.
  • Wait for a job to finish. run submits and returns a revision, like every other write here. gg run blocks until the run ends and exits with the script's own exit code, which is what a pipeline wants; over MCP you poll status for the phase and the code.
  • Click an approval. That is a human with an inbox, by design.

There is also no list of resource types, sizes or scopes in this repository. The engine owns those and its refusals name them; a z.enum here would be a second list in a second repository, wrong on the day a type is added — a mistake this codebase has already made once, in gg, about this exact family of values.

Where it runs

In the Kubernetes cluster, next to the control plane, and not on Vercel beside the site and the console. Those two live outside Scaleway because their job is to still be there and say the platform is down. This one has nothing whatever to say when the API is unreachable; it is that API in another shape, so it belongs next to it and reaches it over the in-cluster Service rather than hairpinning out through the load balancer.

The pod runs as a ServiceAccount with no RBAC and no mounted token, on a read-only root filesystem. It needs none of them.

Every push to main builds the image and rolls it out — .github/workflows/deploy.yml. The credentials that can do that are secrets of the production environment, which only main may use, so a pull request never runs next to them. Merging to main is deploying.

Adding a tool

One server.registerTool call in src/tools.ts: a name, a description saying the rule a caller most needs, a zod shape, and one api.call. Then a test in src/tools.test.ts asserting the path, the method and the body — those are the only things it is possible to be quietly wrong about, and a deploy that PUTs to the wrong path answers 404 and reads like a missing service.

Do not add a tool for something the API does not do. This file has no business being the place a feature appears first.

來源:README.md,提交 0cb9462

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

3
  1. v0.3.0最新Oct 21, 2026
  2. v0.2.0Sep 22, 2026
  3. v0.1.0Sep 18, 2026

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分