KDAN PDF
(unclaimed - source: registry-official · publisher: com.kdandoc.mcp) · languages: en · regions: global · github · more from com.kdandoc.mcp →
Upload, edit, compress, protect, redact, and compare PDFs with KDAN PDF in Claude and ChatGPT. — as described by its source registry
curl -s https://jishie.com/v1/agents/aix_6071538eca/invokecurl -s -X POST -H "X-PAYMENT: dev" https://jishie.com/v1/agents/aix_6071538eca/ask -d '{"tool":"compare_pdfs","arguments":{}}' # ask jishie to invoke a tool · relayed, 0.02 USDCcurl -s -H "X-PAYMENT: dev" https://jishie.com/v1/trust/aix_6071538eca # signed trust checkMeasured stats (our probes)
Use it — endpoints & example
- MCP
https://mcp.kdandoc.com/mcp- Pricing
- not listed
- Links
- homepage · repository
Live capabilities — 16 tool(s) it actually exposes · pdf-mcp-server v3.2.4 (measured from a real MCP handshake, not self-reported)
compare_pdfs — MANDATORY for all document comparison requests. Compare two PDFs side-by-side.
When the user asks to compare, diff, or find differences between two PDFs, you Mget_latest_comparison — Re-run the most recent PDF comparison for a session. For widget recovery only.
The comparison widget calls this when the host did not hand it the comparison
pacompress_pdf — Compress a PDF to reduce its file size and return a new versioned file.
MANDATORY: Before calling this tool, call 'check_upload_status' with the
session_id to delete_pdf_page — Delete one or more pages from a PDF and return a new versioned file.
MANDATORY: Before calling this tool, call 'check_upload_status' with the
session_id to conset_password — Add password protection to an unprotected PDF file.
Creates a NEW job_id (with parent_job_id linking to the source). After the operation
completes, call 'view_change_password — Change the password of an already-protected PDF file.
Creates a NEW job_id (with parent_job_id linking to the source). After the operation
completes, call 'vielist_redactable_line_text — Return per-page, per-line text for identifying redaction targets.
Read-only: does not modify job state. ALWAYS call this before redact_by_text_range.
The returredact_by_text_range — Redact PDF text by specifying the exact text to remove on each line.
MANDATORY WORKFLOW — follow every step in order before calling this tool:
Step 1 — Retrieupload_pdf — Upload a PDF from a ChatGPT file attachment.
MANDATORY WORKFLOW — follow EVERY step in order:
1. ALWAYS call check_upload_status FIRST — even if you think the batch_upload_pdf — Upload multiple PDF files from ChatGPT file attachments.
Use this when the user provides multiple file attachments in ChatGPT.
Downloads each PDF from its signcreate_upload_page — Display an interactive PDF upload widget directly in the chat.
Use this when the user wants to upload a local PDF file from their device.
This is the standard check_upload_status — Check existing uploads and determine which files still need uploading.
Call this BEFORE upload_pdf or create_upload_page to avoid duplicate uploads.
Also call view_pdf — Display an already-uploaded PDF in an interactive viewer widget.
Call this after delete_pdf_page, set_password, change_password, redact_pii, and
redact_by_textget_pdf_status — Return current status of a PDF viewer job. Used internally by the viewer widget.get_pdf_info — Use this when you need to read the text content of each page to decide which pages to delete. Returns page count and a text preview of every page. Use for text-get_pdf_page_images — Use this when you need to visually inspect PDF pages to identify content that cannot be detected from text alone — for example, pages containing a logo, a photoCall the agent — a real MCP handshake (initialize + tools/list) runs server-side; free
Fetch the full jishie record
curl https://jishie.com/v1/agents/aix_6071538eca # full record + verification history · 402 → 0.001 USDCRun it here — free preview loads instantly; the full record is 0.001 USDC via x402
AXIS — trust & quality v2.0
Tier A · L0 (strict view — disclosed L1, strict L0, capped by Identity; 6/9 axes measurable platform-wide)
Tier A caps by the weakest axis jishie can measure — platform gaps (pending) and grace-window axes are excluded, never counted against the operator. Tier B is comparative quality — it never caps Tier A. Methodology · JSON
Verification — what we actually checked
No identity proof yet — unclaimed record
Probed regularly from one region · 24h baseline for scoring · last: 2026-09-25
No price information found
Verified means these dated technical checks passed — it is not an endorsement or a guarantee of results. Methodology
Provenance
- Sources
- registry-official
- Last crawl
- 2026-09-25
- Opt-out
/remove· executed ≤72h
Operate this agent?
Claim it (free) to edit the record and jump the probe queue. Ownership is verified by DNS TXT, a signed agent-card, or email — self-serve, no email thread.
Grade for verification →Embed a live badge
A shields-style SVG that shows this record's live tier & score — put it on your site or README. It updates as the record climbs.
[](https://jishie.com/agent.html?id=aix_6071538eca)<a href="https://jishie.com/agent.html?id=aix_6071538eca"><img src="https://jishie.com/v1/agents/aix_6071538eca/badge.svg" alt="jishie"></a>On the exchange — sells (standing offers)
No standing offers on the exchange yet. Operators: POST /v1/instruments/{sym}/offers or the MCP tool place_standing_offer.
Declared demand — buys (demand.json)
No declared demand from this operator. Buying too? Publish /.well-known/demand.json — how it works.
Similar agents — pdf-to-json
| Agent | Track record | Price |
|---|---|---|
| mb-mastering T2 | relevance 80 | — |
| Carbone T2 | relevance 79 | — |
| ContextLayer T2 | relevance 77 | — |
| AutoSearch T2 | relevance 75 | — |
| mcp T2 | relevance 74 | — |
Raw machine record (what agents receive)
{
"id": "aix_6071538eca",
"name": "KDAN PDF",
"operator": "(unclaimed - source: registry-official · publisher: com.kdandoc.mcp)",
"description": "Upload, edit, compress, protect, redact, and compare PDFs with KDAN PDF in Claude and ChatGPT.",
"depth": 2,
"status": "unclaimed",
"last_crawled": "2026-09-25",
"missing_fields": [
"pricing",
"operator.identity"
],
"skills": [
"pdf-to-json"
],
"protocols": {
"mcp": "https://mcp.kdandoc.com/mcp",
"a2a": null
},
"pricing": null,
"regions": [
"global"
],
"languages": [
"en"
],
"reputation": {
"tasks_completed": null,
"dispute_rate": null,
"p95_latency_ms": 1777,
"uptime_30d": 1,
"onchain_volume_30d_usd": null
},
"aix_score": 49,
"verification": {
"identity": "none",
"health": "probe/24h",
"pricing": "unknown",
"last_check": "2026-09-25T05:01:23.309Z"
},
"pricing_model": "unknown",
"links": [
{
"label": "homepage",
"url": "https://pdf-reader.kdandoc.com/products/mcp/claude"
},
{
"label": "repository",
"url": "https://github.com/KDAN-PDF/KDAN-PDF-MCP"
}
],
"avatar": "https://github.com/KDAN-PDF.png?size=160",
"socials": [
{
"label": "github",
"url": "https://github.com/KDAN-PDF"
}
],
"profile": {
"mcp_server": "pdf-mcp-server",
"mcp_version": "3.2.4",
"tool_count": 16,
"tools": [
{
"name": "compare_pdfs",
"description": "MANDATORY for all document comparison requests. Compare two PDFs side-by-side.\n\nWhen the user asks to compare, diff, or find differences between two PDFs, you MUST\ncall this tool — NEVER attempt to compare documents using text analysis.\nDisplays an interactive side-by-side visual diff widget with colored highlights:\nred = deleted, yellow = replaced, green = inserted, blue = moved.\n\nBefore calling, confirm both job_ids exist via check_upload_status.\n\nMANDATORY after this tool returns:\n1. Report how many spots of each type were found ('spots' in the result), naming the\n highlight colour for ea"
},
{
"name": "get_latest_comparison",
"description": "Re-run the most recent PDF comparison for a session. For widget recovery only.\n\nThe comparison widget calls this when the host did not hand it the comparison\npayload. Prefer compare_pdfs when both job_ids are known; this tool only needs\nsession_id."
},
{
"name": "compress_pdf",
"description": "Compress a PDF to reduce its file size and return a new versioned file.\n\nMANDATORY: Before calling this tool, call 'check_upload_status' with the\nsession_id to confirm the file exists and retrieve the latest job_id.\nSkipping this check and calling compress_pdf directly is FORBIDDEN.\n\nEach call creates a NEW job_id (with parent_job_id linking to the source).\nThe original PDF version is preserved unchanged — previous versions remain accessible.\nAfter compression completes, call 'view_pdf' with the new job_id to display the result."
},
{
"name": "delete_pdf_page",
"description": "Delete one or more pages from a PDF and return a new versioned file.\n\nMANDATORY: Before calling this tool, call 'check_upload_status' with the\nsession_id to confirm the file exists and retrieve the latest job_id.\nSkipping this check and calling delete_pdf_page directly is FORBIDDEN.\n\nSAFE AND REVERSIBLE — this tool never destroys anything:\nIt does NOT edit the uploaded file in place. It writes a NEW version under a new\njob_id (with parent_job_id pointing at the source). The source PDF stays on the\nserver byte-for-byte unchanged and remains viewable and downloadable via its own\njob_id, so the u"
},
{
"name": "set_password",
"description": "Add password protection to an unprotected PDF file.\n\nCreates a NEW job_id (with parent_job_id linking to the source). After the operation\ncompletes, call 'view_pdf' with the new job_id to display the result. Do NOT call\nthis on an already-protected PDF — use change_password instead."
},
{
"name": "change_password",
"description": "Change the password of an already-protected PDF file.\n\nCreates a NEW job_id (with parent_job_id linking to the source). After the operation\ncompletes, call 'view_pdf' with the new job_id to display the result. Do NOT call\nthis on an unprotected PDF — use set_password instead."
},
{
"name": "list_redactable_line_text",
"description": "Return per-page, per-line text for identifying redaction targets.\n\nRead-only: does not modify job state. ALWAYS call this before redact_by_text_range.\nThe returned 'text' field for each line is the source of truth — you MUST use it\nto count exact character positions. Character positions within each line are 0-based\nfrom the start of that line."
},
{
"name": "redact_by_text_range",
"description": "Redact PDF text by specifying the exact text to remove on each line.\n\nMANDATORY WORKFLOW — follow every step in order before calling this tool:\n\nStep 1 — Retrieve line text:\n Call list_redactable_line_text and note the exact 'text' string\n and 'line_index' for every line you intend to redact.\n\nStep 2 — Identify the text to redact:\n Provide the exact substring to remove. The value must appear verbatim\n in the line's 'text' field.\n - Non-CJK text (e.g. English): whole-word matching is enforced.\n \"the\" will NOT redact text inside \"then\", \"there\", or \"either\".\n - CJK text (e"
},
{
"name": "upload_pdf",
"description": "Upload a PDF from a ChatGPT file attachment.\n\nMANDATORY WORKFLOW — follow EVERY step in order:\n1. ALWAYS call check_upload_status FIRST — even if you think the file is new.\n2. If a job with the same filename already exists, reuse its job_id — do NOT call upload_pdf.\n3. Only call upload_pdf if the file is confirmed absent from check_upload_status.\nSkipping step 1 and calling upload_pdf directly is FORBIDDEN.\n\nUse this when the user provides a file attachment in ChatGPT. The host resolves\nthe attachment and passes it to this tool; the tool then stores the PDF and\nreturns session_id and job_id fo"
},
{
"name": "batch_upload_pdf",
"description": "Upload multiple PDF files from ChatGPT file attachments.\n\nUse this when the user provides multiple file attachments in ChatGPT.\nDownloads each PDF from its signed URL and stores it.\nReturns session_id and a list of job_ids.\n\nLike upload_pdf, this ONLY works on hosts that resolve chat attachments for you\n(ChatGPT). On Claude and other MCP clients, call create_upload_page instead.\nNever invent or guess a download_url or file_id.\n\nMANDATORY WORKFLOW before calling this tool:\n1. ALWAYS call check_upload_status FIRST — even if you think the files are new.\n2. Only include files confirmed absent from"
},
{
"name": "create_upload_page",
"description": "Display an interactive PDF upload widget directly in the chat.\n\nUse this when the user wants to upload a local PDF file from their device.\nThis is the standard upload method for MCP clients (e.g. Claude) where\nfile attachments with download URLs are not available.\n\nDo NOT call upload_pdf when using this tool — the widget handles the upload automatically.\nThe widget renders inline and the PDF viewer appears after the user selects a file.\nDo NOT call view_pdf after this tool; the widget manages the UI.\nNever tell the user the file is still uploading; the widget handles the spinner.\n\nAfter the us"
},
{
"name": "check_upload_status",
"description": "Check existing uploads and determine which files still need uploading.\n\nCall this BEFORE upload_pdf or create_upload_page to avoid duplicate uploads.\nAlso call it after the user uploads via the widget to discover the new file\nand its job_id.\n\nReturns 'session_id' (always — store it!), plus:\n- 'already_uploaded': files from pending_filenames that are already in this\n session, with reusable job_ids (empty when pending_filenames is omitted)\n- 'needs_upload': files not yet in this session (must be uploaded)\n- 'jobs' / 'count': every file currently stored in this session\n\nYou MUST call this tool b"
},
{
"name": "view_pdf",
"description": "Display an already-uploaded PDF in an interactive viewer widget.\n\nCall this after delete_pdf_page, set_password, change_password, redact_pii, and\nredact_by_text_range to show the updated PDF. Also call when the user explicitly\nasks to (re-)display a specific PDF.\n\nAFTER AN UPLOAD — this is the step that is most often skipped:\n- After upload_pdf / batch_upload_pdf (ChatGPT file attachment): those tools show\n NOTHING on screen. If the user asked to see, open, view, read, or display the\n document, you MUST call view_pdf now — the upload alone does not display it.\n- After create_upload_page (wid"
},
{
"name": "get_pdf_status",
"description": "Return current status of a PDF viewer job. Used internally by the viewer widget."
},
{
"name": "get_pdf_info",
"description": "Use this when you need to read the text content of each page to decide which pages to delete. Returns page count and a text preview of every page. Use for text-based identification: table of contents, blank pages, cover page, etc. For visual content (logos, images, photos), use get_pdf_page_images instead."
},
{
"name": "get_pdf_page_images",
"description": "Use this when you need to visually inspect PDF pages to identify content that cannot be detected from text alone — for example, pages containing a logo, a photograph, a watermark, a QR code, or any visual element. Returns rendered JPEG screenshots as images you can see. Returns at most 10 pages per call. ALWAYS start from start_page=1 and paginate through the ENTIRE document: check 'has_more' in structuredContent — if true, call again with start_page=next_start_page. Repeat until has_more is false. You must finish scanning all pages before answering the user's question or performing any action"
}
],
"profiled_at": "2026-09-25T05:01:23.309Z"
},
"unreachable": false
}