# FORRT Research (pypi · forrt-research-mcp)

Produce verifiable FORRT nanopublication chains: grounded quote checks and Science Live projections.

- Trust score: 66/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- pypi · `forrt-research-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp.md), [page](https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp)

## Channel facts

- Registry: `pypi`
- Package: `forrt-research-mcp`
- Version: `0.1.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Supply Chain Security**: 99/100
  - No malware found by supply-chain analysis.
  - Known CVEs were checked across the 33 of 34 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - Dependency health was assessed across the 33 of 34 dependencies we could resolve, so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3252 tokens (~250/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the FORRT Research MCP server?

FORRT Research runs locally as a PyPI package, launched with uvx forrt-research-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add org-sciencelive4all-forrt-research-mcp -- uvx forrt-research-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "org-sciencelive4all-forrt-research-mcp": {
      "command": "uvx",
      "args": [
        "forrt-research-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "org-sciencelive4all-forrt-research-mcp": {
      "command": "uvx",
      "args": [
        "forrt-research-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add org-sciencelive4all-forrt-research-mcp -- uvx forrt-research-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "org-sciencelive4all-forrt-research-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "forrt-research-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add org-sciencelive4all-forrt-research-mcp --command uvx --arg forrt-research-mcp
```

### Hermes

```yaml
mcp_servers:
  org-sciencelive4all-forrt-research-mcp:
    command: "uvx"
    args: ["forrt-research-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "org-sciencelive4all-forrt-research-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "forrt-research-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add org-sciencelive4all-forrt-research-mcp -t stdio -c uvx -a forrt-research-mcp
```

### Other

```json
{
  "mcpServers": {
    "org-sciencelive4all-forrt-research-mcp": {
      "command": "uvx",
      "args": [
        "forrt-research-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-21 (score 66)

First indexed and scored.

## MCP tools (13)

### `constellation` (~302 tokens)

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.

Input parameters:

- `depth` (integer)
- `max_nodes` (integer)
- `uri` (string, required)

### `prior_work` (~202 tokens)

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.

Input parameters:

- `uri` (string, required)

### `verify_quote` (~339 tokens)

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.

Input parameters:

- `pdf_path` (string, required)
- `quotation` (string, required)

### `constellation_raw` (~103 tokens)

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.

Input parameters:

- `depth` (integer)
- `max_nodes` (integer)
- `uri` (string, required)

### `template_fields` (~281 tokens)

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.

Input parameters:

- `live` (boolean)
- `step` (string, required)

### `vocabulary` (~306 tokens)

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.

Input parameters:

- `live` (boolean)
- `name` (string, required)

### `list_schemas` (~51 tokens)

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`.

### `resolve_doi` (~164 tokens)

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.

Input parameters:

- `doi` (string, required)

### `wikidata_lookup` (~241 tokens)

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.

Input parameters:

- `expected_type` (string)
- `limit` (integer)
- `query` (string, required)

### `validate_draft` (~293 tokens)

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.

Input parameters:

- `live` (boolean)
- `path` (string, required)
- `step` (string)

### `validate_drafts` (~139 tokens)

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.

Input parameters:

- `directory` (string, required)
- `live` (boolean)

### `verify_chain` (~429 tokens)

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.

Input parameters:

- `mode` (string)
- `published_path` (string, required)
- `repo_url` (string)

### `validate_chain_draft` (~402 tokens)

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.

Input parameters:

- `live` (boolean)
- `path` (string, required)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp#diagnostics

## Score history

- 2026-09-21: 66

## Common questions

### What is the FORRT Research MCP server?

FORRT Research is an MCP server listed in the public MCP registry as org.sciencelive4all/forrt-research-mcp. Produce verifiable FORRT nanopublication chains: grounded quote checks and Science Live projections. This page covers its PyPI package (forrt-research-mcp).

### Is the FORRT Research MCP server safe to use?

FORRT Research scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the FORRT Research MCP server expose?

FORRT Research exposes 13 tools: constellation, prior_work, verify_quote, constellation_raw, template_fields, and 8 more. Their descriptions and schemas cost roughly 3,252 tokens of context every time the server is loaded.

### Is the FORRT Research MCP server still maintained?

FORRT Research is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the FORRT Research MCP server under?

FORRT Research declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/forrt-research-mcp/
- Socket report: https://socket.dev/pypi/package/forrt-research-mcp
- Repository: https://github.com/ScienceLiveHub/forrt-research-mcp
- Website: https://sciencelive4all.org/
- Changelog RSS feed: https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp.json
- HTML version of this page: https://verifymcp.io/servers/org-sciencelive4all-forrt-research-mcp/forrt-research-mcp
