Get your token →

Remote MCP · api.sonaloop.com

Sonaloop API

Sonaloop’s API is a hosted Model Context Protocol server: the same toolkit as the local install — curated persona catalog, persona lifecycle & chat, the governed research loop, councils, hypotheses, surveys and synthesis — exposed at a single endpoint and bound to your workspace. Connect Claude Code, Claude.ai, ChatGPT, Cursor or any MCP host; every tool call runs in your workspace’s data.

Endpointhttps://api.sonaloop.com/mcp
TransportStreamable HTTP (JSON-RPC 2.0, stateless)
AuthWorkspace-bound bearer token · OAuth 2.0
Surface164 workspace-user · 327 tools total

Get started

Quickstart

Three steps from zero to a connected host.

  1. Sign in & get a token. Open your workspace page — the first login provisions a workspace automatically. Copy the Remote-MCP one-liner with a Workspace user token for normal hosts or an Admin token for explicit administration.
  2. Connect your host. Run the one-liner in Claude Code, or paste https://api.sonaloop.com/mcp as a custom connector in Claude.ai / ChatGPT.
  3. Start researching. Ask a research question — the host runs the governed loop (personas → project → run → synthesis) through the tools below.

Get started

Playground

Call the live endpoint straight from this page. It is same-origin with /mcp, so requests run in your own workspace — no proxy, no setup. Sign in and your token loads itself.

POST/mcp
Response
// Run a request to see the live JSON-RPC response.

Calls run live in your workspace. Reads (tools/list, list_*, get_*, search) are safe to poke at; write tools (record_*, start_*) persist real data.

Connect

Authentication

Every request authenticates itself — the endpoint is stateless, so there is no session to share across tenants. Two ways to present credentials:

Bearer token

A workspace-bound token (an HMAC-signed claim, purpose mcp), self-service on your workspace page. Send it as an Authorization: Bearer <TOKEN> header. The token carries the workspace and the tool profile; membership is re-checked live on every call, so revoking access takes effect immediately.

OAuth 2.0

OAuth-capable hosts (Claude.ai connectors, ChatGPT Apps) connect without a copy-pasted token. An unauthenticated request answers 401 with a WWW-Authenticate challenge that points at the protected-resource metadata (RFC 9728); the host discovers the authorization server, runs the consent flow, and is issued the same kind of access token. Dynamic client registration and PKCE are supported.

Connect

Tool profiles

The same server, role-scoped surfaces — chosen by a claim baked into your token. Normal users get the curated workspace surface; admins can explicitly mint a full token.

Workspace user164 tools

The curated, task-shaped surface: catalog browse/pull, persona lifecycle & chat, the governed loop, councils, hypotheses, decisions, surveys, synthesis, and the key cloud automations. Recommended for Claude Code, Claude.ai & ChatGPT.

Admin327 tools

The entire server, including methodology registration, prototype internals, calibration, eval critics and the low-level substrate. Explicit admin use only.

Both one-liners live on your workspace page; the profile rides the token, so the claude mcp add command is identical — only the token differs.

Connect

Connect a host

The endpoint speaks Streamable HTTP, so any compliant MCP host connects with the same URL and bearer token.

Claude Code

One command — use a Workspace user token for normal work.

Claude.ai & ChatGPT

Add a custom connector pointing at https://api.sonaloop.com/mcp. OAuth-capable hosts run the consent flow automatically; otherwise paste a Workspace user token. In ChatGPT Deep Research, the search & fetch tools are what the researcher calls.

Cursor, Perplexity & others

Any host with Streamable-HTTP MCP support: same URL, same Authorization: Bearer header.

Protocol

JSON-RPC over HTTP

Everything is JSON-RPC 2.0 over a single POST to https://api.sonaloop.com/mcp. The endpoint is stateless and returns JSON, so each request stands alone (include both application/json and text/event-stream in Accept). The three methods you need:

POSTinitializeHandshake; advertises protocol version & capabilities.
POSTtools/listThe tools your token’s profile can see, with JSON Schemas.
POSTtools/callInvoke a tool by name with arguments.

Protocol

search & fetch

Two tools are always present, in every profile, because ChatGPT Deep Research requires them by name. search returns matching records (personas, projects, councils, syntheses…) as id + title + url; fetch returns one record’s full content by id. Together they let a researcher host read your workspace without learning the rest of the surface.

Protocol

Errors & gates

Transport-level auth failures are HTTP errors with a JSON body that explains the problem and links to your token. Everything past the auth wall is delivered in-band as an MCP tool result with isError: true — a denied or gated tool never breaks the transport.

401Invalid, expired or missing bearer token — carries the OAuth discovery challenge.
403Membership in the token’s workspace was revoked.
503MCP transport not started (misconfigured host).

Reads and exports always pass — your data is never held hostage. When a workspace’s plan lapses, only write tools answer the in-band billing note; reads keep working.

Tool reference

Tools

327 tools across 30 domains, auto-generated from the live server. Each is tagged by the smallest profile it appears in.

Plan engine

