Usercall

co.usercall由 usercall.co 發布官方發布者v0.4.0更新於 Oct 27, 2026

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

已驗證Streamable HTTP可網頁執行效率與工作流資料與分析

概覽

AI 產生的概覽

Usercall 讓助理針對真實使用者建立 AI 主持的語音或文字訪談研究,並回傳主題、洞察與逐字引述。

可以做什麼
  • 建立、更新與刪除訪談研究,包括訪談大綱問題、語言、語音模式,以及展示給參與者的圖片或 Figma 原型
  • 查看研究進度,並以主題、洞察、風險與引述的形式讀取結果,可選擇附上逐字稿
  • 以模擬人設試跑訪談大綱,並在真實使用者看到之前取得附有修改建議的審閱
  • 列出研究,並檢視產品事件、事件欄位結構以及支援哪些觸發條件
  • 建立、列出、更新與刪除處於暫停狀態的研究觸發器,在產品事件後邀請符合條件的使用者,支援頁內攔截或 webhook 投遞
適用情境
適合想了解真實使用者為何流失、為何在引導流程中放棄或為何操作失敗的助理,而不是依賴合成回饋。也適合想讓代理依分析結果準備產品內研究觸發器、再由人工核准的團隊。
執行需求
可使用具 OAuth 登入的遠端託管端點,或在本地以 stdio 執行 npm 套件,需要 Node.js 18+ 以及來自 Usercall 開發者設定的 USERCALL_API_KEY。可選的 USERCALL_BASE_URL 可覆寫 Agent API 基礎位址。需要具額度的 Usercall 帳戶;研究會消耗額度,HTTP 402 回應會回傳結帳連結。
安裝前請注意
研究與觸發器會寫入資料:刪除研究會永久移除錄音,刪除觸發器無法復原。審閱消耗 1 個額度,研究也會消耗額度,操作可能產生付費。觸發器一律以暫停狀態建立,代理無法啟用,必須由人工開啟啟用連結。webhook 投遞會把符合條件使用者的 ID、電子郵件、特徵與事件屬性傳送到外部 https 位址,webhook_secret 為唯寫。本地方式需要保存 USERCALL_API_KEY。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Usercall,將其新增到工作區。
  2. 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/co.usercall%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。

