Skip to main content
Glama
surveymonkey-mcp

surveymonkey-mcp

by dscovr

surveymonkey-mcp

MCP server for the SurveyMonkey API v3.

Exposes SurveyMonkey as tools usable from Claude and any MCP-compatible client.

Features

  • Users — get current user profile

  • Surveys — list, get, get details, create, update, patch, delete

  • Pages — list, get, create, update, delete

  • Questions — list, get, create, update, delete

  • Responses — list (metadata), list bulk (with answers), get, get details, delete, export CSV

  • Collectors — list, get, create, update, delete

  • Collector Messages — list, create, send

  • Collector Recipients — list

  • Webhooks — list, get, create, update, delete

  • Contacts — list, get, create, delete

  • Contact Lists — list, get, create, delete, list members

Related MCP server: mcp-activecampaign

Authentication

Obtain a personal access token from the SurveyMonkey Developer Portal:

  1. Log in at https://developer.surveymonkey.com/

  2. Go to My Apps → create or open an app

  3. Go to Settings → copy your Access Token

The token is passed via the SURVEYMONKEY_TOKEN environment variable.

Quick start

# Run directly (no install)
SURVEYMONKEY_TOKEN=your_token uvx --from git+https://github.com/dscovr/surveymonkey-mcp surveymonkey-mcp

# Or install as a uv tool
uv tool install git+https://github.com/dscovr/surveymonkey-mcp
SURVEYMONKEY_TOKEN=your_token surveymonkey-mcp

Claude Desktop / MCP client configuration

Copy .mcp.json.example to .mcp.json and fill in your token:

{
  "mcpServers": {
    "surveymonkey": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/dscovr/surveymonkey-mcp",
        "surveymonkey-mcp"
      ],
      "env": {
        "SURVEYMONKEY_TOKEN": "YOUR_SURVEYMONKEY_ACCESS_TOKEN"
      }
    }
  }
}

Available tools (48 total)

Tool

Description

surveymonkey_get_me

Get current user profile

surveymonkey_list_surveys

List surveys with filters

surveymonkey_get_survey

Get survey metadata

surveymonkey_get_survey_details

Get full survey with all pages & questions

surveymonkey_create_survey

Create a new survey

surveymonkey_update_survey

Replace a survey (PUT)

surveymonkey_patch_survey

Partially update a survey (PATCH)

surveymonkey_delete_survey

Delete a survey

surveymonkey_list_pages

List pages of a survey

surveymonkey_get_page

Get a page

surveymonkey_create_page

Create a page

surveymonkey_update_page

Update a page

surveymonkey_delete_page

Delete a page

surveymonkey_list_questions

List questions on a page

surveymonkey_get_question

Get a question

surveymonkey_create_question

Create a question

surveymonkey_update_question

Update a question

surveymonkey_delete_question

Delete a question

surveymonkey_list_responses

List responses (metadata only)

surveymonkey_list_responses_bulk

List responses with answers

surveymonkey_get_response

Get a single response

surveymonkey_get_response_details

Get a response with all answers

surveymonkey_delete_response

Delete a response

surveymonkey_export_responses_csv

Export all responses as CSV

surveymonkey_list_collectors

List collectors for a survey

surveymonkey_get_collector

Get a collector

surveymonkey_create_collector

Create a collector

surveymonkey_update_collector

Update a collector

surveymonkey_delete_collector

Delete a collector

surveymonkey_list_collector_messages

List email messages for a collector

surveymonkey_create_collector_message

Create an email message

surveymonkey_send_collector_message

Send an email message

surveymonkey_list_collector_recipients

List recipients for a collector

surveymonkey_list_webhooks

List webhooks

surveymonkey_get_webhook

Get a webhook

surveymonkey_create_webhook

Create a webhook

surveymonkey_update_webhook

Update a webhook

surveymonkey_delete_webhook

Delete a webhook

surveymonkey_list_contacts

List contacts

surveymonkey_get_contact

Get a contact

surveymonkey_create_contact

Create a contact

surveymonkey_update_contact

Update a contact

surveymonkey_delete_contact

Delete a contact

surveymonkey_list_contact_lists

List contact lists

