kb-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kb-serversearch my vault for notes about the Goodhart's law article, then summarize them"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kb-tools
Tooling for a personal LLM wiki in the pattern Andrej Karpathy described: a folder of plain markdown that a coding agent reads, writes and keeps current, browsed in Obsidian. This package puts a graph, a search index, guarded writes and an MCP server over such a vault, and runs an autonomous ingestion loop that files new sources by itself behind a fail-closed merge gate.
There is no RAG here, no embeddings and no vector store, by decision rather than omission. Retrieval is lexical and in memory: term frequency with a title boost and a one-hop walk along wikilinks. The pattern is knowledge compiled into pages an agent can read whole, not chunks retrieved by similarity.
My own vault is private: it holds third-party papers I cannot redistribute and personal notes. It consumes this package pinned to a release tag. examples/vault/ is a small slice of it so you can run everything below.
The vault it expects
raw/is the evidence layer: immutable source material. Nothing in the tooling can write here; the guard is in code, not convention.wiki/is the compiled layer: synthesised pages, each citing the sources it was written from. Agents maintain it; a human reads it.index.mdis the map the agent routes questions through;log.mdis append-only history.
templates/kb-schema.md is the schema an agent follows to maintain a vault like this, and docs/CONTEXT.md is the glossary.
Related MCP server: obsidian-mcp-context
Quick start
python3 -m venv .venv && .venv/bin/pip install -e .
.venv/bin/kb --root examples/vault verify # graph + citation audit
.venv/bin/kb --root examples/vault search "goodhart"
.venv/bin/kb --root examples/vault read wiki/concept-software-engineering-laws
.venv/bin/python -m unittest discover -s tests -t . # runs against a temporary fixture vaultOr install it into another project: pip install git+https://github.com/philippe-ths/kb-tools@v1.0.0.
The root falls back to KNOWLEDGE_BASE_ROOT. Add --json before the subcommand for machine-readable output.
The MCP server
kb-server --root /path/to/vault exposes ten tools over stdio to Claude Code, Codex or Claude Desktop. kb install --host claude (or codex) prints the host config; --write --yes applies it.
Tool | Does |
| lexical search over |
| one page with its outgoing links and backlinks |
| a bundle of pages for a question |
| the catalogue: categories, counts, orphans, broken links |
| graph hygiene report |
| graph plus citation audit |
| unified diff per operation and before/after verification, over an in-memory overlay; writes nothing |
| commit a change set through the guarded writers, then re-verify on disk |
| the recorded search history |
| record a gap or a subject worth researching, for a research process to read later; nothing is researched now |
| the recorded research suggestions |
| re-read the vault after an outside change |
A change set is JSON: write_page under a flat wiki/, write_index, add_index_entry (one catalog line into an existing category, leaving the rest of index.md untouched), or append_log. Those are the only writes that exist. raw/ cannot be written, log.md can only be appended, and a path that escapes the vault is refused.
Autonomous ingestion
kb --root <vault> auto-ingest, scheduled weekly through launchd (kb install --host launchd):
Find pending sources: any
raw/*.mdno wiki page cites, minus the vault's.kb-ingest-ignore.Branch from the remote base into a
kb-maintenance/worktree, so the human's checkout is never touched.For each source, a writer agent (Claude CLI, headless) synthesises a cited page and commits it together with the source it cites.
An independent reviewer agent reads the diff adversarially and returns a structured JSON verdict.
A deterministic merge gate decides. It merges only when validation passes, verification shows zero warnings and zero new warnings, the diff touches only
wiki/,index.md,log.mdandraw/, the worktree is clean after the commit, and the reviewer raised no blocking objection. Anything else leaves the pull request open for the human.
Both agents run under a hard-coded allowlist of the kb_* tools and nothing else: no Bash, no Write, no Edit. The git, gh and agent calls sit behind injectable seams, so the gate's logic is unit-tested without a model in the loop. If the vault has a validation script at .ai-policy/scripts/run-validation.sh it runs as part of the gate; otherwise validation is recorded as skipped.
Layout
Module | Responsibility |
| root resolution, file discovery, reads, and the guarded writers |
| wikilink parsing and target resolution |
|
|
| in-memory graph: links, backlinks, broken links, orphans |
| lexical search index |
| change-set model and write-rule guards |
| graph and citation audit, before/after deltas |
| maintenance runs, worktree planning, PR reports |
| pending-source detection, the ingestion orchestrator and merge gate, the Claude CLI runner |
| MCP host config and launchd snippets |
|
|
| the CLI and the MCP server, both thin adapters over |
The core is standard-library Python 3.10+; only the MCP server needs the mcp SDK.
Decisions
0001: a local MCP knowledge base with propose/apply writes.
0002: autonomous ingestion with a guarded auto-merge.
0003: this package split out of the private vault.
License
MIT. The example vault's content is included for demonstration.
Auto-ingest agents
Each claude call auto-ingest makes is sealed: its own system prompt (the role plus the vault's kb-schema.md), only the knowledge-base MCP server, no built-in tools, settings, skills or CLAUDE.md, run from an empty directory. Ingest runs on claude-sonnet-5-5 at medium effort; the one review per run on claude-opus-5-5 at high effort. Override with KB_INGEST_MODEL, KB_INGEST_EFFORT, KB_REVIEW_MODEL, KB_REVIEW_EFFORT. Each result in the run report carries the call's usage (cost, turns, tokens).
Available Tools
12 toolskb_apply_changesA
Commit a change set to disk, then re-verify.
Same change shape as kb_propose_changes. Writes go through the guarded vault writers: raw/ is never written and log.md is append-only. Returns the applied operations and the post-apply verification.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses guarded vault writers, that raw/ is never written, that log.md is append-only, and that post-apply verification is returned. It does not cover permissions, atomicity, or error behavior, but the key mutation constraints are exposed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no wasted language. The core action and post-condition are front-loaded, and each sentence adds distinct information. It is appropriately sized for the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is largely complete: it explains side-effect constraints, return values, and parameter shape reference. It still leaves usage timing and the full change object shape to inference from a sibling. That is a minor gap rather than a fundamental omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required 'changes' parameter, so the description must compensate. It does so by saying the change shape matches kb_propose_changes, which gives an agent a reference point, but it does not define the shape itself. This is adequate but not self-contained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: committing a change set to disk, followed by re-verification. It distinguishes the operation from the sibling kb_propose_changes by contrasting commit/apply with propose. An agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description references kb_propose_changes for the change shape, which implies a relationship but stops short of explicit when-to-use guidance. It does not state conditions such as 'use after proposing changes' or exclusions for alternatives. Usage is implied rather than clearly instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_build_contextB
Assemble a navigable starting set for a query.
Returns the top matching pages with snippets plus their immediate graph neighbours, to decide what to read next.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the return shape (pages with snippets plus graph neighbours), but does not state whether the operation is read-only, whether it has side effects, or any rate limits or authentication requirements. The return disclosure is valuable but safety context is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences front-load the action and result with zero filler. Every sentence earns its place and the structure is easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description does explain what is returned, which is essential. However, it leaves parameter semantics, safety profile, and sibling routing unaddressed, so it is only minimally complete given the information gaps in the structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the two parameters. It refers to 'a query' only obliquely and says nothing about the 'limit' parameter or its default of 5, leaving both parameters largely undocumented beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (assemble) and resource (navigable starting set) and explains the output content: top matching pages with snippets plus immediate graph neighbours. This clearly differentiates it from plain search or page-read siblings, but it never names an alternative tool to contrast with, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to decide what to read next' implies an exploratory read use case, but there is no explicit when-to-use guidance, no when-not-to-use condition, and no mention of sibling tools like kb_search or kb_read_page. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_fetch_queriesA
Read back recorded queries (kb_search / kb_build_context calls).
Returns the most recent limit entries oldest-first, each
{ts, tool, query, limit, results}, with count being how many were
returned. Use it to see what has actually been asked of the wiki.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a fair job: it discloses the return structure ({ts, tool, query, limit, results}), the count field, and the ordering rule ('most recent limit entries oldest-first'). It does not explicitly state that the call is side-effect free or whether any permissions are needed, so a mutation-safety disclaimer is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by return-shape detail and then the use case. Every sentence contributes, though the field list with backtick formatting is slightly denser than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter, read-only log tool with no output schema, the description supplies the return shape, ordering, and purpose. The remaining gaps (permissions, any paging beyond limit) are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'limit' parameter, so the description must compensate. It clarifies that limit bounds 'the most recent limit entries' and that ordering is oldest-first, which adds real meaning, but it never states the default (50) or any maximum bound.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read back recorded queries') and explicitly scopes it to the kb_search / kb_build_context call log, which separates it from every sibling that writes or reads wiki content. An agent can distinguish this log-reading tool from other kb_* tools without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives clear intent ('Use it to see what has actually been asked of the wiki'), so the agent knows the right context. However, it names no alternatives or when-not conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_fetch_suggestionsA
Read back recorded research suggestions (kb_suggest_research calls).
Returns the most recent limit entries oldest-first, each
{id, ts, kind, subject, topic, reason, by}, with count being how many
were returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses ordering (oldest-first), the exact record shape {id, ts, kind, subject, topic, reason, by}, and the semantics of the count field. It does not state explicitly that the operation is read-only with no side effects, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the purpose, then the return contract. Nothing is wasted and no information is repeated from structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema and no annotations, the description supplies the return shape, ordering, and the count field, which is what an agent needs. The default value of limit and explicit read-only assurance are the only omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the 'limit' property is just titled 'Limit'), so the description must compensate. 'Returns the most recent limit entries' defines what the parameter controls, though it omits the default (50) and any maximum/range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read back recorded research suggestions') and explicitly names the producing sibling (kb_suggest_research calls), which pins down the resource unambiguously against kb_fetch_queries and other kb_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this to retrieve suggestions previously recorded via kb_suggest_research. There is no explicit when-to-use/when-not guidance, no mention of prerequisites, and no routing to alternatives for other retrieval needs (e.g. kb_fetch_queries).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_graph_summaryC
Graph statistics and the index.md category structure.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state that this is a read-only, side-effect-free operation, nor does it describe the shape, size, or format of the returned statistics. It only names the topic of the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence-fragment is terse and front-loaded, wasting no words. However, its brevity comes at the cost of under-specification rather than genuine conciseness, capping the score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description is the only source of return-value information. It hints at the content (graph statistics, index.md categories) but does not explain what an agent can actually do with the result, leaving a real gap for a zero-argument inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the per-calibration baseline of 4 applies. There are no parameter semantics for the description to add or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource and its content ('graph statistics' and 'index.md category structure'), but it is a noun phrase with no verb, so it doesn't state the action an agent takes. It also doesn't differentiate itself from siblings such as kb_search or kb_build_context, which could plausibly return related structural information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this tool versus the many sibling kb_* tools. An agent must infer that this is for inspecting graph shape/category layout, with no exclusions or alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_hygieneC
Broken links, missing-page targets, and orphan pages.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing beyond the category names. It does not state whether this is a read-only audit or mutates state, whether a scan is expensive, or what the output looks like. For a no-annotation tool this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The fragment is short and wastes no words, but it is not front-loaded with an action verb or a purpose statement, so it reads as a bare topic label rather than a usable definition. Conciseness is achieved at the cost of informativeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the only source an agent has, and it does not say what the tool returns (a list of issues? counts? a pass/fail verdict?) or how to act on it. For a zero-arg diagnostic tool the definition should at minimum state that it returns hygiene findings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly does not invent parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource scope concretely (broken links, missing-page targets, orphan pages), so an agent can infer this is a knowledge-base hygiene/diagnostics report. However, there is no verb at all – 'Broken links, missing-page targets, and orphan pages.' is a noun fragment – and nothing distinguishes it from the sibling kb_verify, which plausibly covers overlapping link-integrity territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites, and no mention of the sibling kb_verify that an agent would need to disambiguate against. The reader is left to guess whether this is a scan, a report, or a repair operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_propose_changesA
Preview a change set without writing.
Each change is {op:'write_page', page_id, text} | {op:'write_index', text} | {op:'add_index_entry', category, entry} | {op:'append_log', text}. Prefer add_index_entry for a new page: it adds one catalog line without reading or rewriting index.md. Returns a unified diff and create/update/append action per operation, plus verification before and after the change as it would land (with the warning delta). Nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers: it asserts nothing is written, spells out the return shape (unified diff, create/update/append action per op, before/after verification with warning delta), and flags the index.md rewrite cost. It does not cover permission/auth requirements or failure behavior for malformed ops, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the single most decision-relevant fact ('Preview a change set without writing'), then the op grammar, then a tie-breaking preference, then the return contract. Every sentence adds information; nothing is redundant boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description covers inputs, outputs, and the non-mutating guarantee well. The notable gap is the missing explicit handoff to kb_apply_changes (i.e., that a proposal is what you feed to the apply step), which an agent sequencing multi-step edits would benefit from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is a free-form array of objects with additionalProperties permitted, so the schema explains nothing. The description fully compensates by enumerating the four discriminated op shapes and their required fields (page_id/text, category/entry, etc.), which is exactly the documentation the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Preview a change set') with an explicit scope constraint ('without writing'), which cleanly separates it from kb_apply_changes and the read-only siblings like kb_read_page and kb_verify. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete in-tool guidance: 'Prefer add_index_entry for a new page: it adds one catalog line without reading or rewriting index.md,' which steers operation selection. However, it never names kb_apply_changes as the commit counterpart or states when-not to use this tool (e.g., for trivial reads).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_read_pageB
Read one page by id (e.g. 'wiki/overview').
Returns its markdown text, resolved outgoing links, and backlinks.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the return payload (markdown text, resolved outgoing links, backlinks), which matters given there is no output schema, but it says nothing about missing-page behavior, permissions, or whether link resolution is expensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first, return contents second, with zero filler. Every clause carries information and the example id is embedded inline rather than in a separate note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema, the description covers the action and the return shape well. The remaining gap is discovery of valid page ids and error handling, which are minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single required page_id is undocumented in the schema, so the description must compensate. It partially does by showing the expected id shape ('wiki/overview'), which tells the agent this is a path-like slug rather than an opaque UUID, but nothing is said about how to obtain a valid id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one page by id') and gives a concrete id example ('wiki/overview'), so the agent knows exactly what the tool fetches. It does not explicitly contrast itself with siblings like kb_search or kb_build_context, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use instruction, no prerequisites, and no mention of alternatives such as kb_search (find a page) or kb_build_context (assemble multi-page context). The verb 'Read' implies the direct-fetch case, but nothing routes the agent among the 11 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_reloadB
Rebuild the in-memory graph and search index from disk.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and mostly fails it. It implies mutation/replacement of in-memory state but does not state whether the operation is expensive, blocking, safe to call concurrently, or what happens to in-flight queries or uncommitted content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action and its source front-loaded and zero wasted words. Appropriate size for a zero-argument operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param operation with no output schema the core mechanic is conveyed, but the definition is missing the operational context an agent needs: when the reload should be triggered and what the cost or side effects are. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The schema fully describes the empty argument object and there is nothing parameter-level the description could usefully add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Rebuild') and resource ('the in-memory graph and search index from disk'), so the agent knows exactly what state is being refreshed. It is distinguishable from siblings like kb_search or kb_verify, though it never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: nothing says when a reload is necessary (e.g., after external edits to the knowledge base on disk) or when it is unnecessary or harmful. No prerequisites, no alternative tool is mentioned despite eleven siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_searchB
Lexical full-text search over index.md and wiki pages.
Returns ranked results with page id, title, score, matched terms, and a prose snippet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It helpfully discloses that matching is lexical (not semantic/graph based) and describes the result shape, but says nothing about query syntax, index scope/freshness, or the effect of limit, which matters for a search tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core purpose and then the return shape; no filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description usefully covers return fields, and it names the searched sources. It still omits query-language guidance, limit behavior, and any behavioral constraints, leaving gaps for a tool with no annotations and no schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the schema offers no field-level documentation. The description does not mention `query` or `limit` at all, leaving query syntax and the meaning/default of limit entirely undocumented for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (lexical full-text search over index.md and wiki pages) and explicitly says it is lexical, which implicitly distinguishes it from graph/semantic siblings like kb_graph_summary and kb_build_context. It does not, however, explicitly contrast itself with kb_read_page, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can guess you call this to locate pages before reading them. There is no explicit when-to-use, no condition that selects it over kb_read_page or kb_graph_summary, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_suggest_researchA
Tell the owner's research process about a gap in the knowledge base.
Call this when the knowledge base could not answer something your work
needed (kind "gap"), or when a subject the owner's work keeps touching
should be in the knowledge base (kind "subject"). One suggestion per gap.
Phrase subject as one plain sentence saying what is not yet known.
topic is optional (e.g. "AI Engineering", "Running and cardio"); reason
and by (who you are, e.g. "claude-code in repo X") are optional too.
Suggestions are read by a research process later; nothing is researched
now. Do not include secrets or personal data about third parties.
Returns {recorded, id, entry}, or {recorded: false, error} if rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | ||
| kind | No | gap | |
| topic | No | ||
| reason | No | ||
| subject | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses that this is a deferred, fire-and-forget submission ("Suggestions are read by a research process later; nothing is researched now"), imposes a one-suggestion-per-gap rate discipline, and adds a content restriction (no secrets or third-party personal data). It omits visibility/idempotency details such as whether duplicates are rejected, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then trigger conditions, then parameter guidance, then caveats, then the return shape -- a logical progression with no filler sentences. It is dense but every sentence carries information; only the return-shape line could be trimmed if an output schema existed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter write tool with no annotations and no output schema, the description covers purpose, triggers, per-parameter meaning, side-effect timing, content constraints, and the success/rejection return shape ({recorded, id, entry} / {recorded: false, error}). Only downstream visibility and duplicate handling are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it defines both `kind` values in prose (critical since no enum exists in the schema), gives phrasing instructions for the required `subject`, and names the optional `topic`, `reason`, and `by` with examples including the `by` format ("claude-code in repo X"). There is no parameter left undefined by both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and target: record a research suggestion for the owner's research process when the KB has a gap or a missing subject. It is clearly distinct from read-oriented siblings like kb_search and kb_read_page, though it never explicitly contrasts itself with the nearby sibling kb_propose_changes, which an agent might reasonably confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete trigger conditions tied to the `kind` values ("could not answer something your work needed" for gap; "a subject the owner's work keeps touching" for subject) and states that nothing is researched now. No explicit when-not-to-use or named alternative tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_verifyB
Phase-1 audit: graph stats, graph hygiene, and citation hygiene.
Citation hygiene reports uncited wiki pages, source pages with no raw evidence, and broken raw/ citations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It helpfully discloses what citation hygiene actually reports (uncited wiki pages, source pages with no raw evidence, broken raw/ citations), which gives real behavioral insight, but it says nothing about cost, read-only safety, permissions, or what graph stats/hygiene produce.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the phase and scope, then a clarifying detail. No filler or redundancy, though the abrupt second fragment could be integrated more cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description is the sole source of behavioral context, and it only covers citation hygiene in any detail. It omits what the audit returns overall and whether the operation is safe/read-only, leaving a gap for a tool whose entire purpose is producing an audit report.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There are no parameter semantics for the description to add or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (audit/verify) and enumerates the scope: graph stats, graph hygiene, and citation hygiene. However, it never differentiates itself from the siblings kb_graph_summary and kb_hygiene, which appear to cover overlapping ground, so an agent cannot tell which to pick from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The description never mentions an alternative tool, prerequisite, or workflow phase beyond the label 'Phase-1', leaving the agent to guess how this relates to kb_graph_summary, kb_hygiene, or kb_reload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.2.1- First observed
kb_apply_changes - First observed
kb_build_context - First observed
kb_fetch_queries - First observed
kb_fetch_suggestions - First observed
kb_graph_summary - First observed
kb_hygiene - First observed
kb_propose_changes - First observed
kb_read_page - First observed
kb_reload - First observed
kb_search - First observed
kb_suggest_research - First observed
kb_verify
TDQS
Scored across 12 tools
Most tools target clearly distinct operations (search, read, propose/apply changes, fetch queries/suggestions), and the propose/apply and fetch_queries/fetch_suggestions pairs are explicitly differentiated. However, kb_verify overlaps with the combined functionality of kb_graph_summary and kb_hygiene, so an agent may hesitate over which audit-style tool to call first.
Every tool uses the same kb_ prefix followed by a verb_noun or verb_noun_phrase pattern in snake_case (kb_search, kb_read_page, kb_propose_changes, kb_fetch_queries). There are no mixed conventions or stray camelCase names, making the set highly predictable.
With 12 tools, the set is well within a reasonable range for a knowledge-base server and each tool covers a distinct phase of the workflow (search, read, inspect, verify, propose, apply, record, reload). No tool appears redundant or purely filler.
The surface covers search, read, graph inspection, hygiene/citation audits, guarded write flows, query/suggestion recording, and index reload, which is close to full lifecycle coverage for a safe KB. A minor gap is the absence of a direct 'list all pages' or 'get raw index' tool, though kb_graph_summary and kb_search provide workarounds.
Maintenance
Related MCP Connectors
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Related MCP Servers
- AlicenseCqualityCmaintenanceRead-only MCP server for querying a running Obsidian vault from agentic runtimes, exposing safe Obsidian CLI commands.551MIT
- FlicenseBqualityBmaintenanceParses an Obsidian vault and exposes structured context (notes, blocks, tasks, headings) through MCP tools, enabling AI clients to query and reason over local markdown notes.19-
- AlicenseNot gradedqualityBmaintenanceExposes a personal markdown-based second brain (Obsidian-style) as an MCP server, enabling agents to search, read, and write notes with privacy controls.MIT
- AlicenseNot gradedqualityCmaintenanceExposes a local Obsidian vault as a stateless MCP server, letting AI coding agents search, read, browse, and edit notes in real time.17 npmMIT