vaglio-mcp
Vaglio is an academic research governance server that helps you find, read, appraise, and archive scholarly works with built-in rate-limit protection across a fleet of agents.
Search (
vaglio_search): Find works across Crossref, OpenAlex, PubMed, and OpenAIRE with automatic failover — rate‑limited sources are skipped, and refusals are reported.Read (
vaglio_read): Retrieve and store full text from arXiv, Europe PMC, or Unpaywall; read depth is derived from actual stored files, not just declarations.Status (
vaglio_status): Monitor shared request budgets fleet‑wide, showing which hosts are in cooldown.Catalogue (
vaglio_sources): List available sources, their roles (FIND/OPEN/READ), and full‑text capabilities.Appraise (
vaglio_appraise): Assign an evidence tier (A–D) to a claim — Tier A requires at least an abstract, Tier D requires a recorded refusal reason.Archive (
vaglio_inscribe): Save a research run as a versioned, schema‑valid record in~/ricerche, including full‑text copies and index regeneration; refuses to recordfalsifiedclaims as durable verdicts.
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., "@vaglio-mcp search for papers on CRISPR gene editing"
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.
Vaglio
MCP server per la ricerca accademica governata. Vagliare: separare il grano dalla pula. Trova, apre, legge — e non mente mai su quale delle tre è successa.
Nasce da un incidente misurato il 2026-07-28: nove agent di ricerca in parallelo
hanno fatto scattare il rate-limit di OpenAlex per 18 ore (Retry-After: 64902) a metà di un workflow. Ogni agent si comportava bene da solo; insieme
erano un attacco. Il backoff per-chiamata non protegge da questo, perché il
budget appartiene alla flotta, non al chiamante.
Ricerca completa: ~/ricerche/topics/metodo-ricerca-accademica/pipeline-fonti-open-access/.
Cosa fa che gli altri non fanno
Il prior art esiste ed è buono — openags/paper-search-mcp
(MIT, 20 fonti, backoff, catena OA-first) copre la meccanica delle fonti. Vaglio
non la riscrive: aggiunge i tre organi che mancano.
Organo | Cosa fa |
Governance | token bucket condiviso fra processi ( |
Evidenza |
|
Inscrizione | il run diventa un record versionato in |
Related MCP server: wikipedia-recent-changes-mcp
Il tier non si dichiara: si deriva
Europe PMC e PubMed pubblicano il tipo MeSH di ogni lavoro, e Crossref marca
i preprint come posted-content. Sono dati della fonte, non giudizi — quindi il
tetto di forza di un claim si legge, non si opina:
Il record dice | Classe | Tier massimo |
| primary-trial | A |
| synthesis | A |
| secondary | B |
| preprint (non peer-reviewed) | B |
| primary-study | nessun tetto |
niente | unknown | nessun tetto |
Su una ricerca reale (binaural beats anxiety, Europe PMC) la separazione è
netta al primo colpo: un solo RCT ammette tier A, mentre una Letter, una Review
e un Case Report si fermano a B. Chi volesse scrivere "tier A: i binaural beats
riducono l'ansia" citando la review viene fermato dal costruttore, non da un
revisore a valle.
Due precisazioni, perché il meccanismo sia onesto: il tetto non promuove mai nulla — un claim debole su un RCT resta debole; e quando la fonte non dichiara il tipo, non c'è tetto e il giudizio dell'agent vale come prima.
Le fonti, e il loro ruolo
I ruoli non sono intercambiabili — è questo che fa funzionare il failover.
Ruolo | Fonti | Nota |
FIND | Crossref → OpenAlex → PubMed → OpenAIRE | Crossref è la spina dorsale: 3 req/s, |
OPEN | Unpaywall | dal DOI alla copia open access legale |
READ | arXiv, Europe PMC, CORE | arXiv per fisica/matematica/DSP; Europe PMC dà il full text XML senza chiave, ed è dove si leggono i metodi |
Su 429 non si ritenta la stessa fonte: si cambia fonte per lo stesso scopo.
Ritentare un host che ha risposto con 18 ore di Retry-After è tempo buttato.
Fuori per scelta: Sci-Hub (esposizione legale che un portfolio commerciale non può portare) e i riassuntori mediati da LLM (Elicit, Consensus, SciSpace: mettono un secondo grado di separazione fra claim e fonte primaria).
Tool
Tool | Cosa fa |
| cerca con failover per ruolo; riporta quali fonti hanno rifiutato e perché |
| scarica e archivia il corpo, rendendo verificabile la profondità |
| vista di flotta: chi è utilizzabile, chi è in cooldown e per quante ore |
| catalogo fonti, ruoli, capacità di full text |
| assegna un tier a un claim, sotto la disciplina che lo guarda |
| scrive il record in |
Installazione
cd ~/mcp/vaglio-mcp
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest # i falsificatoriRegistrazione come server MCP:
claude mcp add vaglio -- ~/mcp/vaglio-mcp/.venv/bin/vaglio-mcpNessuna chiave, nessun account, nessuna dipendenza HTTP di terze parti: il
trasporto è urllib di stdlib, di proposito — questo strato non può avere una
dipendenza che decida di fare una richiesta scavalcando il throttle.
Falsificatori
I test sono i falsificatori pre-registrati nel record di ricerca, non un contorno:
F1 — il budget è condiviso: due istanze indipendenti (due processi) non ottengono
ratetoken a testa; un 429 su una è visibile all'altra senza che abbia mai chiamato; un 429 senzaRetry-Afternon vale mai zero.F2 — la profondità non mente: file vuoto ≠ full-text; tier A su soli metadata è rifiutato; tier D senza motivazione è rifiutato; un run letto perlopiù ad abstract lo dichiara.
F3 — il failover cambia fonte: l'host bloccato è provato una volta sola, mai ritentato; se cadono tutte, il risultato vuoto si spiega invece di sembrare "nessun risultato".
F4 — l'inscrizione è valida: frontmatter conforme allo schema dell'archivio, slug in kebab-case, full text copiato in
sources/.F5 — il tetto derivato regge: le etichette reali delle API mappano alla classe giusta; una review rifiuta il tier A e accetta il B; un RCT ammette A; un preprint è segnalato come non peer-reviewed e limitato; il silenzio della fonte non declassa nulla; il tetto non promuove mai un claim debole.
Con una regola in più, di governo e non di codice: vaglio_inscribe rifiuta
status: falsified. Dire in conversazione che qualcosa non regge è dovuto;
inscriverlo nel record come verdetto chiuso è una decisione di chi possiede la
ricerca, non dello strumento.
Usare i primitivi da soli
I due organi centrali sono agnostici rispetto alla ricerca accademica e si usano senza toccare l'MCP: servono a qualunque flotta di agent.
pip install "vaglio-mcp @ git+https://github.com/Alemusica/vaglio-mcp"Governance — qualunque API con rate limit, condivisa fra processi:
from vaglio_mcp.core.throttle import Throttle, HostBlocked
t = Throttle() # stato condiviso in ~/.vaglio/throttle
try:
t.acquire("api.example.com") # attende il turno, nel budget della flotta
except HostBlocked as e:
... # l'host e fuori per e.seconds_left: cambia strada
t.report_rate_limited("api.example.com", retry_after=3600) # lo dice a tuttiEvidenza — tier e profondita di lettura, per ricerca ma anche per due diligence, FTO, audit normativo:
from vaglio_mcp.core.evidence import Finding, Paper, Tier
Finding(claim="...", tier=Tier.A, paper=Paper(title="...", source="..."))
# TierDiscipline: tier A dichiarato su soli metadata viene rifiutato qui,
# non scoperto a valle.Nessuno dei due importa l'altro, e nessuno dei due sa cosa sia un paper: il throttle conosce host e secondi, l'evidenza conosce claim e artefatti.
Stato
Versione 0.2.0.
Candidati all'estrazione verso magazzino (dichiarati, non ancora promossi —
regola dei 3 consumatori): core/throttle.py come primitivo di governance
riusabile da qualunque flotta di agent, e core/evidence.py come disciplina
tier/profondità agnostica rispetto al dominio.
Available Tools
6 toolsvaglio_appraiseB
Attach an evidence tier to a claim, under the discipline that guards it.
Tier A requires at least the abstract to have been retrieved — asserting
RCT-strength from a title alone is rejected here rather than caught later.
Tier D is a RECORDED refusal: it demands refused_reason, so a rejected
idea leaves a trace instead of vanishing.
Inputs: tier (required), claim (required), paper_title (required), doi, +5 more.
vaglio_inscribeA
Write the run into the ~/ricerche archive as a versioned, schema-valid record.
Closes the loop the archive exists for: research that stays in a transcript
gets lost. Copies any stored full text into the record's sources/ and
regenerates the index.
Will REFUSE status: falsified — declaring something dead in a durable
artifact is the research owner's decision, not the tool's.
Inputs: body (required), title (required), topic (required), record_id (required), +7 more.
vaglio_readA
Retrieve and STORE the body of a work, so its depth becomes verifiable.
Tries the native readers first (arXiv PDF, Europe PMC full-text XML), then
resolves the DOI through Unpaywall to a legal open-access copy. The stored
file is the proof: read_depth reports full-text only when bytes exist on
disk. Returns metadata-only depth without complaint when no OA copy exists —
that is an honest outcome, not a failure.
Inputs: title (required), doi, pmcid, oa_url, +2 more.
vaglio_searchA
Find works across the open bibliographic sources, with failover by role.
Walks Crossref -> OpenAlex -> PubMed -> OpenAIRE until one answers. A source that is rate limited is skipped, not retried: the response reports which sources refused and why, so a thin result is visibly thin.
Args: query: search terms. limit: max results (keep modest; the budget is shared across agents). prefer: force a source to the front, e.g. "pubmed" for biomedical work.
Inputs: query (required), limit, prefer.
vaglio_sourcesA
Catalogue of sources and what each one is actually good for.
Roles are not interchangeable: finders locate a DOI, the opener resolves it to a legal copy, readers give you the body. Picking by role is what makes failover work.
Inputs: no named parameters.
vaglio_statusA
Show the shared request budget: which hosts are usable, which are cooling down.
This is the fleet view. When a source shows blocked_hours, every agent in
every process is blocked on it — switch source instead of waiting.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: vaglio_search finds works, vaglio_read retrieves full text, vaglio_status shows budget/blocked hosts, vaglio_sources catalogues sources, vaglio_appraise attaches evidence tiers, vaglio_inscribe archives runs. No ambiguity.
All tool names follow a consistent 'vaglio_<verb>' pattern with lowercase and underscores. Verbs are descriptive and match the action (search, read, status, sources, appraise, inscribe).
Six tools is well-scoped for the server's purpose of searching, reading, appraising, and archiving bibliographic works. Each tool earns its place without unnecessary overlap.
The tool set covers the full logical workflow: search, retrieve full text, check system status, list sources, appraise evidence, and archive results. No obvious gaps for the intended domain.
Related MCP Connectors
An MCP server for deep research or task groups
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Independent trust scores, tool surfaces and change history for MCP servers.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA MCP server for academic literature retrieval, aggregating multiple data sources like arXiv, Crossref, OpenAlex, PubMed, and Semantic Scholar to provide search, details, citations, trends, and recommendations.4MIT
- AlicenseNot gradedqualityDmaintenanceMCP server providing live Wikipedia recent changes feed, page summaries, trending pages, and Wikidata entity lookup.MIT
- FlicenseNot gradedqualityDmaintenanceThis MCP server provides LLMs with a live, curated knowledge base of AI agent research, world models, and source-code reviews, enabling personalized and context-aware responses. Users can either connect to the hosted knowledge or build and host their own vault.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server for academic research combining local document search with Semantic Scholar API integration.MIT