Estevao Mcp

io.github.dodopok由 GitHub 帳號 dodopok 發布v0.3.0更新於 Oct 25, 2026

Anglican liturgical calendar, lectionary and Daily Office (Book of Common Prayer) via Estêvão API

已驗證Streamable HTTP可網頁執行位置與生活知識與記憶

概覽

AI 產生的概覽

提供聖公會禮儀資料的 MCP 伺服器:助理可查詢禮儀曆、經課讀經,以及完整編排的日課(公禱書)。

可以做什麼
查詢某日的禮儀日、節期、顏色、慶節、祝文與讀經,或取得月度曆表與全年節期及移動節慶概況。取得經課讀經及主日(A/B/C)與平日(1/2)循環,並以 markdown 或結構化 JSON 編排完整的日課(晨禱、午禱、晚禱、寢前禱)。搜尋、瀏覽並檢視慶節、聖徒與聖日的詳細資料,包括遷移規則與計算方式。列出可用的公禱書版本與聖經譯本,查看各版本的偏好選項,並並列比較 2 至 4 個版本。說明某日禮儀優先順序、遷移與讀經選擇的理由。
適用情境
適合讓助理回答聖公會禮儀相關問題,例如下一個主日的讀經、編排當晚的日課,或比較不同公禱書版本對同一天的安排。
執行需求
可使用託管的遠端端點並透過瀏覽器 OAuth 登入(Google 或電子郵件帳號),或以 npx 執行本機 npm 套件,此時需在 ESTEVAO_API_KEY 提供 Estêvão API 金鑰。選用設定包括 ESTEVAO_BASE_URL、ESTEVAO_DEFAULT_PRAYER_BOOK、ESTEVAO_TIMEZONE 與 ESTEVAO_LANGUAGE。需要能連線至 Estêvão API 的網路。
安裝前請注意
本機模式需要在用戶端設定中放置金鑰 ESTEVAO_API_KEY;託管模式則透過瀏覽器帳號登入。所有工具皆標明為唯讀,不會寫入或變更資料。禮儀內容會傳送至 Estêvão API;伺服器聲明僅提供事實性禮儀資料,不產生講道或靈修內容。

安裝

在 SourceWeft 中

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

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

交給代理程式安裝

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

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

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

其他 MCP 客戶端

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

{
  "mcpServers": {
    "estevao": {
      "type": "http",
      "url": "https://mcp.caminhoanglicano.com.br/mcp"
    }
  }
}

README

estevao-mcp

[npm] [MCP Registry] [License: MIT]

MCP (Model Context Protocol) server for the Estêvão API — the liturgical engine behind the Ordo app. Gives Claude and any MCP client accurate Anglican liturgical data: calendar (with real precedence rules), lectionary readings, and the fully assembled Daily Office across multiple editions of the Book of Common Prayer / Livro de Oração Comum.

Quick start

Hosted (no key to manage) — sign in with your Google/e-mail account when the browser opens:

bash
claude mcp add --transport http estevao https://mcp.caminhoanglicano.com.br/mcp   # Claude Codecodex mcp add estevao --url https://mcp.caminhoanglicano.com.br/mcp               # Codex CLI

Other clients: see Connecting any MCP client.

Local (stdio) — you need an Estêvão API key (estevao_…):

bash
claude mcp add estevao --env ESTEVAO_API_KEY=estevao_your_key -- npx -y estevao-mcp

Or in .mcp.json / Claude Desktop config:

json
{  "mcpServers": {    "estevao": {      "command": "npx",      "args": ["-y", "estevao-mcp"],      "env": { "ESTEVAO_API_KEY": "estevao_your_key" }    }  }}

Then ask things like "what are the readings for next Sunday?", "assemble tonight's Compline" or "compare Christmas in the 1662 and 2019 prayer books".

Tools

Dates accept YYYY-MM-DD, today or next-sunday. Every tool takes an optional prayer_book (default loc_2015); all tools are read-only. Prayer book codes are validated by the API rather than pinned in this server, so editions added upstream work without a release here — list_prayer_books always shows the current catalogue.

