surveymonkey-mcp
Provides tools for managing surveys, pages, questions, responses, collectors, webhooks, contacts, and contact lists via the SurveyMonkey API v3.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@surveymonkey-mcp export responses from my customer feedback survey as a CSV"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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:
Log in at https://developer.surveymonkey.com/
Go to My Apps → create or open an app
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-mcpClaude 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 |
| Get current user profile |
| List surveys with filters |
| Get survey metadata |
| Get full survey with all pages & questions |
| Create a new survey |
| Replace a survey (PUT) |
| Partially update a survey (PATCH) |
| Delete a survey |
| List pages of a survey |
| Get a page |
| Create a page |
| Update a page |
| Delete a page |
| List questions on a page |
| Get a question |
| Create a question |
| Update a question |
| Delete a question |
| List responses (metadata only) |
| List responses with answers |
| Get a single response |
| Get a response with all answers |
| Delete a response |
| Export all responses as CSV |
| List collectors for a survey |
| Get a collector |
| Create a collector |
| Update a collector |
| Delete a collector |
| List email messages for a collector |
| Create an email message |
| Send an email message |
| List recipients for a collector |
| List webhooks |
| Get a webhook |
| Create a webhook |
| Update a webhook |
| Delete a webhook |
| List contacts |
| Get a contact |
| Create a contact |
| Update a contact |
| Delete a contact |
| List contact lists |
| Get a contact list |
| Create a contact list |
| Delete a contact list |
| 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.serverAvailable Tools
48 toolssurveymonkey_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
Scored across 48 tools
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.
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.
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.
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
Related MCP Connectors
Create, edit and publish surveys, then read results from your AI chat.
Read survey responses and manage contacts, webhooks, teams and organisation users.
AI-native survey & form builder. Manage surveys, responses, analytics, and webhooks.
Build, preview, edit, publish and analyze forms and surveys; read responses and manage webhooks.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server that exposes LimeSurvey's RemoteControl 2 JSON-RPC API as tools, enabling survey creation, activation, response export, and participant management through natural language.55MIT
- AlicenseNot gradedqualityBmaintenanceEnables interaction with ActiveCampaign email marketing and CRM via API v3 through natural language.252 npmMIT
- AlicenseAqualityCmaintenanceLets 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.7MIT

WebAsk MCPofficial
AlicenseNot gradedqualityBmaintenanceEnables 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