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
Surface81 workspace-user · 275 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 user81 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.

Admin275 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

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

Plan engine

8/18 tools
add_taskAdminInsert a task into the plan (shape the breadth): bucket analyze|act|verify, a capability tag, consumes (DAG edges), optional gates. Returns the create
assess_progressAdminRecord 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
checkpoint_stepWorkspace userAppend a completed step (task_id, bucket, key, evidence ids, 1-line summary) to the journal.
complete_taskAdminMark a ready task done. Verify tasks are gate-checked (breadth + gate judgment + artifacts/ sessions) and rejected until satisfied.
export_plan_mdAdminRender the plan as a human-readable, bucketed plan.md (analyze/act/verify + status + gates).
finish_runWorkspace userMark the run finished/stopped.
get_planWorkspace userThe project's research plan (analyze/act/verify task DAG + evidence refs + judgments).
inject_workAdminTurn 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_evidenceAdminAttach 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
record_critic_roundAdminLog one completeness-critic round on the run (loop-until-dry observability).
record_frameAdminDischarge an ANALYZE frame task: author research questions + hypotheses grounded in cited persona memory (>=1 question + >=1 memory_ref). Understand b
run_journalAdminThe 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, next_action, directive} → spawn
start_projectWorkspace userTHE ENTRY POINT. Create a project + seed its research plan (methodology -> analyze/act/verify scaffolding; none -> one dischargeable root frame task);
start_runWorkspace userCreate (or resume) the run object — the SINGLE entry to the governed loop. Returns the run + its journal; pass an existing run_id to resume (idempoten

Councils

18/28 tools
add_artifactWorkspace userBring 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_synthesisWorkspace userExport a report (synthesis). format: `md`|`json` returned inline · `pdf`|`pptx` rendered as a presentation-grade file and attached to the owning proje
export_synthesis_htmlWorkspace userExport 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

0/14 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).
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

0/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_sessionAdminOne recorded usability session by id — the full replayable trace (steps + outcome + statements).
list_usability_sessionsAdminList recorded usability sessions, optionally filtered by project, persona and/or subject ({kind?, id?|url?}).
record_usability_sessionAdminPersist a host-authored usability session — the durable, REPLAYABLE trace (the session is the deliverable). `steps` is the ordered dual timeline: {ind
suggest_friction_levelsAdminThe 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

7/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_surveyWorkspace userRender 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/17 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 userDelete a persona + all its persona-scoped rows and rendered SOUL/avatar files.
delete_research_projectAdminDelete a project container + its edges/open-questions. Syntheses (incl. reports) are kept.
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.
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).
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

0/12 tools
get_job_presetAdminOne 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_presetsAdminThe 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_methodologyAdminThe 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

0/13 tools
brief_nextAdminGATHER 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_frameworkAdminOne Framework's plain-language description by stable id (e.g. 'double_diamond'): {id, name, what, when, stages:[{id, name, what}]}. The structured com
get_methodologyAdminThe full constellation spec for one methodology (steps, tags, consumes, produces, requires).
list_frameworksAdminThe 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_methodologiesAdminList available methodologies (built-in + user-defined) and their step keys.
park_evidenceAdminExplicitly park evidence that should remain visible but should NOT flow into a downstream gate/decision. Use this instead of leaving produced evidence
record_judgmentAdminRecord 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_methodologyAdminBind 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_methodologiesAdminSUGGESTED 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.

Personas

9/13 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.
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
export_personaAdminExport one persona (profile + SOUL/memory) as json/markdown.
generate_avatarWorkspace userGenerate (or regenerate) the persona's avatar image — needs OPENAI_API_KEY. Without the key this degrades gracefully (in-band note, no error).
get_personaWorkspace userFull persona record + recent calendar/experience/pain points.
get_persona_soulAdminThe persona's SOUL.md (authoritative identity + grown drift).
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
prepare_persona_agent_contextWorkspace userBuild the launch context for a persona subagent (SOUL + state + recent events).
record_personaWorkspace userValidate + persist the persona profile you authored from brief_persona. This is the create path (no server-side text generation).
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_comfortAdminThe 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 patch to a persona's profile; records a revision with the reason. A `capabilities` patch ({rungs:{see,walk,drive,login}, tech_co

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

2/30 tools
brief_consolidationAdminGATHER a simulated day + known entities. Returns instructions for you to author memory_deltas (entities/facts/threads/event_links); then record_memory
brief_dayAdminGATHER 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_digestAdminGATHER a period for a consolidated digest (replaces hardcoded reflections).
brief_monthAdminGATHER context to author a whole month bundle (period plan + sample days + digest), chained on the prior month. Then record_month_bundle.
brief_periodAdminGATHER 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
extract_pain_pointsAdminSurface a persona's pain-point observations over a date range.
get_activityAdminFetch one simulated activity (block) by id.
get_calendarAdminA persona's calendar events for one day.
get_calendar_periodAdminA 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_stateAdminA 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_memoryAdminRender + return MEMORY.md: active projects (timelines), open threads, 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_digestAdminPersist + embed the digest you authored from brief_digest.
put_period_planAdminPersist 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_dayAdminPersist 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_deltasAdminPersist host-authored memory deltas: resolves/dedupes entities, writes bi-temporal facts (invalidating superseded status), opens/resolves threads, lin
record_month_bundleAdminPersist 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_periodAdminGather a persona's experience over a date range (optional lens) for summarisation.

Evaluation

4/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_criticAdminGATHER a computed exhaustiveness snapshot for an INDEPENDENT critic: coverage + the generative breadth_candidates (segments/angles/concepts/risks/fide
brief_eval_criticAdminGATHER 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_fullAdminCombined '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_criticAdminPersist the independent critic verdict {scores, passed, missing[{kind,what,why, suggested_action}], rationale, evidence_refs}. Honesty gate: cannot be
record_eval_criticAdminPersist 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.

assets

0/6 tools
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_assetAdminOne asset record (by id or filename) — includes the text excerpt for documents.
list_assetsAdminEvery 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_assetAdminLOOK 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

2/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_exampleWorkspace userLoad 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

0/4 tools
brief_flow_walkthroughAdminGATHER 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_funnelAdminThe segment funnel of one flow: per step entered/continued/dropped with the drop reasons, the dropping personas and the step captions — where the coho
list_flowsAdminEvery defined flow on a project (id, title, step count).

grounding

0/7 tools
brief_groundingAdminGather 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_groundingAdminPersist 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

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

3/10 tools
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_chatAdminOne chat with its full turn history.
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_chatsAdminPaginated lean chat rows (newest first), optionally scoped to one persona.
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.
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

5/5 tools
cloud_list_automationsWorkspace userList automation definitions in the active workspace.
cloud_create_automationWorkspace userCreate or update a structured automation recipe with trigger, nodes, edges and optional settings.
cloud_configure_automationWorkspace userSave workspace-specific settings used by scheduled and manual automation starts.
cloud_start_automationWorkspace userStart 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.