ShipMyForm
Form backend as 29 tools: create endpoints, route submissions, publish pages, run the inbox.
Should I use this
Quality & Safety
Findings (12)
- LOWin list_api_keys
- LOWin revoke_api_key
- LOWin list_forms
- LOWin get_form
- LOWin list_connector_types
- LOWin set_connector_active
- LOWin set_connector_active
- LOWin remove_connector
- LOWin remove_connector
- LOWin unpublish_hosted_page
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"shipmyform": {
"url": "https://shipmyform.com/api/mcp"
}
}
}Remote endpoints
https://shipmyform.com/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (29)
⚪sign_up(email, workspaceName, agent, preset, scopes)
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).
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "The user's email address. Ask for it; never invent one."
},
"workspaceName": {
"type": "string",
"maxLength": 80
},
"agent": {
"description": "Your name, e.g. 'Claude Code', shown in the verification email.",
"type": "string",
"maxLength": 40
},
"preset": {
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage",
"type": "string",
"enum": [
"full",
"wiring",
"readonly",
"triage"
]
},
"scopes": {
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes.",
"type": "array",
"items": {
"type": "string",
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
]
}
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪verify_account(email, code, agent, preset, scopes)
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.
Input Schema
{
"type": "object",
"properties": {
"email": {
"description": "Required when not yet connected with a key",
"type": "string"
},
"code": {
"type": "string",
"minLength": 6,
"maxLength": 6
},
"agent": {
"type": "string",
"maxLength": 40
},
"preset": {
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage",
"type": "string",
"enum": [
"full",
"wiring",
"readonly",
"triage"
]
},
"scopes": {
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes.",
"type": "array",
"items": {
"type": "string",
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
]
}
}
},
"required": [
"code"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪resend_verification_code
Email a fresh 6-digit verification code to the account's address.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_account
The account's email, verification state, plan, limits, usage and dashboard URL.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡create_api_key(name, preset, scopes)
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.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"preset": {
"description": "Named scope bundle: full (everything), wiring (forms only, no submission access), readonly, triage",
"type": "string",
"enum": [
"full",
"wiring",
"readonly",
"triage"
]
},
"scopes": {
"description": "Explicit scopes, instead of a preset. Ignored where it would exceed the calling key's own scopes.",
"type": "array",
"items": {
"type": "string",
"enum": [
"forms:read",
"forms:write",
"forms:delete",
"submissions:read",
"submissions:write",
"submissions:delete",
"account:manage"
]
}
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_api_keys
API keys on this workspace (metadata only).
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪revoke_api_key(keyId)
Revoke a key by id. The key in use on this connection cannot revoke itself.
Input Schema
{
"type": "object",
"properties": {
"keyId": {
"type": "string"
}
},
"required": [
"keyId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢start_upgrade(plan, period)
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).
Input Schema
{
"type": "object",
"properties": {
"plan": {
"type": "string",
"enum": [
"starter",
"pro"
]
},
"period": {
"default": "monthly",
"type": "string",
"enum": [
"monthly",
"annual"
]
}
},
"required": [
"plan"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡get_billing_portal
A self-service billing portal URL: change plan, update the card, cancel.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_forms
The workspace's forms with their public endpoint URLs.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡create_form(name, purpose, allowedDomains)
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.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Human-readable form name, e.g. 'Contact form'"
},
"purpose": {
"description": "What the form is for, in a sentence. Helps the spam classifier.",
"type": "string",
"maxLength": 500
},
"allowedDomains": {
"description": "Sites allowed to submit, e.g. ['example.com']. Empty = any.",
"maxItems": 20,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_form(formId)
A form's full configuration, connectors and hosted-page status.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡update_form(formId, name, purpose, allowedDomains, redirectUrl, ...)
Change any subset of a form's settings: name, purpose, allowedDomains, redirectUrl, spamMode, active, storeSubmissions, validation rules, blocklist, autoResponder (Pro).
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"name": {
"type": "string"
},
"purpose": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"allowedDomains": {
"type": "array",
"items": {
"type": "string"
}
},
"redirectUrl": {
"description": "Absolute URL visitors are sent to after submitting",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"spamMode": {
"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.",
"type": "string",
"enum": [
"minimal",
"relaxed",
"standard",
"strict"
]
},
"active": {
"type": "boolean"
},
"storeSubmissions": {
"type": "boolean"
},
"validation": {
"description": "Server-side rules by field, e.g. { \"email\": { \"required\": true, \"type\": \"email\" }, \"message\": { \"minLength\": 10 } }. null clears.",
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
{
"type": "null"
}
]
},
"blocklist": {
"description": "Emails, @domains or keywords that mark a submission as spam",
"type": "array",
"items": {
"type": "string"
}
},
"autoResponder": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"subject": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
}
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴delete_form(formId)
Delete a form; its endpoint stops accepting submissions.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_form_snippet(formId, framework)
A copy-paste form snippet for a framework (html, react, vue, or fetch) wired to the form's endpoint.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"framework": {
"default": "html",
"type": "string",
"enum": [
"html",
"react",
"vue",
"fetch"
]
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_submission_stats(formId)
Delivered / spam-held / flagged counts for a form, plus workspace quota usage. Works on every plan.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_connector_types
Every destination submissions can be routed to, with the config fields each needs and which plan it requires.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_connectors(formId)
Connectors on a form with their status and last error.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡add_connector(formId, type, config)
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.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"type": {
"type": "string",
"description": "Connector type from list_connector_types, e.g. 'slack'"
},
"config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Field values keyed by the config field names"
}
},
"required": [
"formId",
"type",
"config"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡test_connector(connectorId)
Send a test delivery through a connector and report the result.
Input Schema
{
"type": "object",
"properties": {
"connectorId": {
"type": "string"
}
},
"required": [
"connectorId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡set_connector_active(connectorId, active)
Input Schema
{
"type": "object",
"properties": {
"connectorId": {
"type": "string"
},
"active": {
"type": "boolean"
}
},
"required": [
"connectorId",
"active"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴remove_connector(connectorId)
Input Schema
{
"type": "object",
"properties": {
"connectorId": {
"type": "string"
}
},
"required": [
"connectorId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡publish_hosted_page(formId)
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.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪unpublish_hosted_page(formId)
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_submissions(formId, status, since, until, q, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"status": {
"type": "string",
"enum": [
"ok",
"spam",
"flagged"
]
},
"since": {
"description": "ISO date; received on/after",
"type": "string"
},
"until": {
"description": "ISO date; received before",
"type": "string"
},
"q": {
"description": "Free-text search across field values",
"type": "string"
},
"countries": {
"description": "ISO 3166 alpha-2 codes",
"type": "array",
"items": {
"type": "string"
}
},
"hasFiles": {
"type": "boolean"
},
"deliveryFailed": {
"type": "boolean"
},
"sort": {
"type": "string",
"enum": [
"newest",
"oldest",
"score"
]
},
"limit": {
"default": 25,
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_submission(submissionId)
One submission with spam signals and delivery history.
Input Schema
{
"type": "object",
"properties": {
"submissionId": {
"type": "string"
}
},
"required": [
"submissionId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪label_submissions(ids, label)
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.
Input Schema
{
"type": "object",
"properties": {
"ids": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string",
"enum": [
"ok",
"spam",
"flagged"
]
}
},
"required": [
"ids",
"label"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴delete_submissions(ids)
Permanently delete submissions (and their files).
Input Schema
{
"type": "object",
"properties": {
"ids": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"ids"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}⚪export_submissions(formId, status)
All of a form's submissions (up to 2,000) as CSV text, optionally filtered by status.
Input Schema
{
"type": "object",
"properties": {
"formId": {
"type": "string",
"description": "Form id, e.g. frm_abc123"
},
"status": {
"type": "string",
"enum": [
"ok",
"spam",
"flagged"
]
}
},
"required": [
"formId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence