Usercall MCP server for Agent API v1 - enables creation and management of user interview studies
Usercall MCP demonstrates solid definition quality with consistent verb-noun naming, complete parameter schemas using Zod, and comprehensive descriptions. All 5 tools are explicitly registered with clear intent. Tool names are action-oriented (create_study, update_study, get_study_status, get_study_results, delete_study) and follow the verb_noun pattern. Descriptions range 195-340 chars, which is within the 10-1024 optimal range. Schemas are complete with type constraints, enums, and range limits. However, there are gaps in output documentation, the return types are not formally documented for agents to understand expected response structure. Error handling for the 402 insufficient-credits case is explicit (special UsercallApiError handling with checkout_url), which is good, but generic API errors lack actionable recovery guidance. Parameter descriptions could be more LLM-optimized with explicit constraint statements (e.g., 'must be 1-200' rather than relying on schema minLength/maxLength). The _note appending pattern (create_study, update_study) is a reasonable attempt at guidance but is informal and not a substitute for formal output schema documentation.
Creates a user interview study and returns study_id plus an interview_link to share with participants. One active agent study is allowed per personal account. Optional interview_mode: voice (default), text, or voice_and_text. Optionally include study_media to show an image or Figma prototype during the interview. On insufficient credits the API returns 402 with checkout_url.
Permanently deletes a study and all associated data. Releases unused reserved credits.
Returns analysis results. When presenting results, always quote specific participant responses verbatim using the quotes field in each theme.
Returns the current lifecycle status of a study: running, analyzing, or complete. Includes progress fields such as completed_interviews and target_interviews.
Updates an existing study. Use this to change interview slots, interview mode, guide copy, questions, or media. Research goal cannot be changed. Pass study_media: null to clear media.
Output schemas not formally documented. Tools return JSON via result() helper, but agents cannot predict response structure (fields, types, nesting). Forces agents to parse responses blindly or call tools multiple times to understand the output. The append_note() pattern adds informal guidance but is not machine-parseable.
Generic error handling for non-402 API failures. The code catches UsercallApiError for 402 (insufficient_credits) and provides a checkout_url, which is excellent. However, other HTTP errors (4xx, 5xx) are thrown without transformation, meaning the agent receives a raw UsercallApiError with only status and payload, no actionable recovery guidance (e.g., 'User not found. Try creating a new study first.' or 'Server error. Retry in 30 seconds.').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 73 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Parameter descriptions in Zod schema are minimal. For example, 'business_context' has description 'Business context for the study' (26 chars), does not explain what makes a good context, how it differs from key_research_goal, or constraints. Descriptions should be 50-200 chars with LLM-facing actionable guidance.
Missing output documentation for paginated or list results. get_study_status description says 'Includes progress fields such as completed_interviews and target_interviews' but does not formally document the response schema (field names, types, nesting). get_study_results mentions 'analysis results' and 'quotes field in each theme' but the exact structure is not declared.
Destructive tool (delete_study) lacks confirmation or dry-run pattern. The delete_study tool has no confirmation step or dry-run capability. Agents can invoke it directly, and any implementation mistakes (e.g., wrong study_id) result in permanent data loss with no recourse. Consider adding an optional 'confirm' parameter or separate 'preview_delete' tool.