Announcing CIMD support for MCP Client registration
Learn more

SurveyMonkey MCP vs SurveyMonkey API for AI Agents (2026)

Vishal Dhawani
Founding Architect @ Scalekit

TL;DR

  • SurveyMonkey runs an official, hosted Model Context Protocol (MCP) server, launched May 5, 2026, with 20 tools. Contacts, email invitations, webhooks, and filtered bulk exports are REST-only.
  • The official server is OAuth-only and serves only US-stored accounts. EU, Canadian, HIPAA-enabled, and Enhanced Sensitive Data Protection accounts need the REST API.
  • REST API tokens don't currently expire. Draft and private apps share 120 requests per minute and 500 per day, and multi-tenant agents need a public app that SurveyMonkey reviews.
  • Community MCP servers put one non-expiring token and one account's respondent data inside unreviewed code, with no per-user audit trail.
  • Scalekit's connector fronts the official server with per-user OAuth, a token vault, per-call execution_ids, and Virtual MCP tool scoping.

Where the SurveyMonkey decision starts

Your agent needs to work with SurveyMonkey. It has to find last quarter's customer satisfaction survey, publish a link for a new pulse check, and tell a CX lead what 400 respondents actually said. You have four options: SurveyMonkey's own hosted MCP server, a community MCP server from a registry, the REST API v3, or Scalekit's connector in front of the official server. They differ in what the agent can do, which accounts can connect, and who ends up holding a credential that never expires. The last difference is the one a security review will ask about.

What each SurveyMonkey path actually is

There are four paths to compare, and two of them share the same tool surface.

The official SurveyMonkey MCP server

SurveyMonkey launched its MCP server on May 5, 2026, alongside its Claude connector. Its ChatGPT connector exposes the same tool set. SurveyMonkey hosts and maintains the server, so there is nothing to install. Users connect through a browser OAuth consent screen.

The server exposes 20 tools. SurveyMonkey's help center lists the access it requests:

  • View surveys
  • Create and edit surveys and collectors
  • View responses and response details
  • View user information

Two sets of terms apply to every MCP connection. SurveyMonkey's API Developer Terms, updated June 9, 2026, define the API to include its MCP servers. The Connector Service-Specific Terms also apply.

Community SurveyMonkey MCP servers

Community servers are open-source wrappers around the REST API v3. They are written by individuals or vendors unaffiliated with SurveyMonkey. The common pattern is a local process launched over stdio that reads a SurveyMonkey access token from an environment variable. Tool coverage is whatever the author chose to wrap. SurveyMonkey doesn't review or support these servers.

The SurveyMonkey REST API v3

The REST API is JSON over HTTPS, authorized with the OAuth 2.0 Authorization Code flow. Every integration starts as a draft app that works only against your own account for 90 days. After that, you deploy it as private or public.

  • Private app: skips review, but every user must be on the same SurveyMonkey team and have a paid plan with direct API access.
  • Public app: listed in SurveyMonkey's App Directory, and SurveyMonkey must review and approve it first.

Accounts in the EU and Canadian data centers use regional API hosts. The token exchange returns the correct access_url for each account.

Scalekit's SurveyMonkey MCP connector

Scalekit's SurveyMonkey MCP connector docs describe a connector that sits in front of SurveyMonkey's official server rather than reimplementing it. Each user signs in to SurveyMonkey once. Scalekit stores and refreshes that user's tokens, and the agent never handles them. Scalekit lists the connector's auth as OAuth 2.1 with Dynamic Client Registration (DCR).

You get the same 20 tools, named surveymonkeymcp_<tool>. You can call them with execute_tool or serve them through a Virtual MCP server. The SurveyMonkey MCP connector page shows client setup for Claude Code, Cursor, Codex, and Copilot.

Comparing them where it matters for agents

The official server and Scalekit's connector share one tool surface, so the capability comparison is really MCP versus REST. A community server covers whatever its author implemented.

What your agent can actually do

The MCP server is built for a conversational loop: find a survey, build or adjust it, publish a link, read the results. The REST API covers distribution, events, and administration.

