dot-lit
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 |
| ROSA-P — U.S. DOT National Transportation Library | 90,599 | vollständiges Repository |
| VTI — Swedish National Road and Transport Research Institute (DiVA) | 11,460 | Berichte, Konferenzbeiträge, Artikel; en/sv |
| BASt — German Federal Highway Research Institute (OPUS) | 2,970 | 1,901 mit direkten PDF-Links; de/en |
| World Bank Open Knowledge Repository | 976 | titelgefilterte Teilmenge von 40,332; gemessene Präzision 18/20 |
| IPEA (Brazil) | 207 | gefilterte Teilmenge von 14,400; pt; Präzision ~16/20 |
| CEPAL/ECLAC (Latin America) | 1,165 | gefilterte Teilmenge von 52,199; es/en; Präzision ~15/20 |
| OpenAlex — works typed report in 10 transport topics (global) | 11,448 | Themen: Verkehrs- und Straßensicherheit, Stadtverkehr und Barrierefreiheit, Verkehrsplanung, … |
| CiNii Research (Japan) — articles, theses, IRDB repository items | 118,609 | benötigt eine kostenlose NII-Anwendungs-ID ( |
| PubMed — transport/injury subset (MeSH strategy + 12 journals) | 105,028 | datumsgeschnittene E-utilities-Ernte; |
| TRID exports you 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 |
| Rangfolge-Treffer: id, Titel, Autoren, Jahr, Berichtsnummern, DOI, Landing-URL, Abstract-Auszug, |
| Exakte Übereinstimmung nach DOI, PMID, Berichtsnummer („DOT HS 813 097“), ID oder Landing-URL |
| Vollständiger Metadaten-Datensatz, einschließlich aller rohen Felder, wie geerntet |
| Löst das PDF auf (ROSA-P-Landingpage, BASt/OpenAlex-Direktlinks), extrahiert und cached den Text; Seite mit |
| Durchsucht den gesamten bereits extrahierten PDF-Text mit Auszügen |
| Verwandte Datensätze über Quellen hinweg, nach Titel und Schlagwörtern |
| RIS (Zotero/EndNote/Mendeley) oder BibTeX für eine Liste von IDs |
| 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 |
| Sammlungen und Dokumenttypen mit Zählungen |
| 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: Personal Research Assistant 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 evaluationFü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 |
|
| SQLite-DB, rohe OAI-Seiten ( |
| (nicht gesetzt) | Ihre E-Mail, im User-Agent platziert, damit das Repository Sie kontaktieren kann. Setzen Sie sie. |
|
| Mindestsekunden zwischen ausgehenden Anfragen |
|
| Zeitüberschreitung pro Anfrage (s) |
| 80 MB | Größere PDFs in |
| 600 | Extraktion nach dieser Seitenzahl stoppen |
| (nicht gesetzt) | NII-Anwendungs-ID; erforderlich für die Ernte von CiNii (registrieren Sie sich unter support.nii.ac.jp/en/cinii/api/developer) |
| (nicht gesetzt) | Optional; erhöht die PubMed-E-utilities-Rate von 3 auf 10 Anfragen/s |
| eingebaute Strategie | Ersetzen Sie die PubMed-Suchstrategie |
| fastembed / MiniLM-L12 / 1024 | Semantisches Such-Backend, Modell, Ollama-Trunkierung |
|
| Ollama-Endpunkt für das |
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 backendVerö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 releaseErnte
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 changeWas 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, demresumptionTokenfolgend, bis eine Seite ohne eines ankommt. Nur dann wird der Lauf alscompletemarkiert; jeder Fehler lässt ihnfailedund bewegt den Zeiger „letzte Ernte“ nicht weiter, sodassharvest_statusniemals behauptet, ein partieller Index sei vollständig.Taktung: eine Anfrage pro
TRANSPORT_LIT_MIN_INTERVALSekunden (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 überuntil=fortfahren. Bis zu 8 Wiederherstellungen pro Lauf, dannfailed.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
cursordes 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 inharvest_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 frischesTRANSPORT_LIT_DATA_DIRerfolgt.Caching: jede OAI-Seite wird gzip-komprimiert unter
raw/run<N>-p<page>.xml.gzgespeichert, sodass der Parser geändert und der Index ohne Netzwerkzugriff neu aufgebaut werden kann; PDFs und ihr extrahierter Text werden unterpdf/und in derfulltext-Tabelle zwischengespeichert.from/untilwerden gemäß der deklariertengranularityjedes Repositorys formatiert (ausIdentifygelesen): ROSA-P, DiVA und DSpace akzeptieren vollständigeYYYY-MM-DDThh:mm:ssZ-Zeitstempel, OPUS (BASt) akzeptiert nurYYYY-MM-DDund 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 Siemin_subject_hitsinsources.pyund führen Sietransport-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:
Führen Sie Ihre Suche in TRID durch, wählen Sie Export → RIS (CSV und XML werden ebenfalls angeboten).
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 |
| 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) |
| 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) |
| 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):
dot:18905 — An evaluation of the short-term effects of the Virginia driver improvement program (Lynn) — all_terms
dot:29326 — Review of NJ point system (Carnegie, Ozbay, Mudigonda, 2013; FHWA NJ-2013-004) — all_terms
dot:18959 — …Virginia driver improvement program on negligent driving: 12-month report (Lynn)
dot:18969 — …Virginia driver improvement program on negligent driving: 24-month report (Lynn)
dot:17678 — Study of recidivism rates among drivers administratively sanctioned by the New Jersey MVC (Carnegie et al., 2009)
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:
Schreiben Sie
src/transport_lit/sources/<name>.py, dasharvest(store, *, mode, progress)bereitstellt, das Dictionaries in derselben Form liefert, diedc.parse_recorderzeugt (id,title,authors,year,abstract,report_numbers,doi,landing_url,collections,raw, …) undstore.upsert_records()aufruft. Verwenden Sie ein neues ID-Präfix (nhtsa:812115) und übergeben Sie Ihren eigenensource-Namen anstore.start_run(), damitharvest_statuses separat melden kann.Verwenden Sie
oai.RateLimiterundconfig.USER_AGENTfür die Etikette; speichern Sie rohe Antworten unterraw/<source>/für Reproduzierbarkeit.Geben Sie
harvest.status()einen pro-Quelle-Block (Zählung nachid-Präfix).Fügen Sie eine
--source-Option zutransport-lit harvesthinzu und, falls die Quelle eine eigene Facette hat, einen entsprechenden Filter aufsearch_reports.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 | 7.474 Datensätze, Set | OAI-PMH, | Harvest — Drop-in |
BASt (Deutschland) OPUS | 2.987 Datensätze; Berichte der Bundesanstalt für Straßenwesen | OAI-PMH, | Harvest — Drop-in |
World Bank Open Knowledge Repository | 40.332 Datensätze; 1.787 Treffer für „transport safety"; OAI-Set | OAI-PMH (DSpace 7) + DSpace REST | Alles harvesten, nach Thema filtern; oder REST-Abfrage |
WHO IRIS | 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) | 52.199 Datensätze; keine Themen-Sets | OAI-PMH + DSpace REST | Harvesten und nach Thema filtern |
MTT Chile Biblioteca Digital de Transportes | 5.820 | Offenes Hasura GraphQL unter | Über GraphQL harvestbar; Nutzungsbedingungen zuerst mit MTT klären |
OpenAlex | 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) | 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) | 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 | Datensätze (32 Institutionen, 120+ Länder), PortalJS | Keine API gefunden ( | 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 | 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 ( | 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) | 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)
VTI + BASt(erledigt, v0.2.0) — 2.World Bank OKR, IPEA, CEPAL(erledigt, v0.2.0) —IRDB Japan — 4. OpenAlex
type:reportals globaler Rückhalt — 5. ein PubMed-Transport-Subset (siehe unten). VTI-Hinweis: DiVAsoai_dcenthält keinen Volltextlink; das Umschalten dieser Quelle aufswepub_mods/mets_kbwürdeget_fulltextdieFULLTEXT01.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 semanticembed 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.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Search, fetch (with provenance), scan, and convert AI instruction files for agents.
Search US grants + federal contracts (Grants.gov + SAM.gov) from any LLM.
Search your knowledge bases from any AI assistant using hybrid RAG.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to search and query PDF documents through a local RAG system with vector embeddings. Provides semantic document search capabilities while keeping all data stored locally without external dependencies.
- FlicenseNot gradedqualityDmaintenanceEnables semantic search and conversational querying across a personal research library of PDFs, DOCX, and other documents using a vector database. It provides tools for document summarization, finding related papers, and high-accuracy retrieval for AI clients like Claude Desktop.
- FlicenseAqualityDmaintenanceProvides LLMs with direct access to official vendor PDF documentation for electronics components (TI, ST, ADI) via a local SQLite full-text index and PDF retrieval tools.61
- AlicenseNot gradedqualityCmaintenanceBuilds searchable SQLite databases from PDFs, preserving inline image locations for AI agents to discover and caption visual content. Supports full-text search over text, image placeholders, and saved captions.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/aquistbe/transport-lit'
If you have feedback or need assistance with the MCP directory API, please join our Discord server