Relay

io.github.vishnumuthyalu由 GitHub 帳號 vishnumuthyalu 發布v1.0.1更新於 Oct 24, 2026

Turn GitHub pushes into plain-English client update emails. Map repos to clients and review digests.

已驗證Streamable HTTP可網頁執行效率與工作流開發者工具溝通與協作

概覽

AI 產生的概覽

Relay 把 GitHub 推送轉成淺顯易懂的客戶更新郵件,助理可透過託管 MCP 端點把儲存庫對應到客戶並檢視摘要。

可以做什麼
  • 把儲存庫對應到客戶,並建立、更新或刪除這些對應
  • 檢視摘要歷史紀錄與本月用量相對於方案上限
  • 寄送範例摘要給已確認的客戶
  • 登入 GitHub 後,使用與 JSON API 共用的依安裝執行個體劃分操作
適用情境
適合自由工作者與小型代理公司:希望客戶收到儲存庫推送的簡短、不含術語摘要,並偏好透過對話讓助理完成客戶對應的設定與檢視,而不是使用網頁儀表板。
執行需求
遠端 MCP 端點 relay-vishnu.fly.dev/mcp,需透過 GitHub 進行 OAuth 2.1 登入。須在儲存庫上安裝 Relay GitHub App,且每位客戶須先以電子郵件確認才會收到摘要。自架需要 Node.js 22.12+、含 Postgres 的 Docker、GitHub App、Anthropic API 金鑰與 Resend API 金鑰。
安裝前請注意
此伺服器會寄送真實郵件給客戶並寫入對應資料:建立對應會觸發確認郵件,刪除對應會停止摘要。摘要由 Claude 依提交文字產生,可選的加強摘要還會讀取已合併 PR 描述與工單系統細節。自架需要 SESSION_SECRET、GITHUB_CLIENT_SECRET、GITHUB_WEBHOOK_SECRET、ANTHROPIC_API_KEY、RESEND_API_KEY 等密鑰,以及選用的 GITHUB_APP_PRIVATE_KEY 與 INTEGRATIONS_KEY。

安裝

在 SourceWeft 中

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

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

交給代理程式安裝

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

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

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

其他 MCP 客戶端

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

{
  "mcpServers": {
    "relay": {
      "type": "http",
      "url": "https://relay-vishnu.fly.dev/mcp"
    }
  }
}

README

Relay

Plain-English client updates from every GitHub push

[CI] [Node.js Version]

Live at relay-vishnu.fly.dev. Install the GitHub App, then add https://relay-vishnu.fly.dev/mcp to your MCP client, find Relay in the MCP Registry, or install the extension from the VS Code Marketplace or Open VSX.

Relay is a GitHub App for freelancers and agencies. Install it on your repositories, map each one to a client, and every push to the main branch becomes a short, jargon-free email summary written by Claude. Clients confirm by email before anything is sent, and every digest has a one-click unsubscribe.

How it works

mermaid
sequenceDiagram    participant Dev    participant GitHub    participant Web as Relay web    participant Queue as Postgres (pg-boss)    participant Worker as Relay worker    participant Claude    participant Resend    participant Client
    Dev->>GitHub: git push    GitHub->>Web: POST /webhook/github (HMAC-signed, installation id)    Web->>Web: verify signature, claim X-GitHub-Delivery    alt duplicate, filtered, or client not confirmed        Web-->>GitHub: 200 duplicate / filtered    else new push for an active mapping        Web->>Queue: enqueue process-push        Web-->>GitHub: 202 accepted        Queue->>Worker: job        Worker->>Claude: summarize commits (structured output), unless over the monthly cap        Claude-->>Worker: validated summary        Worker->>Resend: digest email + List-Unsubscribe        Resend-->>Client: digest    end
  • GitHub App: one install connects any number of repositories, and no personal access tokens are needed (ADR 002).
  • Multi-tenant: every row belongs to an installation, users are authorized by the installations GitHub says they can access, and uninstalling deletes that tenant's data.
  • Postgres + pg-boss: the webhook replies 202 immediately, and a separate worker sends digests with retries and backoff (ADR 003).
  • Consent built in: double opt-in confirmation, signed one-click unsubscribe (RFC 8058), and confirm/unsubscribe pages that only change state on POST.
  • Cost controls: per-installation monthly cap on Claude-written digests (plain digests past it), token usage tracking, and a CLAUDE_ENABLED kill switch.
  • Spec-first: OpenAPI 3.1 and JSON Schema contracts enforced at runtime and in CI.
  • Remote MCP server with OAuth 2.1: add one URL to Claude Code, Claude Desktop, VS Code or Cursor, sign in with GitHub, and manage Relay by chatting (docs/mcp.md, ADR 004, ADR 005).
  • Dashboard: a small server-rendered UI at /dashboard for people who don't use MCP.
  • Richer summaries (opt-in): merged PR descriptions from GitHub, and issue details from the tenant's ticket tracker through Anthropic's MCP connector, with read-only tool allowlists and fallbacks (docs/summaries.md).

