Usercall

co.usercallv0.4.0更新于 Oct 1, 2026

Give your AI agents the ability to ask real users why.

概览

AI 生成的概览

让 AI 智能体创建并运行真实的用户访谈研究,并返回主题与逐字引述。

功能
Usercall MCP 让助手创建访谈研究,可设置研究目标、目标访谈数量、语言、语音或文字模式,以及图片或 Figma 原型等可选视觉素材。它会返回研究 ID 和可分享给参与者的访谈链接,支持在分享前进行模拟访谈和访谈提纲审查,并以主题、洞察、风险和引述的形式报告研究状态与结果。Research Trigger 工具让智能体根据已观测到的分析事件定位产品中的用户,创建处于暂停状态的邀请触发器,需由人工激活。
适用场景
当智能体需要来自真实用户的定性反馈而非合成假设时使用,例如了解用户为何在引导流程中流失,或获取对设计方案的反馈。也适合已收集产品分析数据、希望针对已观测行为开展访谈的团队。
运行要求
托管方式:添加远程端点并用 OAuth 登录,无需 API 密钥。本地方式:需要 Node.js 18+,通过 stdio 运行 npm 包,并设置 USERCALL_API_KEY 环境变量(在 Usercall 开发者设置中创建);USERCALL_BASE_URL 为可选项。需要能访问 Usercall Agent API 的网络,且 Research Trigger 需在产品中安装 Usercall SDK。
安装前请注意
本地包需要 USERCALL_API_KEY 密钥,该密钥可访问账户的 Agent API。研究会消耗额度;额度不足时会返回供人工处理的 checkout_url,review_study 每次消耗 1 个额度。delete_study 与 delete_research_trigger 为永久删除。智能体无法激活触发器:触发器创建后处于暂停状态,须由人工审核并激活,编辑已激活的触发器会使其再次暂停。Webhook 投递会把匹配到的用户 ID、已知邮箱、用户特征、事件属性和个人访谈链接发送到第三方 URL;设置 webhook_secret 时请求会带有 x-usercall-signature HMAC 头。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Usercall,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "mcp": {
      "type": "http",
      "url": "https://mcp.usercall.co"
    }
  }
}

README

Usercall MCP - AI agents that run real user interviews

[npm] [License]

AI can build products. But it still doesn't talk to users.

Give your AI agents the ability to ask real users why.

Usercall MCP lets AI agents run user interviews via voice or text and return structured insights with themes and verbatim quotes.

Why this exists

AI agents can now build and ship products extremely quickly.

But most agents still rely on synthetic feedback or assumptions about users.

Usercall MCP lets agents gather real qualitative feedback directly from users.


Choose a connection

Recommended: hosted MCP (Claude, ChatGPT, Cursor, Grok Bot)

Add https://mcp.usercall.co as a remote MCP connector / custom connector.

  • OAuth sign-in (no API key, no npx)
  • Same tools as this package (studies + Research Triggers)
  • Docs: app.usercall.co/docs/mcp
  • Cursor Directory / Grok Bot: this repo ships .mcp.json so cursor.directory can install the hosted connector. Grok Bot cannot run the local npx package.

This package: local / API-key / machine-to-machine

Use @usercall/mcp over stdio when you want a Bearer API key (scripts, local clients, M2M).

  1. Sign in at app.usercall.co → Home → Developer → Create API key
  2. Run npx -y @usercall/mcp with USERCALL_API_KEY

Example workflow

Agent: "Why are users confused about onboarding?"
→ create_study→ share interview_link with users→ get_study_results

The returned interview_link can be shared with participants through email, Slack, Discord, or in-product prompts.

Example result:

json
{  "themes": [    {      "name": "Onboarding confusion",      "summary": "Users struggled to understand the second step.",      "quotes": [        "I wasn't sure what the app was asking me to do.",        "I didn't know I had to verify my email before continuing."      ]    },    {      "name": "Pricing confusion",      "summary": "Free plan limits were not clearly communicated.",      "quotes": ["I wasn't sure if the free plan included analytics."]    }  ]}

How it works

AI Agent

↓

Usercall MCP (hosted OAuth or this stdio package)

↓

Usercall Agent API

↓

Real user interviews

↓

Themes and verbatim quotes returned to the agent

With Research Triggers, the agent can also target users in your product:

