Four addresses, one file each: an MCP server that fetches sources and says where they came from

Vier Adressen, je eine Datei: ein MCP-Server, der Quellen holt und sagt, woher sie stammen

A source is two things: the file, and the claim about where it came from. Most tools deliver one of them. Measured on four addresses of increasing difficulty — including one where finding nothing is the correct answer.

Eine Quelle ist zweierlei: die Datei und die Angabe, woher sie stammt. Die meisten Werkzeuge liefern eines davon. Gemessen an vier Adressen steigender Schwierigkeit — darunter eine, bei der nichts zu finden die richtige Antwort ist.

7 September 2026 · 4 addresses, one pass · raw data7. September 2026 · 4 Adressen, ein Durchlauf · Rohdaten

What was measured

An MCP server that takes an address and returns a source: the file the publisher actually serves, the citation metadata of the page describing it, a RIS record, and the full text in a searchable index. Four cases, each carrying a different difficulty. For every case the expected file was established independently beforehand — byte size taken with curl, not from the server under test.

CaseDifficultyResultTime
PDF inside an iframe
zenodo.org/records/22539062
The preview URL ends in .pdf and returns HTML, 7 kB 495,073 B · 25 pages
1 author, year, DOI
1,090 ms
Address without extension
arxiv.org/abs/1706.03762
citation_pdf_url points at /pdf/… with no extension 2,215,244 B · 15 pages
8 authors, year
704 ms
Bare PDF address
arxiv.org/pdf/2303.08774
No HTML page exists — nothing to read metadata from 5,245,564 B · 100 pages
281 authors, year
1,259 ms
A page named PDF
wikipedia.org/wiki/PDF
Named PDF, is not one — must return nothing correctly refused590 ms

23 of 23 checks passed · 7.6 MB in 3.6 s · every file byte-identical to its reference

The three findings that cost the most work

The extension is a claim, not a fact

Zenodo shows its documents in an iframe pointing at …/preview/Title.pdf. The extension is right; the content is not. What comes back is the pdf.js viewer as an HTML page, 7 kB. A file named .pdf containing viewer markup had already been filed as a source before this was caught.

A size threshold does not fix it. The first attempt rejected anything under 5 kB — a guessed number, and the 7 kB viewer page passed straight through. What does fix it is the first five bytes: %PDF- is unambiguous. A range request fetches 512 bytes and settles it before anything is downloaded.

The publisher knows where the file is

Where a page carries citation_pdf_url, that address beats the iframe. On Zenodo the iframe points at /preview/ and the citation tag at /files/ — the same document, one of them real. Preferring the publisher's own statement turned a 7 kB viewer page into a 4.8 MB document.

The year lives in JSON-LD, not in the meta tags

Zenodo publishes no citation_publication_date. The publication year appears only in the schema.org block. Reading citation_* tags alone produced a file called Andres_oJ_…oJ, no year — about a work from 2026. Modern repositories increasingly put their metadata in JSON-LD; a reader that ignores it degrades quietly rather than failing.

Where finding nothing is the answer

The fourth case exists because of a failure mode that no accuracy figure catches: a tool that finds something everywhere finds nothing reliably. wikipedia.org/wiki/PDF is an article about the format. An early pattern treated /pdf at the end of a path as a file — and the encyclopedia article became a document. The rule now requires a path segment with something after it.

What it deliberately cannot do

Connecting it

{ "mcpServers": {
    "quellen": { "command": "python3",
                 "args": ["/path/to/quellen-mcp/server.py"],
                 "env": { "QUELLEN_ORDNER": "/path/to/sources" } } } }

Five tools: quelle_pruefen (does this address serve a PDF, without downloading), quelle_zitation (citation metadata only), quelle_holen (fetch, store, index), bestand_suchen (full-text search), bestand_stand (collection size). The step-by-step sheet for agents is at run-a-source-capture-server.md.

pdftotext and pdfinfo make the full text searchable. Without them a source is stored but not indexed — the reply says so with seiten_durchsuchbar: 0 rather than failing silently.

Method and limits

Four cases are four cases. They were chosen because each carries a distinct difficulty, not because they are representative of the web. Reference sizes were established with curl before the run, independently of the server. Timings come from a single run on a domestic connection and say more about the network than about the code.

What is not measured here: licensed content behind a publisher login, and how the patterns hold against the several hundred site translators that Zotero maintains. On breadth of site coverage, Zotero is ahead and will stay ahead.

Run by the developer of Full Page PDF Snap, the browser extension this server shares its logic with. The extension appears in several measurements on this site; this is disclosed wherever relevant. Found an error in these figures? Corrections are welcome — the raw data is linked above so the run can be repeated.

Was gemessen wurde

Ein MCP-Server, der aus einer Adresse eine Quelle macht: die Datei, die der Anbieter tatsächlich ausliefert, die Zitationsangaben der Seite, die sie beschreibt, einen RIS-Satz und den Volltext in einem durchsuchbaren Index. Vier Fälle, jeder mit einer eigenen Schwierigkeit. Für jeden stand die erwartete Datei vorher fest — die Byte-Größe mit curl ermittelt, nicht vom geprüften Server.

