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 分