Analytics MCP (PostHog, Mixpanel, …) finds a behavior

↓

Usercall MCP creates a study and a paused Research Trigger

↓

You activate it in Usercall

↓

The Usercall SDK invites matching users to an interview right after the behavior


Research Triggers

Analytics tells an agent what users do. Research Triggers let it ask them why.

User:  "Look at our PostHog data and find something worth investigating."
Agent (PostHog MCP):  users who test a study rarely launch one.
Agent (Usercall MCP):  list_trigger_events()                  → study_tested, study_launched, …  get_trigger_event_schema("study_tested")                                         → properties: source, interview_type                                           traits: plan ("free", "pro"), account_type  create_study(...)  or  list_studies()  create_research_trigger({    study_id, event_name: "study_tested",    traits: { plan: "free" }, sampling_percent: 25, max_invites_per_day: 10  })                                     → status: "paused", summary, activation_url
Agent: "I've prepared a Research Trigger. When: study_tested · Audience: plan = free ·        25% sampled · max 10 invites/day. It's paused. A human activates it here: <activation_url>"
  • The Usercall SDK has to be installed. If list_trigger_events returns nothing, call get_trigger_sdk_setup (with your analytics provider and event names) to get the snippet. Coding agents can install it for you.
  • Only events Usercall has actually received can be used. Filters are exact matches on event properties or user traits. get_trigger_event_schema shows which field is which.
  • Unsupported conditions are rejected, not silently dropped. These include event counts, sequences, absence ("did not do X"), time windows, and not-equals. get_trigger_capabilities returns the full list.

Local install (API key)

1. Get an API key

Sign in at app.usercall.co → Home → Developer → Create API key

2. Add to your MCP client

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

json
{  "mcpServers": {    "usercall": {      "command": "npx",      "args": ["-y", "@usercall/mcp"],      "env": {        "USERCALL_API_KEY": "your_key_here"      }    }  }}

Cursor (.cursor/mcp.json):

json
{  "mcpServers": {    "usercall": {      "command": "npx",      "args": ["-y", "@usercall/mcp"],      "env": {        "USERCALL_API_KEY": "your_key_here"      }    }  }}

For Claude, ChatGPT, or Cursor remote connectors, prefer https://mcp.usercall.co instead of this JSON config.

Restart your MCP client.

3. Ask your agent

Run user interviews to understand why users drop off during onboarding.
Context:- B2B SaaS product- 3-step signup flow
Goal:Identify confusion points and friction.
Target interviews: 5Language: koInterview mode: voice
Show participants this prototype during the interview:https://www.figma.com/proto/abcd1234/onboarding-flow

The agent will:

  1. create a study
  2. return an interview link
  3. collect responses
  4. return the summary (themes, insights, and risks)

Structured tool example

Equivalent create_study tool call:

create_studykey_research_goal: "Understand why users drop off during onboarding"business_context: "B2B SaaS signup flow"target_interviews: 5languages: ["en"]interview_mode: "voice"
study_media:  type: "prototype"  url: "https://www.figma.com/proto/abcd1234/onboarding-flow"  description: "New onboarding flow concept"

Tools

create_study

Create an interview study when you already know what happened and still need to learn why. Returns study_id and interview_link. Do not share the link yet. Call list_studies first and reuse a study that already asks this question. key_research_goal is required. business_context is optional. One active agent study per account. On 402, surface checkout_url to a human. This does not run the interview. Call simulate_interview next.

FieldTypeRequiredDefault
key_research_goalstring (5–2000)yes
business_contextstring (5–2000)no
additional_context_promptstringno
target_interviewsnumber (1–200)no1
languagesstring[]no
duration_minutesnumber (5–65)no12
interview_modevoice | text | voice_and_textnovoice
voice_genderfemale | maleno
enable_link_contextbooleanno
custom_link_variables{ key, label?, default_value? }[]no
metadataobjectno
study_mediaobjectno

One locale turns the language picker off; two or more turn it on. Research goal cannot be changed after create.

study_media (optional). Visual stimulus shown during all interview questions:

FieldTypeRequired
typeimage | prototypeyes
urlstring (URL)yes
descriptionstring (max 500 chars)no
  • image: Direct image URL (.png, .jpg, .gif, .webp)
  • prototype: Figma prototype URL (converted to interactive embed)
  • Media is only visible to web participants; phone callers won't see it

update_study

