Anvil MCP by usefulapi
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Hosted MCP server for Anvil — fill & generate PDFs and run Etch e-signature packets for AI agents.
| Author | io.usefulapi |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 738 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Anvil MCP by usefulapi": {
"url": "https://anvil.usefulapi.io/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (10)
anvil_current_userread-onlyGet the authenticated Anvil user (from the API key) and the organizations they belong to (eid, name, slug). Good first call to discover org slugs/eids for other tools. GraphQL query: currentUser.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_get_organizationread-onlyFetch an Anvil organization and its PDF templates (casts) and workflows (welds). Provide either its slug or its eid (at least one is required). GraphQL query: organization.
Parameters:
eid— string — Organization eid. Provide this OR slug.slug— string — Organization slug (from anvil_current_user). Provide this OR eid.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_get_castread-onlyFetch a cast — an Anvil PDF template — by its eid: title, version number, and whether it is a template. Use the returned eid as the cast_eid for anvil_fill_pdf. GraphQL query: cast.
Parameters:
eid(required) — string — The cast (PDF template) eid.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_get_etch_packetread-onlyFetch an Etch e-signature packet by eid: its status, details URL, document group, and every signer (eid, aliasId, name, email, status, routing order). Use this to check signature progress. GraphQL query: etchPacket.
Parameters:
eid(required) — string — The Etch packet eid (returned by anvil_create_etch_packet).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_get_weldread-onlyFetch a weld — an Anvil workflow — by eid, including its forges (the individual form steps: eid, name, slug). GraphQL query: weld.
Parameters:
eid(required) — string — The weld (workflow) eid.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_get_weld_dataread-onlyFetch a weldData record — a single submission to a weld (workflow) — by eid: completion state, test flag, and creation time. GraphQL query: weldData.
Parameters:
eid(required) — string — The weldData (workflow submission) eid.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
anvil_fill_pdfdestructiveFill an Anvil PDF template (cast) with data and return the finished PDF as base64. REST: POST /fill/{castEid}.pdf. Returns { filename, byteLength, pdfBase64 }. The `data` object's keys are the template's field aliases.
Parameters:
cast_eid(required) — string — The cast (PDF template) eid to fill (from anvil_get_cast).data(required) — object — Object mapping the template's field aliases to values, e.g. { "name": "Sam", "date": "2026-07-16" }.title— string — Optional title embedded in the generated PDF metadata.fontSize— number — Optional default font size for filled text.textColor— string — Optional default text color as a hex string, e.g. #333333.
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
anvil_generate_pdfdestructiveGenerate a brand-new PDF from HTML or Markdown and return it as base64. REST: POST /generate-pdf. For type=html, pass data = { html, css? }. For type=markdown, pass data = [ { label, content }, ... ]. Returns { filename, byteLength, pdfBase64 }.
Parameters:
data(required) — For html: { html: "<h1>Hi</h1>", css?: "..." }. For markdown: [ { label: "Section", content: "# Title\n..." }, ... ].type— string — Source format. Default html.title— string — Optional title embedded in the generated PDF metadata.
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
anvil_create_etch_packetdestructiveCreate an Etch e-signature packet (documents + signers). GraphQL mutation: createEtchPacket. IMPORTANT: isDraft defaults to true (a safe draft that sends nothing). Setting isDraft=false with real signers SENDS signature-request emails to those signers. Use isTest=true while developing.
Parameters:
name(required) — string — Human-readable name for the packet.data— object — Optional payload data used to pre-fill the packet's documents.files— array — Array of file/document objects (casts or uploads) to include. Passed straight through to Anvil.isTest— boolean — Set true to create a test packet (no legal weight, no charge).isDraft— boolean — Default true. When true, creates a draft and sends nothing. Set false to activate and email signers.signers— array — Array of signer objects, e.g. [{ id, name, email, signerType, routingOrder, fields }]. Passed straight through to Anvil.signatureEmailBody— string — Optional body text for the signature-request email.signatureEmailSubject— string — Optional subject line for the signature-request email.
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
anvil_generate_etch_sign_urldestructiveGenerate a one-time embedded signing URL for a specific signer in an Etch packet (for iframe/redirect signing flows). GraphQL mutation: generateEtchSignURL. Returns { url }.
Parameters:
signer_eid(required) — string — The signer eid (from the packet's documentGroup.signers).client_user_id(required) — string — Your app's stable id for the signing user (ties the session to your user).
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.