Capability
SurveyMonkey MCP (official or via Scalekit)
SurveyMonkey REST API v3
Search and read surveys, pages, questions
Yes: search_surveys, get_survey, get_pages, get_questions
Yes: /surveys, /surveys/{id}/details
Create a survey, add pages and questions
Yes: create_survey, add_page, add_question
Yes: /surveys, /surveys/{id}/pages
Edit, reorder, or delete questions
Yes, but blocked once the survey has responses
Yes: page and question endpoints
Delete a survey
No
Yes: /surveys/{id}
Publish a shareable link
Yes: create_weblink_collector, web link only
Yes: web link, email, SMS, and popup collectors; non-web-link collectors need a paid plan
Send email invitations to recipients
No
Yes: /collectors/{id}/messages
Response counts and statistical summaries
Yes: get_response_count, get_response_summary
Yes: /surveys/{id}/rollups, /surveys/{id}/trends
Raw responses
Partial: get_responses, paginated, no date filters
Yes: /surveys/{id}/responses/bulk with date and time-spent filters, 100 per page
Contacts and contact lists
No
Yes: /contacts, /contact_lists
Event subscriptions
No
Yes: /webhooks, 12 response, survey, and collector events
Workgroups, teams, and roles
No
Yes: paid-plan scopes

Two MCP tools are designed for agents. get_response_summary returns pre-computed counts and percentages with choice labels already resolved, so the model doesn't have to tally raw responses itself. generate_survey_plan drafts a title and question list from a plain-language description without saving anything.

Where the gap bites for survey agents

Survey agents are event-driven by nature: a feedback agent should act when a response lands, not poll for it. The API's response_completed webhook supports that. Over MCP, the only option is calling get_response_count on a schedule.

Distribution is the second gap. Sending invitations to a contact list is REST-only, so an agent that runs a full NPS cycle cannot rely on MCP alone.

The live-survey constraint

Every structural edit tool on the MCP server is blocked once a survey has responses: add_page, add_question, edit_question, delete_question, reorder_questions, and update_survey. An agent can iterate freely on drafts but cannot change a live survey. Design your prompts and approval steps around that.

The auth path each one puts you on

The four paths differ more in the shape of the credential than in capability.

Path
Credential
Who holds it
Per-user identity
Account regions
Official MCP server
OAuth grant from browser consent
Your MCP client
Yes
US data storage only
Community MCP server
One static access token
A config file or env var on the host
No, one account
Whatever host the server calls
REST API v3
OAuth access token, or a private-app token
Your backend
Yes, if you run OAuth per user
US, EU, Canada
Scalekit connector
A connected account per user
Scalekit's token vault
Yes
Same as the official MCP server

Official MCP: per-user OAuth, US accounts only

The official server authenticates each user through OAuth consent. Every tool call runs with that user's SurveyMonkey plan, seat, and role. SurveyMonkey documents no static-key option for headless use.

Availability is the harder constraint. The connectors work only for accounts whose data is stored in the United States. They are not available to HIPAA-enabled Enterprise accounts or Enhanced Sensitive Data Protection accounts.

Revocation is in the user's hands: they unlink the SurveyMonkey MCP Server under Linked Accounts in their account settings. Team and Enterprise admins who want to disable it for the whole team have to contact SurveyMonkey support.

REST API: tokens that don't expire

SurveyMonkey uses the standard three-step Authorization Code grant. The code is valid for five minutes, and the exchange returns a long-lived access token. SurveyMonkey's docs state that access tokens don't currently expire but may in the future. There is no refresh token.

That removes refresh logic entirely and makes storage the whole security boundary. A leaked token stays valid until the user revokes access. After revocation, calls fail with error 1013 and you have to run OAuth again.

Scopes are set per app as required or optional. Some, including responses_read_detail, require the user to be on a paid plan.

The multi-tenant catch on the REST path

A private app can't serve a multi-tenant agent. Every user of a private app must be on the same SurveyMonkey team, and a draft app authenticates only your own account.

An agent that acts for users across 12 customer organizations therefore needs a public app, and SurveyMonkey must review and approve it before publication. SurveyMonkey's API docs also require explicit approval to use the Create/Modify Surveys and Create/Modify Responses scopes in a public app. The MCP path avoids this because users consent to SurveyMonkey's own server.

The structural point on every path

Both paths require per-user credential isolation in a B2B agent. The MCP server gives you an OAuth grant per user; the REST API gives you a long-lived token per account. Neither path stores, rotates, or revokes those credentials for you.

Take 60 HR managers across 12 customer organizations. That is 60 grants to encrypt at rest, isolate per tenant, and clean up when someone leaves. You need that infrastructure whichever path you choose.

What you own in production

Hosting is the smallest part of the operational work.

On the official MCP path

SurveyMonkey hosts the server and writes the tool schemas. You own:

  • Per-user token storage and refresh.
  • Handling users who unlink.
  • Schema drift: tool names and parameters change when SurveyMonkey updates the server.

SurveyMonkey publishes no rate limits for the MCP server.

