Connect to Claude
userken is an MCP server as well as a dashboard. Connect it once and Claude can browse your audiences, run surveys and hold focus groups in the middle of a conversation, against the same data and the same credit balance as the web app.
The connector URL is https://userken.com/mcp.
claude.ai and Claude Desktop
claude.ai and Claude Desktop both take a custom connector. The steps are the same in either one.
- Open Settings, then Connectors, then Add custom connector.
- Paste the URL
https://userken.com/mcpand add it. - Claude opens userken to ask for access. If you are not signed in you get the usual magic link login first, and land back on the same page afterwards.
- The consent screen names the application asking, your workspace and your role in it, and says plainly that the connector will run tools as you and spend your workspace's credits. Approve it.
- The userken tools appear in the tool list. Ask for something.
You stay connected until you disconnect. To end it, open /app/settings#connected and remove the entry under Connected apps. The connector stops working immediately.
You never handle a token for this route. Claude registers itself with userken, and the sign-in happens in your browser on userken's own pages, so no credential passes through the chat.
Claude Code and other clients
Claude Code and other MCP clients that do not do the connector sign-in use a personal API key instead. Create one at /app/settings under API keys. The key is shown once, at creation, and only its hash is stored, so copy it then. Keys look like uk_ followed by 32 characters.
In Claude Code:
claude mcp add --transport http userken \ https://userken.com/mcp \ --header "Authorization: Bearer uk_your_key_here"
In any other client that takes a remote MCP server with headers:
{
"mcpServers": {
"userken": {
"url": "https://userken.com/mcp",
"headers": {
"Authorization": "Bearer uk_your_key_here"
}
}
}
}A key carries your identity, so audiences, surveys and focus groups created through it belong to you and your workspace, exactly as if you had made them in the dashboard. Revoke a key from the same settings page; revocation takes effect at once. Personal API keys are part of the Pro plan and above.
Call the whoami tool. It returns the email address the request is authenticated as, which is the quickest way to tell a working key from a stale one.
The tool list
What you can do from Claude. Everything the dashboard does. Build an audience from filters or from a plain English description, preview it, build its personas, refresh, rename or delete it, and compare it with another. Run a survey of your own questions or one of the templates, watch the run, drill into an answer with a follow-up, re-theme the open answers and export the results. Hold a focus group: draft a discussion guide, open the room, ask it questions, put one to a single participant, summarise it, close it and export the transcript. Read your data sources, uploads and the published surveys behind the accuracy work. Check what a job will cost, what your workspace has left and where the credits went. Rows you create in Claude are the same rows the dashboard shows, and the same credits pay for both.
This list is generated from the running server when the page is rendered, so it is what the server actually exposes right now, not a copy that drifted. Tools that write take your identity from the connector or the API key.
Audiences and personas
| Tool | What it does |
|---|---|
list_audiences | List audiences: built-in ones (every app and category in the catalogue, as pub:<slug> / cat:<key>) plus saved custom audiences (aud:<id>). |
preview_audience | Fast, LLM-free summary of the reviews a filter selects: review_count, rating_histogram, app_breakdown, platform_breakdown, date_range, top_themes and 10 sample reviews, plus... |
suggest_audience | Turn a plain-English description ("Android users of financial news apps who complain about login") into audience filters using the live catalogue, preview the result, and relax... |
create_audience | Save a custom audience (status draft). |
build_audience | Start building personas for a saved audience in the background: freeze the member set, cluster review embeddings (k chosen from the audience size, 3 to 8, unless given), name... |
get_audience | Resolve an audience ref to its personas with weights (sum to 1): pub:<slug> existing per-publication personas (weights from rating bands) cat:<key> union of that category's... |
compare_audiences | Audience discovery: how much do two audiences overlap and where not? Returns overlap_score, centroid_similarity, a persona-to-persona similarity matrix, shared_segments... |
find_lookalike_audiences | Rank every other audience you can see (built-in, plus your workspace's custom ones) by similarity to `ref`, using review-embedding centroids. |
get_all_personas | Get all persona definitions with their profiles, needs, pain points, and voice descriptions. |
get_persona | Get full details for a specific persona including representative quotes. |
get_persona_quotes | Get real review quotes that represent how this persona talks. |
get_reviews_for_persona | Get reviews that belong to this persona cluster. |
get_publication_personas | Get all persona definitions for a specific publication. |
get_all_publication_personas | Get persona statistics for all publications. |
get_reviews_for_publication_persona | Get reviews that match a specific publication persona. |
update_audience | Edit a saved custom audience. |
refresh_audience | Take a fresh snapshot of the reviews a custom audience selects and rebuild its personas. |
delete_audience | Delete a saved custom audience and its personas. |
audience_build_status | Poll a custom audience's persona build. |
available_themes | The theme keys an audience filter can use, the same chips the filter builder offers: the generic set plus the themes of the categories you name. |
Surveys
| Tool | What it does |
|---|---|
ask_audience | Ask a synthetic audience one survey question and get a response DISTRIBUTION (not a single averaged answer), a per-persona breakdown, bootstrap 90% intervals, and first-person... |
run_concept_test | Concept test template: appeal (5-point), usage intent, open concerns (themed), and willingness-to-pay bands, run against a synthetic audience. |
run_ab_test | A/B/n test template: forced choice between variants, reason (themed), and a per-variant appeal rating. |
run_name_test | Name test template: forced choice, fit rating per name, open reactions. |
run_message_test | Message test template: clarity / relevance / motivation ratings for each message plus a forced choice. |
run_pricing_test | Pricing test template: Van Westendorp's four price questions (parsed to numbers, crossover points OPP / IPP / PMC / PME in results.analysis) plus a Gabor-Granger... |
get_survey_run | Fetch a survey run (status, progress, per-question results, cost) by id. |
suggest_survey_questions | Suggest survey questions for a research goal, grounded in the audience: the prompt carries its personas, top review themes and 10 to 15 real reviews closest to the goal, so... |
suggest_survey_followups | Propose 2 to 3 drill-down follow-up questions for one answered question in a survey run, based on its distribution, per-segment split and verbatims. |
run_survey | Run a survey of your own questions against an audience, the way the survey wizard does. |
list_surveys | Surveys saved by you or your workspace, newest first. |
get_survey | One saved survey with its full question list and its runs. |
list_survey_runs | Every run of one survey, newest first, with status, progress and cost. |
run_follow_up | Drill into one answered question: append a follow-up to the survey and ask only that question, with each persona seeing what they said before. |
retheme_open_question | Theme an open question's answers again from the verbatims already stored on the run. |
export_survey_run | Export a finished run: the survey, the run, and every distribution, segment breakdown and verbatim. |
review_concept | Rate a concept as a survey stimulus before spending credits testing it: is it specific, is it relevant to these people, how would you rewrite it. |
Focus groups
| Tool | What it does |
|---|---|
start_focus_group | Start a moderated synthetic focus group. |
focus_group_say | Post a moderator message to a running focus group. |
focus_group_summary | Summarise a focus group session: key findings, agreements, disagreements, quotes, recommendations. |
get_focus_group_transcript | Full transcript (session, participants, every message) for a focus group in your workspace. |
get_focus_group_prompt | Copy-paste focus group system prompt for an audience (personas with weights, grounding instructions using these MCP tools). |
list_focus_groups | Focus group sessions run by you or your workspace, newest first. |
get_focus_group | One focus group session: participants, status, guide, summary and the full transcript so far. |
focus_group_direct_question | Ask one participant directly. |
close_focus_group | Close a focus group room. |
export_focus_group | The markdown transcript of a session: the room, every turn with its grounding count, and the summary when one exists. |
draft_focus_group_guide | Draft a discussion guide for a focus group: a title and three to six prompts (opening, probe, closing), grounded in real reviews about the topic. |
Catalogue
| Tool | What it does |
|---|---|
list_categories | List the app categories indexed by userken. |
list_apps_in_category | List the apps indexed within one category (e.g. all news apps, all browser apps). |
get_saved_apps | List all apps with saved reviews in the database. |
search_store_apps | Search the App Store and Google Play for an app by name, or resolve a pasted store URL. |
add_app | Add an app to the catalogue and queue its onboarding (scrape both stores, embed, tag themes, build personas). |
get_app_onboarding_status | Onboarding progress for an app added with add_app(): the app row, the latest job (status, step-by-step progress, error) and live counts of reviews, embeddings, theme tags and... |
create_category | Create an app category (e.g. key "fitness", display name "Fitness"). No-op if it already exists. Categories get a landing page at /<key>, generic themes immediately, and a... |
generate_theme_taxonomy | Ask the LLM (smart tier, one call) for 8-14 category-specific themes from a stratified sample of the category's reviews, validate every theme's regexes against the sample, and... |
list_category_themes | The theme taxonomy in force for a category: generic themes (shared by every category) plus its category-specific ones, each with key, label, regex patterns and, where... |
list_competitors | List available competitor publications for review scraping. |
Sources and data
| Tool | What it does |
|---|---|
list_sources | List the data sources feeding the review corpus. |
run_source | Fetch new rows from one public data source and add them to the corpus. |
get_source_runs | Recent data-source run history, newest first. |
scrape_competitor_reviews | Scrape reviews for a competitor app from Google Play and Apple App Store. |
save_competitor_reviews | Scrape and SAVE competitor reviews to the database for future analysis. |
trigger_sync | Manually trigger a sync with Appfigures to fetch new reviews. |
get_sync_status | Get the status of the last sync operation. |
list_published_surveys | List the published surveys userken holds: publisher, report, year, country, sample size, population, question and result counts, and whether the survey is used in the accuracy... |
get_published_survey | One published survey with its questions, options and toplines. |
search_survey_questions | Find questions across every published survey by wording, so a synthetic panel can be asked the same question a real survey asked. |
list_uploads | CSV uploads owned by you or shared with your workspace, newest first. |
Reviews and analysis
| Tool | What it does |
|---|---|
search_reviews | Search reviews with flexible filtering. |
search_app_reviews | Search reviews for a specific app (reuters, bloomberg, nytimes, etc.) |
semantic_search_reviews | Semantic / vector search over reviews using pgvector + Ollama embeddings. |
find_similar_reviews | Find reviews similar to the given text using keyword matching. |
query_context | Build a rich, ground-truth context blob for any free-text topic before answering or running a focus group. |
validate_feature_idea | Estimate user reception of a proposed feature against the existing review corpus. |
get_industry_topics | Cross-publication topic clusters discovered across every news app indexed by userken, the themes that span the category. |
get_industry_topic | Single industry topic by slug, with sample quotes and publication distribution. |
get_theme_summary | Get statistics about a theme - how many reviews mention it, sentiment breakdown, rating distribution. |
get_stats | Get review statistics - total count, rating distribution, date range, top themes. |
compare_publications | Compare multiple news publications' app reviews. |
Credits and accuracy
| Tool | What it does |
|---|---|
get_balance | Your workspace's credit balance for this billing period. |
estimate_cost | What a job would cost in credits, before you run it. |
list_credit_ledger | Recent credit movements for your workspace, newest first: what was charged or refunded, why, and against which run, session or audience. |
get_accuracy_report | userken's published accuracy: how close the synthetic panel's answers are to the real held-out data, against naive and ungrounded baselines. |
Account
| Tool | What it does |
|---|---|
whoami | Who the MCP client is authenticated as. |
get_workspace | The workspace this connection belongs to: its name, plan and credit allowance, and, for an admin, who is in it. |
list_api_keys | Your own MCP API keys. |
Things to ask
Things worth asking once you are connected:
- Which audiences do I have, and how big is each one?
- Ask the Reuters audience whether they would pay two dollars more for an ad free tier, and show me the split by persona.
- Run a concept test for this feature description against the news category, then suggest three follow-up questions.
- Start a focus group with four personas from my audience and open with a question about onboarding.
- Build me an audience of Android users of financial news apps who complain about login, over the last twelve months.
Tools that call a model cost the same credits as the dashboard does. If the workspace runs out, the tool returns an insufficient credits error rather than a partial result.
Endpoint details
Most people never need this section. It is here for anyone writing a client, running userken themselves, or debugging a connection.
The MCP endpoint requires a bearer token. A call without one is answered with a 401 and a challenge pointing at the protected resource metadata, which is how a client discovers where to sign in.
| Endpoint | What it is for |
|---|---|
GET /.well-known/oauth-authorization-server | Authorization server metadata. |
GET /.well-known/oauth-protected-resource/mcp | Protected resource metadata for the MCP endpoint. |
POST /register | Dynamic client registration. Clients register themselves. |
GET /authorize | Authorization request. PKCE with S256 is required. One scope, mcp. |
GET/POST /oauth/consent | The sign-in and approval screen a person sees. |
POST /token | Token exchange: authorization_code and refresh_token grants. |
POST /revoke | Revoke a token. |
Token lifetimes
| Token | Prefix | Life |
|---|---|---|
| Authorization code | ukc_ | 10 minutes, single use |
| Access token | uko_ | 1 hour |
| Refresh token | ukr_ | 30 days, rotated on every use |
| Personal API key | uk_ | Until you revoke it |
Only hashes of these are stored. If you run your own instance, see Self-hosting and operations for the two environment variables this depends on.