UserTold.ai: Real user research for coding agents
UserTold runs AI-led interviews and usability tests on your website, while people are using your product.
What it can do
- Evidence.Get: Use when verifying one observation from evidence.list or study results. Returns the quote, observed behavior, interpretation, source interview and timestamp, page context, review state,
- Evidence.List: Use when searching interview evidence for user problems, needs, workarounds, or successful experiences. Returns paginated quotes, observations, and source references for review or group
- Evidence.Update: Use when reviewing an interview observation. Replaces or clears its annotation, dismisses it with a reason, or restores it with dismissed=false; returns the updated evidence. Changes
What data it sees
Do you need an account
No: the server works without sign-in
UserTold runs AI-led interviews and usability tests on your website, while people are using your product. It captures their voice, screen, and interaction events together, so you can see what happened and hear their explanation while the experience is still fresh.
Choose what you want to learn: why users abandon setup, what confuses them about pricing, how they complete a task, or what they need from your product. The AI interviewer asks follow-up questions based on their answers and the study’s goals.
With participant consent, UserTold records the conversation, screen activity on supported desktop browsers, and interactions such as navigation and clicks. Quotes stay connected to the relevant moments, helping you understand both what people said and what they did.
Review the findings, check the original evidence, and decide what to improve. Send selected findings to GitHub or Linear with their supporting sources, or connect your AI assistant through MCP to help plan research and turn user insights into product improvements.
Server tool list (24)
Raw names from tools/list. Only developers need these.
| evidence.get | Use when verifying one observation from evidence.list or study results. Returns the quote, observed behavior, interpretation, source interview and timestamp, page context, review state, and linked findings. Use interviews.get_context to inspect the surrounding moment. |
| evidence.list | Use when searching interview evidence for user problems, needs, workarounds, or successful experiences. Returns paginated quotes, observations, and source references for review or grouping into findings. Defaults to product_under_test; pass target_surface="all" to include other areas. |
| evidence.update | Use when reviewing an interview observation. Replaces or clears its annotation, dismisses it with a reason, or restores it with dismissed=false; returns the updated evidence. Changes private UserTold review state and recalculates linked findings when dismissal changes. |
| feedback.submit | Use when the user authorizes sending a bug report or suggestion about UserTold to its team. Queues a report and notification that cannot be recalled. Not for collecting feedback about the user's product. Exclude credentials, personal data, and raw private content. |
| findings.create_from_evidence | Use after reviewing related interview observations that describe one actionable product problem. Creates a private backlog finding, links the selected evidence, and calculates priority. Requires source review before marking it ready; does not create a GitHub or Linear issue. |
| findings.get_evidence | Use before editing a product finding, planning follow-up research, defining acceptance criteria, or sending it to GitHub or Linear. Returns linked evidence, interview timestamps, uncertainty, related findings, possible recurrence, and a decision summary. Check truncation flags before drawing conclusions. |
| findings.list | Use when reviewing the product problems and improvement opportunities collected from interviews. Returns paginated findings with priority and supporting interview/evidence counts. Closed findings are hidden by default; use findings.get_evidence to inspect the sources before deciding what to change. |
| findings.send | Use when the user authorizes sending a reviewed finding with linked evidence to GitHub or Linear. Creates an external issue and returns its link, or returns the previously recorded issue. Omit provider to use the configured destination; pass "github" or "linear" only as an explicit override. The issue cannot be recalled by this tool. |
| findings.update | Use when editing a product finding or its evidence links. Overwrites supplied fields and can attach or detach evidence. Set status="ready" only after checking sources, grouping, product relevance, and uncertainty. Changes UserTold only; findings.send is the separate GitHub or Linear handoff. |
| interviews.get_artifacts | Use when retrieving a complete interview transcript, audio, screen recording, or activity events. Returns availability and resource links, not file contents. Download transcript_text once for the full exact transcript. Links expire after five minutes; request fresh links if needed. Original recordings, transcripts, and source events remain unchanged. Downloads contain original captured content. |
| interviews.get_context | Use when checking what a participant said or did before and after a quote or confusing interaction. Returns a limited transcript window and sanitized navigation/click events around timestamp_ms. Check truncation flags; use interviews.get_artifacts for the complete transcript or recordings. |
| interviews.list | Use when listing recorded participant interviews to review, download, or check for processing failures. A projectRef is sufficient; no study lookup is needed. Returns paginated summaries and interviewRef values for context, artifact, and processing tools. Can filter by study or interview status; does not return participant identity fields. |
| interviews.processing_status | Use when interview results are missing or still processing, or before considering a retry. Returns saved processing and evidence extraction status with result counts. Does not start processing; use interviews.retry_processing only for an eligible failure or stalled attempt. |
| interviews.retry_processing | Use after interviews.processing_status when processing has durably failed or made no progress for 24 hours. Starts a new attempt, replacing generated evidence while preserving manual evidence. If the outcome is uncertain, check status and do not retry automatically. |
| projects.create | Use when setting up UserTold for a new product. Creates a private project and starter interview study in an organization from usertold://organizations; returns projectRef for later calls. Does not configure billing, members, or GitHub/Linear connections. |
| projects.get_widget_setup | Use when installing interviews on a website or checking what setup is missing. Returns the project widget snippet, saved installation verification, and interview readiness. Install once across the website; page and language rules select the active interview study. Does not run a new verification. |
| projects.verify_widget_installation | Use after installing the UserTold widget on a public HTTPS page. Checks the loader, project key, and browser security policies; saves a passing verification and preserves previous success on warnings or failures. Does not execute the app or verify microphone and screen permissions in a browser. |
| setup.recommend | Use when planning customer discovery, user interviews, usability tests, concept testing, or research into onboarding, churn, pricing, and feature feedback. Pass the user's goal in their own words. Returns guidance grounded in UserTold documentation; saves requests and responses for service improvement without changing projects or studies. For existing research results or an exact operation, use the relevant tool directly. |
| studies.create | Use when saving a validated interview or usability test script as a draft study. Configures invitations, page placement, and websites; a direct-link invitation provisions a revocable recruitment link, retrieved with studies.get. Does not activate collection. Get the install-once snippet from projects.get_widget_setup. |
| studies.get | Use when inspecting an interview study before editing or sharing it. Returns its script, goals, invitation, page and language placement, websites, and existing recruitment link. If scriptOmitted=true, retrieve the full script through the dashboard or CLI. |
| studies.get_results | Use when reviewing what a user interview study found. Returns existing results with interview counts, supporting quotes, source references, related findings, and uncertainty. Follow continuation offsets for omitted records; use evidence.get or interviews.get_context for individual moments. Does not generate a new synthesis. |
| studies.list | Use when finding a configured interview study or usability test by title, research topic, or status. For recorded participant interviews, use interviews.list instead. Returns paginated summaries, newest first, and studyRef values for studies.get or studies.get_results. Full scripts and page placement are available through studies.get. |
| studies.update | Use when changing interview questions, invitations, page placement, or collection status on an existing study. Overwrites supplied settings and can publish or revoke recruitment links. status="active" starts collection; "paused" or "closed" stops new interviews without interrupting one in progress. Supply at least one change; validate revised scripts first. Uses the existing project widget; no per-study install is needed. |
| studies.validate_script | Use before saving a new or revised interview flow with studies.create or studies.update. Validates the supplied StudyScriptV2 and returns errors or a summary of steps, goals, and modes. Does not save or activate a study; no project is required. |