ToolWhat it does
get_liturgical_daySeason, color, liturgical year, celebration/saint, collect and readings for a date
get_calendar_monthMonth grid: color, celebration and week per day
get_year_overviewYear structure: seasons, movable feasts and key dates
get_readingsLectionary readings (first, psalm, second, gospel), optionally per service
get_lectionary_cycleSunday (A/B/C) and weekday (1/2) cycles for a year
get_daily_officeThe complete Daily Office (morning/midday/evening/compline) as markdown or structured JSON
search_celebrationsFull-text search of feasts, saints and holy days
list_celebrationsBrowse the sanctoral calendar with filters (type, movable, year)
get_celebrationOne celebration in detail: transfer rules, calculation, collects, readings
list_prayer_booksAvailable prayer books (20+ editions, pt-BR/en/es/cy) and Bible versions
get_prayer_book_preferencesWhich preferences a book accepts (psalm translation, canticles, cycles) plus its office-level options
explain_liturgical_dayThe reasoning behind a date: precedence, transfers, colour and how each reading was chosen
compare_prayer_booksSide-by-side comparison of 2–4 prayer books for the same day or office

Resources & prompts

  • Resources: ordo://prayer-books, ordo://bible-versions, ordo://today, plus templates ordo://day/{date}, ordo://explain/{date} (the decision trail), ordo://office/{date}/{office_type} (markdown) and ordo://calendar/{year}/key-dates.
  • Prompts (strictly factual): build_liturgy_sheet (print-ready boletim), explain_feast (history, precedence, color), explain_why (why this reading/saint/colour, answered from the engine's decision trail rather than inferred), compare_traditions (side-by-side across editions).

Editorial note: this server intentionally exposes only factual liturgical data and faithful document assembly. It does not (and will not) ship prompts that generate sermons, homilies or devotional reflections.

Environment variables

VariableDefaultPurpose
ESTEVAO_API_KEY— (required for stdio)API key for the Estêvão API
ESTEVAO_BASE_URLhttps://api.caminhoanglicano.com.brOverride for local/staging
ESTEVAO_DEFAULT_PRAYER_BOOKloc_2015Default prayer book code
ESTEVAO_TIMEZONEsystemIANA timezone used to resolve today
ESTEVAO_LANGUAGE—Default label language (pt-BR, en, es) and upstream preferences[language]

Per-book preferences

The date-scoped tools take a preferences object forwarded to the API, which unlocks the per-edition options the Ordo app exposes — the Coverdale psalter on the English books ({ "psalm_translation": "coverdale" }), monthly vs appointed psalm cycles, canticle and opening-sentence choices, family-rite variants. The accepted keys differ per book, so call get_prayer_book_preferences first rather than guessing.

Languages

Liturgical content always stays in the prayer book's own language (a 1662 office is English, LOC 2015 is Portuguese). Labels generated by the server — office titles, Season/Tempo/Tiempo, comparison headings — automatically follow the book's language, and can be overridden per call (language param) or globally (ESTEVAO_LANGUAGE).

Remote server (Streamable HTTP + OAuth)

The same server runs as a remote MCP endpoint (POST /mcp, stateless Streamable HTTP). Deployed with OAuth enabled, users connect with a browser sign-in instead of pasting a key:

bash
claude mcp add --transport http estevao https://mcp.caminhoanglicano.com.br/mcpcodex mcp add estevao --url https://mcp.caminhoanglicano.com.br/mcp && codex mcp login estevao

The client discovers the authorization server, registers itself, opens the consent screen, and the user signs in with the same Google/e-mail account they use in the developer portal. The server then provisions an Estêvão API key for that account, encrypts it at rest and uses it for every upstream call — the user never sees or handles a key, and the client's token is never forwarded upstream.

Auth modes

The mode is chosen by environment, and resolved per request in this order:

  1. Single-key (personal deployment): ESTEVAO_API_KEY set on the server. Optionally set ESTEVAO_MCP_TOKEN to require Authorization: Bearer <token> from clients.
  2. API key (unchanged, for existing integrations): the caller sends its own key in X-API-Key (or Authorization: Bearer estevao_…). Disable with ESTEVAO_MCP_ALLOW_API_KEY_HEADER=false.
  3. OAuth 2.1 (recommended for public deployments): the caller sends an access token issued by this server. Enabled when the OAuth variables below are all set.

OAuth configuration

VariableRequiredPurpose
MCP_PUBLIC_URLyesPublic origin, e.g. https://mcp.caminhoanglicano.com.br. Also the OAuth issuer
MCP_ENCRYPTION_KEYyes32 bytes (openssl rand -hex 32) — encrypts stored API keys
DEVELOPER_FIREBASE_PROJECT_IDyesFirebase project of the developer portal (not the mobile app)
FIREBASE_API_KEY / FIREBASE_AUTH_DOMAINyesWeb config used by the consent screen
DATABASE_URLstrongly recommendedPostgres for clients, codes, tokens and the key vault. Without it, state is in memory and lost on restart
MCP_DATABASE_SSLnoForce TLS on the database connection (auto-detected)
ESTEVAO_PORTAL_URLnoDeveloper portal link shown on the consent screen
MCP_ALLOW_CLIENT_ID_METADATA_DOCUMENTSnoAccept URL-shaped client_ids (default true)
MCP_FIREBASE_AUTH_PROXYnoServe Firebase's sign-in helper from this origin (default true, see below)
MCP_TRUST_PROXYnoExpress trust proxy (default 1, one edge hop). Rate limits key off the real client IP

Setting only some of these is a configuration error and the server refuses to start, rather than silently falling back to key-only mode. The Postgres schema is created on boot.

Same-origin sign-in (required on mobile and Safari)

By default the Firebase Web SDK runs its sign-in helper on <project>.firebaseapp.com, a different origin from this server. Safari's ITP (16.1+), Firefox and the in-app browsers used by mobile assistants block the cross-origin round trip that flow needs: the user picks a Google account and then nothing happens. So this server reverse-proxies /__/auth/* to the Firebase helper and points the consent screen at its own origin, which is the fix Firebase documents for it. Sign-in uses a full-page redirect rather than a popup, for the same reason.

Two one-time console steps make this work:

  1. Firebase Console → Authentication → Settings → Authorized domains: add the MCP host.
  2. Google Cloud Console → APIs & Services → Credentials → the Web OAuth 2.0 client used by Firebase: add https://<mcp host>/__/auth/handler to Authorized redirect URIs.

Set MCP_FIREBASE_AUTH_PROXY=false to go back to the stock cross-origin behaviour.

Diagnosing a failed sign-in

Sign-in runs in the user's browser, so a failure there reaches no log by itself. The consent screen posts beacons to /oauth/diagnostics, which the server writes to stderr:

[consent] rendered request=… client=Claude[consent] stage=loaded pending=false storage=true ua=…[consent] stage=redirect-start request=… ua=…[consent] stage=redirect-lost request=… ua=…     ← came back from Google, state was lost[consent] stage=redirect-error code=auth/…       ← Firebase rejected the sign-in[consent] approve failed request=… error=…       ← sign-in worked, key provisioning did not

Only error codes and flags are reported — never tokens or credentials.

Endpoints: /.well-known/oauth-protected-resource (also under /mcp), /.well-known/oauth-authorization-server, /authorize, /token, /register, /revoke, and the consent screen at /oauth/consent. GET /healthz reports the active mode.

Security properties: PKCE S256 is mandatory, authorization codes are single-use and expire in 60s, refresh tokens rotate on use, access tokens are opaque and stored only as digests, tokens are bound to this server's resource identifier (RFC 8707) and rejected otherwise, and the Estêvão API key is AES-256-GCM encrypted at rest.

Connecting any MCP client

The endpoint is standard Streamable HTTP with OAuth 2.1 discovery, so any spec-compliant client can connect. Concretely:

ClientHow
Claude Codeclaude mcp add --transport http estevao https://mcp.caminhoanglicano.com.br/mcp
Claude Code plugin/plugin marketplace add dodopok/estevao-mcp then /plugin install estevao@estevao
Claude Desktop / claude.aiSettings → Connectors → Add custom connector → paste the URL
Codex CLIcodex mcp add estevao --url …/mcp then codex mcp login estevao
Gemini CLI~/.gemini/settings.json: {"mcpServers":{"estevao":{"httpUrl":"…/mcp","oauth":{"enabled":true}}}}
VS Code / Cursor / WindsurfAdd an MCP server of type http with the URL; the editor runs the OAuth flow
MCP Inspectornpx @modelcontextprotocol/inspector, transport "Streamable HTTP", paste the URL
Anything else{"type":"http","url":"https://mcp.caminhoanglicano.com.br/mcp"}

Interoperability details that make this work across clients:

  • Discovery everywhere clients look. Protected resource metadata is served both at the root and under /mcp; authorization server metadata is served at /.well-known/oauth-authorization-server, its /mcp path-inserted variant, and both OpenID Connect discovery spellings.
  • Registration. Dynamic Client Registration (RFC 7591) and Client ID Metadata Documents are both accepted; clients that pre-register a client_id work too.
  • Client authentication. none (public clients, the common case) and both client_secret_post and client_secret_basic for confidential ones.
  • Scopes. There is one read-only scope, liturgy:read. Clients that ask for unrelated scopes (openid profile, mcp, or nothing) still get a working connection.
  • CORS. Preflight is answered and WWW-Authenticate is exposed, so browser-based clients can read the challenge and start the flow.
  • Probes. Unauthenticated GET/DELETE on /mcp return the auth challenge rather than a bare 405, so clients that probe before authenticating still discover the flow.

Client config for a key-based deployment

json
{  "mcpServers": {    "estevao": {      "type": "http",      "url": "https://<your-host>/mcp",      "headers": { "X-API-Key": "estevao_your_key" }    }  }}

Extra env: PORT (default 3333), ESTEVAO_MCP_ALLOWED_HOSTS (comma-separated; enables DNS-rebinding protection).

Plugin para Codex, Claude e outros clientes

O repositório inclui um pacote universal em plugins/estevao, com manifests para Codex e Claude Code e uma configuração MCP compartilhada. O pacote aponta para o servidor hospedado, então a conexão usa OAuth e não exige copiar uma API key.

Para Claude Code:

/plugin marketplace add dodopok/estevao-mcp/plugin install estevao@estevao

Para Codex CLI:

bash
codex mcp add estevao --url https://mcp.caminhoanglicano.com.br/mcpcodex mcp login estevao

Veja o guia visual de integração no portal do desenvolvedor. O mesmo endpoint funciona em qualquer cliente MCP compatível com Streamable HTTP e OAuth 2.1.

Development

bash
npm installnpm run typecheck && npm test    # vitest + msw fixtures, no networknpm run build                    # tsup → dist/index.js + dist/http.jsnpm run inspector                # manual testing with the MCP Inspector
# end-to-end against a local estevao-api (docker-compose up in that repo):SMOKE_KEY=estevao_… npx tsx scripts/smoke.ts
# remote transport (see .env.example for the OAuth variables):npm run build && node dist/http.jsdocker build -t estevao-mcp . && docker run -p 3333:3333 --env-file .env estevao-mcp

Releasing

bash
npm version patch        # bumps package.json AND server.json (version hook), commits + tagsgit push --follow-tagsnpm publish --access publicmcp-publisher publish    # mcp-publisher login github, first time

The npm version lifecycle hook (scripts/sync-version.ts) keeps server.json in sync and enforces the registry's 100-char description limit. The server's advertised MCP version comes from package.json at build time.

server.json lists both the hosted endpoint (remotes) and the npm package (packages), so registry clients can pick either. Keep the hosted URL in step with the actual deployment.

Alternatively, once GitHub Actions is available with the NPM_TOKEN secret, git push --follow-tags alone triggers the release workflow (npm with provenance + MCP registry via GitHub OIDC).

License

MIT

來源:README.md,提交 589268c

工具

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

版本歷史

1
  1. v0.3.0最新Sep 16, 2026

評分

已滿足適用檢查項的 85%

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

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

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

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