Search 1M real UI flows and 3.3M screens from shipped apps, sites, emails and games.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <API key> from refcat.app/dashboard (free plan includes one key)
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Metadata for one app in the catalog. Accepts an appId or a slug like 'spotify'. get_app_flows lists its flows.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http refcat https://mcp.refcat.app/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer <API key> from refcat.app/dashboard (free plan includes one key)Metadata for one app in the catalog. Accepts an appId or a slug like 'spotify'. get_app_flows lists its flows.
| Argument | Type | Description |
|---|---|---|
| appId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string"
}
}
}The flows of one app (onboarding, checkout, settings…) in order, with capture date. Accepts an appId or slug. Big apps have hundreds of flows: page with offset. Then get_flow for the steps of one.
| Argument | Type | Description |
|---|---|---|
| appId* | string | |
| limit | integer | |
| offset | integer | Skip this many results (pagination) |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string"
},
"limit": {
"type": "integer",
"default": 40,
"maximum": 100,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 200,
"minimum": 0,
"description": "Skip this many results (pagination)"
}
}
}The original HTML of one email from search_emails (tables, font fallbacks, dark mode included). Adapt it to the user's brand instead of writing email HTML from scratch. Pro, or this week's free flows.
| Argument | Type | Description |
|---|---|---|
| emailId* | string | emailId from search_emails |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"emailId"
],
"properties": {
"emailId": {
"type": "string",
"description": "emailId from search_emails"
}
}
}One flow with every step in order. Compact by default: each step has screenDocId (for get_screen), pageType, patterns, components and keyTexts. include 'elements' adds OCR/hotspot boxes per step (large: tens of thousands of tokens for a long flow); 'connections' adds step links.
| Argument | Type | Description |
|---|---|---|
| flowId* | string | |
| include | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flowId"
],
"properties": {
"flowId": {
"type": "string"
},
"include": {
"type": "array",
"items": {
"enum": [
"elements",
"connections"
],
"type": "string"
},
"default": []
}
}
}Earlier captures of the same flow (how it changed over time): capture date, screen count and up to 3 preview images each.
| Argument | Type | Description |
|---|---|---|
| flowId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flowId"
],
"properties": {
"flowId": {
"type": "string"
}
}
}One project with its screens, positions and connections.
| Argument | Type | Description |
|---|---|---|
| projectId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"projectId"
],
"properties": {
"projectId": {
"type": "string"
}
}
}One catalog screen with its image and structure. Returns an image block (look at it for color, typography and spacing) and JSON with app, flow, platform, pageType, screenPatterns, uiComponents, keyTexts, dimensions, capturedAt and `elements` (OCR text and hotspots with normalized bbox [x0,y0,x1,y1], sorted top to bottom: use them to reproduce hierarchy, order and positions). image 'small' is ~800px wide (~1-2k tokens), 'full' 1800px. Cite the app, flow and capture date when you build from it.
| Argument | Type | Description |
|---|---|---|
| image | string | |
| screenDocId* | string | |
| includeElements | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"screenDocId"
],
"properties": {
"image": {
"enum": [
"none",
"small",
"full"
],
"type": "string",
"default": "small"
},
"screenDocId": {
"type": "string"
},
"includeElements": {
"type": "boolean",
"default": true
}
}
}Apps in the catalog, optionally filtered by category key (from list_categories) or platform. Platform `email` lists brands with email galleries.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| offset | integer | Skip this many results (pagination) |
| category | string | |
| platform | string | ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 24,
"maximum": 48,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 200,
"minimum": 0,
"description": "Skip this many results (pagination)"
},
"category": {
"type": "string"
},
"platform": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string",
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
}
}
}The catalog's category rail for a platform, with the key list_apps filters by. Emails, games, store listings and ads have their own rails.
| Argument | Type | Description |
|---|---|---|
| platform | string | ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"platform": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string",
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
}
}
}The filter vocabulary with real counts (number of flows): platform, flowIntents, uiComponents, pageType and screenPatterns. Call this before filtering search_screens or search_flows so filters are real values, not guesses. Optional query/filters narrow every count, flowIntents included.
| Argument | Type | Description |
|---|---|---|
| query | string | |
| filters | object |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"query": {
"type": "string",
"maxLength": 200
},
"filters": {
"type": "object",
"properties": {
"appId": {
"type": "array",
"items": {
"type": "string"
}
},
"pageType": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open vocabulary, e.g. 'Paywall', 'Home'; call list_facets for real values"
},
"platform": {
"type": "array",
"items": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string"
},
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
},
"flowIntents": {
"type": "array",
"items": {
"enum": [
"login",
"signup",
"onboarding",
"checkout",
"payment",
"search",
"profile",
"settings",
"navigation",
"dashboard",
"paywall",
"teams",
"account",
"notification",
"support"
],
"type": "string"
},
"description": "What the flow is for, e.g. ['paywall'] or ['onboarding', 'signup']"
},
"uiComponents": {
"type": "array",
"items": {
"enum": [
"button",
"input",
"password_input",
"email_input",
"phone_input",
"checkbox",
"radio",
"toggle",
"dropdown",
"tab",
"search_bar",
"card",
"list",
"modal",
"toast",
"otp",
"social_login",
"progress_indicator"
],
"type": "string"
},
"description": "Components the screen must contain, e.g. ['otp'] or ['social_login']"
},
"screenPatterns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open vocabulary; call list_facets for real values"
}
}
}
}
}The caller's projects, newest first.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Find apps in the catalog by name, website or theme ('nubank', 'linear.app', 'meditation').
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | |
| platform | array | ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 48,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"platform": {
"type": "array",
"items": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string"
},
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
}
}
}Search real product emails (welcome, receipts, onboarding, re-engagement…) by description or brand. Each result is one email with its desktop and/or mobile image; when hasHtml is true, get_email_html returns the original HTML to adapt. Needs Pro.
| Argument | Type | Description |
|---|---|---|
| appId | array | Limit to these brands |
| limit | integer | |
| query | string | Free text, e.g. 'welcome email with a big hero image' |
| offset | integer | Skip this many results (pagination) |
| flowIntents | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"appId": {
"type": "array",
"items": {
"type": "string"
},
"description": "Limit to these brands"
},
"limit": {
"type": "integer",
"default": 8,
"maximum": 24,
"minimum": 1
},
"query": {
"type": "string",
"default": "",
"description": "Free text, e.g. 'welcome email with a big hero image'"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 200,
"minimum": 0,
"description": "Skip this many results (pagination)"
},
"flowIntents": {
"type": "array",
"items": {
"enum": [
"login",
"signup",
"onboarding",
"checkout",
"payment",
"search",
"profile",
"settings",
"navigation",
"dashboard",
"paywall",
"teams",
"account",
"notification",
"support"
],
"type": "string"
}
}
}
}Search whole flows (ordered screen sequences) by intent, app or description. Then get_flow for the steps.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query | string | |
| offset | integer | Skip this many results (pagination) |
| platform | array | ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro. |
| flowIntents | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 8,
"maximum": 24,
"minimum": 1
},
"query": {
"type": "string",
"default": ""
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 200,
"minimum": 0,
"description": "Skip this many results (pagination)"
},
"platform": {
"type": "array",
"items": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string"
},
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
},
"flowIntents": {
"type": "array",
"items": {
"enum": [
"login",
"signup",
"onboarding",
"checkout",
"payment",
"search",
"profile",
"settings",
"navigation",
"dashboard",
"paywall",
"teams",
"account",
"notification",
"support"
],
"type": "string"
}
}
}
}Search individual UI screens by description, app name or site ('paywall with annual plan first', 'Spotify', 'linear.app'). Returns metadata per screen; set includeImages to also get the top screens as images (max 4, ~1-2k tokens each). Call get_screen for the full structure of one.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Free text, an app name, or a website |
| offset | integer | Skip this many results (pagination) |
| filters | object | |
| includeImages | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 48,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Free text, an app name, or a website"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 200,
"minimum": 0,
"description": "Skip this many results (pagination)"
},
"filters": {
"type": "object",
"properties": {
"appId": {
"type": "array",
"items": {
"type": "string"
}
},
"pageType": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open vocabulary, e.g. 'Paywall', 'Home'; call list_facets for real values"
},
"platform": {
"type": "array",
"items": {
"enum": [
"ios",
"android",
"web",
"email",
"game",
"reference",
"store",
"ad"
],
"type": "string"
},
"description": "ios, android, web (desktop sites), email (brand email galleries), game (game UI: menus, HUD, inventory), reference (curated design references like bento grids), store (app store listing carousels) or ad (ad creatives). email, game, store and ad need Pro."
},
"flowIntents": {
"type": "array",
"items": {
"enum": [
"login",
"signup",
"onboarding",
"checkout",
"payment",
"search",
"profile",
"settings",
"navigation",
"dashboard",
"paywall",
"teams",
"account",
"notification",
"support"
],
"type": "string"
},
"description": "What the flow is for, e.g. ['paywall'] or ['onboarding', 'signup']"
},
"uiComponents": {
"type": "array",
"items": {
"enum": [
"button",
"input",
"password_input",
"email_input",
"phone_input",
"checkbox",
"radio",
"toggle",
"dropdown",
"tab",
"search_bar",
"card",
"list",
"modal",
"toast",
"otp",
"social_login",
"progress_indicator"
],
"type": "string"
},
"description": "Components the screen must contain, e.g. ['otp'] or ['social_login']"
},
"screenPatterns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Open vocabulary; call list_facets for real values"
}
}
},
"includeImages": {
"type": "boolean",
"default": false
}
}
}Find catalog screens that look like your images (base64, e.g. a screenshot of the app you are building). Then call get_screen on the matches to compare. Free plans: up to 2 images and 12 results.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| images* | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"images"
],
"properties": {
"limit": {
"type": "integer",
"default": 24,
"maximum": 120,
"minimum": 1
},
"images": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 8,
"minItems": 1
}
}
}Apps like this one, ranked from the app's own flow themes. Accepts an appId or slug.
| Argument | Type | Description |
|---|---|---|
| appId* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"appId"
],
"properties": {
"appId": {
"type": "string"
}
}
}Screens that look like a given screen. Visual, not keyword — no quota. includeImages returns the top matches as images (max 4).
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| screenDocId* | string | |
| includeImages | boolean |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"screenDocId"
],
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 48,
"minimum": 1
},
"screenDocId": {
"type": "string"
},
"includeImages": {
"type": "boolean",
"default": false
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 1, 2026.