You also own human review. The API Developer Terms require user permission before an app edits, distributes, or closes surveys. They also prohibit encouraging reliance on unreviewed automated actions where human review is reasonably appropriate.

Terms that apply to every MCP connection

SurveyMonkey's Connector Service-Specific Terms let it modify, limit, suspend, or discontinue the MCP feature at any time, and impose rate limits whenever it chooses. The terms prohibit the following through the connector:

  • Protected health information
  • Payment card data outside intended fields
  • Credentials for third-party services
  • Using the connector to train models

They also limit use to third-party services that SurveyMonkey makes available or approves in writing. Confirm your deployment model with SurveyMonkey before launch.

On the REST API path

You own everything above, plus the adapter layer:

  • LLM-ready tool schemas
  • links.next pagination
  • Regional routing through access_url
  • SurveyMonkey's error codes: 1015 means the user's plan lacks the feature, and 1018 means you called the wrong regional host

Every schema you write is one you maintain through each API change.

The rate budget is per app, not per user

Draft and private apps start at 120 requests per minute and 500 per day. The daily limit resets at midnight GMT. SurveyMonkey tolerates three overages of up to 150 percent within 30 days, then enforces the limit strictly. The rate-limit headers are named X-Ratelimit-App-Global-*, and every user of your agent draws from the same pool.

An analysis task that searches, fetches a survey, pulls a summary, and pages through five batches of responses costs eight calls. At 500 calls a day, that is 62 tasks across your entire user base. Published public apps get up to 500,000 requests per day. Higher private limits require contacting SurveyMonkey sales, and fees may apply.

The risks of community SurveyMonkey MCP servers

Community servers are the fastest way to get SurveyMonkey into Claude Desktop on a laptop. Because they wrap the REST API, some also expose endpoints the official server lacks. They also carry the most risk of any path.

Credential exposure

A community server needs a private-app token or an OAuth token, and neither currently expires. The token usually sits in plaintext in an MCP client config file or .env, readable by any process running as that user and copied into every backup. A leaked token doesn't expire in 60 minutes. It keeps working until someone notices and revokes it.

Unreviewed code holding account access

The server process holds a credential that can read every survey and response the account can see. Email collectors can attach respondent names and emails to those responses. Nothing limits what that code, or any package it depends on, does with the token.

Tool descriptions come from the same unreviewed source and go directly into your model's context. Every update pulls new code into a process that already holds your credentials.

Maintenance and breakage

A community server is only as current as its last commit. A server that hard-codes the US host fails for EU and Canadian accounts with error 1018. A server built on a draft-app token stops working when the 90-day draft window closes. When a tool breaks mid-task, there is no vendor to escalate to.

No audit trail

Every call goes out as the token owner. SurveyMonkey sees one app and one account. Your logs, if the server writes any, show a process rather than a person. When a CISO asks which user's agent edited a question or published a link, a shared-token server can't answer.

Policy liability

SurveyMonkey's API Developer Terms make you responsible for every Third-Party Client used with your app. All prompts, tool calls, and actions submitted through one are deemed submitted by you, and you indemnify SurveyMonkey for resulting claims.

The terms also bar giving an access token to a third party without SurveyMonkey's written consent, which any hosted community server requires. Running someone else's server doesn't shift any of that liability to its author.

Recommended reading: MCP security risks for AI agents

When to use each path

Choose based on where the agent runs and whose data it touches.

Use the official SurveyMonkey MCP server when

  • One user wants SurveyMonkey inside Claude, ChatGPT, or an MCP-capable IDE, and browser consent at setup is expected.
  • The work is conversational: find a survey, adjust questions before launch, publish a web link, and summarize results with get_response_summary.
  • Every account you serve stores its data in the US and none are HIPAA-enabled.
  • You want survey building without writing or maintaining tool schemas.

Use the SurveyMonkey REST API when

  • The agent is event-driven and reacts to response_completed webhooks instead of polling.
  • It distributes surveys through email or SMS collectors, or manages contacts and contact lists.
  • You serve EU or Canadian accounts, or need response exports filtered by date.
  • It is a deterministic pipeline, such as a nightly response sync into a warehouse, where explicit pagination matters more than tool discovery.

Use Scalekit's SurveyMonkey connector when

  • You are building a multi-tenant B2B agent where each user connects their own SurveyMonkey account, and you don't want to build OAuth and token storage yourself.
  • The agent combines SurveyMonkey with other tools, such as posting a summary to Slack or logging NPS detractors in a CRM, under one per-user identity.
  • A security review will ask where tokens live and who authorized each call.
  • Different agent roles need different subsets of the 20 tools.

