PDF to Markdown

by Unknown

Not rated
Website

About

Hosted MCP server that converts PDFs into clean, LLM-ready Markdown with tables, formulas (LaTeX) and OCR. Own engines (MinerU + Docling), not an LLM wrapper.

Details

Author
Unknown
Categories
Productivity, Other

Hosted MCP server that converts PDFs into clean, LLM-ready Markdown with tables, formulas (LaTeX) and OCR. Own engines (MinerU + Docling), not an LLM wrapper.

Pick the integration that fits. Both call the same conversion engine and obey the same slots, limits and retention.

HTTPS endpoints with a bearer API key. Stable DTOs, predictable errors, idempotent create.

A managed Model Context Protocol endpoint exposing conversion as agent tools – a thin wrapper over the same API.

Import a reduced OpenAPI spec into a ChatGPT Custom GPT so it can convert PDFs as a built-in tool.

The API and MCP use bearer API keys – distinct from the device-signed path the Chrome extension uses. A free Google account is required to generate keys.

Keys, not passwords.The extension stays anonymous and device-signed; API/MCP keys are a separate, account-bound credential.

HTTPS only.Always send keys over TLS; never embed a key in client-side code shipped to users.

Idempotent create.An optionalIdempotency-Keyon create lets you retry safely without duplicate jobs.

Scopes.Each API key carries scopes:jobs:create,jobs:read,jobs:download,jobs:delete(the defaults), plussettings:read/settings:write. Mint least-privilege keys; the REST API and MCP tools both enforce the key's scopes.

Create a job, wait, fetch Markdown, clean the slot

One predictable lifecycle, two ways to drive it: call theREST APIfrom your own code, or use the equivalenthosted MCPtools. Never claim a result beforestatus=ready.

POST a PDF URL or upload bytes. Get back a job id and slot.Idempotency-Keyis honored but optional.

POST /api/v2/jobsmcp · pdf_to_markdown_create_job_from_url

Poll the job untilreadyorerror, or register a signed webhook on paid tiers instead of polling.

GET /api/v2/jobs/{id}mcp · pdf_to_markdown_get_job

Download the result once ready. Readtruncatedandpagesto know if a long document was returned partially.

GET /api/v2/jobs/{id}/downloadmcp · pdf_to_markdown_get_markdown

Free a slot when you're done. Deleting queued or processing jobs is destructive – confirm it in user-facing clients.

DELETE /api/v2/jobs/{id}mcp · pdf_to_markdown_delete_job

# 1. create a job from a PDF URL curl -X POST https://pdf2md.dev/api/v2/jobs \ -H "Authorization: Bearer p2m_…" \ -H "Content-Type: application/json" \ -d '{"url":"https://example.com/report.pdf"}' # → { "job_id": "job_9f3c…", "status": "queued" } # 2. poll status curl https://pdf2md.dev/api/v2/jobs/job_9f3c… \ -H "Authorization: Bearer p2m_…" # → { "status": "ready", "pages": 24, "truncated": false } # 3. fetch the Markdown curl https://pdf2md.dev/api/v2/jobs/job_9f3c…/download \ -H "Authorization: Bearer p2m_…" # 4. free the slot curl -X DELETE https://pdf2md.dev/api/v2/jobs/job_9f3c… \ -H "Authorization: Bearer p2m_…"

Errors.Responses use stable shapes and predictable HTTP codes (400bad input,401auth,404unknown job,409no free slot /slots_full,413too large,429rate limited). The full schema lives in theOpenAPI spec.

Create from file (multipart)POST /api/v2/jobs

Batch create (paid)POST /api/v2/jobs/batch

Create accepts a JSONurlor a multipartfile, plus optionalfile_name,external_id,tagsandcallback_url/callback_secretfor a per-job webhook. Batch create is all-or-nothing and must fit your free slots.

statusqueued · processing · ready · error

error_code · error_messagereason (when error)

Account & usage.Check your tier, limits and usage at runtime withGET /api/v2/me,/api/v2/limitsand/api/v2/usage; manage keys at/api/v2/api-keysand webhooks at/api/v2/webhooks.

The same four calls from any language. Here it is withrequests. For a full step-by-step walkthrough with error handling, see thePython tutorial.

# pip install requests import time, requests API = "https://pdf2md.dev/api/v2" H = {"Authorization": "Bearer p2m_…"} # 1. create a job from a PDF URL (or post a file with files={"file": ...}) job = requests.post(f"{API}/jobs", headers=H, json={"url": "https://example.com/report.pdf"}).json() jid = job["job_id"] # 2. poll until ready (or register a webhook instead) while True: j = requests.get(f"{API}/jobs/{jid}", headers=H).json() if j["status"] in ("ready", "error"): break time.sleep(3) # 3. download the Markdown md = requests.get(f"{API}/jobs/{jid}/download", headers=H).text print(md)
# multipart upload of a local PDF curl -X POST https://pdf2md.dev/api/v2/jobs \ -H "Authorization: Bearer p2m_…" \ -F "[email protected]" \ -F "file_name=document.pdf"
// create from URL, poll, download const API = "https://pdf2md.dev/api/v2"; const H = { Authorization: "Bearer p2m_…" }; let job = await (await fetch(\${API}/jobs\, { method: "POST", headers: { ...H, "Content-Type": "application/json" }, body: JSON.stringify({ url: "https://example.com/report.pdf" }) })).json(); while (job.status === "queued" || job.status === "processing") { await new Promise(s => setTimeout(s, 2000)); job = await (await fetch(\${API}/jobs/${job.job_id}\, { headers: H })).json(); } if (job.status === "ready") { const md = await (await fetch(\${API}/jobs/${job.job_id}/download\, { headers: H })).text(); console.log(md); }

