# Penneo MCP connector

The Penneo connector lets Claude, ChatGPT, Cursor and the Elaichi Agent create casefiles, build and publish forms, and read submissions and answers in Penneo, with every action running as the signed-in person and recorded in an audit log.

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

## Facts

| | |
| --- | --- |
| Application | Penneo |
| Category | E Signature |
| AI tools | 22 |
| Authentication | Connects over OAuth |
| Needs your own OAuth app | Yes |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | Yes |

## What you can ask once Penneo is connected

- Which Penneo casefiles are still waiting on signatures?
- Show form requests created this week and their answers.
- List every Penneo form used by the onboarding team.

## Connect Penneo in Elaichi

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

1. Open Connections, choose Add connection, and pick Penneo.
2. Optionally set Share with, then press Connect.
3. Supply your own Penneo app, then approve. Penneo needs an OAuth app you register yourself, so bring its client ID and secret. One person does this once for the organization.

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

## Connect Penneo 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 Penneo 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 Penneo 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 Penneo 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 Penneo 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 Penneo through Elaichi

### Open a casefile for a new agreement

Legal. Ask for a Penneo casefile to be created for a supplier agreement or NDA, then check which files it holds before anyone is asked to sign.

### Build and publish an onboarding form

HR. Draft an onboarding form in Penneo from a description of the fields you need, publish the version, and send a form request to each new starter.

### Get a contract signed after the close

Sales. When a deal closes, have a Penneo casefile created for the customer contract in the same conversation, without opening another tab.

### Review what people actually submitted

Compliance. Pull the answers from a Penneo form's submissions and have them summarized, so you can spot missing declarations before the deadline.

### Update a form and roll back safely

Operations. Change a Penneo form, publish the new version, and restore the previous one if something is wrong, all by asking in plain language.

### Check answers on signed casefiles

Finance. Ask which casefile answers came back for an approval or expense form in Penneo, and get a clean list rather than clicking through each one.

## Frequently asked questions

### How do I connect Penneo to Claude?

Connect Penneo in Elaichi first, then in Claude go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Penneo connects over OAuth, but Penneo requires the customer to register an OAuth application inside Penneo themselves, so one person enters that client ID and secret in Elaichi once. After that, everyone else simply signs in to Penneo in a normal browser window when Claude first asks.

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

Yes. Penneo is connected once in Elaichi, and the same endpoint, https://api.elaichi.ai/mcp, is pasted into Claude, ChatGPT, Cursor or any other MCP client. The Elaichi Agent uses it too, so nobody sets Penneo up twice.

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

With Penneo connected, an agent can create a casefile for a document that needs signing, list the files and answers on a casefile, and build, update, publish, archive or restore forms. It can also send a form request to someone and read back the submissions and answers they return, so you can ask questions like who has not yet filled in the onboarding form.

### Does connecting Penneo give the AI access to all my casefiles and forms?

No. Every call to Penneo runs as the person who signed in, so the AI sees only the casefiles and forms that person could already open in Penneo. Elaichi can narrow that access further, for example by hiding delete actions, but it can never grant more than the person already has.

### Can my team share one Penneo connection?

Yes. One person connects Penneo in Elaichi and shares the connection with a team, and nobody else ever handles the client ID, secret or a password. Each teammate still signs in to Elaichi as themselves, so the audit log names the actual person who created a casefile or published a form.

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

Yes. Restrictions in Elaichi apply per action, so you can allow reading Penneo submissions while blocking form deletion or version changes. A blocked action is never shown to Claude, ChatGPT or Cursor at all, so no prompt, however worded, can reach it.

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

Offboarding a person in Elaichi ends their access to Penneo through every client at once. A Penneo connection shared with a team keeps working for everyone else. If you want Penneo gone entirely, disconnecting it once in Elaichi removes it from Claude, ChatGPT, Cursor and the Elaichi Agent together.

## All 22 Penneo tools

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