{
  "mcpServers": {
    "usercall": {
      "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 runs AI-moderated voice or text interviews with real users. Use it to learn why users churn, where onboarding drops off, or why an action failed, and get themes, insights, 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.

ChatGPT plugin package

Root plugin.json, mcp.json, and skills/ are the ChatGPT submission package (version in plugin.json, not package.json). Validate it and write the ZIP with:

bash
pnpm plugin:check

The ZIP is dist/usercall-chatgpt-plugin-<version>.zip. Do not upload it unless someone asks to submit.

Install in Cursor

Community. Already listed at cursor.directory/plugins/usercall.

Official Marketplace. Once the listing is live, install from the Cursor Marketplace. Submit the repo at cursor.com/marketplace/publish.

Manual. Add the hosted MCP. OAuth sign-in, no API key.

json
{  "mcpServers": {    "usercall": {      "url": "https://mcp.usercall.co"    }  }}

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 is an https://app.usercall.co/interview/ URL. Share it 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 AI-moderated interview study to learn why users churn, drop off in onboarding, fail an action, or where a product assumption is wrong. Returns HTTP 201 with study_id and interview_link for a voice, text, or voice-and-text interview. interview_link is an https://app.usercall.co/interview/ URL. key_research_goal is required and cannot be changed later. business_context is optional. Defaults: target_interviews 1, duration_minutes 12, interview_mode voice. One active agent study per account. Does not run the interview or invite a participant. HTTP 402 includes checkout_url.

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

Update an interview study: slots, guide questions, intro, languages, voice, or an image or Figma prototype shown to participants. Returns the updated study. key_research_goal cannot be changed. is_link_disabled true stops new interviews and keeps recordings. One locale hides the language picker; two or more show it. Query parameters on interview_link are ignored until enable_link_context is true. study_media null clears media. API errors include http_status. Does not dry-run the guide or invite a participant.

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 interviews about churn, onboarding, or a failed action have started. Returns completed_interviews, target_interviews, interview_link, and next_step. interview_link is an https://app.usercall.co/interview/ URL. Zero interviews is status: "not_started". running means an interview is underway. running and analyzing include no findings, themes, or quotes. next_step is update_study while a ready review still has unapplied edits. After the guide matches those edits, or when there are no edits, share is correct if a terminal simulation or review exists and completed interviews are still 0. Does not change the study.

FieldType
study_iduuid string

Status values: not_started · running · analyzing · complete

get_study_results

Get interview findings after real users have talked: themes, insights, risks, and verbatim quotes. format omitted or summary returns themes, insights, and risks. format=full also returns transcripts. Empty themes mean analysis is not ready. Does not create interviews or edit the guide.

FieldTypeRequired
study_iduuid stringyes
formatsummary | fullno

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

simulate_interview

Dry-run an interview guide before a real participant joins, including a question about churn, onboarding, or a failed action. Omit simulation_id to start; returns immediately with status: "running" and a simulation_id. Pass simulation_id to read that run. Omit persona and the server writes one from the research question, including that the person did not do the thing the study is about. A sent persona is used as-is: name is 1–80 characters and prompt is 1–4000. Result status is pass, fail, or error. A finished transcript is [{ "role": "agent" | "user", "content": "..." }]. Do not expect call_id, timezone, or timestamps. Max 5 simulations per account per UTC day. HTTP 429 means the daily cap is reached. A dry-run does not change completed_interviews and does not invite a participant.

FieldTypeRequired
study_iduuid stringyes
simulation_iduuid stringno
persona{ name, prompt }no
persona.namestring (1–80)with persona
persona.promptstring (1–4000)with persona

Omit simulation_id to POST /api/v1/agent/studies/{studyId}/simulations. Pass simulation_id to GET that simulation. The tool does not poll. Omit persona on start and the server writes one. A sent persona is forwarded unchanged.

review_study

Review an interview guide before real users see the questions, including a question about churn, onboarding, or a failed action. The body keeps findings and adds suggested_edits. suggested_edits is an update_study body, or null when there is nothing to change. Send suggested_edits to update_study as-is. Nothing is applied for you. Costs 1 credit. Request is study_id only; call_ids are not accepted. Works when the in-app review control is hidden. HTTP 402 includes checkout_url. Reads the guide only: no transcripts.

FieldTypeRequired
study_iduuid stringyes

Sends study_id only. It does not send call_ids. A non-null suggested_edits value is the update_study body, unchanged.

delete_study

Permanently delete an interview study, its recordings, and unused reserved credits. Cannot be undone. Does not delete in-product research triggers.

FieldTypeRequired
study_iduuid stringyes

Research Trigger tools

ToolPurpose
get_trigger_capabilitiesWhich in-product trigger conditions work. One event, exact property or trait, URL rule, page dwell. No counts, sequences, absence, time windows, or not-equals
get_trigger_sdk_setupSnippet for product events (failed action, onboarding, churn). install_snippet, identify_snippet, allowlist_update_snippet. No secret keys
list_trigger_eventsProduct event names from the last 30 days. A trigger accepts only an observed name
get_trigger_event_schemaFields on one product event, with types and sample values. Exact, case-sensitive, type-sensitive
list_studiesExisting interview studies: study_id, interview_link (https://app.usercall.co/interview/...), interview_mode, trigger_eligible
create_research_triggerPaused invite after a product moment (failed action, churn, onboarding). Returns activation_url
list_research_triggersIn-product triggers with status and activation_url
get_research_triggerOne trigger: who it invites, activation_url, invite and interview counts. No themes or quotes
update_research_triggerWho gets invited. status: "active" is rejected (409). Editing an active trigger pauses it
delete_research_triggerPermanently delete a trigger. Completed interviews stay on the study
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"
   → HTTP 201 { study_id, interview_link: "https://app.usercall.co/interview/..." }   (`business_context` is optional; `key_research_goal` alone still creates a study)
2. simulate_interview   study_id   → status "running", simulation_id   call again with simulation_id   → pass, fail, or error   finished transcript: [{ "role": "agent" | "user", "content": "..." }]   omit persona unless you want a specific one (name 1–80, prompt 1–4000)
3. review_study   study_id   → findings, plus suggested_edits (an update_study body, or null)   send suggested_edits to update_study as-is; nothing is applied for you
4. Share interview_link with participants   (email, Slack, in-product prompt, etc.)   share is correct once a terminal simulation or review exists,   completed interviews are still 0, and any suggested edits are already on the guide
5. get_study_status   → "not_started" when completed_interviews is 0   → "running" while an interview is underway   → next_step "update_study" while a ready review still has unapplied edits
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,提交 1c6915e

工具

0
該伺服器需要登入,因此 SourceWeft 無法在沒有帳號的情況下讀取其工具,也未收錄。已連接帳號所能看到的內容可能因帳號及其權限而異。

版本歷史

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

評分

已滿足適用檢查項的 85%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分