Skip to main content
Glama
matthiaskloft

evidence-ledger-mcp

evidence-ledger-mcp

PyPI Release Schema

Under active development. Both the schema and the server may change in breaking ways between versions until v1.0. Pin the version you use.

An MCP server through which agents keep an evidence ledger for the citations in a work: for each claim, the source that backs it, where in the source, a short quote and why the citation is needed. Co-authors, scripts or a second model can then check every citation against its source.

It is built for academics: authors and co-authors who write with LLMs and want every citation to stay checkable. The ledger format is an open schema, so a graduate school could require it for theses, and a journal could adopt it for submissions or build its own standard on it.

Supported schema: v0.4.0 · standalone schema repository (how schema versions are pinned).

The MCP server and its associated documentation use the MIT licence. The bundled schema uses CC BY 4.0, with attribution to Matthias Kloft. These licences do not cover ledger contents or third-party source material.

The evidence ledger schema

Every ledger this server writes follows the evidence ledger schema (JSON Schema, draft 2020-12), currently v0.4.0. The schema is the contract: any tool, script or person can read, validate and check a ledger with it, with or without this server. Its README documents the purpose, the file shapes, every record field, quote hashing, a minimal example and the sources the fields draw on. The server bundles a pinned copy in schema/ and reports the supported version through schema_info.

A ledger is a header (schema_version, work and optional notes) followed by records. Each record links one claim in the work to one source passage:

Field

Required

Content

id, claim_id

yes

Record and claim IDs; the server assigns them. Records about the same claim share a claim_id.

claim, claim_type, contestable

yes

The claim, its type (empirical, definition, method, background) and whether it needs full evidence; false needs a contestable_reason.

anchor

yes

Where the claim sits in the work: its exact text (with optional prefix/suffix) or a marker.

key

yes

The source's citation key, with doi, isbn or url, or a no_identifier_reason.

locator

Where in the source: page, section, figure or table.

quote, quote_focus

A short quote from the source, and the phrase within it that carries the claim; quote_hash is computed by the server.

relation, justification

relation

How the source bears on the claim (supports, partially_supports, background, method, contrasts) and why.

retrieved_via, provenance

yes

How the passage was found, and who assessed it (person or agent and model), when, and against which revision of the work.

withdrawn

The reason a citation was withdrawn; records are never deleted.

A minimal record, as passed to add_record (the server adds the IDs, hash and date):

{
  "claim": "Retrieval practice improves long-term retention.",
  "claim_type": "empirical",
  "contestable": true,
  "anchor": {"exact": "testing improves later recall"},
  "key": "example2020",
  "doi": "10.1234/example",
  "locator": {"page": 12},
  "quote": "participants who were tested recalled more after one week",
  "relation": "supports",
  "justification": "Direct experimental evidence for the claim.",
  "retrieved_via": "pdf"
}

with provenance such as {"by_type": "agent", "by": "Claude Code", "model": "claude-opus-5-5"}. Ledgers are stored as JSON Lines; see docs/schema.md.

Related MCP server: Witness

What it does

  • Write ledgers safely. Records are validated against the schema before they are appended. The server assigns record and claim IDs, computes quote hashes and dates the provenance instead of leaving them to the agent.

  • Keep the history. The server never deletes records; a withdrawn record keeps its reason.

  • Find gaps. Search by claim, source key or text, and list contestable claims still missing evidence.

  • Share without leaking sources. Exports and summaries come at three levels: full (private), masked (short excerpts) and locator (no quoted text). A publication check refuses to write a file that carries more source text than its level allows.

  • Read it as a report. A standalone HTML summary, grouped by claim, prints to PDF from a browser.

  • See the evidence in the work. The claims are marked in the work's own HTML and linked to their evidence, as end notes or in a side panel.

  • Check it against the work and its sources. Find anchors that no longer appear in the work, records assessed against another revision, quotes that the source text no longer holds, and citation keys missing from the bibliography. Source text can be passed in, or the server fetches it from public URLs (web pages, plain text and PDFs with a text layer).

Installation

Requires Python 3.11 or newer. The server speaks MCP over stdio. With uv, run the released version from PyPI:

uvx --from evidence-ledger-mcp==0.4.0 evidence-ledger-mcp

For example, to add it to Claude Code:

claude mcp add evidence-ledger -- uvx --from evidence-ledger-mcp==0.4.0 evidence-ledger-mcp

