Tripitaka MCP
io.github.dhamma-seeker/tripitaka-mcpVersion 1.3.0MCP server for the full Pāli Canon — search, cite, compare translations. Offered as Dhamma Dāna.
Status
Responds182 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:49 UTC
- Latency
- 182 ms
- Remotes responding
- 1 of 2
- Sign-in
- No sign-in, Sign-in unknown
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://mcp.tripitaka-mcp.com/mcpResponds182 msNo sign-in
Claude Code
claude mcp add --transport http tripitaka-mcp https://mcp.tripitaka-mcp.com/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: tripitaka-mcp
Remote MCP server URL: https://mcp.tripitaka-mcp.com/mcpCursor
{
"mcpServers": {
"tripitaka-mcp": {
"url": "https://mcp.tripitaka-mcp.com/mcp"
}
}
}VS Code
code --add-mcp '{"name":"tripitaka-mcp","type":"http","url":"https://mcp.tripitaka-mcp.com/mcp"}'SSE
https://mcp.tripitaka-mcp.com/sseNot checkedUses SSEUses SSE (legacy), not checked
Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
14 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
compare_translationsCompare every available translation for a single segment.
💡 **Use this tool when:**
- The user asks about the meaning/translation of a single Pāli line
and wants to see multiple translators side-by-side.
- Checking how different translators interpret the same line —
technical terms like `dukkha`, `anattā`, `nibbāna` carry nuance
that varies across translations.
- Academic work that needs to quote multiple translations.
🔍 **vs `get_sutta`:** this tool targets a **single segment** (line
level); `get_sutta` returns the **whole sutta**. To compare a whole
sutta you'd call `compare_translations` for each segment.
📋 **segment_id format:** `<sutta_id>:<paragraph>.<line>`, e.g.
`mn1:171.4` (Mūlapariyāyasutta paragraph 171 line 4 — "Nandī
dukkhassa mūlaṁ"). Find segment_ids via `get_sutta` or search results.
⚠️ **Current state:** the `translation` table is mostly empty (the DB
only loads default Pāli + English from bilara). `total_editions` is
usually 0; `text_pali` and `text_english` are always populated. Thai
editions will be added later. | No | Yes | Yes | No |
define_from_suttasFind how the **suttas and Vinaya define a Pāli term in their own words**.
The canon defines its own terms with fixed formulas — "Katamañca …
dukkhaṁ?" (what is X?) … "ayaṁ vuccati … dukkhaṁ" (this is called X),
"X adhivacana" (X is a designation for …), or the Vinaya "X nāma". This
tool locates those definitional passages and returns them **cited**, so
the assistant can present the doctrinal essence straight from the source.
🧭 **This tool vs `get_word_definition`:**
- **`define_from_suttas`** → the *doctrinal* definition, how the term is
defined **inside the canon**. Use for "how do the suttas define X",
"what is the canonical definition of X", "define X from the suttas".
Returns a few precise segments, not a lexicon essay.
- **`get_word_definition`** → the *lexical* definition from dictionaries
(Payutto / PTS / DPPN). Use for etymology and word meaning.
They complement each other — offer both when the user wants the full
picture (dictionary sense + how the Buddha defined it).
📖 **How to present the result:**
Results are ranked; the top one is usually the canonical definition.
**Quote the Pāli (and English where present) verbatim** and render each
`cross_reference.tripitaka_mcp_reader.segment_url` as clickable markdown
so the user can verify. Do NOT paraphrase into your own definition — the
point is the canon's own words. Each result is tagged `kind`
(direct / simile) and `detail` (descriptive / enumerative); a
*descriptive* definition characterises the term, an *enumerative* one
lists its types — prefer the descriptive when explaining the essence.
⚠️ A result tagged `context: true` **does not contain the term in its own
line**. The canon's stock similes attach to a formula rather than to a
word: the four jhāna similes (bath powder, deep lake, lotus pond, white
cloth) never say *jhāna*, they illustrate the `vivicceva kāmehi …` formula
that opens the paragraph. Such rows are found through that paragraph, so
**say so when quoting one** — present it as th | No | Yes | Yes | No |
get_referenceBuild a proper citation string for a sutta.
💡 **Use this tool when:**
- The user wants a citation for academic work, an article, or a reference.
- You need to know the canonical location of a sutta (pitaka / nikāya).
- You want a ready-to-use formatted citation string.
🔗 vs `get_sutta`: this tool returns metadata + citation only, no
segments. Pair it with `get_sutta` when you want both the content
and the citation. | No | Yes | Yes | No |
get_suttaFetch a sutta's content — OR its table of contents (`mode="outline"`).
⚡ **Decide which mode BEFORE calling — don't fetch the whole sutta and
parse it yourself:**
- The user wants the **structure / outline / table of contents**, or asks
**"how many sections/parts"** / "what's in it" → call
`get_sutta(sutta_id, mode="outline")`. It returns the section list
(titles + segment counts + ids), NOT the full text — cheap and exact.
- The user wants the **context around a search hit** → `around="<segment_id>"`
(search tools hand you the id, e.g. `dn22:18.1`) + optional `window`.
- The user wants a **specific part** you already located → `segment_range="A..B"`
or `offset`+`limit`.
- Only fetch the **whole** sutta (no mode/selector) when the user actually
wants to read/quote a SHORT sutta in full. Long ones (DN, long
Vinaya/Abhidhamma; > ~400 segments — e.g. `dn16` is 1,664) should almost
always start with `mode="outline"`; pulling the entire text wastes the
context window.
Uses standard SuttaCentral IDs, e.g.:
- `mn1` = Majjhima Nikāya sutta 1 (Mūlapariyāyasutta, 334 segments)
- `dn22` = Dīgha Nikāya sutta 22 (Mahāsatipaṭṭhānasutta, 454 segments)
- `dn16` = Dīgha Nikāya sutta 16 (Mahāparinibbānasutta — the longest
sutta in the canon, 1,664 segments)
- `sn56.11` = Saṃyutta 56.11 (Dhammacakkappavattana)
- `mn62` = Majjhima Nikāya 62 (Mahārāhulovāda — advice to Rāhula)
- `dhp1-20` = Dhammapada verses 1-20 (KN uses range format)
- `mil3.1.1` = Milindapañha 3.1.1 (paracanonical, 3–4 level id)
💡 **Hints for the AI client:**
- **Quote `text_pali` / `text_english` directly from the returned
segments** — do not rely on training memory. The system is
verifiable; AI recall is often wrong.
- Short segments numbered `:0.n` are **headers**, not the teaching
itself — actual content starts around `:1.1`. They run collection →
book → chapter → sutta, so the **last** one is the sutta's own name
(`sn35.245:0.3` = Kiṁsukopamasutta, while `:0.2` is its chapter).
| No | Yes | Yes | No |
get_word_definitionLook up the dictionary meaning of a Pāli word, with sutta context.
Serves as a Pāli Dictionary Bridge — pairs the "definition" with the
"context where the Buddha actually used the word".
📖 **About the dictionary sources:**
This tool draws from multiple primary dictionaries, including
"พจนานุกรมพุทธศาสน์ ฉบับประมวลศัพท์" (Buddhist Dictionary —
Concept-Glossary edition) by Somdet Phra Buddhaghosacariya (P. A.
Payutto). The Thai-language entries are **original scholarly works**
(not translations), so they are **always available** even when
ENABLED_LANGUAGES has Thai disabled. The AI client should translate
Thai entries into the user's language if needed.
🔀 **Two kinds of thing in one payload.** `definitions[]` come from the
dictionaries, not the canon, so they carry **no `segment_id`**;
`appears_in_context[]` is corpus text and does carry one. `related_words[]`
are headwords holding your query as a substring, so opposites appear —
`dhamma` returns `adhamma`. Context examples are drawn at random: two
identical calls return different ones. | No | Yes | Yes | No |
list_editionsList the translation editions available, with coverage stats.
💡 **Use this tool when:**
- Before calling `compare_translations` or `get_sutta(edition=...)`,
so you know which edition values are valid and worth comparing.
- The user asks which editions are loaded in the DB.
🔍 **Filtering:** Filtered by the server's `TRIPITAKA_ENABLED_LANGUAGES`
— when Thai is disabled the list is empty. Only enabled languages
are returned.
⚠️ **Current state:** the DB mostly holds Pāli (default from
SuttaCentral bilara) and English (bilara's translators). Thai editions
(`dhiranandi`, `jayasaro`, `mbu`, `royal`) aren't indexed yet — the
list returns empty until they're loaded. | No | Yes | Yes | No |
list_structureShow the structure of all three pitakas with coverage statistics.
💡 **Use this tool when:**
- The user asks for an overview of the Tipiṭaka (what's in it / which
collections).
- You need to check coverage before promising a search will find
something — `segment_count > 0` is the active-loaded signal.
- Verifying scope when compiling an artifact.
📊 **Current state (v1.1+, at parity with SuttaCentral bilara-data):**
- **Sutta Piṭaka** complete: DN 37, MN 155, SN 1,829, AN 1,419, KN
2,351 sections (~284,702 segments) — Pāli + bilara EN (Sujato for
DN/MN/SN/AN and most of KN; a few KN books have other bilara
translators)
- **Vinaya Piṭaka** complete: Bhikkhu Vibhaṅga 222, Bhikkhunī Vibhaṅga
127, Khandhaka 22, Parivāra 51 + Pātimokkha 2 (~71,557 segments) —
Pāli + Brahmali EN
- **Abhidhamma Piṭaka** complete: 7 books (ds, vb, dt, pp, kv, ya,
patthana) ~88,414 segments — Pāli only (bilara has no English for
any Abhidhamma book)
- **Total ~444,673 segments** in the DB
⚠️ **Known quirks:**
- The schema carries duplicate legacy + SC-modern codes side by side:
- Vinaya: `vin-v/vin-m/vin-c/vin-p` (legacy, segment_count = 0)
alongside `pli-tv-bu-vb/pli-tv-bi-vb/pli-tv-kd/pli-tv-pvr`
(active, populated).
- Abhidhamma: `ym/pt` (legacy = 0) alongside `ya/patthana` (active).
- **Use the `active` flag** — each nikaya carries `active: true/false`
(true ⇔ `segment_count > 0`). Pick `active` nikayas; the others are
metadata placeholders from an older migration.
🌐 **Languages:** Returns Pāli + Thai + English labels regardless of
enabled set (these are metadata, not segment text). Text content
follows ENABLED_LANGUAGES. Thai translations aren't loaded yet. | No | Yes | Yes | No |
open_sutta_viewerOpen an interactive sutta viewer inside the chat — Pāli + English,
plus an optional third row in the user's own language translated BY YOU.
Renders each segment as: Pāli on top (canonical), the bilara-data
English below it (verification anchor), and — when you supply
`translations` — your translation in the user's language, clearly
badged as AI-generated. Prefer this over dumping raw segments when the
user wants to *read* a sutta.
- `sutta_id` — standard SuttaCentral id, e.g. `sn56.11`, `mn10`, `dn22`.
- `around` — a segment_id (e.g. `dn22:18.1`, from a search hit) to centre
on; that segment is highlighted and scrolled into view. Use this after
a search so the reader lands on the exact cited line.
- `offset` — 0-based segment index for paging long suttas (use
`next_offset` from the previous result). Do NOT combine with `around`.
- `window` — segments before/after `around` to include (default 12).
🌐 **Translating for the user (important):** when the conversation
language is neither English nor Pāli, you SHOULD translate the displayed
segments and pass them via `translations` so the user reads in their own
language while still seeing the originals:
1. Fetch the segments first (`get_sutta` with the same selector) so you
have the exact Pāli + English text. (Already called this tool without
translations? The result contains the segments — translate them and
call this tool AGAIN with the same selector plus `translations` to
upgrade the view.) Your translation must travel through the
`translations` parameter to appear in the viewer — writing it as a
normal chat message leaves the viewer bilingual and looks broken; the
tool always accepts `translations`, so never report it as missing.
2. Translate **from the Pāli as the source, using the English as a
semantic guide** — never relay-translate from English alone. Preserve
untranslatable doctrinal terms (dukkha, jhāna, taṇhā…) as loanwords
with a brief gloss instead of forcing equivalents | No | Yes | Yes | No |
parse_pali_wordStrip Pāli inflectional suffixes to find the root form (basic stem).
💡 **Use this tool when:**
- You find an inflected Pāli word (e.g. `dukkhassa`, `bhikkhūnaṁ`) and
`get_word_definition` doesn't find it directly — Pāli inflects nouns
across 7 cases × 2 numbers, ~16 forms per root.
- You want to see possible stems before another `get_word_definition`
lookup.
🔄 **Recommended workflow:**
`parse_pali_word(inflected_form)` → get `possible_stems[]` →
call `get_word_definition(stem)` per stem until you find a definition.
⚠️ **Limitations:**
- Rule-based first-pass — strips common suffixes (case endings, vowel
shortening). Not a full morphological analyzer.
- Compound words (samāsa) are NOT split — `dukkhanirodha` won't be
broken into `dukkha` + `nirodha`.
- Sandhi (sound junctions) like `tena ahaṁ → tenāhaṁ` aren't reversed.
- Returns **possible** stems — verify each via `get_word_definition`.
⚠️ **`possible_stems` are rule output, not findings.** They come from the
suffix table applied to your input — nothing was looked up, so no field
carries a `segment_id`, and some candidates are not Pāli words at all. Treat
each as a spelling to try in `get_word_definition`, never as an attested
form. | No | Yes | Yes | No |
search_by_keywordKeyword search across the Pāli Tipiṭaka (trigram word-similarity).
Searches the configured enabled language(s) on the server. Filterable
by pitaka and translation edition.
💡 **Hints for the AI client:**
The system's canonical reference is Romanised Pāli (from SuttaCentral).
If the user asks in a disabled or unsupported language, translate the
keyword to **Romanised Pāli (preferred) or English** before calling this
tool — e.g. "suffering" → "dukkha", "mindfulness of breathing" →
"ānāpānassati". See the server instructions for the enabled language set.
✅ **Diacritics do not matter.** `anapanassati` and `ānāpānassati` return
the same thing; so do `nibbana` and `nibbāna`. Write the macrons if you
know them, guess without them if you don't — neither costs you results.
⚠️ **A common Pāli noun is a poor query.** `samudda` (sea) matches ~700
segments and the top of that list is mostly section headings, not the
passage that teaches anything. Two things to do instead:
- Search the **rarest distinctive noun** in the passage, not its most
obvious one. For the simile of the blind turtle, `turtle`/`kacchapa`
gets there; `ocean`/`samudda` does not, in either language.
- **Prefer English, or raise the limit.** `turtle` returns SN 56.47 and
SN 56.48 inside the default window; `kacchapa` matches them too but
ranks them past 30, so you need `limit=50` to see them.
- A word inside a **compound** may be out of reach entirely: `samudda`
scores 0.50 against `mahāsamudde` (compounded *and* inflected), under
the 0.6 cutoff, so SN 56.47 is not ranked low — it is excluded. Trying
more spellings will not recover it; search a different word instead.
🔍 **Pick the right search tool for the question shape:**
- **Term lookup (exact word appearances)** — e.g. "occurrences of
`ānāpānassati`": this tool is best (trigram nails the exact word).
- **Concept search ("discourses about X")** — e.g. "discourses about
mindfulness of breathing": **use `search_hybrid` instead.** Canonic | No | Yes | Yes | No |
search_hybridHybrid search — combines keyword + semantic search via RRF.
Uses Reciprocal Rank Fusion (RRF) to merge exact-word results with
meaning-based results. **This is the recommended tool for "discourses
about X" / concept queries**, because the semantic side catches suttas
that discuss a concept using different vocabulary (e.g. some
mindfulness-of-breathing suttas use `assasati/passasati/dīghaṁ`
instead of `ānāpānassati`).
⚠️ **Send the question and nothing else. Do not pad the query.**
The whole string becomes one vector, so every word you add moves it.
Appending your own candidate terms — synonyms, Pāli equivalents, a
keyword list — searches for the blend, not for the question.
Measured on `Buddha flies in the sky`: asking it plainly put the right
passage at **rank 1** (3 relevant suttas). Appending three guessed Pāli
terms (`buddha, agga, sagga`) pushed it down to **rank 5** and left
only 1 — because `agga` (supreme) and `sagga` (heaven) drag the vector
toward their own meanings.
Have candidate terms worth searching? Give them their own
`search_by_keyword` call and merge the two result lists. One tool asks
what a passage means, the other asks where a word occurs; combined into
a single string they cancel out.
Rewriting the question to sound more canonical does not help either —
the same query phrased as `rose into the air and flew like a bird`
scored **zero** relevant hits.
💡 **Hints for the AI client:**
- English queries usually work best (e.g. `mindfulness of breathing`)
because the embedding model is multilingual but EN-primary.
- Thai stop-word handling is weak. If a Thai query underperforms, the
AI client should translate to Pāli/English first (see server
instructions).
- The default `limit=5` is often too small for a topic survey — use
`limit=15-20` (max 20) for good coverage.
- `language` only chooses what comes back; it does not change what
matches or how results are ranked.
- Looking for a concrete thing rather than a concept (an animal, an
| No | Yes | Yes | No |
search_semanticSemantic search — match by meaning, not exact words.
Uses vector similarity (cosine distance) over `text_pali` embedded with
a multilingual MiniLM model.
🤔 **In most cases you should use `search_hybrid` instead** — it
combines this semantic search with keyword search and ranks better.
Use this tool only when you need:
- Pure semantic results (no keyword influence)
- Fine-grained `threshold` tuning (hybrid uses RRF which is harder
to tune)
- To debug what semantic alone picks up vs keyword
⚠️ Known limitations:
- The index is **Pāli only** (English/Thai queries pass through the
multilingual embedding but the model isn't tuned on Pāli)
- English queries usually embed better than Thai (model is EN-primary)
- For specific Pāli terms (`appamāda`, `dukkha`), exact match is
better — use `search_by_keyword` instead
- Pāli stock phrases recur in many suttas → similarity scores
cluster; read the top 10, don't trust rank 1 alone
📐 **Reading `distance`.** It is cosine distance between your query's
embedding and the segment's, so smaller is closer, and a row is returned
only at or under `threshold` (default 0.7) — an empty result means nothing
cleared that cut. Ordering is proximity of meaning in one model's space, not
doctrinal importance. | No | Yes | Yes | No |
survey_corpusExhaustively survey the WHOLE Tipiṭaka for a term — guaranteed complete.
Use this (not `search_by_keyword`) when the question is about **coverage or
counting** rather than "show me the best passages":
- "How many times does Kusinārā appear in the canon?"
- "Every place ānāpānassati is mentioned — don't miss any"
- "Which pitakas/how many suttas mention this term?"
Unlike `search_by_keyword` (ranked, capped at 50, no total), this returns an
**exact count**, a **per-pitaka breakdown**, the **distinct surface forms**
that matched (so you can audit and discard over-matches), and a paginated
enumeration. The `lexical` result carries `complete: true` — a hard
guarantee that nothing was dropped for the chosen `match_scope`.
Two layers, two different promises:
- **lexical** — the word and its forms. Deterministic + EXHAUSTIVE.
- **semantic** (`mode="thorough"`, hosted only) — passages teaching the same
concept with DIFFERENT vocabulary (e.g. ānāpānassati via
`assasati`/`passasati`). Approximate, **NOT exhaustive** — it never claims
completeness, it only boosts recall. | No | Yes | Yes | No |
verify_quoteVerify, check, or confirm a Buddha quote — does the canon really say it?
Fact-check a quotation attributed to the Buddha. Catches fake, misquoted,
misattributed and misremembered passages, and finds the true reading.
Paste a line that has been quoted or half-remembered — Pāli or English —
and this says whether the canon really contains it, cites where, and if
not, shows the closest thing that is actually there.
🧭 **When to use this:**
- A quote is attributed to the Buddha and you are not certain it is real.
A fabricated line that *sounds* canonical is the hardest error to catch
by reading, because it reads correctly. Check it instead of trusting it.
- Someone recalls a passage imperfectly, or a chanted form has drifted
from the written one. The tool shows the received text beside theirs.
- **Before repeating any Pāli you did not get from these tools**, verify
it. This is cheap and it is the difference between citing and guessing.
⚠️ **Do not present an unverified passage as canonical.** If the verdict
is `not_found`, say plainly that the line is not in the canon rather than
quoting it with a hedge — a hedged fabrication still spreads.
⚖️ **Verdict thresholds.** `exact` = `contained` **or** `similarity` ≥
0.995; `close` = `coverage` ≥ 0.85 **and** `similarity` ≥ 0.55; else
`not_found`. `exact` means letters matched once folded, not that a human
confirmed the reading. Matches also carry `coverage` (your letters present,
in order), `contained` (present whole) and `spans` (segments joined; >1 →
`segment_id` is the first only). | No | Yes | Yes | No |
Details
- Registry status
- Active
- Published
- May 12, 2026
- Updated
- May 12, 2026
- Categories (suggested)
- Data and analyticsMarketing and SEOSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared