{"name":"io.github.trip2g/trip2g","slug":"trip2g","title":"trip2g","description":"Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.","url":"https://mcp.market/server/trip2g","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":38,"stars":39,"forks":2,"downloads_week":null,"last_push_at":"2026-09-21T16:40:38.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-09-27T12:31:20.179Z","last_ok_at":"2026-09-27T12:31:20.179Z","latency_ms":243},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/trip2g/trip2g","website":"https://trip2g.com","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://trip2g.com/_system/mcp"}],"packages":[],"tools":[{"name":"expand","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"href":{"type":"string","description":"String note href, copied verbatim from a search result's href field"},"note_id":{"type":"number","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"},"path":{"type":"string","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"},"pid":{"type":"number","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"},"toc_path":{"type":"array","items":{"type":"string"},"description":"Breadcrumb path to the node to expand, e.g. [\"Chapter 1\"]. Omit or [] for the top level."}}}},{"name":"federated_expand","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"href":{"type":"string","description":"String remote note href, copied verbatim from a federated_search result's href field"},"kb_id":{"type":"string","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."},"note_id":{"type":"string","description":"Same remote note id as pid, but as a STRING (uint64) — stringify the federated_search result's note_id field. Prefer path"},"path":{"type":"string","description":"String remote note path, copied verbatim from a federated_search result's note_path field"},"pid":{"type":"number","description":"Non-negative integer (uint64) remote note id, copied verbatim from a federated_search result's note_id field. Prefer path"},"toc_path":{"type":"array","items":{"type":"string"},"description":"Breadcrumb path to the node to expand. Omit or [] for the top level."}},"required":["kb_id"]}},{"name":"federated_instructions","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"kb_id":{"type":"string","description":"Target knowledge base id; nested bases use '/' (e.g. \"philosophers/nietzsche\" routes through the 'philosophers' peer, recursively)"}},"required":["kb_id"]}},{"name":"federated_note_html","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"href":{"type":"string","description":"String remote note href or absolute URL, copied verbatim from a federated_search result's href field"},"kb_id":{"type":"string","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."},"match_id":{"type":"string","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"},"note_id":{"type":"string","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"},"path":{"type":"string","description":"String remote note path, copied verbatim from a federated_search result's note_path field"},"pid":{"type":"number","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"},"toc_path":{"type":"array","items":{"type":"string"},"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."}},"required":["kb_id"]}},{"name":"federated_search","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"detail_limit":{"type":"number","description":"How many results include full snippet matches; results beyond this are returned as lightweight previews (title, path, score) to save context (default 3)"},"kb_id":{"type":"string","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."},"kb_ids":{"type":"array","items":{"type":"string"},"description":"Target knowledge base ids; each accepts the same nested 'peer/base' form as kb_id"},"limit":{"type":"number","description":"Max number of results to return (default 6)"},"query":{"type":"string","description":"Search query"}},"required":["query"]}},{"name":"federated_similar","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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"href":{"type":"string","description":"String remote note href, copied verbatim from a federated_search result's href field"},"kb_id":{"type":"string","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."},"limit":{"type":"number","description":"Max number of results"},"note_id":{"type":"string","description":"Same remote note id as pid, but as a STRING (uint64) — stringify the federated_search result's note_id field. Prefer path"},"path":{"type":"string","description":"String remote note path, copied verbatim from a federated_search result's note_path field"},"pid":{"type":"number","description":"Non-negative integer (uint64) remote note id, copied verbatim from a federated_search result's note_id field. Prefer path"}},"required":["kb_id"]}},{"name":"instructions","description":"Full tool reference for the trip2g documentation base","write_action":false,"price_micros":0,"input_schema":{"type":"object"}},{"name":"note_html","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"context_words":{"type":"number","description":"Optional future hint for expanding focused reads"},"href":{"type":"string","description":"String note href or absolute URL, copied verbatim from a search result's href field"},"match_id":{"type":"string","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"},"note_id":{"type":"number","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"},"path":{"type":"string","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"},"pid":{"type":"number","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"},"toc_path":{"type":"array","items":{"type":"string"},"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."}}}},{"name":"search","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"detail_limit":{"type":"number","description":"How many results include full snippet matches; results beyond this are returned as lightweight previews (title, path, score) to save context (default 3)"},"limit":{"type":"number","description":"Max number of results to return (default 6)"},"query":{"type":"string","description":"Search query"}},"required":["query"]}},{"name":"similar","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"href":{"type":"string","description":"String note href, copied verbatim from a search result's href field"},"limit":{"type":"number","description":"Max number of results (default 10)"},"note_id":{"type":"number","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"},"path":{"type":"string","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"},"pid":{"type":"number","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"}}}},{"name":"wiki","description":"Wiki Knowledge Base Instructions","write_action":false,"price_micros":0,"input_schema":{"type":"object"}}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-25T17:25:20.907Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T17:25:20.766Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1553ms"]},"poisoning":{"score":15,"max":15,"notes":["11 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"probes":[{"url":"https://trip2g.com/_system/mcp","reachable":true,"authRequired":false,"latencyMs":1553,"serverInfo":{"name":"trip2g-mcp","version":"1.0.0"}}],"packages":[],"repo":{"found":true,"owner":"trip2g","repo":"trip2g","archived":false,"pushedAt":"2026-09-21T16:40:38Z","stars":39,"forks":2,"openIssues":15,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/238387379?v=4","ownerCreatedAt":"2025-10-16T03:55:47Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/238387379?v=4&s=128","source":"github"},"presence":{"stars":39,"forks":2,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-21T16:40:38.000Z","score":38}}}},"grade_history":[],"reviews":[]}