Other MCP clients take the same command and arguments. To run a source checkout instead, use uv sync, then configure the client to run uv with arguments run, --directory, the absolute path to the checkout, and evidence-ledger-mcp.

Pass absolute ledger paths to tools; relative paths resolve against the server's working directory.

Tools

Tool

What it does

schema_info

Reports the server version and the supported schema version.

create_ledger

Creates a JSON Lines ledger with a header; work needs title and type.

add_record

Validates and appends a record; takes the record and a separate provenance object and returns the stored record.

get_record

Returns one record by its ID.

find_records

Finds records by claim_id, source key or claim text, or contestable records with missing_evidence. Filters combine; withdrawn records are left out unless include_withdrawn is set.

validate_record

Checks one record against the schema without writing it.

validate_ledger

Checks a whole ledger and lists the problems found.

withdraw_record

Marks a record withdrawn, with a reason, instead of deleting it.

export_ledger

Writes the ledger as JSON or JSON Lines at a chosen level to a new file.

summarize_ledger

Writes a standalone HTML summary grouped by claim to a new file.

embed_ledger

Marks each claim in the work's rendered HTML and links it to its evidence, as end notes or in a side panel, in a new file.

check_ledger

Reads the ledger and reports gaps, anchors missing from the work, records from another revision and quotes not found in source text you pass in or the server fetches from public URLs. Writes nothing.

resolve_links

Matches each source to a PDF in a sources/ folder of only the cited PDFs (best named <citation key>.pdf; else by DOI, ISBN or title from your bibliography) or in a link_map from your reference library, finds the quoted passage by its hash and writes a link file named .private.json with the file and page.

relink_html

Turns a summary or embedded HTML you received into a private copy (.private.html) whose evidence cards open your own PDFs at the passage or cited page (and, with a link map, in your library).

Typical workflow

  1. create_ledger once per work, next to the manuscript or code.

  2. add_record whenever a source is cited, with the claim, its anchor, the source key, locator, quote, relation and justification. The server fills in IDs, the quote hash and the provenance date.

  3. find_records with missing_evidence and validate_ledger before submission, to find claims still lacking evidence.

  4. check_ledger with the rendered work, its bibliography and the sources (as text or public URLs), to catch anchors, keys and quotes that no longer match.

  5. export_ledger, summarize_ledger or embed_ledger at masked or locator level to share the ledger with co-authors, reviewers or a journal.

The tool reference covers export levels, masking, embedding and every check in detail.

Available Tools

14 tools
add_recordA

Append a record. The server assigns id, claim_id (unless given), quote_hash and the provenance date, validates the result and returns the stored record. Mark the phrase carrying the claim (a number, term or short statement) with optional quote_focus. Source text belongs only in quote, quote_prefix, quote_suffix and quote_focus: write justification, locator (including a section heading) and note in your own words, since they are exported with masked and locator ledgers; a record that repeats 24 or more letters and digits of its own quote in another field is refused, naming the field.

NameRequiredDescriptionDefault
pathYes
recordYes
provenanceYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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 server-assigned fields, validation behavior, return behavior, and a specific refusal condition when quoted text is repeated in other fields. It does not mention permissions or broader side effects, but the core mutation behavior is well explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then adds necessary field-level constraints. It is dense but mostly earns its length, though some long clauses could be split for easier parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three required parameters, nested objects, no annotations, and no schema descriptions, the description supplies substantial operational and field-level guidance. The main gap is the unexplained `path` parameter and lack of complete nested-object mapping; return-value details are covered by the output schema and need not be repeated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for opaque object parameters. It significantly clarifies record and provenance fields, including quote-related fields, allowed source-text placement, and which fields must be written in the agent's own words; however, it does not explain the `path` parameter or fully map the nested object structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific operation: appending a record, with server-side assignment of IDs and validation. It is distinguishable from read-oriented siblings like get_record and find_records, but it does not explicitly contrast with validate_record or other mutation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Append a record', and the description gives important in-record constraints. However, it does not explicitly say when to use this instead of validate_record, create_ledger, or other siblings, nor does it state exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_ledgerA

