Skip to main content

fojin MCP server

An MCP server that exposes fojin's verified cross-canon Buddhist corpus to any MCP client (Claude Desktop, ChatGPT, research tooling). It turns fojin from "an app you visit" into infrastructure an AI can call — every passage it returns carries a portable, resolvable citation (fojin:cbeta/T0251.1), so a model can ground and deep-link its claims instead of inventing scripture.

Read-only by construction: it only issues GETs against fojin's public API.

Two ways to use it:

  1. Hosted endpoint (zero install)https://mcp.fojin.ai/mcp, streamable HTTP, anonymous, rate-limited. One line in Claude Code:

    claude mcp add --transport http fojin https://mcp.fojin.ai/mcp
    
  2. Local over stdiouvx fojin-mcp, the classic MCP install (below).

Tools

Tool What it returns
search_corpus(query, limit, lang) Semantic search hits, each with a urn, title, snippet, score
read_passage(text_id, juan_num) The actual content of one fascicle (卷) + its urn
get_parallels(text_id, juan_num) Cross-canon aligned parallels (Chinese↔Pali↔Tibetan), each with a urn and deep-link reader_ref — the alignment moat
lookup_dictionary(term, limit) Entries across fojin's 32 dictionaries
lookup_entity(query, limit) Knowledge-graph entities (people, places, works, terms)
resolve_urn(urn) Resolve/verify a fojin: URN → reader URL + existence
verify_quote(quote, cite?, juan?) Open-world verbatim check: does this quote exist anywhere in the canon? Returns URN-cited matches, honest cite_matched/juan_matched, or the closest near-miss window. Call it before serving any quoted scripture — LLMs invent quotes

Every result that names a canonical passage carries a urn — fojin's stable cross-canon identifier, interoperable with CBETA / SuttaCentral (sc/) / 84000 (84k/toh) / GRETIL / VRI numbering. Pass it back to resolve_urn, or cite it directly.

Install & run

Once published to PyPI, no clone needed — run it with uvx (nothing to install) or pip:

uvx fojin-mcp                 # zero-install, stdio transport (the MCP default)
# or
pip install fojin-mcp && fojin-mcp

From a checkout (development):

cd mcp-server && pip install -e . && python -m fojin_mcp

By default it talks to https://fojin.app/api. Point it elsewhere (self-host, staging) with an env var:

FOJIN_API_BASE_URL=http://localhost:8000/api uvx fojin-mcp

Claude Desktop

Add to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "fojin": {
      "command": "uvx",
      "args": ["fojin-mcp"]
    }
  }
}

(or "command": "fojin-mcp" if you pip installed it, or python -m fojin_mcp from a checkout.) Restart Claude Desktop; the six fojin tools then appear.

ChatGPT / other MCP clients

Any client that speaks MCP over stdio can launch uvx fojin-mcp (or the fojin-mcp console script); any client that speaks streamable HTTP can point at https://mcp.fojin.ai/mcp. Both discover the six tools automatically.

Hosting the HTTP endpoint (self-host)

The same package serves streamable HTTP (requires the http extra, which adds uvicorn):

pip install 'fojin-mcp[http]'
fojin-mcp --transport streamable-http --port 8765 --public-host mcp.example.com

The hosted mode is stateless JSON request/response (stateless_http + json_response): every tool call is one plain POST — no SSE streams, so it sits safely behind Cloudflare's proxy and behind multi-worker uvicorn. It adds:

  • Per-client rate limiting — sliding window keyed on CF-Connecting-IP / X-Real-IP (falling back to the socket peer). Tune with --rate-limit/--rate-window or FOJIN_MCP_RATE_LIMIT/FOJIN_MCP_RATE_WINDOW.
  • Host-header validation (DNS-rebinding protection) pinned to --public-host / FOJIN_MCP_PUBLIC_HOSTS (default mcp.fojin.ai).
  • Access + tool logs — one JSON line per request (fojin_mcp.access) and per tool call (fojin_mcp.tools) on stdout/stderr.
  • /healthz for container/proxy healthchecks.

The production deployment is the mcp service in the repo's docker-compose.yml (it talks to the backend container directly) plus the mcp.fojin.ai server block in deploy/host-nginx/fojin.conf.

Design

  • Standalone. Talks to fojin only over HTTP; it does not import the backend, so it installs and runs independently (deps: mcp, httpx).
  • URNs built client-side. fojin's search/read/alignment endpoints expose cbeta_id; the server builds the urn from it (fojin_mcp/urn.py, a vendored copy of the backend's build_urn, kept behaviourally identical and round-trip-tested). So citations work today, independent of any server change. get_parallels enriches each parallel's URN via a bounded, concurrent, best-effort text_id → cbeta_id lookup (a miss just leaves urn: null).
  • Testable core. All HTTP + reshaping lives in client.py and is tested against a mocked transport; server.py is a thin MCP wiring layer (SDK v2 — mcp>=2 is required; 2.0 removed the 1.x module this package imported through 0.1.0), and the hosted-edge concerns live in http.py.
  • Fails soft. An upstream error returns {"error": "..."} to the model rather than crashing the tool call.

Test

pip install -e '.[dev]'
pytest -q          # unit tests (no network)

Publishing (maintainer)

CI (.github/workflows/mcp-server.yml) lints, tests, and builds the package on every change under mcp-server/. To release to PyPI, bump version in pyproject.toml, then push a tag:

git tag mcp-v0.2.0 && git push origin mcp-v0.2.0

.github/workflows/mcp-publish.yml builds and uploads. It needs credentials once — set up either PyPI Trusted Publishing (recommended; no secret) for project fojin-mcp / repo xr843/fojin / workflow mcp-publish.yml / environment pypi, or a PYPI_API_TOKEN repo secret (then uncomment the password: line in the workflow).

License

Apache-2.0 (same as fojin).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fojin_mcp-0.3.1.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fojin_mcp-0.3.1-py3-none-any.whl (19.6 kB view details)

Uploaded Python 3

File details

Details for the file fojin_mcp-0.3.1.tar.gz.

File metadata

  • Download URL: fojin_mcp-0.3.1.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fojin_mcp-0.3.1.tar.gz
Algorithm Hash digest
SHA256 c57f066df7a42e90bdff508ebc75fb55a5123afe11ecba7b67eb32b85b17fd83
MD5 04e642043d8eb0af7bbc26d93c5bd27b
BLAKE2b-256 3422469106c1567197a1c758dc5e1308cdec717f253a76c45216438854c082af

See more details on using hashes here.

Provenance

The following attestation bundles were made for fojin_mcp-0.3.1.tar.gz:

Publisher: mcp-publish.yml on xr843/fojin

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fojin_mcp-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: fojin_mcp-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 19.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fojin_mcp-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a260c0fcd46af9d0b723c4012d4b0cdc193c6536fb04b0176fc1c48098093317
MD5 03054bfe8d3b1155d06170bda2614df9
BLAKE2b-256 dccee927337152c908755916e6ba844b69c59613642781083cf43574544cd0b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for fojin_mcp-0.3.1-py3-none-any.whl:

Publisher: mcp-publish.yml on xr843/fojin

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page