{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_hapcxzhs5aec","handle":"kdan-pdf","url":"https://wellknown.network/agents/kdan-pdf","links":{"self":"https://wellknown.network/agents/kdan-pdf/record.json","html":"https://wellknown.network/agents/kdan-pdf","markdown":"https://wellknown.network/agents/kdan-pdf/record.md","api":"https://wellknown.network/api/v1/agents/kdan-pdf","status":"https://wellknown.network/api/v1/agents/kdan-pdf/status","claim":"https://wellknown.network/agents/kdan-pdf/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/kdan-pdf/claim.json","badge":"https://wellknown.network/agents/kdan-pdf/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/kdan-pdf/history","tools":"https://wellknown.network/api/v1/agents/kdan-pdf/tools"},"ard":{"identifier":"urn:air:mcp.kdandoc.com:server:kdan-pdf","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"KDAN PDF","summary":"Upload, edit, compress, protect, redact, and compare PDFs with KDAN PDF in Claude and ChatGPT.","description":"Upload, edit, compress, protect, redact, and compare PDFs with KDAN PDF in Claude and ChatGPT.","publisher":{"name":"com.kdandoc.mcp","url":null},"homepage":"https://pdf-reader.kdandoc.com/products/mcp/claude","repository":"https://github.com/KDAN-PDF/KDAN-PDF-MCP","version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp.kdandoc.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-07-28T02:57:48.381348Z","publishedAt":"2026-07-28T02:57:48.381348Z","registryName":"com.kdandoc.mcp/kdan-pdf-mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[],"categories":[],"language":"en"},"observed":{"status":"live","statusReason":"Responded 4h ago.","lastOkAt":"2026-10-10T23:22:17.906Z","lastProbedAt":"2026-10-10T23:22:17.906Z","statusComputedAt":"2026-10-10T23:23:59.482Z","reliability30d":{"probes":107,"successRate":1,"p50Ms":127,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":107,"ok":107,"authBoundaryOk":0,"serviceOk":107,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-10T23:22:17.906Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":122,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T16:32:43.811Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":127,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T10:28:42.961Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":127,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T03:26:45.165Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":127,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T21:26:22.150Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":121,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T14:31:59.551Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":126,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T08:27:45.715Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":120,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T01:25:34.912Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":115,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T18:27:28.004Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":137,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T11:23:55.527Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":125,"error":null,"detail":{"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"toolCount":16,"toolsHash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","serverName":"pdf-mcp-server","capabilities":["experimental","logging","prompts","resources","tools","extensions"],"serverVersion":"3.2.4","protocolVersion":"2025-06-18"}}],"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 M"},{"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\npa"},{"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 "},{"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 con"},{"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_"},{"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 'vie"},{"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 retur"},{"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 — Retrie"},{"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 "},{"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 sign"},{"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 "},{"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 "},{"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"},{"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-"},{"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 photo"}],"package":null,"toolSurface":{"id":"ts_nhvtumcc93ww","endpointId":"ep_ksdbwnpscw4t","hash":"99ed64d0839383d8cfecb6dc8de3b352c71e659949163b1a2d61431132635130","toolCount":16,"serverName":"pdf-mcp-server","serverVersion":"3.2.4","protocolVersion":"2025-06-18","firstSeenAt":"2026-09-12T11:26:11.701Z","lastSeenAt":"2026-10-10T23:22:17.920Z","observations":103,"toolNames":["compare_pdfs","get_latest_comparison","compress_pdf","delete_pdf_page","set_password","change_password","list_redactable_line_text","redact_by_text_range","upload_pdf","batch_upload_pdf","create_upload_page","check_upload_status","view_pdf","get_pdf_status","get_pdf_info","get_pdf_page_images"],"distinctSurfaces":1},"endpointFacts":[{"id":"ep_ksdbwnpscw4t","url":"https://mcp.kdandoc.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-06T20:27:52.326Z","auth":{"observedAt":"2026-10-06T20:27:52.531Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-06T20:27:52.543Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"kdandoc.com","issuer":{"commonName":"Amazon RSA 2048 M04","organization":"Amazon"},"validFrom":"2025-12-05T00:00:00.000Z","validTo":"2027-01-03T23:59:59.000Z","daysToExpiry":84,"sanCount":2,"fingerprint256":"02:8E:40:C5:AE:5F:3D:9A:6A:2B:CA:BA:64:09:64:5E:43:CC:7E:5A:F5:1D:B2:E5:DD:0B:2D:1A:4F:1E:98:67"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.kdandoc.mcp/kdan-pdf-mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/com.kdandoc.mcp%2Fkdan-pdf-mcp","firstSeenAt":"2026-09-05T19:20:53.022Z","fetchedAt":"2026-10-09T07:21:13.814Z","normalizedAt":"2026-10-09T07:21:13.814Z"}]},"firstSeenAt":"2026-09-05T19:20:53.022Z","updatedAt":"2026-10-10T23:24:45.917Z"}