Skip to content

MCP tool reference

The server registers exactly 11 tools:

Tool Purpose
kb_status Cached health, WAL, queue, retention, index, scope, and fixed limits.
kb_types Discover fixed node/relation schemas and ready counts.
kb_write Atomically write graph records, inventory state, evidence links.
kb_get Read records, evidence links, or evidence sources.
kb_search Search graph/evidence summaries with exact filters and text.
kb_neighbors Traverse ready stored relations with explicit budgets.
kb_delete Admit durable graph/evidence deletion.
kb_ingest_evidence Store exact path/text/base64 bytes and index eligible text.
kb_read_evidence Read a bounded raw byte range.
kb_jobs List, inspect, cancel, or retry eligible durable jobs.
kb_reindex Rebuild derived indexes from canonical records/evidence.

Common MCP contract

Inputs are closed and strict: unknown fields and type coercion are rejected. Most lists accept at most 100 values. Successful calls return {"status":"ok","data":...}. Expected application failures return {"status":"error","error":"CODE: message"} and may include one bounded, typed details object. Public codes are INVALID, NOT_FOUND, CONFLICT, BUSY, LIMIT, PATH_DENIED, IO_ERROR, INDEX_ERROR, CANCELLED, CONFIGURATION, and INTERNAL.

FastMCP validates each call against the tool's published input schema before the request model is built. Such a rejection carries the same INVALID envelope, naming the rejected argument paths and the rules they broke without repeating the values sent; raw NaN/Infinity is one example. A call that reaches no tool at all, such as an unknown tool name or a protocol frame the transport cannot parse, fails before any envelope exists, so clients should also handle an MCP is_error result without structured_content.

A record identifier is refused whichever layer catches it. The published schema promises the 36-character width and the canonical lowercase 8-4-4-4-12 spelling as an anchored pattern, and an evidence identifier publishes its own e_ plus 64 lowercase hexadecimal characters. A client can check both before sending, so a badly spelled identifier no longer costs a round trip to discover.

Those patterns are published metadata, not the acceptance. The server still checks on arrival and answers with the envelope above:

INVALID: invalid tool request; <argument>: non-canonical graph id: use the lowercase 8-4-4-4-12 spelling

A client that skips the schema check therefore loses nothing but the round trip.

Serialized success envelopes are capped at 256 KiB. A single result that cannot fit returns LIMIT; list operations otherwise return explicit remainder, pagination, or truncation state.

Pagination and live state

kb_types, association/source kb_get, ID-sorted kb_search, and list kb_jobs use opaque bound cursors. The default page is 20 and maximum is 100. Cursors bind the workspace/query epoch and selection, but are not authorization tokens and do not hold a database snapshot. Do not change filters while reusing one. Concurrent pending deletion may make a graph temporarily disconnected or skip a pending row between pages.

Record-view kb_get uses remaining_ids instead of a cursor because callers already supplied the ordered IDs. Relevance search has no cursor and returns the best 100 candidates at most. kb_neighbors uses truncated, reason, and frontier rather than a continuation cursor.

The graph guide, evidence/search guide, and workspace operations guide explain the data and lifecycle contracts behind these fields.