# Firma MCP connector

The Firma connector brings signing requests, templates, workspaces and companies into Claude, ChatGPT, Cursor or any MCP client, so your team can prepare, send and track documents for signature from a conversation, inside each person's own Firma access.

Source: https://elaichi.ai/connectors/firma/

## Facts

| | |
| --- | --- |
| Application | Firma |
| Category | E Signature |
| AI tools | 48 |
| Authentication | Connects with an API key |
| Needs your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. 48 tools is past the 30-tool threshold, so clients use `search_tools` and `execute_tool` |

## What you can ask once Firma is connected

- Which Firma templates changed in the last 30 days?
- List Firma workspaces with no templates attached.
- Show Firma companies added this quarter and their workspaces.

## Connect Firma in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Firma.
2. Optionally set Share with, then press Connect.
3. Paste a Firma API key. One person generates a token in Firma and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Firma tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Connect Firma to Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Connect Firma to ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Connect Firma to Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Firma to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Firma tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Firma through Elaichi

### Send the contract before the call ends

Sales. Pick the right Firma template, fill in the customer's details and send the signing request while the deal is still warm. The rep never leaves the conversation to do it.

### See which contracts are still unsigned

Sales. Ask for every open signing request this week and find out which ones are waiting on the customer. Chase the right people instead of scrolling through the Firma dashboard.

### Get offer letters out the same day

HR. Create a signing request from the offer letter template, drop in the candidate's name, title and start date, and send it. Cancel and reissue if the terms change before they sign.

### Keep the NDA template current

Legal. Update the standard NDA in Firma, duplicate it for a regional variant, and check which fields and signers each version expects. Retire old templates so nobody sends them by mistake.

### Track vendor agreements through to signature

Finance. List the signing requests tied to a supplier onboarding, check where each one stands, and cancel any that were sent against the wrong terms. Reminder settings on each template are visible too.

### Set up a workspace for a new team

Operations. Create a Firma workspace for a new office or business unit, keep company details up to date, and see which templates and users belong where. Everything lands in the audit log.

## Frequently asked questions

### How do I connect Firma to Claude?

Connect Firma in Elaichi first, which asks you to paste the API key from your Firma account settings. There is no OAuth application to register and no client ID or secret to generate. Then open Claude, go to Customize, then Connectors, then Add, and paste the Elaichi endpoint, https://api.elaichi.ai/mcp. Sign in as yourself and Firma is ready to use in Claude.

### Does Firma work with ChatGPT and Cursor as well as Claude?

Yes. Once Firma is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect Firma once and every client sees it.

### What can an AI agent actually do with my Firma data?

With Firma connected, an agent can list your signing requests and check where each one stands, create a new signing request from a template and send it, update one before it goes out, or cancel one that was sent in error. It can also create, update, duplicate and delete templates, look up the fields, signers and reminder settings on a template, and manage workspaces and company details. Short, concrete asks such as "send the NDA template to jane@acme.com" work better than long instructions.

### Does connecting Firma give the AI access to every workspace and template?

No. Every call to Firma runs inside the access of the person who signed in, so an agent sees only the workspaces, templates and signing requests that person can already see in Firma. Elaichi can narrow that access further with restrictions, but it can never widen it beyond what Firma itself allows that person.

### Can my team share one Firma connection?

Yes. One person connects Firma in Elaichi and shares the connection with a team, and nobody else ever handles the Firma API key. Each teammate still signs in to Elaichi as themselves, so every signing request sent or template changed through the shared connection is logged under their own name.

### Can I stop an agent from deleting or changing things in Firma?

Yes. Restrictions in Elaichi apply per action, so you can allow reading and sending Firma signing requests while blocking template deletion, cancellation or any updates. A blocked action is never advertised to Claude, ChatGPT, Cursor or any other client, so no prompt, however worded, can reach it.

### What happens to a Firma connection when someone leaves?

Offboarding a person in Elaichi ends their access to Firma through every connected client at once. If they had shared a Firma connection with a team, it keeps working for everyone else. Disconnecting Firma once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client at the same time.

## All 48 Firma tools

Every tool below is callable through https://api.elaichi.ai/mcp once Firma is connected, subject to the toolbox it is in and the restrictions on the caller.