When a community server is acceptable

A community server is acceptable for a throwaway experiment against your own account on a machine you control, using a draft-app token limited to read scopes. Never use one for multiple users or in production.

Connecting SurveyMonkey to your agent with Scalekit

The hard part of a SurveyMonkey agent is not the tool call. It is holding a credential for every user, scoping what each agent role can touch, and proving afterward who authorized what. Scalekit takes all three out of your agent: users authorize once, the token vault holds the credentials, and your code references a user identifier instead of a token.

Prerequisites

Create a SurveyMonkey MCP connection under AgentKit > Connections in the Scalekit dashboard. The connection_name in your code must match the dashboard name exactly; a mismatched name is the most common integration error. Set these environment variables:

  • SCALEKIT_ENVIRONMENT_URL
  • SCALEKIT_CLIENT_ID
  • SCALEKIT_CLIENT_SECRET
  • ANTHROPIC_API_KEY
pip install scalekit-sdk-python anthropic langchain-anthropic "langchain-mcp-adapters>=0.3,<1"

Authorize each user once

The connected account is Scalekit's per-user record for SurveyMonkey. If the user hasn't authorized yet, send them the authorization link. After that, your agent never touches their SurveyMonkey token. For production callback handling, see Authorize a user.

import os from scalekit import ScalekitClient scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions # Must match the connection name under AgentKit > Connections exactly CONNECTION_NAME = "surveymonkeymcp" USER_ID = "user_123" # your app's stable identifier for this user account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=USER_ID ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=USER_ID ) print("Connect SurveyMonkey:", link.link) input("Press Enter after authorizing...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=USER_ID ) if account.connected_account.status != "ACTIVE": raise RuntimeError( f"SurveyMonkey is {account.connected_account.status}, not ACTIVE" )

Retrieve only the tools this user is authorized to call

list_scoped_tools doesn't return a connector catalog. It returns the tools the current user's connected account is authorized to call. This example narrows that further to four read-only tools for a results-analysis agent. Loading four tool definitions instead of 20 reduces token overhead and gives the model fewer tools to choose between.

import anthropic from google.protobuf.json_format import MessageToDict READ_ONLY_TOOLS = [ "surveymonkeymcp_search_surveys", "surveymonkeymcp_get_survey", "surveymonkeymcp_get_response_count", "surveymonkeymcp_get_response_summary", ] scoped, _ = actions.tools.list_scoped_tools( identifier=USER_ID, filter={"connection_names": [CONNECTION_NAME], "tool_names": READ_ONLY_TOOLS}, page_size=100, ) llm_tools = [] for scoped_tool in scoped.tools: definition = MessageToDict(scoped_tool.tool).get("definition", {}) llm_tools.append({ "name": definition.get("name"), "description": definition.get("description", ""), "input_schema": definition.get("input_schema", {}), })

Run the Claude tool-use loop

Each tool call goes through execute_tool with the user identifier, and Scalekit attaches that user's credential on the server side. This loop uses the Claude SDK (the anthropic Python package) with Claude Sonnet 5. Sonnet 5 returns thinking blocks by default, so the loop reads text blocks by type and passes the full content back on each turn.

client = anthropic.Anthropic() messages = [{ "role": "user", "content": "Find my most recent customer satisfaction survey and summarize the results.", }] while True: response = client.messages.create( model="claude-sonnet-5", max_tokens=8192, tools=llm_tools, messages=messages, ) messages.append({"role": "assistant", "content": response.content}) if response.stop_reason != "tool_use": print("".join(b.text for b in response.content if b.type == "text")) break tool_results = [] for block in response.content: if block.type != "tool_use": continue result = actions.execute_tool( tool_name=block.name, tool_input=block.input, identifier=USER_ID, connection_name=CONNECTION_NAME, ) print(f"{block.name} execution_id={result.execution_id}") tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": str(result.data), }) messages.append({"role": "user", "content": tool_results})

Write tools need a gate. surveymonkeymcp_create_weblink_collector, for example, publishes an open link immediately, so require explicit user confirmation before execute_tool runs it.

Every call leaves an attributable record

Every execute_tool response carries an execution_id. Scalekit's agent logs attribute each downstream call to the user who authorized it and the agent that ran it, along with the response, and they can be exported to your SIEM. A shared-token community server can't produce that trail. It is also the monitoring record SurveyMonkey's Developer Terms make you responsible for.

Serve SurveyMonkey through a Virtual MCP server

