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
Find the paper: GET /api/v1/search?q=… with words, a DOI or an arXiv id, or list everything with GET /api/v1/papers.
Read it: GET /api/v1/papers/{paperId} gives every figure and panel with descriptions and file URLs.
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 Code
claude 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, Windsurf
Add 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
200
Links 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
200
Every published paper, newest first, with counts and links. application/jsonPaperSummary
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.
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.
doipath, required
The bare DOI, for example 10.1038/s41534-026-01329-5.
302
Redirect to the paper page.
404
No paper with this DOI (the site's not-found page).
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.
paperIdpath, required
LibCorpus paper id, for example LCP000001.
figpath, required
Figure id as in the paper's figure list: fig1, fig2, extfig1.
panelpath, required
Panel id within the figure: a, b, c, or a compound id such as d-inset.
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.
paperIdpath, required
LibCorpus paper id, for example LCP000001.
figpath, required
Figure id as in the paper's figure list: fig1, fig2, extfig1.
panelpath, required
Panel id within the figure: a, b, c, or a compound id such as d-inset.
200
CSV, UTF-8. text/csv
404
No such panel, or the panel has no data file (a schematic).
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).
paperIdpath, required
LibCorpus paper id, for example LCP000001.
figpath, required
Figure id as in the paper's figure list: fig1, fig2, extfig1.
panelpath, required
Panel id within the figure: a, b, c, or a compound id such as d-inset.
filepath, required
File name as listed in the panel record's files.
200
The file, with its own content type. text/csv, application/json, image/svg+xml
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.
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.
200
Plain 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.
paperIdpath, required
LibCorpus paper id, for example LCP000001.
200
Markdown. text/markdown
404
Not 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.