Edit an existing study's slots, interview mode, languages, voice, link context, guide text, questions, or media. Use this after review_study or a failed simulation names a guide change, or when the link is disabled and you are about to share. You cannot change key_research_goal. One locale turns the language picker off. Two or more turn it on. Query params on interview_link are ignored until enable_link_context is true. Call simulate_interview again before sharing.

FieldTypeRequired
study_iduuid stringyes
target_interviewsnumber (1–200)no
is_link_disabledbooleanno
ai_agent_intro_messagestringno
key_learning_goalsstringno
workflow_end_messagestringno
workflow_questions{ text, ... }[]no
interview_modevoice | text | voice_and_textno
languagesstring[]no
voice_genderfemale | maleno
enable_link_contextbooleanno
custom_link_variables{ key, label?, default_value? }[]no
study_mediaobject or nullno

Pass study_media: null to clear media. The study_media object follows the same schema as in create_study.

get_study_status

Check whether a study is running, analyzing, or complete. running and analyzing mean wait and call this again. Do not treat those payloads as findings. When status is complete, call get_study_results. This does not return themes.

FieldType
study_iduuid string

Status values: running · analyzing · complete

Response includes interview progress fields, including completed_interviews and target_interviews.

get_study_results

Read findings after get_study_status is complete. Prefer format=summary for themes, insights, and risks. Use format=full only when a verbatim transcript is required. Empty themes while the study is still running are not a finding.

FieldTypeRequired
study_iduuid stringyes
formatsummary | fullno

Summary/full responses include study progress fields and analysis output.

simulate_interview

Dry-run the interview after you create or edit a study, and before any real invite. Omit simulation_id to start. Pass that id to read the result. The start returns immediately with running. Cap is 5 simulations per account per UTC day. A simulation is not a completed interview and does not change completed_interviews. On fail, call update_study, then simulate again.

FieldTypeRequired
study_iduuid stringyes
simulation_iduuid stringno
persona{ name, prompt }no

Omit simulation_id to POST /api/v1/agent/studies/{studyId}/simulations. Pass simulation_id to GET that simulation. The tool does not poll.

review_study

Check the interview guide before sharing it. It reads the guide only. It does not read transcripts and it does not apply edits. It costs 1 credit. On 402, surface checkout_url to a human. Write suggested changes with update_study. Stop after one review unless the guide changed. This is not simulate_interview and it is not get_study_results.

FieldTypeRequired
study_iduuid stringyes

Sends study_id only. It does not send call_ids.

delete_study

Permanently delete a study when it asks the wrong question or you must free the one active agent study. This cannot be undone. To stop new interviews without deleting evidence, call update_study with is_link_disabled true. This does not delete a research trigger.

FieldTypeRequired
study_iduuid stringyes

Research Trigger tools

ToolPurpose
get_trigger_capabilitiesBefore designing a trigger. One event, exact property or trait, URL rule, page dwell. No counts, sequences, absence, time windows, or not-equals
get_trigger_sdk_setupInstall snippet when list_trigger_events is empty. No secret keys
list_trigger_eventsEvents Usercall has received in the last 30 days. Required before create_research_trigger
get_trigger_event_schemaObserved properties and traits for one event. Call after the event is listed
list_studiesList before creating. Reuse study_id and interview_link. trigger_eligible is false when there is no link
create_research_triggerPaused invite for an observed event. activation_url is for a human. Agents cannot activate
list_research_triggersStatus and activation_url. Recover a paused link. Empty after a human activates. Agents cannot activate
get_research_triggerOne trigger's status or paused activation_url. Not interview evidence
update_research_triggerEdit targeting, sampling, or copy. Never status: "active" (409). Editing an active trigger pauses it
delete_research_triggerPermanently delete a trigger. Pause instead when you only want to stop it
create_research_trigger
FieldTypeRequiredDefault
study_iduuid stringyes
event_namestring (from list_trigger_events)yes
propertiesobject of exact-match valuesno
traitsobject of exact-match valuesno
url{ match: equals | contains | starts_with, value }no
dwell_seconds1–600 (page-visit triggers only)no
sourcepage_visit | analytics_event | customno
sampling_percent1–100no100
cooldown_days0–365no30
max_invites_per_day1–100no100
intercept_titlestring (≤120), small label above the promptnodefault
intercept_bodystring (≤500), prompt textnodefault
delivery_methodintercept | webhooknointercept
webhook_urlpublic https URL (required for webhook)no
webhook_secretstring (16–200), HMAC key, write-onlyno
invite_link_params{ static?, from_traits?, from_properties? }no
namestring (≤100)nogenerated