Webhook signature verification is in theWebhookssection; the MCP client config is in theMCPsection. Full schema:OpenAPI.

Connect a compatible agent to our managed MCP endpoint. The tools are a thin wrapper over the REST API, so every call obeys the same slots, limits and retention.

JSON-RPC 2.0 over Streamable HTTP with your API key as the bearer token. No local server to run. Methods:initialize,tools/list,tools/call,ping.

The same lifecycle plus limits, exposed as seven tools. Each respects the key's scopes;tools/callresponses includeslot_usageandtier.

create_job_from_url · create_job_from_upload (jobs:create) list_jobs · get_job (jobs:read) get_markdown (jobs:download) · delete_job (jobs:delete) get_limits

Wait forreadybefore using output; confirm before deleting queued/processing jobs; handletruncatedand429 Retry-After. (Tool names are prefixedpdf_to_markdown_.)

// MCP client config (hosted, no local process) { "mcpServers": { "pdf2md": { "url": "https://pdf2md.dev/api/v2/mcp", "headers": { "Authorization": "Bearer p2m_…" } } } }

We publish two specs: the full OpenAPI for developers, and a reduced action spec with the safe, minimal subset for AI clients and ChatGPT Custom GPT Actions.

The complete contract: every endpoint, parameter, DTO and error. Generate clients or explore it in your tooling.

A minimal action subset (create, status, fetch) for ChatGPT Custom GPT Actions. Import the URL, set your API key as the auth, and your GPT converts PDFs natively.

The reduced spec is a convenience for AI clients, not a security boundary – the same auth, scopes and limits apply as on the full API.

Per-tier limits, applied to API and MCP alike

Limits come from your tier and apply identically across every surface. Live values are on thepricing page.

Paid tiers raise slots, file size, time budget, retention and rate limits, and add webhooks and batch create.Compare plans →

Per-tier rate limits.Requests are rate limited per key; exceed them and you get429with aRetry-Afterheader – back off and retry.

Slot pressure.If all slots are busy, create returns409. Free a slot with delete, or wait for a job to finish.

Priority on paid.Paid jobs run with higher queue priority on a dedicated paid conversion pool, so they don't wait behind the free backlog.

On paid tiers, register a signed webhook (or pass a per-jobcallback_url) and we POST you on every notable terminal event:job.ready,job.error,job.truncatedandjob.deleted. The event is a notification, not a delivery: it carries no document content, so fetch the Markdown over the API after you receive it.

We POST JSON with headersX-P2M-Event,X-P2M-Timestamp,X-P2M-DeliveryandX-P2M-Signature.

Recompute the signature, ack with2xx, and be idempotent (deliveries can retry with backoff). Then download the Markdown.

# delivery → your endpoint X-P2M-Event: job.ready X-P2M-Timestamp: 1718900000 X-P2M-Signature: sha256=9a8b7c… { "event": "job.ready", "job": { "job_id": "job_9f3c…", "status": "ready", "pages": 24, "truncated": false, "download_url": "/api/v2/jobs/job_9f3c…/download" } } # verify (Python): signature = sha256= + hex(HMAC(secret, "ts.rawbody")) import hmac, hashlib def verify(secret, ts, raw_body, sig): expected = "sha256=" + hmac.new( secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, sig)

Drop these rules into an agent's system prompt so it drives the tools correctly and never invents results.

Never claim or summarize a result beforestatus=ready. Whilequeuedorprocessing, keep polling or wait for the webhook.

Deleting aqueuedorprocessingjob is destructive. Ask the user before callingpdf_to_markdown_delete_jobon a non-finished job.

Iftruncated=true, tell the user the document was returned partially up to the tier time budget, and offer a higher tier or splitting the file.

On429, wait forRetry-Afterseconds before retrying. Don't hammer the queue.

Delete finished jobs you no longer need so you don't exhaust your slots.

Start from/llms.txtand the OpenAPI spec rather than guessing endpoints from prose.

Universal document generation and conversion MCP. Generate PDF/DOCX/XLSX from templates+JSON (invoices, contracts, reports), batch generation, 100+ format conversions.

A server for reading and converting documents between PDF, DOCX, and Markdown formats using marker-pdf and pandoc.

Convert, compress, merge and OCR PDFs and 100+ file formats from any AI agent — 126 tools via the GuruPDF API.

Converts various file types and web content, such as PDFs, images, audio, and web pages, into Markdown format.

Convert Markdown files to high-quality, print-ready PDFs using LaTeX.

A high-performance PDF to Markdown conversion service powered by MinerU API, supporting batch processing for local files and URLs.

Converts Markdown to styled PDFs using VS Code's markdown styling and Python's ReportLab.

A server for converting Markdown files to PDF format. Requires pandoc and weasyprint.

Privacy-first PDF to Markdown/JSON converter for AI Agents. Optimized for complex B2B invoices (E-Fatura) and tables. Features native Turkish character correction and local-first WASM parsing.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.