Check a ledger without changing anything; the result holds record and claim ids, keys and counts, never quote or source text. gaps is always returned: contestable records lacking a locator, quote or justification, claims whose records are all withdrawn, and, when a bibliography is known, record keys missing from it. Optional checks, each returned only when its input is given: work reports anchors not found in it, or with only a marker, under anchors (HTML is matched on its visible text; other files on their source text, so markup inside an anchor reports not found: prefer the rendered HTML); revision lists records assessed against another or an unknown provenance.manuscript_rev; sources maps a record key to the source's full text and re-checks each quote against it (matched, not_found, no_source); source_urls maps a record key to a public http(s) URL whose text (HTML, plain text or a PDF with a text layer, up to 10 MB; hyphenation across PDF lines can make a quote not_found) the server fetches itself and adds to sources (a key in both is an error). Hosts that are not public, including via redirects, are refused; fetches that fail are listed with a short reason under quotes.fetch_failed, and their records count as no_source. bibliography is a .bib or CSL JSON file; for an HTML work without one, its ref-<key> entries serve. Withdrawn records are skipped unless include_withdrawn.

NameRequiredDescriptionDefault
pathYes
workNo
sourcesNo
revisionNo
source_urlsNo
bibliographyNo
include_withdrawnNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it states the tool is read-only, describes what the result never includes, explains always-returned gaps, optional check outputs, URL-fetching constraints, PDF limitations, and withdrawn-record handling. This gives an agent unusually rich context for invoking the tool safely and correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but it is front-loaded with the core read-only purpose and return content before detailing optional checks. Given the tool's complexity, most sentences earn their place, though the single-paragraph format could be more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has seven parameters, no annotations, and an output schema, so the description needs to cover input behavior and return semantics. It does that extensively for optional checks and constraints, with the main remaining gap being the required path argument.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all seven parameters. It explains the semantics of work, revision, sources, source_urls, bibliography, and include_withdrawn in useful detail, though it does not explain the required path parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it checks a ledger without changing anything and states what the result contains. It is clear what the tool does, but it does not explicitly distinguish itself from sibling tools such as validate_ledger or summarize_ledger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through 'check a ledger without changing anything' and explains when optional checks are returned based on which inputs are supplied. However, it gives no explicit when-to-use guidance versus validate_ledger, summarize_ledger, or other siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_ledgerB

Create a ledger file (JSON Lines) with a header; work needs title and type.

NameRequiredDescriptionDefault
pathYes
workYes
notesNo
descriptionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the file format and a header, which is useful, but says nothing about overwrite behavior, file existence handling, permissions, or failure modes for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. The semicolon cleanly separates the core action from the nested requirement, making it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a nested object, an output schema, and no annotations, so the description should do more to explain creation semantics. It covers the file format and the required nested fields, which are key, but leaves out overwrite behavior, path interpretation, and usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the nested 'work' object has additionalProperties with no property definitions, so the description's note that 'work' needs 'title' and 'type' adds critical meaning beyond the schema. However, the 'path', 'notes', and 'description' parameters remain unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: creating a ledger file in JSON Lines format with a header. It does not explicitly differentiate itself from siblings like validate_ledger or export_ledger, but the creation action is distinct enough to be identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as validate_ledger or export_ledger. There is no mention of prerequisites, conditions, or exclusions, leaving the agent to infer usage entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

embed_ledgerB

Write a copy of the work's HTML (work, rendered by Quarto, Pandoc or any tool) with each claim's anchor marked and linked to its evidence, to a new file. Both layouts end with an "Evidence" section holding one card per claim; a button switches the reader between that section and a side panel that opens the clicked claim's card (a bottom sheet on narrow screens), and layout picks the view shown first; if no anchor is located, panel falls back to endnotes and the result's layout says so. Anchors that are only a marker, not found in the text or overlapping another claim's marked text are listed under "Not located in the work" and returned in not_located (overlapping maps a claim to the one it overlaps); a record key links to #ref-<key> when the work has that bibliography entry. Levels and the publication check work as in summarize_ledger, and out is never overwritten and must be in the work's folder. A full result holds whole quotes: keep it private.

