Survey MCP Server
A survey platform for ADK-Rust Enterprise agents — create, deliver, and measure surveys. 21 MCP tools spanning authoring (typed questions with validation), distribution (collectors + email invitations with quotas), response collection (validated, partial or complete), and a measurement layer (completion/response rates, NPS, CSAT, distributions, and cross-tabs) — with a full audit trail.
A platform, not a point solution
This is modeled as a general survey/feedback backbone (à la SurveyMonkey / Qualtrics / Typeform), so any agent that needs to ask people questions and act on the answers is a client: customer-experience (NPS/CSAT), employee engagement, product research, market research, event feedback, lead qualification, and more.
The three pillars map directly to the request — create → deliver → measure:
Architecture
Capabilities
- Authoring — surveys with 7 question types:
single_choice,multi_choice,text,rating(bounded scale),nps(0–10),number,boolean. Questions are validated at authoring time and only editable while the survey is a draft. - Distribution — collectors as named channels (open web link, tracked email, or API). Email collectors carry deduplicated invitations with delivery/response status; collectors support a response quota.
- Collection — responses are type-validated against their questions, required-question completeness is enforced on completion, and quota/closed-collector/closed-survey states are respected. Partial responses are supported. Anonymous surveys drop respondent identity.
- Measurement — response funnel (invited → started → completed with completion & response rates), per-question aggregation by type, NPS (promoter/detractor breakdown), CSAT (top-box), and cross-tabs to segment any metric by a choice question (e.g. CSAT by channel/plan).
Governance posture
- Two writes are gated (
requires_approval): opening a survey for collection (set_survey_status→ open) and sending email invitations (send_invitations, classedexternal_write— it delivers to real inboxes). - Opening is guarded — a survey can't be opened with zero questions.
- All measurement and listing is
read_only— analytics never mutate state. - Everything is audited — every state change appends to an audit trail (
audit_log). Sample data is fictitious.
Tools (21)
Authoring (6)
create_survey · get_survey · list_surveys · add_question · list_questions · set_survey_status (gated)
Distribution (6)
create_collector · list_collectors · set_collector_status · add_invitations · send_invitations (gated, external) · list_invitations
Collection (3)
submit_response · get_response · list_responses
Measurement (6)
response_summary · question_results · nps · csat · cross_tab · audit_log
Example
// Create
{"name": "create_survey", "arguments": {"title": "Q3 NPS", "category": "customer-experience"}}
{"name": "add_question", "arguments": {"survey_id": "SRV-1001",
"prompt": "How likely are you to recommend us?", "qtype": "nps", "required": true}}
{"name": "set_survey_status", "arguments": {"survey_id": "SRV-1001", "status": "open"}}
// Deliver
{"name": "create_collector", "arguments": {"survey_id": "SRV-1001", "ctype": "web_link"}}
{"name": "submit_response", "arguments": {"collector_id": "COL-1003",
"answers": [{"question_id": "QN-1002", "value": 9}]}}
// Measure
{"name": "nps", "arguments": {"survey_id": "SRV-1001"}}
{"name": "cross_tab", "arguments": {"survey_id": "SRV-1001",
"segment_question_id": "QN-1004", "metric_question_id": "QN-1002"}}
Install & run
cargo install mcp-survey
mcp-survey # serves MCP over stdio
Or build from source:
git clone https://github.com/zavora-ai/mcp-survey
cd mcp-survey && cargo build --release
./target/release/mcp-survey
Registry manifest
server_id = "mcp_survey"
display_name = "Survey Platform"
version = "1.1.0"
domain = "research"
risk_level = "medium"
writes_allowed = "gated"
The full mcp-server.toml declares all 21 tools with risk classes and approval gates for registry onboarding.
License
Apache-2.0
rmcp and MCP compatibility
This server is built with rmcp 3.1.2 and requires Rust 1.94.1 or newer. The rmcp 3 rollout retains legacy MCP initialization compatibility and targets MCP protocol revisions 2025-11-25 and 2026-07-28.
MCP 2026-07-28 rollout (P4 workflow/business)
This server uses rmcp 3.1.2 and adk-mcp-sdk 0.2 with a minimum supported
Rust version of 1.94.1. It accepts stateless MCP 2026 requests with
per-request protocol, client identity, and capability metadata while retaining
the legacy MCP 2025-11-25 initialize flow for ordinary tools.
- Tasks: None; this server's operations are short-lived and execute directly.
- MRTR approvals:
set_survey_status,send_invitations - Discovery and routing: rmcp serves on-demand discovery and validates the
per-request protocol envelope; HTTP deployments can route with
Mcp-MethodandMcp-Name. The packaged binary currently uses stdio. - Caching:
tools/listreturns a publicttlMsof 60,000 for MCP 2026; rmcp omits the cache fields for legacy clients. - Deprecated extensions: this server does not add new Roots, Sampling, or dynamic client-registration dependencies.
Protected tools require MCP_REQUEST_STATE_KEY with at least 32 high-entropy
bytes. All replicas must share that key so sealed approval state can resume on
another instance. Approval state is bound to the client identity, tool, and
arguments and expires after two minutes. Missing identity, invalid state,
rejection, or legacy protocol use fails closed. Task records are process-local
for the current stdio runtime; use a durable task store before deploying the
server behind scale-to-zero HTTP infrastructure.