surveymonkey_get_contact_list

Get a contact list

surveymonkey_create_contact_list

Create a contact list

surveymonkey_delete_contact_list

Delete a contact list

surveymonkey_list_contact_list_members

List members of a contact list

Development

# Install dependencies
uv sync

# Run tests
uv run pytest

# Run the server locally
SURVEYMONKEY_TOKEN=your_token uv run python -m surveymonkey.server

Available Tools

48 tools
surveymonkey_create_collectorB

Creates a new collector for a survey.

Args: survey_id: Survey ID. payload: Collector definition. Structure: { "type": "weblink", (required: "weblink", "email", "sms", "popup") "name": "Collector name", (optional) "status": "open", (optional: "open" | "closed") "thank_you_message": "...", (optional) "close_date": "2026-12-31", (optional — ISO 8601 date) "redirect_url": "https://...", (optional — redirect after completion) "allow_multiple_responses": false (optional) }

Inputs: payload (required), survey_id (required). Returns: result

surveymonkey_create_collector_messageA

Creates a new email message for a collector.

Args: collector_id: Collector ID (must be of type "email"). payload: Message definition. Structure: { "type": "invite", (required: "invite" | "reminder" | "thank_you" | "custom") "subject": "Please take our survey", (optional) "body_text": "Click here: [SurveyLink]", (optional) "from_name": "Sender Name", (optional) "reply_to": "reply@example.com" (optional) }

Inputs: payload (required), collector_id (required). Returns: result

surveymonkey_create_contactB

Creates a new contact.

Args: email: Contact email address (required). first_name: First name (optional). last_name: Last name (optional).

Inputs: email (required), last_name, first_name. Returns: result

surveymonkey_create_contact_listB

Creates a new contact list.

Args: name: Name for the new contact list.

Inputs: name (required). Returns: result

surveymonkey_create_pageA

Creates a new page in a survey.

Args: survey_id: Survey ID. payload: Page definition. Structure: { "title": "Page title", (optional) "description": "Description", (optional) "position": 1 (optional) }

Inputs: payload (required), survey_id (required). Returns: result

surveymonkey_create_questionA

Creates a new question on a survey page.

Args: survey_id: Survey ID. page_id: Page ID. payload: Question definition. Structure: { "headings": [{"heading": "Question text"}], (required) "family": "single_choice", (required) "subtype": "vertical", (optional) "position": 1, (optional) "required": false, (optional) "answers": { "choices": [ {"text": "Option A"}, {"text": "Option B"} ], "other": {"text": "Other (please specify)", "visible": true} } }

Common families and subtypes:
  - single_choice:   vertical, horiz, menu
  - multiple_choice: vertical, horiz, menu
  - open_ended:      single, multi, numerical, essay
  - matrix:          rating, menu, ranking
  - rating:          star, smiley, numerical (scale 1–10)
  - demographic:     international, us
  - datetime:        both, date_only, time_only
  - presentation:    descriptive_text, image

Inputs: page_id (required), payload (required), survey_id (required). Returns: result

surveymonkey_create_surveyA

Creates a new SurveyMonkey survey.

Args: survey_definition: Survey definition as a JSON object. Structure: { "title": "My Survey", (required) "nickname": "Internal name", (optional) "language": "en", (optional, default: "en") "folder_id": "123", (optional) "category": "general", (optional) "pages": [ (optional — add pages at creation) { "title": "Page 1", "questions": [ { "headings": [{"heading": "Question text"}], "family": "single_choice", "subtype": "vertical", "answers": { "choices": [ {"text": "Option A"}, {"text": "Option B"} ] } } ] } ] }

Inputs: survey_definition (required). Returns: result

surveymonkey_create_webhookA

Creates a new webhook.

Args: payload: Webhook definition. Structure: { "name": "My Webhook", (required) "event_type": "response_completed", (required) "object_type": "survey", (required: "survey" | "collector") "object_ids": ["12345678"], (required — list of survey/collector IDs) "subscription_url": "https://...", (required — HTTPS endpoint) "authorization": "Bearer token_for_your_url" (optional — sent in callback header) }

