Skip to main content
Glama

forrt-research-mcp

DOI PyPI

An MCP server for producing verifiable FORRT nanopublication chains — the tools a researcher needs while doing the work, not while looking for it. It serves all three shapes of study on the same rails: reproduction, replication, and research that starts from scratch.

It is the third of three servers that compose:

Server

Question it answers

OpenAIRE MCP

What is in the literature?

replication-radar

What is worth replicating, and has it been done?

forrt-research-mcp

How do I produce a chain that is correct and verifiable?

Built for the workflow in forrt-replication-template, but it needs nothing from that repo — any agent can call it.

Scope: reproduction, replication, and research from scratch

All three work here, and they use the same chain:

anchor → AIDA → Claim → Study → Outcome → CiTO

Step 01 is one of three anchors, and they are not variants of one form. Which anchor fits is independent of whether the study is a reproduction, a replication or original research:

Anchor

Required fields

Notes

01_quote Quote-with-comment

paper, quotation, comment

no type, no label. quotation is capped at 500 characters and comment at 800 — in the template's own regex, not in prose

01_pico PICO question

label, description, type, + P/I/C/O descriptions

the only anchor with a question-type vocabulary (5 terms)

01_pcc PCC question

label, description, + P/C/C descriptions

no type field at all

The three share no field ids whatsoever, so call template_fields on the anchor you are actually using rather than assuming they match. The pico_question_type vocabulary is named for PICO deliberately: a PCC question has no type to look up.

verify_quote applies to the Quote anchor only — and that is the one anchor with a dedicated tool, because a quotation is the one field whose correctness can be proved rather than reviewed.

constellation and prior_work surface a question anchor with its framework, label, full question text and its framework's components — PICO's population / intervention / comparator / outcome, PCC's population / concept / context. Question nodes keep all of that in a question object and leave their top-level label empty, so anything reading them like a quote returns nothing. Tested against two real published question nanopubs.

For a study starting from scratch, the Claim is your own hypothesis, derived from your own question or from the work you are building on. The FORRT Claim template's source is optional, so it needs no external paper — and the Claim-before-Study order then reads as pre-registration, not as a mismatch. verify_chain takes a mode (auto / replication / reproduction / new_research) that changes only what is required: from-scratch research has no existing work to cite, so no CiTO step and no cited DOI are expected.

The one place the templates still assume an original is the study_type vocabulary on 04_study, whose three terms are all replication-flavoured (Replication Study, Reproduction Study, or both). There is no term for an original study testing its own claim. Three field prompts read oddly too — scope and methodology say "is reproduced/replicated", and the Outcome's conclusion says "about the original claim" — but they are only wording; validationStatus (validated / partially supported / contradicted / inconclusive / not tested) describes testing your own hypothesis perfectly well.

So closing the gap is plausibly one added vocabulary term and three reworded prompts, not a new template family. When that lands, this server picks it up with no code change: template_fields and vocabulary fetch live, and driftedFromSnapshot flags the supersession so the vendored copy gets re-cut.

A note on using "Reproduction Study" for from-scratch work. It is a reasonable workaround while the vocabulary lacks a better term, but the template means the replication-science sense — "direct reproduction: same methodology, same tools", i.e. re-running someone else's analysis — not the RSE sense of "my work is reproducible". Downstream consumers read it the first way: replication-radar's verdict overlay and verified_claims will present the study as verification of an existing claim.

Related MCP server: CiteAnything MCP Server

Why a server and not a prompt

Two jobs here look like reasoning but are not, and doing them in an agent loop makes them unreproducible and expensive:

1. Reading a published chain. /np/constellation walks the FORRT citation graph bidirectionally and returns everything it reaches. For a single marine-heatwave chain that is 330 KB, 98 nodes and 1012 edges — of which 64 nodes are AIDA statements belonging to entirely different studies. Handing that to an agent burns its context and invites it to reason over another paper's claims. constellation returns the same chain in ~16 KB (4.7 %).

2. Checking a quotation is real. A FORRT Quote nanopub must be verbatim. That is a string search, not a judgement — so it should be a tool that cannot be talked out of its answer, and that anyone can re-run to get the same result.

What it does not do

It does not search papers (that is the OpenAIRE MCP), rank replication targets (that is replication-radar), or write nanopub content. It also does not extract claims: choosing which sentence carries a paper's headline claim is a judgement, and wrapping a judgement in a tool would not make it reproducible — a model behind a tool boundary is exactly as non-deterministic as one in the agent loop. The division this server is built around:

The model proposes

This server disposes

Which sentence is the claim

Whether that sentence is in the PDF, where, under what SHA-256

How to phrase the AIDA

What fields the template actually has, and their caps

Which claim type or CiTO relation applies

Which values the form will actually accept

Which Wikidata topic is meant

Whether that QID exists and is of the right type

Which paper to cite

Whether that DOI resolves, and to what

Whether to extend or dispute prior work

What prior chains already claimed

Install

pipx install forrt-research-mcp
claude mcp add forrt-research -s user -- forrt-research-mcp

User-scoped (-s user) so it is available in every session and folder, and does not clash with a per-repo config. For other agents, the stdio command is forrt-research-mcp.

# optional
export SCIENCELIVE_API_BASE="https://api.sciencelive4all.org"  # default (production)
export SCIENCELIVE_API_KEY="sl_…"   # /np/constellation is a public read

The default base is production. To test against the dev deployment, set SCIENCELIVE_API_BASE=https://api-dev.sciencelive4all.org. A constellation that nobody has requested recently can take ~60 s to build; after that it is cached for 4 h and returns in well under a second.

Tools

verify_quote(pdf_path, quotation)

Proves a candidate quotation is in a source PDF before it is published as verbatim. Returns a graded verdict with page, character offsets and the file's SHA-256:

Verdict

Meaning

exact

byte-identical to the extracted page text

normalized

matched after whitespace / ligature / typographic punctuation / line-break-hyphen repair

extraction_tolerant

additionally ignored hyphens and punctuation spacing

whitespace_insensitive

additionally deleted every space — for text layers that break words apart

not_found

not in this PDF — do not publish it

