MCP 서버

pdfops-mcp

dev.pdfops/pdfops-mcp
개발자 도구 생산성 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Inspects, fills, merges, and generates PDF documents including forms and invoices.

pdf_fill
Fill PDF form
Fill AcroForm form fields in a PDF and return the result. Field names must exist in the PDF (use pdf_inspect first). All values are strings; checkboxes take "true"/"false"; dropdown/radio/optionlist values must be one of the field's options; text values must respect the field's maxLength from pdf_inspect. The source PDF is never modified. Returns the filled PDF inline as an application/pdf resource. Encrypted PDFs are rejected with decrypt advice (common for government blanks with an empty user password).
외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'required': ['pdf_path', 'fields'], 'properties': {'fields': {'type': 'object', 'description': "Field name → string value (from pdf_inspect's fillTemplate)", 'additionalProperties': {'type': 'string'}}, 'flatten': {'type': 'boolean', 'description': 'Bake values into page content and drop the AcroForm so fields are no longer editable'}, 'pdf_path': {'type': 'string', 'description': 'Template PDF source: an https:// URL or a data:application/pdf;base64,… URI (this hosted server cannot read local file paths).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['bytes'], 'properties': {'bytes': {'type': 'integer', 'description': 'Size of the produced PDF in bytes'}, 'resource_uri': {'type': 'string', 'description': 'pdfops:// uri of the inline application/pdf resource'}}, 'additionalProperties': False}
pdf_inspect
Inspect PDF form fields
List a PDF's AcroForm form fields — names, types, options, current values, per-field maxLength where declared — plus a paste-ready fillTemplate object for pdf_fill and a hasXFA flag (hybrid AcroForm/XFA inputs lose their XFA layer when filled). A PDF with no fillable form returns count 0. Read-only: the PDF is fetched but never modified. Call this FIRST when filling an unfamiliar PDF, since pdf_fill rejects unknown field names and over-length values.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'required': ['pdf_path'], 'properties': {'pdf_path': {'type': 'string', 'description': 'PDF source: an https:// URL or a data:application/pdf;base64,… URI (this hosted server cannot read local file paths).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['count', 'hasXFA', 'truncated', 'fields', 'fillTemplate'], 'properties': {'count': {'type': 'integer', 'description': 'Number of form fields found; 0 when the PDF has no fillable form'}, 'fields': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'type', 'readOnly'], 'properties': {'raw': {}, 'name': {'type': 'string'}, 'type': {'type': 'string', 'description': 'text, checkbox, dropdown, radio, optionlist, or unsupported'}, 'value': {'type': 'string'}, 'checked': {'type': 'boolean'}, 'options': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Permitted values for radio/dropdown/optionlist fields'}, 'readOnly': {'type': 'boolean'}, 'maxLength': {'type': 'integer', 'description': 'Longer values are rejected by pdf_fill'}}, 'additionalProperties': False}, 'description': 'One entry per form field, in document order'}, 'hasXFA': {'type': 'boolean', 'description': 'True for hybrid AcroForm/XFA documents, whose XFA layer is dropped when filled'}, 'truncated': {'type': 'boolean', 'description': 'True when the form exceeded an API enumeration cap; fields is then a prefix, not the full list'}, 'fillTemplate': {'type': 'object', 'description': 'Field name to empty-or-current value, ready to edit and pass to pdf_fill', 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': False}
pdf_invoice
Generate invoice PDF
Generate a complete, professionally laid-out invoice PDF from structured data — no template needed. Deterministic: the same input produces byte-identical output (safe to re-run). Note: without a paid PDFops key the output carries a small "Generated with pdfops.dev" footer line. Returns the invoice inline as an application/pdf resource. Use this when you have invoice DATA and no document; if you already have an invoice PDF or a fillable template to populate, use pdf_fill instead.
외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'required': ['invoice'], 'properties': {'invoice': {'type': 'object', 'required': ['from', 'to', 'items'], 'properties': {'to': {'anyOf': [{'type': 'string'}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string'}, 'lines': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}]}, 'due': {'type': 'string'}, 'date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Calendar date in YYYY-MM-DD form (other formats are rejected with invalid_date). Shown on the invoice; also pins metadata for determinism'}, 'from': {'anyOf': [{'type': 'string'}, {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string'}, 'lines': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}]}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['description', 'unit_price'], 'properties': {'quantity': {'type': 'number', 'exclusiveMinimum': 0}, 'unit_price': {'type': 'number', 'minimum': 0}, 'description': {'type': 'string'}}, 'additionalProperties': False}, 'maxItems': 100, 'minItems': 1}, 'notes': {'type': 'string', 'maxLength': 1000}, 'currency': {'type': 'string', 'pattern': '^[A-Z]{3}$'}, 'tax_rate': {'type': 'number', 'maximum': 100, 'minimum': 0}, 'invoice_number': {'type': 'string'}}, 'description': 'Invoice data', 'additionalProperties': False}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['bytes'], 'properties': {'bytes': {'type': 'integer', 'description': 'Size of the produced PDF in bytes'}, 'resource_uri': {'type': 'string', 'description': 'pdfops:// uri of the inline application/pdf resource'}}, 'additionalProperties': False}
pdf_merge
Merge PDFs
Merge two or more PDFs into one, in the order given, and return the result. Sources are read only and never modified. Returns the merged PDF inline as an application/pdf resource. This tool only concatenates whole documents: it does not reorder, rotate or delete pages within them, and it does not fill forms — use pdf_fill for a fillable form and pdf_invoice to build a document from data. An unreadable or rejected input fails with an error, so a partial merge is never returned.
외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'required': ['pdf_paths'], 'properties': {'pdf_paths': {'type': 'array', 'items': {'type': 'string'}, 'minItems': 2, 'description': 'In order, each a PDF source: an https:// URL or a data:application/pdf;base64,… URI (this hosted server cannot read local file paths).'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['bytes'], 'properties': {'bytes': {'type': 'integer', 'description': 'Size of the produced PDF in bytes'}, 'resource_uri': {'type': 'string', 'description': 'pdfops:// uri of the inline application/pdf resource'}}, 'additionalProperties': False}
pdfops_usage
Check PDFops quota
Check the current PDFops API quota for the configured key: tier, limit, used, remaining, the billing period, and the reset timestamp. Read-only and safe to call before a batch to confirm there is headroom. Uses the API key this connection authenticated with.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'properties': {}}
출력 스키마
{'type': 'object', 'required': ['tier', 'limit', 'used', 'remaining', 'period', 'resets_at'], 'properties': {'tier': {'type': 'string', 'description': 'Plan name, e.g. free'}, 'used': {'type': 'integer'}, 'limit': {'type': 'integer', 'description': 'Calls allowed in the current period'}, 'period': {'type': 'string', 'description': 'Billing period the counts belong to, YYYY-MM'}, 'remaining': {'type': 'integer'}, 'resets_at': {'type': 'string', 'description': 'ISO 8601 timestamp when used resets to 0'}}, 'additionalProperties': False}
추가됨
pdfops_usage
2026년 10월 2일 2:40 AM
추가됨
pdf_invoice
2026년 10월 2일 2:40 AM
추가됨
pdf_merge
2026년 10월 2일 2:40 AM
추가됨
pdf_fill
2026년 10월 2일 2:40 AM
추가됨
pdf_inspect
2026년 10월 2일 2:40 AM