NameRequiredDescriptionDefault
outYes
pathYes
workYes
levelNofull
layoutNoendnotes
include_withdrawnNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden well: it discloses layout switching, fallback from `panel` to `endnotes`, handling of unlocated or overlapping anchors, bibliography linking, and the fact that `out` is never overwritten. It also warns that `full` results contain whole quotes and should be kept private, though it does not cover all possible failure or permission conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loads the main action and then adds relevant behavioral details. It is long because the tool is complex and the schema lacks parameter descriptions, though some sentences are packed with multiple clauses that reduce readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex, has no annotations, and has 0% schema description coverage, so the description needs to do substantial work. It covers much of the behavior and output-related edge cases, but leaves key input parameters (`path`, `include_withdrawn`) and usage alternatives undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must document all six parameters, but it only partially covers `work`, `out`, `layout`, and indirectly `level`. It does not describe `path` or `include_withdrawn`, and it does not define the enum values for `level` beyond a reference to `summarize_ledger`.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: write a copy of the work's HTML with each claim's anchor marked and linked to evidence. It is clear what the tool does, but it does not explicitly differentiate this tool from related siblings such as relink_html or export_ledger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains behavior but gives no explicit guidance on when to choose embed_ledger over alternatives like relink_html, export_ledger, or summarize_ledger. Constraints such as `out` never being overwritten are useful but do not tell the agent when this tool is the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_ledgerB

Export the ledger to a new file. masked keeps the first and last words of each quote, locator no quoted text; a publication check runs before writing, and out is never overwritten. max_words is allowed only for masked, from 1 to 25; None keeps the default masking. With a budget, quote_focus centres the excerpt. A full export holds whole quotes: keep it private.

NameRequiredDescriptionDefault
outYes
pathYes
levelNofull
formatNojsonl
max_wordsNo
include_withdrawnNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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 good job disclosing key behaviors: a publication check runs before writing, `out` is never overwritten, and `full` exports contain sensitive whole quotes that should be kept private. It does not cover permissions, error handling, or exactly what the publication check validates, keeping 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded: the core action and key constraints appear immediately, and each sentence adds behavioral detail. The sentence about `quote_focus` does not earn its place because that parameter is absent from the schema, but overall structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has six parameters with zero schema descriptions and no annotations, so the description must do substantial work. It adequately covers the core output-level semantics and write-protection behavior, and an output schema exists to explain return values. Still, it omits meaning for `path`, `format`, and `include_withdrawn` and introduces a nonexistent parameter, leaving the definition only partially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds useful semantics for `level` (masked, locator, full), `max_words` (only for masked, range 1–25), and `out` (never overwritten). However, with 0% schema description coverage, it leaves `path`, `format`, and `include_withdrawn` completely undocumented. Worse, it references a `quote_focus` parameter that does not exist in the schema, which is misleading.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Export the ledger to a new file.' This clearly distinguishes it from siblings like summarize_ledger, validate_ledger, and create_ledger. It does not explicitly name any sibling as an alternative, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is implied through behavioral constraints: a `full` export 'holds whole quotes: keep it private,' and a publication check runs before writing. However, there is no explicit when-to-use guidance relative to alternatives such as summarize_ledger, nor are prerequisites or exclusions stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_recordsA

Find records by claim_id, source key, text in the claim, or contestable records lacking evidence (all filters combine); withdrawn records are left out unless requested.

NameRequiredDescriptionDefault
keyNo
pathYes
textNo
claim_idNo
missing_evidenceNo
include_withdrawnNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does disclose two real behavioral traits: filters are AND-combined, and withdrawn records are excluded by default unless include_withdrawn is set. That default-exclusion semantics cannot be inferred from the schema alone. It stops short of stating that the call is read-only or whether result sets are bounded, but the core filtering behavior is well surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that covers filter axes first and behavioral caveats second, with no filler. Minor ambiguity in the 'or' phrasing for what are actually AND-combined filters, though the parenthetical immediately corrects it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema relieves the description of explaining return values, and the filtering semantics are covered. Still, with no annotations and a required, undocumented 'path' argument, the definition does not give an agent everything needed to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does explain five of six parameters in domain terms: claim_id, key ('source key'), text ('text in the claim'), missing_evidence ('contestable records lacking evidence'), and include_withdrawn. The required parameter 'path' is never explained, which is a notable gap because it is the only mandatory argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource (find records) and enumerates the four filter axes: claim_id, source key, claim text, and missing-evidence records. It is clearly a filtered list operation, distinguishing it implicitly from get_record (single fetch) and add_record/withdraw_record (mutations), but it never names a sibling to route against explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(all filters combine)' tells the agent that filters are conjunctive rather than exclusive, which is genuinely useful selection guidance, and the withdrawn-records clause sets a default. However, there is no explicit statement of when to prefer this over get_record or summarize_ledger, and no prerequisites are given, so 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.

get_recordC

Return one record by its id.

