ShipMyForm

Form backend as 29 tools: create endpoints, route submissions, publish pages, run the inbox.

Should I use this

Quality & Safety

A
Description quality
84%
Schema completeness
77%
Naming quality
97%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (12)

  • LOWTool 'list_api_keys' description lacks action verbin list_api_keys
  • LOWTool 'revoke_api_key' description lacks action verbin revoke_api_key
  • LOWTool 'list_forms' description lacks action verbin list_forms
  • LOWTool 'get_form' description lacks action verbin get_form
  • LOWTool 'list_connector_types' description lacks action verbin list_connector_types
  • LOWTool 'set_connector_active' has short descriptionin set_connector_active
  • LOWTool 'set_connector_active' description lacks action verbin set_connector_active
  • LOWTool 'remove_connector' has short descriptionin remove_connector
  • LOWTool 'remove_connector' description lacks action verbin remove_connector
  • LOWTool 'unpublish_hosted_page' has short descriptionin unpublish_hosted_page

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,396Tokens (tool definitions)
~933 BTypical response size
Significant attention impact (2.65% of 128k context)

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-http

What it can do

Tool inventory

Tools (29)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded29 tools
verifiedversion not recorded29 tools
verifiedversion not recorded29 tools
verifiedversion not recorded29 tools
auth requiredversion not recorded—
auth requiredversion not recorded—