LibCorpus API

Version 1.0.0 · OpenAPI 3.1 document at /openapi.json

LibCorpus serves the figure data of open-access papers in quantum science and technology. Every plotted panel is a CSV with its columns, provenance and licence; every paper and panel has a stable page, a Markdown digest and a JSON record.

No key, no registration. Requests from any origin are answered (CORS). The machine-facing routes share a ceiling of 600 requests a minute per client; beyond it the server answers 429 with a Retry-After header.

Stability: the v1 URL shapes and the fields of their responses do not change. Fields may be added. Data stays under the licence shown on each paper's page; cite the original paper and give the panel's URL.

A plain-text guide for language models is at https://libcorpus.org/llms.txt. The same corpus is available as a tool for AI assistants over the Model Context Protocol at https://libcorpus.org/mcp (Streamable HTTP, stateless, no authentication): add that address as a remote MCP server in Claude, ChatGPT, Cursor or any MCP client and it gains search_papers, list_papers, get_paper, get_panel, get_panel_data and cite.

Start here

  1. Find the paper: GET /api/v1/search?q=… with words, a DOI or an arXiv id, or list everything with GET /api/v1/papers.
  2. Read it: GET /api/v1/papers/{paperId} gives every figure and panel with descriptions and file URLs.
  3. Plot a panel: GET /api/v1/papers/{paperId}/figures/{fig}/panels/{panel} for the columns and their roles, then the data_csv link for the values.
import pandas as pd
url = "https://libcorpus.org/api/v1/papers/LCP000001/figures/fig2/panels/a/data.csv"
df = pd.read_csv(url, comment="#")   # the # lines are the provenance header
df.plot.scatter(x=df.columns[0], y=df.columns[1])

Prefer to hand a model the whole thing as text? Every paper is at /paper/{paperId}.md, and /llms.txt explains the library in one page.

Connect an AI assistant

LibCorpus is also an MCP server (Model Context Protocol) at https://libcorpus.org/mcp. Added once, an assistant gains tools to search the corpus, read a paper or a panel, pull a panel's data and cite the paper. No key: choose "no sign-in" or "no authentication" wherever a client asks.

Claude (claude.ai, Claude Desktop)Settings, then Connectors (Pro and Max: Customize, then Connectors). Add, then Add custom connector. Name it LibCorpus, enter https://libcorpus.org/mcp, choose No sign-in, save. In a chat, turn the connector on under tools.
Claude Codeclaude mcp add --transport http libcorpus https://libcorpus.org/mcp
ChatGPT (Plus, Pro, Business, Enterprise, Edu)Settings, then Apps & Connectors, then Advanced settings: turn on Developer mode. Back in Apps & Connectors, Create: name LibCorpus, URL https://libcorpus.org/mcp, no authentication. Pick it under Tools in a chat.
Cursor, VS Code, WindsurfAdd to the editor's mcp.json: {"mcpServers": {"libcorpus": {"url": "https://libcorpus.org/mcp"}}}

Then ask, for example: "Using LibCorpus, find papers about Rydberg atoms, pick one, list its figures, and plot the first data-backed panel." The tools are search_papers, list_papers, get_paper, get_panel, get_panel_data and cite; the endpoint is described under text below.

papers

The corpus and one paper at a time.

GET/api/v1

Entry point

200Links to the corpus, the search and the documentation. application/json
curl https://libcorpus.org/api/v1

GET/api/v1/papers

List every paper in the corpus

200Every published paper, newest first, with counts and links. application/json PaperSummary
curl https://libcorpus.org/api/v1/papers

GET/api/v1/papers/{paperId}

One paper with every figure and panel Everything about a paper in one call: metadata, abstract, licence, citation, and each figure with its panels, their descriptions, file URLs and links. Use this first; then fetch the panel record or the CSV you need.

paperId path, requiredLibCorpus paper id, for example LCP000001.
200The paper. application/json Paper
404Not found. application/json
curl https://libcorpus.org/api/v1/papers/LCP000001

GET/doi/{doi}

Resolve a DOI to its paper page Redirects (302) to /paper/{paperId}. /arxiv/{arxivId} does the same for an arXiv identifier, with or without a version suffix.

