Door43, as you.

door43-mcp 0.5.0 · live at door43.klappy.dev

Door43-mcp is a small MCP server that lets an AI agent use Door43 (DCS, the Gitea host for unfoldingWord's open Bible translation resources) as you. You log in with your own Door43 account; the server keeps the grant and never sees a pasted token. Three tools cover the whole job: read the API reference, run one GET/HEAD request, read the server's own numbers.

Not a helps aggregator, not a multi-host broker, not a token vault, not a write surface, not a cache of DCS content.

Live

Upstream
checking…
Host
git.door43.org
Observed
—
Server
0.5.0 (from package.json)

Connect in three steps

https://door43.klappy.dev/mcp
  1. Add the MCP URL to your client (Claude, Cursor, or any MCP client that speaks OAuth).
  2. Log in when the client sends you to git.door43.org and approve the app.
  3. Ask for execute GET /user — it returns your Door43 login. You are in.

The three tools

docsExplain this server and DCS — boarding pass, map, any path, recipes
executeRun one GET/HEAD against DCS as you, with a resume-point envelope
telemetryRead this server's own usage numbers (SELECT only)

Journeys

whoami — Who is the logged-in user. args: —

execute GET /user fields:["login","id","full_name"]

catalog-by-language — Latest catalog entries for one language. args: lang=en stage=prod

execute GET /catalog/search?lang={lang}&stage={stage}&limit=20 fields:["data[].full_name","data[].subject","data[].branch_or_tag_name","data[].zipball_url"]

latest-release-zip — The latest release of a repo and its zipball. args: owner* repo*

execute GET /repos/{owner}/{repo}/releases/latest fields:["tag_name","name","published_at","zipball_url"]

repo-tree-at-ref — The file tree of a repo at a ref (use recursive:true for the whole tree). args: owner* repo* ref=master

execute GET /repos/{owner}/{repo}/git/trees/{ref}?recursive=true&per_page=1000 fields:["sha","truncated","tree[].path","tree[].type","tree[].sha"]

page-through — Walk a paged list: call once, then replay next from each envelope until it is null; hints carries x-total-count. args: limit=50

execute GET /catalog/search?limit={limit}&page=1 fields:["data[].full_name"]

read-file-at-pin — One file's content at a pinned sha (the ref the upstream already gave you; never minted here). args: owner* repo* path* sha*

execute GET /repos/{owner}/{repo}/contents/{path}?ref={sha} fields:["name","sha","size","encoding","content"]

Each one is docs({recipe:"…", args:{…}}); the server fills the call for you (* required, = default). execute({recipe, args, dry_run:true}) prices it first.

Governed by klappy://canon/constraints/mcp-tool-surface-ceiling. Reads only in v1; you can revoke access any time by deleting the app on Door43.