NameRequiredDescriptionDefault
idYes
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, but it only states that a record is returned. It does not disclose what happens if the record is missing, whether permissions are required, or any side effects, though 'Return' implies a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted boilerplate. It is structurally clean, though extremely terse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, so the description need not explain them. But with two required parameters at 0% schema coverage and no annotations, the description is incomplete: it omits the meaning of 'path' and gives no guidance on selecting this tool over find_records.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and there are two required parameters. The description explains the 'id' parameter as the record identifier, but it leaves the required 'path' parameter completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Return one record by its id.' This clearly identifies a single-record lookup and implicitly distinguishes it from the plural search sibling find_records, though it does not name that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'by its id' — an agent can infer this is for direct lookup when an id is known. However, it does not explicitly compare this tool with find_records or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schema_infoA

Report the server version and the evidence ledger schema version it supports.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and 'Report' plus a zero-parameter schema reasonably conveys a side-effect-free informational read. It names exactly what is disclosed (server version, supported ledger schema version); finer points like caching or auth requirements are absent but low-risk for a version probe.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler, stating verb and both returned facts immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-arg informational tool with an output schema, the description supplies everything an agent needs: what it reports, with no hidden parameters or side effects to worry about. Return-value structure is covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline applies; nothing in the schema needs compensating for. The description correctly adds no parameter detail because there is none to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Report') plus two concrete resources: server version and supported evidence-ledger schema version. It is clearly distinguishable from every sibling (add_record, validate_ledger, etc.), though it does not name or contrast with any of them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when/when-not statements or alternatives. Usage is only implied — an agent infers this is the compatibility/version probe to call before or alongside ledger operations. No exclusions or ordering guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_ledgerA

Write a standalone HTML summary of the records, grouped by claim, to a new file. Levels and the publication check work as in export_ledger, and out is never overwritten. A full summary holds whole quotes: keep it private. For a PDF, print the HTML from a browser; its print style shows link targets and avoids splitting records where possible.

