A reading list goes in, citable records come out — for two thirds of it. The remaining third is refused by the publishers to any server that asks. What makes the endpoint useful is not the two thirds; it is that it names the third precisely enough to act on.
An agent is handed a list of addresses and asked to prepare them for a
bibliography. For each one it calls extract_citation on this
site's MCP endpoint, which
reads whatever citation data the page declares about itself and returns a
structured record with RIS and BibTeX.
Complete records — authors, year, container, identifier — each with an RIS entry that imports into Citavi, Zotero or EndNote without retyping. A journal article from Springer with five authors, a PLOS article, a PubMed Central paper, an arXiv preprint, a Wikipedia entry, a Zenodo record, and a bare DOI that resolved through the registration agency because the publisher's page refused.
Two of the eight carry no author, because the page declares none. That is the page's gap, not the reader's — and it is reported as an empty field rather than filled in with a guess. A bibliography entry that looks complete and is wrong costs more than one with a visible hole.
| Source | Reason |
|---|---|
www.mdpi.com | http-403 |
www.sciencedirect.com | http-403 |
www.ssoar.info | bot wall served to server-side readers |
eur-lex.europa.eu | near-empty response to server-side readers |
Every one of these was re-fetched from an unrelated network to check the block is real rather than a fault at this end. All four are genuine.
A citation tool that returns something for every URL sounds better and is worse. Fed a bot wall, it produces a reference whose title reads Making sure you're not a bot! — formatted, complete-looking, and worthless. We have measured that happening to an established service on two of eighteen random sources.
A refusal, by contrast, is actionable. The agent can tell its user exactly four addresses to open in a browser, where a capture extension reaches what no server can: the page is loaded in the reader's own session, with the reader's own access. The division of labour is not a workaround — it follows from who is allowed to see what.
curl -X POST https://provinglab.dev/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
"name":"extract_citation",
"arguments":{"url":"https://arxiv.org/abs/1706.03762"}}}'
No key, no account, no rate limit worth mentioning. A record comes back with a
source field saying where the details were read, and a
warning field that is empty when there is nothing to warn about.