Superforms

Human-input bridge for AI agents with voice-first answer links, MCP tools, and HTTP APIs.

Should I use this

Quality & Safety

A
Description quality
97%
Schema completeness
79%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'join_creation_session' description lacks action verbin join_creation_session

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,355Tokens (tool definitions)
~2.2 KBTypical response size
Moderate attention impact (1.84% 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": {
    "superforms": {
      "url": "https://superforms.co/mcp"
    }
  }
}

Remote endpoints

https://superforms.co/mcpstreamable-http

What it can do

Tool inventory

Tools (11)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡create_form(prompt, questions, goal, context, questionContext, ...)

Publish a voice-first form link immediately after creator confirmation, collect human answers, and pipe responses back to the agent.

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "Plain-English ask or request. Use only when explicit questions are not already known."
    },
    "questions": {
      "type": "array",
      "description": "Explicit questions to ask the respondent. Use this whenever questions already exist; preserve them exactly.",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "text": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "context": {
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "goal": {
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Private context for smart follow-ups. Summarize relevant non-sensitive host-conversation context and append any extra context the creator provides. Never shown to respondents."
    },
    "questionContext": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "creationSessionUrl": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "persistent": {
      "type": "boolean"
    },
    "followUpMode": {
      "type": "string",
      "enum": [
        "none",
        "smart",
        "deep_dive"
      ],
      "description": "For exactly one question, set this only after asking the creator \"Want smart follow-up questions?\" Use deep_dive for yes or none for no. For multiple questions, use none unless explicitly requested."
    },
    "max_followups_per_question": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "max_total_questions": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "responseMode": {
      "type": "string",
      "enum": [
        "voice_preferred",
        "text_only",
        "voice_only"
      ]
    },
    "responseLimit": {
      "type": "string",
      "enum": [
        "one",
        "multiple"
      ],
      "description": "Use \"one\" for a form intended for one named person/client. Use \"multiple\" for forms, surveys, feedback, customers, users, and public/embedded links."
    }
  },
  "additionalProperties": false
}
🟡create_feedback_form(prompt, questions, goal, context, questionContext, ...)

Publish a voice-first feedback, cancellation, feature request, survey, or research form immediately after creator confirmation, with optional smart follow-ups.

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "Plain-English ask or request. Use only when explicit questions are not already known."
    },
    "questions": {
      "type": "array",
      "description": "Explicit questions to ask the respondent. Use this whenever questions already exist; preserve them exactly.",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "text": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "context": {
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "goal": {
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Private context for smart follow-ups. Summarize relevant non-sensitive host-conversation context and append any extra context the creator provides. Never shown to respondents."
    },
    "questionContext": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "creationSessionUrl": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "persistent": {
      "type": "boolean"
    },
    "followUpMode": {
      "type": "string",
      "enum": [
        "none",
        "smart",
        "deep_dive"
      ],
      "description": "For exactly one question, set this only after asking the creator \"Want smart follow-up questions?\" Use deep_dive for yes or none for no. For multiple questions, use none unless explicitly requested."
    },
    "max_followups_per_question": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "max_total_questions": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "responseMode": {
      "type": "string",
      "enum": [
        "voice_preferred",
        "text_only",
        "voice_only"
      ]
    },
    "responseLimit": {
      "type": "string",
      "enum": [
        "one",
        "multiple"
      ],
      "description": "Use \"one\" for a form intended for one named person/client. Use \"multiple\" for forms, surveys, feedback, customers, users, and public/embedded links."
    }
  },
  "additionalProperties": false
}
🟡create_ask(prompt, questions, goal, context, questionContext, ...)

Create a voice-first Superforms answer link for human input. Backward-compatible alias for create_form.

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "Plain-English ask or request. Use only when explicit questions are not already known."
    },
    "questions": {
      "type": "array",
      "description": "Explicit questions to ask the respondent. Use this whenever questions already exist; preserve them exactly.",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "text": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              "context": {
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "goal": {
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Private context for smart follow-ups. Summarize relevant non-sensitive host-conversation context and append any extra context the creator provides. Never shown to respondents."
    },
    "questionContext": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "creationSessionUrl": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "persistent": {
      "type": "boolean"
    },
    "followUpMode": {
      "type": "string",
      "enum": [
        "none",
        "smart",
        "deep_dive"
      ],
      "description": "For exactly one question, set this only after asking the creator \"Want smart follow-up questions?\" Use deep_dive for yes or none for no. For multiple questions, use none unless explicitly requested."
    },
    "max_followups_per_question": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "max_total_questions": {
      "type": "number",
      "description": "Optional compatibility setting. Omit for adaptive one-question smart follow-ups."
    },
    "responseMode": {
      "type": "string",
      "enum": [
        "voice_preferred",
        "text_only",
        "voice_only"
      ]
    },
    "responseLimit": {
      "type": "string",
      "enum": [
        "one",
        "multiple"
      ],
      "description": "Use \"one\" for a form intended for one named person/client. Use \"multiple\" for forms, surveys, feedback, customers, users, and public/embedded links."
    }
  },
  "additionalProperties": false
}
⚪join_creation_session(creationSessionUrl, agentName)