Every tier canonicalises formatting only — never words, digits or order. A quotation with one digit changed scores ~0.91 similarity against the source and is still not_found; on a miss, closest.text_in_pdf shows what the paper actually says there.

A tier below exact is normal. PDF extraction inserts line breaks, loses hyphens, and sometimes breaks words apart entirely:

  • the quotation published in the real marine-heatwave chain matches only at extraction_tolerant, because pypdf reads the paper's 35-year as 35year and (p < as ( p <;

  • Hundhausen et al. 2024 renders its own abstract as CP en semble, largest c hanges, prec ipitation — spaces inside words, which no punctuation rule can undo. That needs whitespace_insensitive, which deletes every space and therefore does not verify word boundaries; it declines to run below 40 characters, where two short texts could collide.

"Character-for-character" is not literally achievable against extracted PDF text, which is why the result is graded rather than boolean.

Words split across a line break (convection-\npermitting) are rejoined at the normalized tier. A suspended hyphen (15- and 30-minute) is deliberately NOT rejoined — the rule requires a line break, because joining those would corrupt the text.

constellation(uri, depth=5, max_nodes=80)

The FORRT chain(s) reachable from a published nanopub URI, projected to agent-size: chains with their steps in chain order, the apex CiTO, any Research Synthesis, and the Quote/Question anchors attributable to this paper.

Read citedPaper, not the API's top-level paperDoi — see Upstream quirks below.

stepsPresent legitimately omits steps: a CiTO at the apex of a constellation is hoisted out of its chain, and Quote/AIDA anchors are often not enumerated. Missing does not mean unpublished.

prior_work(uri)

What has already been claimed about a paper — the starting point for new work, replication or otherwise. Per completed chain: claim type, scope, method, deviations, verdict, confidence, repository, and limitations.

limitations is the field to read most carefully. It is where previous authors stated, in signed and immutable words, what their study did not cover — which is often exactly where the next study begins. In the marine-heatwave chain it records that the paper's better-known 54 % headline describes a different analysis over a different period and was not tested.

constellation_raw(uri, …)

The unprojected response, for debugging the graph or an upstream data problem. Large; prefer constellation.

template_fields(step, live=True) · vocabulary(name, live=True) · list_schemas()

A nanopub template is the schema for its chain step, so these turn "never invent a field name" and "never invent a claim type" from rules an agent has to remember into a lookup that can only return real values.

template_fields returns the real field ids, prompts, required/repeatable flags, and the regex / prefix / datatype constraints — which is where the Quote template's character cap actually lives, rather than in a hand-written doc that drifts. step accepts 05_outcome, 05, or outcome.

vocabulary returns the allowed values of a controlled vocabulary, taken from the real restricted-choice field:

Name

From

Terms

claim_type

03_claim.forrtType

7

study_type

04_study.type

3 — the Reproduction vs Replication distinction

validation_status

05_outcome.validationStatus

5

confidence_level

05_outcome.confidenceLevel

5

cito_relation

06_citation.cites

43, via a separate value-list nanopub

question_type

01_pico.type

5

Both fetch live by default and fall back to a bundled snapshot when the network is unavailable — always reporting which was used, and setting driftedFromSnapshot when the upstream template has been superseded. A drifted result means the live values win and this package needs re-vendoring; it is a loud, reviewable event rather than slow silent divergence.

cito_relation is the one vocabulary that cannot be resolved offline: it lives in a separate value-list nanopub. Offline it returns source: "unavailable-offline" with a warning rather than an empty list, because an empty list reads as "no valid values."

verify_chain(published_path, repo_url="")

The final check before announcing a chain. Point it at a nanopubs/PUBLISHED.md ledger; green is true only when nothing failed. Read-only — it never edits, retracts or supersedes.

Check

What it means

ledger

every required step (01–06) has a URI

reachable

every URI is really published

repository

the Outcome's archived version DOI resolves

cited-doi

every DOI the chain cites resolves

verdict-relation

the CiTO relation agrees with the Outcome's verdict

That last one is the failure most worth catching: Validated implies confirms, PartiallySupported implies qualifies, Contradicted implies disputes. A mismatch means the Outcome and the Citation disagree about what the replication actually found — a chain that cites confirms for a paper it contradicted is worse than no chain at all.

A constellation alone cannot verify a chain, which is why this does not try. On both real chains the walk stops short of the upstream anchors, so anything it does not enumerate is checked by fetching its TriG from the bare w3id.org/np/ resolver — the /sciencelive/np/ form serves an HTML viewer that answers 200 and would pass a status-only check while serving no nanopub. A row reading "not enumerated by the walk but its TriG resolves" is a pass, not a warning.

The Outcome's repository is expected to be a Zenodo version DOI, not a GitHub URL: a version DOI pins the archived state the outcome was computed from, where github.com/ORG/REPO is a moving target. Both are accepted; a DOI is checked by resolving it, a URL by comparing it to repo_url.

Both published chains verify green, matching the hand-run verification recorded in marine-heatwave's ledger.

validate_chain_draft(path)

Checks nanopubs/chain-draft.jsonthe artifact that actually gets published — before it is handed to the Science Live chain wizard. Run it at the end of Phase 5b, after pixi run build-chain-draft and before pushing the file and opening the wizard URL.

The markdown drafts are the authoring format; build_chain_draft.py turns them plus CITATION.cff and the templates into this file, which the wizard pre-fills each step from and a human reviews and signs. validate_draft checks the input; this checks the artifact.

What it catches that reading the file cannot:

  • a superseded template_uri — invisible in the JSON, but it makes the wizard pre-fill the old form;

  • a prefill key that is neither a template field nor a known platform form-field, which the wizard silently drops;

  • a complex field in the wrong shape — 06_citation.st02 must be [{cites, cited}] with at least one entry, and 04_study.disciplineSelection is a single object, not an array (the one asymmetry in the contract);

  • a required field neither prefilled nor carried forward;

  • a value over the template's own cap, an invalid vocabulary term, a malformed date, an unresolved {{TOKEN}}, or a DOI that does not resolve;

  • a carry_forward edge running backwards through the chain.

Fields the wizard fills itself are exempt rather than reported missing: 02_aida has no project, 03_claim no aida, 04_study no claim.

