# Index

# Tools Index

Total tools: **246**.

| Tool ID | Category | HTTP | Scopes | Description |
| --- | --- | --- | --- | --- |
| `agent_blueprint.get` | `workflows` | `GET /agent-blueprints/:id` | `artifacts:read` | Fetch one agent_blueprint by id, including the full DSL content_json. The id is either a starter slug, a starter's deterministic UUID, or a tenant blueprint UUI |
| `agent_blueprint.list` | `workflows` | `GET /agent-blueprints` | `artifacts:read` | List every agent_blueprint accessible to this business: Amdahl-shipped starters (forkable recipes in code) first, then the tenant's own DB-stored blueprints. Us |
| `agent_profile.list` | `workflows` | `GET /agent-profiles` | `workflows:read` | Registered agent profiles - the specialist profiles an agent can delegate to (researcher, content_writer, orchestrator). Use when deciding whether to delegate a |
| `agent_run.get` | `workflows` | `GET /agent-runs/:id` | `workflows:read` | Fetch a single agent run by UUID, including step_data events, the full conversation log, token usage, and final status. Use when debugging an individual turn, r |
| `agent_run.list` | `workflows` | `GET /agent-runs` | `workflows:read` | List agent runs (individual turn executions) for this business, newest first. Use when rendering per-turn activity, filtering by run status (queued\|running\|co |
| `agents.backtest_blueprint` | `workflows` | `POST /agent-blueprints/:id/backtest` | `workflows:delegate` | Launch a range-sweep backtest of a saved agent_blueprint: fire a series of as-of runs across a date range at a cadence (monthly\|weekly), grouped into one sweep |
| `agents.cancel` | `workflows` | `POST /agents/:session_id/cancel` | `workflows:write` | Cancel an in-flight agent run. Use when the user wants to stop a running agent before it finishes, or abandon a run that has gone sideways. Cascades to any sub- |
| `agents.fork_blueprint` | `workflows` | `POST /agent-blueprints/fork` | `workflows:delegate` | Duplicate a starter or tenant blueprint into the caller's namespace as a new draft artifact. Use when forking an Amdahl-shipped starter to customize it, or dupl |
| `agents.preview_backtest` | `workflows` | `POST /agent-blueprints/:id/backtest/preview` | `workflows:delegate` | Dry-run a range-sweep backtest WITHOUT firing anything: given a blueprint, a date range, and a cadence (monthly\|weekly), return the ordered as-of dates the swe |
| `agents.resume` | `workflows` | `POST /agents/:session_id/resume` | `workflows:write` | Resume an agent run that is paused on pending user input. Use when replying to an outline approval prompt, a clarification question, or a continue/finish decisi |
| `agents.run_blueprint` | `workflows` | `POST /agent-blueprints/:id/run` | `workflows:delegate` | Trigger a headless run of a saved agent_blueprint on the Claude Agent SDK. Use when launching a blueprint by id with explicit inputs (optionally as a backtest v |
| `agents.start` | `workflows` | `POST /agents/run` | `workflows:delegate` | Start a new agent run. Use when delegating a bounded, heavy task to a specialist profile (content_writer, researcher) or kicking off a one-shot copilot run. Ret |
| `author_profile.get` | `context` | - | `context:read` | Fetch a single author profile by UUID, including the attached writing samples and LinkedIn scraped profiles. Use when the agent already has an id (from list or  |
| `author_profile.list` | `context` | - | `context:read` | List author profiles for this business (self, team, and external inspirational authors). Use when populating the v2 content creation Author selector, or before  |
| `authors.create` | `context` | - | `config:write` | Persist a brand-new author_profiles row for the caller's workspace. Call when the settings page collects a name (required) plus optional role title and relation |
| `authors.delete` | `context` | - | `config:write` | Permanently remove an author_profiles row owned by the caller's workspace. Call when an operator wants to retire a teammate or an external inspiration entry who |
| `authors.get` | `context` | - | `config:read` | Fetch one author_profile row joined to its writing-sample and scraped-profile junctions, returned alongside a voice ResourceStatus envelope. Read when the setti |
| `authors.linkedin_status` | `context` | - | `config:read` | Read-only polling surface for a LinkedIn scrape / refresh job. Use when a UI indicator needs to tick without risking a new enqueue — this handler never spawns w |
| `authors.list` | `context` | - | `config:read` | Enumerate every author profile registered for the caller's workspace along with per-author junction-row counts (writing samples, scraped LinkedIn profiles, voic |
| `authors.refresh_linkedin` | `context` | - | `config:write` | Idempotently re-run a LinkedIn scrape for an existing author_profile_scraped_profiles junction row, keyed by scrapedProfileId. Use when the operator wants to pu |
| `authors.regenerate_voice` | `context` | - | `config:write` | Kick off the LLM voice-analysis pipeline for one author, returning a background jobId so the UI can poll progress. Call when an operator clicks Regenerate or af |
| `authors.scrape_linkedin` | `context` | - | `config:write` | Idempotently start an async LinkedIn profile scrape and attach it to an author_profile via the author_profile_scraped_profiles junction. Use when adding a new L |
| `authors.set_scraped_profiles` | `context` | - | `config:write` | Overwrite the author's scraped-LinkedIn-profile junction rows with the provided author_name list. Invoke when the settings drawer saves a reshuffled source list |
| `authors.set_writing_samples` | `context` | - | `config:write` | Overwrite the caller's author-profile writing_samples junction with the exact array of sample UUIDs provided. Invoke when the settings page saves a reshuffled s |
| `authors.update` | `context` | - | `config:write` | Patch one or more mutable fields (name, role, relationship) on an existing author_profile row. Invoke when the settings drawer saves an edit to a teammate's tit |
| `authors.update_scraped_profile_role` | `context` | - | `config:write` | Flip the content_role on an author_profile_scraped_profiles junction row between author_voice and inspirational. Use when promoting a scraped LinkedIn profile f |
| `authors.update_writing_sample_role` | `context` | - | `config:write` | Flip the content_role on an author_profile_writing_samples junction row between author_voice and inspirational. Use when reclassifying an attached writing sampl |
| `authors.voice_status` | `context` | - | `config:read` | Return the current voice ResourceStatus for one author without spawning any new work. Use for fast-cadence polling from the settings detail drawer while a voice |
| `blueprint_backtest.get` | `workflows` | `GET /blueprint-backtests/:id` | `workflows:read` | Fetch a single range-sweep backtest by id, with its as-of points resolved against their child blueprint runs (per-point run status) and a rolled-up status summa |
| `blueprint_backtest.list` | `workflows` | `GET /blueprint-backtests` | `workflows:read` | List range-sweep backtests (each a series of as-of blueprint runs across a date range) for this business, newest first. Use when rendering the backtest-history  |
| `blueprint_output.diff` | `workflows` | `GET /blueprint-outputs/:id/diff` | `workflows:read` | Compute a line-level unified diff of a living-doc version (:id, the target) against a base version. Use for the version-diff view. Base defaults to the immediat |
| `blueprint_output.get` | `workflows` | `GET /blueprint-outputs/:id` | `workflows:read` | Fetch a single blueprint living-doc version by id, including promotion status, the kb_doc_id it serves, and provenance (source_run_id, as_of, diff_summary, qual |
| `blueprint_output.list` | `workflows` | `GET /blueprint-outputs` | `workflows:read` | List a recurring blueprint's living-doc versions for this business, newest first. Use when rendering the Versions tab, finding the current canonical (each row c |
| `blueprint_output.list_comments` | `workflows` | `GET /blueprint-outputs/:id/comments` | `workflows:read` | List a workflow living-doc version’s review threads for the Workflows Versions tab (:id is the output / knowledge_bank_documents id). Use when a reviewer opens  |
| `blueprint_run.get` | `workflows` | `GET /blueprint-runs/:id` | `workflows:read` | Fetch a single blueprint run by id, including step_states, current_step_id, tokens used, and any error message. Use when rendering an individual run timeline or |
| `blueprint_run.list` | `workflows` | `GET /blueprint-runs` | `workflows:read` | List blueprint runs (one per agent_blueprint invocation) for this business, newest first. Use when rendering the run-history timeline, filtering by blueprint_id |
| `blueprint_schedule.create` | `workflows` | `POST /agent-blueprints/:id/schedules` | `workflows:delegate` | Create a recurring CRON schedule that fires a saved agent_blueprint headlessly. An agent can call this to schedule unattended runs (e.g. "run the research-repor |
| `blueprint_schedule.delete` | `workflows` | `DELETE /blueprint-schedules/:id` | `workflows:delegate` | Delete a blueprint cron schedule by id. An agent can call this to remove a scheduled run entirely (to merely pause it, use blueprint_schedule.update with enable |
| `blueprint_schedule.get` | `workflows` | `GET /blueprint-schedules/:id` | `workflows:read` | Fetch a single blueprint cron schedule by id, including its cron, timezone, inputs, enabled flag, and last/next run bookkeeping. Use when rendering or auditing  |
| `blueprint_schedule.list` | `workflows` | `GET /blueprint-schedules` | `workflows:read` | List cron schedules (one per scheduled agent_blueprint) for this business, newest first. Use when rendering the schedules surface, filtering by blueprint_id, or |
| `blueprint_schedule.update` | `workflows` | `PATCH /blueprint-schedules/:id` | `workflows:delegate` | Update an existing blueprint cron schedule: change its cron, timezone, inputs, name, or enable/disable it. An agent can call this to retune or pause a scheduled |
| `blueprints.create` | `workflows` | `POST /agent-blueprints` | `versioning:write` | Author and save a brand-new agent_blueprint recipe for this workspace from a v1 DSL body. Use when a user composes a fresh automation in the editor (or asks cha |
| `blueprints.delete` | `workflows` | `DELETE /agent-blueprints/:id` | `versioning:write` | Archive a workspace blueprint so it drops out of the active library while staying recoverable. Use when a user removes a recipe they no longer need; the row is  |
| `blueprints.promote_output` | `workflows` | `POST /agent-blueprints/:id/promote` | `versioning:write` | Promote a blueprint version to canonical — the single served document a recurring blueprint's living doc resolves to. Use when a human reviews a proposed versio |
| `blueprints.unarchive` | `workflows` | `POST /agent-blueprints/:id/unarchive` | `versioning:write` | Bring a previously archived workspace blueprint back into the active library. Use when a user undoes a blueprint removal and wants the recipe usable again. Oper |
| `blueprints.update` | `workflows` | `PATCH /agent-blueprints/:id` | `versioning:write` | Save edits to a workspace blueprint the caller already owns. Use when a user modifies an existing recipe and persists the change. The content field is a full re |
| `blueprints.validate` | `workflows` | `POST /agent-blueprints/validate` | `versioning:write` | Dry-run a blueprint DSL body through the full authoring moat without persisting anything. Use when an editor wants author-time feedback on a draft before saving |
| `business_profile.get` | `context` | - | `config:read` | Fetch this workspace's business profile with an auto-enqueue guarantee. Returns the ResourceStatus envelope { status, data, jobId, lastUpdated, progress, error  |
| `business_profile.get_schedule` | `context` | - | `config:read` | Fetch the auto-discovery sync schedule (enabled flag, frequency weekly/biweekly/monthly, freshness threshold in days, refresh-existing-profiles toggle) for this |
| `business_profile.read` | `context` | - | `config:read` | Read the signed-in workspace's stored business profile (company, industry, ICP, content themes, and competitors) as a ResourceStatus envelope. Read when an agen |
| `business_profile.refresh` | `context` | - | `config:write` | Trigger a profile-only discovery run that rewrites the stored business profile from current web signals. Use when the operator wants to force a fresh regenerati |
| `business_profile.refresh_sources` | `context` | - | `config:write` | Kick off a full-discovery pipeline (profile regeneration plus author source inspection + scraping). Use when the operator wants to bring every discovered source |
| `business_profile.status` | `context` | - | `config:read` | Read-only polling surface for the business profile refresh job. Use when a progress indicator needs to tick without risking a new enqueue — this handler never s |
| `business_profile.update` | `context` | - | `config:write` | Patch the stored business profile with a user-edited partial payload. Use when the operator hand-corrects discovery output (company name, industry, ICP, competi |
| `business_profile.update_schedule` | `context` | - | `config:write` | Persist a new auto-discovery sync schedule for this workspace. Use when the operator toggles enabled, changes frequency between weekly / biweekly / monthly, adj |
| `company.get` | `data` | - | `data:read` | Fetch the interactions-catalog entry for a single company by name (case-insensitive exact match). Use when the agent already has a company name from input_param |
| `company.list` | `data` | - | `data:read` | List distinct company names present in this business's interactions data, ordered by name. Use when populating the v2 ICP / company-focus picker or when the age |
| `company.search` | `data` | - | `data:read` | Substring-search companies present in this business's interactions by name. Use when the user types into a company typeahead or when the agent wants to shortlis |
| `connections.connect` | `data` | `POST /connections` | `connections:write` | Establish a new integration for a workspace, routing on the connector type: collect an API key, kick off an OAuth redirect, or track a social handle. Use when a |
| `connections.disconnect` | `data` | `DELETE /connections/:id` | `connections:delete` | Disconnect one established integration by its id, scoped to the workspace. Use when a user wants to stop an integration: the source (a CRM / calls / docs connec |
| `connections.get` | `data` | `GET /connections/:id` | `connections:read` | Fetch one established integration by its id, resolved across both first-party data sources and tracked social accounts and scoped to the caller's workspace. Rea |
| `connections.get_status` | `data` | `GET /connections/:id/status` | `connections:read` | Fetch the live sync state of one integration - its normalized health, the in-flight syncing flag, the last good sync time, and any last error - without pulling  |
| `connections.list` | `data` | `GET /connections` | `connections:read` | Read every integration a workspace has actually established, newest first, merging first-party data sources and tracked social accounts into one normalized list |
| `connections.list_catalog` | `data` | `GET /connections/catalog` | `connections:read` | Read the catalog of integrations a workspace can hook up - CRM, calls, comms, docs, support, and social - with each entry's connect flow, ownership, and the dat |
| `connections.list_runs` | `data` | `GET /connections/:id/runs` | `connections:read` | Read the recent sync-run history of one integration - each run's outcome, what triggered it, when it started and finished, how many streams ran or failed, the r |
| `connections.reconnect` | `data` | `POST /connections/:id/reconnect` | `connections:write` | Restore a connection stuck in an error or needs-reauth state, in place on the existing data source so its sync history and id survive (no duplicate row). Use wh |
| `connections.update` | `data` | `PATCH /connections/:id` | `connections:write` | Rename an established connection, or set/clear its owner - the workspace member a personal source (e.g. Gmail, Outlook) belongs to. Use when a user wants to rel |
| `console.crm_mappings.get` | `configuration` | - | `config:read` | Read the business's current CRM mappings configuration: deal-stage mappings (raw CRM stage → normalized pipeline stage) and deal-amount tiers, plus version and  |
| `console.data_filters.get` | `configuration` | - | `config:read` | Read the business's current data-filter configuration: the full rules array plus version and applied_version stamps. Use when the caller needs to inspect which  |
| `console.issues_inbox.list` | `data` | - | `data:read` | List the business's issues inbox: pipeline-detected data-quality, enrichment, or signal problems surfaced for human review. Each issue has a category (e.g. unkn |
| `console.review_tasks.list` | `data` | - | `data:read` | List the pipeline's open review tasks for this business. Each task is a data-quality issue the pipeline flagged for human review: it may suggest merging identit |
| `context_entries.write` | `context` | `POST /context/entries/write` | `context_entries:write` | Create, update, or delete a persisted context entry. Use when saving, patching, or removing brand config / audience insights / campaign themes. action="create"  |
| `context_entry.get` | `context` | - | `context_entries:read` | Fetch a single persisted context entry by its type id (e.g. brand.colors, voice.default). Use when the caller already knows the entry id and wants the full blob |
| `context_entry.list` | `context` | - | `context_entries:read` | List persisted context entries (brand.colors, brand.voice_rules, voice.* profiles, etc.). Use when loading brand metadata before writing content or auditing wha |
| `context.ask` | `context` | `POST /context/ask` | `context:ask` | Get a synthesized natural-language answer over the data already gathered in the current session. An agent searches the accumulated substrate (evidence, clusters |
| `context.audience_filters` | `context` | - | `context:read` | Return the per-business audience filter options (funnel stages, account sizes, personas, industries, topics) sourced from the v2 BigQuery catalog. Use when popu |
| `context.channels` | `context` | - | `context:read` | Return the canonical channel enum (linkedin, blog, twitter, youtube, email, other) used by content_sessions.channel and the content_writer specialist's input_pa |
| `context.content_subtypes` | `context` | - | `context:read` | Return the canonical content-subtype enum (perspective, proof, execution, how_to, announcement, teardown) stored on content_sessions.content_subtype and threade |
| `context.content_types` | `context` | - | `context:read` | Return the canonical content-type enum (social, blog, thought_leadership, newsletter, case_study) recognised by the v2 pipeline and the content_writer specialis |
| `context.query_substrate` | `context` | `POST /context/substrate/query` | `context:query` | Intent-driven smart lookup over the session substrate. Returns scored/ranked evidence, clusters, and metrics tailored to an intent. Use this to retrieve grounde |
| `context.remember` | `context` | `POST /context/remember` | `context:write` | Push an external observation (web finding, user note, summary from another tool) into the session substrate so subsequent query_substrate and ask calls surface  |
| `context.review_kit` | `context` | `POST /context/review-kit` | `context_entries:read` `workflows:read` | Use after completing a blueprint run when you want to update the business's long-term context. Returns: the run's audit row (inputs/outputs/step_states/errors), |
| `context.substrate` | `context` | - | `context:read` | Session substrate counters: what the agent has learned so far in this run (record counts, entities discovered, data sources consulted). Use when debugging what  |
| `context.summary` | `context` | - | `context:read` | Business profile summary (company, voice, channel assets) aggregated from the core context tables. Use when the agent is orienting at turn 0 and needs "who am I |
| `context.time_ranges` | `context` | - | `context:read` | Return the canonical research time-range enum (last_7d, last_30d, last_90d, last_180d, last_365d, all_time, custom). Use when rendering the research-window filt |
| `conversation.get` | `conversations` | `GET /conversations/:id` | `workflows:read` | Fetch a single agent conversation by UUID along with its ordered turns (agent runs). Use when rendering chat history for a specific thread, resuming UI state af |
| `conversation.list` | `conversations` | `GET /conversations` | `workflows:read` | List agent conversations for this business, newest activity first. Use when rendering recent chat threads, a picker UI, or an audit view. Filter by status (acti |
| `conversations.create` | `conversations` | `POST /conversations` | `conversations:write` | Create a new chat conversation pinned to an agent profile. Use when starting a new multi-turn session with a specific profile (copilot, researcher, etc.). If fi |
| `conversations.turns.append` | `conversations` | `POST /conversations/:id/turns` | `conversations:write` | Append a new user message to an active conversation. Use when continuing an existing chat thread instead of starting a new one. Creates a new agent run, enqueue |
| `conversations.turns.cancel` | `conversations` | `DELETE /conversations/:id/turns/:turn_id` | `conversations:write` | Cancel an in-flight conversation turn. Use when the user hits a stop button on a running chat turn, or wants to abandon a turn that has gone sideways. Cascades  |
| `conversations.turns.resume` | `conversations` | `POST /conversations/:id/turns/:turn_id/resume` | `conversations:write` | Resume a paused conversation turn with user input. Use when the user responds to a pending-input prompt on a chat turn (outline approval, clarification, continu |
| `conversations.update` | `conversations` | `PATCH /conversations/:id` | `conversations:write` | Patch a conversation. Use when renaming a chat (title) or archiving it (status=archived). Returns the updated row. The pinned agent profile is immutable and can |
| `data.ask_sql` | `data` | `POST /data/ask` | `data:read` | Use when a caller wants SQL but does not know the schema. Takes a plain-English question plus optional prior turns and returns a read-only SELECT against the `i |
| `data.cluster_detail` | `data` | `GET /data/clusters/:cluster_id` | `data:read` | Full detail for a single pre-computed conversation cluster: label, description, insight, statistical measures (JSD, size anomaly), full feature distribution, re |
| `data.cluster_search` | `data` | `POST /data/clusters/search` | `data:read` | Semantic pattern discovery across pre-computed ML clusters from customer conversations. Use to find recurring themes, pain points, objections, competitive menti |
| `data.query` | `data` | `POST /data/query` | `data:read` | Use when the user wants a count, aggregate, or rows from the `interactions` table. Read-only SELECT, auto-scoped (never put `business_id` in WHERE). Explicit co |
| `data.schema` | `data` | - | `data:read` | Data inventory for the current business: interactions schema plus sample values, cluster availability, and knowledge base document count. Use when orienting at  |
| `data.search` | `data` | `POST /data/search` | `data:read` | Hybrid semantic + keyword search across the business knowledge base: saved research, uploaded documents, and past content outputs. Use when you need qualitative |
| `external_search_jobs.read_stream` | `workflows` | `GET /external-search-jobs/:jobId/stream` | `external_search:execute` | Read when discovering the live SSE event channel for a running external_search job spawned with subscribe_to_events=true. Returns a small JSON descriptor with t |
| `external_search.execute` | `data` | `POST /external-search/execute` | `external_search:execute` | Use when answering market / competitive / industry / topic-positioning questions. Returns a divergence_map flagging where market chatter (web+news+reddit+twitte |
| `finish` | `workflows` | - | `workflows:complete` | Signal that the task is complete. Call this as the final tool when you have finished the work. Arguments may include an optional summary and an optional artifac |
| `inspirational_reference.get` | `context` | - | `context:read` | Fetch a single inspirational reference by composite id ('writing_sample:<uuid>' or 'scraped_post:<uuid>'). Use when the agent already has the id (from list or i |
| `inspirational_reference.list` | `context` | - | `context:read` | List every writing sample + scraped post available as a structural inspirational reference for this business. Use when populating the v2 content creation Inspir |
| `inspirational_reference.search` | `context` | - | `context:read` | Substring-search writing samples and scraped posts by title + body. Use when the user asks for an inspirational reference by topic or keyword and the agent need |
| `knowledge_base.chat` | `data` | `POST /knowledge_base/chat` | `knowledge_base:read` | Ask a natural-language question against the knowledge bank and get a synthesized answer. Use when you need a composed answer drawing from multiple documents rat |
| `knowledge_base.create_comment` | `data` | `POST /knowledge-base/:id/comments` | `versioning:write` | Add a review comment to a living-doc version. Use when a reviewer replies to the agent’s rationale or opens a new thread anchored to a changed block. Pass body  |
| `knowledge_base.delete` | `data` | `DELETE /knowledge_base/documents/:id` | `knowledge_base:delete` | Remove a knowledge bank document. Use when retiring stale content from the knowledge base. Default mode is a soft archive (sets is_archived=true) so the row, st |
| `knowledge_base.diff` | `data` | `GET /knowledge-base/:id/diff` | `knowledge_base:read` | Compute a line-level unified diff of a knowledge base living-doc version (:id, the target) against a base version (defaults to the immediate predecessor; ?base= |
| `knowledge_base.get` | `data` | `GET /knowledge-base/:id` | `knowledge_base:read` | Fetch a single knowledge bank document by UUID. Use when the caller already has the document id and wants its full metadata + content markdown. Returns null whe |
| `knowledge_base.get_access` | `data` | `GET /knowledge-base/:id/access` | `knowledge_base:read` | Fetch the per-document read ACL for one knowledge bank document by UUID, scoped to this business. Read when you need to see which members and roles a restricted |
| `knowledge_base.get_content` | `data` | `GET /knowledge-base/:id/content` | `knowledge_base:read` | Fetch the converted markdown body of one knowledge bank document by UUID, scoped to this business. Read when you need the full document text itself (to quote, s |
| `knowledge_base.get_versions` | `data` | `GET /knowledge-base/:id/versions` | `knowledge_base:read` | List all versions of a knowledge base document (its version family: current, proposed, superseded), newest first, resolved from the supplied document UUID and e |
| `knowledge_base.list` | `data` | `GET /knowledge-base` | `knowledge_base:read` | List knowledge bank documents (uploads, saved research, style references) for this business. Use when enumerating documents by status, embedding_status, type, o |
| `knowledge_base.list_comments` | `data` | `GET /knowledge-base/:id/comments` | `knowledge_base:read` | List the Level 3 review threads on a living-doc version (:id, a knowledge_bank_documents id). Use when rendering the version-review panel: agent rationale comme |
| `knowledge_base.make_living` | `workflows` | `POST /knowledge_base/documents/:id/make-living` | `workflows:write` `knowledge_base:write` | Convert a static knowledge base document into a self-refreshing living doc by synthesizing a refresh workflow (an agent_blueprint) bound to the doc version grou |
| `knowledge_base.resolve_comment` | `data` | `POST /knowledge-base/:id/comments/:comment_id/resolve` | `versioning:write` | Mark a living-doc review thread resolved (or reopen it with resolved=false). Use when a reviewer finishes acting on a thread. Operates on the thread root; passi |
| `knowledge_base.search` | `data` | `POST /knowledge_base/search` | `knowledge_base:read` | Hybrid semantic + keyword search across knowledge bank chunks. Use when looking up qualitative evidence, precedent, or supporting quotes from ingested documents |
| `knowledge_base.star` | `data` | `POST /knowledge-base/:id/star` | `artifacts:write` | Pin a knowledge bank document as workspace canon. Read when reviewing reference material (messaging frameworks, brand pillars, market research) the agent should |
| `knowledge_base.unstar` | `data` | `POST /knowledge-base/:id/unstar` | `artifacts:write` | Remove a knowledge bank doc from workspace canon. Use when a previously authoritative reference (messaging deck, brand pillars) is now stale or replaced. The KB |
| `knowledge_base.update` | `data` | `PATCH /knowledge_base/documents/:id` | `knowledge_base:write` | Patch metadata on an existing knowledge bank document. Use when the user asks to rename a doc, retag a doc, archive or unarchive, edit the description or notes, |
| `knowledge_base.upload` | `data` | `POST /knowledge_base/documents` | `knowledge_base:write` | Upload a document into the business knowledge bank (PDF/DOCX/PPTX/markdown). Use when adding an asset the KB should index. Accepts base64 file_content (Datalab  |
| `metrics.evaluate` | `assets` | `POST /metrics/:id/evaluate` | `metrics:read` | Use when you need a live numeric value from a registered metric artifact. Pass metric_id; returns the freshly computed value with format and cache hit indicator |
| `notifications.email_member` | `team` | `POST /notifications/email-member` | `notifications:write` | Send an email to one or more teammates in the current workspace. Use when an automation or agent needs to notify specific workspace members - a digest, an alert |
| `notifications.list_recipients` | `team` | `GET /notifications/recipients` | `notifications:read` | Read the current workspace members you are allowed to email, as a recipient picker for sending a member notification (email + display name + user id per member) |
| `notifications.list_sends` | `team` | `GET /notifications/sends` | `notifications:read` | Read the history of emails sent to workspace members (newest first), plus a cap-aware summary of how many sends went out in the trailing hour against the per-wo |
| `notion_sync.backfill` | `data` | `POST /notion-sync/:id/backfill` | `notion_sync:write` | Trigger a full backfill of the outbound Notion sync for a connection: enqueue every current knowledge-base document for (re)mirroring into Notion. Use when firs |
| `notion_sync.configure` | `data` | `POST /notion-sync/:id/configure` | `notion_sync:write` | Configure the outbound Notion knowledge-base sync for a connection: designate the parent Notion page, provision the synced database under it, set the version +  |
| `notion_sync.get` | `data` | `GET /notion-sync/:id` | `notion_sync:read` | Fetch the outbound Notion knowledge-base sync configuration for one connection - target database, version policy, include filters, and how many documents are cu |
| `notion_sync.list_pages` | `data` | `GET /notion-sync/:id/pages` | `notion_sync:read` | List the Notion pages the connected integration can access, so a workspace can pick which one the synced knowledge-base database is created under. Read when a N |
| `notion_sync.list_sends` | `data` | `GET /notion-sync/:id/sends` | `notion_sync:read` | List the recent outbound Notion sync ledger for a connection (per-document synced / skipped / failed outcomes), newest-first, with an hourly summary. Read when  |
| `notion_sync.status` | `data` | `GET /notion-sync/:id/status` | `notion_sync:read` | Fetch the live status of an outbound Notion sync: enabled, provisioned, the connect-only provisioning state, mirrored-document count, and a recent-activity summ |
| `notion_sync.unsync` | `data` | `POST /notion-sync/:id/unsync` | `notion_sync:delete` | Tear down the outbound Notion sync for a connection: disable it and clear the mapping ledger so a later reconfigure starts clean. Use when a workspace wants to  |
| `operation.get` | `observability` | `GET /operations/:id` | `artifacts:read` | Fetch metadata for a single operation by its dotted id (e.g. data.cluster_search, artifacts.create, context.summary). Read when a tool picker needs to render th |
| `operation.list` | `observability` | `GET /operations` | `artifacts:read` | List every operation registered in the unified operation registry, grouped by namespace (data, artifacts, context, conversations, etc.). Read when authoring an  |
| `pages.archive` | `assets` | `DELETE /pages/:id` | `pages:write` | Soft-archive a page so it leaves the default library list but stays recoverable, a reversible step distinct from a permanent removal. Use when a user wants to r |
| `pages.create` | `assets` | `POST /pages` | `pages:write` | Author a new workspace page from a catalog spec: a designed UI of catalog components (plus an optional Custom sandbox node) mixing narrative, layout, and live t |
| `pages.delete` | `assets` | `POST /pages/:id/hard-delete` | `pages:delete` | Permanently remove a page so it disappears from every view, the destructive counterpart to a reversible archive. Use when a user explicitly wants a page gone fo |
| `pages.get` | `assets` | `GET /pages/:id` | `pages:read` | Fetch one page definition by its id - the TSX source, compiled module, declared data bindings, and last verification verdict - scoped to the workspace and gated |
| `pages.get_template` | `assets` | `GET /pages/templates/:slug` | `pages:read` | Fetch one Amdahl-shipped page template in full - its catalog spec, declared queries, and intent - by slug or deterministic UUID. Fetch when an author has chosen |
| `pages.list` | `assets` | `GET /pages` | `pages:read` | Read the workspace pages the caller is entitled to, newest-updated first, after dropping any the caller lacks read access to. Read when rendering the pages libr |
| `pages.list_templates` | `assets` | `GET /pages/templates` | `pages:read` | Read the catalog of Amdahl-shipped page templates - ready-to-adapt starting points (pipeline health, voice of customer, competitive battlecard) an author turns  |
| `pages.mint_embed_token` | `assets` | `POST /pages/:id/embed-token` | `pages:embed` | Mint a short-lived, token-scoped embed link for one page so it can be iframed on an external site. Use when a user or agent wants a shareable live embed of a pa |
| `pages.render` | `assets` | `POST /pages/:id/render` | `pages:read` | Execute a page's declared data bindings live for the current viewer and return the rows the host hydrates the component with, each query tenant- and access-scop |
| `pages.update` | `assets` | `PATCH /pages/:id` | `pages:write` | Revise an existing page in place: swap its catalog spec, declared queries, or metadata. Use when a user or agent wants to change what a published page renders.  |
| `pages.validate` | `assets` | `POST /pages/validate` | `pages:read` | Check a page spec through the catalog, prop, binding, and Custom-node code stages without saving it, returning every problem found in one verdict. Use when an e |
| `prompt.get` | `workflows` | `GET /prompt-fragments/:id` | `artifacts:read` | Fetch a single platform prompt fragment by id (full body included). Use when a blueprint llm step's prompt_resources references prompt://<scheme>/<id>; the runn |
| `prompt.list` | `workflows` | `GET /prompt-fragments` | `artifacts:read` | List every registered platform prompt fragment (named, version-controlled chunks of expertise that agent_blueprint llm steps can compose via prompt_resources).  |
| `prompts.artifact.compose_campaign` | `assets` | - | `artifacts:write` `data:read` `knowledge_base:read` | Use when the user asks for a multi-piece campaign (research + blog + LinkedIn) on one topic. Directs the agent to produce a parent research_report, then two chi |
| `prompts.artifact.draft_weekly_report` | `assets` | - | `data:read` `artifacts:write` | Use when the user asks to compile last week into a saved report. Directs the agent to pull a 7-day activity snapshot via data.query and then save a research_rep |
| `prompts.artifact.embed_artifact` | `assets` | - | `artifacts:write` | Use when the user asks to embed, share, or publish a single artifact on an external website. Walks the agent through flipping visibility to public AND surfacing |
| `prompts.artifact.refine_content_piece` | `assets` | - | `artifacts:read` `artifacts:write` | Use when the user wants to iterate on an existing content artifact with specific feedback. Directs the agent to read the artifact, rewrite the body against the  |
| `prompts.context.capture_competitive_intel` | `context` | - | `context_entries:write` | Use when the agent observes something about a named competitor that future sessions should remember (positioning move, pricing change, win/loss signal). Directs |
| `prompts.context.onboard_me` | `context` | - | `context:read` `data:read` `knowledge_base:read` | Use when a first-time caller asks "what can this do" or wants a guided orientation. Directs the agent to read context://summary, data://schema, and knowledge_ba |
| `prompts.context.remember_this` | `context` | - | `context:write` | Use when the user surfaces an observation from outside the normal data pipeline (web find, human note) and wants it to influence future substrate queries. Direc |
| `prompts.context.review_context` | `context` | - | `context_entries:read` | Use when the user (or an agent before starting a task) wants a health check of the context_entries long-term memory store. Directs the caller to list entries, g |
| `prompts.context.save_insight` | `context` | - | `context_entries:write` | Use when the agent discovers a stable business truth during a conversation that future sessions should remember. Directs the caller to persist the finding as a  |
| `prompts.context.state_of_business` | `context` | - | `context:read` `artifacts:read` `context:query` | Use when the user asks for a high-level current status of the business. Directs the agent to query the substrate for recent themes and read the 10 newest artifa |
| `prompts.context.update_entry` | `context` | - | `context_entries:write` | Use when an existing context_entries row needs a targeted change (new evidence, corrected fact, expanded detail). Directs the caller to read the entry first, ap |
| `prompts.conversation.conversation_recap` | `conversations` | - | `workflows:read` | Use when the user asks to recap a specific conversation (what was discussed, what was produced). Directs the agent to read conversation://<id>, walk the turns i |
| `prompts.conversation.resume_work` | `conversations` | - | `workflows:read` | Use when the user wants to pick back up a conversation that stopped mid-task or is paused. Directs the agent to read the conversation, diagnose what completed v |
| `prompts.data.account_deep_dive` | `data` | - | `data:read` | Use when the user asks for a focused briefing on a single named account or company. Produces a three-step investigation plan (interactions, sentiment, recent su |
| `prompts.data.schema_tour` | `data` | - | `data:read` | Use when the user asks "what data is available?" or is exploring a business for the first time. Directs the agent to fetch the data://schema resource, read the  |
| `prompts.data.top_companies` | `data` | - | `data:read` | Use when the user asks which companies drove the most calls or activity recently. Produces a ranked query template and summary directive the agent runs via data |
| `prompts.data.weekly_pulse` | `data` | - | `data:read` | Use when the user asks for a weekly or N-day activity snapshot across interaction types (calls, emails, meetings). Produces a histogram query template plus a su |
| `prompts.knowledge_base.brief_me` | `context` | - | `knowledge_base:read` | Use when the user wants a short RAG briefing drawn from the knowledge base on a specific topic. Directs the agent to search the KB and compose a grounded summar |
| `prompts.knowledge_base.find_playbook` | `context` | - | `knowledge_base:read` | Use when the user asks for a saved playbook, SOP, framework, or procedure on a topic. Directs the agent to search the knowledge base for playbook-style content  |
| `prompts.knowledge_base.prep_for_call` | `context` | - | `knowledge_base:read` `data:read` | Use when the user asks to prep for a call with a named account. Directs the agent to blend a KB search (prior notes, docs) with data.query (recent interactions, |
| `prompts.settings.warm_workspace` | `configuration` | - | `config:read` | Use when first orienting on a workspace (new session, new tenant, new client). Explains that the slow-to-load background pipelines — business profile discovery, |
| `prompts.system.account_prep` | `data` | - | `data:read` | Use when the user is preparing for a scheduled sales call, customer meeting, QBR, renewal review, kickoff, or exec touchpoint with a specific account. Pulls dea |
| `prompts.system.amdahl_gtm_playbook` | `data` | - | `data:read` | Use when starting ANY go-to-market task in this workspace (research, enrichment, positioning, messaging, content, sales call prep, win-loss, outbound) and you n |
| `prompts.system.competitive_positioning` | `data` | - | `data:read` | Use when the user wants to test, validate, or sharpen current positioning, value prop, or category framing — what we claim vs what buyers echo back, where the m |
| `prompts.system.getting_started` | `platform` | - | `prompts:list` | Use when a caller asks how to start or wants an overview of the 3 Amdahl MCP tools. Returns the full getting-started skill content (tool map, recommended workfl |
| `prompts.system.messaging_check` | `data` | - | `data:read` | Use when the user wants to test, refine, or audit a specific message, claim, hook, headline, or value-prop line — checking whether buyers echo it back, where it |
| `prompts.system.research_competitor` | `data` | - | `data:read` | Use when researching a specific competitor — their positioning, pricing, recent moves, market chatter, and where they show up in our own call transcripts. Pulls |
| `prompts.system.research_customer` | `data` | - | `data:read` | Use when the user names a customer, account, or prospect company and asks for context, history, recent signals, or deal stage. Pulls the external company brief  |
| `prompts.system.research_playbook` | `platform` | - | `prompts:list` | Use when the caller asks how to investigate a topic end to end using the 3-tool surface. Returns the full research playbook (routing rule, recommended flow, sub |
| `prompts.system.win_loss_analysis` | `data` | - | `data:read` | Use when the user asks about win or loss patterns, deal outcomes, why deals close or stall, or what separates closed-won from closed-lost — across all deals, a  |
| `prompts.webhook.debug_delivery` | `configuration` | - | `webhooks:read` | Use when the user reports trouble with a specific webhook subscription and wants a delivery diagnosis. Directs the agent to fetch the webhook config, pull recen |
| `prompts.webhook.webhook_health_check` | `configuration` | - | `webhooks:read` | Use when the user asks for a health check across webhook subscriptions. Directs the agent to list every webhook, pull recent failed deliveries for each, and pro |
| `read_resource` | `platform` | `GET /resources` | `artifacts:read` | Read any resource by URI. URIs follow <scheme>://<path>[?query]. Schemes: artifact, conversation, agent_run, agent_profile, context, context_entry, knowledge_ba |
| `reference_document.list` | `context` | - | `knowledge_base:read` | List documents eligible as content-creation reference material. Use when populating the v2 Reference Documents picker or when the agent needs a shortlist before |
| `retrieve_scratchpad` | `workflows` | - | `workflows:read` | Read a slot from the session scratchpad. Scratchpad slots are populated by prior tool calls when the output was too large to inline. Use when you need a full tr |
| `social.connect_account` | `data` | `POST /social/connections` | `data:write` | Save an already-verified social account as a tracked social connection for the tenant. Use when the user has confirmed the right profile (typically right after  |
| `social.create_subject` | `data` | `POST /social/subjects` | `data:write` | Create a tracked subject - a person or org you follow - that groups one or more social handles under one identity. Use when the user wants to start tracking som |
| `social.delete_subject` | `data` | `DELETE /social/subjects/:id` | `data:write` | Delete a tracked subject by id. Use when the user wants to stop tracking a person/org as a grouped identity. The social connections grouped under it are kept -  |
| `social.disconnect_account` | `data` | `DELETE /social/connections/:id` | `data:write` | Stop tracking a social account by removing its social connection (soft delete: the row is kept for audit but no longer synced or listed). Use when the user want |
| `social.get_connection` | `data` | `GET /social/connections/:id` | `data:read` | Fetch a single tracked social account (social connection) by its id for the tenant. Use when you already have a connection id and need its current details — han |
| `social.get_metric_trend` | `data` | `GET /social/connections/:id/trend` | `data:read` | Read a bucketed metric trend for one tracked social account: the follower series over time (scope=connection, default) or a single post's engagement trajectory  |
| `social.get_metrics_summary` | `data` | `GET /social/connections/:id/summary` | `data:read` | Read aggregate stats for one tracked social account: current followers + growth over the window (both null when the channel does not expose followers — LinkedIn |
| `social.get_portfolio_summary` | `data` | `GET /social/summary` | `data:read` | Read aggregate stats across every active tracked account in the tenant: total followers + growth (null when no in-scope connection reports followers — LinkedIn  |
| `social.get_subject` | `data` | `GET /social/subjects/:id` | `data:read` | Read a single tracked subject by id for the tenant, with the social handles grouped under it. Read when you have a subject id and need its details - relationshi |
| `social.get_subject_summary` | `data` | `GET /social/subjects/:id/summary` | `data:read` | Read aggregate stats across every social handle grouped under a tracked subject: total followers (null when no handle reports a count), total engagement, post c |
| `social.link_handle` | `data` | `POST /social/subjects/:subject_id/link` | `data:write` | Group a tracked social connection under a subject by linking it - e.g. attach a person's X account to the subject that already holds their LinkedIn. Use when co |
| `social.list_channel_capabilities` | `data` | `GET /social/capabilities` | `data:read` | Read the per-channel capability map: for each supported social channel (X / Twitter, LinkedIn), which entities (post / profile) it reports on and which metric k |
| `social.list_connections` | `data` | `GET /social/connections` | `data:read` | Return every tracked social account (social connection) for the tenant, newest first, excluding ones that have been disconnected. Use when the user wants to see |
| `social.list_post_metrics` | `data` | `GET /social/connections/:id/metrics` | `data:read` | Read the latest engagement snapshot per post for one tracked social account: likes, reposts, replies, quotes, bookmarks, and views, newest post first, capped at |
| `social.list_subjects` | `data` | `GET /social/subjects` | `data:read` | Read every tracked subject for the tenant, newest first - the people and orgs being followed, each with the social handles grouped under it. Read when showing w |
| `social.refresh_connection` | `data` | `POST /social/connections/:id/refresh` | `data:write` | Kick off a background metrics refresh for one tracked social account: ask amdahl-data to sync its source now and return immediately with a syncing acknowledgeme |
| `social.unlink_handle` | `data` | `POST /social/subjects/:subject_id/unlink` | `data:write` | Ungroup a social connection from its subject by clearing the link - the reverse of linking a handle. Use when a handle was grouped under the wrong subject, or t |
| `social.update_connection` | `data` | `PATCH /social/connections/:id` | `data:write` | Update a tracked social account (social connection) in place: set or clear its nickname, pause or resume tracking, and/or set the per-connection lookback window |
| `social.update_subject` | `data` | `PATCH /social/subjects/:id` | `data:write` | Patch a tracked subject - rename it, retag internal/external, set or clear the workspace member it represents, edit notes or the CRM link. Use when subject deta |
| `social.verify_connection` | `data` | `POST /social/verify` | `data:read` | Resolve a social handle to its live account plus most recent post, or a typed reason it couldn't be confirmed (not_found / no_posts / private / provider_error). |
| `step_kind.get` | `workflows` | `GET /step-kinds/:id` | `artifacts:read` | Fetch metadata for a single step kind by id (tool / llm / loop / branch / parallel / blueprint / transform / assert). Use when rendering a single canvas node or |
| `step_kind.list` | `workflows` | `GET /step-kinds` | `artifacts:read` | List every step kind the agent_blueprint DSL supports (tool, llm, loop, branch, parallel, blueprint, transform, assert). Use when authoring or visualizing a blu |
| `system.list_prompts` | `platform` | `GET /prompts` | `prompts:list` | Enumerate author-blessed prompt templates the current caller can invoke. Each entry carries a name, description, optional scheme (namespace prefix), and optiona |
| `system.use_prompt` | `platform` | `POST /prompts/use` | `prompts:use` | Invoke an author-blessed prompt template by name. The response is a messages array (role + content pairs) you can fold into subsequent reasoning, like expert gu |
| `team.add_domain` | `team` | - | `team:write` | Register a new unverified domain for the caller's business so verified-domain users can self-join. Use when an admin wants to onboard a whole company by domain  |
| `team.get_settings` | `team` | - | `team:read` | Read every allowlisted team setting for the caller's business (e.g. require_invite). Use when rendering the team settings page or deciding whether domain auto-p |
| `team.invite` | `team` | - | `team:write` | Create a pending magic-link invitation for a new teammate. Use when inviting someone by email to join the workspace. Persists a business_invitations row with a  |
| `team.list_domains` | `team` | - | `team:read` | List every verified and pending domain for the caller's business, newest first. Use when rendering the domains panel in team settings, deciding whether "Ask Amd |
| `team.list_invitations` | `team` | - | `team:read` | List pending, accepted, expired, or revoked invitations for the caller's business. Use when rendering the team settings invitations panel or auditing who has be |
| `team.list_members` | `team` | - | `team:read` | List every member of the caller's business with display name, email, and role. Use when rendering the team settings page, deciding whether the caller is the las |
| `team.remove_domain` | `team` | - | `team:delete` | Delete a domain row from the caller's business so future signups with that email domain stop auto-joining. Use when an admin is rotating their primary domain or |
| `team.remove_member` | `team` | - | `team:delete` | Remove a member from the caller's business. Use when revoking access for someone who left the team. Refuses self-removal (a dedicated "leave business" flow cove |
| `team.resend_invitation` | `team` | - | `team:write` | Rotate a pending invitation's token, reset expires_at to seven days out, and return the refreshed row so the REST handler can re-send the magic-link email. Use  |
| `team.revoke_invitation` | `team` | - | `team:delete` | Soft-delete a pending invitation so the magic-link stops working. Use when an invited person no longer needs access or the admin sent to the wrong email. Sets s |
| `team.update_member_role` | `team` | - | `team:write` | Change a business member's role between admin and member. Use when promoting a teammate to admin or demoting an admin. Enforces three server-side rules: the tar |
| `team.update_settings` | `team` | - | `team:write` | Patch one or more allowlisted team settings (e.g. require_invite) for the caller's business. Use when an admin changes domain auto-provisioning behavior or othe |
| `trigger_kind.get` | `workflows` | `GET /trigger-kinds/:id` | `artifacts:read` | Fetch metadata for a single trigger kind by id (manual / schedule / event / webhook). Use when rendering a single trigger configuration card. Returns null when  |
| `trigger_kind.list` | `workflows` | `GET /trigger-kinds` | `artifacts:read` | List every trigger kind the agent_blueprint DSL supports (manual today; schedule/event/webhook in later waves). Use when authoring or visualizing a blueprint to |
| `voice_profile.get` | `context` | - | `context:read` | Fetch a single author's voice profile by UUID, including the cached voice analysis blob (vocabulary, personality, syntax) and sample counts. Use when the agent  |
| `voice_profile.list` | `context` | - | `context:read` | List author voice profiles available to this business. Use when populating the content creation voice selector or when the agent needs to pick a cached voice by |
| `webhook.get` | `configuration` | - | `webhooks:read` | Fetch a single webhook subscription by UUID. Use when the caller knows the subscription id and wants its configuration (URL, event filters, status). Secrets are |
| `webhook.list` | `configuration` | - | `webhooks:read` | List outbound webhook subscriptions for this business. Use when auditing registered subscriptions or checking which endpoints the platform currently fans events |
| `webhook.list_deliveries` | `configuration` | - | `webhooks:read` | List delivery attempts for a specific webhook subscription. Use when debugging failures, inspecting retry history, or confirming that recent events reached the  |
| `webhooks.test_fire` | `platform` | `POST /webhooks/:id/test` | `webhooks:write` | Fire a signed test delivery at a webhook destination and return the captured response. Use when verifying connectivity to a new subscription, debugging signatur |
| `webhooks.write` | `platform` | `POST /webhooks/write` | `webhooks:write` | Create, update, or delete a webhook subscription. Use when registering a new destination, changing URL / event list / description / active, or removing a subscr |
| `workspaces.add_member` | `team` | - | `workspaces:write` | Add someone to a workspace by user id or email. Use when an admin is bringing a teammate onto the tenant directly (no invitation round-trip). By email, a new ac |
| `workspaces.create` | `team` | - | `workspaces:write` | Spin up a brand-new workspace owned by the caller, who becomes both its owner and founding admin in one atomic step. Use when a user is starting a fresh tenant. |
| `workspaces.delete` | `team` | - | `workspaces:write` | Soft-delete a workspace, retiring the whole tenant. Use when the owner is shutting it down for good. Only the workspace owner may call this (an admin who is not |
| `workspaces.get` | `team` | - | `workspaces:read` | Fetch one workspace by id along with the caller's role in it (owner, admin, editor, or viewer). Read when you need a single workspace's name, slug, avatar, and  |
| `workspaces.join_by_domain` | `team` | - | `workspaces:write` | Join a workspace that your verified email domain is allowed to self-join. Use when a signed-in user picks a workspace from their domain-eligible list (post-sign |
| `workspaces.leave` | `team` | - | `workspaces:write` | Remove the calling user from a workspace they belong to. Use when someone is leaving a tenant of their own accord. Any member may leave, except the owner, who i |
| `workspaces.list` | `team` | - | `workspaces:read` | List every workspace the calling user belongs to, each with the caller's role and an owner flag. Read when rendering a workspace switcher or deciding which tena |
| `workspaces.list_joinable_by_domain` | `team` | - | `workspaces:read` | List workspaces the calling user may self-join because their verified email domain is claimed by the workspace and it opted into domain join. Read when renderin |
| `workspaces.remove_member` | `team` | - | `workspaces:write` | Remove a member from a workspace by user id. Use when an admin is removing a teammate from the tenant. The workspace owner is protected and cannot be removed (t |
| `workspaces.transfer_ownership` | `team` | - | `workspaces:write` | Hand a workspace to another existing member, who is promoted to admin and becomes the new owner. Use when the current owner is stepping down or handing the tena |
| `workspaces.update` | `team` | - | `workspaces:write` | Patch a workspace's display name, avatar image, and avatar background color. Use when an admin renames the workspace, sets its logo, or picks the background col |
| `workspaces.update_member_role` | `team` | - | `workspaces:write` | Set a workspace member to admin or member. Use when promoting a teammate to admin or stepping one back down. The workspace owner is pinned as an admin and canno |
| `writing_samples.archive` | `context` | - | `config:write` | Soft-archive or restore one writing sample by flipping platform_artifacts.status between archived and draft. Use when an operator wants to hide a sample from th |
| `writing_samples.create` | `context` | - | `config:write` | Ingest one new writing sample into the caller's workspace. Invoke when an operator pastes or uploads a piece of reference prose that should inform author voice  |
| `writing_samples.delete` | `context` | - | `config:write` | Permanently remove one writing sample owned by the caller's workspace. Call when an operator retires a sample that is no longer representative of an author's vo |
| `writing_samples.get` | `context` | - | `config:read` | Load one writing_samples row by UUID, scoped to the caller's workspace. Fetch when the settings page opens a sample detail drawer or a split-proposal preview an |
| `writing_samples.list` | `context` | - | `config:read` | Enumerate every writing_samples row for the caller's workspace, optionally filtered by author_id (via junction), content_type, channel, or archive status, and r |
| `writing_samples.propose_split` | `context` | - | `config:write` | Ask Claude to decompose a long prose document into coherent candidate writing samples so the operator can review and persist the useful ones individually. Invok |
| `writing_samples.update` | `context` | - | `config:write` | Apply a partial patch to one writing sample row (content body, title, channel, content_type, source_url, sort_order). Call when an editor corrects metadata from |
