PDF.co MCP server for AI agents

Live

API KEY

PDF PROCESSING

Files & Documents

PDF.co gives your agent PDF processing: convert PDFs to text, CSV, Excel, and JSON, generate PDFs from HTML and office files, parse invoices and documents, fill forms, and merge, split, and secure files.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
PDF.co
agent · Acme Q3
Run
Extract the line items from this invoice PDF.
S
pdfco_parse_invoice
264ms
Document agent
Invoice INV-2291 from Globex has 4 line items totaling $12,480.00, due November 15.
Sources: 1 invoice, AI invoice parser
pdfco
4 line items
18:29
Message Claude...

Tools your document agent reaches for on PDF.co, scoped per user.

CALL ANY TOOL
39 tools for PDF processing on PDF.co: convert PDFs to text, CSV, Excel, HTML, and JSON, create PDFs from HTML, URLs, images, and office files, parse invoices and documents, fill forms, and merge, split, compress, and password-protect files.
pdfco_add_password
Add password
Encrypt a PDF with an owner and/or user password and set what readers may do: print, copy, edit, fill forms, annotate, assemble pages or extract for accessibility. Returns url (a temporary link to the output file, valid for expiration minutes), pageCount, credits and remainingCredits; with async it returns jobId and the reserved url to read once pdfco_check_job reports success. Use pdfco_add_password to protect or restrict a PDF. Use pdfco_remove_password to unlock one.
Parameters
Name
Type
Required
Description
url
string
Required
Public URL of the source PDF. PDF.co downloads the file from this URL, so it must be reachable without a login: a direct link, a PDF.co temporary file URL from an earlier result, or a presigned upload URL from pdfco_get_presigned_upload_url. Each input file can be up to 100 MB. Prefix with cache: (cache:https://...) to let PDF.co reuse a file it already downloaded. Example: https://pdfco-test-files.s3.us-west-2.amazonaws.com/password-protect/sample.pdf.
allow_accessibility_support
boolean
Optional
Set false to prohibit content extraction for accessibility tools. Defaults to true (allowed).
allow_assembly_document
boolean
Optional
Set false to prohibit inserting, deleting or rotating pages. Defaults to true (allowed).
allow_content_extraction
boolean
Optional
Set false to prohibit copying text and images. Defaults to true (allowed).
allow_fill_forms
boolean
Optional
Set false to prohibit filling form and signature fields. Defaults to true (allowed).
allow_modify_annotations
boolean
Optional
Set false to prohibit adding or changing annotations and form fields. Defaults to true (allowed).
allow_modify_document
boolean
Optional
Set false to prohibit editing the document. Defaults to true (allowed).
allow_print_document
boolean
Optional
Set false to prohibit printing. Defaults to true (allowed).
async
boolean
Optional
Set true to run the job in the background: the call returns a jobId and reserved output url at once; poll pdfco_check_job until status is success. Scalekit stops waiting after 10 seconds, so use true for large or many-page files.
encryption_algorithm
string
Optional
Encryption algorithm. Defaults to AES_128bit; AES_128bit or AES_256bit is recommended. One of: `RC4_40bit`, `RC4_128bit`, `AES_128bit`, `AES_256bit`.
expiration
integer
Optional
Minutes until the output URL expires and the file is deleted from PDF.co temporary storage. Defaults to 60; the maximum depends on your PDF.co plan. Example: 120.
name
string
Optional
File name for the generated output file. Example: protected.pdf.
owner_password
string
Optional
Owner password, needed to change or remove the restrictions. Example: OwnerPass123.
print_quality
string
Optional
Allowed print quality when printing is allowed. Defaults to HighResolution. One of: `LowResolution`, `HighResolution`.
user_password
string
Optional
User password that readers must enter to open the PDF. Leave empty to allow opening without a password (restrictions still apply). Example: ReadPass123.
pdfco_add_to_pdf
Add to pdf
pdfco_auto_rotate_pages
Auto rotate pages
pdfco_check_job
Check job
pdfco_compress_pdf
Compress pdf
pdfco_delete_pages
Delete pages
pdfco_delete_text
Delete text
pdfco_fill_pdf_form
Fill pdf form
pdfco_find_text
Find text
pdfco_get_credit_balance
Get credit balance
pdfco_get_document_parser_template
Get document parser template
pdfco_get_pdf_form_fields
Get pdf form fields
pdfco_get_pdf_info
Get pdf info
pdfco_html_template_to_pdf
Html template to pdf
pdfco_html_to_pdf
Html to pdf
pdfco_list_document_parser_templates
List document parser templates
pdfco_list_html_templates
List html templates
pdfco_merge_documents
Merge documents
pdfco_merge_pdfs
Merge pdfs
pdfco_parse_invoice
Parse invoice
pdfco_pdf_to_csv
Pdf to csv
pdfco_pdf_to_excel
Pdf to excel
pdfco_pdf_to_json
Pdf to json
pdfco_pdf_to_text
Pdf to text
pdfco_read_barcodes
Read barcodes
pdfco_remove_password
Remove password
pdfco_replace_text
Replace text
pdfco_replace_text_with_image
Replace text with image
pdfco_split_pdf
Split pdf
pdfco_split_pdf_by_text
Split pdf by text

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// PDF.co tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["pdfco"], toolNames: [
    "pdfco_parse_invoice",
    "pdfco_pdf_to_text",
    "pdfco_merge_pdfs"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Extract the line items from this invoice PDF" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["pdfco"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Extract the line items from this invoice PDF" }],
  tools,
});

