Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,561Letters: 14Defects: 1,336counted 2 min ago
teppi

Server definition

Hash
sha256:dbd155972a1af0d34e27eab62d977ff18ed9ae50496f3e834e2049f195214ca2
What it is
What a remote MCP server returned when asked what it offers: 11 tools

The blob, as servednamed by its sha256

{ "instructions": "You are connected to the trip2g documentation base (trip2g.com). trip2g is a Markdown publishing platform: it turns an Obsidian vault into a website with subscriptions, Telegram publishing, and this MCP server for AI agents. This base holds the trip2g user guides (`en/user/`, `ru/user/`), the changelog, developer docs (`dev/`), and design plans (`plans/`).\n\nAnswer from retrieved sources, not memory. Follow the loop below: it keeps every read to one section (~300 tokens) instead of a whole note (3,000+).\n\n## The retrieval loop\n\n1. `search(query)` — up to 6 results; the top 3 carry `matches[]`, each with a `snippet` and a `toc_path` (breadcrumb to the matching section).\n2. Read only that section: `note_html(pid=<note_id>, toc_path=<match.toc_path>)`.\n3. Pointer looks off, or you want to survey the note first? `expand(pid=N)` lists its top-level sections; `expand(pid=N, toc_path=[\"Section\"])` lists that section's subsections. Descend to a leaf, then read it with `note_html(toc_path=...)`.\n4. Read a whole note (`note_html(pid=N)` with no `toc_path`) only when `expand` shows it has no sections.\n\nWorked example — the user asks \"how do I connect a private federation peer?\":\n\n```\nsearch(\"private federation peer HMAC secret\")\n→ 1. MCP Federation, note_id=658,\n match toc_path=[\"Adding a private peer (two-step exchange)\"]\nnote_html(pid=658, toc_path=[\"Adding a private peer (two-step exchange)\"])\n→ one section; answer from it, cite https://trip2g.com/en/user/federation\n```\n\n## Other tools — one-line triggers\n\n- `similar(pid=N)` — you found one good note and want its neighbors. Example: after the federation guide, `similar(pid=658)` surfaces the protocol guide and the RU twin.\n- `federated_search(query)` — local `search` found nothing relevant, or a result had `kind: \"federation_kb\"` (a pointer to a connected base). It fans the query out across all connected bases; pass `kb_id=\"...\"` to target one. Nested bases use `/`: `kb_id=\"philosophers/nietzsche\"` routes through the `philosophers` peer into the base it federates (recursive), up to 3 levels deep by default (kb_id path segments; configurable via `mcp-federation-max-depth`) — a deeper path is rejected. A base reached _through_ a hub is addressed `<hub>/<base>` (a `philosophers` hub note advertising `kb_id: montaigne` is `philosophers/montaigne` from here). Every result carries an absolute `kb_id` in your frame — use it verbatim. Follow-up reads go through `federated_note_html` / `federated_expand` / `federated_similar`, and each of those requires the `kb_id`. Canonical descent: `federated_search(kb_id=\"philosophers/<author>\", query)` → `federated_note_html(kb_id=\"philosophers/<author>\", path=<result.note_path>)` — the way to reach real content in a leaf corpus, not hub cards.\n\nCall the `instructions` tool for the full argument reference.\n\n## Guardrails\n\n- Never open a note without `toc_path` (or `match_id`) on the first read. A section is ~10x cheaper and lands at the top of your context, where recall is best.\n- A wrong `toc_path` does not error — it silently returns the whole note. If a `note_html` response is much longer than one section, your pointer missed: stop, call `expand(pid=N)` to see the real headings, and re-read with an exact title from that list.\n- `toc_path` entries must match headings exactly, punctuation included. Copy them from `search` matches or `expand` children; never guess or translate them.\n- Prefer `toc_path` over `match_id`. A `match_id` gives a focused chunk window only in its `pN:cM` form; `pN:mM` ids do not resolve.\n- Ignore `demo/` notes — that is a Marcus Aurelius / Meditations showcase, not trip2g documentation — unless the user asks about the demo itself.\n- Ground answers only in sections you actually read, and cite the note URL. If the docs do not cover something, say so briefly.\n- Answer in the user's language. Guides exist as `en/user/` and `ru/user/` mirrors; prefer the one matching the user.\n", "tools": [ { "description": "Walk a note's table of contents level by level (progressive disclosure). Canonical call: expand(path=<result.note_path>, toc_path=[...]) — copy path verbatim from a search result's note_path field. Returns the direct children of a TOC node: omit toc_path (or pass []) for the top-level sections, or pass a toc_path to list that section's subsections. Each child has title, level, path, and has_children. A section with subsections lists them; a section without subsections is returned in full (what note_html gives for that toc_path, plus section_html in the payload), so no second call is needed to read a leaf. This cannot be turned off, and a client that wants only structure never triggers it: has_children on each listed child says where descending would turn into reading.", "inputSchema": { "properties": { "first": { "description": "List only this many of the oldest subsections. Pair it with last to get how a subject started and where it stands now, leaving out the middle; the summary marks the gap where it falls.", "type": "number" }, "href": { "description": "String note href, copied verbatim from a search result's href field", "type": "string" }, "last": { "description": "List only this many of the newest subsections instead of all of them. A note that gains a dated section a day has hundreds of them after a year, and reading the whole listing to reach the latest few is the cost this avoids. The summary, total_children and omitted say what was left out, so a bounded listing never reads as a complete one. Bounds that meet or overlap return everything rather than repeating a run.", "items": { "type": "string" }, "type": "number" }, "note_id": { "description": "Same as pid: non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id. Prefer path", "type": "number" }, "path": { "description": "String note path, e.g. \"concepts/maska-i-glubina.md\" — copy verbatim from a search result's note_path field. The default, preferred way to reference a note", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id. Prefer path", "type": "number" }, "toc_path": { "description": "Breadcrumb path to the node to expand, e.g. [\"Chapter 1\"]. Omit or [] for the top level.", "type": "array" } }, "type": "object" }, "name": "expand", "outputSchema": null }, { "description": "Walk a remote note's table of contents level by level inside a connected knowledge base (progressive disclosure), same as expand. Canonical call: federated_expand(kb_id=..., path=<result.note_path>, toc_path=[...]). Omit toc_path for the top level, or pass a toc_path to list that node's subsections. A section with subsections lists them; a section without subsections is returned in full, as federated_note_html would return it — has_children on each listed child says where that happens.", "inputSchema": { "properties": { "first": { "description": "List only this many of the oldest subsections, as expand does.", "type": "number" }, "href": { "description": "String remote note href, copied verbatim from a federated_search result's href field", "type": "string" }, "kb_id": { "description": "Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively). Federation nests up to 3 levels deep (kb_id path segments); a deeper path is rejected.", "type": "string" }, "last": { "description": "List only this many of the newest subsections instead of all of them, as expand does. The summary, total_children and omitted say what was left out.", "type": "number" }, "note_id": { "description": "Same remote note id as pid, but as a STRING (uint64) — stringify the federated_search result's note_id field. Prefer path", "type": "string" }, "path": { "description": "String remote note path, copied verbatim from a federated_search result's note_path field", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) remote note id, copied verbatim from a federated_search result's note_id field. Prefer path", "type": "number" }, "toc_path": { "description": "Breadcrumb path to the node to expand. Omit or [] for the top level.", "items": { "type": "string" }, "type": "array" } }, "required": [ "kb_id" ], "type": "object" }, "name": "federated_expand", "outputSchema": null }, { "description": "Fetch the instructions/guidance for a federated knowledge base by kb_id (e.g. \"philosophers/nietzsche\") — read a base's own conventions before searching it. Nested bases are addressed with '/' and the call routes through each peer recursively.", "inputSchema": { "properties": { "kb_id": { "description": "Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively)", "type": "string" } }, "required": [ "kb_id" ], "type": "object" }, "name": "federated_instructions", "outputSchema": null }, { "description": "Read a remote note inside a connected knowledge base. Canonical call, copying fields verbatim from a federated_search result: federated_search(kb_id=\"philosophers/<author>\", query) -> federated_note_html(kb_id=\"philosophers/<author>\", path=<result.note_path>) — the standard way to descend into a leaf corpus and read real content there, not hub cards. federated_note_html(kb_id=..., match_id=<match.match_id>) reads just the focused chunk around a hit. Only pass pid/note_id if you already copied that exact id from a result. path is a string like \"concepts/x.md\"; match_id is \"p<pid>:c<chunk>\"; a value like \":\" or \"/hub/goethe.md\" is a PATH, not a note_id.", "inputSchema": { "properties": { "href": { "description": "String remote note href or absolute URL, copied verbatim from a federated_search result's href field", "type": "string" }, "kb_id": { "description": "Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively). Federation nests up to 3 levels deep (kb_id path segments); a deeper path is rejected.", "type": "string" }, "match_id": { "description": "String chunk id of the form \"p<pid>:c<chunk>\", copied verbatim from a remote search match's match_id field; alone it is enough to resolve the note", "type": "string" }, "note_id": { "description": "Same remote note id as pid, but as a STRING (uint64) — stringify the federated_search result's note_id field. Not a path, slug, or match_id. Prefer path or match_id", "type": "string" }, "path": { "description": "String remote note path, copied verbatim from a federated_search result's note_path field", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) remote note id, copied verbatim from a federated_search result's note_id field. Not a path, slug, or match_id. Prefer path or match_id", "type": "number" }, "toc_path": { "description": "Breadcrumb path to a specific section, e.g. [\"Chapter 1\", \"Introduction\"]. Use toc_path from a federated_search match, or a child path from federated_expand. Wins over match_id when both are given. Without either the whole note comes back.", "items": { "type": "string" }, "type": "array" } }, "required": [ "kb_id" ], "type": "object" }, "name": "federated_note_html", "outputSchema": null }, { "description": "Search connected knowledge bases. Returns snippets with heading breadcrumbs (title > section > subsection) and a precise toc_path per match, same as search; results also carry an absolute kb_id (string) to use verbatim on follow-up calls. Pass kb_id for one base, kb_ids for selected bases, or omit both to fan out. Nested bases are addressed with '/': kb_id \"philosophers/nietzsche\" routes through the 'philosophers' peer to the base it federates (recursive), up to 3 levels deep. Canonical call: federated_search(kb_id=\"philosophers/<author>\", query) -> federated_note_html(kb_id=\"philosophers/<author>\", path=<result.note_path>) — the standard way to descend into a leaf corpus and read real content, not hub cards.", "inputSchema": { "properties": { "detail_limit": { "description": "How many results include full snippet matches; results beyond this are returned as lightweight previews (title, path, score) to save context (default 3)", "type": "number" }, "kb_id": { "description": "Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively). Federation nests up to 3 levels deep (kb_id path segments); a deeper path is rejected.", "type": "string" }, "kb_ids": { "description": "Target knowledge base ids; each accepts the same nested 'peer/base' form as kb_id", "items": { "type": "string" }, "type": "array" }, "limit": { "description": "Max number of results to return (default 6)", "type": "number" }, "query": { "description": "Search query", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "federated_search", "outputSchema": null }, { "description": "Find remote notes similar to a known note reference inside a connected knowledge base. Preferred: path (a federated_search result's note_path field).", "inputSchema": { "properties": { "href": { "description": "String remote note href, copied verbatim from a federated_search result's href field", "type": "string" }, "kb_id": { "description": "Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively). Federation nests up to 3 levels deep (kb_id path segments); a deeper path is rejected.", "type": "string" }, "limit": { "description": "Max number of results", "type": "number" }, "note_id": { "description": "Same remote note id as pid, but as a STRING (uint64) — stringify the federated_search result's note_id field. Prefer path", "type": "string" }, "path": { "description": "String remote note path, copied verbatim from a federated_search result's note_path field", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) remote note id, copied verbatim from a federated_search result's note_id field. Prefer path", "type": "number" } }, "required": [ "kb_id" ], "type": "object" }, "name": "federated_similar", "outputSchema": null }, { "description": "Full tool reference for the trip2g documentation base", "inputSchema": { "type": "object" }, "name": "instructions", "outputSchema": null }, { "description": "Read a note. Canonical calls, copying fields verbatim from a search result: search(query) -> note_html(path=<result.note_path>) reads the whole note; search(query) -> note_html(match_id=<match.match_id>) reads just the focused chunk around a hit (cheaper, targeted); expand(path=<result.note_path>, toc_path=[...]) -> note_html(path=<result.note_path>, toc_path=[...]) reads one exact section. Only pass pid/note_id if you already copied that exact integer from a result's note_id field — never invent one. path is a string like \"concepts/x.md\"; match_id is \"p<pid>:c<chunk>\"; a value like \":\" or \"/hub/goethe.md\" is a PATH, not a note_id.", "inputSchema": { "properties": { "context_words": { "description": "Optional future hint for expanding focused reads", "type": "number" }, "href": { "description": "String note href or absolute URL, copied verbatim from a search result's href field", "type": "string" }, "match_id": { "description": "String chunk id of the form \"p<pid>:c<chunk>\" (e.g. \"p32:c4\"), copied verbatim from a search match's match_id field. Alone it is enough to resolve the note and reads a focused window around that hit", "type": "string" }, "note_id": { "description": "Same as pid: non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id. Prefer path or match_id", "type": "number" }, "path": { "description": "String note path, e.g. \"concepts/maska-i-glubina.md\" — copy verbatim from a search result's note_path field. The default, preferred way to open a note", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id — a value like \":\" or \"/hub/goethe.md\" is a path, not a note id. Prefer path or match_id", "type": "number" }, "toc_path": { "description": "Breadcrumb path to a specific section, e.g. [\"Chapter 1\", \"Introduction\"]. Use toc_path from a search match, or a child path from expand. Wins over match_id when both are given: match_id is only used when toc_path is absent.", "items": { "type": "string" }, "type": "array" } }, "type": "object" }, "name": "note_html", "outputSchema": null }, { "description": "Search notes by query. Returns snippets with a heading breadcrumb (title > section > subsection) that locates the approximate section, plus a precise toc_path per match. Each result carries note_path (string) and note_id (integer); each match carries match_id (string, form \"p<pid>:c<chunk>\"). Drill-down workflow: 1) search to find the approximate section via the breadcrumb; 2) call note_html(path=<result.note_path>, toc_path=[...]) to read the matched section, or expand(path=<result.note_path>, toc_path=[...]) to navigate the note's structure level by level; 3) note_html(path=<result.note_path>, match_id=<match.match_id>) for a focused chunk window. Each match also carries section_url — a link straight to that heading, for citing the section rather than the whole note.", "inputSchema": { "properties": { "detail_limit": { "description": "How many results include full snippet matches; results beyond this are returned as lightweight previews (title, path, score) to save context (default 3)", "type": "number" }, "limit": { "description": "Max number of results to return (default 6)", "type": "number" }, "query": { "description": "Search query", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "search", "outputSchema": null }, { "description": "Find related notes from a known note reference. Preferred: path (a search result's note_path field). Use this after opening a promising note when you need nearby context.", "inputSchema": { "properties": { "href": { "description": "String note href, copied verbatim from a search result's href field", "type": "string" }, "limit": { "description": "Max number of results (default 10)", "type": "number" }, "note_id": { "description": "Same as pid: non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id. Prefer path", "type": "number" }, "path": { "description": "String note path, e.g. \"concepts/maska-i-glubina.md\" — copy verbatim from a search result's note_path field. The default, preferred way to reference a note", "type": "string" }, "pid": { "description": "Non-negative integer (uint64) note id, copied verbatim from a search result's note_id field. Not a path, slug, or match_id — a value like \":\" or \"/hub/goethe.md\" is a path, not a note id. Prefer path", "type": "number" } }, "type": "object" }, "name": "similar", "outputSchema": null }, { "description": "Wiki Knowledge Base Instructions", "inputSchema": { "type": "object" }, "name": "wiki", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:dbd155972a1af0d34e27eab62d977ff18ed9ae50496f3e834e2049f195214ca2 | sha256sum