Running locally

Prerequisites: Node.js 22.12+, Docker (for Postgres), a GitHub App, an Anthropic API key and a Resend API key.

bash
git clone https://github.com/vishnumuthyalu/relay-extension.gitcd relay-extensionnpm installcp .env.example .env          # fill in the values; see docs/github-app.mddocker compose up -d db       # Postgres on localhost:5432 (dev + test databases)npm run migratenpm run dev                   # web process on :3000npm run dev:worker            # worker process, in a second terminal

GitHub must reach your machine for webhooks and sign-in, so run a tunnel (ngrok http 3000) and use its URL as PUBLIC_URL and in the app settings.

Then:

  1. Open PUBLIC_URL/install and install the app on a repository.
  2. Open PUBLIC_URL/dashboard and sign in with GitHub.
  3. Map the repository to a client in the dashboard, with the API (below) or with the MCP tools. The client receives a confirmation email.
  4. After the client confirms, push to the default branch, or run node simulate-webhook.js.

To run everything in containers instead: docker compose up --build.

Deploying

One image, two processes (web, worker), one Postgres. The hosted instance runs on Fly.io (one web and one worker machine) with Supabase Postgres; migrations run as Fly's release command before each deploy. See docs/deploy.md. Tags drive releases: v* deploys the backend and updates the MCP Registry entry, and ext-v* publishes the VS Code extension.

Configuration

All settings are environment variables; .env.example lists and explains each one. The web and worker processes refuse to start if a required value is missing.

VariableRequiredPurpose
DATABASE_URLYesPostgres connection string
PUBLIC_URLYesPublic base URL (webhooks, sign-in callback, email links)
SESSION_SECRETYes32+ random characters; signs sessions and email links
GITHUB_APP_SLUG, GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GITHUB_WEBHOOK_SECRETYesFrom the GitHub App
ANTHROPIC_API_KEYUnless CLAUDE_ENABLED=falseClaude API key
RESEND_API_KEY, FROM_EMAILYesEmail delivery (verify your sending domain in Resend)
ANTHROPIC_MODELNoDefault claude-haiku-4-5
DIGEST_MONTHLY_CAPNoClaude-written digests per installation per month, default 100
CLAUDE_ENABLEDNofalse sends plain digests for everyone
GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEYNoPull request context in summaries
INTEGRATIONS_KEYNoEncrypts ticket-tracker tokens; enables tracker connections

API

The JSON API is described in spec/openapi.yaml and validated at runtime. It uses the session cookie from Sign in with GitHub.

MethodPathPurpose
GET/api/meYou and the installations you can manage
GET/api/installations/{id}/mappingsClient mappings with status (pending, active, unsubscribed)
PUT/api/installations/{id}/mappings/{owner}/{repo}Create or update a mapping; sends the confirmation email
DELETE/api/installations/{id}/mappings/{owner}/{repo}Stop digests for a repository
POST/api/installations/{id}/mappings/{owner}/{repo}/testSend a sample digest to a confirmed client
GET/api/installations/{id}/digestsDigest history
GET/api/installations/{id}/usageThis month's usage against the cap

Other routes: POST /webhook/github (GitHub App deliveries), /mcp (remote MCP), /oauth/* and /.well-known/* (OAuth for MCP clients), /dashboard, /auth/login, /auth/callback, POST /auth/logout, /install, /confirm, /unsubscribe, /privacy, /health, /ready.

MCP server

Remote: add https://relay-vishnu.fly.dev/mcp to your MCP client (or https://<host>/mcp for your own deployment). For example:

bash
claude mcp add --transport http relay https://relay-vishnu.fly.dev/mcp

Local, against your own database:

bash
RELAY_INSTALLATION_ID=12345678 npm run mcp   # stdio server for one installationnpm run mcp:inspect                          # open it in the MCP Inspector

Client setup is in docs/mcp.md, and the tool contract is in spec/mcp-tools.md.

Testing

Tests run against a real Postgres: each test file gets its own schema, so suites run in parallel. docker compose up -d db creates the relay_test database.

bash
npm testnpm run lintnpx @stoplight/spectral-cli lint spec/openapi.yaml --ruleset .spectral.yaml

CI runs the same steps on Node 22 and 24 with a Postgres service container, and fails if coverage drops (npm run test:coverage).

Project structure

relay-extension/├── server.js                 # Web process: webhooks, sign-in, API, email link pages├── worker.js                 # Worker process: sends digests from the queue├── lib/│   ├── config.js             # Env validation│   ├── db/                   # Postgres pool, migrations runner, tenant-scoped queries│   ├── jobs/process-push.js  # One delivery: caps, Claude or fallback, email, records│   ├── queue.js              # pg-boss setup│   ├── service.js            # Per-installation operations shared by API and MCP│   ├── pipeline.js           # Summarize + email│   ├── claude.js             # Claude structured outputs + schema validation│   ├── email.js              # Email HTML, unsubscribe headers, Resend│   ├── links.js              # Signed confirm/unsubscribe links│   ├── github.js             # GitHub OAuth (Sign in with GitHub)│   ├── oauth/                # MCP authorization server: clients, tokens, JWT│   ├── context/              # Optional PR and ticket context for summaries│   ├── github-app.js         # GitHub App JWT and installation tokens│   ├── crypto-box.js         # AES-256-GCM for stored tracker tokens│   ├── html.js, csrf.js      # Server-rendered pages and form protection│   ├── security.js           # Webhook HMAC verification│   └── retry.js              # Retry with backoff for Claude and Resend├── routes/                   # webhook, mcp, oauth, auth, dashboard, api, email links├── migrations/               # Numbered SQL migrations├── mcp/                      # MCP server, tools, resources, stdio entrypoint├── spec/                     # OpenAPI, JSON Schemas, webhook and MCP contracts├── tests/                    # Jest suites + helpers (per-file Postgres schema)├── extension/                # VS Code extension: registers the remote MCP server├── server.json               # MCP Registry entry├── fly.toml                  # Fly.io deployment (web + worker, migrations on release)├── docs/                     # GitHub App, MCP, summaries, deployment, ADRs, sequence diagram├── docker-compose.yml└── Dockerfile

Security

  • Webhooks are verified with HMAC-SHA256 (constant-time) before anything else reads the body.
  • Delivery IDs are claimed atomically, so duplicates and redeliveries never send twice.
  • Sessions are signed httpOnly cookies with SameSite=Lax. The JSON API only accepts JSON bodies, which blocks cross-site form posts.
  • Tenant data is always queried by installation, and other tenants' installations return 404.
  • Email links are HMAC-signed and bound to the current address. Changing a client's email invalidates old links.
  • Everything rendered into email or pages is HTML-escaped. Commit text is passed to Claude as untrusted data, and replies are schema-validated.
  • No GitHub tokens are stored.
  • MCP access tokens are bound to PUBLIC_URL/mcp (RFC 8707). PKCE is mandatory, authorization codes are single-use, refresh tokens rotate, and both are stored only as hashes. The /mcp endpoint checks the Host header against DNS rebinding.

License

MIT

來源:README.md,提交 c454b50

工具

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

版本歷史

1
  1. v1.0.1最新Oct 23, 2026

評分

已滿足適用檢查項的 85%

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

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

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

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