NameRequiredDescriptionDefault
outYes
pathYes
levelNofull
include_withdrawnNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses that output goes to a new file and is never overwritten, that `full` summaries contain whole quotes and should be kept private, and how the HTML's print style behaves (link targets shown, records not split where possible). The gap is that "levels" and "the publication check" are deferred to a sibling's description, so the agent may not see those semantics here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information: the action, level/publication semantics, the overwrite guarantee, the privacy warning, and the PDF workflow. The core action is front-loaded and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the file-write behavior is well covered. But for a tool whose levels drive privacy and content differences, leaving `masked`, `locator`, `include_withdrawn`, and the "publication check" undefined here (relying on export_ledger's description) leaves an agent unable to choose a level confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — all four parameters have only bare titles — so the description must compensate and largely does not. It clarifies `out`'s non-overwrite behavior and names `full` as a level value, but never explains `masked` or `locator`, never mentions `include_withdrawn`, and never says what `path` points to (source ledger).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact: "Write a standalone HTML summary of the records, grouped by claim, to a new file." That is clearly distinct from add_record/get_record and even hints at grouping semantics. However, differentiation from the closest sibling (export_ledger) is only implicit via the cross-reference for levels and the publication check, rather than an explicit statement of which tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real usage context: levels and the publication check behave as in `export_ledger`, `out` is never overwritten, and PDF output should be produced by printing the HTML from a browser. It also adds a handling caveat for `full` summaries. It stops short of an explicit "use this instead of export_ledger when you need a human-readable HTML artifact" routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_ledgerB

Validate a whole ledger; returns the problems found, empty if valid.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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 states that validation returns problems and is empty when valid, but it does not explicitly confirm read-only behavior, permissions, or whether any side effects occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It communicates the core action and return behavior efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return structure in detail. However, for a no-annotation tool with zero schema description coverage on its only parameter, the definition leaves important calling details about 'path' and read-only behavior unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required 'path' parameter. The description says 'whole ledger' but does not clarify whether 'path' is a file path, directory, ledger identifier, or expected format, so it does not compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: validating a whole ledger. The word 'whole' helps distinguish it from validate_record, but it does not explicitly name that sibling or clarify the difference in scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this to validate an entire ledger. However, the description gives no explicit when-to-use guidance, no exclusions, and no comparison to validate_record or schema_info.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_recordA

Validate one ledger record against the schema; returns the violations, empty if valid.

NameRequiredDescriptionDefault
recordYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose the return shape: violations, or empty if valid. That is genuinely useful, but it omits whether the call mutates anything, what schema is consulted, and how deep the validation goes given the record object allows additionalProperties.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and scope, with the return behavior appended. Nothing wasted and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values needn't be explained, yet the description still leaves the open-ended record parameter and the source of the validation schema unexplained. For a tool with no annotations and an unconstrained nested object, that leaves a real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for a single free-form nested object, so the description must compensate. It only establishes that 'record' is a ledger record checked against 'the schema' – it doesn't say which schema is used or what shape the record must take, which matters since the object is open-ended.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('validate one ledger record') plus the cardinality ('one'), which implicitly separates it from the ledger-wide sibling validate_ledger. It never names that sibling, so the differentiation requires inference rather than being spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Use is only implied – validating a single record ahead of or after a write. There is no explicit statement of when to call this versus validate_ledger or schema_info, and no mention of prerequisites or ordering relative to add_record/create_ledger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

withdraw_recordB

Mark a record withdrawn with a reason instead of deleting it.

NameRequiredDescriptionDefault
idYes
pathYes
reasonYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the record is marked withdrawn rather than deleted, implying retention and an audit reason. It does not explain permissions, reversibility, idempotency, or what happens to the record's visibility, which are important for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with no wasted words. It efficiently conveys the action, resource, and key contrast with deletion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, but the description is too thin for a mutation tool with three required, undocumented parameters and no annotations. It should explain path/id semantics and behavioral details like permissions or reversibility to be complete enough for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only clarifies the 'reason' parameter by saying the record is withdrawn 'with a reason'; it adds no meaning for 'path' or 'id', leaving two of three required parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: mark a record withdrawn. It also distinguishes the operation conceptually from deletion by saying 'instead of deleting it.' It does not explicitly differentiate itself from sibling tools like add_record or get_record, but the core purpose is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'instead of deleting it' gives a clear use context: prefer withdrawal over deletion when a reason should be preserved. However, it does not state when not to use this tool, nor does it name or compare against sibling tools such as add_record or get_record.

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.

  1. 4 tool updatesv0.4.0
    • Addedcheck_ledger
    • Addedembed_ledger
    • Addedrelink_html
    • Addedresolve_links
  2. 10 tool updatesv0.1.0
    • First observedadd_record
    • First observedcreate_ledger
    • First observedexport_ledger
    • First observedfind_records
    • First observedget_record
    • First observedschema_info
    • First observedsummarize_ledger
    • First observedvalidate_ledger
    • First observedvalidate_record
    • First observedwithdraw_record

TDQS

A3.6/5.0

Scored across 14 tools

Disambiguation4/5

Most tools target distinct lifecycle stages: record operations, ledger creation/validation, export/summary/embedding, and PDF linking. The main potential confusion is between check_ledger and validate_ledger, and between resolve_links and relink_html, but their descriptions clarify different inputs and outputs. An agent can generally select correctly, though a few boundaries require careful reading.

Naming Consistency4/5

Nearly all tools use a consistent snake_case verb_noun pattern: add_record, find_records, get_record, validate_record, export_ledger, and so on. The only clear deviation is schema_info, which is noun-based rather than verb_noun, but the naming remains predictable overall.

Tool Count5/5

Fourteen tools is well within the expected 3-15 range and fits a complex evidence-ledger workflow that includes record management, validation, export, embedding, and PDF linking. Each tool appears to earn its place without obvious duplicates.

Completeness4/5

The surface covers ledger creation, record addition, lookup, withdrawal, validation, export, summarizing, embedding, and source linking. The main gap is a direct record update/edit operation, though the append-plus-withdraw model may make this intentional. Overall the lifecycle is substantially covered with minor workarounds.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server providing an append-only, hash-chained evidence ledger for agent actions, where every record is a tamper-evident receipt cryptographically bound to all prior records and persisted as human-readable JSONL local state. It exposes tools to append records, verify chain integrity (pinpointing tampering), query records by actor/action/target/time, and fetch ledger stats—with no update or delete capabilities by design.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides evidence-oriented MCP service for cryptographically identified agents, bounded public contracts, privacy-preserving records, and append-only audit.
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Free seven-tool proof loop for MCP agents: scoped sessions, bounded authorization, typed outcomes, evidence-bound claims, and tamper-evident local closure. Upgrade to Complete Local for durable memory, recovery, signed traces, release verification, and multi-agent workflows.
    7
    Apache 2.0