Supported event_types:
  response_completed, response_disqualified, response_updated,
  response_created, response_deleted, response_overquota,
  survey_created, survey_updated, survey_deleted,
  collector_created, collector_updated, collector_deleted

Inputs: payload (required). Returns: result

surveymonkey_delete_collectorA

Deletes a collector and all its responses. WARNING: irreversible operation.

Args: collector_id: Collector ID.

Inputs: collector_id (required). Returns: result

surveymonkey_delete_contactB

Deletes a contact.

Args: contact_id: Contact ID.

Inputs: contact_id (required). Returns: result

surveymonkey_delete_contact_listC

Deletes a contact list.

Args: list_id: Contact list ID.

Inputs: list_id (required). Returns: result

surveymonkey_delete_pageA

Deletes a page and all its questions from a survey. WARNING: irreversible operation.

Args: survey_id: Survey ID. page_id: Page ID.

Inputs: page_id (required), survey_id (required). Returns: result

surveymonkey_delete_questionA

Deletes a question from a survey page. WARNING: irreversible operation.

Args: survey_id: Survey ID. page_id: Page ID. question_id: Question ID.

Inputs: page_id (required), survey_id (required), question_id (required). Returns: result

surveymonkey_delete_responseA

Permanently deletes a specific response. WARNING: irreversible operation.

Args: survey_id: Survey ID. response_id: Response ID to delete.

Inputs: survey_id (required), response_id (required). Returns: result

surveymonkey_delete_surveyA

Permanently deletes a survey and all its responses. WARNING: irreversible operation.

Args: survey_id: ID of the survey to delete.

Inputs: survey_id (required). Returns: result

surveymonkey_delete_webhookB

Deletes a webhook.

Args: webhook_id: Webhook ID.

Inputs: webhook_id (required). Returns: result

surveymonkey_export_responses_csvA

Exports all responses for a survey as CSV (includes all answers). Handles pagination automatically, collecting up to 10,000 responses.

Args: survey_id: Survey ID. start_created_at: ISO 8601 — export responses created after this date. end_created_at: ISO 8601 — export responses created before this date. status: Filter by status: "completed", "partial", etc. (empty = all).

Returns: CSV text with headers in the first row.

Inputs: survey_id (required), status, end_created_at, start_created_at. Returns: result

surveymonkey_get_collectorB

Returns the details of a specific collector.

Args: collector_id: Collector ID.

Inputs: collector_id (required). Returns: result

surveymonkey_get_contactB

Returns the details of a specific contact.

Args: contact_id: Contact ID.

Inputs: contact_id (required). Returns: result

surveymonkey_get_contact_listA

Returns the details of a specific contact list.

Args: list_id: Contact list ID.

Inputs: list_id (required). Returns: result

surveymonkey_get_meA

Returns information about the current SurveyMonkey user. Useful to verify the token is working and to see the username and email.

Inputs: no named parameters. Returns: result

surveymonkey_get_pageA

Returns the details of a specific survey page.

Args: survey_id: Survey ID. page_id: Page ID.

Inputs: page_id (required), survey_id (required). Returns: result

surveymonkey_get_questionB

Returns the full definition of a question, including answer choices.

Args: survey_id: Survey ID. page_id: Page ID. question_id: Question ID.

Inputs: page_id (required), survey_id (required), question_id (required). Returns: result

surveymonkey_get_responseA

Returns metadata for a specific response (no answers). Use surveymonkey_get_response_details for answers.

Args: survey_id: Survey ID. response_id: Response ID.

Inputs: survey_id (required), response_id (required). Returns: result

surveymonkey_get_response_detailsA

Returns a specific response with all answer data.

Args: survey_id: Survey ID. response_id: Response ID. page_ids: Comma-separated page IDs to include (empty = all pages). question_ids: Comma-separated question IDs to include (empty = all questions). simple: If true, returns simplified answer format (default false).

Inputs: survey_id (required), response_id (required), simple, page_ids, +1 more. Returns: result

surveymonkey_get_surveyA

Returns metadata for a specific survey (title, response count, dates, etc.). Does NOT include questions — use surveymonkey_get_survey_details for that.

Args: survey_id: Survey ID.

Inputs: survey_id (required). Returns: result

