One config block plugs Prior.Run into Claude Desktop, Claude Code, Codex, Gemini CLI, Cursor, Windsurf, Cline, Zed — any MCP-compatible host. The agent calls tools, waits for synthesis, hands you back a verdict.
Run a Prior.Run compare on brand.com/landing-a vs brand.com/landing-b with my Gen Z skincare room.
create_url_compare{
image_a: "~/desk/hero-a.png",
image_b: "~/desk/hero-b.png",
campaign_context: "Gen Z skincare, TikTok awareness.",
run_platform: "tiktok",
custom_audience_id: "aud_…" // optional · saved audience
}↳ running — synthesis phase ·····
Page A wins, 4–2. The four who picked it said B buried the price; the two who didn't said A's hero asked for too much, too early. Every walk is back in your room ▍
01uvx priorrun-mcp0203# no clone, no pip install. requires python 3.11+ and uv.04# install uv: curl -LsSf https://astral.sh/uv/install.sh | sh
01{02 "mcpServers": {03 "prior-run": {04 "command": "uvx",05 "args": ["priorrun-mcp"],06 "env": {07 "PRIORRUN_API_KEY": "pr_live_xxxxxxxxxxxxxxxxxxxx"08 }09 }10 }11}
01{02 "mcpServers": {03 "prior-run": {04 "command": "uvx",05 "args": ["priorrun-mcp"],06 "env": { "PRIORRUN_API_KEY": "pr_live_..." }07 }08 }09}
01[mcp_servers.prior-run]02command = "uvx"03args = ["priorrun-mcp"]0405[mcp_servers.prior-run.env]06PRIORRUN_API_KEY = "pr_live_..."
01{02 "mcpServers": {03 "prior-run": {04 "command": "uvx",05 "args": ["priorrun-mcp"],06 "env": { "PRIORRUN_API_KEY": "pr_live_..." }07 }08 }09}
01{02 "mcpServers": {03 "prior-run": {04 "command": "uvx",05 "args": ["priorrun-mcp"],06 "env": { "PRIORRUN_API_KEY": "pr_live_..." }07 }08 }09}
01# all modern MCP hosts share the "mcpServers" shape used by Claude Code.02# drop the same block into the host's MCP config file and you're set.
persona_audience_panel↳ open focus-group roompersona_audience_ask↳ ask the whole room (+ actions, images/videos, @-targeting)upload_room_image↳ stimulus upload · image or short videopersona_audience_synthesis↳ transcript → themes + advisory handoff hintdismiss_room_member↳ swap one seat for a fresh drawreset_room↳ clear | swap | newget_room_turns↳ server-side transcript + field notescreate_room_thread↳ campaign threads (+ rename_room_thread)interview_room_member↳ 1:1 with a single memberget_member_interview_history↳ member 1:1 transcript + budgetcreate_room_brief↳ thread → ship-ready creative briefcreate_url_audit↳ deep-walk one live URL or design prototype · brief the panel with instructionscreate_url_compare↳ two URLs head-to-head with your room's memberscreate_mood↳ kick off Mood pipelineget_mood_job↳ poll a pipeline joblist_mood_reports↳ list caller's Mood reportsget_mood↳ full corpus JSONlist_mood_cohorts↳ cohort_ids for spawnregenerate_mood↳ re-run same URLspawn_mood_audiences↳ panel → synthetic audiencespersona_interview↳ ask one persona a follow-uppersona_interview_history↳ transcript + budgetupload_interview_image↳ stimulus upload · images onlylist_audience_templates↳ built-in templateslist_custom_audiences↳ saved custom audiences (id + name)rename_custom_audience↳ rename a saved audiencedelete_custom_audience↳ delete a saved audienceget_memo↳ archived memos · read-onlyRoom-first, two speeds — same as the web app's Fast/Deep toggle. Fast = persona_audience_ask: the whole room answers in seconds (conversation, structured actions). Deep = create_url_*: the same seated members walk a live page in a real browser and report what they did — journeys, reactions, hesitations, and a head-to-head vote on a compare (minutes, credits-charged). Every deep run needs custom_audience_id + panel_member_indices — the agent opens the room with persona_audience_panel and passes the seated members through. Image arguments accept local paths, https URLs, or base64; upload_room_imagealso takes short mp4 / mov / webm ad videos (≤ 100 MB, up to 5 per ask; 2 = A/B vote, 3-5 = ranked, same as creatives) — clips are prescanned at upload so the panel reacts to what's actually on screen. The URL tools block until the panel finishes walking, so the agent gets the result in one tool call.
Deep-test these two landing pages — /landing-a and /landing-b — with my Gen Z skincare room.
persona_audience_panel( audience_id="…" ) → 6 members seated
create_url_compare( custom_audience_id="…", panel_member_indices=[0,1,2,3,4,5] )
waiting · 90s ·
We prefer Page A · Moderate confidence. The hook lands — “feels like a real recommendation” came up across the room. But B's CTA scored higher for clarity. Full focus group ↗
The agent picks the right tool from your wording: "ask my room" / "what do they think" → room tools. "live page" / "walk this URL" → URL tools. If it guesses wrong, say so explicitly: “use create_url_compare”.
Tool errors
The tool surfaces a clear message: 401 invalid key · 403 quota · 413 image too large · 429 slow down · 504 the walk outran the gateway (already billed — don't re-run).
Rate limits
Per-key request rate and concurrent-job caps. The agent will see 429 with a retry hint — let it back off, don't loop manually.
Waiting
create_* tools default to wait=true and block until status=complete. For Mood, poll get_mood_job — it's a long async pipeline.
Keys
Same key as the REST API. Generate, rotate, revoke at /settings. Plaintext shown once. Old keys 401 instantly across both surfaces.
[ ready to plug in? ]