// Execute the tool call with the user's vaulted PDF.co API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["pdfco"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Extract the line items from this invoice PDF" }],
  tools,
});

// Tool call runs with the user's vaulted PDF.co API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["pdfco"] }, pageSize: 100,
});

const agent = new Agent({
  name: "document_agent",
  model: "gemini-2.5-pro",
  instruction: "PDF.co tools scoped to this user",
  tools,
});

await agent.run("Extract the line items from this invoice PDF");
Try these prompts
Copy any prompt into your agent. Each maps directly to a PDF.co tool. Click to copy, paste into your agent, done.
Convert
Copy the prompt
Copied
Convert this PDF statement to an Excel workbook.
Copy the prompt
Copied
Extract the text from this scanned contract.
Copy the prompt
Copied
Turn this HTML invoice into a PDF.
Parse and fill
Copy the prompt
Copied
Parse this invoice and return the vendor, total, and line items.
Copy the prompt
Copied
List the form fields in this W-9 PDF.
Copy the prompt
Copied
Fill the client name and date fields on this form.
Edit and secure
Copy the prompt
Copied
Merge these 3 PDFs into one file.
Copy the prompt
Copied
Split this 40-page PDF at pages 1-10, 11-25, and 26-40.
Copy the prompt
Copied
Password-protect this PDF so it cannot be printed.
SEE HOW AUTH WORKS
Each user connects their own PDF.co API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
PDF.co
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
PDF.co
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
PDF.co
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
PDF.co
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other files and documents connectors.
GTM and RevOps Teams
Deal room sync
Pulls opportunity context from Salesforce, captures key decisions from Slack, and syncs a running summary to the deal room doc in Google Drive, but only when the deal actually changed.
Test other agents
See the same per-user auth pattern across other files and documents connectors.
GTM
Deal room sync agent
Pull opportunity context from Salesforce, capture decisions from Slack, and keep the Google Drive deal room doc current.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared PDF.co API key looks fine in a demo. In production every conversion looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
PDF.co today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access PDF.co as the user or through a shared API key?
As the user. Each user connects their own PDF.co API key once, and Scalekit sends it with every call. Every conversion and edit the agent runs is attributed to that user in your audit trail, not a shared service account.
Where is the PDF.co API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in PDF.co?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example conversion and parsing tools without pdfco_delete_text and pdfco_remove_password. Scalekit also enforces scope checks before every API call.
What happens when a user revokes PDF.co access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Where do PDF.co output files go?
PDF.co returns a temporary link to each output file, valid for the expiration window you set. pdfco_get_presigned_upload_url gives the agent a link to upload a local file first, and pdfco_get_credit_balance shows how many credits remain before a large job.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""pdfco"": {
""url"": ""https://mcp.scalekit.com/pdfco"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.pdfco]
url = ""https://mcp.scalekit.com/pdfco""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""pdfco"": {
""url"": ""https://mcp.scalekit.com/pdfco"",
""type"": ""http""
}
}
}