Read PDF Out Loud for AI assistants
Connect Read PDF Out Loud to an AI assistant, and it can add PDFs to your library, read their clean text and summaries, and send you a link to listen in a natural voice with every word highlighted.
https://readpdfoutloud.com/mcpConnect your assistant
- In your assistant, add Read PDF Out Loud from its connector directory, or add a custom connector (an MCP server) with the address
https://readpdfoutloud.com/mcp. - Sign in with Google or with a link sent to your email, as you do on the site. New here? That creates your free account.
- Check what the assistant asks to do, then press Allow.
Disconnect it at any time from Connected apps in the account menu on readpdfoutloud.com.
It reads PDFs the way the site does: running headers, page numbers, footnotes, citation numbers and the reference list are left out, two-column pages are read in order, and equations are written the way you'd say them. PDFs your assistant adds are in your library, ready to listen to on any device.
Things to ask
- “Add this paper to Read PDF Out Loud so I can listen on my commute: https://arxiv.org/abs/1706.03762”
- “What do the figures in the paper I just added show?”
- “Summarize section 3 of the report I added yesterday, with page numbers.”
- “Give me a link to listen to the results section.”
- “Pick up the paper I was listening to where I left off.”
- “How many pages do I have left this month?”
For developers
The connector is a remote MCP server. It holds no session, answers every request with plain JSON, and speaks both the current protocol and the handshake-based versions most clients still use.
| What | Details |
|---|---|
| Transport | Streamable HTTP: POST https://readpdfoutloud.com/mcp, one JSON-RPC message a request, answered with application/json. There are no event streams or sessions, so GET and DELETE answer 405. |
| Protocol versions | 2026-07-28 (version and capabilities in each request's _meta, mirrored in the MCP-Protocol-Version, Mcp-Method and Mcp-Name headers; server/discover), and 2025-11-25, 2025-06-18 and 2025-03-26 (initialize first). |
| Authorization | OAuth 2.1 authorization code flow with PKCE (S256), following the MCP authorization spec. A request without a valid token gets 401 with WWW-Authenticate pointing at the protected resource metadata. |
| Registering your app | A Client ID Metadata Document (your client_id is the https address of your app's metadata, with token_endpoint_auth_method none), or Dynamic Client Registration at /oauth/register for public or confidential clients. Redirect URIs must match exactly and be https, http://localhost or 127.0.0.1, or your app's own scheme. |
| Tokens | Send Authorization: Bearer … with every request. Access tokens last an hour. Refresh tokens last 60 days and are replaced each time they're used; a refresh token used twice disconnects the app. Tokens are issued for https://readpdfoutloud.com/mcp (the resource parameter) and work nowhere else. |
Endpoints
| Endpoint | Address |
|---|---|
| MCP | https://readpdfoutloud.com/mcp |
| Protected resource metadata | https://readpdfoutloud.com/.well-known/oauth-protected-resource/mcp |
| Authorization server metadata | https://readpdfoutloud.com/.well-known/oauth-authorization-server |
| Authorization | https://readpdfoutloud.com/oauth/authorize |
| Token | https://readpdfoutloud.com/oauth/token |
| Registration | https://readpdfoutloud.com/oauth/register |
| Revocation | https://readpdfoutloud.com/oauth/revoke |
Scopes
| Scope | Lets the app | Tools |
|---|---|---|
documents:read | See the library and read PDFs' text, contents and summaries | get_document, list_documents, get_text, get_contents, get_summaries |
documents:write | Add PDFs (they count toward the month's pages) and delete them | add_pdf, delete_document |
account:read | See the plan and the pages used this month | get_account |
An app that asks for no scope gets all three. Calling a tool without its scope answers 403 with error="insufficient_scope" and the scope to ask for.
A request
curl https://readpdfoutloud.com/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/call" \
-H "Mcp-Name: get_account" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "get_account", "arguments": {},
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {}}}}'
Tools
| Tool | What it does |
|---|---|
add_pdf | Adds a PDF to the library from a link or a file, and starts reading it |
get_document | Says whether a PDF is ready, how long it takes to listen to, and where to listen |
list_documents | Lists the library, most recently used first |
get_text | Returns the clean text, with its structure or as it's read aloud |
get_contents | Returns the table of contents, with a link to listen from each entry |
get_summaries | Returns summaries of figures, tables, code and equations |
delete_document | Deletes a PDF from the library |
get_account | Returns the plan and the pages used this month |
Every result is structured JSON matching the tool's output schema, repeated as text for clients that read only text. Page numbers are the PDF's own, starting at 1.
add_pdf
Adds a PDF to the library and starts reading it. It answers at once; a typical paper takes a minute or two, and get_document says when it's ready.
| Parameter | Description |
|---|---|
url | A direct https link to a PDF, or an arXiv abstract page such as https://arxiv.org/abs/1706.03762 |
file | A file the user attached, as {"download_url", "file_id"} (how ChatGPT passes files) |
content_base64, filename | The PDF itself, base64-encoded, when there's no link |
title | Optional: the name to show in the library. By default, the title found in the PDF |
- Give exactly one of
url,fileorcontent_base64. Links must lead straight to a PDF; other web pages aren't read. - Links are fetched from Read PDF Out Loud's servers: public https addresses only, up to 3 redirects and 30 seconds.
- A new PDF's pages count toward the month's allowance when it's added, as on the site. Adding a PDF that's already in the library returns it, and nothing is counted again (
already_in_library).
{
"document_id": "3f9c2a71b8d0",
"title": null,
"filename": "1706.03762.pdf",
"pages": 15,
"status": "queued",
"text_ready": false,
"summaries": {"done": 0, "total": 0},
"words": null,
"listening_minutes": null,
"listen_url": "https://readpdfoutloud.com/#/doc/3f9c2a71b8d0/p/1",
"resume_url": null,
"last_page": null,
"added_at": "2026-09-30T09:12:04Z",
"error": null,
"check_again_in_seconds": 10,
"already_in_library": false
}
get_document
Takes a document_id and returns the fields above (without already_in_library):
| Field | Description |
|---|---|
status | queued, reading, narrating, explaining (writing summaries), ready or failed |
text_ready | True once the text, contents and links work. Summaries may still be coming |
summaries | How many summaries are written, of how many |
words, listening_minutes | The length of what's read aloud, and how long it takes to hear at normal speed |
listen_url, resume_url | Open the PDF in the reader at page 1, or where the user left off |
error | What went wrong, in plain words, when status is failed |
check_again_in_seconds | While it's being read: when to ask again |
list_documents
Lists the library, most recently used first. query keeps PDFs whose title or file name contains it; limit is 1 to 50 (10 by default). Each entry has document_id, title, filename, pages, status, text_ready, added_at and last_page; total counts every match.
get_text
| Parameter | Description |
|---|---|
document_id | Required |
pages | A page ("3") or a range ("2-5"). Default: the whole document |
format | markdown (default): headings, lists, tables, equations in LaTeX, and a <!-- page N --> marker before each page, best for answering questions and citing pages. spoken: exactly what the voice reads, with equations in words |
include_summaries | Add each figure's, table's and equation's summary where it appears. Default false |
max_characters | 2,000 to 60,000; 20,000 by default |
Text stops at the end of the page before the limit, and next_pages says which pages to ask for next (null at the end). A single page longer than the limit is cut at a paragraph, with truncated true. Before the text is ready, it answers not_ready.
For example, page 4 of “Attention Is All You Need”, asked for with "pages": "4" and "format": "spoken" (text shortened):
{
"document_id": "3f9c2a71b8d0",
"title": "Attention Is All You Need",
"format": "spoken",
"pages_included": "4",
"next_pages": null,
"page_count": 15,
"truncated": false,
"summaries_complete": true,
"characters": 2425,
"text": "Figure 2: (left) Scaled Dot-Product Attention. … We compute the matrix of outputs as:\n\nAttention of Q, K and V, equals softmax of the fraction Q times K transpose, over square root of d sub k, V. …"
}
get_contents
Takes a document_id and returns entries, each with its title, level (1 is the top), page and a listen_url that opens the reader there. The contents come from the PDF's own outline when it has one, and from its headings otherwise.
get_summaries
Takes a document_id and optional pages, and returns items in reading order, each with its page, kind (figure, chart, table, code, algorithm or equation), label (such as “Figure 2”), caption and summary. complete is false while summaries are still being written.
delete_document
Takes a document_id and deletes the PDF with everything made from it. It can't be undone, and pages already counted this month aren't given back. Assistants should confirm with the user first.
get_account
Returns the account's email, plan, pages_used this month, pages_allowance and pages_left, and the date the allowance resets_on.
Limits
| What | Limit |
|---|---|
| A PDF | Up to 200 pages and 20 MB |
| Pages added a month | 500 on the free plan, counted when a PDF is added |
| PDFs added an hour | 8 |
| Tool calls | 120 a minute |
| Language | English |
Errors
When a tool can't do what was asked, its result has isError set and carries {"error": {"code", "message", …}}: a sentence to show the user, and a code for the assistant.
| Code | Meaning |
|---|---|
invalid_arguments | A parameter is missing or wrong; the message says which |
invalid_url | The link isn't a public https link |
not_a_pdf | The link or file isn't a PDF |
too_large | Over 200 pages or 20 MB |
fetch_failed | The PDF couldn't be downloaded; try again later |
not_found | There's no such PDF in this library |
not_ready | The text isn't ready yet; ask again after check_again_in_seconds |
failed | Reading the PDF failed; the message says why |
busy | The PDF is still being read, so it can't be deleted yet |
limit_reached | This month's pages are used up; resets_on says when they come back |
rate_limited | Too many requests; wait retry_after_seconds |
paused | Adding PDFs is paused for a little while; try again later |
If the connection has expired or been removed, requests are refused with 401 and the assistant asks the user to connect again.
Privacy
- An assistant you connect sees only your library, and only what you allowed.
- PDFs it adds are private to your account, like everything else in your library.
- We don't sell your data, and we don't use your documents to train AI models.
- Disconnect an assistant from Connected apps, or delete your account and everything in it, at any time.
The privacy policy and terms cover the connector.
Support and changes
Questions, or building on the connector? Write to support@readpdfoutloud.com.
- 1.0: the eight tools above.