doi path, requiredThe bare DOI, for example 10.1038/s41534-026-01329-5.
302Redirect to the paper page.
404No paper with this DOI (the site's not-found page).
curl https://libcorpus.org/doi/10.1038/s41534-026-01329-5

GET/api/paper/{paperId}/pdf

The paper's PDF The package's own copy when the licence allows redistribution, otherwise the arXiv PDF served through the site.

paperId path, requiredLibCorpus paper id, for example LCP000001.
200PDF. application/pdf
404No PDF available.
curl https://libcorpus.org/api/paper/LCP000001/pdf

GET/api/health

What this instance serves

200Status, data branch and commit, paper count. application/json
curl https://libcorpus.org/api/health

panels

One panel: what it plots, its columns, its files.

GET/api/v1/papers/{paperId}/figures/{fig}/panels/{panel}

One panel: columns, files, licence, citation What an agent needs to plot the panel: its description, plot type, the columns with their roles (x, y, z, error, band) and the symbols as plotted, the panel's meta.json, and every file with its size and sha256.

paperId path, requiredLibCorpus paper id, for example LCP000001.
fig path, requiredFigure id as in the paper's figure list: fig1, fig2, extfig1.
panel path, requiredPanel id within the figure: a, b, c, or a compound id such as d-inset.
200The panel. application/json Panel
404Not found. application/json
curl https://libcorpus.org/api/v1/papers/LCP000001/figures/fig2/panels/a

files

The panel's files as files: CSV, JSON, SVG.

GET/api/v1/papers/{paperId}/figures/{fig}/panels/{panel}/data.csv

The panel's plotted values as CSV The values as plotted, in the panel's own layout, which varies: most panels are wide tables, one row per x value and one column per series (a trace matrix can have thousands of columns); heatmaps and surfaces are long tables, one row per grid point; series panels name which columns belong to which series. The panel record (columns, with each column's role) and meta.json (data_format, series) say which layout a file uses. The file begins with # comment lines naming the paper, panel, source, DOI, licences, package version and provenance route; readers that honour a comment character skip them (pandas read_csv(url, comment="#"), R read.csv(url, comment.char="#"), numpy loadtxt). Column names and roles are in the panel record.

paperId path, requiredLibCorpus paper id, for example LCP000001.
fig path, requiredFigure id as in the paper's figure list: fig1, fig2, extfig1.
panel path, requiredPanel id within the figure: a, b, c, or a compound id such as d-inset.
200CSV, UTF-8. text/csv
404No such panel, or the panel has no data file (a schematic).
curl https://libcorpus.org/api/v1/papers/LCP000001/figures/fig2/panels/a/data.csv

GET/api/v1/papers/{paperId}/figures/{fig}/panels/{panel}/files/{file}

Any other file of the panel overlay.csv (a fit or model drawn over the data), meta.json (column roles, axis symbols, ranges, series), panel.svg (a schematic). CSV and JSON files carry the same provenance header as data.csv (in JSON, under the _libcorpus key).

paperId path, requiredLibCorpus paper id, for example LCP000001.
fig path, requiredFigure id as in the paper's figure list: fig1, fig2, extfig1.
panel path, requiredPanel id within the figure: a, b, c, or a compound id such as d-inset.
file path, requiredFile name as listed in the panel record's files.
200The file, with its own content type. text/csv, application/json, image/svg+xml
404Not found. application/json
curl https://libcorpus.org/api/v1/papers/LCP000001/figures/fig2/panels/a/files/meta.json

Find a paper or a panel.

Search papers and panel descriptions Ranks like the site's search box: an identifier (LCP id, DOI, arXiv id, with or without prefix or link) first, then title, authors, abstract, then panel descriptions. Matching panels are listed on each result.

q query, requiredWords, or an identifier.
limit query
200Ranked results. application/json SearchResult
400q missing.
curl https://libcorpus.org/api/v1/search?q=Rydberg

citations

Ready-made citations.

GET/api/v1/papers/{paperId}/citation.bib

BibTeX entry for the paper

paperId path, requiredLibCorpus paper id, for example LCP000001.
200One @article or @misc entry. application/x-bibtex
404Not found.
curl https://libcorpus.org/api/v1/papers/LCP000001/citation.bib

GET/api/v1/papers/{paperId}/citation.json

CSL-JSON record for the paper

paperId path, requiredLibCorpus paper id, for example LCP000001.
200A CSL-JSON item (Zotero, citeproc). application/vnd.citationstyles.csl+json
404Not found.
curl https://libcorpus.org/api/v1/papers/LCP000001/citation.json

text

Plain-text and Markdown views for language models.

GET/llms.txt

Guide for language models What LibCorpus is, how to read a paper and fetch a panel, and the list of papers with links to their Markdown digests. /llms-full.txt holds every paper's digest in one file.

200Plain text. text/plain
curl https://libcorpus.org/llms.txt

GET/paper/{paperId}.md

One paper as Markdown Metadata, abstract and every figure and panel with its description, columns and file URLs. The HTML address /paper/{paperId} answers the same when asked with Accept: text/markdown. A panel has its own digest at /paper/{paperId}/fig/{fig}/panel/{panel}.md.

paperId path, requiredLibCorpus paper id, for example LCP000001.
200Markdown. text/markdown
404Not found.
curl https://libcorpus.org/paper/LCP000001.md

POST/mcp

MCP server (Model Context Protocol, Streamable HTTP) LibCorpus as a tool for AI assistants. Stateless JSON-RPC over POST, no authentication; GET and DELETE answer 405. Tools: search_papers, list_papers, get_paper (JSON or Markdown; one figure with figure), get_panel, get_panel_data (CSV text, whole rows up to max_rows; chosen columns with columns), cite (text, BibTeX, CSL-JSON). Every answer is held under about 40,000 characters so it fits an assistant's context; a shortened answer says what it left out and gives the address of the whole file or record. Add the address as a remote MCP server in Claude, ChatGPT, Cursor or any MCP client.

200The JSON-RPC response. application/json
curl -X POST https://libcorpus.org/mcp \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Schemas

LicenseRef

fieldtype
namestring e.g. CC BY 4.0
urlstring | null

PaperSummary

fieldtype
idstring e.g. LCP000001
titlestring | null
authorsarray of string
yearinteger | null
venuestring | nullJournal abbreviation, or arXiv.
doistring | null
arxiv_idstring | null
licensestring | null
figure_countinteger | nullFigures with at least one data-backed panel.
panel_countinteger | nullData-backed panels.
data_pointsinteger | nullValues across the paper's CSVs.
date_addedstring | null
linksobjectAbsolute URLs of related resources.

Paper

fieldtype
idstring
titlestring | null
authorsarray of string
abstractstring | null
yearinteger | null
primary_sourcestring | nullWhich source the stored data was taken from.
doistring | null
arxiv_idstring | null
sourcesobjectThe paper's journal and arXiv records as stored (doi, journal, volume, pages, url; arxiv_id, version, url).
licenseobject
data_package_versioninteger | nullBumped when the package is re-released; printed in every CSV header.
data_pointsinteger | null
citationobject
figure_countinteger
panel_countinteger
figuresarray of Figure
linksobjectAbsolute URLs of related resources.

Figure

fieldtype
idstring e.g. fig2
labelstring e.g. Fig. 2
statusstringdata when panels are present; otherwise no_data, data_unavailable, data_ambiguous or pending (the figure is in the PDF only).
panelsarray of PanelSummary

PanelSummary

fieldtype
idstring e.g. a
typestring | nullplot or schematic.
plot_typestring | null e.g. series_1d, heatmap_2d, layered_2d
representationstringdata (CSV-backed), image (SVG with a description) or structured.
descriptionstring | nullOne-line summary of what the panel shows, written for humans and machines.
filesarray of FileRef
linksobjectAbsolute URLs of related resources.

FileRef

fieldtype
namestring e.g. data.csv, overlay.csv, meta.json
kindstring e.g. data, overlay, meta, image
labelstring | nullWhat a secondary file holds, in the paper's words where its meta layer is named (panel record only). e.g. analytical sol.
urlstring
bytesinteger | nullSize of the file as served, before the provenance header (panel record only).
sha256string | nullHash of the file as served, before the provenance header (panel record only). Identical to the data repository's copy for data files.

Column

fieldtype
namestringCSV column name.
rolestring | null e.g. x, y, z, error, band lower, band upper
symbolstring | nullThe quantity as plotted, LaTeX where the paper uses it.
filestringWhich file the column is in.

Panel

fieldtype
paperobjectThe paper: id, title, authors, year, doi, arxiv_id, data_package_version, links.
figureobject
panelobject
columnsarray of Column
metaobject | nullThe panel's meta.json as stored (libcorpus.plotmeta): plot type, ranges, series, colormaps.
filesarray of FileRef
licenseobject
citationobject
linksobjectAbsolute URLs of related resources.

SearchResult

fieldtype
idstring e.g. LCP000001
titlestring | null
authorsarray of string
yearinteger | null
venuestring | nullJournal abbreviation, or arXiv.
doistring | null
arxiv_idstring | null
licensestring | null
figure_countinteger | nullFigures with at least one data-backed panel.
panel_countinteger | nullData-backed panels.
data_pointsinteger | nullValues across the paper's CSVs.
date_addedstring | null
linksobjectAbsolute URLs of related resources.
matchstring
matching_panelsarray of object