humansurvey-mcp
HumanSurvey
웹사이트: humansurvey.co · 문서: humansurvey.co/docs · FAQ: humansurvey.co/faq
AI 에이전트를 위한 피드백 수집 인프라입니다.
HumanSurvey를 사용하면 장기적인 작업을 수행하는 에이전트가 여러 사람으로부터 구조화된 피드백을 수집할 수 있습니다:
Agent is doing a job
→ needs structured feedback from a group
→ creates survey from JSON schema
→ shares /s/{id} URL with respondents
→ humans respond over hours or days
→ agent retrieves structured JSON results and acts on them이것은 무엇인가요?
HumanSurvey는 단 하나의 좁은 작업을 위한 최소한의 API이자 MCP 서버입니다. 에이전트가 인간 그룹으로부터 구조화된 피드백을 수집하고 기계가 사용할 수 있는 결과를 다시 가져올 수 있도록 합니다.
다음과 같은 용도로 설계되었습니다:
설문조사가 필요한 이벤트 관리, 제품 출시 또는 커뮤니티 워크플로우를 실행하는 AI 에이전트
가벼운 피드백 수집 기본 요소가 필요한 에이전트 제품을 구축하는 개발자
다음과 같은 용도로는 설계되지 않았습니다:
설문조사 대시보드
시각적 양식 빌더
템플릿 라이브러리
이메일 캠페인
분석/보고 UI
Related MCP server: veyra-forms
주요 기능
JSON 스키마 입력 — 구조화되고 정밀하며 기계가 직접 생성 가능
MCP 서버 — Claude Code에서 직접 설문조사를 생성하고 결과를 읽음
최소한의 API 표면 — 인증된 생성자 경로, 공개 응답자 제출
4가지 의미론적 질문 유형 —
choice,text,scale,matrix조건부 로직 — Markdown 및 JSON 스키마의
showIf지원명시적 수명 주기 — 설문조사 종료, 만료 및 최대 응답 제한
제품 원칙
시각적 요소보다 의미론적 요소 우선: HumanSurvey는 UI 전용 필드 유형의 집합이 아닌 작은 프로토콜을 가집니다.
AI 우선 I/O: 에이전트가 설문조사를 작성하고 에이전트가 결과를 소비하며, 인간은 그 중간에 위치합니다.
모든 것은 API: 생성자 기능은 인증된 HTTP 및 MCP를 통해 사용할 수 있어야 합니다.
좁은 범위가 승리한다: 주로 인간 설문조사 운영자를 위한 기능이라면, 아마도 여기에 포함되지 않을 것입니다.
지원되는 질문 유형
single_choicemulti_choicetextscalematrix
Markdown 구문
# Survey Title
**Description:** Instructions for the respondent.
## Section Name
**Q1. Your question here?**
- ☐ Option A
- ☐ Option B
- ☐ Option C
**Q2. Multi-select question?** (select all that apply)
- ☐ Choice 1
- ☐ Choice 2
- ☐ Choice 3
**Q3. Open-ended question:**
> _______________
| # | Item | Rating |
|---|------|--------|
| 1 | Item A | ☐Good ☐OK ☐Bad |
| 2 | Item B | ☐Good ☐OK ☐Bad |척도(Scale) 질문:
**Q4. How severe is this issue?**
[scale 1-5 min-label="Low" max-label="Critical"]조건부 로직:
**Q1. Did the deploy fail?**
- ☐ Yes
- ☐ No
**Q2. Which step failed?**
> show if: Q1 = "Yes"
> _______________________________________________빠른 시작
Claude Code와 함께 사용하기
Claude Code 설정(~/.claude.json)에 추가하세요:
{
"mcpServers": {
"survey": {
"command": "npx",
"args": ["-y", "humansurvey-mcp"],
"env": {
"HUMANSURVEY_API_KEY": "hs_sk_your_key_here"
}
}
}
}그런 다음 Claude Code에서:
> Create a post-event feedback survey with a 1-5 rating, open text, and a yes/no question사용 가능한 도구:
create_key— API 키 자체 프로비저닝; 인간 설정 불필요create_survey— JSON 스키마에서 생성; 선택적max_responses,expires_at,webhook_urlget_results— 집계된 결과 + 원시 응답list_surveys— 키가 소유한 설문조사 목록close_survey— 설문조사를 즉시 종료
HTTP API 사용하기
curl -X POST https://www.humansurvey.co/api/keys \
-H "Content-Type: application/json" \
-d '{
"name": "my claude agent",
"email": "you@example.com",
"wallet_address": "eip155:8453:0xabc..."
}'모든 필드는 선택 사항입니다. wallet_address는 CAIP-10 형식을 사용하며, 향후 에이전트 네이티브 결제에 사용될 예정입니다.
그런 다음 설문조사를 생성하세요:
curl -X POST https://www.humansurvey.co/api/surveys \
-H "Authorization: Bearer hs_sk_..." \
-H "Content-Type: application/json" \
-d '{
"schema": {
"title": "Post-Event Feedback",
"sections": [{
"questions": [
{ "type": "scale", "label": "How would you rate the event?", "min": 1, "max": 5 },
{ "type": "text", "label": "What should we improve?" }
]
}]
}
}'응답:
{
"survey_url": "/s/abc123",
"question_count": 1
}결과 읽기:
curl https://www.humansurvey.co/api/surveys/abc123/responses \
-H "Authorization: Bearer hs_sk_..."공개 표면
문서 페이지:
https://www.humansurvey.co/docsOpenAPI:
https://www.humansurvey.co/api/openapi.jsonAI 인덱스:
https://www.humansurvey.co/llms.txt
기술 스택
구성 요소 | 기술 |
프레임워크 | Next.js (App Router) |
데이터베이스 | Neon (서버리스 Postgres) |
파서 | remark (unified 생태계) |
프론트엔드 | React + Tailwind CSS |
MCP 서버 | @modelcontextprotocol/sdk |
배포 | Vercel |
프로젝트 구조
├── apps/web/ # Next.js app (API + frontend)
├── packages/parser/ # Markdown → Survey JSON parser
├── packages/mcp-server/ # MCP server for Claude Code
└── docs/ # Architecture docs기여하기
PR을 열기 전에 CONTRIBUTING.md를 읽어보세요. 가장 중요한 규칙은 범위 규율입니다. 새로운 UI 변형, 분석 대시보드 및 인간 운영자 기능은 일반적으로 범위를 벗어납니다.
개발
pnpm install
pnpm dev # Start Next.js dev server
pnpm --filter @mts/parser test
pnpm build # Build all packages라이선스
MIT
Available Tools
5 toolsclose_surveyClose SurveyA
Permanently close a survey so it no longer accepts new responses. Use this when you have enough responses or the data collection window has passed. Returns the final response count. Closing is irreversible via MCP — use PATCH /api/surveys/{id} to re-open.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | The survey ID to close |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses permanence ('Permanently close', 'irreversible via MCP') and return value ('Returns the final response count'). With no annotations, this covers key behavioral traits, though auth or side effects are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second adds usage context and alternative. Front-loaded and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one param and no output schema, the description covers purpose, when to use, irreversibility, and return value fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter survey_id, with 100% schema coverage. The description doesn't add extra meaning beyond the schema's 'The survey ID to close', but this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'close' and the resource 'survey' with the effect of no longer accepting new responses. This distinguishes it from siblings like create_survey, list_surveys, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when you have enough responses or the data collection window has passed.' Also provides an alternative for re-opening via PATCH, guiding when not to use it irreversibly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_keyCreate API KeyA
Create a new HumanSurvey API key. Call this before any other tool if HUMANSURVEY_API_KEY is not set. Returns a key — store it as HUMANSURVEY_API_KEY in your MCP config. The key cannot be retrieved again after creation.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A label for this key, e.g. the project or agent name. | |
| No | Contact email of the human owner. Used for billing and usage notifications in the future. | ||
| wallet_address | No | Optional wallet address in CAIP-10 format (e.g. "eip155:8453:0xabc..." for Base, "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:ABC..." for Solana). Will be used for agent-native payments in the future. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the key 'cannot be retrieved again after creation', a critical behavioral trait. No annotations exist, so the description carries the full burden; it is informative but could mention auth or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no wasted words: first defines purpose, second gives usage context, third reveals a critical constraint. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create-key tool with no output schema, the description adequately covers the action, prerequisite, and key irreversibility. Could mention return format or failure cases for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds no parameter-level details beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Create a new HumanSurvey API key', a specific verb+resource. Sibling tools are about surveys, so this tool is distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this before any other tool if HUMANSURVEY_API_KEY is not set', giving clear when-to-use context. Does not list alternatives, but siblings are unrelated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_surveyCreate SurveyA
Use this when an agent task involves collecting structured feedback or data from a group of people. Common cases: post-event attendee feedback, product satisfaction after a launch, team health checks, customer ratings after support resolution. The schema parameter is fully typed — follow the field types rather than guessing. Returns a survey_url to share with respondents and a survey_id to pass to get_results later. The survey accepts responses immediately and stays open until you close it or it expires. Embedding: append "?embed=1" to the returned survey_url to render inside an on any host site (onboarding/lead-capture flows). The embedded form posts events to window.parent with source: "humansurvey" — type "loaded", "resize" (with height), and "submitted" (with responseId and answers). See https://www.humansurvey.co/llms.txt for the full embed contract.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | Yes | Survey definition. Each question is a discriminated union keyed by type: single_choice, multi_choice, text, scale, or matrix. Use the typed fields below — do not send free-form JSON. | |
| max_responses | No | Optional. Close the survey automatically after this many responses. | |
| expires_at | No | Optional. ISO 8601 datetime — close the survey automatically at this time (e.g. "2026-04-14T00:00:00Z"). | |
| webhook_url | No | Optional. URL to POST to once when the survey closes. Payload: { survey_id, status: "closed", closed_reason: "manual" | "max_responses", response_count, closed_at }. Fires when you call close_survey or when max_responses is reached. Does not fire when expires_at elapses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses that surveys accept responses immediately, remain open until closed or expired, and explains embed behavior (?embed=1) with window.parent events. Also notes webhook limitations (does not fire on expiration). This goes beyond basic expectations for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear front-loading: 'Use this when...' followed by examples, then schema guidance, then return values, then embed details. Each sentence serves a purpose. Slightly lengthy but not redundant; could be tightened without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains return values (survey_url, survey_id) and how to use them. Covers lifecycle (immediate acceptance, expiration, closing), embed functionality, and webhook behavior. This provides a complete mental model for the agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions on each field, including nested objects and conditional logic (showIf). The description adds minor value: advises to follow field types and mentions returns (survey_url, survey_id). But the schema already explains parameters thoroughly, so the description adds little beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool's purpose: creating surveys for collecting structured feedback from groups. Provides specific examples like post-event feedback, product satisfaction, team health checks. The verb 'create' and resource 'survey' are unambiguous, and the description distinguishes it from sibling tools (close_survey, etc.) through context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'when an agent task involves collecting structured feedback or data from a group of people.' Lists common use cases. However, it doesn't explicitly mention when not to use this tool or name alternatives (like using get_results for retrieving responses). The guidance is strong but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resultsGet ResultsA
Retrieve aggregated results for a survey. Shows survey status (open/closed), total response count, and per-question results: choice tallies with percentages, scale mean/median/distribution, and recent text responses. If the survey is still open, call again later to check for new responses — the output will tell you. Use close_survey when you have enough responses.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | The survey ID from the create_survey output (last segment of the survey_url, e.g. "abc123efgh45") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the output indicates if survey is open and suggests re-calling. Since no annotations exist, the description compensates well, though it could explicitly state the tool is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with the core purpose. Every sentence adds value without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description thoroughly covers the return content (status, counts, per-question details) and provides context for re-calling. Completeness is high for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with an already detailed description of survey_id. The description adds no extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'retrieve' and resource 'aggregated results for a survey', listing specific output details (status, counts, per-question results). It clearly differentiates from siblings like close_survey.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to call again if survey is open and recommends using close_survey when enough responses are collected, providing clear when-to-use and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_surveysList SurveysA
List all surveys created with the current API key, ordered newest first. Use this to find a survey_id you need for get_results or close_survey, or to check which surveys are still open.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses ordering and scope (surveys with current API key) but no annotations exist. For a simple read-only list, this is sufficient; no destructive actions are implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with action, no waste. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, description covers purpose, ordering, and use cases. Complexity is low, and description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline 4 applies. Description adds no parameter info as none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists all surveys created with the current API key, ordered newest first, and distinguishes it from sibling tools like get_results and close_survey.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: to find a survey_id for get_results or close_survey, or check open surveys. Does not specify when not to use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.2- Added
create_key - Changed
create_survey5 fields changed- removed
Input schema / properties / schema / additionalPropertiesRemoved value: -{} - changed
Input schema / properties / schema / descriptionPrevious value: -"Survey as a JSON schema object: { title: string, sections: [{ questions: [{ type, label, ...}] }] }. Question types: single_choice (needs options), multi_choice (needs options), text, scale (needs min/max, range ≤ 11), matrix (needs rows + columns). Add showIf: { questionId, operator: \"eq\"|\"neq\"|\"contains\"|\"answered\", value } to any question for conditional logic."New value: +"Survey definition. Each question is a discriminated union keyed by type: single_choice, multi_choice, text, scale, or matrix. Use the typed fields below — do not send free-form JSON." - added
Input schema / properties / schema / propertiesAdded value: +{ + "description": { + "description": "Optional intro text shown on the welcome screen.", + "type": "string" + }, + "sections": { + "description": "Survey sections, each with questions. Use a single section for simple surveys.", + "items": { + "properties": { + "description": { + "description": "Optional section description.", + "type": "string" + }, + "questions": { + "description": "Questions in this section.", + "items": { + "oneOf": [ + { + "properties": { + "description": { + "description": "Optional helper text shown under the question label.", + "type": "string" + }, + "label": { + "description": "Question text shown to the respondent.", + "type": "string" + }, + "options": { + "description": "Options the respondent chooses exactly one of.", + "items": { + "properties": { + "hasTextInput": { + "description": "Set true for an \"Other: ___\" option that lets the respondent type a free-text value.", + "type": "boolean" + }, + "label": { + "description": "Option text shown to the respondent.", + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "required": { + "description": "Whether an answer is required. Defaults to false.", + "type": "boolean" + }, + "showIf": { + "description": "Only show this question if the condition on an earlier question is met.", + "properties": { + "operator": { + "description": "eq = referenced answer equals value; neq = not equal; contains = multi_choice selection includes value; answered = respondent gave any answer.", + "enum": [ + "eq", + "neq", + "contains", + "answered" + ], + "type": "string" + }, + "questionId": { + "description": "ID of the earlier question to check. IDs are assigned in order of appearance as q_0, q_1, q_2, ... across all sections. Must reference a question before the one where showIf is set.", + "type": "string" + }, + "value": { + "description": "Option ID (opt_0, opt_1, ...) for eq/neq/contains — numbered per-question in option order. Omit for the answered operator.", + "type": "string" + } + }, + "required": [ + "questionId", + "operator" + ], + "type": "object" + }, + "type": { + "const": "single_choice", + "type": "string" + } + }, + "required": [ + "type", + "label", + "options" + ], + "type": "object" + }, + { + "properties": { + "description": { + "description": "Optional helper text shown under the question label.", + "type": "string" + }, + "label": { + "description": "Question text shown to the respondent.", + "type": "string" + }, + "options": { + "description": "Options the respondent can pick one or more of.", + "items": { + "properties": { + "hasTextInput": { + "description": "Set true for an \"Other: ___\" option that lets the respondent type a free-text value.", + "type": "boolean" + }, + "label": { + "description": "Option text shown to the respondent.", + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "required": { + "description": "Whether an answer is required. Defaults to false.", + "type": "boolean" + }, + "showIf": { + "description": "Only show this question if the condition on an earlier question is met.", + "properties": { + "operator": { + "description": "eq = referenced answer equals value; neq = not equal; contains = multi_choice selection includes value; answered = respondent gave any answer.", + "enum": [ + "eq", + "neq", + "contains", + "answered" + ], + "type": "string" + }, + "questionId": { + "description": "ID of the earlier question to check. IDs are assigned in order of appearance as q_0, q_1, q_2, ... across all sections. Must reference a question before the one where showIf is set.", + "type": "string" + }, + "value": { + "description": "Option ID (opt_0, opt_1, ...) for eq/neq/contains — numbered per-question in option order. Omit for the answered operator.", + "type": "string" + } + }, + "required": [ + "questionId", + "operator" + ], + "type": "object" + }, + "type": { + "const": "multi_choice", + "type": "string" + } + }, + "required": [ + "type", + "label", + "options" + ], + "type": "object" + }, + { + "properties": { + "description": { + "description": "Optional helper text shown under the question label.", + "type": "string" + }, + "label": { + "description": "Question text shown to the respondent.", + "type": "string" + }, + "required": { + "description": "Whether an answer is required. Defaults to false.", + "type": "boolean" + }, + "showIf": { + "description": "Only show this question if the condition on an earlier question is met.", + "properties": { + "operator": { + "description": "eq = referenced answer equals value; neq = not equal; contains = multi_choice selection includes value; answered = respondent gave any answer.", + "enum": [ + "eq", + "neq", + "contains", + "answered" + ], + "type": "string" + }, + "questionId": { + "description": "ID of the earlier question to check. IDs are assigned in order of appearance as q_0, q_1, q_2, ... across all sections. Must reference a question before the one where showIf is set.", + "type": "string" + }, + "value": { + "description": "Option ID (opt_0, opt_1, ...) for eq/neq/contains — numbered per-question in option order. Omit for the answered operator.", + "type": "string" + } + }, + "required": [ + "questionId", + "operator" + ], + "type": "object" + }, + "type": { + "const": "text", + "type": "string" + } + }, + "required": [ + "type", + "label" + ], + "type": "object" + }, + { + "properties": { + "description": { + "description": "Optional helper text shown under the question label.", + "type": "string" + }, + "label": { + "description": "Question text shown to the respondent.", + "type": "string" + }, + "max": { + "description": "Highest scale value. The range (max - min + 1) must be ≤ 11.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "maxLabel": { + "description": "Label shown at the max end, e.g. \"Very likely\".", + "type": "string" + }, + "min": { + "description": "Lowest scale value (usually 0 or 1).", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "minLabel": { + "description": "Label shown at the min end, e.g. \"Not likely\".", + "type": "string" + }, + "required": { + "description": "Whether an answer is required. Defaults to false.", + "type": "boolean" + }, + "showIf": { + "description": "Only show this question if the condition on an earlier question is met.", + "properties": { + "operator": { + "description": "eq = referenced answer equals value; neq = not equal; contains = multi_choice selection includes value; answered = respondent gave any answer.", + "enum": [ + "eq", + "neq", + "contains", + "answered" + ], + "type": "string" + }, + "questionId": { + "description": "ID of the earlier question to check. IDs are assigned in order of appearance as q_0, q_1, q_2, ... across all sections. Must reference a question before the one where showIf is set.", + "type": "string" + }, + "value": { + "description": "Option ID (opt_0, opt_1, ...) for eq/neq/contains — numbered per-question in option order. Omit for the answered operator.", + "type": "string" + } + }, + "required": [ + "questionId", + "operator" + ], + "type": "object" + }, + "type": { + "const": "scale", + "type": "string" + } + }, + "required": [ + "type", + "label", + "min", + "max" + ], + "type": "object" + }, + { + "properties": { + "columns": { + "description": "Columns of the matrix — each column defines the options used for every row.", + "items": { + "properties": { + "label": { + "description": "Column label.", + "type": "string" + }, + "options": { + "description": "Options shown in each cell of this column. Every row uses the same column options.", + "items": { + "properties": { + "hasTextInput": { + "description": "Set true for an \"Other: ___\" option that lets the respondent type a free-text value.", + "type": "boolean" + }, + "label": { + "description": "Option text shown to the respondent.", + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "label", + "options" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "description": { + "description": "Optional helper text shown under the question label.", + "type": "string" + }, + "label": { + "description": "Question text shown to the respondent.", + "type": "string" + }, + "required": { + "description": "Whether an answer is required. Defaults to false.", + "type": "boolean" + }, + "rows": { + "description": "Rows of the matrix — usually items or criteria being evaluated.", + "items": { + "properties": { + "label": { + "description": "Row label — usually an item or criterion being evaluated.", + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "showIf": { + "description": "Only show this question if the condition on an earlier question is met.", + "properties": { + "operator": { + "description": "eq = referenced answer equals value; neq = not equal; contains = multi_choice selection includes value; answered = respondent gave any answer.", + "enum": [ + "eq", + "neq", + "contains", + "answered" + ], + "type": "string" + }, + "questionId": { + "description": "ID of the earlier question to check. IDs are assigned in order of appearance as q_0, q_1, q_2, ... across all sections. Must reference a question before the one where showIf is set.", + "type": "string" + }, + "value": { + "description": "Option ID (opt_0, opt_1, ...) for eq/neq/contains — numbered per-question in option order. Omit for the answered operator.", + "type": "string" + } + }, + "required": [ + "questionId", + "operator" + ], + "type": "object" + }, + "type": { + "const": "matrix", + "type": "string" + } + }, + "required": [ + "type", + "label", + "rows", + "columns" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Optional section heading.", + "type": "string" + } + }, + "required": [ + "questions" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "title": { + "description": "Survey title shown to respondents on the welcome screen.", + "type": "string" + } +} - removed
Input schema / properties / schema / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / schema / requiredAdded value: +[ + "title", + "sections" +]
4 tool updates
v0.1.0- First observed
close_survey - First observed
create_survey - First observed
get_results - First observed
list_surveys
TDQS
Scored across 5 tools
Each tool has a distinct, non-overlapping purpose: creating API keys, creating surveys, listing surveys, retrieving results, and closing surveys. No ambiguity.
All tool names follow a consistent verb_noun pattern in snake_case (create_key, create_survey, list_surveys, get_results, close_survey), making them predictable and easy to distinguish.
With 5 tools, the server is well-scoped for managing surveys. Each tool serves a necessary function without unnecessary bloat, fitting within the ideal range of 3-15 tools.
Covers core survey lifecycle (create, list, results, close) but lacks update and delete operations. While re-opening is possible via API, it's not exposed as a tool, creating a notable gap.
Maintenance
Related MCP Connectors
Create surveys, feedback and classification campaigns. Collect human answers and export results.
AI-native survey & form builder. Manage surveys, responses, analytics, and webhooks.
Agent-first meeting schedule polls for humans and agents. Create polls, vote, find times.
- AskLoopOAuthapp.askloop
Create and run surveys by chatting. Respondents just open a link — no AI, no account.
Related MCP Servers
- AlicenseBqualityDmaintenanceCollects user feedback with text and image support through an Electron app, allowing AI tools to gather and process user input with customizable prompts and multiple response options.19 npm2Apache 2.0
- AlicenseNot gradedqualityDmaintenanceForm builder and response collector for AI agents. Reads are free, writes require Veyra commit mode.3 npmMIT
- AlicenseAqualityBmaintenanceEnables AI agents to recruit real humans for evaluation tasks like surveys, A/B tests, and ratings on text, images, audio, and video, returning aggregated results directly into the conversation.137MIT
- AlicenseAqualityBmaintenanceInteractive feedback server for AI-assisted development with Web UI and desktop app support, enabling user feedback collection after AI tasks.2MIT