Both of this project's real chain drafts validate clean, and 13 deliberate mutations of one are each caught.

validate_draft(path) · validate_drafts(directory)

The pre-flight checklist in docs/forrt-form-fields.md, actually executed. One call checks a drafted nanopub end to end: field ids against the live template, choice values against its enumeration, length caps against its regex, DOIs against the registry, QIDs against Wikidata. publishable is true only when nothing came back as an error.

This is the composition the other tools exist for — individually they answer "is this value real?", together they answer "is this draft publishable, and if not, exactly where is it wrong?"

Three placeholder conventions, and only one is a problem. Getting this wrong made the checker useless on real drafts, so each is handled explicitly:

In a draft

Meaning

Severity

«URI of step 05 …»

back-reference; the chain wizard fills it from the published step

info

{{ZENODO_VERSION_DOI}}

release-time token; the release workflow substitutes it

warning

anything else standing in for a value

genuinely unfilled

error

A draft whose required fields are nearly all empty is reported once as an unfilled skeleton — "it has not been drafted yet" — rather than as a wall of per-field errors.

What it cannot see. Values a draft puts in prose or a markdown table rather than behind a <!-- field: … --> marker are reported as coverage warnings, never as missing. The CiTO step's citation list is the known case: cites and cited live in a table in both repos checked.

Validated against two real published chains (marine-heatwave and Sado estuary): all six published steps pass in both, with the only remaining flags being an unpublished step 07 and the release tokens above.

resolve_doi(doi)

Does this DOI resolve, and to what? resolves: false means it is not registered — a well-formed DOI is not a real one, and a fabricated one is indistinguishable from a genuine one until something asks the registry. Returns the registered title, authors, year and container so you can confirm it is the paper you meant, not merely a paper that exists. Accepts bare, URL, and doi: forms. A 5xx is reported as transient rather than as a bad DOI.

wikidata_lookup(query, expected_type="", limit=5)

Real Wikidata candidates for a term, with their actual P31/P279 types. Pass expected_type as a QID and each candidate is marked typeMatches.

Checked against the ten Wikidata terms in this project's published chains — the QIDs build_chain_draft.py resolved and signed — it returns the published QID at rank 1 for all ten (marine heatwave, sea surface temperature, climate change, time series analysis, chlorophyll a, remote sensing, estuary, Sentinel-2, water quality, atmospheric correction).

It deliberately does not choose — picking the right sense of an ambiguous label is a judgement. Searching Bombus with Q16521 (taxon) returns the insect genus as a match and the album of the same name as not, which is exactly the failure worth catching before a QID gets signed into a nanopub. Candidates are annotated, never filtered: a near miss is often the informative result. Zero candidates means leave the field empty — never fall back to a QID from memory.

Upstream quirks this handles

Found by probing live data rather than reading the API contract, and each one is pinned by a test against a real recorded payload (two constellations, from unrelated studies):

  1. Cloudflare rejects urllib's default User-Agent. The API runs on Cloudflare Workers, whose bot protection answers Python-urllib/3.x with HTTP 403 — same URI, same key, 200 under any normal agent. Every request this client makes sets an explicit User-Agent. Do the same in your own client; no hermetic test can catch it.

  2. paperDoi can name the wrong paper. It is chosen by frequency across the whole walk, so a neighbouring study's Quote nanopubs can outvote the chain's own citation. On the marine-heatwave chain it reports the LifeWatch ERIC paper (4 unrelated quotes) instead of Oliver et al. 2018, which the chain's CiTO actually cites — and it names the same wrong paper from the unrelated Sado-estuary entry point, so this is systemic, not one bad record. citedPaper derives the paper from the CiTO and sets disagreesWithReported when the two differ.

  3. The walk stops short, and missing does not mean unpublished. Two real chains enumerated [Claim, Study, Outcome] and [Study, Outcome, CiTO], while the Quote, AIDA and Claim nanopubs listed in those repos' PUBLISHED.md were published and merely unreachable. stepsNotEnumerated reports the gap. A constellation alone cannot verify a complete chain — fetch those URIs' TriG directly.

  4. quote.quotedText comes back empty on nanopubs using the current quote template. The text survives in label and in two untagged excerpts — the quotation and the annotator's comment, in no guaranteed order. We match them against the label stem rather than assuming a position, and report the recovery in text_source.

  5. The apex CiTO is hoisted out of chains[].steps[] to top level.

  6. The /sciencelive/np/ URI form serves an HTML viewer that answers 200, so a status-only reachability check passes even when no nanopub is served. We normalise to the bare w3id.org/np/ resolver and assert the body is RDF.

Checking against every real artefact

The test suite is hermetic: it pins behaviour against recorded data, which prevents regressions but cannot discover a wrong premise. Every serious bug in this server was a wrong premise, and each surfaced only when the tools met real data they had not seen. So "have we tested comprehensively?" is not a judgement call here — it is a computation with a visible denominator:

python scripts/check_corpus.py /path/to/your/study/repos

It discovers every repository with a nanopubs/ directory, runs the applicable tools against each artefact, and prints what passed out of what was found. Findings are not automatically failures — an empty required field is a true statement about a draft. What it exits non-zero for is a crash or a parse failure, because those mean a tool could not read a real artefact at all.

The denominator is only as good as what is on disk. A chain that is not under that root is not covered, and a green run does not say otherwise.

Development

pip install -e '.[dev]'
pytest

All 287 tests are hermetic and need no network, no API key, and no live service: the constellation fixtures are real recorded /np/constellation responses, quote tests build minimal PDFs in-process that reproduce the extraction artifacts deliberately, and the template/DOI/Wikidata tests stub HTTP with recorded payloads. The suite stays green through an upstream outage.

The bundled template snapshot under src/forrt_research_mcp/data/ is vendored from ScienceLiveHub/forrt-replication-template, as is template_spec.py. Re-vendor when template_fields reports driftedFromSnapshot.

License

MIT — see LICENSE.

Available Tools

13 tools
constellationA

The FORRT chain(s) reachable from a published nanopub URI, as a compact projection you can actually read.

Call this to see an existing chain — before starting a replication (what has already been done?), when extending someone else's chain, or to inspect your own after publishing.

