questionpro-mcp
v1.0.1
Published
MCP server for the QuestionPro Surveys API V2 — use Claude to manage surveys, questions, responses, users, email campaigns, and more.
Downloads
217
Maintainers
Readme
QuestionPro MCP Server
A Model Context Protocol (MCP) server that exposes all 90 endpoints from the QuestionPro Surveys API V2 as MCP tools — letting Claude (or any MCP client) directly manage surveys, questions, responses, users, email campaigns, webhooks, and more.
Prerequisites
- Node.js v18 or later
- A QuestionPro API key — found under My Account → API Key in QuestionPro
- Your Organization ID — found under My Account → Organization
Quick Start — Claude Desktop
The fastest way to get started. No cloning or building required.
1. Add to your Claude Desktop config
Open ~/Library/Application Support/Claude/claude_desktop_config.json and add:
{
"mcpServers": {
"questionpro-api": {
"command": "npx",
"args": ["-y", "questionpro-mcp"],
"env": {
"QUESTIONPRO_API_KEY": "your-api-key",
"QUESTIONPRO_ORG_ID": "your-org-id",
"QUESTIONPRO_ENV": "com"
}
}
}
}Set
QUESTIONPRO_ENVtoeuif your account is on the EU domain.
2. Restart Claude Desktop
That's it. Claude will now have access to all 90 QuestionPro tools.
Note: Claude Desktop does not currently support custom headers for remote MCP servers, so the npx/local mode above is the only supported option for Claude Desktop.
Transport Modes
The server supports two transport modes controlled by the MCP_TRANSPORT environment variable:
| Mode | Use case |
|---|---|
| stdio (default) | Claude Desktop (via npx or local build) |
| http | Remote/hosted server, shared team access via Claude Code |
Option A — Local build (Claude Desktop, from source)
If you prefer to run from a local clone rather than npx:
1. Install & build
npm install
npm run build2. Add to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"questionpro-api": {
"command": "node",
"args": ["/absolute/path/to/qp-surveys-mcp/dist/index.js"],
"env": {
"QUESTIONPRO_API_KEY": "your-api-key",
"QUESTIONPRO_ORG_ID": "your-org-id",
"QUESTIONPRO_ENV": "com"
}
}
}
}Restart Claude Desktop.
Option B — Hosted Server (Claude Code / CLI)
A shared instance of this server is running at https://innovation3.questionpro.com/surveys-mcp/mcp. Each user connects with their own QuestionPro credentials passed as request headers — nothing is stored on the server.
Connect via Claude Code CLI
claude mcp add questionpro-api \
--transport http \
https://innovation3.questionpro.com/surveys-mcp/mcp \
--header "X-QP-API-Key: your-api-key" \
--header "X-QP-Org-Id: your-org-id" \
--header "X-QP-Env: com"This saves the config to your local Claude Code settings. Verify the connection:
claude mcp listYou should see questionpro-api listed as ✓ Connected.
Remove or update
# Remove
claude mcp remove questionpro-api
# Re-add with different credentials
claude mcp add questionpro-api \
--transport http \
https://innovation3.questionpro.com/surveys-mcp/mcp \
--header "X-QP-API-Key: new-api-key" \
--header "X-QP-Org-Id: new-org-id" \
--header "X-QP-Env: com"EU accounts
If your QuestionPro account is on the EU domain, pass X-QP-Env: eu:
claude mcp add questionpro-api \
--transport http \
https://innovation3.questionpro.com/surveys-mcp/mcp \
--header "X-QP-API-Key: your-api-key" \
--header "X-QP-Org-Id: your-org-id" \
--header "X-QP-Env: eu"Health check
curl https://innovation3.questionpro.com/surveys-mcp/health
# {"status":"ok","server":"questionpro-mcp"}Server Endpoints (HTTP mode)
| Endpoint | Method | Purpose | Clients |
|---|---|---|---|
| /mcp | POST/GET/DELETE | Streamable HTTP transport | Claude Code |
| /sse | GET | Legacy SSE stream | Older clients |
| /messages?sessionId=<id> | POST | Legacy SSE message channel | Older clients |
| /health | GET | Health check | All |
Available Tools (90 total)
Organization
| Tool | Method | Description |
|---|---|---|
| get_organization | GET | Get organization details |
| update_organization | PUT | Update organization name |
Department
| Tool | Method | Description |
|---|---|---|
| get_all_departments | GET | List all departments (paginated) |
| get_department | GET | Get a specific department |
| create_department | POST | Create a department |
| update_department | PUT | Update a department |
| delete_department | DELETE | Delete a department |
User
| Tool | Method | Description |
|---|---|---|
| get_all_users_from_organization | GET | List all users in org |
| get_all_users_from_department | GET | List users in a department |
| search_user | GET | Search user by email |
| get_user | GET | Get a specific user |
| create_user | POST | Create a new user |
| update_user | PUT | Update user profile |
| delete_user | DELETE | Remove a user |
| regenerate_api_key | GET | Regenerate API key |
Folders
| Tool | Method | Description |
|---|---|---|
| get_folders | GET | List user folders |
| get_folder | GET | Get a specific folder |
| create_folder | POST | Create a folder |
| update_folder | PUT | Rename a folder |
| delete_folder | DELETE | Delete a folder |
Surveys
| Tool | Method | Description |
|---|---|---|
| get_user_surveys | GET | List user's surveys |
| get_survey | GET | Get survey details |
| get_folder_surveys | GET | List surveys in a folder |
| create_survey | POST | Create a survey |
| update_survey | PUT | Update survey metadata |
| delete_survey | DELETE | Delete a survey |
| get_survey_authentication | GET | Get survey auth settings |
| update_survey_authentication | PUT | Update auth settings |
Blocks
| Tool | Method | Description |
|---|---|---|
| get_survey_blocks | GET | List survey blocks |
| get_survey_block | GET | Get a specific block |
| create_survey_block | POST | Add a block to a survey |
| update_survey_block | PUT | Rename a block |
| delete_survey_block | DELETE | Remove a block |
Questions
| Tool | Method | Description |
|---|---|---|
| get_questions | GET | List survey questions |
| get_question | GET | Get a specific question |
| create_question | POST | Add a question |
| update_question | PUT | Edit a question |
| delete_question | DELETE | Remove a question |
Supported question types:
| Type | Name |
|---|---|
| multiplechoice_radio | Select One |
| multiplechoice_checkbox | Select Many |
| multiplechoice_dropdown | Dropdown Menu |
| multiplechoice_thumbs_up_down | Thumbs Up/Down |
| multiplechoice_image_radio | Image Chooser: Select One |
| multiplechoice_image_checkbox | Image Chooser: Select Many |
| multiplechoice_maps | Maps |
| matrix_radio | Basic Matrix: Multi-Point Scale |
| matrix_checkbox | Basic Matrix: Multi-Select |
| matrix_text | Basic Matrix: Spreadsheet |
| matrix_star_rating | Star Rating |
| matrix_slider | Text Slider |
| matrix_constant_sum | Constant Sum |
| numeric_slider | Numeric Slider |
| rank_order_dropdown | Rank Order |
| rank_order_drag_drop | Drag and Drop Rank |
| text_single_row | Single Row Text |
| text_multiple_row | Comment Box |
| text_email | Email Address |
| text_captcha | Captcha |
| date_time | Date/Time |
| calendar | Calendar |
| push_to_social | Push To Social |
| static_presentation_text | Presentation Text |
| static_section_heading | Section Heading |
| static_section_sub_heading | Section Sub-Heading |
Answers
| Tool | Method | Description |
|---|---|---|
| get_answers | GET | List answer options for a question |
| get_answer | GET | Get a specific answer option |
| delete_answer | DELETE | Remove an answer option |
Email Lists
| Tool | Method | Description |
|---|---|---|
| get_email_lists | GET | List survey email lists |
| get_email_list | GET | Get a specific list |
| create_email_list | POST | Create an email list |
| update_email_list | PUT | Update an email list |
| delete_email_list | DELETE | Delete an email list |
Email List Addresses
| Tool | Method | Description |
|---|---|---|
| get_email_addresses | GET | List addresses in a list |
| get_email_address | GET | Get a specific address |
| create_email_addresses | POST | Add addresses to a list |
| update_email_address | PUT | Update an address entry |
| delete_email_address | DELETE | Remove an address |
| get_unsubscribed_emails | GET | Global unsubscribe list |
Email Templates
| Tool | Method | Description |
|---|---|---|
| get_email_templates | GET | List email templates |
| get_email_template | GET | Get a specific template |
| create_email_template | POST | Create an email template |
| update_email_template | PUT | Update a template |
| delete_email_template | DELETE | Delete a template |
Send Survey / Batches
| Tool | Method | Description |
|---|---|---|
| get_email_batches | GET | List send batches |
| get_email_batch | GET | Get a specific batch |
| send_batch | POST | Send to a list of emails |
| send_batch_with_filter | POST | Send using an email list |
| send_reminder | PUT | Send reminder to non-respondents |
| get_batch_statistics | GET | Get open/click/bounce stats |
Scheduled Invitations
| Tool | Method | Description |
|---|---|---|
| get_scheduled_invitations | GET | List scheduled invitations |
| get_scheduled_invitation | GET | Get a specific scheduled send |
| create_scheduled_invitation | POST | Schedule a future send |
Export Batch
| Tool | Method | Description |
|---|---|---|
| get_export_batch | GET | Get export batch info |
| create_export_batch | POST | Trigger email list export |
Responses
| Tool | Method | Description |
|---|---|---|
| get_responses | GET | List survey responses |
| get_response | GET | Get a specific response |
| create_response | POST | Submit a response programmatically |
| get_responses_filter | POST | Filter responses by date/mode |
| delete_response | DELETE | Delete a response |
Datapad
| Tool | Method | Description |
|---|---|---|
| get_datapads | GET | List report widgets |
| get_datapad | GET | Get a specific datapad |
| update_datapad | PUT | Update datapad HTML content |
Response Statistics
| Tool | Method | Description |
|---|---|---|
| get_survey_statistics | POST | Aggregated survey analytics |
| get_question_statistics | POST | Per-question analytics |
Images
| Tool | Method | Description |
|---|---|---|
| get_user_images | GET | List user's images |
| get_images | GET | List all account images |
| get_user_image | GET | Get a specific user image |
| get_image | GET | Get image by ID |
| create_image | POST | Upload an image |
| delete_user_image | DELETE | Delete a user's image |
| delete_image | DELETE | Delete an image by ID |
Webhooks
| Tool | Method | Description |
|---|---|---|
| get_webhooks | GET | List survey webhooks |
| get_webhook | GET | Get a specific webhook |
| create_webhook | POST | Register a webhook |
| update_webhook | PUT | Update a webhook |
| delete_webhook | DELETE | Remove a webhook |
Development
# Local stdio mode
npm run dev
# Local HTTP mode
npm run dev:http
# Then: curl http://localhost:3000/health
# Build
npm run build