forrt-research-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@forrt-research-mcpVerify the anchor quote and build the FORRT nanopublication chain."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
forrt-research-mcp
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 |
What is in the literature? | |
What is worth replicating, and has it been done? | |
| 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 → CiTOStep 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 |
|
| no type, no label. |
|
| the only anchor with a question-type vocabulary (5 terms) |
|
| no |
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 andverified_claimswill 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-mcpUser-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 readThe 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 |
| byte-identical to the extracted page text |
| matched after whitespace / ligature / typographic punctuation / line-break-hyphen repair |
| additionally ignored hyphens and punctuation spacing |
| additionally deleted every space — for text layers that break words apart |
| 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, becausepypdfreads the paper's35-yearas35yearand(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 needswhitespace_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 |
|
| 7 |
|
| 3 — the Reproduction vs Replication distinction |
|
| 5 |
|
| 5 |
|
| 43, via a separate value-list nanopub |
|
| 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.json — the 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
prefillkey 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.st02must be[{cites, cited}]with at least one entry, and04_study.disciplineSelectionis 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_forwardedge 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 |
| back-reference; the chain wizard fills it from the published step | info |
| 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):
Cloudflare rejects urllib's default User-Agent. The API runs on Cloudflare Workers, whose bot protection answers
Python-urllib/3.xwith HTTP 403 — same URI, same key, 200 under any normal agent. Every request this client makes sets an explicitUser-Agent. Do the same in your own client; no hermetic test can catch it.paperDoican 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.citedPaperderives the paper from the CiTO and setsdisagreesWithReportedwhen the two differ.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.mdwere published and merely unreachable.stepsNotEnumeratedreports the gap. A constellation alone cannot verify a complete chain — fetch those URIs' TriG directly.quote.quotedTextcomes back empty on nanopubs using the current quote template. The text survives inlabeland 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 intext_source.The apex CiTO is hoisted out of
chains[].steps[]to top level.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 barew3id.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/reposIt 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]'
pytestAll 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 toolsconstellationA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | ||
| depth | No | ||
| max_nodes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | ||
| depth | No | ||
| max_nodes | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| doi | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and 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.
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.
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.
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.
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.
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
prefillkey 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.st02must be[{cites, cited}]with at least one entry, and04_study.disciplineSelectionis 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_forwardedge 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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| path | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| path | Yes | ||
| step | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| directory | Yes |
TDQS
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.
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.
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.
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.
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.
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.
mode — auto (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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto | |
| repo_url | No | ||
| published_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pdf_path | Yes | ||
| quotation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, 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.
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.
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.
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.
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.
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_typecarries the Reproduction vs Replication distinction (same data + same methods, vs different data and/or methods, or both).validation_statusis 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_typeis 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. Calltemplate_fieldson the anchor you are actually using (01_quote, 01_pico or 01_pcc) rather than assuming they match.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| expected_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. 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.
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.
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.
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.
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.
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.
13 tool updates
v0.1.2- First observed
constellation - First observed
constellation_raw - First observed
list_schemas - First observed
prior_work - First observed
resolve_doi - First observed
template_fields - First observed
validate_chain_draft - First observed
validate_draft - First observed
validate_drafts - First observed
verify_chain - First observed
verify_quote - First observed
vocabulary - First observed
wikidata_lookup
TDQS
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Deterministic research automation with live OpenAlex search and reusable workflow programs.
Cite the claim, not the paper: 5,033 assertions, each hash-verifiable against its source PDF
Machine-readable entity discovery with provenance, trust and verified source evidence.
Signed Buildability Oracle for AI-for-science papers. ed25519 receipts, Wave proofs, divergence.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables revision-bound source audits with exact article fingerprinting, claim-to-source mapping, quotation verification, and immutable JSON evidence reports for prepublication review.9MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to create verifiable, replayable citations, search private knowledge bases, and publish Markdown with verified citation markers.MIT
- FlicenseNot gradedqualityBmaintenanceEnables deep research evidence synthesis and citation verification by generating structured research graphs through the Model Context Protocol.8-

genpark-smart-citationofficial
FlicenseNot gradedqualityBmaintenanceEnables users to audit academic citation contexts, calculate scientific consensus ratios, and generate credibility badge indexes for verified citations through MCP-compliant tools.8-