If your agent runtime speaks MCP, a Virtual MCP server gives it a scoped endpoint instead of SurveyMonkey's full 20-tool surface. Create the server once per agent role, not once per user.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = actions.mcp.create_config( name="survey-insights-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="surveymonkeymcp", # must match the dashboard name tools=[ "surveymonkeymcp_search_surveys", "surveymonkeymcp_get_survey", "surveymonkeymcp_get_response_summary", ], ), ], ) print("SCALEKIT_MCP_CONFIG_ID =", vmcp.config.id) print("SCALEKIT_MCP_SERVER_URL =", vmcp.config.mcp_server_url)

Mint a session token per user, per run

Before each run, confirm the user's connections are active, then mint a short-lived session token bound to that user. The default lifetime is about one hour, and the maximum is 24 hours. This example uses LangChain's MCP adapter.

import asyncio from datetime import timedelta from langchain_anthropic import ChatAnthropic from langchain_core.messages import HumanMessage, ToolMessage from langchain_mcp_adapters.client import MultiServerMCPClient config_id = os.environ["SCALEKIT_MCP_CONFIG_ID"] mcp_url = os.environ["SCALEKIT_MCP_SERVER_URL"] accounts = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=USER_ID, include_auth_link=True ) for acct in accounts.connected_accounts: if (acct.connected_account_status or "").upper() != "ACTIVE": raise RuntimeError( f"{acct.connection_name} needs auth: {acct.authentication_link}" ) session_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=USER_ID, expiry=timedelta(minutes=30) ).token async def run(): mcp = MultiServerMCPClient({ "scalekit": { "transport": "streamable_http", "url": mcp_url, "headers": {"Authorization": f"Bearer {session_token}"}, } }) tools = await mcp.get_tools() tool_map = {t.name: t for t in tools} llm = ChatAnthropic(model="claude-sonnet-5", max_tokens=8192).bind_tools(tools) messages = [HumanMessage("Summarize responses to my latest employee pulse survey.")] while True: reply = await llm.ainvoke(messages) messages.append(reply) if not reply.tool_calls: print(reply.text) break for call in reply.tool_calls: output = await tool_map[call["name"]].ainvoke(call["args"]) messages.append(ToolMessage(content=str(output), tool_call_id=call["id"])) asyncio.run(run())

The Node.js SDK doesn't mint MCP session tokens yet, so TypeScript agents should mint the token on a Python backend and pass it in. For the full lifecycle, see Set up and connect a Virtual MCP server and the LangChain example.

One definition for multi-tool, multi-tenant agents

create_config accepts one McpConfigConnectionToolMapping per connection. A survey agent that also posts to Slack or updates a CRM gets a single endpoint covering all of them. The server URL is the same for every user; each user's identity arrives with their session token.

Twelve customer organizations and 60 users still means one server definition and 60 connected accounts, with no credential shared between users.

Recommended reading: What a Virtual MCP server is and When to use a Virtual MCP server

The credential problem that exists on every path

No path removes the per-user credential. They differ only in what that credential looks like.

What SurveyMonkey gives you

You get per-user identity on the MCP path and per-account tokens on the REST path. Every call runs within the user's plan, seat, and role limits. That is the right security posture, but it is identity enforcement, not credential lifecycle management.

What you still have to build

  • Storage for credentials that, on the REST path, never expire.
  • Tenant isolation, so one customer's token is never used for another.
  • Revocation handling for when a user unlinks or leaves their company.
  • An audit trail that ties each call to a person.

The token type differs by path; the infrastructure you need does not.

Where Scalekit fits

Scalekit's SurveyMonkey connector handles the per-user OAuth flow, token storage, and refresh, and records every call. Choosing the MCP path doesn't change your credential infrastructure. For REST-only capabilities such as email invitations, Add your own connector lets you define custom tools on the same connected-account model.

Which one to build against

If your agent is a conversational assistant for US-based SurveyMonkey users, build on the official MCP server. Examples include building a survey, publishing a link, and summarizing results.

If it is event-driven, sends invitations, serves EU or Canadian accounts, or runs as a deterministic export pipeline, build on the REST API. Budget for the per-app rate limit and the public-app review.

Keep community servers on your own laptop.

Most production survey agents become multi-tenant, and that narrows the decision. Every path leaves you holding a credential per user, and on the REST path that credential never expires. The agent that passes a security review is the one where no SurveyMonkey token ever lives in agent code.

Build your SurveyMonkey agent with Scalekit

Start with the Scalekit SurveyMonkey MCP connector and the SurveyMonkey connector docs, and review Scalekit pricing. If you are building a SurveyMonkey agent and want help with per-user auth, tool scoping, or Virtual MCP setup, talk to the Scalekit team.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.