- **List all Firma companies** (List). Retrieve information about the authenticated firma company. Returns: id, company_name, account_owner, account_owner_email, website, icon_url, credits, date_created, date_changed, name, language, created_date, updated_date.
- **Update a Firma company by ID** (Update). Fully replace all firma company details in a single PUT operation. Returns: id, company_name, account_owner, account_owner_email, website, icon_url, credits, date_created, date_changed, name, language, created_date, updated_date. Required: name, account_owner, account_owner_email, website.
- **Firma companies partial update** (Update). Partially update specific firma company fields via PATCH; only the provided fields are changed. At least one field must be supplied. Returns: id, company_name, account_owner, account_owner_email, website, icon_url, credits, date_created, date_changed, name, language, created_date, updated_date.
- **List all Firma workspaces** (List). List firma workspaces for the authenticated company. Returns: id, name, protected, date_created, date_changed. Supports optional filtering by name, protected status, and creation date range, and sorting by name, protected, or created_on.
- **Create a Firma workspace** (Create). Create a new firma workspace for the authenticated company. Returns: id, name, protected, date_created, date_changed, api_key, created_date, updated_date. Required: name. All workspaces are created as non-protected by default.
- **Update a Firma workspace by ID** (Update). Fully replace a firma workspace by id (full replacement operation requiring the name field). Returns: id, name, protected, date_created, date_changed, api_key, created_date, updated_date. Required: id, name.
- **Firma workspaces partial update** (Update). Partially update a firma workspace by id via PATCH. Returns: id, name, protected, date_created, date_changed, api_key, created_date, updated_date, results, pagination. Required: id. Only the name field can be updated; the protected field is read-only and cannot be changed via API.
- **Get single Firma workspace by ID** (Get). Get a specific workspace in Firma using id. Returns fields including id, name, api_key, protected, created_date, updated_date, webhook_enabled, and webhook_secret details.
- **List all Firma templates** (List). List firma templates with optional filtering by name or date range. Returns: id, name, description, document_url, document_url_expires_at, date_created, date_changed, page_count, expiration_hours, credit_cost, settings, recipients, fields, created_date, updated_date.
- **Create a Firma template** (Create). Create a new firma template from a base64-encoded PDF document. Returns: id, name, description, document_url, document_url_expires_at, date_created, date_changed, page_count, expiration_hours, credit_cost, settings, recipients, fields, created_date, updated_date. Required: name, document.
- **Get single Firma template by ID** (Get). Get a single firma template by id. Returns the full template object including id, name, description, document_url, document_url_expires_at, page_count, expiration_hours, credit_cost, settings, recipients, fields, created_date, and updated_date. Required: id.
- **Update a Firma template by ID** (Update). Comprehensively update a firma template including metadata, users, fields, and reminders. Returns the full updated template including id, name, description, document_url, document_url_expires_at, page_count, expiration_hours, credit_cost, settings, recipients, fields, created_date, and updated_date. Required: id. At least one body section must be provided.
- **Delete a Firma template by ID** (Delete). Soft-delete a firma template by id. The template is marked as deleted but its data is retained. Returns: message, template_id. Required: id.
- **Firma templates duplicate** (Duplicate). Duplicate a firma template into a new signing request, copying all fields, recipients, reminders, and settings. Returns: message, signing_request. Required: id.
- **Firma templates partial update** (Update). Partially update a firma template by id. Supports updating template properties (name, description, document, expiration_hours, settings) OR a single user — cannot mix both in one request. Returns: message, updated_fields, user, template_id. Required: id.
- **List all Firma template users** (List). List all recipients/users associated with a specific firma template. Returns: id, name, email, designation, order. Required: template_id.
- **List all Firma template fields** (List). List all fields configured for a specific firma template. Returns each field's id, field_name, field_type, required, position_x, position_y, page_number, recipient_id, variable_name, dropdown_options, read_only, and format_rules. Required: template_id.
- **List all Firma template reminders** (List). List all reminders configured for a specific firma template. Returns: id, hours, subject, message, all_users, template_user_id, date_created, date_changed. Required: template_id.
- **List all Firma signing requests** (List). List signing requests in firma with optional filters by name, status, date range, signer email, and signer name. Returns each item including id, name, description, document_url, expiration_hours, created_date, recipients, and fields.
- **Create a Firma signing request** (Create). Create a new firma signing request from a base64-encoded PDF document or an existing template (provide either document or template_id, not both). For document-based creation, allow_editing_before_sending is automatically set to true. Returns: id, name, description, document_url, document_url_expires_at, document_page_count, status, expiration_hours, settings, template_id, date_created, date_sent,…
- **Get single Firma signing request by ID** (Get). Get a specific firma signing request by id. Returns: id, name, description, document_url, document_url_expires_at, document_page_count, status, expiration_hours, settings, template_id, date_created, date_sent, date_finished, date_cancelled, expires_at, certificate, final_document_download_url, final_document_download_error, page_count, credit_cost, created_date, updated_date, sent_date,…
- **Update a Firma signing request by ID** (Update). Comprehensively update a firma signing request's properties, recipients, fields, and reminders in a single call. Returns: signing_request, changes. Required: id. Cannot update after the request has been sent, completed, or cancelled.
- **Firma signing requests send** (Send). Send a firma signing request to all recipients via email, triggering email delivery and recording the sent timestamp. Returns: message, signing_request_id, recipients_notified, sent_date, expires_at. Required: id.
- **Firma signing requests cancel** (Cancel). Cancel a firma signing request that has been sent but not yet completed. Returns: message, signing_request_id, cancelled_on, notify_signers. Required: id. Cannot cancel requests that are already finished, cancelled, or not yet sent.
- **Firma signing requests partial update** (Update). Partially update a firma signing request by id. Supports updating name, description, document, expiration_hours, and settings, OR a single recipient (add or update) — cannot combine both in one request, and updates are blocked after the request has been sent, completed, or cancelled. Returns the updated signing request including id, name, description, created_date, updated_date, recipients,…
- **List all Firma signing request users** (List). List all recipients/users for a specific signing request in firma. Returns: id, name, email, designation, order, finished_date, signature_details. Required: signing_request_id.
- **List all Firma signing request fields** (List). List all fields for a specific firma signing request, including their values and completion status. Returns: id, field_name, field_type, field_value, completed. Required: signing_request_id.
- **List all Firma signing request reminders** (List). List all reminders scheduled for a specific signing request in firma. Returns: id, hours, subject, message, all_users, template_user_id, date_created, date_changed. Required: signing_request_id.
- **Create a Firma signing request resend** (Create). Resend a firma signing request notification to one or more eligible recipients. Returns: message, signing_request_id, recipients_notified, recipients. Required: signing_request_id, recipient_ids. Cannot resend to recipients who have already signed; for requests with signing order enabled, only recipients at the current active order may be targeted.
- **List all Firma webhooks** (List). List firma webhooks with optional filtering and sorting. Returns: id, url, events, enabled, date_created, date_changed, description, consecutive_failures, auto_disabled_at, created_at, updated_at. Supports filtering by enabled status, url, event type, and creation date range.
- **Create a Firma webhook** (Create). Create a new firma webhook. Returns: id, url, events, enabled, date_created, date_changed, description, consecutive_failures, auto_disabled_at, created_at, updated_at. Required: url, events.
- **Get single Firma webhook by ID** (Get). Get a specific firma webhook by id. Returns: id, url, events, enabled, date_created, date_changed, description, consecutive_failures, auto_disabled_at, created_at, updated_at. Required: id.
- **Update a Firma webhook by ID** (Update). Update an existing firma webhook by id. Returns: id, url, events, enabled, date_created, date_changed, description, consecutive_failures, auto_disabled_at, created_at, updated_at. Required: id.
- **Delete a Firma webhook by ID** (Delete). Soft-delete a firma webhook by id, retaining data but marking the webhook as deleted. Returns: message, webhook_id. Required: id.
- **Create a Firma webhook test** (Create). Send a test payload to a firma webhook URL to verify it is working correctly. Returns: message, webhook_id, test_payload, response_status, response_time_ms. Required: webhook_id.
- **Create a Firma webhooks rotate secret** (Create). Rotate the webhook signing secret for the company in firma. Generates a new secret while keeping the old one valid for 7 days to allow graceful migration. Returns: message, new_secret, old_secret_expires_at, rotated_at. Rate limited to 1 request per hour.
- **List all Firma webhooks secret status** (List). Get the current webhook secret rotation status in firma. Returns: has_secret, secret_created_at, last_rotated_at, old_secret_expires_at, old_secret_still_valid.
- **Create a Firma generate template token** (Create). Generate a JWT token for embedding a firma template in your application. Returns: token, expires_at, jwt_record_id. Required: companies_workspaces_templates_id. Token expires after 24 hours.
- **Create a Firma revoke template token** (Create). Revoke a previously generated JWT template token in firma, preventing it from being used for template embedding. Returns: message, jwt_id, revoked_at. Required: jwt_id.
- **Create a Firma jwt generate signing request** (Create). Generate a JWT token in firma for embedding a signing request editor. Returns: jwt, jwt_id, expires_at, signing_request_id. Required: companies_workspaces_signing_requests_id. The JWT expires after 7 days.
- **Create a Firma jwt revoke signing request** (Create). Revoke a previously generated signing request JWT token in firma, preventing it from being used for embedded editing. Returns: message, jwt_id, revoked_at. Required: jwt_id.
- **Create a Firma save embedded signing request** (Create). Save changes to an embedded signing request in firma. Returns a confirmation message. Required: companies_workspaces_signing_requests_id.
- **Create a Firma send embedded signing request** (Create). Send an embedded signing request in firma to notify recipients and trigger the signing workflow. Returns: message, signing_request_id. Required: companies_workspaces_signing_requests_id.
- **Create a Firma get embedded signing request** (Create). Retrieve embedded signing request data from firma for use in an embedded editor. Returns the complete signing request object including signing_request, fields, recipients, and reminders. Required: companies_workspaces_signing_requests_id.
- **List all Firma documents** (List). List documents (signing requests) in firma via this deprecated legacy endpoint — use /signing-requests instead. Returns: id, name, description, document_url, document_url_expires_at, document_page_count, status, expiration_hours, settings, template_id, date_created, date_sent, date_finished, date_cancelled, expires_at, certificate, final_document_download_url, final_document_download_error,…
- **Create a Firma document** (Create). Create a new document (signing request) in firma via this deprecated legacy endpoint — use /signing-requests instead. Returns the created signing request including id, name, description, document_url, page_count, expiration_hours, credit_cost, settings, recipients, fields, created_date, and related timestamp fields. Required: name.
- **List all Firma settings** (List). Retrieve workspace settings for a firma workspace. Returns: workspace_id, signing_request_email_header, signing_request_email_body, team_email, timezone. Required: workspace_id.
- **Update a Firma setting by ID** (Update). Update workspace settings for a firma workspace. Returns: workspace_id, signing_request_email_header, signing_request_email_body, team_email, timezone. Required: workspace_id.
