Replication Radar
# Replication Radar
<!-- mcp-name: org.sciencelive4all/replication-radar -->
[](https://doi.org/10.5281/zenodo.21850976) [](https://pypi.org/project/replication-radar/)
### π Live demo β **https://openaire-hackathon.netlify.app**
### βΆ Watch the 3-min demo β **https://youtu.be/hVyLafY3Y3E** Β· reproduce it step by step β **https://openaire-hackathon.netlify.app/demo.html**
A tool that **makes the OpenAIRE Graph more useful for replication.** Search a research
field and it answers the question the Graph structurally cannot: *what high-impact work
is worth replicating, has it already been independently checked β with what verdict β and
is the software reusable?*
Ships as a **live web app** (the link above β pure static, queries OpenAIRE + the nanopub
network + GitHub/Software Heritage from the browser) **and** an **MCP server** (this package)
that exposes the same engine to any agent. Built for the OpenAIRE AI Hackathon (Theme B), CC-BY.
OpenAIRE's only value signal is citation-popularity (BIP! influence / popularity /
impulse, classes C1βC5) β paper-bound, and orthogonal to whether a claim is *true*.
The Radar joins three sources to add a **replication layer** on top:
- **OpenAIRE Graph** β impact-ranks candidate papers (`api.openaire.eu/graph/v1`).
- **Software Heritage + repo signals** β surfaces *reusable* method software.
- **Science Live nanopub verdicts** β the "already checked β did it hold" overlay.
> OpenAIRE AI Hackathon Β· Theme B (Build) Β· CC-BY. Built to be reused through the
> [forrt-replication-template](https://github.com/ScienceLiveHub/forrt-replication-template):
> discovery at the *start* of a replication, where the template's existing skills
> handle the nanopub chain at the *end*.
## Tools
| Tool | What it answers |
|---|---|
| `radar(topic)` | Impact-ranked replication targets in a field β each **OPEN** (opportunity) or **VERIFIED** (done, with verdict) + independent tooling + funder context |
| `find_independent_software(doi, topic)` | Reusable engines **not authored by the original team** (author-disjoint = *replication*, not *reproduction*), ranked by reuse signal β repo Β· Software Heritage Β· downloads Β· **GitHub stars** β not citations (returns `stars` + `rank_score`) |
| `replication_status(doi)` | Has this DOI been replicated, did it hold? Verdict(s) β **live from the nanopub network, any signer** β with status, CiTO relation, repo, and signed Outcome/CiTO nanopub links; `open` if not |
| `verified_claims()` | The whole **verified-knowledge corpus** β every claim the network holds a verdict for (author-agnostic) |
| `replication_template(doi, topic, owner)` | The **FORRT replication template** (the *produce* half) β the [scaffold repo](https://github.com/ScienceLiveHub/forrt-replication-template), the workflow, and a suggested `<topic>-replication` repo name (checks availability under `owner`) |
| `find_dataset(topic)` | **Hand-off to the OpenAIRE MCP** for datasets β replication-radar doesn't search datasets; this says how to find a citable dataset DOI there |
The verdict tools pull **live** from the nanopub network (the FORRT Outcome/CiTO templates on
`query.knowledgepixels.com`); the bundled `verdicts.json` is an offline fallback. So the MCP is the
**verified-knowledge layer** β pair it with the OpenAIRE MCP and an agent has both the structural
Graph *and* "has this been checked, and did it hold".
### The reproduction-vs-replication distinction, made computable
A *reproduction* re-runs the original code; a *replication* tests the same claim by a
**different** route. So the Radar filters tooling by **author-disjointness** from the
original paper β e.g. for Phillips et al. 2009, the `dismo` package (co-authored by
Phillips & Elith) is flagged *rooted* / non-independent, while `biomod2` and `jSDM`
are *independent*. That filter is the difference between the two, and it's the thing
that makes this replication-aware rather than just "find the code".
## Run
```bash
pip install -e . # installs the `mcp` runtime
python -m replication_radar.server # stdio MCP server
```
Add to an MCP client (`.mcp.json`):
```json
{ "mcpServers": {
"replication-radar": { "command": "python", "args": ["-m", "replication_radar.server"] }
} }
```
The **core** (OpenAIRE client + radar logic) is stdlib-only β try it without the MCP
runtime:
```bash
PYTHONPATH=src python3 demo_sdm.py # live vertical-slice demo on SDM
```
## Configuration
| Env var | Default | Purpose |
|---|---|---|
| `RADAR_OPENAIRE_BASE` | `https://api.openaire.eu/graph/v1` | Swap to the Alien AI-Gateway or a mirror β the Radar is endpoint-agnostic |
| `RADAR_HTTP_TIMEOUT` | `30` | Per-request timeout (s) |
## Known limits (v1, honest)
- **Keyword-bound discovery.** OpenAIRE free-text terms are AND-ed; long queries
return nothing. Use short topics. The VERIFIED overlay is *guaranteed* (resolved
from the verdict index directly), but OPEN-target recall depends on the query.
- **No graph-relation traversal** on the public API (paperβits software/data/grant
edges aren't exposed): tooling/data are matched heuristically by topic + author
independence, not by a hard relation. Upgrades cleanly if a gateway exposes relations.
- **Funder context is field-level, not per-paper** (per-paper funder attribution is
not reachable); budgets are frequently reported as 0 in records.
- The verdict index ships 6 source works / 12 chains (Science Live). Extend
`data/verdicts.json` to grow coverage.
```
TDQS
Scored across 6 tools
The six tools split cleanly along a discover/verify/produce axis: radar and find_independent_software are discovery, replication_status and verified_claims are verdict lookups, and replication_template is scaffolding. The two lookalikes are separated correctly by granularity (per-DOI vs network-wide) and by resource (papers vs software only). The main trap is find_dataset, whose name implies a dataset search but which actually only returns handoff instructions to another MCP, which an agent could misread as a functioning search tool.
Three tools use a verb_noun pattern (find_independent_software, find_dataset) intermixed with bare noun phrases (radar, replication_status, replication_template, verified_claims). The bare noun `radar` is especially uninformative next to the rest. Readable overall, but the convention is clearly mixed rather than predictable.
Six tools is a sensible, tight surface for a discover/verify/scaffold workflow. However, find_dataset does not perform its own action (it delegates to another MCP), so one of the six is arguably a stub rather than an earning tool, and much of the descriptive weight is carried by long prompts instead of tool surface.
Discovery, verdict lookup (single and network-wide), and scaffolding are all covered, but the 'produce' half of the loop is entirely a handoff to an external template repo and a fresh agent session β the server itself cannot sign, publish, or submit anything. There is also no way to search or filter the verified-claims corpus (no topic or field query) and no dataset search at all, only an instruction stub.