Skip to main content
Glama

transport-lit – graue Literatur im Verkehrswesen über MCP

(Umbenannt von dot-lit am 2026-08-27; DOT_LIT_*-Umgebungsvariablen und das alte Datenverzeichnis werden weiterhin erkannt.)

transport-lit bietet einem KI-Assistenten (Claude Desktop, Claude Code, jedem MCP-Client) eine Stichwortsuche über die Verkehrsforschungsberichte, die PubMed nicht indexiert und Semantic Scholar nur schlecht abdeckt. Es begann mit ROSA-P, dem Repository der U.S. National Transportation Library (NHTSA-DOT-HS-Berichte, FHWA/FRA/FTA/FAA, UTC- und staatliche DOT-Forschung; https://rosap.ntl.bts.gov), und erntet nun sechs OAI-PMH-Quellen auf drei Kontinenten sowie alles, was Sie aus TRID exportieren:

Schlüssel

Quelle

Datensätze

Anmerkungen

dot

ROSA-P — U.S. DOT National Transportation Library

90,599

vollständiges Repository

vti

VTI — Swedish National Road and Transport Research Institute (DiVA)

11,460

Berichte, Konferenzbeiträge, Artikel; en/sv

bast

BASt — German Federal Highway Research Institute (OPUS)

2,970

1,901 mit direkten PDF-Links; de/en

wbokr

World Bank Open Knowledge Repository

976

titelgefilterte Teilmenge von 40,332; gemessene Präzision 18/20

ipea

IPEA (Brazil)

207

gefilterte Teilmenge von 14,400; pt; Präzision ~16/20

cepal

CEPAL/ECLAC (Latin America)

1,165

gefilterte Teilmenge von 52,199; es/en; Präzision ~15/20

openalex

OpenAlex — works typed report in 10 transport topics (global)

11,448

Themen: Verkehrs- und Straßensicherheit, Stadtverkehr und Barrierefreiheit, Verkehrsplanung, …

cinii

CiNii Research (Japan) — articles, theses, IRDB repository items

118,609

benötigt eine kostenlose NII-Anwendungs-ID (TRANSPORT_LIT_CINII_APPID); 20 ja/en-Abfragen, jeweils 10k Obergrenze; CJK-Abfragen verwenden Teilstring-Matching

pubmed

PubMed — transport/injury subset (MeSH strategy + 12 journals)

105,028

datumsgeschnittene E-utilities-Ernte; TRANSPORT_LIT_PUBMED_TERM überschreibt die Strategie

trid

TRID exports you import (transport-lit import)

yours

siehe unten

transport-lit sources listet sie auf; transport-lit harvest --source <key>|all erntet sie; der collection-Filter in search_reports wählt eine aus (z. B. "VTI", "BASt", "World Bank", "CEPAL", "TRID"). Das Hinzufügen eines weiteren OAI-PMH-Repositorys ist ein Eintrag in src/transport_lit/sources.py.

Ich habe dies für meinen eigenen persönlichen akademischen und Forschungsgebrauch erstellt und teile es gerne mit allen, die es nützlich finden. Ich freue mich über Feedback zu Fehlern, Integrationsbedarf, Verbesserungen und anderen Kommentaren. Ich werde diese regelmäßig prüfen und sie so weit wie möglich integrieren und das dokumentieren. Wenn Sie daran interessiert sind, dies zu unterstützen, oder andere Ideen dafür haben, bin ich offen dafür! — Alex Quistberg (Problem melden)

Es tut dies auf die einzige Weise, die für eine OAI-PMH-Quelle funktioniert: Es erntet die gesamten Metadaten des Repositorys in eine lokale SQLite-Datenbank, baut einen FTS5-Volltextindex darüber auf und bedient die Suche aus diesem Index. Nichts wird live abgefragt, außer einem optionalen PDF-Abruf für den Volltext. Wiederholte Ernten sind inkrementell (from= in der OAI-Anfrage) und kostengünstig.

Tool-Oberfläche

Tool

Was zurückgegeben wird

search_reports(query, year_min?, year_max?, collection?, doc_type?, source?, limit?, offset?)

Rangfolge-Treffer: id, Titel, Autoren, Jahr, Berichtsnummern, DOI, Landing-URL, Abstract-Auszug, match_mode. Spaltenpräfixe funktionieren (title:pedestrian, authors:lynn)

lookup(identifier)

Exakte Übereinstimmung nach DOI, PMID, Berichtsnummer („DOT HS 813 097“), ID oder Landing-URL

get_report(id)

Vollständiger Metadaten-Datensatz, einschließlich aller rohen Felder, wie geerntet

get_fulltext(id, max_chars?, offset?, refresh?)

Löst das PDF auf (ROSA-P-Landingpage, BASt/OpenAlex-Direktlinks), extrahiert und cached den Text; Seite mit offset

search_fulltext(query, limit?)

Durchsucht den gesamten bereits extrahierten PDF-Text mit Auszügen

find_similar(id, limit?)

Verwandte Datensätze über Quellen hinweg, nach Titel und Schlagwörtern

export_citations(ids, format?)

RIS (Zotero/EndNote/Mendeley) oder BibTeX für eine Liste von IDs

whats_new(days?, source?, limit?)

Datensätze, die in den letzten N Tagen in den Index aufgenommen wurden, mit Zählungen nach Quelle – das Rohmaterial für einen wöchentlichen Digest

list_collections()

Sammlungen und Dokumenttypen mit Zählungen

harvest_status()

Datensatzzählungen pro Quelle, letzter Lauf und dessen Status/Anmerkungen, Abdeckung nach Jahr

Plus ein Prompt, literature_scan(topic), der ein Modell durch einen Multi-Query-Scan mit Zitaten führt. Jedes Tool trägt MCP-Annotationen (readOnlyHint, idempotentHint; nur get_fulltext ist openWorldHint, da es ein PDF abrufen kann).

id akzeptiert dot:93144, 93144, oai:dot.stacks:dot:93144 oder die Landing-URL. Importierte Datensätze verwenden andere Präfixe (trid:813520, import:…).

Abfragesyntax: Nackte Wörter werden zuerst mit UND verknüpft; wenn weniger als limit Treffer alle Begriffe erfüllen, werden die verbleibenden Plätze mit Treffern gefüllt, die beliebige Begriffe enthalten (match_mode = all_terms / any_terms). Setzen Sie Phrasen in Anführungszeichen ("driver improvement"), verwenden Sie ein nachgestelltes * für ein Präfix. Das Ranking ist BM25, wobei Titel, Berichtsnummer und Autor stärker gewichtet werden als das Abstract.

Related MCP server: litedocs-mcp

Einrichtung

Erfordert Python 3.12+ und uv.

git clone https://github.com/aquistbe/transport-lit && cd transport-lit
uv tool install .            # installs `transport-lit` (CLI) and `transport-lit-mcp` (server) on PATH
export TRANSPORT_LIT_CONTACT=you@example.org   # identifies your harvester to ROSA-P (put it in your shell profile)
transport-lit probe                # live check: Identify / ListMetadataFormats / ListSets
transport-lit harvest              # full harvest the first time (~15 min), incremental afterwards
transport-lit status               # counts, last run, coverage by year
transport-lit search driver improvement program evaluation

Für die Entwicklung verwenden Sie uv sync und stellen Sie Befehlen uv run voran (z. B. uv run pytest).

Beliebiger MCP-Client, beliebiges Modell

Der Server spricht standardmäßig MCP über stdio (Standard) und Streamable HTTP / SSE (transport-lit-mcp --transport streamable-http --port 8765, Endpunkt /mcp). transport-lit mcp-config [client] gibt einen einfügefertigen Ausschnitt aus für: Claude Desktop, Claude Code, Cursor, VS Code (Copilot-Agentenmodus), Zed, Continue, LM Studio, Goose, Open WebUI und LibreChat (die letzten beiden über HTTP). Ein Dockerfile erstellt ein HTTP-Server-Image mit dem Index auf einem Volume.

Offene Modelle. Am 2026-08-26 Ende-zu-Ende getestet mit Ollama qwen2.5:3b (3 B Parameter) über tests/ollama_smoke.py: Bei der Eingabe „finde Berichte über Fahrerfortbildungsprogramme; liste 3 Titel mit Jahren und IDs auf“ rief das Modell einmal search_reports({"query": "driver improvement", "limit": 3}) auf und antwortete mit korrekten Titeln, Jahren, IDs und Landing-URLs aus drei Quellen. Designentscheidungen, die kleine Modelle unterstützen: zehn Tools mit einzeiligen Beschreibungen, flache JSON-Argumente mit Standardwerten, kompakte Trefferobjekte (keine rohen Metadaten in Suchergebnissen) und eine Server-instructions-Zeichenkette, die Quellen und Filter benennt. Führen Sie den Smoke-Test mit jedem toolfähigen Modell aus: OLLAMA_MODEL=llama3.1 uv run python tests/ollama_smoke.py "…".

In Claude Desktop registrieren

transport-lit install-claude-desktop          # prints the JSON to add
transport-lit install-claude-desktop --write  # merges it into claude_desktop_config.json (keeps a .bak)

Der Eintrag, den es schreibt, ist einfach:

{ "mcpServers": { "transport-lit": { "command": "/Users/you/.local/bin/transport-lit-mcp", "args": [],
                               "env": { "TRANSPORT_LIT_DATA_DIR": "/Users/you/.local/share/transport-lit",
                                        "TRANSPORT_LIT_CONTACT": "you@example.org" } } } }

Starten Sie Claude Desktop danach neu. Für Claude Code: claude mcp add transport-lit -- transport-lit-mcp.

Konfiguration (Umgebungsvariablen)

Variable

Standard

Zweck

TRANSPORT_LIT_DATA_DIR

~/.local/share/transport-lit

SQLite-DB, rohe OAI-Seiten (raw/), PDF-Cache (pdf/)

TRANSPORT_LIT_CONTACT

(nicht gesetzt)

Ihre E-Mail, im User-Agent platziert, damit das Repository Sie kontaktieren kann. Setzen Sie sie.

TRANSPORT_LIT_MIN_INTERVAL

1.0

Mindestsekunden zwischen ausgehenden Anfragen

TRANSPORT_LIT_HTTP_TIMEOUT

90

Zeitüberschreitung pro Anfrage (s)

TRANSPORT_LIT_MAX_PDF_BYTES

80 MB

Größere PDFs in get_fulltext ablehnen

TRANSPORT_LIT_MAX_PDF_PAGES

600

Extraktion nach dieser Seitenzahl stoppen

TRANSPORT_LIT_CINII_APPID

(nicht gesetzt)

NII-Anwendungs-ID; erforderlich für die Ernte von CiNii (registrieren Sie sich unter support.nii.ac.jp/en/cinii/api/developer)

NCBI_API_KEY

(nicht gesetzt)

Optional; erhöht die PubMed-E-utilities-Rate von 3 auf 10 Anfragen/s

TRANSPORT_LIT_PUBMED_TERM

eingebaute Strategie

Ersetzen Sie die PubMed-Suchstrategie

TRANSPORT_LIT_EMBED_BACKEND / TRANSPORT_LIT_EMBED_MODEL / TRANSPORT_LIT_EMBED_DIM

fastembed / MiniLM-L12 / 1024

Semantisches Such-Backend, Modell, Ollama-Trunkierung

OLLAMA_HOST

http://localhost:11434

Ollama-Endpunkt für das ollama-Backend

Es werden keine Anmeldedaten verwendet oder gespeichert; jede Anfrage geht an öffentliche Endpunkte.

Installation von PyPI (ohne Klon)

uv tool install transport-lit            # CLI + MCP server on PATH
uvx --from transport-lit transport-lit-mcp   # or run the server ad hoc
uv tool install "transport-lit[semantic]"    # with the bundled embedding backend

Veröffentlicht unter https://pypi.org/project/transport-lit/ über das vertrauenswürdige Publishing von GitHub: Jede GitHub-Release führt publish.yml aus, das auf die Genehmigung des Maintainers in der pypi-Umgebung wartet und ohne gespeichertes Token hochlädt. server.json ist das Manifest für das MCP-Registry (registry.modelcontextprotocol.io), das nach der Existenz des PyPI-Pakets eingereicht werden soll.

Festgelegte Versionen

Releases sind Git-Tags vMAJOR.MINOR.PATCH (semantische Versionierung: Patch = Fixes, Minor = neue Werkzeuge/Quellen, Major = eine bahnbrechende Änderung an der Werkzeugoberfläche oder dem Datenbankschema). Jeder Tag löst den release-Workflow aus, der die Tests ausführt, ein Wheel + sdist erstellt und sie an eine GitHub-Release anhängt. Python-Abhängigkeiten werden durch die festgeschriebene uv.lock festgelegt; CI installiert mit uv sync --frozen, sodass eine Release immer mit den exakten Versionen läuft, mit denen sie getestet wurde. Um eine bestimmte Version zu installieren:

uv tool install "transport-lit==0.3.0"                            # a pinned PyPI release
uv tool install git+https://github.com/aquistbe/transport-lit@v0.3.0  # or the matching git tag
uv tool upgrade transport-lit                                     # move to the latest release

Ernte

transport-lit harvest                     # ROSA-P; auto: incremental if a complete full harvest exists, else full
transport-lit harvest --source all        # every configured source (vti, bast, wbokr, ipea, cepal, rosap)
transport-lit harvest --mode full         # walk the whole repository again
transport-lit harvest --mode incremental  # from = start of last complete run − 1 h, until = now
transport-lit harvest --from 2026-08-01T00:00:00Z   # explicit window (full timestamp required)
transport-lit harvest --max-pages 3       # testing only; the run is recorded as failed/partial
transport-lit reindex                     # re-parse the cached raw pages (no network) after a parser change

Was der Harvester tut und warum (alles Verhalten wurde am 2026-08-26 gegen ROSA-P verifiziert):

  • ListRecords&metadataPrefix=oai_dc, 100 Datensätze pro Seite, dem resumptionToken folgend, bis eine Seite ohne eines ankommt. Nur dann wird der Lauf als complete markiert; jeder Fehler lässt ihn failed und bewegt den Zeiger „letzte Ernte“ nicht weiter, sodass harvest_status niemals behauptet, ein partieller Index sei vollständig.

  • Taktung: eine Anfrage pro TRANSPORT_LIT_MIN_INTERVAL Sekunden (Standard 1 s). Tokens laufen etwa 60 s nach Ausstellung ab, daher verwenden Wiederholungen eine kurze Backoff-Zeit (2/4/6 s).

  • badResumptionToken, Transportfehler, abgeschnittenes XML oder eine leere Hülle, während ein Token aktiv ist → die Liste wird erneut ausgegeben. ROSA-P gibt Datensätze nicht in einer stabilen Datumsreihenfolge zurück (auf jeder Seite geprüft), daher startet die Wiederherstellung die Liste von oben; Upserts machen das idempotent. Wenn die Reihenfolge monoton gewesen wäre, würde der Harvester stattdessen vom kleinsten gesehenen Datumsstempel über until= fortfahren. Bis zu 8 Wiederherstellungen pro Lauf, dann failed.

  • noRecordsMatch: ROSA-P sendet den Fehlercode nicht; eine leere selektive Ernte kommt als OAI-PMH-Hülle ohne <ListRecords>-Element zurück. Das wird nur dann als „nichts zu tun“ interpretiert, wenn kein Token im Spiel war; mitten in der Liste wird es als Abschneiden behandelt.

  • Stille Abschneideprüfungen: der cursor des Tokens wird auf jeder Seite mit der lokalen Anzahl verglichen; eine vollständige Ernte, die >5 % weniger Datensätze als die vorherige vollständige Ernte zurückgibt, wird in den Laufnotizen markiert. Beide erscheinen in harvest_status().last_harvest.notes.

  • Löschungen: das Repository meldet deletedRecord=no, daher wird lokal nie etwas entfernt; ein Datensatz, der aus ROSA-P verschwindet, bleibt im Index, bis eine vollständige Neu-Ernte in ein frisches TRANSPORT_LIT_DATA_DIR erfolgt.

  • Caching: jede OAI-Seite wird gzip-komprimiert unter raw/run<N>-p<page>.xml.gz gespeichert, sodass der Parser geändert und der Index ohne Netzwerkzugriff neu aufgebaut werden kann; PDFs und ihr extrahierter Text werden unter pdf/ und in der fulltext-Tabelle zwischengespeichert.

  • from/until werden gemäß der deklarierten granularity jedes Repositorys formatiert (aus Identify gelesen): ROSA-P, DiVA und DSpace akzeptieren vollständige YYYY-MM-DDThh:mm:ssZ-Zeitstempel, OPUS (BASt) akzeptiert nur YYYY-MM-DD und das Fenster wird auf jeder Seite um einen Tag erweitert.

  • Breite Repositorien (Weltbank, IPEA, CEPAL) werden zum Erntezeitpunkt durch ein mehrsprachiges Transportvokabular (sources.TRANSPORT_RE, en/es/pt/de/fr/sv) gefiltert: Ein Datensatz wird behalten, wenn ein Begriff im Titel erscheint, oder (IPEA, CEPAL) wenn zwei verschiedene Begriffe unter den Schlagwörtern erscheinen. Zusammenfassungen werden ignoriert – Entwicklungsliteratur erwähnt Straßen und Häfen beiläufig – und Weltbank-Schlagwörter werden ebenfalls ignoriert (100+ Schlagwörter pro Datensatz). Dies wurde am 2026-08-26 gegen zufällige 20-Titel-Stichproben abgestimmt: Die lockere Regel Titel+Schlagwörter+Zusammenfassung behielt 15.271 Weltbank-Datensätze bei etwa 35–50 % Präzision; die endgültige Regel behält 976 bei 18/20, IPEA 207 bei ~16/20, CEPAL 1.165 bei ~15/20. Der Preis ist die Erinnerung; lockern Sie min_subject_hits in sources.py und führen Sie transport-lit reindex --source <key> (ohne Netzwerk) aus, wenn Sie den anderen Handel möchten. Die Laufnotizen erfassen behalten vs. übersprungen.

  • transport-lit reindex --source <key> parst die zwischengespeicherten Seiten erneut und entfernt Datensätze, die der aktuelle Parser/Filter nicht mehr behält, sodass Filteränderungen nie eine Neu-Ernte erfordern.

Monatlicher Neuaufbau und wöchentliche Aktualisierungen (Wartungsplan)

Der Korpus ändert sich langsam, daher ist der Rhythmus: wöchentliche inkrementelle Ernte und ein monatlicher frischer Neuaufbau. harvest --fresh führt eine vollständige Ernte in einen temporären Speicher durch und ersetzt dann atomar die dot:-Datensätze im Live-Index – der einzige Weg, wie Datensätze, die ROSA-P nicht mehr ausliefert, jemals verschwinden (sein OAI-PMH-Endpunkt verfolgt keine Löschungen). Importierte Quellen (TRID-Exporte) bleiben unberührt, und ein fehlgeschlagener Neuaufbau ändert nichts.

transport-lit install-schedule          # shows the two launchd agents
transport-lit install-schedule --write  # installs them: Mon 06:00 `--source all` incremental, 1st 05:00 `--source all --fresh`

Logs landen in $TRANSPORT_LIT_DATA_DIR/logs/. Unter Linux verwenden Sie die Cron-Zeilen, die der Befehl ausgibt.

Monatliche Wartungs-Checkliste (mit dem Neuaufbau erledigt): neue GitHub-Issues lesen; uv lock --upgrade && uv run pytest; Fixes im Changelog-Abschnitt der Release notieren; version in pyproject.toml und src/transport_lit/__init__.py erhöhen; git tag vX.Y.Z && git push --tags.

TRID: Importieren Sie, was Sie exportieren

TRID (https://trid.trb.org) ist die vollständigste Transportbibliographie und die natürliche Ergänzung zu ROSA-P, hat aber keine API, seine FAQ sagt, TRB „gewährt keinen Zugriff auf TRID-Backend-Systeme oder hebt Export-/Download-Beschränkungen auf“, und seine robots.txt verbietet KI-Crawler. Was jeder Benutzer darf, ist Suchen und Exportieren. Also:

  1. Führen Sie Ihre Suche in TRID durch, wählen Sie Export → RIS (CSV und XML werden ebenfalls angeboten).

  2. transport-lit import ~/Downloads/trid-driver-improvement.ris --collection "TRID: driver improvement"

Datensätze erhalten IDs trid:<accession> aus der TRID-Ansichts-URL, landen in der TRID-Sammlung (search_reports(..., collection="TRID")), und das erneute Importieren derselben Datei ist idempotent. Der Importeur ist generisches RIS, daher funktionieren Zotero/EndNote/Scopus-Exporte auf die gleiche Weise mit --source <prefix>. get_fulltext folgt bei einem importierten Datensatz nur einem direkten .pdf-Link; andernfalls verwenden Sie landing_url.

Was der OAI-PMH-Endpunkt von ROSA-P bietet

https://rosap.ntl.bts.gov/fedora/oai — Repository „DOT Stacks“ (die CDC-Stacks-Plattform), Protokoll 2.0, frühester Datumsstempel 2008-07-02, keine Löschverfolgung, keine OAI-Sets (ListSets ist leer), und oai_dc ist das einzige Metadatenformat. Es ist jedoch ein qualifiziertes Dublin Core in Verkleidung: Elemente wie dc:contributor.author, dc:description.abstract, dc:relation.isPartOf, dc:identifier.uri (DOI und Berichtsnummern, z. B. DOT HS 813 827), dc:coverage.spatial, dc:title.alternative und dc:description.tableOfContents sind alle vorhanden. Der Parser (dc.py) behält jedes rohe Feld und leitet die typisierten Spalten daraus ab. dc:relation.isPartOf (durch Semikolon getrennt) wird von list_collections / dem collection-Filter verwendet.

PDF-Links sind nicht in den Metadaten; get_fulltext liest citation_pdf_url von der Landingpage und fällt auf die Datastream-Konvention /view/dot/{n}/dot_{n}_DS1.pdf zurück.

Verifizierung (2026-08-26)

v0.3.0-API-Quellen. OpenAlex: 58 Seiten, 11.448 Berichte (10 Themen, type:report), 1.428 mit PDF-Links. CiNii: 730 Seiten, 144.348 Treffer über 20 Abfragen, 118.609 eindeutig. PubMed: 105.028 Artikel in 17 Datums-Slices (E-utilities begrenzt retstart auf 10.000, daher werden Slices rekursiv gefunden). Open-Modell-Check: Ollama qwen2.5:3b beantwortete eine Frage zur Fahrerverbesserung mit einem korrekten search_reports-Aufruf.

v0.2.0-Multi-Quellen-Ernte. VTI: 120 Seiten, 11.944 gesehen, 11.460 eindeutig (DiVA liefert einige Datensätze in mehreren Sets), 0 Fortsetzungen. BASt: 30 Seiten, 2.987 gesehen, 2.970 eindeutig; 1.901 mit direkten PDF-Links; Tagesgranularitäts-Inkrementalpfad geübt (24 Datensätze). Weltbank: 404 Seiten / 40.332 gesehen; IPEA: 144 / 14.400; CEPAL: 522 / 52.199 – alle endeten auf einer Seite ohne Token mit 0 Fortsetzungen; gefilterte Zählungen oben. Stichprobensuchen: Fußgänger Unfall (BASt) → Unfallrekonstruktion und Landstraßen-Unfallstatistiken; acidentes de trânsito mortalidade (IPEA) → „Mortalidade por acidentes de transporte terrestre e desigualdades interestaduais no Brasil“; seguridad vial peatones (CEPAL) → Straßenverkehrssicherheits-Governance und Kampagnenbewertungen; pedestrian safety (VTI) → Studien zur Kindersicherheit in den 1990er Jahren.

v0.1.0 (erste ROSA-P-Ernte)

Erntevollständigkeit. Lauf 1 (full) durchlief 908 Seiten / 90.706 Datensätze in 15 Minuten (00:03:59–00:19:11 UTC) mit 0 Fortsetzungen, 0 Cursor-Abweichungen und endete auf einer Seite mit 6 Datensätzen ohne Fortsetzungs-Token – die OAI-PMH-Definition einer vollständigen Liste. 90.603 eindeutige Datensätze sind im Speicher; die Lücke von 103 Datensätzen ist derselbe Datensatz, der auf zwei Seiten erscheint, was passiert, weil ROSA-P die Datensätze nicht in stabiler Reihenfolge zurückgibt (der Harvester protokolliert dies: „datestamp ordering violated on page 2"). Ein zweiter unabhängiger vollständiger Durchlauf, 30 Minuten später in ein separates Verzeichnis, ergab exakt dieselben Zahlen – 908 Seiten, 90.706 gesehen, 90.603 eindeutig – und die beiden ID-Sätze sind identisch (0 Datensätze, die nur in einem der Durchläufe vorkommen). Die 103 Wiederholungen sind das Repository, das denselben Datensatz auf zwei Seiten ausliefert, nicht übersprungene Datensätze.

Abdeckung nach Jahrzehnten (Jahr vorhanden für 74.448 = 82 %; die restlichen 16.155 haben in keinem Metadatenfeld ein Datum; year_source gibt an, ob ein Jahr aus dc:date (48.658), einer nackten Jahres-Beschreibungszeile (22.205) oder dem Titel (3.585) stammt):

Jahrzehnt

Datensätze

Jahrzehnt

Datensätze

1900er–1930er

3.243

1980er

5.408

1940er

2.618

1990er

8.936

1950er

2.627

2000er

11.466

1960er

2.947

2010er

18.690

1970er

5.057

2020er

13.456

Bekannte-Objekt-Abfrage (transport-lit search …, Rang 1 sofern nicht anders angegeben):

Ziel

Abfrage

Ergebnis

NHTSA Countermeasures That Work

"countermeasures that work" guide highway safety offices

dot:1789 (2005), dot:1827 (3. Aufl. 2008), dot:40255 (1. Aufl. 2006), dot:1778 (2. Aufl. 2007); 11. Aufl. 2023 ist dot:72947 (DOT HS 813 490), 10. Aufl. dot:57466. Die bloße Phrase allein platziert die einseitigen Traffic Tech-Zusammenfassungen von CTW zuerst (kurze Dokumente gewinnen bei BM25), dann die Leitfäden.

Oregon DMV Driver Improvement Program evaluation (Strathman et al., 2007)

oregon driver improvement program strathman

dot:21848 „Evaluation of the Oregon DMV driver improvement program", Strathman, Kimpel, Leistner; Berichtsnr. SPR 634. Ohne Datum in den ROSA-P-Metadaten.

Virginia driver improvement reports (Lynn, 1982)

virginia driver improvement lynn

dot:18959 (12-Monats-Bericht), dot:18905 (Kurzzeiteffekte), dot:18969 (24-Monats-Abschlussbericht), alle von Cheryl Lynn, Virginia Highway & Transportation Research Council. Ohne Datum in den ROSA-P-Metadaten.

Echte Abfrage driver improvement program evaluation negligent operator (Top 6 von 10):

  1. dot:18905 — An evaluation of the short-term effects of the Virginia driver improvement program (Lynn) — all_terms

  2. dot:29326 — Review of NJ point system (Carnegie, Ozbay, Mudigonda, 2013; FHWA NJ-2013-004) — all_terms

  3. dot:18959 — …Virginia driver improvement program on negligent driving: 12-month report (Lynn)

  4. dot:18969 — …Virginia driver improvement program on negligent driving: 24-month report (Lynn)

  5. dot:17678 — Study of recidivism rates among drivers administratively sanctioned by the New Jersey MVC (Carnegie et al., 2009)

  6. dot:17677 — Study of the effects of plea bargaining motor vehicle offenses (Carnegie et al., 2009)

Die Volltext-Extraktion wurde an dot:93144 überprüft (DOT HS 813 827, 3,7-MB-PDF, aufgelöst über citation_pdf_url). Unit-Tests: uv run pytest (Parser für beide Metadatenprofile, Jahres-Fallback, FTS-Suche/-Filter, Upsert-Idempotenz, Query-Tokenizer, ID-Normalisierung).

Layout

src/transport_lit/
  config.py    paths, User-Agent, pacing, limits (env-overridable)
  oai.py       rate-limited OAI-PMH client; typed errors; raw-page cache
  dc.py        oai_dc record -> typed dict (authors, year, DOI, report numbers, collections …)
  store.py     SQLite schema, FTS5 index + triggers, search, stats, harvest-run bookkeeping
  harvest.py   full / incremental harvest with completeness + truncation handling
  fulltext.py  PDF resolution, download (size-capped), pypdf extraction, cache
  server.py    MCP tools (FastMCP / MCPServer)
  importers.py RIS import (TRID exports and any other reference-manager export)
  cli.py       transport-lit probe | harvest [--fresh] | import | reindex | status | search | get | fulltext
               | install-claude-desktop | install-schedule
.github/workflows/  ci.yml (tests on push/PR), release.yml (wheel + GitHub Release on tag)
tests/         unit tests (parser, store, query tokenizer)

Hinzufügen einer zweiten Quelle später (z. B. NHTSA crashstats)

Der Speicher ist quellenunabhängig: records.id ist eine präfixierte Zeichenkette (heute dot:93144), harvest_runs.source zeichnet auf, welcher Harvester einen Lauf geschrieben hat, und der FTS-Index kümmert sich nicht darum, woher eine Zeile stammt. Um eine Quelle hinzuzufügen:

  1. Schreiben Sie src/transport_lit/sources/<name>.py, das harvest(store, *, mode, progress) bereitstellt, das Dictionaries in derselben Form liefert, die dc.parse_record erzeugt (id, title, authors, year, abstract, report_numbers, doi, landing_url, collections, raw, …) und store.upsert_records() aufruft. Verwenden Sie ein neues ID-Präfix (nhtsa:812115) und übergeben Sie Ihren eigenen source-Namen an store.start_run(), damit harvest_status es separat melden kann.

  2. Verwenden Sie oai.RateLimiter und config.USER_AGENT für die Etikette; speichern Sie rohe Antworten unter raw/<source>/ für Reproduzierbarkeit.

  3. Geben Sie harvest.status() einen pro-Quelle-Block (Zählung nach id-Präfix).

  4. Fügen Sie eine --source-Option zu transport-lit harvest hinzu und, falls die Quelle eine eigene Facette hat, einen entsprechenden Filter auf search_reports.

  5. Deduplizieren Sie gegen ROSA-P anhand von DOI / Berichtsnummer (records.doi, records.report_numbers) statt nach Titel – NHTSA-Berichte sind oft an beiden Orten vorhanden.

Verifizierte Fakten für die NHTSA-crashstats-Quelle, damit niemand sie neu ableitet: https://crashstats.nhtsa.dot.gov/Api/Public/Publication/{id} liefert das PDF direkt (812115 → NMVCCS-Bericht zu kritischen Gründen, application/pdf, ~0,5 MB). Es ist ein Dokumentabruf-Endpunkt, keine Such- oder Auflistungs-API, daher benötigt ein Connector eine Aufzählungsstrategie (z. B. die bereits in ROSA-P report_numbers vorhandenen DOT HS-Nummern) statt eines Crawls.

Jenseits der USA: bewertete Kandidatenquellen (2026-08-26)

Live geprüft auf (a) ob die Bestände Literatur statt Datensätze sind und (b) ob es einen Maschinenzugriff gibt, der zu diesem Harvester passt. Die Zahlen sind das, was die Endpunkte an diesem Tag gemeldet haben.

Quelle

Bestand

Maschinenzugriff

Bewertung

VTI (Schweden) via DiVA vti.diva-portal.org/dice/oai

7.474 Datensätze, Set all-vti; Forschungsinstitut für Verkehrssicherheit

OAI-PMH, completeListSize, oai_dc + swepub_mods + MARC21

Harvest — Drop-in

BASt (Deutschland) OPUS bast.opus.hbz-nrw.de/oai

2.987 Datensätze; Berichte der Bundesanstalt für Straßenwesen

OAI-PMH, completeListSize, oai_dc + xMetaDissPlus

Harvest — Drop-in

World Bank Open Knowledge Repository openknowledge.worldbank.org/server/oai/request

40.332 Datensätze; 1.787 Treffer für „transport safety"; OAI-Set transport enthält nur 100

OAI-PMH (DSpace 7) + DSpace REST discover/search

Alles harvesten, nach Thema filtern; oder REST-Abfrage

WHO IRIS iris.who.int/oai/request

276.681 Datensätze; 3.334 Treffer für „road traffic"; keine Sets

OAI-PMH + DSpace-REST-Suche

REST-Abfrage nach Thema (vollständiger OAI-Durchlauf umfasst 2.800 Seiten)

CEPAL-Repository (Lateinamerika) repositorio.cepal.org/server/oai/request

52.199 Datensätze; keine Themen-Sets

OAI-PMH + DSpace REST

Harvesten und nach Thema filtern

MTT Chile Biblioteca Digital de Transportes biblioteca.mtt.gob.cl

5.820 program_report-Zeilen mit Name, Beschreibung, Kategorie, Dateien

Offenes Hasura GraphQL unter api.biblioteca.mtt.gob.cl/v1/graphql (Introspection aktiviert, nicht authentifizierter Lesezugriff)

Über GraphQL harvestbar; Nutzungsbedingungen zuerst mit MTT klären

OpenAlex api.openalex.org

2.604 Werke vom Typ report passend zu „road safety"; 16.639 Werke jeglichen Typs für „pedestrian safety"

Kostenlose REST-API, Cursor-Paginierung

Bester globaler Aggregator; als Quelle für nicht-US-amerikanische graue Literatur und DOIs nutzen

GOV.UK (DfT) gov.uk/api/search.json

4.998 DfT-Einträge für „road safety research"

Kostenlose Inhalts-API

Harvestbar; erfordert Filterung nach Dokumenttyp

Spanien, Centro de Documentación del Transporte

66.000 bibliografische Datensätze (45.000 Monografien) in AbsysNet

Nur OPAC; Website blockiert Nicht-Browser-Clients (HTTP 403)

Nicht im Rahmen, sofern das Ministerium kein OAI/Z39.50 bereitstellt

TRIMIS (EU) trimis.ec.europa.eu

EU-finanzierte Verkehrsprojekte und -ergebnisse

Website verfügbar; keine dokumentierte API (Bulk-Open-Data-Dumps vorhanden)

Open-Data-Dump bewerten, nicht die Website

IDB-Publikationen, CAF Scioteca

Verkehrsberichte der Entwicklungsbank

DSpace, aber Bot-blockiert (403 / Challenge-Seite)

Nicht im Rahmen, sofern kein Zugriff gewährt wird

SWOV (Niederlande)

Bibliothek des Instituts für Verkehrssicherheit

Bot-Erkennungsseite auf jedem Pfad

Nicht im Rahmen

ITF/OECD

Berichte des International Transport Forum

HTTP 403 für Nicht-Browser-Clients; keine API

Nicht im Rahmen (OECD-iLibrary-API ist lizenziert)

Transport Data Commons portal.transport-data.org

Datensätze (32 Institutionen, 120+ Länder), PortalJS

Keine API gefunden (/api/3 ist 404)

Keine Literatur

ITDP Rapid Transit Database

Datensatz (BRT/LRT/Metro-km pro Stadt); Google-Sheet-Download

Nur Download

Keine Literatur

AASHTO-TERI-Datenbank

Forschungsbedarfs-Statements, keine abgeschlossenen Berichte

Keine

Keine Literatur

nismod/Africa-transport-database (GitHub)

GIS-Datensatz der afrikanischen Verkehrsinfrastruktur

Git clone

Keine Literatur

TRID

1,5 M bibliografische Datensätze, international

Keine; Export-/Backend-Zugriff aus Richtlinien abgelehnt

Nicht im Rahmen

Nach Region (Tests am selben Tag; „open" bedeutet bestätigter nicht authentifizierter Maschinenzugriff):

Region

Was existiert

Zugriff

Anmerkungen

Europa

VTI (SE), BASt (DE) — oben; HAL (FR): 74.952 Einträge in der Sammlung der Université Gustave Eiffel/IFSTTAR, 117 Treffer vom Typ REPORT für „Straßenverkehrssicherheit“; OpenAIRE: 82.053 Publikationen für „Straßenverkehrssicherheit“ (alle Typen, europaweiter Aggregator); EU Publications Office Cellar SPARQL und CORDIS Such-JSON antworten beide

HAL REST (offen), OpenAIRE REST (offen), Cellar SPARQL (offen), CORDIS JSON (offen); DTU Orbit OAI 500, TU Delft OAI nicht gefunden, TØI 403

ITF/OECDs ITRD wurde in TRID integriert, daher ist ITF-Inhalt nur über TRID erreichbar

Australien / Neuseeland

Figshare OAI-PMH + REST (Monash/MUARC und andere australische Universitäten veröffentlichen dort Berichte); NZTA-Forschungsberichtsseiten (HTML, 200); Austroads (403 für Nicht-Browser); APO Graue-Literatur-Observatorium (403 für Nicht-Browser); Trove-API (benötigt Schlüssel)

Figshare offen; Trove schlüsselgeschützt; APO/Austroads bot-blockiert

Figshare-Suche nach „Straßenverkehrssicherheit“-Berichten liefert meist Datensätze/Code – erfordert Filterung nach Elementtyp + Institution, um nützlich zu sein

Japan

IRDB (irdb.nii.ac.jp/oai, nationaler Aggregator institutioneller Repositorien; JPCOAR 2.0 + oai_dc, 9 Sets); CiNii Research OpenSearch: 16.547 Treffer für 交通安全; J-STAGE WebAPI: 9.786 für „Verkehrssicherheit“ (Zeitschriften, inkl. IATSS Research)

Alle offen, kein Schlüssel

IRDB ist der Weg für graue Literatur (Thesen, technische Berichte von Universitäten); NILIM/PWRI-Ministeriumsberichte sind nur im Web verfügbar

Indien

Shodhganga OAI nicht gefunden unter DSpace-Pfaden; CSIR-CRRI-Website ist statisches HTML; IRC/MoRTH nur im Web

Keine gefunden

Beste Abdeckung ist OpenAlex/OpenAIRE für indische Zeitschriftenausgaben; keine erntbare graue Literaturquelle identifiziert

China

Kein offenes Repository für MOT/RIOH-Berichte; RIOH-Website ist statisch; CNKI ist lizenziert

Keine gefunden

OpenAlex liefert 15.416 Werke von CN-Institutionen für „Verkehrssicherheit“ (Zeitschriftenliteratur) – das ist der realistische Weg

Lateinamerika

IPEA (BR) repositorio.ipea.gov.br/server/oai/request: 14.400 Datensätze, 8.021 REST-Treffer für „Transport“; CEPAL — oben; MTT Chile GraphQL — oben; IMT Mexico technische Veröffentlichungen sind HTML/PDF-Listen

IPEA/CEPAL OAI offen; MTT GraphQL offen; IDB/CAF bot-blockiert; LA Referencia OAI nicht gefunden unter vermuteten URLs

SciELO OAI-Endpunkte nicht gefunden unter alten Pfaden (ohnehin Zeitschriften)

Die drei OAI-PMH-Repositorien mit completeListSize (VTI, BASt, World Bank OKR) passen in den bestehenden Harvester mit einem Quellpräfix und einem pro Quelle metadataPrefix; DSpace-7-Sites tolerieren auch from/until und liefern korrektes noRecordsMatch, sodass die ROSA-P-Eigenheiten in oai.py bereits der schwierigere Fall sind.

TRID ist außerhalb des Rahmens

TRID (https://trid.trb.org) hat keine öffentliche API, keinen OAI-PMH-Endpunkt und keinen Massenexport. Seine FAQ besagt, dass „TRB keinen Zugriff auf TRID-Backend-Systeme gewährt oder Export-/Download-Beschränkungen für Einzelpersonen oder Organisationen aufhebt“ und dass die Datenbank nicht zum Trainieren von LLMs verwendet werden darf. Es wird hier bewusst nicht gescraped.

v2-Reihenfolge (vereinbart 2026-08-26)

  1. VTI + BASt (erledigt, v0.2.0) — 2. World Bank OKR, IPEA, CEPAL (erledigt, v0.2.0) —

  2. IRDB Japan — 4. OpenAlex type:report als globaler Rückhalt — 5. ein PubMed-Transport-Subset (siehe unten). VTI-Hinweis: DiVAs oai_dc enthält keinen Volltextlink; das Umschalten dieser Quelle auf swepub_mods/mets_kb würde get_fulltext die FULLTEXT01.pdf-URL liefern.

PubMed: ein Transport-/Verletzungs-Subset, nicht ganz PubMed

PubMed's E-utilities (esearch/efetch, kostenlos, 3 Anfragen/s ohne Schlüssel) können ein lokales Subset aus einer festen Strategie pflegen, aktualisiert mit mindate/maxdate im gleichen wöchentlichen/monatlichen Rhythmus. Zwei komplementäre Filter, ODER-verknüpft:

  • MeSH-Strategie — "Accidents, Traffic"[MeSH] OR "Pedestrians"[MeSH] OR "Bicycling"[MeSH] OR "Automobile Driving"[MeSH] OR "Motorcycles"[MeSH] OR "Wounds and Injuries"[MeSH] AND ("Transportation"[MeSH] OR "Built Environment"[MeSH] OR "City Planning"[MeSH]) — erfasst Transportarbeiten in allgemeinen und klinischen Zeitschriften.

  • Zeitschriftenliste — Accident Analysis & Prevention, Traffic Injury Prevention, Journal of Safety Research, Injury Prevention, Injury Epidemiology, Journal of Transport & Health, Safety Science, Transportation Research Part F, Transport Reviews, BMC Public Health (nur transportbezogen), usw. — erfasst Transportarbeiten, die ohne die MeSH-Begriffe indexiert sind.

SafetyLit (safetylit.org, das WHO-angehörige wöchentliche Verletzungsliteratur-Bulletin) pflegt genau eine solche Zeitschriftenliste und klassifiziert Artikel manuell nach Thema, was es zum besten Ausgangspunkt für den Zeitschriftenfilter machen würde; seine Website war nicht erreichbar (Verbindung abgelehnt auf jedem Hostnamen) bei der Überprüfung am 2026-08-26, daher ist sein aktueller Status unbestätigt.

Wöchentlicher Digest (ein SafetyLit-artiges Bulletin)

transport-lit digest --days 7 [--abstracts] gibt ein Markdown-Bulletin von allem aus, das in der letzten Woche in den Index gelangt ist, gruppiert nach Quelle, mit Zählern. Es wird von first_seen_at gesteuert, das beim ersten Mal gesetzt wird, wenn ein Datensatz gesehen wird, und über frische Neuaufbauten hinweg erhalten bleibt, sodass ein monatlicher Neuaufbau nicht den gesamten Index neu aussehen lässt. Das whats_new-Tool stellt dieselben Daten einem Modell zur Verfügung, das dann die Zusammenfassungen schreiben kann – der redaktionelle Schritt, den SafetyLit von Hand erledigt hat.

Vergleich mit anderen Literatur-MCPs

PubMed, Semantic Scholar, OpenAlex und arXiv-MCP-Server leiten Live-Abfragen an eine API weiter. transport-lit unterscheidet sich in drei Punkten: Es indexiert graue Literatur, die den Aggregatoren fehlt (Behördenberichte, staatliche DOT-Evaluierungen, ITRD-beitragende Institute), es läuft offline auf einem lokalen Index nach der Ernte (keine Ratenbegrenzungen zur Abfragezeit, kein Schlüssel), und es ist multi-source mit einem ID-Schema, sodass ein Modell alles auf einmal durchsuchen und Zitate exportieren kann. Was diese Server haben, das diesem noch fehlt: Zitationsgraphen (wer zitiert wen), Autorendisambiguierung und semantische (Embedding-)Suche – siehe unten.

Semantische Suche (v0.4)

Die Stichwortsuche ist FTS5/BM25. Das Hinzufügen von Vektoren verwandelt search_reports in eine hybride Suche (BM25 und Kosinus, fusioniert durch reziproken Rang), die Datensätze nach Bedeutung und über Sprachen hinweg findet – eine englische Abfrage erreicht schwedische, deutsche, spanische, portugiesische oder japanische Datensätze. Alles läuft lokal; kein Konto, keine GPU.

uv tool install "transport-lit[semantic]"   # adds fastembed (ONNX runtime), ~60 MB
transport-lit embed                         # default backend: fastembed, multilingual MiniLM-L12 (384-d, 220 MB model, one-time download)
transport-lit embed --backend ollama --model qwen3-embedding:8b     # opt-in: any Ollama embedding model, truncated to 1024-d
transport-lit search "programa de mejoramiento de conductores" --mode semantic

embed verarbeitet nur Datensätze, die noch keinen Vektor haben, sodass die wöchentliche Ernte nach dem ersten Durchlauf nur Sekunden hinzufügt. Vektoren liegen in $TRANSPORT_LIT_DATA_DIR/vectors/<backend-model>/ als eine speicherabgebildete float16-Matrix (342k × 384 ≈ 260 MB); die Suche ist ein chunked dot product, keine Erweiterung. Der aktive Vektorsatz wird im Index aufgezeichnet, sodass search_reports(mode=…) das Backend verwendet, das ihn erzeugt hat: hybrid (Standard), keyword oder semantic; mode_used in jedem Ergebnis sagt, was ausgeführt wurde, und es fällt auf keyword zurück, wenn keine Vektoren existieren. harvest_status() meldet Backend, Modell, Dimension und Abdeckung.

Backends gemessen am 2026-08-26 auf einem 10-Kern-Apple-Silicon-Laptop, 256 echte Datensätze (Titel + Abstract): fastembed MiniLM-L12 ≈ 30 Datensätze/s auf CPU (der CoreML-Anbieter ist nicht schneller); Ollama qwen3-embedding:0.6b ≈ 20/s (1024-d), qwen3-embedding:8b ≈ 1,4/s (4096-d, auf 1024 gekürzt). Der erste vollständige Durchlauf über 342k Datensätze ist also eine einmalige ~3 h mit dem Standardmodell; das wöchentliche Inkrement dauert Sekunden. Verwenden Sie --source, um eine Quelle mit einem schwereren Modell einzubetten. Beachten Sie, dass das MiniLM-Modell höchstens 128 Token liest (Titel plus die ersten ~90 Wörter des Abstracts); Qwen liest das volle 1.500-Zeichen-Fenster und erhält das Retrieval-Anweisungspräfix des Modells bei Abfragen. Die meisten Benutzer sollten einen Snapshot (unten) installieren und den vollständigen Durchlauf gar nicht erst ausführen.

Snapshots: die Ernte überspringen

transport-lit snapshot build transport-lit-YYYY-MM.tar.gz packt den SQLite-Index plus die aktiven Vektoren; transport-lit snapshot install <url-or-file> entpackt einen in ein frisches TRANSPORT_LIT_DATA_DIR, wonach wöchentliche inkrementelle Ernten es aktuell halten. Snapshots lassen CiNii aus (seine API-Bedingungen erfordern Registrierung und schweigen zur Weiterverbreitung) und TRID-Importe (TRBs Bedingungen); Benutzer ernten diese selbst. Releases enthalten einen Snapshot, wenn einer erstellt wurde.

Available Tools

12 tools
export_citationsA
Read-onlyIdempotent

Export records as RIS (Zotero/EndNote/Mendeley) or BibTeX. Pass transport-lit ids.

NameRequiredDescriptionDefault
idsYes
formatNoris

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by naming the exact output encodings and the required ID source ('transport-lit ids'). It does not discuss rate limits or edge cases, but the annotations lower the burden here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It immediately states the operation, the output formats, and the key input requirement. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description is mostly complete: annotations cover safety and idempotence, the output schema covers return shape, and the description covers formats and ID source. The main missing piece is guidance for choosing this over sibling citation/retrieval tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does by clarifying that ids should be 'transport-lit ids' and that format accepts RIS or BibTeX. This adds real meaning beyond the bare schema, though it could be more explicit about ID syntax or format case-sensitivity.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Export records as RIS (Zotero/EndNote/Mendeley) or BibTeX.' This clearly distinguishes it from sibling retrieval tools like get_citations or get_references. The format list makes the deliverable concrete.

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

Usage Guidelines2/5

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

The only usage guidance is 'Pass transport-lit ids,' which is an operational requirement rather than a when-to-use statement. It does not mention when to choose export_citations over alternatives such as get_citations, nor does it state exclusions or prerequisites. No alternatives are named.

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

find_similarB
Read-onlyIdempotent

Records similar to a given one (by title and subject terms), across all sources.

NameRequiredDescriptionDefault
idYes
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds useful context by specifying how similarity is determined ('by title and subject terms') and that it searches 'across all sources,' which implies no user, workspace, or source filtering. No contradictions with annotations, but no additional detail beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. The core action and key modifiers are front-loaded, and every word adds information. It is appropriately concise without sacrificing necessary meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. The tool is simple and annotations cover its safety profile. However, the description leaves parameter semantics entirely unaddressed and does not provide enough context for an agent to confidently call it correctly, especially regarding what 'limit' does.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not compensate. It never mentions the 'id' parameter or the 'limit' parameter, nor does it explain what they mean. An agent must infer that 'a given one' refers to the required id and cannot know what limit controls. This is a significant gap.

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

Purpose4/5

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

The description states a specific function: finding records similar to a given one, with explicit criteria ('by title and subject terms') and scope ('across all sources'). It is not a tautology and gives a clear sense of what the tool does. However, it does not explicitly distinguish itself from sibling tools such as search_reports or lookup, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description implies usage: when you have a record id and want similar records, use this tool. It does not provide any explicit when-not-to-use guidance or point to alternatives among the sibling tools. This is enough to infer context but lacks direct routing to alternatives.

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

get_citationsA
Read-onlyIdempotent

Works that cite a record, via OpenAlex, cached locally (refreshed after 90 days). only_in_index=True returns just citing works that are in this index — 'what has built on this report'. cited_by_count_openalex is OpenAlex's total.

NameRequiredDescriptionDefault
idYes
limitNo
refreshNo
only_in_indexNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the tool read-only, idempotent, open-world, and non-destructive, so the description does not need to restate that. It adds valuable behavioral context: local caching with a 90-day refresh cycle, a distinction between index-only citing works and OpenAlex totals, and the meaning of cited_by_count_openalex. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tightly written sentences with the core behavior front-loaded and parameter notes kept compact. Every sentence earns its place, and there is no redundant restatement of the tool name or schema. The structure is ideal for a read-only cached query.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations and the presence of an output schema, the description covers the essential contextual elements: data source, caching behavior, the only_in_index filter, and a key output field. The refresh parameter's explicit behavior is not stated, but the 90-day refresh note makes it reasonably inferable. Overall, an agent has enough context to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of parameter semantics. It does this well for only_in_index, explaining both the filter behavior and its conceptual significance. However, it does not explain id, the explicit effect of refresh=True, or limit, leaving a partial gap in parameter understanding.

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

Purpose4/5

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

The description states the tool returns works that cite a record, sourced via OpenAlex and cached locally. It makes the inbound-citation direction clear, which implicitly distinguishes it from the sibling get_references, though it does not explicitly name that sibling. The verb and resource are specific enough for an agent to understand the core function.

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

Usage Guidelines3/5

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

The only_in_index option provides a clear conditional scoping rule with an interpretive gloss ('what has built on this report'), and the 90-day refresh note sets expectations about data freshness. However, there is no explicit guidance on when to use this tool versus siblings like get_references or export_citations, and no exclusions are stated. Usage context is implied rather than fully spelled out.

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

get_fulltextA
Read-onlyIdempotent

Resolve the report's PDF on ROSA-P, extract its text and return it (cached locally after the first call). Page through long documents with offset. Text is marked with [[page N]] separators. Scanned PDFs return status 'no_text'.

NameRequiredDescriptionDefault
idYes
offsetNo
refreshNo
max_charsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, openWorld), the description discloses caching behavior, page separator format, and scanned-PDF status 'no_text'. This adds substantive behavioral detail that an agent would not otherwise know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three focused sentences with the core action front-loaded, followed by cache behavior, pagination, page markers, and a failure mode. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main call path, paging, cache behavior, and scanned-PDF status, and the output schema exists so return values need no explanation. However, the behavior of 'refresh' and 'max_chars' is not explained, so the description is not fully complete for all parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains 'offset' for paging, but does not clarify 'refresh' or 'max_chars'; 'id' is only implied by 'the report's PDF'. The description adds some meaning but leaves several parameter semantics undocumented.

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

Purpose5/5

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

The description uses a specific verb ('Resolve', 'extract') and a specific resource ('the report's PDF on ROSA-P'), clearly distinguishing this from siblings like search_fulltext or get_report. The exact scope of the tool is immediately understandable.

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

Usage Guidelines4/5

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

The description gives clear operational context: paging long documents with offset, local caching, and special handling for scanned PDFs. It does not explicitly mention alternatives or exclusions ('use search_fulltext instead'), but the use case is clear enough for an agent.

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

get_referencesB
Read-onlyIdempotent

Works a record cites (its reference list), via OpenAlex, cached locally. Each entry carries record_id when the cited work is itself in this index. match says how the record was matched to OpenAlex (openalex, doi, pmid, or title).

NameRequiredDescriptionDefault
idYes
limitNo
refreshNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds meaningful context beyond those: it explains the OpenAlex source, local caching, presence of record_id for in-index works, and the match field's allowed values. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with little filler; it packs source, caching, record_id, and match semantics efficiently. The grammar issue in the first sentence hurts clarity slightly, but the description is appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema plus annotations cover return values and safety, and the description explains the most important output nuance. However, it omits refresh/limit behavior and does not explicitly distinguish this reference-list tool from the get_citations sibling, leaving meaningful gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for the three parameters, but it does not explain id, limit, or refresh. The cache mention loosely relates to refresh and 'a record' implies id, but the semantics of refresh and limit are left undocumented.

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

Purpose4/5

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

The description identifies the resource as a record's reference list and adds useful source context (OpenAlex, cached locally). It is clear enough, though the opening phrase 'Works a record cites' is ungrammatical and lacks an explicit verb; the tool name helps compensate.

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

Usage Guidelines3/5

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

The description implies when to use the tool: when you need the works cited by a record. It does not explicitly contrast it with siblings like get_citations, nor does it state when not to use it, leaving some routing to inference.

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

get_reportA
Read-onlyIdempotent

Full metadata record for one report. Accepts 'dot:93144', '93144', the OAI identifier, or the ROSA-P landing URL. Includes every raw Dublin Core field.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive, and the description adds useful context about accepted identifier formats and the raw Dublin Core content. However, it does not disclose any other behavioral traits such as not-found behavior or normalization, though the output schema covers the return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences front-load the core purpose and then immediately give the parameter formats and content guarantee. There is no repetition of schema or annotation information and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with an output schema, the description is nearly complete: it explains what the tool returns and what the parameter can be. The only missing piece is explicit guidance about when to choose this tool over its siblings, but the low complexity and rich annotations keep this from being a major gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by specifying the accepted forms of the single 'id' parameter: dot-prefixed, bare numeric, OAI identifier, or ROSA-P landing URL. This is essential information an agent would otherwise lack, and it directly clarifies the parameter semantics.

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

Purpose4/5

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

The description identifies the resource as a metadata record for one report and states it includes every raw Dublin Core field, which clearly conveys what the tool returns. It implicitly distinguishes itself from siblings like search_reports and get_fulltext, but it never explicitly names an alternative or explains how it differs from them.

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

Usage Guidelines3/5

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

The description implies the tool is used when a specific report identifier is available and full metadata is needed, but it offers no explicit when-to-use vs alternative guidance. Sibling names such as search_reports, lookup, and get_fulltext signal neighboring use cases, but the description does not route between them.

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

harvest_statusA
Read-onlyIdempotent

Record counts per source, last harvest time/status and notes, coverage by year. If a source's last run is not 'complete' its part of the index may be partial.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds a meaningful behavioral detail beyond annotations: if the last run status is not 'complete,' the source's index portion may be partial, which warns agents about interpreting the data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the first front-loads every reported dimension and the second adds the essential interpretation caveat. Every clause contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with an output schema, the description is complete. It tells the agent what information is available and warns about partial-index implications, leaving no obvious call-time decision unclear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter meaning for the description to add; the 100% schema coverage is vacuously satisfied. The description's focus on returned content is appropriate and needs no parameter elaboration.

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

Purpose4/5

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

The description enumerates what the tool exposes (per-source record counts, last harvest time/status, notes, and yearly coverage) and adds a precise partial-index caveat, so the resource is clear. It lacks an explicit 'get/retrieve' verb and does not differentiate from siblings, but the listed fields are specific enough to identify the purpose.

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

Usage Guidelines4/5

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

The content makes the intended context clear: any need to inspect harvest runs, per-source counts, status, or coverage by year. It does not name alternatives or give when-not-to-use guidance, but the straightforward read-only status-report scope leaves little ambiguity.

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

list_collectionsA
Read-onlyIdempotent

Collections (ROSA-P relation.isPartOf values) with record counts, plus document types. ROSA-P's OAI-PMH endpoint exposes no OAI sets, so these are derived from the harvested metadata and are what the collection filter matches against.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful provenance behavior: values are derived from harvested metadata rather than OAI sets, which is non-obvious and affects interpretation of the returned data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler. The core output is stated first, and the provenance/usage note earns its place by clarifying why these collections exist and how they are used.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing with an output schema present, the description fully covers purpose, data provenance, and the filtering use case. Nothing an agent needs to call or interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema leaves nothing undocumented and the described meaning of the return values is the main semantic contribution. No parameter-specific guidance is needed.

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

Purpose5/5

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

The description names a concrete resource (ROSA-P relation.isPartOf collection values), the returned information (record counts and document types), and the source of the data. This is specific enough to distinguish it from any sibling tool without opening schemas.

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

Usage Guidelines4/5

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

It explains that the endpoint exposes no OAI sets and that these derived values are what the collection filter matches against, which tells an agent when this lookup is relevant. It does not explicitly list alternatives or exclusion conditions, but no sibling appears to be a direct collection-listing alternative.

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

lookupA
Read-onlyIdempotent

Exact lookup by DOI, PMID, report number (e.g. "DOT HS 813 097"), transport-lit id, or landing URL. Use this instead of search when you already have an identifier.

NameRequiredDescriptionDefault
identifierYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare the tool read-only, idempotent, and non-destructive, so the description does not need to repeat those properties. It adds the behavioral trait of exact matching and enumerates identifier formats, but it does not disclose not-found behavior or side effects. An output schema exists, so return-value details are not required, but the behavioral disclosure is adequate rather than rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The operation and accepted identifier types are front-loaded, and the routing rule is appended efficiently. Every clause adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup with rich annotations and an output schema, the description covers the essential selection and invocation information. It is slightly incomplete only in not clarifying boundaries against get_report/get_fulltext and in not stating what happens when a supplied identifier is not found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines an 'identifier' string with no description (0% coverage), so the description carries the full burden of explaining the parameter. It compensates exceptionally well by enumerating accepted forms: DOI, PMID, report number with a concrete example, transport-lit id, or landing URL. This gives an agent the concrete vocabulary needed to populate the parameter correctly.

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

Purpose4/5

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

The description opens with a concrete operation and resource: 'Exact lookup by DOI, PMID, report number (e.g. "DOT HS 813 097"), transport-lit id, or landing URL.' This clearly identifies what the tool does and the identifier forms it accepts. It also distinguishes itself from the search siblings with 'Use this instead of search when you already have an identifier,' though it does not differentiate from get_report or get_fulltext, which may also operate on identifiers.

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

Usage Guidelines4/5

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

It explicitly states the condition to use this tool: 'Use this instead of search when you already have an identifier,' which is useful routing guidance. However, it gives no guidance on when lookup should be preferred over report- or fulltext-retrieval siblings, so the alternative-selection advice is partially incomplete.

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

search_fulltextA
Read-onlyIdempotent

Search inside the PDF text that get_fulltext has already extracted and cached (only documents someone fetched before). Returns snippets with [term] markers.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: search is limited to previously fetched/cached documents, and results are returned as snippets with [term] markers. It does not discuss edge cases like empty caches or query syntax, but it adds meaningful non-obvious behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core action and unique cached-only constraint are front-loaded, and every clause adds useful information. It is concise without sacrificing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low parameter count, rich annotations, and presence of an output schema, the description covers the essential invocation context: the cached-document prerequisite and the snippet output format. It is slightly light on query syntax expectations, but for a simple one-required-parameter search tool, the overall picture is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining parameters, but it only implies that 'query' is a term to search for via '[term] markers.' It never explicitly explains the query parameter semantics, matching behavior, or the meaning/effect of the 'limit' parameter. This leaves the agent reliant on parameter names alone.

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

Purpose5/5

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

The description names a specific action ('Search inside the PDF text'), a clear resource (text already extracted and cached by get_fulltext), and the output shape (snippets with [term] markers). It also distinguishes itself from get_fulltext and other siblings by noting it operates only on cached content, not raw PDFs.

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

Usage Guidelines4/5

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

The description clearly conveys when to use the tool: only after get_fulltext has fetched and cached a document, and only for documents someone previously fetched. It does not explicitly name alternative tools or exclusions (e.g., using search_reports for metadata searches), so it stops short of full when-not guidance.

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

search_reportsA
Read-onlyIdempotent

Search titles, abstracts, subjects, authors and report numbers across all sources.

Args:
    query: Keywords. Quote phrases ("driver improvement"); trailing * = prefix;
        column prefixes work: title:pedestrian, authors:lynn, report_numbers:"813 097".
    year_min / year_max: Inclusive publication-year filter.
    collection: Substring filter on collection name (see list_collections), e.g. "NHTSA",
        "VTI", "BASt", "World Bank", "CEPAL", "TRID", "PubMed".
    doc_type: Substring filter on document type, e.g. "Tech Report", "Dataset".
    source: Comma-separated id prefixes to restrict to, e.g. "dot,vti" (dot = ROSA-P,
        vti, bast, wbokr, ipea, cepal, openalex, cinii, pubmed, trid).
    limit: Max hits (1-100). offset: for paging.
    mode: "hybrid" (default: keyword BM25 fused with semantic vectors when an embedding
        index exists), "keyword", or "semantic" (meaning-based, cross-language). Semantic
        results are capped at 50% from any one source unless `source`/`collection` is
        set; use `source` to search one corpus by meaning. ``mode_used`` says what ran.
Returns ranked hits; ``match_mode`` says whether all query terms matched (all_terms),
the hit came from the any-term fallback, or from the semantic index.
NameRequiredDescriptionDefault
modeNohybrid
limitNo
queryYes
offsetNo
sourceNo
doc_typeNo
year_maxNo
year_minNo
collectionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, the description discloses important runtime behavior: hybrid mode fuses BM25 with semantic vectors, semantic results are capped at 50% from one source, mode_used reports which mode actually ran, and match_mode distinguishes all_terms, any-term fallback, and semantic matches. This is rich, non-obvious behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured as a clear Args list with the purpose front-loaded. It is dense but not wordy, and every sentence adds necessary information such as syntax rules, examples, source mappings, and mode behavior. The length is justified by 9 parameters and no schema-level descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of this search tool, the description covers all parameters, syntax variants, behavioral caveats, and output signals like match_mode and mode_used. An output schema exists, so return-value documentation is not required in the description. Nothing needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description documents every parameter in detail: query syntax with examples, inclusive year filters, substring semantics for collection/doc_type, comma-separated source prefixes with corpus mappings, limit bounds, offset for paging, and mode semantics. It fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The opening sentence names a specific verb ('Search'), a clear resource ('titles, abstracts, subjects, authors and report numbers'), and scope ('across all sources'). It distinguishes this from siblings like search_fulltext, which presumably searches full text, and from lookup/find_similar, which are different operations.

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

Usage Guidelines4/5

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

The description gives extensive usage guidance: query syntax, quoting, prefix wildcards, column prefixes, date filtering, collection/source filtering, mode selection, and paging. It does not explicitly name alternatives or state when not to use this tool, but the context is clear enough for an agent to decide when search_reports is appropriate.

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

whats_newA
Read-onlyIdempotent

Records that entered the index in the last N days (from the weekly incremental harvests), newest first, with counts by source. The raw material for a digest.

NameRequiredDescriptionDefault
daysNo
limitNo
sourceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the safety profile is covered. The description adds meaningful behavior beyond that: ordering by newest first, aggregation by source, and provenance from weekly incremental harvests. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver the core behavior, ordering, grouping, data provenance, and intended use case with no filler. Each clause adds information an agent needs to select and invoke the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, read-only query tool with no required parameters and an output schema present, the description covers the essential semantics: time window, ordering, grouping, and source. It could be more explicit about when to choose this over sibling tools and about the limit parameter, but these are moderate gaps rather than severe ones.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It explains the 'days' parameter via 'last N days' and the 'source' parameter via 'counts by source', but it does not clarify the 'limit' parameter semantics beyond its schema default. Partial compensation, not complete.

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

Purpose4/5

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

The description clearly identifies the resource (records in the index) and the temporal scope (last N days), and adds distinctive details like 'newest first' and 'counts by source' that separate it from generic lookup or search siblings. It lacks an explicit action verb like 'list' or 'retrieve', but the intended behavior is clear enough.

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

Usage Guidelines3/5

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

The phrase 'raw material for a digest' implies when to use this tool, and 'from the weekly incremental harvests' situates it in a specific data flow. However, it does not explicitly state when not to use it or name alternative tools such as search_reports or get_fulltext for other needs.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.5.1
    • First observedexport_citations
    • First observedfind_similar
    • First observedget_citations
    • First observedget_fulltext
    • First observedget_references
    • First observedget_report
    • First observedharvest_status
    • First observedlist_collections
    • First observedlookup
    • First observedsearch_fulltext
    • First observedsearch_reports
    • First observedwhats_new

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct roles: search, metadata retrieval, fulltext extraction, citation lookup, and export. The only real ambiguity is between get_report and lookup, which both accept identifiers and landing URLs, though get_report is specifically for full Dublin Core metadata on ROSA-P records.

Naming Consistency4/5

The majority of tools follow a verb_noun pattern (get_report, search_reports, export_citations, get_citations). Minor deviations include lookup, harvest_status, and whats_new, which are noun-like or less conventional but still readable and not confusing.

Tool Count5/5

Twelve tools is a well-scoped set for a literature discovery and citation-analysis server. Each tool covers a distinct part of the workflow without redundancy or bloat.

Completeness5/5

The surface covers search, retrieval, fulltext access, citation graph exploration, export, collection browsing, and harvest status. For a read-only repository, there are no obvious dead ends or missing core operations.

Maintenance

ActivityStale
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to search a local, fully offline personal document library (Markdown/txt/PDF/docx) via SQLite FTS5 trigram search with subject-terminology expansion, returning every hit with its domain, document title, section path, and page or offset provenance. It also exposes domain statistics, incremental ingestion, and document deprecation as tools, alongside a read-only, runtime-persona-scoped ask/coverage mode.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to search a local folder of Markdown, AsciiDoc, and text files through a SQLite FTS5 keyword index, returning the most relevant sections with file paths, line ranges, and heading breadcrumbs instead of grepping through a repo. It also exposes tools to list indexed documents and refresh the index incrementally, all offline with no dependencies, network calls, or embeddings.
    3
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents and MCP-compatible hosts to search, ask, and retrieve section-level citations from scattered local notes, docs, PDFs, Word files, web pages, org files, and chat logs using hybrid vector and BM25 retrieval.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables agents to run full-text search inside Word, PowerPoint, Excel, PDF, and plain-text files by extracting their contents into a single local SQLite FTS5 index. Exposes tools to search documents with ranked highlighted snippets and human-readable locators, list indexed files, and incrementally build or refresh the index.
    MIT