surveymonkey_get_survey_detailsB

Returns the full survey definition including all pages and questions.

Args: survey_id: Survey ID.

Inputs: survey_id (required). Returns: result

surveymonkey_get_webhookB

Returns the details of a specific webhook.

Args: webhook_id: Webhook ID.

Inputs: webhook_id (required). Returns: result

surveymonkey_list_collector_messagesA

Lists email messages for a collector.

Args: collector_id: Collector ID (must be of type "email"). page: Page number (default 1). per_page: Results per page (default 50).

Inputs: collector_id (required), page, per_page. Returns: result

surveymonkey_list_collector_recipientsB

Lists email recipients for a collector.

Args: collector_id: Collector ID. page: Page number (default 1). per_page: Results per page (default 50).

Inputs: collector_id (required), page, per_page. Returns: result

surveymonkey_list_collectorsA

Lists all collectors for a survey.

Args: survey_id: Survey ID. page: Page number (default 1). per_page: Results per page (default 50).

Inputs: survey_id (required), page, per_page. Returns: result

surveymonkey_list_contact_list_membersA

Lists contacts that belong to a specific contact list.

Args: list_id: Contact list ID. page: Page number (default 1). per_page: Results per page (default 50).

Inputs: list_id (required), page, per_page. Returns: result

surveymonkey_list_contact_listsA

Lists all contact lists in the account.

Args: page: Page number (default 1). per_page: Results per page (default 50).

Inputs: page, per_page. Returns: result

surveymonkey_list_contactsA

Lists contacts in the account.

Args: page: Page number (default 1). per_page: Results per page (default 50). status: Filter by status: "active", "optedout", "bounced". search_by: Field to search by: "email", "first_name", "last_name". search: Search term. sort_by: Sort field: "email", "first_name", "last_name". sort_order: Sort direction: "asc" or "desc".

Inputs: page, search, status, sort_by, +3 more. Returns: result

surveymonkey_list_pagesA

Lists the pages of a survey.

Args: survey_id: Survey ID. page: Page number (default 1). per_page: Results per page (default 50).

Inputs: survey_id (required), page, per_page. Returns: result

surveymonkey_list_questionsB

Lists questions on a specific page of a survey.

Args: survey_id: Survey ID. page_id: Page ID. page: Page number for pagination (default 1). per_page: Results per page (default 50).

Inputs: page_id (required), survey_id (required), page, per_page. Returns: result

surveymonkey_list_responsesA

Lists responses for a survey (metadata only, no answers). Use surveymonkey_list_responses_bulk to include answer data.

Args: survey_id: Survey ID. page: Page number (default 1). per_page: Results per page, max 1000 (default 50). start_created_at: ISO 8601 — responses created after this date. end_created_at: ISO 8601 — responses created before this date. status: Filter by status: "completed", "partial", "overquota", "disqualified". email: Filter by respondent email. sort_by: Sort field: "date_modified". sort_order: Sort direction: "asc" or "desc".

Inputs: survey_id (required), page, email, status, +5 more. Returns: result

surveymonkey_list_responses_bulkA

Lists responses for a survey including all answer data.

Args: survey_id: Survey ID. page: Page number (default 1). per_page: Results per page, max 1000 (default 50). simple: If true, returns simplified answer format (default false). start_created_at: ISO 8601 — responses created after this date. end_created_at: ISO 8601 — responses created before this date. status: Filter: "completed", "partial", "overquota", "disqualified". collector_ids: Comma-separated collector IDs to filter by. page_ids: Comma-separated page IDs to include. question_ids: Comma-separated question IDs to include.

Inputs: survey_id (required), page, simple, status, +6 more. Returns: result

surveymonkey_list_surveysA

Lists surveys in the account with pagination and optional filters.

Args: page: Page number (default 1). per_page: Results per page, max 1000 (default 50). sort_by: Sort field: "title", "date_modified", "num_responses" (default: date_modified). sort_order: Sort direction: "asc" or "desc" (default: desc). title: Filter surveys by title (substring match). start_modified_at: ISO 8601 — surveys modified after this date. end_modified_at: ISO 8601 — surveys modified before this date. folder_id: Filter by folder ID.