Join a Superforms homepage creation handoff session before creating the real form. Pass agentName with the client name, such as Codex, Claude Code, Claude, ChatGPT, or Cursor.

Input Schema

{
  "type": "object",
  "properties": {
    "creationSessionUrl": {
      "type": "string"
    },
    "agentName": {
      "type": "string"
    }
  },
  "required": [
    "creationSessionUrl"
  ],
  "additionalProperties": false
}
🟡update_creation_session(creationSessionUrl, title, goal, context, questions, ...)

Update a homepage creation handoff draft with the current form title, questions, and settings before the user clicks Set live.

Input Schema

{
  "type": "object",
  "properties": {
    "creationSessionUrl": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "goal": {
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Private smart-follow-up context. Summarize relevant non-sensitive host-conversation context and append any extra context the creator provides. Never shown to respondents."
    },
    "questions": {
      "type": "array",
      "description": "Current draft questions to show in the live form preview.",
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "text": {
                "type": "string"
              },
              "context": {
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "followUpMode": {
      "type": "string",
      "enum": [
        "none",
        "smart",
        "deep_dive"
      ]
    },
    "max_followups_per_question": {
      "type": "number",
      "description": "Use 0 by default. Use 1 only when smart follow-ups are explicitly requested."
    },
    "max_total_questions": {
      "type": "number",
      "description": "Use 20 for deep-dive interviews."
    },
    "responseMode": {
      "type": "string",
      "enum": [
        "voice_preferred",
        "text_only",
        "voice_only"
      ]
    },
    "responseLimit": {
      "type": "string",
      "enum": [
        "one",
        "multiple"
      ],
      "description": "Use one for a named person/client. Use multiple for feedback forms, surveys, customers, users, and public links."
    }
  },
  "required": [
    "creationSessionUrl"
  ],
  "additionalProperties": false
}
🟢get_responses(askId, agentToken, since)

Fetch persisted raw responses for a Superforms ask. This is the MCP equivalent of the HTTP bridge answers endpoint.

Input Schema

{
  "type": "object",
  "properties": {
    "askId": {
      "type": "string"
    },
    "agentToken": {
      "type": "string"
    },
    "since": {
      "type": "string"
    }
  },
  "required": [
    "askId",
    "agentToken"
  ],
  "additionalProperties": false
}
🟢list_asks(agentToken)

List recent asks for a provided private agent token.

Input Schema

{
  "type": "object",
  "properties": {
    "agentToken": {
      "type": "string"
    }
  },
  "required": [
    "agentToken"
  ],
  "additionalProperties": false
}
🟢watch_ask(url, askId, agentToken, since, timeoutMs)

Return as soon as an individual answer is saved, including answers received while an agent was reconnecting and while the form remains in progress. Use since for durable per-answer catch-up; the HTTP bridge also exposes an SSE stream endpoint.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "askId": {
      "type": "string"
    },
    "agentToken": {
      "type": "string"
    },
    "since": {
      "type": "string",
      "description": "ISO timestamp cursor from the last response the agent processed."
    },
    "timeoutMs": {
      "type": "number",
      "description": "Maximum wait in milliseconds, capped at 120000."
    }
  },
  "required": [
    "url",
    "agentToken"
  ],
  "additionalProperties": false
}
🟢list_my_forms

List forms owned by the connected Superforms account, including response counts and latest response timestamps.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟢get_my_form_responses(askId, since)

Read persisted raw responses for a form owned by the connected Superforms account. No per-form agent token is required.

Input Schema

{
  "type": "object",
  "properties": {
    "askId": {
      "type": "string"
    },
    "since": {
      "type": "string",
      "description": "Optional ISO timestamp cursor."
    }
  },
  "required": [
    "askId"
  ],
  "additionalProperties": false
}
🟢watch_my_form_responses(askId, since, timeoutMs)

Return any existing individual answers immediately, or wait briefly until the respondent saves their next answer, even while the form remains in progress.

Input Schema

{
  "type": "object",
  "properties": {
    "askId": {
      "type": "string"
    },
    "since": {
      "type": "string",
      "description": "Optional ISO timestamp cursor."
    },
    "timeoutMs": {
      "type": "number",
      "description": "Maximum wait in milliseconds, capped at 120000."
    }
  },
  "required": [
    "askId"
  ],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools
verifiedversion not recorded11 tools