FallSchwierigkeitErgebnisZeit
PDF im Rahmen
zenodo.org/records/22539062
Die Vorschauadresse endet auf .pdf und liefert HTML, 7 kB 495.073 B · 25 Seiten
1 Verfasser, Jahr, DOI
1.090 ms
Adresse ohne Endung
arxiv.org/abs/1706.03762
citation_pdf_url zeigt auf /pdf/… ohne Endung 2.215.244 B · 15 Seiten
8 Verfasser, Jahr
704 ms
Blanke PDF-Adresse
arxiv.org/pdf/2303.08774
Es gibt keine HTML-Seite — nichts, woraus Angaben zu lesen wären 5.245.564 B · 100 Seiten
281 Verfasser, Jahr
1.259 ms
Eine Seite namens PDF
wikipedia.org/wiki/PDF
Heißt PDF, ist keines — muss nichts liefern korrekt verweigert590 ms

23 von 23 Prüfungen erfüllt · 7,6 MB in 3,6 s · jede Datei byteweise gleich ihrer Referenz

Die drei Befunde, die den meisten Aufwand gekostet haben

Die Endung ist eine Behauptung, keine Tatsache

Zenodo zeigt seine Dokumente in einem Rahmen, der auf …/preview/Titel.pdf zeigt. Die Endung stimmt, der Inhalt nicht. Zurück kommt der pdf.js-Betrachter als HTML-Seite, 7 kB. Eine Datei mit .pdf im Namen und Betrachter-Markup darin lag bereits als Quelle im Bestand, bevor das auffiel.

Eine Größenschwelle behebt es nicht. Der erste Versuch wies alles unter 5 kB ab — eine geratene Zahl, und die 7 kB große Betrachterseite ging glatt hindurch. Was es behebt, sind die ersten fünf Bytes: %PDF- ist eindeutig. Ein Bereichsabruf holt 512 Bytes und entscheidet, bevor irgendetwas geladen wird.

Der Anbieter weiß, wo die Datei liegt

Trägt eine Seite citation_pdf_url, schlägt diese Adresse den Rahmen. Bei Zenodo zeigt der Rahmen auf /preview/ und die Zitationsangabe auf /files/ — dasselbe Dokument, eines davon echt. Der Angabe des Anbieters den Vorrang zu geben machte aus einer 7 kB großen Betrachterseite ein Dokument von 4,8 MB.

Das Jahr steht in JSON-LD, nicht in den Meta-Tags

Zenodo veröffentlicht kein citation_publication_date. Das Erscheinungsjahr steht nur im schema.org-Block. Wer allein die citation_*-Tags liest, bekommt eine Datei namens Andres_oJ_…oJ, ohne Jahr — über ein Werk von 2026. Moderne Repositorien legen ihre Angaben zunehmend in JSON-LD ab; ein Leser, der das übergeht, verschlechtert sich still, statt zu scheitern.

Wo nichts zu finden die Antwort ist

Den vierten Fall gibt es wegen eines Fehlers, den keine Trefferquote aufdeckt: Ein Werkzeug, das überall etwas findet, findet nichts Verlässliches. wikipedia.org/wiki/PDF ist ein Artikel über das Format. Ein früheres Muster hielt /pdf am Ende eines Pfades für eine Datei — und aus dem Lexikonartikel wurde ein Dokument. Die Regel verlangt jetzt ein Pfadsegment mit etwas dahinter.

Was er bewusst nicht kann

Einbinden

{ "mcpServers": {
    "quellen": { "command": "python3",
                 "args": ["/pfad/zu/quellen-mcp/server.py"],
                 "env": { "QUELLEN_ORDNER": "/pfad/zu/quellen" } } } }

Fünf Werkzeuge: quelle_pruefen (liefert diese Adresse ein PDF, ohne es zu laden), quelle_zitation (nur die Angaben), quelle_holen (holen, ablegen, indizieren), bestand_suchen (Volltextsuche), bestand_stand (Umfang). Das Schritt-für-Schritt-Blatt für Agenten liegt unter run-a-source-capture-server.md.

pdftotext und pdfinfo machen den Volltext durchsuchbar. Ohne sie wird eine Quelle abgelegt, aber nicht indiziert — die Antwort sagt das mit seiten_durchsuchbar: 0, statt still zu scheitern.

Methode und Grenzen

Vier Fälle sind vier Fälle. Sie wurden gewählt, weil jeder eine eigene Schwierigkeit trägt, nicht weil sie für das Netz repräsentativ wären. Die Referenzgrößen wurden vor dem Lauf mit curl ermittelt, unabhängig vom Server. Die Zeiten stammen aus einem einzigen Durchgang an einem Hausanschluss und sagen mehr über das Netz als über den Code.

Was hier nicht gemessen ist: lizenzpflichtige Inhalte hinter einer Verlagsanmeldung, und wie sich die Muster gegen die mehreren hundert Seiten-Übersetzer halten, die Zotero pflegt. In der Breite der Seitenabdeckung liegt Zotero vorn und wird vorn bleiben.

Betrieben vom Entwickler von Full Page PDF Snap, der Browser-Erweiterung, mit der dieser Server seine Logik teilt. Die Erweiterung kommt in mehreren Messungen auf dieser Seite vor; das wird überall dort angegeben, wo es sachdienlich ist. Ein Fehler in diesen Zahlen? Korrekturen sind willkommen — die Rohdaten sind oben verlinkt, der Lauf lässt sich wiederholen.