For page-visit triggers, use source: "page_visit" and event_name: "$pageview", with url and optionally dwell_seconds.

Delivery.

  • intercept (default) shows the Usercall widget in your product, and the user takes a voice or text interview in the page. The modes come from the study; list_studies returns each study's interview_mode.
  • webhook POSTs each matched user to webhook_url, with their user ID, email if known, traits, event properties and a personal interview link. If webhook_secret is set, requests carry an x-usercall-signature HMAC header.
  • Only public https URLs are accepted, and the activation page shows the destination before a person activates the trigger.

Safety

  • Agents cannot activate triggers. Triggers are always created paused. Calling update_research_trigger with status: "active" returns HTTP 409 and the activation_url. A person has to open that link, review who will be invited, what they will see and the credit cost, and click Activate.
  • Changes to an active trigger need re-approval. Changing an active trigger's configuration pauses it again.
  • Secret keys are never returned. The ingestion secret key never comes back from any tool.

Example workflow

1. create_study   key_research_goal: "Why do users drop off during onboarding?"   business_context: "B2B SaaS, 3-step signup flow"   target_interviews: 5   languages: ["ko"]   interview_mode: "voice"
   → returns { study_id, interview_link }   (`business_context` is optional; `key_research_goal` alone still creates a study)
2. simulate_interview   study_id   → running, simulation_id   call again with simulation_id   → pass, fail, or error
3. review_study   study_id   → guide check only; write changes with update_study
4. Share interview_link with participants   (email, Slack, in-product prompt, etc.)
5. get_study_status   → "analyzing"
6. get_study_results   → summary: themes, insights, and risks   use format=full only for a quote

With visual stimulus

1. create_study   key_research_goal: "Get feedback on new dashboard design"   business_context: "Redesigning analytics dashboard for power users"   study_media:     type: "image"     url: "https://example.com/dashboard-mockup.png"     description: "New dashboard design concept"
   → returns { study_id, interview_link }
2. After simulate_interview passes, a human shares interview_link. Participants see the mockup during the interview.

For Figma prototypes, use type: "prototype" with a Figma proto URL.


Requirements

  • Node.js 18+
  • A valid Usercall API key (local / API-key path only)

Self-hosting / development

bash
pnpm installpnpm buildUSERCALL_API_KEY="your_key_here" pnpm start

Tests and smoke tests:

bash
pnpm test                                   # unit + MCP contract testsUSERCALL_API_KEY="your_key_here" pnpm smoke # creates a real studyUSERCALL_API_KEY="your_key_here" SMOKE_STUDY_ID="<uuid>" SMOKE_EVENT_NAME="<observed event>" pnpm smoke:triggers

Official MCP Registry

Usercall is listed on the Official MCP Registry as co.usercall/mcp.


Troubleshooting

ErrorFix
Missing USERCALL_API_KEYSet the env var before starting this stdio package
401 UnauthorizedInvalid or revoked API key
402 Insufficient creditsOpen the returned checkout_url, or add credits at app.usercall.co
500 on createVerify your key has access to Agent API v1
event_not_observedUsercall hasn't received the event. Add it to your SDK allowlist (get_trigger_sdk_setup(events=[...])), trigger it in your app, then retry
wrong_placementThe field is a trait, not a property (or the reverse). Use the suggested fix in the error
Trait filters never matchCall window.usercall.identify({ userId, traits }) when the user is known (see identify_snippet)
webhook_url_not_allowedUse a public https URL, without credentials; localhost and private IPs are rejected
409 activation_requiredExpected: agents can't activate. Share activation_url with the user
429 on simulate_interviewCap is 5 simulations per account per UTC day. Stop for the day
Active trigger never firesCheck the event is still arriving (list_trigger_events), and check the values match exactly (case and type)

Remote Claude / ChatGPT / Cursor connectors should use https://mcp.usercall.co (OAuth). This package is the API-key stdio path.


License

MIT

来源:README.md,提交 d302d22

工具

0
工具元数据尚未被收录。

版本历史

1
  1. v0.4.0最新Oct 1, 2026