Inputs: page, title, sort_by, per_page, +4 more. Returns: result

surveymonkey_list_webhooksA

Lists all webhooks in the account.

Args: page: Page number (default 1). per_page: Results per page (default 50).

Inputs: page, per_page. Returns: result

surveymonkey_patch_surveyA

Partially updates a survey (PATCH).

Args: survey_id: ID of the survey. patch: Object with only the fields to change. Common fields: "title", "nickname", "language", "folder_id", "category". Example: {"title": "New title", "language": "it"}

Inputs: patch (required), survey_id (required). Returns: result

surveymonkey_send_collector_messageA

Sends an email message to all recipients of a collector.

Args: collector_id: Collector ID. message_id: Message ID to send. scheduled_date: ISO 8601 datetime to schedule the send (empty = send immediately).

Inputs: message_id (required), collector_id (required), scheduled_date. Returns: result

surveymonkey_update_collectorA

Updates a collector (PATCH).

Args: collector_id: Collector ID. payload: Fields to update. Common fields: "name", "status" ("open"|"closed"), "close_date", "redirect_url", "allow_multiple_responses".

Inputs: payload (required), collector_id (required). Returns: result

surveymonkey_update_contactA

Updates an existing contact (PATCH).

Args: contact_id: Contact ID. payload: Fields to update. Common fields: "email", "first_name", "last_name". Example: {"first_name": "Jane", "last_name": "Doe"}

Inputs: payload (required), contact_id (required). Returns: result

surveymonkey_update_pageA

Updates a page in a survey (PATCH).

Args: survey_id: Survey ID. page_id: Page ID. payload: Fields to update: "title", "description", "position".

Inputs: page_id (required), payload (required), survey_id (required). Returns: result

surveymonkey_update_questionA

Updates an existing question (PATCH).

Args: survey_id: Survey ID. page_id: Page ID. question_id: Question ID. payload: Fields to update (same schema as surveymonkey_create_question).

Inputs: page_id (required), payload (required), survey_id (required), question_id (required). Returns: result

surveymonkey_update_surveyA

Fully replaces a survey's definition (PUT). Use surveymonkey_patch_survey for partial updates.

Args: survey_id: ID of the survey to update. survey_definition: New complete definition (same schema as surveymonkey_create_survey).

Inputs: survey_id (required), survey_definition (required). Returns: result

surveymonkey_update_webhookA

Updates a webhook (PATCH).

Args: webhook_id: Webhook ID. payload: Fields to update (same schema as surveymonkey_create_webhook).

Inputs: payload (required), webhook_id (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 48 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action, with clear separation between list/get/create/update/delete operations. Pairs like list_responses/list_responses_bulk and get_survey/get_survey_details are explicitly differentiated in their descriptions.

    Naming Consistency5/5

    All tools follow a consistent surveymonkey_<verb>_<noun> pattern, using standard verbs like list, get, create, update, patch, delete, and send. There is no mixing of naming conventions or irregular verb styles.

    Tool Count2/5

    48 tools is well above the 25+ threshold that indicates an overly large tool surface. The tools are not redundant, but the sheer count makes the server feel heavy and harder for an agent to navigate efficiently.

    Completeness4/5

    The toolkit covers broad CRUD/lifecycle operations across surveys, pages, questions, responses, collectors, webhooks, and contacts. Minor gaps exist, such as no update/delete for collector messages and no add/remove contact-to-list membership operations.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      MCP server that exposes LimeSurvey's RemoteControl 2 JSON-RPC API as tools, enabling survey creation, activation, response export, and participant management through natural language.
      55
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables interaction with ActiveCampaign email marketing and CRM via API v3 through natural language.
      252 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Lets Claude, ChatGPT and other MCP clients read a SmartSurvey account's surveys, survey designs, responses, exports and folders, and — when writes are enabled — open or close a survey or send an existing invitation to one named recipient. It runs read-only by default, redacting respondent contact details and phone-number-like text unless contact details are explicitly requested.
      7
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to create and validate surveys, distribute them, read and tag responses, and generate reports or exports through a hosted Streamable HTTP MCP endpoint with API-key authentication.
      MIT