23/30 tools
add_taskWorkspace userInsert a task into the plan (shape the breadth): bucket analyze|act|verify, a capability tag, consumes (DAG edges), optional gates. Returns the create
archive_projectAdminExplicitly archive one project without deleting evidence. Active runs fail closed; recover or stop them first. Reuse the same operation_id on transpor
assess_progressWorkspace userRecord an evidence-backed assessment of progress toward the HMW goal. `delta` is a free host judgment (never a number); a non-binding coverage snapsho
assess_projectWorkspace userProject-level meta-assessment (read-only, computed — no LLM verdict): coverage, open evidence gates, open questions, a saturation hint, structural gap
brief_cohort_preflightWorkspace userGather the versioned server-owned cohort gate: per-persona memory/event/evidence depth, source/age provenance, deterministic hypothesis/profile lexica
brief_product_understandingWorkspace userGather the evidence-bound PRODUCT UNDERSTANDING preflight contract for a Reaction Test. Inspect and attach the actual app/screens first; do not fill u
checkpoint_stepWorkspace userCheckpoint a completed step (task_id, bucket, key, evidence ids, 1-line summary). Governed projects require the dispatch_token issued by run_step. Nor
complete_taskWorkspace userMark a ready task done. Verify tasks are gate-checked (breadth + gate judgment + artifacts/ sessions) and rejected until satisfied. Governed runs must
export_plan_mdAdminRender the plan as a human-readable, bucketed plan.md (analyze/act/verify + status + gates).
finish_runAdminStop/cap a run, or validate an already complete run. `finished` fails closed while plan, finish work, or the two persisted completeness-critic passes
get_cohort_preflightWorkspace userRead the current or historical cohort gate, its thresholds/features, remediation lineage and any persisted report limitation caused by an explicit ove
get_planWorkspace userThe project's research plan (analyze/act/verify task DAG + evidence refs + judgments).
get_product_understandingWorkspace userRead the current Product Understanding artifact, its immutable version history and capability posture counts. Pass version_id to inspect an older vers
inject_workWorkspace userTurn one critic `missing` item {kind, what, ...} into a real plan task/open-question (the driver does this automatically; exposed for manual gap-filli
iterate_taskAdminOpen the NEXT iteration round on a done-or-ready task with a `loop_back` target (HOST-judged — the engine never loops on its own): clones the loop-bac
link_evidenceWorkspace userAttach an evidence ref (kind=council|synthesis|artifact|session, id) to a task (usually the act task whose run-council/scaffold/session just produced
next_actionWorkspace userThe ready task FULLY loaded for a lean autonomous loop: analyze→grounding (prior syntheses + open questions); act→the consumed frame's framed question
project_healthWorkspace userRead the canonical Job health projection: running/stalled/engine-finished/unverified, the first unmet invariant, Product Understanding coverage, evide
record_cohort_preflightWorkspace userPersist an immutable cohort-integrity result. Status is exactly pass|needs_deepening| needs_reselection|overridden. Failed gates inject required plan
record_critic_roundWorkspace userBind one persisted completeness-critic report to its deterministic run dispatch. Retry the same report id + key safely; passed/missing is derived from
record_frameWorkspace userDischarge an ANALYZE frame task: author research questions + hypotheses grounded in cited persona memory (>=1 question + >=1 memory_ref). For a govern
record_manifest_product_understandingWorkspace userWeak-host-safe Reaction Test Product Understanding. First execute every serialized inspect_reaction_test_screen action returned by the same run. Then
record_product_understandingWorkspace userPersist one immutable Product Understanding version. Every capability must declare one posture: observed_present|observed_absent|inferred|unknown. Obs
resume_project_runWorkspace userResume exactly the named ACTIVE run. This never creates a project/run, reopens a terminal run, or marks anything finished. It verifies project/run/ope
run_journalWorkspace userThe run's journal (steps + critic rounds + cursor + status) — the source of truth for resume.
run_stepWorkspace userThe ESV driver's brain (deterministic). Returns the next dispatch to execute: {kind: analyze|act|verify, step_id, key, dispatch_token, next_action, di
select_reaction_test_cohortWorkspace userRepair an empty Reaction Test cohort with at least two EXISTING persona IDs. Use list_personas or catalog_search/catalog_recommend -> catalog_pull fir
start_projectAdminTHE ENTRY POINT. Create a project + seed its research plan (methodology -> analyze/act/verify scaffolding; none -> one dischargeable root frame task);
start_runAdminCreate (or resume) the run object — the SINGLE entry to the governed loop. Returns the run + its journal. For initial creation pass a stable operation
supersede_projectAdminExplicitly declare that project_id supersedes another project in this workspace. Preserves every artifact, records old→new lineage, and marks only the

Councils

15/28 tools
add_artifactAdminBring a REAL artifact into a project's council pool so personas react to what is ACTUALLY there — a live URL/website, a prototype link (kind='prototyp
brief_askAdminGather one persona's loaded context (SOUL + recent events + task-keyed memory) so you can author an honest, in-character answer. No server-side genera
brief_councilWorkspace userGather a council. A council is scoped to a research project, so `project_id` is REQUIRED (create one first with create_research_project; personas are
brief_head_to_headWorkspace userGather a HEAD-TO-HEAD (X vs Y) — run the panel on a DIRECT comparison of two (or more) concrete options and get a reasoned, segmented preference, NOT
brief_price_ladderAdminGather a PRICE LADDER (pricing Job protocol — willingness-to-pay): a FIXED ascending ladder of price points every persona reacts to, one van-Westendor
brief_red_teamWorkspace userGather a RED-TEAM (falsification) — run the panel to ATTACK the idea instead of flattering it ("why would this segment NOT adopt / NOT pay / churn?"),
brief_synthesisWorkspace userGATHER an ordered chain of councils (their exec_summaries/votes) so you can author a cross-council synthesis (arc, gesamtbild, recommendations, positi
delete_artifactAdminRemove an artifact (by id or label) from a project's pool.
export_council_sessionAdminExport one council session as a document (md|json) for sharing.
export_synthesisAdminExport a report (synthesis). format: `md`|`json` returned inline · `pdf`|`pptx` rendered as a presentation-grade file and attached to the owning proje
export_synthesis_htmlAdminExport a report (synthesis) as a SHAREABLE read-only static HTML bundle — `data/export/share/<token>/index.html`: the exact inspector document minus a
get_artifactAdminOne artifact (by id or A/B label) with its full captured snapshot.
get_councilWorkspace userFetch one council session by id (prompt, turns/statements, votes, summary).
get_head_to_headWorkspace userFetch one head-to-head result by session id — its options, per-persona preferences, the deterministic aggregate (preference + margin + abstentions + s
get_price_ladderAdminFetch one price-ladder result by session id — the ladder, the raw per-persona/per-rung banded responses (persona, price point, band, quote) and the de
get_red_teamWorkspace userFetch one red-team result by session id — its stance, adversarial roles, per-persona objections and the deterministic case-against (themes grouped by
get_synthesisWorkspace userFetch one report (synthesis) by id — its findings/sections/scope and metadata.
list_artifactsWorkspace userList every artifact ingested into a project (id, label A/B/…, kind, url, capture status).
list_councilsWorkspace userList council sessions (id, prompt, persona count, votes), newest first. Paginated per the shared convention (docs/pagination.md): `limit` (default 25)
list_synthesesWorkspace userList all reports (syntheses) — id, title, scope, date — for browsing.
price_ladder_analysisAdminThe analytics shape of a recorded price ladder: acceptable-price range + cliff points, overall and one row per segment (pricing protocol step range_an
record_councilWorkspace userPersist a host-authored council. Shape it by what you pass (the UI derives the mode): DISCOVERY = `questions` (open user-research questions), NO propo
record_head_to_headWorkspace userPersist a host-authored HEAD-TO-HEAD (stored as a CouncilSession with a `head_to_head` block). Pass the labelled `options`, each persona's `preference
record_price_ladderAdminPersist a host-authored PRICE LADDER (stored as a CouncilSession with a `price_ladder` block). `responses` is the structured willingness-to-pay payloa
record_red_teamWorkspace userPersist a host-authored RED-TEAM (stored as a CouncilSession with a `red_team` block). Pass the per-persona `objections` ([{persona_id, theme (a short
record_synthesisWorkspace userPersist/UPDATE a host-authored synthesis. A synthesis is DECOUPLED from councils: `council_ids` is OPTIONAL (may be empty — affinity over notes, a syn
suggest_finding_kindsAdminSUGGESTED Finding kinds (summary/key_problem/pain_solver/open_question/recommendation/ cluster/segment/shortlist/ranking/pain_point) for a `findings`
suggest_stancesAdminThe CANONICAL stance vocabulary — call this before authoring statement stances, votes, or head-to-head/red-team reactions. Every stance is {value -2..

Prototypes

1/15 tools
brief_prototype_sessionAdminGATHER persona context + how-to-drive + anti-steering before a persona uses the app.
delete_prototypeAdminDelete a prototype artifact record (files on disk are kept).
get_prototypeAdminOne prototype artifact by id or slug.
list_proto_sessionsAdminList live browser sessions.
list_prototypesAdminList registered prototype artifacts (optionally for one project).
proto_actAdminAct on the latest snapshot: {type: click|type|select|scroll|key|wait, ref?, text?, value?}.
proto_closeAdminClose a browser session.
proto_openAdminOpen a real running app in a headless browser session; returns {session_id, snapshot}. Without the optional browser harness this degrades gracefully (
proto_readAdminRe-read the current snapshot of a session.
record_prototype_sessionAdminPersist a persona's grounded prototype use as an experience + memory + artifact; rejects claims with no matching observed state in the session log. `r
register_prototypeAdminRegister a hand-authored app under prototypes/ as a runnable artifact (fidelity tag, e.g. lofi|midfi|hifi).
register_remote_prototypeWorkspace userRegister a hosted HTTP(S) app as a first-class prototype without fetching or executing it. Optionally pair the concept `note_id`. In a governed run pa
run_prototypeAdminStart the app on an ephemeral localhost port; returns {url, pid}. Local-only.
scaffold_prototypeAdminGenerate a real, minimal, runnable web app from a host-authored concept and register it. The app is genuinely clickable (real DOM) for Playwright. The
stop_prototypeAdminStop a running prototype.

Usability sessions

4/6 tools
brief_usability_sessionAdminGATHER persona context (SOUL + state + task-keyed memory) + anti-steering framing + the friction vocabulary + the subject's context (prototype how-to-
get_session_funnelAdminAggregate ALL usability sessions of one subject into a step-indexed funnel: per step the entered/continued/dropped counts plus the drop reasons — the
get_usability_sessionWorkspace userOne recorded usability session by id — the full replayable trace (steps + outcome + statements).
list_usability_sessionsWorkspace userList recorded usability sessions, optionally filtered by project, persona and/or subject ({kind?, id?|url?}).
record_usability_sessionWorkspace userPersist a host-authored usability session — the durable, REPLAYABLE trace (the session is the deliverable). `steps` is the ordered dual timeline: {ind
suggest_friction_levelsWorkspace userThe CANONICAL per-step friction vocabulary for usability sessions — call this before authoring step friction. Each item is {term, value, label_key, al

Live walkthroughs

0/4 tools
record_actuation_gateAdminThe fidelity-vs-theater head-to-head: compare a rung-1 artifact walkthrough against a rung-2 live drive of the SAME flow on derived evidence-quality d
walk_openAdminOpen a LIVE walkthrough session on a real SaaS URL under the WalkPolicy safety contract (docs/live-walkthrough-safety.md): origin allowlist (off-origi
walk_ownAdminRung 2 — drive a live surface WE OWN: pass `prototype_id` (the scaffolded app is started on localhost) or a loopback/declared-staging `url` (SONALOOP_
walk_policy_defaultsAdminThe safe default WalkPolicy walk_open applies when none is passed — origin-locked to the opening URL, ALL denylist categories enabled (payment/destruc

Surveys

6/8 tools
attach_survey_evidenceAdminLoop the imported REAL responses back onto a persona as Evidence (source_type='survey') for calibration — a compact JSON of the per-question aggregate
brief_surveyWorkspace userGATHER everything needed to author a survey that is answerable against the graph: the project's open questions, its contested findings (councils whose
export_surveyAdminRender the survey as a SENDABLE, self-contained static HTML form (spa-min template) — works from file://, host it anywhere. Submissions produce a JSON
get_surveyWorkspace userOne survey by id or slug — the instrument document + its live response_count.
import_survey_responsesWorkspace userIngest a batch of REAL responses — a JSON list (the export form's payload shape: {respondent_key?, submitted_at?, answers: [{question_id, value}], sou
list_surveysWorkspace userList surveys (optionally per project), each with its live response_count.
record_surveyWorkspace userPersist a host-authored survey. `questions` = [{id?, text, kind: single|multi|scale|text, options (>= 2 for non-text), stance_mapped (scale only)}] —
survey_resultsWorkspace userPer-question aggregates of the imported responses — and for stance_mapped questions the PREDICTED-VS-ACTUAL strip: the persona stance distribution fro

Hypotheses

5/7 tools
brief_hypothesisWorkspace userGATHER what is worth betting on: the project's contested findings (councils whose statements span support AND opposition), the predicted behaviors rec
drop_hypothesisAdminRetire an OPEN bet without scoring it (the question became moot, the metric unmeasurable). Dropped bets stay on the record but never enter the scoreca
eval_scorecardAdminAggregate the hit-rate across RESOLVED hypotheses (per project, or global with a per-project breakdown) and write the sim-vs-reality calibration recor
get_hypothesisWorkspace userOne hypothesis by id — the bet, its prediction, and (once resolved) the recorded result with both raw values.
list_hypothesesWorkspace userList hypotheses (optionally per project and/or status: open|validated|refuted|inconclusive|dropped).
record_hypothesisWorkspace userPersist a host-authored hypothesis with status=open — the bet stamped BEFORE reality answers. `prediction` = {metric, expected_value (+tolerance?) OR
record_hypothesis_resultWorkspace userAttach the REAL-WORLD observation and flip the status. `source` is a Ref that must RESOLVE: a survey's imported responses ({kind:'survey', id}), attac

Decision records

3/4 tools
get_decisionWorkspace userOne decision record by id — what was decided, the evidence cited (based_on), the rejected alternatives (+ why-not notes), and the supersede links (bot
list_decisionsWorkspace userList decision records (optionally per project and/or status: proposed|adopted|superseded).
record_decisionWorkspace userPersist a host-authored decision record — "we decided X, based on syntheses A and B, rejecting alternative C". `based_on` = Refs to the evidence it re
update_decisionAdminFlip a decision's status (proposed|adopted) — or supersede it: `superseded_by` names the SUCCESSOR decision and records the link in BOTH directions (t

Sections, notes

3/18 tools
add_to_sectionAdminAdd node ids to a section's membership (validated against the project graph).
create_noteWorkspace userCreate a lightweight NOTE node — the ONE note entity (from a raw observation to a worked-out solution idea; there is no separate 'concept'). For a sol
create_sectionAdminCreate a labeled overlay grouping of graph nodes (e.g. 'Initial user research', 'Problem exploration'). `member_ids` must reference real nodes (counci
delete_noteAdminDelete a note node from the project.
delete_sectionAdminDelete a section. Member nodes are kept (reference, not containment).
derive_sectionsAdminAuto-organize: derive persisted SECTION overlays from the plan — one per methodology phase (fan + its converging waist; label from the step name), a P
export_sectionAdminSelf-contained export of a section (md|json): its members' summaries, for a downstream agent.
get_sectionAdminGet one section by id.
get_section_membersAdminResolve a section's members into {kind,title,summary,href} records (section-scoped view).
list_notesWorkspace userList a project's note nodes in creation order. Paginated per the shared convention (docs/pagination.md): `limit` (default 25) + opaque `cursor`; answe
list_sectionsAdminList a project's sections (ordered).
remove_from_sectionAdminRemove node ids from a section's membership (nodes themselves are untouched).
reorder_sectionsAdminSet the display/outline order of a project's sections.
scaffold_synthesisWorkspace userSeed a project REPORT outline from the project's phases so the conclusion hand-off is one author step (brief_synthesis_section → record_synthesis_sect
set_note_dataAdminMerge keys into a note's `data` — e.g. set a concept note's `prototype_id` once you build it, so the completeness critic stops flagging it as un-proto
set_section_membersAdminBulk-set a section's membership — the 'promote this cluster into a named section' move.
suggest_section_kindsAdminSuggested section kinds + presentation (data-driven; adopt/tweak/invent).
update_sectionAdminUpdate a section (title/kind/parent_id/order/presentation/note/member_ids).

Research projects, graph

6/18 tools
available_project_iconsAdminExisting regular icons that Projects/Jobs can choose at initialization or edit time.
brief_synthesis_outlineWorkspace userGATHER the whole project graph + study content so you can author the project REPORT outline.
brief_synthesis_sectionWorkspace userGATHER one section's source studies (+ councils) so you can author it with citations.
create_research_projectAdminCreate a research Project: a themed GRAPH of studies (syntheses). Distinct from the memory get_project (a persona's own work project). `icon` may be a
delete_councilAdminDelete a council session.
delete_personaWorkspace userPermanently remove a persona only with the exact token from persona_deletion_impact(persona_id). Re-preview after any persona/project change.
delete_research_projectAdminDelete a project and its project-scoped outputs; personas and their memory remain.
delete_synthesisAdminDelete a synthesis (study) and detach it from any project graphs.
generate_project_iconAdminCreate a fitting custom SVG icon for a Project/Job from its title/goal plus an optional prompt, save it as an SVG file, and assign it.
get_project_graphAdminThe core navigation call: nodes (studies + theme tags + sentiment), typed edges, themes, build order, and open questions for one research project.
get_research_frontierAdminThe anti-explosion surface: the project's still-open questions + structural notes.
list_research_projectsWorkspace userList research projects (graph containers) with study/edge/theme counts.
persona_deletion_impactAdminPreview persona deletion: memory removed, project detachments, preserved historical artifacts, and an exact state-bound confirmation token. This call
record_open_questionsAdminPromote open questions raised by a study into first-class graph nodes.
record_synthesis_outlineWorkspace userPersist the host-authored report outline (sections derived from the graph). A body-empty scaffold is reused; pass report_id to target a draft, reuse o
record_synthesis_sectionWorkspace userPersist one authored report section. `content`: {markdown, citations:[{study_id|council_id}], figures:[…]}. Figures can embed a chart — {kind:'chart',
set_project_iconAdminReplace a Project/Job icon. Use `icon=<existing name>`, `randomize=True`, or pass a custom `svg` string; custom SVGs are sanitized, saved under data/p
suggest_chart_kindsAdminWhich report CHART to use when (bar, pie, stacked_bar, diverging_bar, gauge, dot_plot, heatmap, line, effort_impact) + each one's author payload shape

Jobs

3/12 tools
get_job_presetWorkspace userOne Job preset by stable taxonomy id (e.g. 'positioning'): framework + framework_options + formats (each with its brief/record tools) + coverage. A st
get_result_schemaAdminOne domain-neutral result schema by id, e.g. stimulus_reaction.v1.
list_job_presetsWorkspace userThe Job presets — one per named research Job (positioning, pricing, jtbd_demand, ideation_hmw, continuous_discovery, churn_reasons), each a recipe car
list_result_contractsAdminList the output contracts declared for Jobs and methodologies.
list_result_schemasAdminList domain-neutral result schemas plus registry validation errors.
project_result_contract_stateAdminShow which expected result schemas are recorded or still missing for a project.
record_job_outcomeAdminPersist one project-owned schema outcome as a job completion milestone.
result_contract_for_jobAdminThe expected result schemas for one Job.
result_contract_for_methodologyWorkspace userThe expected result schemas a methodology usually produces.
set_project_result_schemasAdminSet the project-owned result schema contract that must be satisfied before the job is done.
sharpen_questionAdminTurn a FUZZY goal into a well-formed study — deterministically (no server-side text-LLM). Returns the well-formed-study checklist (decision at stake,
start_job_studyAdminStart a study FROM a Job preset: seeds the plan through the preset's default Framework (or any `framework` override — presets never constrain) and sta

Methodologies

9/14 tools
brief_nextWorkspace userGATHER what the plan's ready frontier needs now: the primary ready task (+ the full ready set), its bucket/capability, consumed frames, and unmet gate
describe_frameworkWorkspace userOne Framework's plain-language description by stable id (e.g. 'double_diamond'): {id, name, what, when, stages:[{id, name, what}]}. The structured com
get_methodologyWorkspace userThe full constellation spec for one methodology (steps, tags, consumes, produces, requires).
list_frameworksWorkspace userThe Frameworks (the methodologies that seed a study's plan) in PLAIN LANGUAGE, as one clean list the user — and the website / job presets — can read:
list_methodologiesWorkspace userList available methodologies (built-in + user-defined) and their step keys.
park_evidenceWorkspace userExplicitly park evidence that should remain visible but should NOT flow into a downstream gate/decision. Use this instead of leaving produced evidence
record_judgmentWorkspace userRecord an evidence-backed LLM gate judgment on a plan TASK (usually a verify task). `gate_tag` is a FREE tag (e.g. divergence_complete, or whatever th
register_methodologyAdminRegister a USER-DEFINED methodology — author your own constellation and it becomes a Framework any study can run through (start_project(methodology=<k
set_project_methodologyWorkspace userBind an existing research project to a methodology by (re)seeding its plan from the constellation. The plan is the single engine; drive it via the pla
suggest_artifact_typesAdminSUGGESTED artifact-type tags for produces.artifact_type / requires.*_tags (matched by tag-equality, no string is special-cased). Recommendations only.
suggest_capabilitiesAdminSUGGESTED capability tags (explore/cluster/decide/build/test/synthesize, …) for a step's `tags`. Recommendations only — adopt, tweak, or invent your o
suggest_methodologiesWorkspace userSUGGESTED whole-constellation templates to copy and adapt (the registered methodologies + any extra templates). Tags are free; nothing here constrains
suggest_rolesAdminSUGGESTED role tags for a step's produces.role. Recommendations only.
unpark_evidenceAdminCorrect a prior parking decision for exact refs and scope. The evidence becomes gate-eligible again while the plan retains an audit record of the corr

Personas

25/29 tools
assess_coverageAdminCoverage / diversity check over a study's PERSONA SET — a deterministic analysis that flags when the panel is too narrow to be trustworthy (a homogene
attach_evidenceWorkspace userAttach a real-world SOURCE (doc/url/note) to a persona to ground its claims.
begin_persona_buildWorkspace userStart or idempotently resume the governed profile→grounding→memory→critic lifecycle. Execute the returned dispatch, then call persona_build_step.
begin_persona_enrichmentWorkspace userSTART HERE when the user wants to adopt hobbies, routines, relationships or concrete private/work experiences into an existing persona. Optionally loa
brief_personaWorkspace userGather the prompt + frame to AUTHOR one persona profile from a source description. You write the profile JSON from `instructions`, then call record_pe
brief_persona_memory_onboardingWorkspace userPlan the gather→author→write-back sequence that turns a static persona profile into a critic-checked lived-memory baseline. No memory is fabricated by
export_personaAdminExport one persona (profile + SOUL/memory) as json/markdown.
generate_avatarWorkspace userGenerate (or regenerate) the persona's avatar image — needs OPENAI_API_KEY. Optionally pass up to four personas whose existing portraits define the sh
get_personaWorkspace userFull persona record + recent calendar/experience/pain points.
get_persona_buildWorkspace userInspect one resumable persona build and its current dispatch/readiness.
get_persona_context_snapshotWorkspace userRe-open one immutable persona/task context exactly as it was prepared.
get_persona_soulAdminThe persona's SOUL.md (authoritative identity + grown drift).
list_persona_buildsWorkspace userList the governed build history of one persona.
list_persona_context_snapshotsWorkspace userLean history of frozen task contexts for one persona.
list_personasWorkspace userLean one-line overview of personas (slug/name/age/role/segment) — drill in with get_persona for the full profile. Pass compact=False for full profiles
persona_build_stepWorkspace userRe-assess durable outputs and advance a persona build to its next exact tool.
persona_readinessWorkspace userStructural readiness of one persona: profile specificity, independent grounding, lived events/facts, calendar continuity and authored capabilities.
persona_task_readinessWorkspace userRead-only readiness for one exact assignment: global quality plus relevant lived memory, independent grounding, cohort membership and capability rung.
prepare_persona_agent_contextWorkspace userBuild the launch context for a persona subagent (SOUL + state + recent events).
prepare_persona_for_taskWorkspace userFreeze the exact SOUL, memory cutoff, loaded refs, capabilities and limitations used for one assignment. Re-open later with get_persona_context_snapsh
preview_persona_updateWorkspace userValidate a persona patch without writing. Returns its field diff, affected artifact counts, history guarantees and — for identity-changing fields — a
record_personaWorkspace userValidate + persist the persona profile you authored from brief_persona. This is the create path (no server-side text generation).
record_persona_enrichmentWorkspace userValidate and persist one host-authored persona enrichment: a MINIMAL routine profile patch plus up to eight concrete dated lived days. Identity change
record_persona_voice_checkWorkspace userPersist the semantic authenticity verdict without retaining the raw candidate text. A green check requires all four dimensions >=4 and no open issue.
refresh_persona_from_sourceWorkspace userRefresh a persona from where it came from. Catalog-pulled personas re-pull from their recorded catalog ref (drift-safe: a locally modified profile is
suggest_tech_comfortWorkspace userThe CANONICAL tech-comfort vocabulary for a persona's capability profile (capabilities.tech_comfort) — call this before declaring/patching one. Each i
update_personaWorkspace userApply a host-authored MINIMAL patch to a persona's profile; never replay the full profile and never call brief_persona for edits. Records a revision w
validate_persona_outputWorkspace userGather a semantic authenticity check for persona-authored wording. Returns the exact persona context and warning signals; the host authors the verdict
view_persona_avatarAdminReturn the persona's actual PNG portrait. Use this only when a report, design, canvas or document needs the visual; use get_persona for profile text.

Persona catalog

4/4 tools
catalog_pullWorkspace userPull catalog personas (by slug and/or archetype `pack`) into the CURRENT store — profiles, SOUL/MEMORY, lived memories, avatars — with `provenance.cat
catalog_recommendWorkspace userDeterministic, explainable persona-SET recommendation over the catalog (no LLM): spec = {keywords?: [...], facets?: {facet -> [values]}, n?: int, seed
catalog_searchWorkspace userBrowse the curated persona catalog (github:jhoetter/sonaloop-data): slugs, names, roles + a facet summary over the filtered set. `query` is a free-tex
catalog_statusWorkspace userThe `git fetch && git status` of the catalog: for every catalog-pulled persona in the CURRENT store (optionally filtered by `persona_slugs`), report f

Simulation

18/32 tools
begin_persona_month_simulationWorkspace userSTART HERE when the user asks to simulate one calendar month such as 2026-08. Returns all context and the exact host-authored bundle contract in one c
brief_consolidationWorkspace userGATHER a simulated day + known entities. Returns instructions for you to author memory_deltas (entities/facts/threads/event_links); then record_memory
brief_dayWorkspace userGATHER context for planning ONE day (active projects, open threads, recall, world). Returns instructions for you to author a day plan; then put_day_pl
brief_digestWorkspace userGATHER a period for a consolidated digest (replaces hardcoded reflections).
brief_monthWorkspace userGATHER context to author a whole month bundle (period plan + sample days + digest), chained on the prior month. Then record_month_bundle.
brief_periodWorkspace userGATHER context for a week|month|quarter|year plan, incl. candidate sample days. Author a period plan (with sample_days) then put_period_plan. Trends o
export_persona_memoryAdminExplicitly write the rendered MEMORY.md projection to disk.
extract_pain_pointsAdminSurface a persona's pain-point observations over a date range.
get_activityWorkspace userFetch one simulated activity (block) by id.
get_calendarWorkspace userA persona's calendar events for one day.
get_calendar_periodWorkspace userA persona's calendar for a day|week|month|year view — LEAN event rows (id/timestamp/event_type/task/tool/summary, capped to the newest 400 with an in-
get_current_stateWorkspace userA persona's live state — what they're doing now / at a given time.
get_day_planAdminFetch the stored day plan for a persona on a given date.
get_open_loopsAdminA persona's unresolved threads / open loops (filter by status).
get_period_planAdminFetch a stored period plan (week|month|quarter|year) for a persona.
get_persona_memoryAdminPure read of MEMORY.md content: active projects, threads and digests.
get_projectWorkspace userFull fact/status timeline of one project (use `as_of` for how it looked then).
get_state_atAdminTime-travel: entities + facts + open threads + world valid at a given date.
get_timelineAdminChronological facts + experience events for a persona over a date range (optionally one entity). Capped to the newest `max_facts`/`max_events` rows —
list_active_projectsWorkspace userCompact list of the persona's open projects with status + open-loop counts.
list_digestsAdminList a persona's consolidated digests (optionally filtered by scope).
list_period_plansAdminList a persona's period plans (optionally filtered by scope).
put_day_planAdminPersist the day plan you authored from brief_day.
put_digestWorkspace userPersist + embed the digest you authored from brief_digest.
put_period_planWorkspace userPersist a period plan (its sample_days drive which days you simulate concretely).
recall_memoryAdminHybrid (semantic + keyword/entity + recency + importance) recall over episodes, facts, digests, threads. USE when you want to check if the past has so
record_dayWorkspace userPersist a host-authored SINGLE day end-to-end (put_day_plan -> simulate the authored blocks/activities -> optional consolidation). See brief_day's `da
record_memory_deltasWorkspace userPersist host-authored memory deltas: resolves/dedupes entities, writes bi-temporal facts (invalidating superseded status), opens/resolves threads, lin
record_month_bundleWorkspace userPersist a host-authored month bundle through the full loop (plan->sample days-> simulate->consolidate->digest->embed).
resolve_entityAdminResolve a free-text mention to an existing entity (dedup), or null if new.
search_entitiesAdminFind a persona's memory entities by kind and/or name substring.
summarize_persona_periodWorkspace userGather a persona's experience over a date range (optional lens) for summarisation.

Evaluation

9/21 tools
brief_cohort_criticAdminGATHER compact per-persona records across the cohort so you can judge which personas fall OUT of the cohort's range (relative outliers / clones). Then
brief_completeness_criticWorkspace userGATHER a computed exhaustiveness snapshot for an INDEPENDENT critic: coverage + the generative breadth_candidates (segments/angles/concepts/risks/fide
brief_eval_criticWorkspace userGATHER source+SOUL+sampled activities+arcs for a semantic critique. Author a verdict (anti_steering/in_character/dialogue/arc/mundane 0-5 + flags) the
brief_evidence_checkAdminGATHER profile claims + attached evidence to validate synthesis against reality.
brief_persona_revisionAdminGATHER evidence (digests/facts) to propose SLOW identity drift. Change is the exception.
cohort_memory_depthAdminHow deep is the cohort's simulated memory (avg facts+events/persona)? A thin cohort should be deepened (simulate-cohort) before a run so councils are
evaluate_cohort_diversityAdminStructural bulk-generation gate: flag near-duplicate personas and implausibly uniform cohorts (Jaccard over segment/role/pains/goals/tools). No author
evaluate_simulationAdminRun the quality harness (uniformity, repetition, continuity, project movement, consistency, anti-steering). Returns green/warn/red — the measurable 't
evaluate_simulation_fullWorkspace userCombined 'top' verdict: structural harness + latest LLM critic (definition v2).
get_languageWorkspace userRead the active content language (host-authored text) and UI language.
get_world_contextWorkspace userThe shared world context (macro facts personas live in) valid at a given date.
list_memory_anomaliesAdminFlagged memory anomalies (contradictions / integrity issues), optionally per persona.
list_persona_revisionsAdminThe history of evidence-backed identity revisions for a persona.
record_cohort_criticAdminPersist the host-authored cohort critique (outliers + cohort_note) as an eval report + an anomaly per flagged outlier persona.
record_completeness_criticWorkspace userPersist the independent critic verdict {scores, passed, missing[{kind,what,why, suggested_action}], rationale, evidence_refs}. Bind it to the run and
record_eval_criticWorkspace userPersist the host-authored critic verdict; flags low dimensions + items as anomalies.
record_evidence_checkAdminPersist provenance verdict: confirmed/contradicted/unsupported; flags contradictions.
record_persona_revisionAdminPersist evidence-backed identity drift (re-renders SOUL); source identity preserved.
score_runAdminPersist a RunScore (critic rubric scores + finish + novelty + groundedness + memory depth) so output quality is tracked over time — a regression signa
set_languageWorkspace userSet the content language (de|en) for generated text and/or the web UI language. By default content is authored in the language the user writes in; use
set_world_contextWorkspace userSet exogenous backdrop facts (season, regulation, market...). Not shared persona knowledge.

Research-to-design hand-off

1/3 tools
brief_presentationAdminGather the report, cohort, evidence, visuals, result schemas and the selected methodology's data-authored deck profile. Author a presentation_plan.v1
get_design_handoffWorkspace userRead a provider-neutral research-to-design bundle for Figma, canvas, code or document MCPs: evidence-linked findings/voices, decisions, concepts, mock
record_presentation_planAdminPersist an evidence-linked, brand-neutral presentation plan with core slides, appendix and speaker notes. The deterministic PPTX export reuses this re

assets

5/8 tools
admit_remote_screenshotWorkspace userSecure Remote-MCP screenshot admission. Upload bytes directly as canonical base64; there is deliberately NO URL or filesystem-path input. The server b
attach_assetAdminAttach a file/image/screenshot to a project as citable evidence. Pass EITHER `path` (a local file, e.g. a screenshot you just captured) OR `content_ba
attach_prototype_shotAdminScreenshot a registered prototype (Playwright) and attach the shot to the project as image evidence — the capture path for artifacts produced during t
get_assetWorkspace userOne asset record (by id or filename) — includes the text excerpt for documents.
inspect_reaction_test_screenWorkspace userExecute the ONE current multimodal Reaction-Test setup action. The server validates the active Product Understanding dispatch, immutable manifest/dige
list_assetsWorkspace userEvery asset attached to a project (lean records; excerpt via get_asset, pixels via view_asset).
remove_assetAdminDetach an asset from a project (by id or filename).
view_assetWorkspace userLOOK at an asset. For an image/screenshot this returns the actual image — view it before authoring persona reactions so they are grounded in what is r

calibration

0/5 tools
brief_calibrationAdminGather the MISSES (refuted bets, high-error predictions, each with its evidence trail) so YOU author corrections: persona patches where a trait drove
calibration_reportAdminMeasure calibration NOW (mean Brier + hit rate + the reliability curve over scored predictions, plus the hypothesis hit rate) and persist the snapshot
calibration_trendAdminCalibration quality OVER TIME: the persisted report series, the Brier delta first→last, and whether the loop is improving — the first-class trend metr
record_calibration_roundAdminStamp one authored correction round ({persona_id, text, refs?} each) and snapshot a fresh calibration report — the before/after marker that makes 'cor
record_prediction_outcomeAdminMatch ONE real outcome to one predicted behavior and score it. prediction_ref: {kind: session|council|synthesis, id, anchor: <pb id>}. observed: bool

examples

1/3 tools
list_examplesWorkspace userThe example projects shipped with Sonaloop: slug, title, one-line tagline, and whether each is currently loaded into this database. Load one with load
load_exampleAdminLoad one shipped example project end-to-end (empty slug = list what's available). Idempotent: re-loading updates the same stable ids — no duplicates.
remove_exampleAdminRemove ONE example project's entities — and nothing else. Every id is re-derived from the shipped fixture; personas are matched by their provenance.ex

flows

7/8 tools
brief_flow_walkthroughWorkspace userGATHER one persona's artifact walkthrough: loaded persona context + the ordered screens (view_asset each — real pixels) + the authoring contract. YOU
define_flowAdminDefine an ORDERED flow from the project's screenshot assets — each step is {asset_id, caption?} (attach the screenshots first via attach_asset / attac
flow_funnelWorkspace userThe segment funnel of one flow: per step entered/continued/dropped with the drop reasons, the dropping personas and the step captions — where the coho
get_flow_manifestWorkspace userRead one exact flow-manifest version by manifest_id or flow_key + version.
list_flow_manifestsWorkspace userList immutable admitted screenshot-flow versions in the active workspace/project.
list_flowsWorkspace userEvery defined flow on a project (id, title, step count).
record_flow_manifestWorkspace userAppend one immutable, versioned Remote-MCP screenshot-flow manifest. `steps` is ordered and each entry is {asset_version_id, label}; every id must be
record_reaction_test_capture_reviewWorkspace userReview the exact currently admitted Reaction-Test screen inventory before a flow is frozen. Set capture_complete=false and name concrete known_missing

grounding

2/7 tools
brief_groundingWorkspace userGather the chunks + authoring contract to ground a persona in real material. WITHOUT persona_id: author a NEW persona from the corpora (description +
get_corpusAdminOne corpus record; include_chunks=True adds a PAGE of chunks (`chunk_list`, shared pagination convention: `limit` default 25 + opaque `cursor`, with c
ingest_corpusAdminIngest one REAL document (interview transcript, support-ticket export, review dump, survey verbatims) as a corpus of citable chunks. `content_or_path`
list_corporaAdminEvery ingested corpus (id, title, source_type, chunk count).
record_groundingWorkspace userPersist authored grounding: optional profile patch + the provenance map (claim → chunk ids; validated against the corpora). Links the corpora as perso
search_corpusAdminKeyword search over corpus chunks — pull the real signal relevant to a task (deterministic token-hit scoring, no embeddings needed).
trace_evidenceAdminResolve a cited evidence chunk id back to its source: the chunk text, its corpus, and every persona claim grounded on it — how synthesis claims trace

hooks

0/5 tools
list_hooksAdminAll durable hook registrations (id, event pattern, kind, target, label).
list_lifecycle_eventsAdminThe documented lifecycle-event catalogue the core emits (persona.created, council.recorded = 'session finished', run.finished, …) with each event's st
register_hookAdminSubscribe a durable hook to a lifecycle event. `event` is an exact name, 'domain.*', or '*'. `kind='command'` runs `target` as a shell command with th
test_hookAdminFire a sample envelope through one registered hook and report delivery success — the verification step right after register_hook.
unregister_hookAdminRemove one durable hook registration by id.

ideation

0/5 tools
get_ideationAdminFetch one ideation summary by session id — problem, HMW questions, idea pool, ranked shortlist, and the ready-made cite_as ref for record_decision.
list_ideasAdminThe project's idea records, filterable by HMW question, source persona, or cluster tag — the synthesis surface for the diverge output.
record_hmw_reframeAdminREFRAME (ideation_hmw protocol step 1): persist your How-Might-We reframe of a raw problem — 3 to 5 host-authored HMW questions, each a string or {que
record_ideasAdminDIVERGE (step 2): persist council-generated ideas as first-class, queryable idea records. Each idea is {text, persona_id (the source voice — must exis
record_ideation_summaryAdminCONVERGE (step 3): persist the FORCED ranking as an ideation summary. `shortlist` is your ordered picks — [{idea_id, rationale}], rank = position — ev

Shared Persona card

0/5 tools
generate_persona_surface_avatarAdminGenerate the native portrait for this exact profile. This can incur provider cost. Preserve the operation ID; inspect unknown outcomes instead of retr
get_persona_surfaceAdminRead the current native Persona as an editable MCP App card or plain text. Use a real ID/slug obtained from list_personas. This read writes nothing.
get_persona_surface_operationAdminInspect a native Persona operation without repeating it or generating an image.
record_persona_surfaceAdminCreate one native Persona and return its editable MCP App card. First call brief_persona and author its complete native profile. This writes the recor
update_persona_surfaceAdminSave explicit card edits against the current native version; exact retry is safe.

predictions

0/2 tools
aggregate_predictionsAdminThe segment roll-up of every predicted behavior in a project — grouped by (action, step, subject) with persona attribution, mean likelihood, evidence
suggest_likelihood_levelsAdminThe CANONICAL likelihood vocabulary for predicted behaviors (rare → certain, each with the numeric midpoint calibration scores against) — call before

retrieval

2/2 tools
fetchWorkspace userFetch ONE research record by id (a project/council/synthesis/hypothesis/persona id, e.g. from a `search` result). Returns {id,title,text,url,metadata}
searchWorkspace userFind the workspace's research records (projects, councils, syntheses, hypotheses, personas) matching `query`. Returns {results:[{id,title,url,text}]}

substrate

10/15 tools
brief_memory_from_chatWorkspace userGather exact chat turns for a proposed continuity note. Chat output is synthetic conversation, never independent evidence or lived memory.
chat_with_personaWorkspace userChat with ONE persona, durably. Returns the loaded agent context + prior turns; YOU author the in-character reply, then persist it with record_chat_tu
get_chatWorkspace userOne chat with its full turn history.
get_memory_proposalWorkspace userRead one chat-continuity proposal and its review status.
get_study_resultAdminONE structured study result: lean project row + run state + council rows + the FULL syntheses in the project's graph + open questions. The shape recur
list_chatsWorkspace userPaginated lean chat rows (newest first), optionally scoped to one persona.
list_memory_proposalsWorkspace userList continuity proposals for one persona, optionally by review status.
query_councilsAdminPaginated lean council rows; filter by project, participant, free text, `since`.
query_personasWorkspace userPaginated lean persona rows, filterable by free text. Stable ordering + next_offset.
query_projectsAdminPaginated lean research-project rows; filter by status, free text, and `since` (ISO lower bound on updated_at). Newest first.
query_synthesesAdminPaginated lean synthesis rows (the answer/report nodes); filter by status, text, `since`.
record_chat_turnWorkspace userPersist one authored chat exchange (the durable, queryable artifact). Emits the `chat.recorded` lifecycle event. This does NOT change the official pro
record_memory_proposalWorkspace userPersist a pending chat-continuity proposal. It affects no persona context until explicitly approved with review_memory_proposal.
review_memory_proposalWorkspace userApprove or reject a pending continuity note with an auditable reason. Approval only changes future chat continuity, never facts or identity.
substrate_schemaAdminThe versioned substrate contract (envelope, row schemas, filters, the chat flow, the access-guard seam) — what an external automation pins to before q

taxonomy

0/4 tools
get_formAdminInspect one registered primitive form by canonical id or compatibility alias.
list_formsAdminList registered primitive forms, optionally filtered by primitive id.
list_primitivesAdminList registered Library primitives with family, icon, color and purpose metadata.
suggest_formsAdminShow the registered forms, schemas, renderers, aggregators and alias policy for one primitive.

Cloud — automations

2/5 tools
cloud_list_automationsWorkspace userList automation definitions in the active workspace.
cloud_create_automationAdminCreate or update a structured automation recipe with trigger, nodes, edges and optional settings.
cloud_configure_automationAdminSave workspace-specific settings used by scheduled and manual automation starts.
cloud_start_automationAdminStart one concrete automation run from API, MCP, CRON, email or webhook input.
cloud_get_automation_runWorkspace userFetch one automation run with its append-only event trace.