Paperform MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.4.3 · published by io.usefulapi
Read Paperform forms, submissions, products and coupons, Papersign documents, and manage coupons.
23 tools: 4 can delete or cancel things, 1 change things and 18 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads18Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http paperform https://paperform.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "paperform_get_coupon" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "paperform_get_coupon" says "get": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
23 tools
Deletes or cancels 4Claude Code: deny
paperform_create_couponWRITE: create a coupon code on a form, with a fixed discountAmount or a discountPercentage (not both), an optional target (price or subscription) and expiry.No findings
Why it is in this group
- The name "paperform_create_coupon" says "create": a word for a change.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE: create a coupon code on a form, with a fixed discountAmount or a discountPercentage (not both), an optional target (price or subscription) and expiry. Respondents can use it at checkout as soon as it is enabled. Undo: paperform_update_coupon with enabled=false. Paperform: POST /forms/{slug_or_id}/coupons.
Annotations the server declares
- title: Create a form coupon
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
paperform_set_product_quantityWRITE: set how many units of a form product are available (its stock quantity), e.g.No findings
Why it is in this group
- The name "paperform_set_product_quantity" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE: set how many units of a form product are available (its stock quantity), e.g. after restocking. Replaces the current value; read it first with paperform_get_product. Not atomic: it overwrites rather than adjusts, so a sale between your read and this write is lost. Paperform: PUT /forms/{slug_or_id}/products/{sku}/quantity.
Annotations the server declares
- title: Set a product's stock quantity
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
paperform_set_product_soldWRITE: set the number of units of a form product recorded as sold (e.g.No findings
Why it is in this group
- The name "paperform_set_product_sold" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE: set the number of units of a form product recorded as sold (e.g. to correct it after a refund or an offline sale). Replaces the current value; read it first with paperform_get_product. Not atomic: it overwrites rather than adjusts, so a sale between your read and this write is lost. Paperform: PUT /forms/{slug_or_id}/products/{sku}/sold.
Annotations the server declares
- title: Set a product's sold count
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
paperform_update_couponWRITE: change a coupon on a form — enable or disable it, change its discount (amount or percentage), target or expiry (null = never expires).No findings
Why it is in this group
- The name "paperform_update_coupon" says "update": a word for a change.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it WRITE: change a coupon on a form — enable or disable it, change its discount (amount or percentage), target or expiry (null = never expires). Only the fields you pass are sent. Paperform: PUT /forms/{slug_or_id}/coupons/{code}.
Annotations the server declares
- title: Update a form coupon
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
Changes things 1Claude Code: ask
paperform_get_couponFetch one coupon on a form by code.1 finding
Why it is in this group
- The name "paperform_get_coupon" says "get": a word for reading.
- The input takes a statement or command to run (input.code), which can change anything it can reach.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "paperform_get_coupon" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "paperform_get_coupon" says "get": a word for reading.
Description, as the server wrote it Fetch one coupon on a form by code. Paperform: GET /forms/{slug_or_id}/coupons/{code}.
Annotations the server declares
- title: Get a form coupon
- readOnlyHint: true
- openWorldHint: true
Only reads 18Claude Code: allow
paperform_get_formFetch one form by slug, custom slug or id: title, description, url, live flag, tags, submission_count, space and dates.No findings
Why it is in this group
- The name "paperform_get_form" says "get": a word for reading.
Description, as the server wrote it Fetch one form by slug, custom slug or id: title, description, url, live flag, tags, submission_count, space and dates. Paperform: GET /forms/{slug_or_id}.
Annotations the server declares
- title: Get a form
- readOnlyHint: true
- openWorldHint: true
paperform_get_papersign_documentFetch one Papersign document by id: status, signers and their progress, variables, folder, space and dates.No findings
Why it is in this group
- The name "paperform_get_papersign_document" says "get": a word for reading.
Description, as the server wrote it Fetch one Papersign document by id: status, signers and their progress, variables, folder, space and dates. Needs the Papersign API. Paperform: GET /papersign/documents/{id}.
Annotations the server declares
- title: Get a Papersign document
- readOnlyHint: true
- openWorldHint: true
paperform_get_partial_submissionFetch one partial submission by id, with the answers given so far.No findings
Why it is in this group
- The name "paperform_get_partial_submission" says "get": a word for reading.
Description, as the server wrote it Fetch one partial submission by id, with the answers given so far. It may have been completed since (submitted_at set); submitted_at null means abandoned. Paperform: GET /partial-submissions/{id}.
Annotations the server declares
- title: Get a partial submission
- readOnlyHint: true
- openWorldHint: true
paperform_get_productFetch one product on a form by SKU: price, quantity in stock, sold count, limits.No findings
Why it is in this group
- The name "paperform_get_product" says "get": a word for reading.
Description, as the server wrote it Fetch one product on a form by SKU: price, quantity in stock, sold count, limits. Paperform: GET /forms/{slug_or_id}/products/{sku}.
Annotations the server declares
- title: Get a form product
- readOnlyHint: true
- openWorldHint: true
paperform_get_signed_document_urlGet a download link for a completed (fully signed) Papersign document as a PDF.No findings
Why it is in this group
- The name "paperform_get_signed_document_url" says "get": a word for reading.
Description, as the server wrote it Get a download link for a completed (fully signed) Papersign document as a PDF. A fresh link is made on each call and is valid for one week (expires_at_utc). Needs the Papersign API. Paperform: GET /papersign/documents/{id}/completed-document-url.
Annotations the server declares
- title: Get the signed PDF link
- readOnlyHint: true
- openWorldHint: true
paperform_get_submissionFetch one submission by id, with every answer, device info, payment charge and PDFs.No findings
Why it is in this group
- The name "paperform_get_submission" says "get": a word for reading.
Description, as the server wrote it Fetch one submission by id, with every answer, device info, payment charge and PDFs. Paperform: GET /submissions/{id}.
Annotations the server declares
- title: Get a submission
- readOnlyHint: true
- openWorldHint: true
paperform_list_couponsList a form's coupon codes (code, enabled, target, discountAmount or discountPercentage, expiresAt).No findings
Why it is in this group
- The name "paperform_list_coupons" says "list": a word for reading.
Description, as the server wrote it List a form's coupon codes (code, enabled, target, discountAmount or discountPercentage, expiresAt). Paperform: GET /forms/{slug_or_id}/coupons.
Annotations the server declares
- title: List form coupons
- readOnlyHint: true
- openWorldHint: true
paperform_list_form_fieldsList a form's questions (key, title, type, required, custom_key, description, options).No findings
Why it is in this group
- The name "paperform_list_form_fields" says "list": a word for reading.
Description, as the server wrote it List a form's questions (key, title, type, required, custom_key, description, options). The field keys are the keys of a submission's `data` object, so read this to interpret answers. Paperform: GET /forms/{slug_or_id}/fields.
Annotations the server declares
- title: List form fields
- readOnlyHint: true
- openWorldHint: true
paperform_list_formsList the forms in the Paperform account (id, slug, custom_slug, title, url, live, tags, submission_count, space_id, dates), newest first.No findings
Why it is in this group
- The name "paperform_list_forms" says "list": a word for reading.
Description, as the server wrote it List the forms in the Paperform account (id, slug, custom_slug, title, url, live, tags, submission_count, space_id, dates), newest first. Search by title, or also by slug/custom_slug with search_fields. Start here to find the slug or id the other tools need. Paperform: GET /forms.
Annotations the server declares
- title: List forms
- readOnlyHint: true
- openWorldHint: true
paperform_list_papersign_documentsList Papersign e-signature documents (id, name, status, folder, space, signers, variables, source form/submission, sent/completed dates), filtered by name, status, folder, space or…No findings
Why it is in this group
- The name "paperform_list_papersign_documents" says "list": a word for reading.
Description, as the server wrote it List Papersign e-signature documents (id, name, status, folder, space, signers, variables, source form/submission, sent/completed dates), filtered by name, status, folder, space or the Paperform submission that created them. Needs the Papersign API. Paperform: GET /papersign/documents.
Annotations the server declares
- title: List Papersign documents
- readOnlyHint: true
- openWorldHint: true
paperform_list_papersign_foldersList Papersign folders (id, name, parent_id, space_id), optionally inside one space or folder.No findings
Why it is in this group
- The name "paperform_list_papersign_folders" says "list": a word for reading.
Description, as the server wrote it List Papersign folders (id, name, parent_id, space_id), optionally inside one space or folder. Needs the Papersign API. Paperform: GET /papersign/folders.
Annotations the server declares
- title: List Papersign folders
- readOnlyHint: true
- openWorldHint: true
paperform_list_papersign_spacesList Papersign spaces (id, name, root_folder_id).No findings
Why it is in this group
- The name "paperform_list_papersign_spaces" says "list": a word for reading.
Description, as the server wrote it List Papersign spaces (id, name, root_folder_id). Needs the Papersign API. Paperform: GET /papersign/spaces.
Annotations the server declares
- title: List Papersign spaces
- readOnlyHint: true
- openWorldHint: true
paperform_list_partial_submissionsList one page of a form's partial submissions (someone started the form), newest first: answers so far, last_answered field, dates.No findings
Why it is in this group
- The name "paperform_list_partial_submissions" says "list": a word for reading.
Description, as the server wrote it List one page of a form's partial submissions (someone started the form), newest first: answers so far, last_answered field, dates. Partials that were later completed stay in the list with submitted_at set; only those with submitted_at null are abandoned. Useful for drop-off analysis and follow-ups. Paperform: GET /forms/{slug_or_id}/partial-submissions.
Annotations the server declares
- title: List partial submissions
- readOnlyHint: true
- openWorldHint: true
paperform_list_productsList the products sold on a form (SKU, name, price, quantity in stock, sold, minimum/maximum, discountable, images).No findings
Why it is in this group
- The name "paperform_list_products" says "list": a word for reading.
Description, as the server wrote it List the products sold on a form (SKU, name, price, quantity in stock, sold, minimum/maximum, discountable, images). Paperform: GET /forms/{slug_or_id}/products.
Annotations the server declares
- title: List form products
- readOnlyHint: true
- openWorldHint: true
paperform_list_space_formsList the forms in one space.No findings
Why it is in this group
- The name "paperform_list_space_forms" says "list": a word for reading.
Description, as the server wrote it List the forms in one space. Needs the Business API. Paperform: GET /spaces/{id}/forms.
Annotations the server declares
- title: List the forms in a space
- readOnlyHint: true
- openWorldHint: true
paperform_list_spacesList the account's spaces (folders that group forms): id, name, dates.No findings
Why it is in this group
- The name "paperform_list_spaces" says "list": a word for reading.
Description, as the server wrote it List the account's spaces (folders that group forms): id, name, dates. Needs the Business API. Paperform: GET /spaces.
Annotations the server declares
- title: List spaces
- readOnlyHint: true
- openWorldHint: true
paperform_list_submissionsList one page of a form's completed submissions, newest first: answers (`data`, keyed by field key — see paperform_list_form_fields), device and UTM info, payment `charge`, generat…No findings
Why it is in this group
- The name "paperform_list_submissions" says "list": a word for reading.
Description, as the server wrote it List one page of a form's completed submissions, newest first: answers (`data`, keyed by field key — see paperform_list_form_fields), device and UTM info, payment `charge`, generated PDFs and created_at. Page with skip/next_skip or after_id/last_id; filter by date. Paperform: GET /forms/{slug_or_id}/submissions.
Annotations the server declares
- title: List submissions
- readOnlyHint: true
- openWorldHint: true
paperform_list_webhooksList the webhooks on a form (id, target_url, triggers: submission / partial_submission, dates).No findings
Why it is in this group
- The name "paperform_list_webhooks" says "list": a word for reading.
Description, as the server wrote it List the webhooks on a form (id, target_url, triggers: submission / partial_submission, dates). Needs the Business API. Paperform: GET /forms/{slug_or_id}/webhooks.
Annotations the server declares
- title: List form webhooks
- readOnlyHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.4.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http paperform https://paperform.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__paperform__paperform_list_forms",
"mcp__paperform__paperform_get_form",
"mcp__paperform__paperform_list_form_fields",
"mcp__paperform__paperform_list_submissions",
"mcp__paperform__paperform_get_submission",
"mcp__paperform__paperform_list_partial_submissions",
"mcp__paperform__paperform_get_partial_submission",
"mcp__paperform__paperform_list_products",
"mcp__paperform__paperform_get_product",
"mcp__paperform__paperform_list_coupons",
"mcp__paperform__paperform_list_webhooks",
"mcp__paperform__paperform_list_spaces",
"mcp__paperform__paperform_list_space_forms",
"mcp__paperform__paperform_list_papersign_documents",
"mcp__paperform__paperform_get_papersign_document",
"mcp__paperform__paperform_get_signed_document_url",
"mcp__paperform__paperform_list_papersign_folders",
"mcp__paperform__paperform_list_papersign_spaces"
],
"ask": [
"mcp__paperform__paperform_get_coupon"
],
"deny": [
"mcp__paperform__paperform_create_coupon",
"mcp__paperform__paperform_update_coupon",
"mcp__paperform__paperform_set_product_quantity",
"mcp__paperform__paperform_set_product_sold"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as paperform. Review it before you use it.