- **Create a Penneo oauth** (Create). Exchange credentials for a Penneo access token using the authorization code, refresh token, or API keys grant. Returns: grant_type. Required: grant_type, client_id, client_secret.
- **Delete a Penneo oauth by ID** (Delete). Revoke a Penneo refresh token, rendering it permanently invalid. Returns an empty 200 response on success regardless of whether the token existed or was already invalid. Required: token.
- **List all Penneo oauth** (List). Initiate the Penneo OAuth 2.0 authorization flow by redirecting the user's browser to Penneo's authorization endpoint. Returns a 302 redirect to the registered redirect_uri with an authorization code appended as a query parameter. Required: response_type, redirect_uri, client_id, code_challenge.
- **List all Penneo version** (List). Get Penneo API version information for the running app. Returns: language, additionalSignersConfig.
- **List all Penneo casefile answers** (List). List all submission answers for a penneo casefile. Returns answer records whose fields are specific to the casefile's form question schema defined in penneo; the response shape is form-schema-specific and cannot be enumerated from the API reference — consult the upstream penneo Collect docs for the field-level breakdown. Required: casefile_id.
- **List all Penneo casefile files** (List). List files attached to a penneo casefile by casefile id. Returns a list of file metadata objects; the available source documents the response as file metadata without enumerating individual fields beyond the universal identifiers id, created_at, and updated_at. Required: casefile_id.
- **List all Penneo forms** (List). List penneo forms with optional status filtering and sorting. Returns: id, language, additionalSignersConfig, createdAt, updatedAt.
- **Get single Penneo form by ID** (Get). Get a single penneo form by id, including its sections and signer configuration. Returns: id, language, additionalSignersConfig, createdAt, updatedAt. Required: id.
- **Create a Penneo form** (Create). Create a new penneo form with sections and input fields. Returns: id, language, additionalSignersConfig, createdAt, updatedAt. Required: language, sections.
- **Update a Penneo form by ID** (Update). Update an existing penneo form by id. If the form is in DRAFT status, updates the existing draft; if ACTIVE, creates a new DRAFT version. Returns: id, language, additionalSignersConfig, createdAt, updatedAt. Required: id, language, sections.
- **Delete a Penneo form by ID** (Delete). Archive a penneo form by id, setting its status to ARCHIVED. Returns an empty 200 response on success. Required: id.
- **Update a Penneo form version by ID** (Update). Update a specific version of a Penneo form with sections and input fields. If the version is DRAFT, updates the existing draft; if ACTIVE, creates a new DRAFT version. Returns the updated form object including language and additionalSignersConfig. Required: external_id, version, language, sections.
- **Create a Penneo form request** (Create). Create a prefilled form request in Penneo for a specified form, with pre-populated field values. Returns a 200 success response when the form request is created. Required: form_id, answers.
- **List all Penneo form request answers** (List). List all submitted answers for a specific Penneo form request. Returns the submission data object; the field structure is form-specific and depends on the form's field definitions in Penneo. Required: form_id, id.
- **List all Penneo form submissions** (List). List Penneo form submissions for a specific form. Returns: id, created_at, grant_type. Required: form_id. Supports filtering by completedAfter and completedBefore ISO-8601 UTC datetimes.
- **List all Penneo form submission answers** (List). List all answers for a Penneo form submission. Returns: id, grant_type. Required: form_id, id.
- **Create a Penneo casefile** (Create). Create a new Penneo case file with documents and signers via a multipart/form-data POST. PDF file uploads are supported as part of the request body. Processing is asynchronous; the returned job reference can be used to poll progress via the Penneo Queue Status Check endpoint. Returns: jobs, status, message. Required: data, files.
- **Create a Penneo job status** (Create). Check the status of an asynchronous Penneo case file creation job by polling with its UUID and payload hash. Returns: uuid, result, payload, retries, createdAt, jobStatus, updatedAt, maxRetries, payloadHash, errorMessage. Required: uuid, payloadHash.
- **Create a Penneo form version archive** (Create). Archive a specific version of a penneo form, allowing management of existing form versions without affecting the currently published version. Returns an empty 200 response on success. Required: external_id, version.
- **Create a Penneo form version publish** (Create). Publish a specific version of a Penneo form, making it the active published version. Returns a 200 response on success. Required: external_id, version.
- **Create a Penneo form version restore** (Create). Restore a penneo form to a specific previous version. Returns a 200 response on success. Required: external_id, version.
- **Create a Penneo form publish** (Create). Publish a Penneo form by its external ID to make it available for end-users. Returns: id, language, additionalSignersConfig, createdAt, updatedAt, grant_type. Required: external_id.