The raw Science Live constellation is ~330 KB for one chain, of which ~95 % is a depth-5 neighbourhood of UNRELATED chains reachable through shared links (on the marine-heatwave chain, 64 of 98 nodes are other studies' AIDA statements). This returns the chains, the apex CiTO, any Research Synthesis, and the Quote/Question anchors attributable to this paper — and drops the rest, reporting how much it dropped under neighbourhood.

Read citedPaper rather than assuming: the API's own top-level paperDoi is a frequency vote across the whole walk and can name a neighbour's paper, so this derives the paper from the chain's CiTO citation and sets disagreesWithReported when the two differ.

stepsPresent legitimately omits steps: a CiTO at the apex of the constellation is hoisted out of its chain, and Quote/AIDA anchors are often not enumerated. Missing does not mean unpublished.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYes
depthNo
max_nodesNo

TDQS

A4.5/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 burden of behavioral disclosure, and it succeeds: it explains what is returned, what is dropped, how the drop is reported under `neighbourhood`, why `citedPaper` should be trusted over `paperDoi`, and why missing steps in `stepsPresent` are normal. This is unusually transparent.

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 front-loaded with purpose and use cases, then moves into output behavior and caveats. Every sentence adds distinct value, including the concrete 64-of-98 example, which illustrates the need for the compact projection rather than padding.

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?

Given no output schema and no annotations, the description covers what an agent needs to know: what the tool returns, what it deliberately omits, and how to interpret tricky fields like `citedPaper`, `disagreesWithReported`, and `stepsPresent`. It is complete for practical invocation and interpretation.

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?

The description gives semantic meaning to `uri` ('published nanopub URI') and indirectly hints at `depth` via the 'depth-5 neighbourhood' discussion, but it never explains `max_nodes`. Since schema description coverage is 0%, the description partially compensates but leaves one parameter underdocumented.

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

Purpose5/5

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

The description names the specific resource ('FORRT chain(s) reachable from a published nanopub URI') and the precise action ('Call this to see an existing chain'), while contrasting it with the raw Science Live constellation. This clearly differentiates the tool from its raw sibling and leaves no ambiguity about what it returns.

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?

It gives concrete trigger scenarios: before starting a replication, when extending someone else's chain, or after publishing your own. It does not explicitly name an alternative tool or say 'do not use when...', but the context is clear enough for an agent to decide when to invoke it.

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

constellation_rawA

The unprojected /np/constellation response, including every node and edge.

For debugging the graph itself or investigating an upstream data problem. Prefer constellation for normal use: this is very large (~330 KB for a single chain) and most of it belongs to other studies. Lower depth to shrink the walk.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYes
depthNo
max_nodesNo

TDQS

A4.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 burden of behavioral disclosure. It discloses that the response is raw/unprojected, very large (~330 KB for a single chain), and contains data mostly belonging to other studies. This gives the agent important expectations about size and content. It does not explicitly state that the operation is read-only, but the 'response/debugging/investigating' framing strongly implies a non-mutating fetch.

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 compact and front-loaded. The first sentence states exactly what the tool returns, the second gives the use case, and the third provides the alternative plus a size warning and a tuning hint. Every sentence earns its place and there is no redundant wording.

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 description covers the tool's purpose, use case, size, and one parameter behavior, but it omits the meaning of `uri` and `max_nodes`, which are essential for calling the tool correctly. There is no output schema, so the description should provide more return-shape detail; it does describe 'every node and edge,' but the parameter gaps prevent full contextual completeness.

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 by explaining the parameters. It only explains `depth` ('Lower `depth` to shrink the walk') and gives no guidance on `uri` or `max_nodes`. The agent is left to guess what `uri` should reference and what `max_nodes` controls. This is a significant gap for a tool with three parameters and no schema-level descriptions.

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

Purpose5/5

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

The description clearly identifies what the tool returns: 'The unprojected /np/constellation response, including every node and edge.' It uses a specific resource and distinguishes itself from the sibling `constellation` tool by calling this the raw/debugging variant. An agent can immediately tell what this tool does and how it differs from the normal `constellation` endpoint.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'For debugging the graph itself or investigating an upstream data problem.' It also names the preferred alternative: 'Prefer `constellation` for normal use.' It even provides a practical tuning hint—'Lower `depth` to shrink the walk'—which gives actionable guidance for invocation.

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

list_schemasA

Which chain steps and vocabularies this server can look up.

Cheap, offline, and no network. Call it first if you are unsure what to pass to template_fields or vocabulary.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/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 disclosure burden. It adds valuable context: 'Cheap, offline, and no network' tells the agent this is a low-cost, safe first call. It does not explicitly say 'read-only', but the listing/lookup wording and zero mutation implications make that reasonably clear.

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 very short, front-loads the core purpose, and uses a second sentence for actionable guidance. No filler or redundant restatement of the tool name.

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?

For a zero-parameter catalog tool, this is nearly complete: it states what is listed, when to call it, and why it is safe/cheap. It does not explicitly describe the output format, but the name and phrasing make the return value self-evident.

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?

The tool has zero parameters, so the baseline is 4. The description goes further by explaining how its output informs what to pass to template_fields and vocabulary, which helps the agent understand the tool's role in the broader workflow.

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 the resource clearly: chain steps and vocabularies the server can look up. It lacks an explicit imperative verb like 'lists' or 'returns', but the meaning is unambiguous and distinct from the lookup-focused sibling tools.

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

Usage Guidelines5/5

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

It explicitly says 'Call it first if you are unsure what to pass to template_fields or vocabulary', naming the exact sibling tools and the condition that triggers this tool. This is strong, actionable usage guidance.

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

prior_workA

What has already been claimed about a paper — the starting point for new work, whether that work is a replication or a fresh study.

Given any published nanopub URI in a constellation, returns one entry per completed chain: the claim type, what was tested (scope), how (method), what was done differently (deviations), the verdict and confidence, and — the field to read most carefully — limitations, where the previous authors stated in their own signed words what their study did NOT cover.

Use it to avoid duplicating an existing replication, to choose a CiTO relation relative to prior work (extends / qualifies / disputes), and to find the part of a claim still open. Cite what you find; do not re-derive it — a published chain step is a record with a URI, not a result to recompute.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYes

TDQS

A4.3/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. It discloses the return granularity ('one entry per completed chain'), the key fields including the specially important 'limitations', and a behavioral caution: published chain steps are signed records with URIs and should not be re-derived. It does not mention errors or edge cases, but the read-only nature is clear from 'returns'.

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 structured as an opening definition, a detailed output explanation, and a usage paragraph. It is slightly more verbose than strictly necessary, but the additional sentences earn their place by explaining output semantics and use cases. The most important information is front-loaded.

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 one parameter and no output schema, so the description must explain both input meaning and return content. It covers input URI semantics, output fields, usage intentions, and a caution about citation. It omits output format and error behavior, but for a simple retrieval tool this is a minor gap.

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 coverage is 0%, so the description must compensate for the single 'uri' parameter. It does so by specifying that the URI must be a published nanopub URI in a constellation, which gives meaningful domain context beyond the bare parameter name. Exact URI format is not provided, but enough guidance exists for correct invocation.

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

Purpose5/5

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

The description opens with a clear statement of what the tool provides: prior claims about a paper, as the starting point for replication or fresh study. It specifies the resource ('published nanopub URI in a constellation') and the output shape ('one entry per completed chain'), making it distinct from sibling validation and lookup tools.

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?

The description explicitly tells an agent when to use this tool: to avoid duplicating existing replications, to choose a CiTO relation, and to find still-open parts of a claim. It does not name alternative siblings or state when not to use it, but the usage contexts are concrete and actionable.

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

resolve_doiA

Does this DOI resolve, and to what?

Call it on every DOI destined for a nanopub field, CITATION.cff, or a CiTO citation. resolves: false means the DOI is not registered — do not publish it, however well-formed it looks. A well-formed DOI is not a real one, and a fabricated one is indistinguishable from a genuine one until something asks the registry.

On success it returns the registered title, authors, year, container and type, so you can confirm it is the paper you mean rather than merely a paper that exists. Accepts bare (10.…), URL, or doi:-prefixed forms.

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that the tool asks the registry, what `resolves: false` means, that well-formed DOIs can be fabricated, and what fields are returned on success. This gives the agent a realistic model of the tool's behavior.

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 question and usage instruction, followed by behavior and return details. Each sentence adds information, though the point about fabricated DOIs is slightly expansive; still, it reinforces an important trust boundary.

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 single-parameter tool with no output schema and no annotations, the description covers purpose, when to call it, false/true semantics, return fields, and accepted input formats. Nothing essential for correct invocation is missing.

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?

The schema only defines `doi` as a string with 0% description coverage, so the description must compensate. It does by specifying accepted forms: bare (`10.…`), URL, or `doi:`-prefixed. This is meaningful format guidance beyond the schema, though an example would have made it even clearer.

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

Purpose5/5

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

The opening question 'Does this DOI resolve, and to what?' clearly states the tool's purpose with a specific verb and resource. The description further specifies it is for DOIs destined for nanopub fields, CITATION.cff, or CiTO citations, distinguishing it from the non-DOI sibling tools.

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

Usage Guidelines5/5

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

The description explicitly says 'Call it on every DOI destined for a nanopub field, CITATION.cff, or a CiTO citation,' giving a clear trigger condition. It also instructs not to publish when `resolves: false`, providing actionable guidance beyond mere invocation.

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

template_fieldsA

The exact form fields of one FORRT chain step, from the live template.

Call this BEFORE drafting any nanopub field. A nanopub template is the schema for its step, so this is what makes "never invent a field name" a lookup rather than a rule you have to remember: it returns the real field ids, prompts, whether each is required or repeatable, the length/format constraints (regex, prefix, datatype — where the Quote template's character cap actually lives), and, for choice fields, the allowed values.

step accepts 05_outcome, 05, or outcome. Known steps: 01_quote, 01_pico, 01_pcc, 02_aida, 03_claim, 04_study, 05_outcome, 06_citation, 07_research_software, 08_synthesis.

Check source: live means fetched from the nanopub network just now; bundled-snapshot means the network was unavailable and these are vendored values that may be stale. driftedFromSnapshot: true means the template was superseded upstream — the live values win, and this package needs re-vendoring.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
stepYes

TDQS

A4.7/5.0
Behavior5/5

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 does so thoroughly. It discloses concrete behavior: returning field ids, prompts, required/repeatable flags, constraints like regex/prefix/datatype, and allowed values; plus source semantics for 'live' vs 'bundled-snapshot' and 'driftedFromSnapshot.' It also clarifies that templates may be stale when the network is unavailable.

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 dense but every sentence earns its place: purpose, timing, return contents, step values, and source-freshness semantics are all relevant. The most important scoping information is front-loaded before implementation details.

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 two-parameter lookup tool with no output schema and no annotations, the description is remarkably complete. It tells an agent what the tool returns, which parameter values are valid, what the freshness/drift states mean, and when to call it. The only small gap is explicit treatment of the `live` parameter, but it is not enough to undermine completeness.

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. It does this very well for `step` by documenting accepted aliases and listing all known step values, but it does not directly explain the `live` boolean parameter beyond the broader 'live' vs 'bundled-snapshot' distinction in the source discussion.

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

Purpose5/5

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

The description opens with a precise definition: 'The exact form fields of one FORRT chain step, from the live template.' It names the resource, scope, and what the tool returns, and the contrast with validation/verification siblings ('Call this BEFORE drafting any nanopub field') makes its role unambiguous.

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?

It gives explicit timing context: 'Call this BEFORE drafting any nanopub field,' and explains why the template itself is the schema. It also enumerates known step aliases and values. However, it does not explicitly name alternative tools or state when not to use this tool.

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

validate_chain_draftA

Check nanopubs/chain-draft.json before handing it to the chain wizard.

Run this at the end of Phase 5b, after pixi run build-chain-draft and BEFORE pushing the file and opening the wizard URL. readyForWizard is true only when nothing came back as an error.

This file — not the markdown drafts — is what the wizard pre-fills each step from, and therefore what a human reviews and signs. validate_draft checks the authoring input; this checks the artifact.

What it catches that reading the file cannot:

  • a superseded template_uri, which is invisible in the JSON but makes the wizard pre-fill the old form. Re-run build-chain-draft to fix;

  • a prefill key that is neither a template field nor a known platform form-field — the wizard silently drops it;

  • a complex field in the wrong shape: 06_citation.st02 must be [{cites, cited}] with at least one entry, and 04_study.disciplineSelection is a single object, NOT an array;

  • a required field that is neither prefilled nor carried forward;

  • values violating the template's own regex (the Quote's 500-character cap lives there), an invalid vocabulary term, a malformed date, an unresolved {{TOKEN}}, or a DOI that does not resolve;

  • a carry_forward edge that runs backwards through the chain.

Fields the wizard fills itself are exempt, not reported missing: 02_aida has no project, 03_claim no aida, 04_study no claim, because each is carried forward from the step published before it.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
pathYes

TDQS

A4.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 full burden of explaining behavior. It thoroughly discloses what the validator catches, including superseded template URIs, dropped prefill keys, shape violations, regex violations, unresolved tokens, and invalid DOIs. It does not explicitly state whether the operation is read-only or makes network calls, but the 'Check' framing and detailed error semantics provide strong behavioral transparency.

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 a clear purpose sentence and then uses bullets for detailed validation rules. It is longer than average, but the length is justified by the complexity of the validation checks. Slight tightening around repeated 'what it catches' phrasing would improve it, but it remains well structured.

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 description provides rich contextual guidance: when to run, what the validator checks, what it does not check, and which fields are exempt. It does not fully describe the return shape beyond the `readyForWizard` flag and 'nothing came back as an error', and it omits parameter semantics. Given the tool's complexity and lack of output schema, this is a minor but real gap.

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 the description does not explain the `path` or `live` parameters. It references the default file `nanopubs/chain-draft.json`, which implies what `path` might point to, but `live` is completely undocumented. The description does not compensate for the schema's lack of parameter descriptions.

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

Purpose5/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: 'Check `nanopubs/chain-draft.json`'. It also explicitly distinguishes this tool from the sibling validate_draft: 'validate_draft checks the authoring input; this checks the artifact.' This makes the tool's role unambiguous.

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

Usage Guidelines5/5

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

The description gives precise timing: run at the end of Phase 5b, after `pixi run build-chain-draft`, and before pushing the file or opening the wizard URL. It also clarifies when results indicate readiness and explicitly contrasts it with validate_draft, giving an agent clear selection criteria.

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

validate_draftA

Check one drafted nanopub against its template and the real world.

Run this on every draft before publishing. It is the pre-flight checklist in docs/forrt-form-fields.md, actually executed: field ids checked against the live template, choice values against the template's own enumeration, length caps against its regex, DOIs against the registry, Wikidata QIDs against Wikidata.

publishable is true only when there are no errors. Severities:

error would publish something false, or be rejected by the form warning a human should look, but it may be intentional info checked and fine, or deliberately not checked

Three placeholder conventions are distinguished, because only one is a problem: «URI of step 05 …» is a back-reference the chain wizard fills (info); {{ZENODO_VERSION_DOI}} is a release-time token the release workflow substitutes (warning — confirm the release ran); anything else still standing in for a value is an error.

step is inferred from the filename (05_outcome.md); pass it explicitly for a file named otherwise. A draft whose required fields are nearly all empty is reported once as an unfilled skeleton rather than field by field.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
pathYes
stepNo

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries full responsibility, and it is exceptionally transparent: it enumerates checks (template, enum, regex, DOI registry, Wikidata), defines the three severities, explains placeholder conventions, notes step inference from filenames, and describes the unfilled-skeleton behavior. This goes well beyond a generic 'validates' statement.

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 long but every sentence earns its place, and it is well-structured: purpose first, then usage, then severity semantics, then edge cases. The severity block and placeholder convention explanation are dense but 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?

Given no output schema or annotations, the description covers purpose, usage, validation behavior, severity semantics, placeholder conventions, and step handling. The main gap is the unexplained `live` parameter, and the return value shape is only implied via `publishable` and severities.

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 explain all parameters. It richly explains `step` (inferred from filename, override for unusual names) but says nothing about `path` or, more importantly, `live`, whose boolean semantics and default true are not inferable from the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Check one drafted nanopub against its template and the real world.' The singular 'one drafted nanopub' and the focus on template/real-world validation distinguish it from siblings like validate_drafts and validate_chain_draft without needing to open schemas.

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?

Explicitly instructs 'Run this on every draft before publishing' and positions it as the pre-flight checklist, which is strong when-to-use guidance. It does not name alternative tools or state when not to use them, so it stops short of full exclusionary guidance.

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

validate_draftsA

Check every draft in a nanopubs/drafts/ directory at once.

The whole-chain pre-flight: run it before starting Phase 5b, and again before announcing. Returns per-draft results plus totals, with publishable true only when no draft has an error.

Note what it cannot see: values a draft puts in prose or a markdown table rather than behind a <!-- field: … --> marker are reported as coverage warnings, not as missing. The CiTO step's citation list is the known case.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
directoryYes

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. It discloses output semantics ('publishable true only when no draft has an error') and a notable limitation about prose/markdown values being reported as coverage warnings rather than missing. This is substantive behavioral context.

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 compact and front-loaded. The first sentence states the core function, the second adds timing and result semantics, and the third adds an important caveat. Every sentence earns its place.

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 description covers usage timing, output summary, and a known limitation, which is helpful. However, there is no output schema, no annotations, and the 'live' parameter is left undefined, so an agent still has a meaningful gap in understanding the full contract.

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 indirectly explains that directory points to a drafts directory, but it never explains the 'live' parameter, leaving one of only two parameters semantically unexplained.

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

Purpose5/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: 'Check every draft in a nanopubs/drafts/ directory at once.' This clearly identifies a batch validation operation and distinguishes it from the singular sibling validate_draft.

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?

The description gives explicit timing guidance: run before Phase 5b and again before announcing. It does not explicitly discuss when to prefer validate_draft or verify_chain, but the intended context is clear.

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

verify_chainA

Verify a published FORRT chain. Run this before announcing it anywhere.

Point it at a nanopubs/PUBLISHED.md ledger (or the directory holding one). Read-only: it never edits, retracts or supersedes — a failing row is for a human to act on. green is true only when nothing failed.

What it checks:

  • every required step (01-06) has a URI in the ledger;

  • every URI is really published — present in the constellation, or, for the upstream anchors the walk does not reach, served as RDF by the w3id.org/np/ resolver;

  • the Outcome's repository resolves (a Zenodo version DOI is the expected value — it pins the archived state, where a GitHub URL would be a moving target);

  • every DOI the chain cites resolves;

  • the CiTO relation agrees with the Outcome's verdict — Validated implies confirms, PartiallySupported implies qualifies, Contradicted implies disputes. A mismatch means the Outcome and the Citation disagree about what the replication found, which is the failure most worth catching before anyone reads the chain.

A step reported as "not enumerated by the walk but its TriG resolves" is fine, not a warning: the constellation legitimately stops short of Quote, AIDA and Claim.

modeauto (default), replication, reproduction or new_research. It changes only what is REQUIRED. Research that starts from scratch has no existing work to cite, so no CiTO step and no cited DOI are expected, and auto infers that from the absence of a published step 06. Everything else is checked identically in all three. Reproduction and replication verify the same way; pass one explicitly only to make the wording match your study.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoauto
repo_urlNo
published_pathYes

TDQS

A4.6/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 burden and delivers: 'Read-only: it never edits, retracts or supersedes — a failing row is for a human to act on.' It also explains the green flag, the CiTO agreement check, and which 'not enumerated' results are warnings vs fine, going well beyond minimal.

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?

Every sentence earns its place, from the front-loaded purpose to the mode caveat at the end. The bulleted check list and bolded key terms make the long content scannable without wasting words.

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?

For a high-complexity tool with no annotations and no output schema, the description is nearly complete: it covers what is checked, what counts as a failure, and mode semantics. It falls just short by not describing the report/return format beyond the green flag and not addressing repo_url.

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 coverage is 0%, so the description must compensate. It richly explains published_path (ledger vs directory) and mode (all values, defaults, and effect on required checks), but never mentions the repo_url parameter at all — leaving one of three parameters undocumented.

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

Purpose5/5

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

Opens with 'Verify a published FORRT chain. Run this before announcing it anywhere,' a specific verb and resource that also separates it from draft-oriented siblings like validate_chain_draft. The detailed checks further nail down exactly what 'verify' means in this context.

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 clear when-to-use: before announcing a chain, pointing at PUBLISHED.md. It explains mode behavior but never explicitly says when not to use it (e.g., drafts should go to validate_chain_draft), so it stops at clear context without exclusions.

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

verify_quoteA

Prove that a candidate quotation is really in a source PDF, before it is published as verbatim.

Call this on EVERY quotation destined for a Quote-with-comment nanopub. You choose which sentence carries the paper's claim — that is judgement. This decides whether the sentence is admissible, and that is not: it is a string search, and anyone can re-run it and get the same answer.

Returns a graded verdict with the page, character offsets and the file's SHA-256 as evidence:

exact byte-identical to the extracted page text normalized matched after whitespace / ligature / typographic punctuation / line-break-hyphen repair extraction_tolerant additionally ignored hyphens and punctuation spacing not_found NOT in this PDF — do not publish it as a quotation

A tier below exact is normal and not a warning about your quotation: PDF extraction inserts line breaks and drops hyphens (a real published FORRT quotation matches only at extraction_tolerant, because pypdf reads "35-year" as "35year"). Every tier canonicalises formatting only — never words, digits or order — so an altered number still fails at every tier. Read matched_text before publishing.

On not_found, closest.text_in_pdf shows what the paper says where it nearly matched. A one-digit change scores ~0.91 similarity and is still not_found: high similarity is not a pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
pdf_pathYes
quotationYes

TDQS

A4.6/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 it delivers: it details the graded verdict tiers, the canonicalisation limits (never words, digits, or order), the not_found behavior with closest.text_in_pdf, and the evidence returned (page, character offsets, SHA-256). It even explains why extraction_tolerant matches are normal rather than warnings.

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 front-loaded with the core purpose, then organized into readable tiers and warnings. It is long but appropriately so for a tool with nuanced verdict semantics; each sentence adds decision-relevant information rather than padding.

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?

Given no output schema, the description fully explains the return values: verdict tiers, page, offsets, SHA-256, matched_text, and closest.text_in_pdf. It also covers failure interpretation and the risk of publishing a not_found quotation, making the tool safe to invoke without additional context.

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% and there are only two parameters, so the description must compensate. It does implicitly define pdf_path as the source PDF and quotation as the candidate text to search for, and it elaborates on how the quotation is matched. It doesn't spell out path formats or exact input constraints, but the semantic mapping is clear enough.

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: prove that a candidate quotation is really in a source PDF before it is published as verbatim. It is clear about what the tool does and its output, but it never explicitly distinguishes itself from siblings such as verify_chain or validate_draft, so it misses the full sibling-differentiation bar.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: 'Call this on EVERY quotation destined for a Quote-with-comment nanopub.' It also clarifies what the tool is not for by separating the human judgement of choosing the claim from the tool's string-search verdict, and it warns against treating high similarity as a pass. This is strong, actionable usage guidance.

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

vocabularyA

The allowed values of a FORRT controlled vocabulary, from its template.

Use it whenever a draft needs a claim type, a study type, a validation status, a confidence level, or a CiTO relation. Every term comes from the real restricted-choice field on the real template (or the value-list nanopub it points at), so a value returned here is one the form will actually accept — and nothing else is.

Names: claim_type, study_type, validation_status, confidence_level, cito_relation, pico_question_type.

Three worth reading before you draft:

  • study_type carries the Reproduction vs Replication distinction (same data + same methods, vs different data and/or methods, or both).

  • validation_status is the Outcome verdict. Pick it from the evidence, not from what would be a nicer result; a contradicted replication is publishable and an overclaimed one is not.

  • pico_question_type is PICO-only, deliberately. Step 01 has three alternative anchors and they are not variants of one form: a PCC question has NO type field, and a Quote-with-comment has neither a type nor a label. Call template_fields on the anchor you are actually using (01_quote, 01_pico or 01_pcc) rather than assuming they match.

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNo
nameYes

TDQS

A4.6/5.0
Behavior4/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 discloses provenance (template or value-list nanopub), guarantees that returned values are exactly what the form will accept and nothing else, and explains semantic traps like validation_status being an evidence-based verdict and study_type's Reproduction vs Replication distinction. It does not explicitly state side-effect-free behavior or error handling, but the read-only lookup nature is strongly implied by 'allowed values.'

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 front-loaded with the core purpose, followed by a clear usage line, a compact names list, and three bulleted caveats. Every sentence adds decision-relevant information, and the length is justified by the semantic pitfalls an agent must know to avoid invalid drafts. No filler or repetition.

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?

For a tool with no output schema and no annotations, the description is nearly complete: it states what is returned, which names are valid, when to use it, and which sibling to call instead in ambiguous cases. The main omissions are the `live` parameter's meaning and any explicit description of the response shape, which would make it fully self-contained.

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. It does so for the required `name` parameter by enumerating all six valid names and explaining the semantics of three of the trickiest ones. However, the `live` parameter is never mentioned, so one of the two parameters remains undocumented outside the bare schema. This is a real but minor gap.

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

Purpose5/5

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

The description opens by identifying the exact resource: the allowed values of a FORRT controlled vocabulary from its template. It then names the six concrete vocabularies it serves (claim_type, study_type, validation_status, confidence_level, cito_relation, pico_question_type), so an agent can distinguish this from sibling tools like template_fields or validate_draft. This is a specific verb-plus-resource statement, not a tautology.

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

Usage Guidelines5/5

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

It explicitly says 'Use it whenever a draft needs...' and then gives strong when-not-to-use guidance: pico_question_type is PICO-only, PCC questions have no type field, and Quote-with-comment has neither type nor label. It also directs the agent to call template_fields on the actual anchor (01_quote, 01_pico, 01_pcc) rather than assuming all anchors match. This is exemplary routing between related tools.

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

wikidata_lookupA

Find real Wikidata items for a term, and type-check them.

Call it for every Wikidata topic or keyword destined for a nanopub field. It returns candidates with their descriptions and real P31/P279 types; it deliberately does NOT choose one, because picking the right sense of an ambiguous label is a judgement. What it guarantees is that the QID you publish exists and is what you say it is.

Pass expected_type as a QID (e.g. Q16521 taxon, Q11862829 academic discipline) and each candidate is marked typeMatches from its actual statements. Candidates are annotated, never filtered — a near miss is often the informative result. Searching "Bombus" with Q16521, for instance, returns the insect genus as a match and the album of the same name as not.

A zero-candidate result means leave the field empty or try another label. Never fall back to a QID from memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
expected_typeNo

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden. It transparently discloses that the tool returns candidates with descriptions and P31/P279 types, marks typeMatches, annotates rather than filters, and deliberately does not choose a single result. This gives the agent a clear mental model of the tool's behavior.

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 organized into three tight paragraphs, each earning its place: purpose, expected_type behavior with an example, and zero-candidate handling. No filler or redundant phrases; it is informative without being bloated.

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 no output schema and no annotations, the description covers return values, type-checking behavior, and failure handling well. The only notable omission is `limit`, but the tool's core contract is clear enough for an agent to use it correctly.

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. It explains `query` indirectly as 'a term' and `expected_type` well with concrete QID examples and its effect on candidate matching. However, `limit` is never mentioned, leaving one of three parameters semantically undocumented.

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

Purpose5/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: 'Find real Wikidata items for a term, and type-check them.' It clearly distinguishes the tool's role from siblings by scoping it to 'every Wikidata topic or keyword destined for a nanopub field' and by explicitly noting it does not choose among ambiguous candidates.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance ('Call it for every Wikidata topic or keyword destined for a nanopub field') and when-not behavior ('A zero-candidate result means leave the field empty or try another label'). It also warns against a common misuse: 'Never fall back to a QID from memory.'

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. 13 tool updatesv0.1.2
    • First observedconstellation
    • First observedconstellation_raw
    • First observedlist_schemas
    • First observedprior_work
    • First observedresolve_doi
    • First observedtemplate_fields
    • First observedvalidate_chain_draft
    • First observedvalidate_draft
    • First observedvalidate_drafts
    • First observedverify_chain
    • First observedverify_quote
    • First observedvocabulary
    • First observedwikidata_lookup

TDQS

A4.3/5.0

Scored across 13 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: validation (validate_draft, validate_drafts, validate_chain_draft, verify_chain, verify_quote), lookup (wikidata_lookup, template_fields, vocabulary, resolve_doi, list_schemas), and chain exploration (constellation, constellation_raw, prior_work). The validation tools are distinguished by their target (individual draft vs directory vs chain-draft vs published chain vs quotation), and the lookup tools are distinguished by what they return. Even the two constellation tools are clearly separated by raw vs projected output.

Naming Consistency4/5

Tool names follow a consistent pattern: verb_noun (validate_draft, validate_drafts, validate_chain_draft, verify_chain, verify_quote, resolve_doi, list_schemas, template_fields, wikidata_lookup) or noun-only (constellation, constellation_raw, prior_work, vocabulary). The noun-only names are understandable but break the verb_noun pattern, and 'constellation_raw' uses an adjective suffix. Overall consistent and readable.

Tool Count5/5

13 tools is well within the ideal range (3-15) and each tool serves a distinct, necessary function for the FORRT nanopub workflow: validation (5 tools), lookup (5 tools), and chain exploration (3 tools). The count matches the server's purpose of supporting drafting, validating, and publishing nanopub chains.

Completeness4/5

The tool surface covers the full workflow: template lookup, vocabulary lookup, Wikidata lookup, DOI resolution, draft validation (individual and batch), chain-draft validation, published chain verification, quotation verification, and chain exploration. Minor gaps exist: there is no tool for creating or publishing a nanopub (the server is validation/lookup only), and no tool for exploring a single step's details beyond template_fields. However, for the server's stated purpose (research assistance, not publishing), the coverage is strong.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers