{
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "tool": {
    "category": "accounting",
    "endpoint": "https://pdfops.dev/api/mcp",
    "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/pdfops-mcp.json",
    "kind": "mcp",
    "listed": "indexed",
    "liveUrl": "https://www.anchorterminal.com/api/v1/live/pdfops-mcp.json",
    "markdownUrl": "https://www.anchorterminal.com/tools/pdfops-mcp.md",
    "mcpTools": {
      "check": {
        "checker": "anchor-check/1.0",
        "totalTokens": 2057,
        "counts": {
          "error": 0,
          "note": 0,
          "warn": 1
        },
        "findings": [
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "pdf_invoice",
            "message": "3 parameters without a description: invoice.items[].description, invoice.items[].quantity, invoice.items[].unit_price",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          }
        ]
      },
      "checkedAt": "2026-10-04T22:24:55Z",
      "count": 5,
      "schemaTokens": 2057,
      "status": "ok",
      "tools": [
        {
          "name": "pdf_inspect",
          "title": "Inspect PDF form fields",
          "description": "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.",
          "inputSchema": {
            "additionalProperties": false,
            "properties": {
              "pdf_path": {
                "description": "PDF source: an https:// URL or a data:application/pdf;base64,… URI (this hosted server cannot read local file paths).",
                "type": "string"
              }
            },
            "required": [
              "pdf_path"
            ],
            "type": "object"
          },
          "outputSchema": {
            "additionalProperties": false,
            "properties": {
              "count": {
                "description": "Number of form fields found; 0 when the PDF has no fillable form",
                "type": "integer"
              },
              "fields": {
                "description": "One entry per form field, in document order",
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "checked": {
                      "type": "boolean"
                    },
                    "maxLength": {
                      "description": "Longer values are rejected by pdf_fill",
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    },
                    "options": {
                      "description": "Permitted values for radio/dropdown/optionlist fields",
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "raw": {},
                    "readOnly": {
                      "type": "boolean"
                    },
                    "type": {
                      "description": "text, checkbox, dropdown, radio, optionlist, or unsupported",
                      "type": "string"
                    },
                    "value": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "name",
                    "type",
                    "readOnly"
                  ],
                  "type": "object"
                },
                "type": "array"
              },
              "fillTemplate": {
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Field name to empty-or-current value, ready to edit and pass to pdf_fill",
                "type": "object"
              },
              "hasXFA": {
                "description": "True for hybrid AcroForm/XFA documents, whose XFA layer is dropped when filled",
                "type": "boolean"
              },
              "truncated": {
                "description": "True when the form exceeded an API enumeration cap; fields is then a prefix, not the full list",
                "type": "boolean"
              }
            },
            "required": [
              "count",
              "hasXFA",
              "truncated",
              "fields",
              "fillTemplate"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": true
          }
        },
        {
          "name": "pdf_fill",
          "title": "Fill PDF form",
          "description": "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).",
          "inputSchema": {
            "additionalProperties": false,
            "properties": {
              "fields": {
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Field name → string value (from pdf_inspect's fillTemplate)",
                "type": "object"
              },
              "flatten": {
                "description": "Bake values into page content and drop the AcroForm so fields are no longer editable",
                "type": "boolean"
              },
              "pdf_path": {
                "description": "Template PDF source: an https:// URL or a data:application/pdf;base64,… URI (this hosted server cannot read local file paths).",
                "type": "string"
              }
            },
            "required": [
              "pdf_path",
              "fields"
            ],
            "type": "object"
          },
          "outputSchema": {
            "additionalProperties": false,
            "properties": {
              "bytes": {
                "description": "Size of the produced PDF in bytes",
                "type": "integer"
              },
              "resource_uri": {
                "description": "pdfops:// uri of the inline application/pdf resource",
                "type": "string"
              }
            },
            "required": [
              "bytes"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": false
          }
        },
        {
          "name": "pdf_merge",
          "title": "Merge PDFs",
          "description": "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.",
          "inputSchema": {
            "additionalProperties": false,
            "properties": {
              "pdf_paths": {
                "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).",
                "items": {
                  "type": "string"
                },
                "minItems": 2,
                "type": "array"
              }
            },
            "required": [
              "pdf_paths"
            ],
            "type": "object"
          },
          "outputSchema": {
            "additionalProperties": false,
            "properties": {
              "bytes": {
                "description": "Size of the produced PDF in bytes",
                "type": "integer"
              },
              "resource_uri": {
                "description": "pdfops:// uri of the inline application/pdf resource",
                "type": "string"
              }
            },
            "required": [
              "bytes"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": false
          }
        },
        {
          "name": "pdf_invoice",
          "title": "Generate invoice PDF",
          "description": "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.",
          "inputSchema": {
            "additionalProperties": false,
            "properties": {
              "invoice": {
                "additionalProperties": false,
                "description": "Invoice data",
                "properties": {
                  "currency": {
                    "pattern": "^[A-Z]{3}$",
                    "type": "string"
                  },
                  "date": {
                    "description": "Calendar date in YYYY-MM-DD form (other formats are rejected with invalid_date). Shown on the invoice; also pins metadata for determinism",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "type": "string"
                  },
                  "due": {
                    "type": "string"
                  },
                  "from": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "additionalProperties": false,
                        "properties": {
                          "lines": {
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "name": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object"
                      }
                    ]
                  },
                  "invoice_number": {
                    "type": "string"
                  },
                  "items": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "description": {
                          "type": "string"
                        },
                        "quantity": {
                          "exclusiveMinimum": 0,
                          "type": "number"
                        },
                        "unit_price": {
                          "minimum": 0,
                          "type": "number"
                        }
                      },
                      "required": [
                        "description",
                        "unit_price"
                      ],
                      "type": "object"
                    },
                    "maxItems": 100,
                    "minItems": 1,
                    "type": "array"
                  },
                  "notes": {
                    "maxLength": 1000,
                    "type": "string"
                  },
                  "tax_rate": {
                    "maximum": 100,
                    "minimum": 0,
                    "type": "number"
                  },
                  "to": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "additionalProperties": false,
                        "properties": {
                          "lines": {
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "name": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object"
                      }
                    ]
                  }
                },
                "required": [
                  "from",
                  "to",
                  "items"
                ],
                "type": "object"
              }
            },
            "required": [
              "invoice"
            ],
            "type": "object"
          },
          "outputSchema": {
            "additionalProperties": false,
            "properties": {
              "bytes": {
                "description": "Size of the produced PDF in bytes",
                "type": "integer"
              },
              "resource_uri": {
                "description": "pdfops:// uri of the inline application/pdf resource",
                "type": "string"
              }
            },
            "required": [
              "bytes"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": false
          }
        },
        {
          "name": "pdfops_usage",
          "title": "Check PDFops quota",
          "description": "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.",
          "inputSchema": {
            "properties": {},
            "type": "object"
          },
          "outputSchema": {
            "additionalProperties": false,
            "properties": {
              "limit": {
                "description": "Calls allowed in the current period",
                "type": "integer"
              },
              "period": {
                "description": "Billing period the counts belong to, YYYY-MM",
                "type": "string"
              },
              "remaining": {
                "type": "integer"
              },
              "resets_at": {
                "description": "ISO 8601 timestamp when used resets to 0",
                "type": "string"
              },
              "tier": {
                "description": "Plan name, e.g. free",
                "type": "string"
              },
              "used": {
                "type": "integer"
              }
            },
            "required": [
              "tier",
              "limit",
              "used",
              "remaining",
              "period",
              "resets_at"
            ],
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": true
          }
        }
      ]
    },
    "name": "pdfops-mcp",
    "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
    "packages": [
      {
        "registryType": "npm",
        "identifier": "pdfops-mcp",
        "version": "0.3.6",
        "transport": "stdio"
      }
    ],
    "pageJsonUrl": "https://www.anchorterminal.com/tools/pdfops-mcp.json",
    "popularity": {
      "githubStars": 0,
      "npmWeekly": 437
    },
    "registryName": "dev.pdfops/pdfops-mcp",
    "remotes": [
      {
        "type": "streamable-http",
        "url": "https://pdfops.dev/api/mcp"
      }
    ],
    "repository": "https://github.com/pdfops/pdfops-mcp",
    "reviewed": false,
    "slug": "pdfops-mcp",
    "source": "the official MCP registry",
    "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=dev.pdfops/pdfops-mcp",
    "summary": "Deterministic PDF tools for AI agents: inspect fields, fill forms, merge PDFs, invoices.",
    "updatedAt": "2026-09-30T21:02:42Z",
    "url": "https://www.anchorterminal.com/tools/pdfops-mcp",
    "vendor": "pdfops.dev",
    "vendorUrl": "https://pdfops.dev",
    "version": "0.3.6",
    "websiteUrl": "https://pdfops.dev",
    "where": "both",
    "why": [
      "vendor"
    ]
  }
}
