Path: Connectors → Anvil → Configuration
What this connector does
Anvil is a paperwork-automation platform — it lets you upload PDF forms, fill them programmatically with structured data, build multi-step web workflows that feed into those forms, and route the resulting documents for e-signature. The Anvil connector exposes that surface to Wazzi as MCP tools so your team's AI assistants can render forms, kick off signing packets, and check status without leaving the chat.
Wazzi authenticates via HTTP Basic auth. You provide your Anvil API key; Wazzi base64-encodes it as the Basic username (with an empty password) and sends an Authorization: Basic … header on every outbound request. No OAuth flow, no token rotation cycle — one key, valid until you revoke it. The same key works against both Anvil's REST endpoints (PDF fill / generate) and its GraphQL endpoint (everything else).
The Wazzi connector exposes 29 tools total across four domains:
- PDF templates (Casts) (6 tools) — list, get, create from upload, update, publish, duplicate.
- Workflows (Welds) (8 tools) — list, get, list submissions, get submission, create, update, publish, duplicate.
- Webforms & submissions (Forge / Submission) (2 tools) — get a webform's field config, get a single submission.
- E-signature (EtchPackets / Signers) (8 tools) — list packets, get packet, get signer, create packet, send draft, generate embedded signing URL, re-notify signer, void document group.
- PDF operations (REST) (2 tools) —
fill_pdf(fill a Cast with data),generate_pdf(render inline Markdown/HTML). - Org / user (2 tools) —
get_current_userandget_organizationfor discovery. - Universal escape hatch (1 tool) —
call_anvil_graphqlfor anything not wrapped by a typed tool (webhook management, forge editing, etc.).
Before you start — getting your API key
You'll need an Anvil account with access to the organization whose templates and workflows you want to expose. If you're not sure what plan you're on, an admin on your Anvil account can confirm.
- Sign in to app.useanvil.com with your account.
- Open Settings → API Settings from the left-hand nav.
- Click Generate API key (or copy an existing one). Anvil issues two key types — a Development key (test mode, watermarked PDFs, free) and a Production key. Both work with this connector; pick the one that matches what you're doing.
- Treat the key like a password — it grants full read/write access to every template, workflow, and packet in the org it's scoped to.
Important — generate the key while signed in to your real account. If you create a key from outside a logged-in session (e.g. via a standalone API signup), Anvil will spin up an isolated sandbox organization that doesn't appear in your normal dashboard. Tools will work and PDFs will return, but you won't see the artifacts at app.useanvil.com under your own account. Always generate from Settings → API Settings inside your logged-in user to keep everything in one place.
Reference: Anvil's official API docs live at useanvil.com/docs. GraphQL schema reference is at graphql/reference.
What this connector unlocks for your team
Once configured, members with the right MCP permissions can ask Claude / ChatGPT / Cursor things like:
- "Fill the Account Update template with these guest details and return me the rendered PDF."
- "Generate a one-page Markdown summary as a PDF and email it to the owner."
- "List every PDF template in our Anvil org and show me which ones haven't been published yet."
- "Create a new e-signature packet from the rental agreement template, route it to brendon@example.com, and send it."
- "What's the status of packet
fOoQZz0o57xuJrXk38YZ— has the signer opened it?" - "Re-send the signing email to signer X — they said they didn't receive it."
- "Generate an embedded signing URL for signer Y so I can host the signing page in our portal."
- "Void document group Z — the customer cancelled the agreement."
- "Duplicate the Q3 trust agreement template into a Q4 variant so we can edit it without touching the live one."
The exact set of available actions depends on (a) the plan tier your Anvil account is on and (b) which MCP toggles are flipped on for the user's group in Wazzi — see Managing Permissions.
Steps — configuring Anvil in Wazzi
1. From the Connectors catalog, click Configure on the Anvil tile.
You'll land on Anvil's Configuration tab:
2. Fill in the API Key field.
- API Key — the key you copied from Anvil's Settings → API Settings page. Stored encrypted at rest in Wazzi.
3. Click Test Connection.
Wazzi runs a tiny currentUser GraphQL query on your behalf. On success the health check reports the authenticated user and their organization — e.g. "Connected — Brendon @ Acme Co". If the key is valid but tied to a sandbox account, you'll see a generated org name (e.g. "APIKeyDev rWlVfkl3PpljnUyDVuKO @ rWlVfkl3PpljnUyDVuKO") — that means the key was created outside a logged-in session and the artifacts will live in an isolated sandbox; see the note above on regenerating from inside your account.
4. Click Save Configuration.
Anvil moves to the Active section of the catalog and the dot turns green.
Troubleshooting
- "401 Unauthorized" on Test Connection. The API key is wrong or has been revoked. Most common cause: trailing whitespace when pasting the key. Re-copy from Settings → API Settings and try again. If still failing, regenerate the key — old keys can be silently revoked from the same page.
- Connection succeeds but the user/org name is a random string. Your key was generated outside a logged-in Anvil session, so Anvil auto-provisioned a sandbox org for it. The connector works, but your templates and packets won't appear in your normal dashboard at app.useanvil.com. Generate a fresh key from inside Settings → API Settings while signed in to your real account, paste it into Wazzi, and re-run Test Connection.
- "Variable $files used in position expecting type [EtchFile!]" on create_etch_packet. Anvil rejected your
filesarray because an entry doesn't match theEtchFileshape. Each entry must include a uniqueidand one ofcastEid(existing template) orbase64File(inline upload). See the EtchPacket reference for the full schema. - "Not this user's turn to sign" on generate_etch_sign_url. The signer's
routingOrderis higher than the currently-active signer. Anvil enforces sequential routing — only the active signer can be issued a sign URL. Either wait for prior signers to finish, or restructure the packet so the embedded signer isroutingOrder: 1. - "Invalid PDF filename" on update_cast. The
namefield on a Cast is the underlying PDF filename — it must end in.pdf(e.g.agreement.pdf). Usetitlefor the human-readable display label. - fill_pdf returns a tiny / unstyled PDF. The fields object didn't match the template's expected field ids. Run
get_caston the target template, look atconfig.fields[].id, and key yourdataobject by those exact ids. - "voidedReason is required" on void_document_group. Anvil requires a reason string when voiding a packet, recorded in the audit log. Pass a brief explanation (e.g.
"Customer cancelled").
Best practices
- Use a Development key while iterating, switch to Production once stable. Development keys watermark every rendered PDF and don't count against your quota, so they're ideal for the build-and-test phase. Production keys count toward your plan and produce clean (no-watermark) output.
- Set
isTest: trueon EtchPackets while testing. Even on a Production key, packets created withisTest: trueare free and watermarked, so you can exercise the full send → sign → void flow without consuming quota. - Don't hand-write Cast field configs. Anvil's
configJSON encodes box positions, types, and aliases — non-trivial to construct manually. Either upload a PDF with AcroForm fields (and letcreate_castwithdetectFields: trueauto-detect them) or edit field positions in Anvil's UI, then read the config back viaget_cast. - Templates and workflows can be archived but not deleted. Anvil has no hard-delete;
update_cast/update_weldwithisArchived: trueis the cleanup path. Archived items don't count toward active limits. - Rotate the API key periodically. Regenerate in Settings → API Settings every quarter and update Wazzi. Old keys remain valid until you explicitly revoke them.
- Restrict who can invoke send_etch_packet and create_etch_packet in Wazzi. Sent packets land in your signer's inbox immediately and consume quota. Only grant the send permission to groups that legitimately need it — see Managing Permissions.
Frequently asked questions
Does Wazzi store my API key in plaintext?
No. The key is encrypted at rest with per-org keys and only decrypted at the moment an outbound call is made.
Why is the Basic auth username my API key and not an email?
Anvil's auth model uses the API key as the Basic username with no password — the trailing colon in the base64-encoded string ({api_key}:) makes Anvil identify the request by key alone. There's no separate email/username concept on the API side.
Can I connect multiple Anvil organizations?
Anvil is a single-instance connector. If you need to expose templates from more than one Anvil org from the same Wazzi org, file a feature request for multi-instance support (similar to how the High Level connector works). For now, pick the Anvil org whose templates and workflows you need most.
What's the difference between a Cast, a Forge, and a Weld?
A Cast is a PDF template — boxes, field types, signature placement. A Forge is a webform — input fields, validation, layout. A Weld is a workflow that ties one or more Forges and Casts together end-to-end (collect data via the form, fill the PDF, route for signature). Submissions live as WeldDatas (workflow-level) or Submissions (single Forge).
What happens to fill_pdf and generate_pdf output?
Both return the rendered PDF as base64 in the tool response (with content_type and byte_length). For practical use, the consuming agent decodes the base64 and either saves it to disk, attaches it to an email, or feeds it into create_etch_packet as a base64File.
How do I get the final signed PDF?
Once a packet completes, the EtchPacket.documentGroup.downloadZipURL field on the response gives you a direct URL to a zip of the signed documents. Fetch it with the same API key in the Authorization header. We may add a typed download_signed_documents tool in a future release; for now, the URL is accessible via get_etch_packet.
What if I need a mutation that doesn't have a typed tool?
The call_anvil_graphql tool is a universal escape hatch — send any GraphQL query or mutation with arbitrary variables. Useful for webhook setup, forge editing, weld merging, and other niche operations that aren't covered by the typed surface.
Are test packets visible in the Anvil dashboard?
Yes — packets created with isTest: true appear in your Anvil dashboard with a "TEST" watermark and a separate counter. They behave the same as production packets but don't count toward your plan's quota.
What's next
- Restrict who in your org can invoke Anvil actions: Managing Permissions.
- Wire Anvil into your AI tool: Connecting Claude or Connecting ChatGPT.
- Browse other connectors: Browsing the Connectors Catalog.