Form backend as 29 tools: create endpoints, route submissions, publish pages, run the inbox.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer token: a ShipMyForm workspace API key (smf_…). Not needed to connect — without it the server still lists its tools and offers sign_up, which creates an account and returns a key. Keys live in Settings → API keys, on every plan including free.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Route a form's submissions somewhere: email, webhook, Slack, Discord, Airtable, HubSpot, Telegram and more. Get the config fields from list_connector_types. OAuth connectors (Google Sheets, Notion) must be added in the dashboard.
Connector type from list_connector_types, e.g. 'slack'
Field values keyed by the config field names
Form id, e.g. frm_abc123
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Route a form's submissions somewhere: email, webhook, Slack, Discord, Airtable, HubSpot, Telegram and more. Get the config fields from list_connector_types. OAuth connectors (Google Sheets, Notion) must be added in the dashboard.
| Argument | Type | Description |
|---|---|---|
| type* | string | Connector type from list_connector_types, e.g. 'slack' |
| config* | object | Field values keyed by the config field names |
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId",
"type",
"config"
],
"properties": {
"type": {
"type": "string",
"description": "Connector type from list_connector_types, e.g. 'slack'"
},
"config": {
"type": "object",
"description": "Field values keyed by the config field names",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}Mint another API key for this workspace (shown once), optionally narrower than this one. A key can never grant scopes it does not itself hold, so this is the safe way to hand a limited key to another agent.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| preset | string | Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage |
| scopes | array | Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"preset": {
"enum": [
"full",
"wiring",
"readonly",
"triage"
],
"type": "string",
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage"
},
"scopes": {
"type": "array",
"items": {
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
],
"type": "string"
},
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes."
}
}
}Create a form and get its endpoint plus a paste-ready HTML snippet. Email notifications to the account owner are set up automatically. Works on every plan.
| Argument | Type | Description |
|---|---|---|
| name* | string | Human-readable form name, e.g. 'Contact form' |
| purpose | string | What the form is for, in a sentence. Helps the spam classifier. |
| allowedDomains | array | Sites allowed to submit, e.g. ['example.com']. Empty = any. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Human-readable form name, e.g. 'Contact form'"
},
"purpose": {
"type": "string",
"maxLength": 500,
"description": "What the form is for, in a sentence. Helps the spam classifier."
},
"allowedDomains": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Sites allowed to submit, e.g. ['example.com']. Empty = any."
}
}
}Delete a form; its endpoint stops accepting submissions.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}Permanently delete submissions (and their files).
| Argument | Type | Description |
|---|---|---|
| ids* | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"minItems": 1
}
}
}All of a form's submissions (up to 2,000) as CSV text, optionally filtered by status.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
| status | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"status": {
"enum": [
"ok",
"spam",
"flagged"
],
"type": "string"
}
}
}The account's email, verification state, plan, limits, usage and dashboard URL.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}A self-service billing portal URL: change plan, update the card, cancel.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}A form's full configuration, connectors and hosted-page status.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}A copy-paste form snippet for a framework (html, react, vue, or fetch) wired to the form's endpoint.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
| framework | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"framework": {
"enum": [
"html",
"react",
"vue",
"fetch"
],
"type": "string",
"default": "html"
}
}
}One submission with spam signals and delivery history.
| Argument | Type | Description |
|---|---|---|
| submissionId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"submissionId"
],
"properties": {
"submissionId": {
"type": "string"
}
}
}Delivered / spam-held / flagged counts for a form, plus workspace quota usage. Works on every plan.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}Mark submissions as spam, ok (not spam) or flagged. spam/ok also teach the classifier, so your judgement improves future filtering. This is how you triage in your own environment: list, decide, label.
| Argument | Type | Description |
|---|---|---|
| ids* | array | |
| label* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ids",
"label"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"minItems": 1
},
"label": {
"enum": [
"ok",
"spam",
"flagged"
],
"type": "string"
}
}
}API keys on this workspace (metadata only).
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Every destination submissions can be routed to, with the config fields each needs and which plan it requires.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Connectors on a form with their status and last error.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}The workspace's forms with their public endpoint URLs.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Read submissions across the workspace or for one form, with filters (status, date range, text search, country, attachments, failed deliveries) and paging. Spam is excluded unless status is 'spam'. Requires a paid plan.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text search across field values |
| sort | string | |
| limit | integer | |
| since | string | ISO date; received on/after |
| until | string | ISO date; received before |
| formId | string | Form id, e.g. frm_abc123 |
| offset | integer | |
| status | string | |
| hasFiles | boolean | |
| countries | array | ISO 3166 alpha-2 codes |
| deliveryFailed | boolean |
Publish a standalone page for the form on shipmyform.com (no website needed) and get its URL plus an embed script. Uses the designed page if one exists, otherwise a default email + message form.
| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}| Argument | Type | Description |
|---|---|---|
| connectorId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"connectorId"
],
"properties": {
"connectorId": {
"type": "string"
}
}
}Email a fresh 6-digit verification code to the account's address.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Revoke a key by id. The key in use on this connection cannot revoke itself.
| Argument | Type | Description |
|---|---|---|
| keyId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"keyId"
],
"properties": {
"keyId": {
"type": "string"
}
}
}| Argument | Type | Description |
|---|---|---|
| active* | boolean | |
| connectorId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"connectorId",
"active"
],
"properties": {
"active": {
"type": "boolean"
},
"connectorId": {
"type": "string"
}
}
}Start a ShipMyForm account from an email address, with no browser. A 6-digit code is emailed to the address; verify_account with { email, code } then returns the API key. Works without authentication. Also works for an existing account (the code approves API access).
| Argument | Type | Description |
|---|---|---|
| agent | string | Your name, e.g. 'Claude Code', shown in the verification email. |
| email* | string | The user's email address. Ask for it; never invent one. |
| preset | string | Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage |
| scopes | array | Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes. |
| workspaceName | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"email"
],
"properties": {
"agent": {
"type": "string",
"maxLength": 40,
"description": "Your name, e.g. 'Claude Code', shown in the verification email."
},
"email": {
"type": "string",
"description": "The user's email address. Ask for it; never invent one."
},
"preset": {
"enum": [
"full",
"wiring",
"readonly",
"triage"
],
"type": "string",
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage"
},
"scopes": {
"type": "array",
"items": {
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
],
"type": "string"
},
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes."
},
"workspaceName": {
"type": "string",
"maxLength": 80
}
}
}Get a hosted checkout URL for the Starter or Business plan. Payment is completed by a person on that page; the plan activates automatically afterwards (check with get_account).
| Argument | Type | Description |
|---|---|---|
| plan* | string | |
| period | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"plan"
],
"properties": {
"plan": {
"enum": [
"starter",
"pro"
],
"type": "string"
},
"period": {
"enum": [
"monthly",
"annual"
],
"type": "string",
"default": "monthly"
}
}
}Send a test delivery through a connector and report the result.
| Argument | Type | Description |
|---|---|---|
| connectorId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"connectorId"
],
"properties": {
"connectorId": {
"type": "string"
}
}
}| Argument | Type | Description |
|---|---|---|
| formId* | string | Form id, e.g. frm_abc123 |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
}
}Change any subset of a form's settings: name, purpose, allowedDomains, redirectUrl, spamMode, active, storeSubmissions, validation rules, blocklist, autoResponder (Pro).
| Argument | Type | Description |
|---|---|---|
| name | string | |
| active | boolean | |
| formId* | string | Form id, e.g. frm_abc123 |
| purpose | any | |
| spamMode | string | How hard this form filters: minimal (nothing is filtered, paid plans only), relaxed (flag but always deliver), standard, strict. Abuse protection — rate limits, honeypot — is unaffected. |
| blocklist | array | Emails, @domains or keywords that mark a submission as spam |
| validation | any | Server-side rules by field, e.g. { "email": { "required": true, "type": "email" }, "message": { "minLength": 10 } }. null clears. |
| redirectUrl | any | Absolute URL visitors are sent to after submitting |
| autoResponder | object | |
Prove the address with the 6-digit code emailed by sign_up. Without a key on the connection, pass the email too: on success this returns the API key (shown once). Turns on email notifications.
| Argument | Type | Description |
|---|---|---|
| code* | string | |
| agent | string | |
| string | Required when not yet connected with a key | |
| preset | string | Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage |
| scopes | array | Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 6,
"minLength": 6
},
"agent": {
"type": "string",
"maxLength": 40
},
"email": {
"type": "string",
"description": "Required when not yet connected with a key"
},
"preset": {
"enum": [
"full",
"wiring",
"readonly",
"triage"
],
"type": "string",
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage"
},
"scopes": {
"type": "array",
"items": {
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
],
"type": "string"
},
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"description": "Free-text search across field values"
},
"sort": {
"enum": [
"newest",
"oldest",
"score"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"since": {
"type": "string",
"description": "ISO date; received on/after"
},
"until": {
"type": "string",
"description": "ISO date; received before"
},
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0
},
"status": {
"enum": [
"ok",
"spam",
"flagged"
],
"type": "string"
},
"hasFiles": {
"type": "boolean"
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "ISO 3166 alpha-2 codes"
},
"deliveryFailed": {
"type": "boolean"
}
}
}| allowedDomains |
| array |
| storeSubmissions | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"formId"
],
"properties": {
"name": {
"type": "string"
},
"active": {
"type": "boolean"
},
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"purpose": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"spamMode": {
"enum": [
"minimal",
"relaxed",
"standard",
"strict"
],
"type": "string",
"description": "How hard this form filters: minimal (nothing is filtered, paid plans only), relaxed (flag but always deliver), standard, strict. Abuse protection — rate limits, honeypot — is unaffected."
},
"blocklist": {
"type": "array",
"items": {
"type": "string"
},
"description": "Emails, @domains or keywords that mark a submission as spam"
},
"validation": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
{
"type": "null"
}
],
"description": "Server-side rules by field, e.g. { \"email\": { \"required\": true, \"type\": \"email\" }, \"message\": { \"minLength\": 10 } }. null clears."
},
"redirectUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Absolute URL visitors are sent to after submitting"
},
"autoResponder": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"subject": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
},
"allowedDomains": {
"type": "array",
"items": {
"type": "string"
}
},
"storeSubmissions": {
"type": "boolean"
}
}
}