DeckExtract
Download DocSend and Papermark decks as PDF or PPTX, including email-gated and protected links.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"deckextract": {
"url": "https://deckextract.com/mcp"
}
}
}Remote endpoints
https://deckextract.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (2)
🟡deckextract(url, format, analyze, email, password, ...)
Extract a deck from a DocSend or Papermark sharing link. Returns a temporary download URL and a readable `deckextract://deck/...` resource for the PDF/PPTX (or a ZIP for data rooms — a DocSend Space or Papermark data room counts as one extraction like any other link). Pass `analyze: true` (requires a DeckExtract Pro account) to also return structured deck data. Decks that email the viewer a verification step return resume tokens with retry instructions: fetch the emailed 6-digit code and retry with `otp` + `otpSessionId` (Papermark), or retry with `url` set to the emailed confirmation link + `sessionId` (DocSend). Typical extraction takes 15-90 seconds; the public API is rate limited to 5 extractions per IP per 30 minutes.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The deck sharing link, e.g. https://docsend.com/view/... or https://papermark.com/view/... — on a requires_email_confirmation retry, pass the confirmation link from the verification email instead."
},
"format": {
"type": "string",
"enum": [
"pdf",
"pptx"
],
"description": "Output format (default 'pdf')"
},
"analyze": {
"type": "boolean",
"description": "If true, also return structured analysis of the deck (company, team, round, metrics, market, competition). Requires a DeckExtract Pro account."
},
"email": {
"type": "string",
"format": "email",
"description": "Email to present to email-gated decks. If omitted, an ephemeral address is generated automatically when the deck requires one."
},
"password": {
"type": "string",
"description": "Passcode for passcode-protected decks"
},
"sessionId": {
"type": "string",
"description": "Resume token from a prior requires_password or requires_email_confirmation reply. Echo it on the retry so the same viewer session is reused."
},
"otp": {
"type": "string",
"description": "The 6-digit verification code the deck emailed to the viewer (requires_email_otp step). Send together with otpSessionId."
},
"otpSessionId": {
"type": "string",
"description": "Resume token from a prior requires_email_otp reply. The parked session lives ~5 minutes; a wrong code returns a fresh token."
}
},
"required": [
"url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"downloadUrl": {
"type": "string",
"description": "Temporary URL of the extracted deck"
},
"resourceUri": {
"type": "string",
"description": "MCP resource URI (deckextract://deck/...) to read the bytes via resources/read"
},
"format": {
"type": "string",
"enum": [
"pdf",
"pptx",
"zip"
]
},
"sizeBytes": {
"type": "integer"
},
"expiresAt": {
"type": "string",
"description": "ISO timestamp when the URL/resource expires"
},
"sourceUrl": {
"type": "string"
},
"analysis": {
"description": "Structured deck analysis (present when analyze=true succeeded)"
},
"analysisError": {
"type": "string",
"description": "Set when extraction succeeded but analysis could not be produced"
}
},
"required": [
"downloadUrl",
"resourceUri",
"format",
"sizeBytes",
"expiresAt",
"sourceUrl"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢account_status
Returns the calling account's plan (free or Pro), whether it's signed in, and this month's extraction usage and remaining quota. Takes no input.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"authenticated": {
"type": "boolean",
"description": "Whether the caller is signed in"
},
"plan": {
"type": "string",
"enum": [
"anonymous",
"free",
"unlimited"
],
"description": "'unlimited' is the Pro plan"
},
"isPro": {
"type": "boolean"
},
"email": {
"type": [
"string",
"null"
]
},
"monthlyUsage": {
"type": "integer",
"description": "Extractions used this calendar month"
},
"monthlyLimit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Free-plan monthly cap; null when unlimited"
},
"remaining": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Extractions left this month; null when unlimited"
}
},
"required": [
"authenticated",
"plan",
"isPro",
"monthlyUsage",
"monthlyLimit",
"remaining"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence