Docs

Tool Catalog

Every Operation registered with the platform, grouped by resource prefix. Agents see these descriptions verbatim at inference time, so the wording here is what drives tool selection. See agents-architecture.md for how the shared base prompt teaches every profile to match intent against these descriptions.

Total tools: 246.

Groups

Agent Blueprint (agent_blueprint.*)

2 tools.

agent_blueprint.get

Get Agent Blueprint

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 UUID; the reader checks code-defined starters first, then falls through to a DB lookup. Use when inspecting steps + declared inputs of a specific recipe. Recipes for reference; walk steps yourself using primitives. Direct execution from MCP is not exposed; see SERVER_INSTRUCTIONS for the rule. Returns null when nothing matches.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

agent_blueprint.list

List Agent Blueprints

List every agent_blueprint accessible to this business: Amdahl-shipped starters (forkable recipes in code) first, then the tenant's own DB-stored blueprints. Use when discovering which workflow recipes are available to read, fork, or compose. Recipes for reference; walk steps yourself using primitives. Direct execution from MCP is not exposed; see SERVER_INSTRUCTIONS for the rule. Each entry carries is_starter + authored_by. Fetch the full DSL via agent_blueprint://<id>.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Agent Profile (agent_profile.*)

1 tool.

agent_profile.list

List Agent Profiles

Registered agent profiles - the specialist profiles an agent can delegate to (researcher, content_writer, orchestrator). Use when deciding whether to delegate a task and to which profile, or when planning a multi-step content or research task. Returns id, name, description, producesArtifactType, and inputParamsSchema per profile; the schema tells the caller exactly which input_params keys the profile consumes.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Agent Run (agent_run.*)

2 tools.

agent_run.get

Get Agent Run

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, rendering tool traces, or auditing an agent trace. Returns null when the run does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

agent_run.list

List Agent Runs

List agent runs (individual turn executions) for this business, newest first. Use when rendering per-turn activity, filtering by run status (queued|running|complete|error|canceled), a specific profile_id, or a user_id. Returns lean summaries; call agent_run://<id> for the full row.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Agents (agents.*)

7 tools.

agents.backtest_blueprint

Backtest Blueprint Over a Range

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. Use when an operator wants to see how a blueprint would have performed over time, optionally cumulative (each run seeds off the prior). Every run is forced read-only. Returns the backtest_id; poll blueprint_backtest://<id> for progress.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.cancel

Cancel Agent Session

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 spawned from this run via agents.start — every live descendant is cancelled atomically. The runner bails at the next iteration boundary after observing the status change. Already-completed runs cannot be canceled. Pass a reason to record WHY the run was aborted in the audit trail.

  • Required scopes: workflows:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.fork_blueprint

Fork Agent Blueprint

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 duplicating an existing tenant blueprint as a versioned variant. Source is either a starter slug (e.g. plan-and-draft-window), a starter's deterministic UUID, or a tenant blueprint UUID. Returns the new artifact id. Forks start at version 1.0.0, status draft, visibility private; promote via artifacts.update when ready.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.preview_backtest

Preview Backtest Sweep

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 sweep would run at plus the count and cap signals. Use when rendering the Run modal cost-preview so the operator confirms N before launching. Nothing is written and no runs are created.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.resume

Resume Agent Session

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 decision. The input payload must match the run's pending_input_schema. After a successful resume the run transitions back to running and proceeds from where it paused.

  • Required scopes: workflows:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.run_blueprint

Run Agent Blueprint

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 via as_of). The platform runs it out-of-process: the operation validates the blueprint, opens a blueprint_runs audit row, fires the runner asynchronously, and returns the blueprint_run_id plus a preview of the rendered prompt. Poll blueprint_run://<id> (GET /blueprint-runs/:id) or the SSE stream for progress + outputs.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

agents.start

Start Agent Session

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. Returns a session id (run id) plus the underlying ephemeral conversation id. Poll agents.status or subscribe to SSE to monitor progress. Set async=false to block up to 60s. For multi-step content composition, read the matching blueprint recipe and perform its steps. For multi-turn chat, prefer conversations.* tools.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

Author Profile (author_profile.*)

2 tools.

author_profile.get

Get Author Profile

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 input_params) and wants the richer detail view. Every writing-sample + scraped-profile entry in the response carries its content_role enum (author_voice | inspirational) so the settings UI can render per-association toggles without a second fetch. Returns null when not found or when the profile belongs to a different business.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

author_profile.list

List Author Profiles

List author profiles for this business (self, team, and external inspirational authors). Use when populating the v2 content creation Author selector, or before calling content_writer. Accepts voice_only=true to hide external-only profiles. Each profile carries writing_samples + scraped_profiles arrays; every entry includes its content_role (author_voice | inspirational).

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Authors (authors.*)

14 tools.

authors.create

Create Author Profile

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 relationship tag (self | team | external). Voice regeneration does NOT run at creation time — attach writing samples or scraped LinkedIn profiles first, then open the detail drawer to trigger the async voice learning pipeline.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.delete

Delete Author Profile

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 whose voice should no longer drive content. Junction rows on author_profile_writing_samples and author_profile_scraped_profiles cascade via foreign-key ON DELETE; the legacy nullable author_id on writing_samples and scraped_posts is left behind with NULL. Destructive — UI should prompt for confirmation first.

  • Required scopes: config:write
  • Required role: admin
  • Category: context
  • Stability: stable

authors.get

Get Author Profile With Voice Status

Fetch one author_profile row joined to its writing-sample and scraped-profile junctions, returned alongside a voice ResourceStatus envelope. Read when the settings Authors tab opens a detail drawer. If the author has samples attached but no cached voice and no in-flight regen, this reader auto-enqueues a voice_regen job — the caller immediately polls voice_status. Returns null author when the id is missing or cross-tenant.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

authors.linkedin_status

Poll LinkedIn Scrape Job Status

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 work. Returns the { linkedin_scrape: ResourceStatus<ScrapedProfileRow> } envelope; when status=ready, data carries the resolved author_profile_scraped_profiles junction row (including content_role). When status=loading, progress carries the staged worker message ("Scraping", "Extracting", "Persisting").

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

authors.list

List Author Profiles With Counts

Enumerate every author profile registered for the caller's workspace along with per-author junction-row counts (writing samples, scraped LinkedIn profiles, voice-vs-inspirational breakdowns). Read when rendering the settings Authors tab list view or picking an author UUID before a subsequent PATCH/DELETE. Response is a flat array sorted alphabetically by name; empty when nothing is registered yet.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

authors.refresh_linkedin

Refresh LinkedIn Profile Scrape

Idempotently re-run a LinkedIn scrape for an existing author_profile_scraped_profiles junction row, keyed by scrapedProfileId. Use when the operator wants to pull fresh posts for a LinkedIn profile already attached to an author. Dedup on (scrapedProfileId, authorId): returns 'already_running' when a refresh is in flight. Uses a 14-day lookback and preserves the existing content_role.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.regenerate_voice

Regenerate Author Voice Profile

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 after a fresh sample lands. Idempotent on (businessId, authorId): a second invocation while an earlier job is pending or in_progress returns the original jobId with status='already_running'. The summary lands on cached_voice_profile — callers poll voice_status, never receive it here.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.scrape_linkedin

Scrape LinkedIn Profile for Author

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 LinkedIn author_voice source to a team author. Dedup key is (businessId, authorId, url): returns 'already_running' with the existing jobId if the same scrape is in flight. The junction row lands with content_role=author_voice after the linkedin-scrape worker finishes.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.set_scraped_profiles

Replace Author Scraped Profile Associations

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. author_name is the identifier because scraped posts predate junction UUIDs. Names with zero scraped_posts in the workspace are rejected with code=unknown_profile so a voice profile never lands without training data. Rows persist under content_role=author_voice; scraped_posts.author_id is dual-written.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.set_writing_samples

Replace Author Writing Sample Associations

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 sample list for one author — the op clears existing rows and inserts replacements under content_role=author_voice (author associations are voice-only by design). Sample ids belonging to another business are rejected with code=cross_business. Dual-writes the legacy writing_samples.author_id column.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.update

Update Author Profile Fields

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 title or reclassifies someone from external inspiration to team voice source. At least one of name / role / relationship must be present in the payload; an empty patch is rejected up-front with a 400 rather than silently succeeding.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.update_scraped_profile_role

Update Scraped Profile Content Role

Flip the content_role on an author_profile_scraped_profiles junction row between author_voice and inspirational. Use when promoting a scraped LinkedIn profile from an inspirational reference into an active author_voice source, or demoting back. Only the content_role column is mutated. Returns structured codes: invalid_content_role (400), not_found (404).

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.update_writing_sample_role

Update Writing Sample Content Role

Flip the content_role on an author_profile_writing_samples junction row between author_voice and inspirational. Use when reclassifying an attached writing sample between a voice training sample and a structural inspirational reference. Only the content_role enum is mutated; the author ↔ sample pairing is unchanged. Returns structured codes: invalid_content_role (400), not_found (404).

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

authors.voice_status

Poll Author Voice Regen Status

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_regen job is in flight. Response carries status ∈ {loading, ready, failed}, the underlying jobId when a worker is active, the last-updated timestamp, progress text when the worker has emitted a stage marker, and data=cached_voice_profile when status is ready.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Blueprint Backtest (blueprint_backtest.*)

2 tools.

blueprint_backtest.get

Get Backtest Sweep

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 summary. Use when rendering a sweep progress timeline or auditing a finished backtest. Returns null when the sweep does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

blueprint_backtest.list

List Backtest Sweeps

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 list, filtering by blueprint_id, or auditing past sweeps by status. Returns lean sweep rows; fetch blueprint_backtest://<id> for the per-point run rollup.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Blueprint Output (blueprint_output.*)

4 tools.

blueprint_output.diff

Diff Blueprint Output Versions

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 immediate predecessor; pass ?base=<version_id> for a specific version or ?base=current for the promoted current. Returns hunks (context + add/remove lines, word-level segments on edits), +/- stats, a truncated flag, and base_missing=true for v1. Returns null when the target is missing or cross-business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: beta

blueprint_output.get

Get Blueprint Output

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, quality_score, promoted_by/at). Use when rendering a version detail or the promote confirmation. Returns null when the version does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: beta

blueprint_output.list

List Blueprint Outputs

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 carries is_canonical), or auditing what was produced and when. Filter by blueprint_id. Returns lean version rows; fetch blueprint_output://<id> for full provenance.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: beta

blueprint_output.list_comments

List Blueprint Output Version Comments

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 a version diff and wants the agent’s per-edit rationale plus teammate replies as resolvable threads, with the persisted block anchors. The workflows:read counterpart of knowledge_base://<id>/comments; identical data + ACL.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: beta

Blueprint Run (blueprint_run.*)

2 tools.

blueprint_run.get

Get Blueprint Run

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 auditing a finished run. Returns null when the run does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

blueprint_run.list

List Blueprint Runs

List blueprint runs (one per agent_blueprint invocation) for this business, newest first. Use when rendering the run-history timeline, filtering by blueprint_id, or auditing past runs by status (queued|running|complete|error|canceled). Returns lean rows; fetch blueprint_run://<id> for the full step_states + tokens.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Blueprint Schedule (blueprint_schedule.*)

5 tools.

blueprint_schedule.create

Create Blueprint Schedule

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-report blueprint every Monday at 9am"). Provide the blueprint id, a cron expression, optional timezone (default UTC), inputs, and name; the platform validates the blueprint + cron, stores the schedule, and fires a headless run on each tick. Returns the created schedule (manage existing ones via blueprint_schedule.list/get/update/delete).

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprint_schedule.delete

Delete Blueprint Schedule

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 enabled:false). Returns success, or not_found if it does not exist in this business.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprint_schedule.get

Get Blueprint Schedule

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 one schedule. Returns null when the schedule does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

blueprint_schedule.list

List Blueprint Schedules

List cron schedules (one per scheduled agent_blueprint) for this business, newest first. Use when rendering the schedules surface, filtering by blueprint_id, or showing only enabled/disabled schedules. Returns the schedule rows plus total/limit/offset.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

blueprint_schedule.update

Update Blueprint Schedule

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 run. A cron/timezone change is re-validated before it is saved. Returns the updated schedule, or not_found if it does not exist in this business.

  • Required scopes: workflows:delegate
  • Required role: editor
  • Category: workflows
  • Stability: stable

Blueprints (blueprints.*)

6 tools.

blueprints.create

Create Blueprint

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 chat to draft one) and wants it persisted. The body runs through the full authoring moat — schema, step-id uniqueness, reference resolution, sub-blueprint cycle detection, tool-allowlist format — before any row is written; failures return a structured validation_failed list. Starters are read-only; fork one to base a recipe on it.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprints.delete

Delete Blueprint

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 soft-deleted (hidden, reversible) rather than destroyed. Reverse it later with the unarchive op. Code-shipped starters cannot be archived; permanent removal of a tenant blueprint goes through the generic artifact delete path.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprints.promote_output

Promote Blueprint Output

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 version and publishes it: the prior canonical is superseded and archived out of retrieval, the chosen version becomes the citable doc, and the event is stamped with who/when. Name the target by output_id (a registered version) or kb_doc_id (a raw/out-of-band doc, registered on the fly). Promotion is human-gated by design.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: beta

blueprints.unarchive

Unarchive Blueprint

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. Operates only on tenant-owned rows that are currently archived; code-shipped starters have no archive state to restore.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprints.update

Update Blueprint

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 replacement body re-checked through the authoring moat; title, description, status, tags, and metadata patch the surface row. Code-shipped starters reject — fork them first. A slug collision returns code slug_conflict with the conflicting artifact id for inline field UX.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

blueprints.validate

Validate Blueprint

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 — the response lists schema errors, duplicate step ids, unresolvable references, sub-blueprint cycles, and tool-allowlist format problems, with an overall valid flag. Nothing is written to the workspace.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: workflows
  • Stability: stable

Business Profile (business_profile.*)

8 tools.

business_profile.get

Get Business Profile

Fetch this workspace's business profile with an auto-enqueue guarantee. Returns the ResourceStatus envelope { status, data, jobId, lastUpdated, progress, error }. If the profile is missing and no refresh is already running, a discovery job is enqueued and status='loading' with the fresh jobId is returned. Safe to poll — the handler never spawns duplicate jobs.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

business_profile.get_schedule

Get Business Profile Sync Schedule

Fetch the auto-discovery sync schedule (enabled flag, frequency weekly/biweekly/monthly, freshness threshold in days, refresh-existing-profiles toggle) for this workspace. Use when rendering the Sync Schedule settings page or deciding whether a cron run should skip. Pure read — no side effects.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

business_profile.read

Read Business Profile

Read the signed-in workspace's stored business profile (company, industry, ICP, content themes, and competitors) as a ResourceStatus envelope. Read when an agent needs to know who it is working for before drafting or researching. If the profile is missing, a discovery refresh is enqueued automatically and a loading status comes back; poll until ready.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

business_profile.refresh

Refresh Business Profile

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 regeneration without rescraping author sources. If a job is already running the existing jobId is returned under status='already_running' — no second job ever spawns.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

business_profile.refresh_sources

Refresh Business Profile Sources

Kick off a full-discovery pipeline (profile regeneration plus author source inspection + scraping). Use when the operator wants to bring every discovered source back up to date, not just the profile. Respects freshnessThresholdDays so sources younger than that window are left alone. Idempotent — returns the running jobId if one is already executing.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

business_profile.status

Poll Business Profile Job Status

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 spawns work, unlike business_profile.get. Returns the same ResourceStatus envelope (status, data, jobId, lastUpdated, progress, error).

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

business_profile.update

Update Business Profile

Patch the stored business profile with a user-edited partial payload. Use when the operator hand-corrects discovery output (company name, industry, ICP, competitors, content themes, keywords). The patch is deep-merged into the existing profile and stamped source=user_edited. Returns the fully-merged row.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

business_profile.update_schedule

Update Business Profile Sync Schedule

Persist a new auto-discovery sync schedule for this workspace. Use when the operator toggles enabled, changes frequency between weekly / biweekly / monthly, adjusts the freshness threshold in days, or flips the refresh-existing-profiles flag. Rewires the BullMQ repeatable job so the next cron tick uses the new cadence.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

Company (company.*)

3 tools.

company.get

Get Company

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_params.company_list and wants the conversation count before deciding whether to include it. Returns null when no interactions exist for that company in this business.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

company.list

List Companies

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 agent needs a starting set before narrowing a research delegation. Returns each company's conversation count so the UI can flag low-signal accounts. Accepts an optional limit (default 50, max 500).

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

company.search

Search Companies

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 shortlist accounts for input_params.company_list before delegating to researcher. Accepts q (required) and limit (default 20, max 100). Each result carries the conversation count so low-signal matches are easy to filter.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

Connections (connections.*)

9 tools.

connections.connect

Connect an Integration

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 user picks a provider from the catalog and wants it connected. Returns the created connection, or an OAuth authorize URL to redirect to. Creates and stores the connection without starting a sync.

  • Required scopes: connections:write
  • Required role: editor
  • Category: data
  • Stability: stable

connections.disconnect

Disconnect an Integration

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 connector or a tracked X / LinkedIn account) is marked disconnected. Retains the row for re-connect; a non-existent or cross-tenant id is a clean not-found that never reveals another workspace.

  • Required scopes: connections:delete
  • Required role: editor
  • Category: data
  • Stability: stable

connections.get

Get Connection By Id

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. Read when opening a connection detail view or confirming a specific integration's configuration. Returns the normalized record, or null when the id belongs to another tenant or does not exist - a not-found that never reveals existence.

  • Required scopes: connections:read
  • Required role: viewer
  • Category: data
  • Stability: stable

connections.get_status

Get Connection Sync State

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 the whole record. Read when polling a connecting / syncing badge after a connect or refresh kicks off. Resolved across both stacks and scoped to the workspace; null when the id is not in the tenant.

  • Required scopes: connections:read
  • Required role: viewer
  • Category: data
  • Stability: stable

connections.list

List Established Connections

Read every integration a workspace has actually established, newest first, merging first-party data sources and tracked social accounts into one normalized list with a uniform status, scope, and last-synced field. Read when rendering the connections inventory or answering which integrations are live for the tenant. This is the established-instances view, distinct from the catalog of available providers.

  • Required scopes: connections:read
  • Required role: viewer
  • Category: data
  • Stability: stable

connections.list_catalog

List Connector Catalog

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 data streams it brings in. Read when rendering the "add a connection" picker or answering which providers are supported. Describes what CAN be connected, not what is already connected. Optional kind / category filters narrow the menu.

  • Required scopes: connections:read
  • Required role: viewer
  • Category: data
  • Stability: stable

connections.list_runs

List Connection Sync Runs

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 rows written, and a bucketed failure reason. Read when showing a connection activity log or diagnosing why data is not flowing. Scoped to the workspace; an id outside the tenant returns an empty list.

  • Required scopes: connections:read
  • Required role: viewer
  • Category: data
  • Stability: stable

connections.reconnect

Reconnect an Integration

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 when a user clicks reconnect on a broken connection: an OAuth provider returns a fresh authorize URL to redirect through, an api_key connector takes a replacement key, and a tracked social handle simply re-triggers its sync. A non-existent or cross-tenant id is a clean not-found.

  • Required scopes: connections:write
  • Required role: editor
  • Category: data
  • Stability: stable

connections.update

Update a Connection

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 relabel a connection to tell multiple instances apart, attribute a personal connection to a teammate, or clear that attribution. Owner applies to personal connectors only; returns the updated connection. A non-existent or cross-tenant id is a clean not-found.

  • Required scopes: connections:write
  • Required role: editor
  • Category: data
  • Stability: stable

Console (console.*)

4 tools.

console.crm_mappings.get

Get CRM Stage Mappings

Read the business's current CRM mappings configuration: deal-stage mappings (raw CRM stage → normalized pipeline stage) and deal-amount tiers, plus version and applied_version stamps. Use when the caller needs to understand how CRM deal stages are being normalized before querying pipeline data, audit the current mapping set, or compare saved vs applied versions to check pipeline convergence.

  • Required scopes: config:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

console.data_filters.get

Get Data Filter Rules

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 source/category/entity exclusions are active, compare the saved version against the pipeline's applied version, or audit what data is excluded before querying. Returns the empty-config default (version 0, rules []) when no row exists yet.

  • Required scopes: config:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

console.issues_inbox.list

List Issues Inbox

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. unknown_speakers, unmapped_stages), severity, status (open/snoozed/resolved), and a link_surface + link_params pointing at the affected resource. Response includes per-status counts. Use when an agent needs to surface active pipeline health issues, triage by category, or check whether issues need attention before a sync.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

console.review_tasks.list

List Review Queue

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 identity records, overriding a misclassified entity field, or confirming a confidence-scored claim. Use when an agent needs to surface actionable pipeline issues, count the open queue, or inspect which entity records need human confirmation. Defaults to open tasks; pass status=all for resolved/dismissed. Paged with limit/offset.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

Context (context.*)

11 tools.

context.ask

Ask Over Session Substrate

Get a synthesized natural-language answer over the data already gathered in the current session. An agent searches the accumulated substrate (evidence, clusters, metrics) and optionally the web, then writes a complete response. Use AFTER gathering data with the data tool, not as a starting point. Takes ~10-15 seconds. For raw scored results instead of a written answer, use query_substrate.

  • Required scopes: context:ask
  • Required role: viewer
  • Category: context
  • Stability: stable
  • Expected latency: 12000 ms (median)

context.audience_filters

List Audience Filter Options

Return the per-business audience filter options (funnel stages, account sizes, personas, industries, topics) sourced from the v2 BigQuery catalog. Use when populating the audience picker in content creation or research setup, or when the agent wants to validate a user-supplied audience_filters map before delegating. Returns an empty option set for each category when the business has no interactions data yet.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.channels

List Canonical Channels

Return the canonical channel enum (linkedin, blog, twitter, youtube, email, other) used by content_sessions.channel and the content_writer specialist's input_params.channel. Use when populating a channel selector in a filter UI or when the agent needs to validate a user-supplied channel string.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.content_subtypes

List Canonical Content Subtypes

Return the canonical content-subtype enum (perspective, proof, execution, how_to, announcement, teardown) stored on content_sessions.content_subtype and threaded through content_writer.input_params.content_subtype. Use when rendering the subtype filter or when the agent needs to map a user's framing onto the pipeline's structural categories.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.content_types

List Canonical Content Types

Return the canonical content-type enum (social, blog, thought_leadership, newsletter, case_study) recognised by the v2 pipeline and the content_writer specialist's input_params.content_type. Use when populating a content-type selector or when the agent needs to confirm a user-supplied type is valid before delegating.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.query_substrate

Query Session Substrate

Intent-driven smart lookup over the session substrate. Returns scored/ranked evidence, clusters, and metrics tailored to an intent. Use this to retrieve grounded data points, not to compose a narrative. Intents: answer_question, find_metrics, research_overview, summarize_research, evidence_for_writing, enrich_with_quotes, assess_viability. Prefer query_substrate over ask when you need raw scored results.

  • Required scopes: context:query
  • Required role: viewer
  • Category: context
  • Stability: stable

context.remember

Remember Observation

Push an external observation (web finding, user note, summary from another tool) into the session substrate so subsequent query_substrate and ask calls surface it. Use for findings that belong in the substrate but did not come from the standard data pipeline. The observation is appended, not deduplicated against existing evidence.

  • Required scopes: context:write
  • Required role: editor
  • Category: context
  • Stability: stable

context.review_kit

Context Review Kit

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), the current auto_detected context entries (capped at 100 most-recent), the count of manual entries you must NOT modify, the last 10 entries changed for trend awareness, and the curation rubric inline. Bundles three reads into one so the post-run curation playbook stays single-shot. Read-only — apply changes via context_entries.write.

  • Required scopes: context_entries:read, workflows:read
  • Required role: viewer
  • Category: context
  • Stability: beta

context.substrate

Session Substrate

Session substrate counters: what the agent has learned so far in this run (record counts, entities discovered, data sources consulted). Use when debugging what substrate has been gathered or deciding whether to gather more before answering.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.summary

Business Context Summary

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 working for". Read once per run; the answer is static within a turn.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context.time_ranges

List Canonical Time Ranges

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 filter or when the agent needs a preset id to map to researcher.input_params.research_start_date / research_end_date. The 'custom' sentinel signals the caller should supply explicit ISO dates instead of a preset window.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Context Entries (context_entries.*)

1 tool.

context_entries.write

Write Context Entry

Create, update, or delete a persisted context entry. Use when saving, patching, or removing brand config / audience insights / campaign themes. action="create" requires type+title+content; action="update" requires id and at least one of title/content; action="delete" requires id. Reads use the context_entry:// resource (via read_resource).

  • Required scopes: context_entries:write
  • Required role: editor
  • Category: context
  • Stability: stable

Context Entry (context_entry.*)

2 tools.

context_entry.get

Get Context Entry

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. Returns null when the entry does not exist.

  • Required scopes: context_entries:read
  • Required role: viewer
  • Category: context
  • Stability: stable

context_entry.list

List Context Entries

List persisted context entries (brand.colors, brand.voice_rules, voice.* profiles, etc.). Use when loading brand metadata before writing content or auditing what canonical context a business has stored. Supports a type_prefix filter (e.g. brand., voice.) and offset-based pagination.

  • Required scopes: context_entries:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Conversation (conversation.*)

2 tools.

conversation.get

Get Conversation

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 after navigation, or auditing exactly what happened across every turn. Returns null when the conversation does not exist or belongs to a different business.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: conversations
  • Stability: stable

conversation.list

List Conversations

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 (active|archived) or profile_id; paginate via limit + offset.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: conversations
  • Stability: stable

Conversations (conversations.*)

5 tools.

conversations.create

Create Conversation

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 first_turn_message is supplied, the first turn is enqueued immediately and turn_id is returned. The pinned profile is immutable and governs every subsequent turn.

  • Required scopes: conversations:write
  • Required role: editor
  • Category: conversations
  • Stability: stable

conversations.turns.append

Append Conversation Turn

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, enqueues it for the pinned profile, and returns the turn id. The conversation must be in status=active; archived conversations reject new turns.

  • Required scopes: conversations:write
  • Required role: editor
  • Category: conversations
  • Stability: stable

conversations.turns.cancel

Cancel Conversation Turn

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 to any sub-agents spawned from this turn — every live descendant is cancelled atomically. Already-completed turns cannot be canceled. The worker stops at the next iteration boundary after observing the status change.

  • Required scopes: conversations:write
  • Required role: editor
  • Category: conversations
  • Stability: stable

conversations.turns.resume

Resume Conversation Turn

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, continue/finish). The input payload must match the turn's pending_input_schema. Validates that the turn belongs to the claimed conversation before writing.

  • Required scopes: conversations:write
  • Required role: editor
  • Category: conversations
  • Stability: stable

conversations.update

Update Conversation

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 cannot be changed here; create a new conversation if a different profile is required.

  • Required scopes: conversations:write
  • Required role: editor
  • Category: conversations
  • Stability: stable

Data (data.*)

6 tools.

data.ask_sql

Ask SQL (natural language → SQL)

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 interactions table with a one-sentence explanation. SELECT-only by construction (system prompt + post-validation reject DML/DDL). Stateless: pass last N turns in priorTurns for follow-ups like "break that down by company". Caller runs the SQL via data.query; this op only writes the query.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: beta
  • Expected latency: 5000 ms (median)

data.cluster_detail

Get Cluster Detail

Full detail for a single pre-computed conversation cluster: label, description, insight, statistical measures (JSD, size anomaly), full feature distribution, representative quotes, temporal snapshots, and entity signals. Use after data.cluster_search has surfaced a cluster_id worth drilling into. Quotes are real but the selection and grouping are ML-generated.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

data.cluster_search

Search Conversation Clusters

Semantic pattern discovery across pre-computed ML clusters from customer conversations. Use to find recurring themes, pain points, objections, competitive mentions. Returns cluster summaries (label, top features, representative quotes, entity rollups). For verbatim quotes / named accounts / specific call evidence, follow up with data.cluster_detail on the most relevant cluster_id. Verify counts via data.query.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 2000 ms (median)

data.query

Query Interactions (SQL)

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 columns only. Enum casing matters: interaction_type is UPPERCASE (CALL/EMAIL/MEETING/NOTE/UTTERANCE), speaker_type lowercase (internal/external) — see data://schema for the rest. On 0 rows the response may include a hint to retry with a canonical value — follow it; NEVER substitute a different metric without asking.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 1000 ms (median)

data.schema

Data Inventory

Data inventory for the current business: interactions schema plus sample values, cluster availability, and knowledge base document count. Use when orienting at the start of a data workflow, before writing SQL or searching, so you know what exists. Replaces the old data.explore tool.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

data.search

Search Knowledge Base

Hybrid semantic + keyword search across the business knowledge base: saved research, uploaded documents, and past content outputs. Use when you need qualitative evidence, precedent, or supporting context from ingested documents - not structured fact lookup (use data.query for that). Returns one entry per document with up to three representative snippets and an origin field so you can weigh source reliability.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 1500 ms (median)

External Search (external_search.*)

1 tool.

external_search.execute

External Search (fused market + tenant research)

Use when answering market / competitive / industry / topic-positioning questions. Returns a divergence_map flagging where market chatter (web+news+reddit+twitter) disagrees with the tenant's own customer voice (interactions) — the unique signal vs vanilla web search. Actions: search (free-text), enrich_company (domain/name + LinkedIn+Crunchbase), enrich_person (linkedin_url/email/name), enrich_topic (topic). Tenant-aware query rewrite runs first.

  • Required scopes: external_search:execute
  • Required role: viewer
  • Category: data
  • Stability: beta
  • Expected latency: 30000 ms (median)

Actions:

  • enrich_company -- Full company brief: web + news + LinkedIn + Crunchbase + your interactions, fused
  • enrich_person -- Full person brief: LinkedIn + Crunchbase + web + Twitter + your interactions where they appear, fused
  • enrich_topic -- Topic brief: market view (web + news + reddit + twitter) + customer voice (interactions filtered to speaker_type='external')
  • search -- Fused web + news + social + your customer voice (divergence map highlights where market chatter disagrees with internal voice)

External Search Jobs (external_search_jobs.*)

1 tool.

external_search_jobs.read_stream

External Search Job Stream

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 the canonical channel URI, the companion HTTP stream path, the Redis pub/sub channel name, and content-type=text/event-stream so callers can open an SSE EventSource without re-deriving the path. Streaming itself happens on the GET HTTP route.

  • Required scopes: external_search:execute
  • Required role: viewer
  • Category: workflows
  • Stability: beta

Inspirational Reference (inspirational_reference.*)

3 tools.

inspirational_reference.get

Get Inspirational Reference

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 input_params) and wants the full body, or when rendering a reference detail modal. Returns null when the composite id is malformed or the reference does not exist in this business.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

inspirational_reference.list

List Inspirational References

List every writing sample + scraped post available as a structural inspirational reference for this business. Use when populating the v2 content creation Inspirational picker or when the agent needs a pool to choose from before calling content_writer. Returns composite ids of shape 'writing_sample:<uuid>' and 'scraped_post:<uuid>' suitable for inspirational_reference_id input_params.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

inspirational_reference.search

Search Inspirational References

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 needs to shortlist candidates before delegating to content_writer. Accepts q (required) and limit (default 20, max 100). Returns composite ids alongside preview snippets.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Knowledge Base (knowledge_base.*)

17 tools.

knowledge_base.chat

Chat With Knowledge Base

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 rather than raw chunks. Pass one document_id to chat with a single document; omit or pass several to chat across the bank. Streams status + source progress events; final payload contains the answer and cited sources when include_sources is true.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 8000 ms (median)

knowledge_base.create_comment

Create Knowledge Base Version Comment

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 (required); optionally block_id (the block the thread anchors to) and thread_root_id (when replying). versioning:write + editor, mirroring the human-gated promote write.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: data
  • Stability: beta

knowledge_base.delete

Delete Knowledge Base Document

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, storage files, and embeddings remain intact and reversible. Pass hard_delete=true to permanently remove storage files, chunk embeddings, and the document row; hard delete requires the knowledge_base:delete scope in addition to knowledge_base:write.

  • Required scopes: knowledge_base:delete
  • Required role: editor
  • Category: data
  • Stability: stable

knowledge_base.diff

Diff Knowledge Base Document Versions

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=<version_id> or ?base=current). Use for the doc-page version-diff view; returns hunks, +/- stats, a truncated flag, and base_missing=true for v1, or null when the target is missing or cross-business. Alias of blueprint_output://<id>/diff - the same server-computed diff so the doc page and Workflows tab agree.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.get

Get Knowledge Base Document

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 when the document does not exist or belongs to a different business.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.get_access

Get Knowledge Base Document Access

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 document is shared with. An empty entries list means the document carries no ACL and is workspace-wide readable by every member. Each entry resolves the subject display name (and email for members).

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.get_content

Get Knowledge Base Document Content

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, summarise, or ground an answer) rather than the metadata row that knowledge_base.get returns. Returns an empty string while conversion is still pending, or null when the document does not exist or belongs to another business.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.get_versions

List Knowledge Base Document Versions

List all versions of a knowledge base document (its version family: current, proposed, superseded), newest first, resolved from the supplied document UUID and each row carrying its version_status. Use for the version-history view; enforces the same per-document read ACL as knowledge_base.get, so a restricted document never leaks its history and an empty list means the doc does not resolve or the caller may not read it.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.list

List Knowledge Base Documents

List knowledge bank documents (uploads, saved research, style references) for this business. Use when enumerating documents by status, embedding_status, type, or a plain-text search. For full-content semantic search, call the knowledge_base.search tool.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable

knowledge_base.list_comments

List Knowledge Base Version Comments

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 comments anchored to changed blocks plus human replies, grouped into threads with a resolved flag, with the version’s persisted block anchors. Same per-document read ACL as the version diff; null when missing or cross-business.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: beta

knowledge_base.make_living

Make Knowledge Base Document Living

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 group and optionally scheduling it. Use when a user wants a KB doc to auto-regenerate on a cadence instead of going stale. Authors the recipe, forces the upload step onto the doc group, validates, persists the blueprint, and creates a cron schedule when a cron is supplied.

  • Required scopes: workflows:write, knowledge_base:write
  • Required role: editor
  • Category: workflows
  • Stability: stable
  • Expected latency: 20000 ms (median)

knowledge_base.resolve_comment

Resolve Knowledge Base Version Comment

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; passing a reply id resolves its root. versioning:write + editor, mirroring the human-gated promote write.

  • Required scopes: versioning:write
  • Required role: editor
  • Category: data
  • Stability: beta

knowledge_base.search

Search Knowledge Base

Hybrid semantic + keyword search across knowledge bank chunks. Use when looking up qualitative evidence, precedent, or supporting quotes from ingested documents. Defaults to knowledge_bank source_type; pass source_types to widen into saved_research or content_creation documents, or document_ids to restrict to specific documents. Returns chunks with document titles, heading context, and a combined similarity score.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 1500 ms (median)

knowledge_base.star

Star Knowledge Base Document

Pin a knowledge bank document as workspace canon. Read when reviewing reference material (messaging frameworks, brand pillars, market research) the agent should always cite. Knowledge bank docs come from file uploads with extracted summaries already populated; pinning them surfaces the pre-extracted summary into every copilot turn for free. Idempotent. Cap 20 across all canon items workspace-wide. Admin-only.

  • Required scopes: artifacts:write
  • Required role: admin
  • Category: data
  • Stability: beta

knowledge_base.unstar

Unstar Knowledge Base Document

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 document itself stays intact — only the system-prompt pre-load is dropped. Idempotent. Admin-only.

  • Required scopes: artifacts:write
  • Required role: admin
  • Category: data
  • Stability: beta

knowledge_base.update

Update Knowledge Base Document

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, or flip visibility between private and public. Accepts any subset of description, document_type, filename, user_notes, is_archived, visibility; the row content (chunks, embeddings, storage files) is immutable through this path. To change content, hard-delete and re-upload.

  • Required scopes: knowledge_base:write
  • Required role: editor
  • Category: data
  • Stability: stable

knowledge_base.upload

Upload Knowledge Base Document

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 Marker conversion) or raw markdown_content (straight to chunk + embed). Returns the new document id plus conversion + embedding status; files are async, so poll knowledge_base.get until ready. When appending a new version of a living document, also pass version_changes (per-section change notes) for the version-review UI.

  • Required scopes: knowledge_base:write
  • Required role: editor
  • Category: data
  • Stability: stable
  • Expected latency: 3000 ms (median)

Metrics (metrics.*)

1 tool.

metrics.evaluate

Evaluate Metric

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. The metric's content_json holds the query spec; the evaluator runs that query against platform_artifacts (promoted columns for indexed filtering, JSONB containment otherwise) and respects the metric's refresh_policy for caching (on_read, cache_5m, cache_1h, invalidate_on_event).

  • Required scopes: metrics:read
  • Required role: viewer
  • Category: assets
  • Stability: stable
  • Expected latency: 2500 ms (median)

Notifications (notifications.*)

3 tools.

notifications.email_member

Email Workspace Member

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, a hand-off, a heads-up after a long-running job. Recipients must already be members; external or free-text addresses are rejected. Sends are capped per workspace and idempotent on an optional key.

  • Required scopes: notifications:write
  • Required role: admin
  • Category: team
  • Stability: stable
  • Expected latency: 1500 ms (median)

notifications.list_recipients

List Notification Recipients

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). Read when you need to choose who to email before calling notifications.email_member, which only accepts current members. This is a narrow addressable-recipient list, not a full team roster. Optional limit caps the result.

  • Required scopes: notifications:read
  • Required role: viewer
  • Category: team
  • Stability: stable

notifications.list_sends

List Member Email Sends

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-workspace hourly and per-run caps. Read when reviewing what notifications already fired, or before an automated email step to confirm there is room left under the rate limit. Optional recipient / run / since filters narrow the list.

  • Required scopes: notifications:read
  • Required role: viewer
  • Category: team
  • Stability: stable

Notion Sync (notion_sync.*)

7 tools.

notion_sync.backfill

Backfill Notion Sync

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 first setting up the sync or to force a full reconciliation; unchanged documents are skipped cheaply so it is safe to run repeatedly.

  • Required scopes: notion_sync:write
  • Required role: editor
  • Category: data
  • Stability: stable

notion_sync.configure

Configure Notion Sync

Configure the outbound Notion knowledge-base sync for a connection: designate the parent Notion page, provision the synced database under it, set the version + delete + drift policy and include filters, and start a full backfill. Use when a workspace sets up or reconfigures where its knowledge base mirrors into Notion.

  • Required scopes: notion_sync:write
  • Required role: editor
  • Category: data
  • Stability: stable

notion_sync.get

Get Notion Sync Config

Fetch the outbound Notion knowledge-base sync configuration for one connection - target database, version policy, include filters, and how many documents are currently mirrored. Read when opening the Notion sync settings panel for a connection. Returns null when the id is not a Notion sync connection in the caller's workspace - a not-found that never reveals existence.

  • Required scopes: notion_sync:read
  • Required role: viewer
  • Category: data
  • Stability: stable

notion_sync.list_pages

List Accessible Notion Pages

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 Notion authorize granted more than one page and the parent-page picker needs to be shown. Returns an empty list for a non-Notion-sync or cross-tenant id - a not-found that never reveals existence.

  • Required scopes: notion_sync:read
  • Required role: viewer
  • Category: data
  • Stability: stable

notion_sync.list_sends

List Notion Sync Activity

List the recent outbound Notion sync ledger for a connection (per-document synced / skipped / failed outcomes), newest-first, with an hourly summary. Read when showing the Notion sync activity log or diagnosing why a document did or did not mirror. Returns an empty list for a non-Notion-sync or cross-tenant id.

  • Required scopes: notion_sync:read
  • Required role: viewer
  • Category: data
  • Stability: stable

notion_sync.status

Get Notion Sync Status

Fetch the live status of an outbound Notion sync: enabled, provisioned, the connect-only provisioning state, mirrored-document count, and a recent-activity summary (synced / skipped / failed in the last hour). Read when polling a Notion sync status badge or deciding whether a parent-page picker is needed. Returns null for a non-Notion-sync or cross-tenant id.

  • Required scopes: notion_sync:read
  • Required role: viewer
  • Category: data
  • Stability: stable

notion_sync.unsync

Unsync Notion Sync

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 stop mirroring its knowledge base to Notion. The existing Notion pages are left in place - their data is preserved; this only stops future syncing.

  • Required scopes: notion_sync:delete
  • Required role: editor
  • Category: data
  • Stability: stable

Operation (operation.*)

2 tools.

operation.get

Get Operation

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 the typed input form for a specific op or when an agent_blueprint llm step references an op id. Returns the lean projection (id, namespace, name, description, kind, sensitivity, required_scopes, input_schema). Returns null when the id is not registered.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: observability
  • Stability: stable

operation.list

List Operations

List every operation registered in the unified operation registry, grouped by namespace (data, artifacts, context, conversations, etc.). Read when authoring an agent_blueprint or rendering a tool picker so the catalog stays registry-driven (167+ operations) instead of hardcoded. Optional filters: ?namespace, ?kind=read|write|compute|workflow, ?include_admin=false (default false).

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: observability
  • Stability: stable

Pages (pages.*)

11 tools.

pages.archive

Archive a Page

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 retire a page from view without destroying it. Requires write entitlement on the target page; returns a 404 when the page is missing or already gone.

  • Required scopes: pages:write
  • Required role: editor
  • Category: assets
  • Stability: stable

pages.create

Author a Page

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 tenant data declared as named queries the host runs server-side. Use when a user or agent wants to publish a fresh data view, dashboard, or report surface. The spec is verified before it persists; a broken draft is rejected with a per-stage verdict, and a Custom node needs the pages:admin scope.

  • Required scopes: pages:write
  • Required role: editor
  • Category: assets
  • Stability: stable

pages.delete

Permanently Delete a Page

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 for good, ideally after a confirmation step. Requires the dedicated delete scope plus write entitlement on the page; returns a 404 when the page is missing or already deleted.

  • Required scopes: pages:delete
  • Required role: editor
  • Category: assets
  • Stability: stable

pages.get

Get Page By Id

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 by the page entitlement. Read when opening a page in the editor or inspecting what a saved view is built from. Returns null for a missing or cross-tenant id; live data is fetched separately at render time.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

pages.get_template

Get Page Template

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 a template and needs the complete spec to adapt and author a real page from. Templates are code-defined, so the read is the same for every workspace; returns null when the slug or id matches no template.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

pages.list

List Pages

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 library sidebar or letting an agent discover the saved data views it can open. Excludes archived and deleted pages; ungated pages are always shown and admins see the full set.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

pages.list_templates

List Page Templates

Read the catalog of Amdahl-shipped page templates - ready-to-adapt starting points (pipeline health, voice of customer, competitive battlecard) an author turns into a real page. Read when picking a starting point before authoring a page, so the agent adapts a vetted template instead of building a spec from scratch. Lean list (slug, name, intent); fetch the full spec via page_template://<slug>.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

pages.mint_embed_token

Mint a Page Embed Link

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 page. The embed runs the page data under a scope CLAMPED to the caller's own access (it can never show more than the caller can see), and fails closed. audience 'self' scopes to the caller; 'public' / 'workspace' need an admin caller.

  • Required scopes: pages:embed
  • Required role: editor
  • Category: assets
  • Stability: stable

pages.render

Run a Page

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-scoped through the shared engine. Use when the sandbox needs to fill a page with real data, or to preview what a viewer would see. Reads nothing persisted; a broken binding returns its error inline rather than failing the run.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

pages.update

Edit a Page

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. The replacement spec is verified before it lands; a broken revision is rejected with a per-stage verdict, a Custom node needs the pages:admin scope, and a clean one bumps the version and snapshots history. Requires write entitlement on the target page.

  • Required scopes: pages:write
  • Required role: editor
  • Category: assets
  • Stability: stable

pages.validate

Dry-run Page Verification

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 editor or agent wants to see whether a draft would pass before committing a create or update. Always succeeds with the verdict as the body; a failing dry-run reports stage errors rather than throwing.

  • Required scopes: pages:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

Platform (platform.*)

3 tools.

finish

Finish Turn

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 artifact_id produced in a prior turn. Use when the full job is done, not mid-task.

  • Required scopes: workflows:complete
  • Required role: viewer
  • Category: workflows
  • Stability: stable

read_resource

Read Resource

Read any resource by URI. URIs follow <scheme>://<path>[?query]. Schemes: artifact, conversation, agent_run, agent_profile, context, context_entry, knowledge_base, webhook, data, content. Examples: artifact://abc-123 returns one artifact; context://summary grounds you in the business; data://schema is the data inventory. Use when you need to read existing state. See "Available resources" in your system prompt for the full list.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: platform
  • Stability: stable

retrieve_scratchpad

Retrieve Scratchpad Slot

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 truncated tool result that was stored under a key you received earlier.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Prompt (prompt.*)

2 tools.

prompt.get

Get Prompt Fragment

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 runner or canvas inlines the returned body verbatim. Path is the slash-namespaced fragment id (e.g. content_writer/grounding_rules). Returns null when the id is not registered.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

prompt.list

List Prompt Fragments

List every registered platform prompt fragment (named, version-controlled chunks of expertise that agent_blueprint llm steps can compose via prompt_resources). Use when authoring or reviewing a blueprint to discover what reusable prompt patterns exist; fetch a single fragment via prompt://<scheme>/<id> for the full body. Optional scheme filter (e.g. ?scheme=content_writer).

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Prompts (prompts.*)

32 tools.

prompts.artifact.compose_campaign

Compose Campaign Prompt

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 child content pieces linked to it so provenance is explicit and one research run powers both outputs.

  • Required scopes: artifacts:write, data:read, knowledge_base:read
  • Required role: viewer
  • Category: assets
  • Stability: stable

prompts.artifact.draft_weekly_report

Draft Weekly Report Prompt

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_report artifact through artifacts.create with the summary baked in.

  • Required scopes: data:read, artifacts:write
  • Required role: viewer
  • Category: assets
  • Stability: stable

prompts.artifact.embed_artifact

Embed Artifact Prompt

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 the iframe snippet plus the auto-resize listener from the resulting metadata. Returns the copy-pasteable HTML the user needs.

  • Required scopes: artifacts:write
  • Required role: viewer
  • Category: assets
  • Stability: stable

prompts.artifact.refine_content_piece

Refine Content Piece Prompt

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 feedback, and save the revision through artifacts.update (new version, history preserved).

  • Required scopes: artifacts:read, artifacts:write
  • Required role: viewer
  • Category: assets
  • Stability: stable

prompts.context.capture_competitive_intel

Capture Competitive Intel Prompt

Use when the agent observes something about a named competitor that future sessions should remember (positioning move, pricing change, win/loss signal). Directs the caller to save it under competitive.<slug> with structured content so the v2 Context page and future battlecards can reuse it.

  • Required scopes: context_entries:write
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.onboard_me

Onboard Me Prompt

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_base://list and produce a welcome brief that names what is connected and what to try first.

  • Required scopes: context:read, data:read, knowledge_base:read
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.remember_this

Remember This Prompt

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. Directs the agent to call context.remember with the observation plus a typed source tag.

  • Required scopes: context:write
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.review_context

Review Context Prompt

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, group by type prefix, summarise content, and flag duplicates or stale rows. Proposes next CRUD moves but does not mutate.

  • Required scopes: context_entries:read
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.save_insight

Save Insight Prompt

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 context_entries row with the right type prefix and auto_detected source, so the v2 Context page and other agents see it.

  • Required scopes: context_entries:write
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.state_of_business

State Of Business Prompt

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 artifacts, then compose a one-page snapshot of active work and signals.

  • Required scopes: context:read, artifacts:read, context:query
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.context.update_entry

Update Entry Prompt

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, apply the change without clobbering unrelated fields, and refuse to modify source:"manual" entries.

  • Required scopes: context_entries:write
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.conversation.conversation_recap

Conversation Recap Prompt

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 in order, and output a structured recap with artifacts linked.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: conversations
  • Stability: stable

prompts.conversation.resume_work

Resume Work Prompt

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 vs what did not, and propose the single next concrete action to take.

  • Required scopes: workflows:read
  • Required role: viewer
  • Category: conversations
  • Stability: stable

prompts.data.account_deep_dive

Account Deep Dive Prompt

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 summaries) that the agent executes through data.query.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.data.schema_tour

Schema Tour Prompt

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 analysisStrategies field, and summarize what exists before writing any SQL.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.data.top_companies

Top Companies Prompt

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.query, scoped to a configurable day window and result limit.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.data.weekly_pulse

Weekly Pulse Prompt

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 summary directive the agent runs via data.query.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.knowledge_base.brief_me

Brief Me Prompt

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 summary with source attribution (on MCP via data { action: search, source_type: knowledge_bank }; on the Anthropic surface via knowledge_base.chat / knowledge_base.search).

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.knowledge_base.find_playbook

Find Playbook Prompt

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 and return ranked pointers back to the source documents (on MCP via data search with source_type=knowledge_bank; on the Anthropic surface via knowledge_base.search).

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.knowledge_base.prep_for_call

Prep For Call Prompt

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, sentiment) and output a call-prep brief with open questions. KB search uses data.search (source_type=knowledge_bank) on MCP or knowledge_base.search on the Anthropic surface.

  • Required scopes: knowledge_base:read, data:read
  • Required role: viewer
  • Category: context
  • Stability: stable

prompts.settings.warm_workspace

Warm Workspace Prompt

Use when first orienting on a workspace (new session, new tenant, new client). Explains that the slow-to-load background pipelines — business profile discovery, author voice summaries, brand voice summary — are primed automatically on connect, so no warm tool call is needed. Directs the agent to read the profile via context.summary and proceed without blocking on background jobs.

  • Required scopes: config:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

prompts.system.account_prep

Account Prep Brief

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 deal stage, recent conversation themes, open opportunities, and risk signals; produces a stage-aware prep brief with talking points and questions to ask.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.amdahl_gtm_playbook

Amdahl GTM Playbook

Use when starting ANY go-to-market task in this workspace (research, enrichment, positioning, messaging, content, sales call prep, win-loss, outbound) and you need the live tool-routing guide for which Amdahl primitive handles which job, plus the operational defaults that make every call return useful results.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.competitive_positioning

Competitive Positioning Check

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 message lands, where it misses by segment. Compares positioning entries against speaker-attributed customer voice clusters and rep-vs-buyer language gaps.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.getting_started

Getting Started Prompt

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 workflow, substrate mechanics, tips) as a single user message.

  • Required scopes: prompts:list
  • Required role: viewer
  • Category: platform
  • Stability: stable

prompts.system.messaging_check

Messaging Check

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 lands by segment, what they say instead. Surfaces rep-vs-buyer language gaps using the speaker-attributed call corpus.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.research_competitor

Research Competitor

Use when researching a specific competitor — their positioning, pricing, recent moves, market chatter, and where they show up in our own call transcripts. Pulls live external signal (news + social + web) and cross-references against our customer voice and competitive context entries.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.research_customer

Research Customer

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 (firmographics + recent web/news) alongside the internal corpus (deal stage + transcripts where they appear) to build the full picture from both directions.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.system.research_playbook

Research Playbook Prompt

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, substrate accumulation, intent-driven lookups, parallel work, examples) as a single user message.

  • Required scopes: prompts:list
  • Required role: viewer
  • Category: platform
  • Stability: stable

prompts.system.win_loss_analysis

Win/Loss Analysis

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 segment cohort, or a specific competitor. Pulls deal-stage metadata, first-call patterns, competitor mentions, and objection clusters across the won and lost cohorts.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

prompts.webhook.debug_delivery

Debug Webhook Delivery Prompt

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 recent deliveries across all statuses, and distinguish transient from systemic failures.

  • Required scopes: webhooks:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

prompts.webhook.webhook_health_check

Webhook Health Check Prompt

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 produce a ranked report highlighting which endpoints need attention.

  • Required scopes: webhooks:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

Reference Document (reference_document.*)

1 tool.

reference_document.list

List Reference Documents

List documents eligible as content-creation reference material. Use when populating the v2 Reference Documents picker or when the agent needs a shortlist before filling reference_document_ids on content_writer / researcher. Each row carries composite_id = 'knowledge_bank:<uuid>', suitable for passing straight through input_params. Accepts status, embedding_status, document_type, search, and pagination params.

  • Required scopes: knowledge_base:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Social (social.*)

20 tools.

social.connect_account

Connect Social Account

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 verify_connection) and wants it tracked going forward. Dedup is automatic: re-connecting an account that is already tracked returns an already_connected marker with the existing id instead of creating a duplicate. Persists one first-party data_sources row.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.create_subject

Create Tracked Subject

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 someone (mark external) or register their own / a teammate's presence (mark internal). External subjects cannot have a member_user_id; an internal one may name a workspace member or be brand-owned. Link handles to it afterward.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.delete_subject

Delete Tracked Subject

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 - they just become ungrouped (their handle data and metrics history are untouched). A non-existent or cross-tenant id is a clean not-found.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.disconnect_account

Disconnect Social Account

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 wants to untrack a profile they previously connected. The raw metrics history is owned by amdahl-data and is not purged here.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.get_connection

Get Social Connection

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 — handle, display name, follower snapshot, status, last sync time. Returns one connection or a not-found error. Read-only; scoped to the calling tenant.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

social.get_metric_trend

Get Social Metric Trend

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 (scope=post + post_id). Read when rendering an over-time chart or answering how a metric moved. One series per channel metric; tune the window_days + granularity (hour/day/week). Returns null when the connection is not in the tenant; empty series when nothing is captured yet.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 2000 ms (median)

social.get_metrics_summary

Get Social Connection Summary

Read aggregate stats for one tracked social account: current followers + growth over the window (both null when the channel does not expose followers — LinkedIn personal profiles do not via the current actor), total engagement, post count, top post, and last sync. Read when rendering the summary header or answering how an account is doing. Identify by id; tune window_days for the growth figures. Returns null when the connection is not in the tenant.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 2000 ms (median)

social.get_portfolio_summary

Get Social Portfolio Summary

Read aggregate stats across every active tracked account in the tenant: total followers + growth (null when no in-scope connection reports followers — LinkedIn personal profiles do not via the current actor), total engagement, post count, the best post across all accounts, and last sync. Read when rendering the connectors index header or answering how the whole portfolio is doing. No id — rolls up the tenant. Tune window_days for the growth figures.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 3000 ms (median)

social.get_subject

Get Tracked Subject

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 - relationship tag, the member it represents, its linked handles. Returns one subject or null when it is not in the tenant. Scoped to the calling tenant.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

social.get_subject_summary

Get Tracked Subject Summary

Read aggregate stats across every social handle grouped under a tracked subject: total followers (null when no handle reports a count), total engagement, post count, a per-channel breakdown, and last sync. Read when answering how a tracked person/org is doing across all their accounts at once. Identify by subject id; tune window_days. Returns null when the subject is not in the tenant; a zeroed summary when it has no handles.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 3000 ms (median)

social.link_handle

Link Handle to Subject

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 consolidating multiple handles for one person/org under a single tracked identity. Both must be in the tenant and the connection must be a live social handle. Missing either side is a clean not-found.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.list_channel_capabilities

List Social Channel Capabilities

Read the per-channel capability map: for each supported social channel (X / Twitter, LinkedIn), which entities (post / profile) it reports on and which metric keys + labels + formats each carries. Read when rendering metric toggles, legends, or column headers so the UI stays descriptor-driven and a new channel needs no front-end change. No id - it is the static, tenant-agnostic capability catalog.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

social.list_connections

List Social Connections

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 which profiles are currently hooked up for social tracking, or before connecting a new one to check what's already there. Read-only; touches nothing.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

social.list_post_metrics

List Social Post Metrics

Read the latest engagement snapshot per post for one tracked social account: likes, reposts, replies, quotes, bookmarks, and views, newest post first, capped at 25. Read when rendering a connection’s social view or answering how its recent posts are doing. Identify the connection by its id; returns the metrics plus the sync state, or null when the connection is not in the tenant.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 2000 ms (median)

social.list_subjects

List Tracked Subjects

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 who is tracked, or before creating / linking to check what already exists. Filter by relationship (internal / external). A subject with no handles yet returns an empty handles list.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable

social.refresh_connection

Refresh Social Connection Metrics

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 acknowledgement (it does not wait). Call when the user wants fresh numbers on demand. Identify the connection by its id; poll the connection until is_syncing clears. Ingestion is owned by amdahl-data, not an in-app fetch.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.unlink_handle

Unlink Handle from Subject

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 to detach it. The connection itself is kept (handle data and metrics untouched); it just stops belonging to any subject. A non-existent or non-social connection id is a clean not-found.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.update_connection

Update Social Connection

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 (how far back posts are snapshotted). Use when the user wants to rename a connection, toggle whether it syncs, or change its history window. Identify the connection by its id; only the fields you pass are changed. Returns the updated connection, or a not-found error if it is not in the tenant.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.update_subject

Update Tracked Subject

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 details change. Only the fields you pass are touched. Rejects a change that would leave an external subject owning a member, or a member who is not in this workspace. A non-existent id is a clean not-found.

  • Required scopes: data:write
  • Required role: editor
  • Category: data
  • Stability: stable

social.verify_connection

Verify Social Connection

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). Use when a tenant is hooking up a profile for social tracking and you must confirm the handle points at the right account before anything is saved. Read-only probe against the channel provider; writes nothing.

  • Required scopes: data:read
  • Required role: viewer
  • Category: data
  • Stability: stable
  • Expected latency: 8000 ms (median)

Step Kind (step_kind.*)

2 tools.

step_kind.get

Get Step Kind

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 fetching catalog details for a specific step. Returns null when the id is not registered.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

step_kind.list

List Step Kinds

List every step kind the agent_blueprint DSL supports (tool, llm, loop, branch, parallel, blueprint, transform, assert). Use when authoring or visualizing a blueprint to discover the available control-flow + data + agent_call primitives. Returns id, name, description, category for each kind.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

System (system.*)

2 tools.

system.list_prompts

List Prompts

Enumerate author-blessed prompt templates the current caller can invoke. Each entry carries a name, description, optional scheme (namespace prefix), and optional argsSchema. Use when the user asks "what can I do" or wants to discover available prompts, filter commands, or actions for a domain. Pass scheme to narrow to one family (e.g. briefing). Call use_prompt with one of the returned names to invoke it.

  • Required scopes: prompts:list
  • Required role: viewer
  • Category: platform
  • Stability: stable

system.use_prompt

Use Prompt

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 guidance assembled from business context rather than a final answer. Use when you want to apply a saved prompt template for a briefing, battlecard, or similar task. Call list_prompts first to discover available names.

  • Required scopes: prompts:use
  • Required role: viewer
  • Category: platform
  • Stability: stable

Team (team.*)

12 tools.

team.add_domain

Add Business Domain

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 instead of one-by-one. Row starts with verified_at=null; DNS verification happens out-of-band. Refuses public mailbox providers (400 public_domain) and a domain already on this workspace (409 already_claimed).

  • Required scopes: team:write
  • Required role: admin
  • Category: team
  • Stability: stable

team.get_settings

Get Team Settings

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-provisioning should run for a new signup. Response is always a fully-populated typed map — missing rows fall back to each key's declared default so callers don't need to null-check.

  • Required scopes: team:read
  • Required role: viewer
  • Category: team
  • Stability: stable

team.invite

Invite Team Member

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 single-use token and 7-day expiry; does NOT create the auth.users row eagerly (that happens on accept). Returns 409 codes when the email already belongs to a member or already has a pending invitation.

  • Required scopes: team:write
  • Required role: admin
  • Category: team
  • Stability: stable

team.list_domains

List Business Domains

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 Amdahl to add one" should appear on an empty state, or auditing which email domains auto-join this workspace. Each row carries verified_at; null means the domain is pending DNS verification.

  • Required scopes: team:read
  • Required role: viewer
  • Category: team
  • Stability: stable

team.list_invitations

List Team Invitations

List pending, accepted, expired, or revoked invitations for the caller's business. Use when rendering the team settings invitations panel or auditing who has been invited but not yet joined. Flips stale pending rows to expired before returning so the catalog is never stale. Paginated via limit + offset query params.

  • Required scopes: team:read
  • Required role: viewer
  • Category: team
  • Stability: stable

team.list_members

List Team Members

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 last admin, or looking up a member UUID before a role change or removal. Returns an array of rows from the business_members table joined to auth.users.

  • Required scopes: team:read
  • Required role: viewer
  • Category: team
  • Stability: stable

team.remove_domain

Remove Business Domain

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 removing a subsidiary. Unverified rows delete without ceremony; removing the LAST verified domain requires force=true because existing members would lose auto-join on re-signup.

  • Required scopes: team:delete
  • Required role: admin
  • Category: team
  • Stability: stable

team.remove_member

Remove Team Member

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 covers that case) and refuses removing the last remaining admin (promote another member first).

  • Required scopes: team:delete
  • Required role: admin
  • Category: team
  • Stability: stable

team.resend_invitation

Resend Team Invitation

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 when an invitee says they never got the first email or the link has expired. Refuses accepted (409 already_accepted) and revoked (409 revoked) invitations — create a fresh one instead.

  • Required scopes: team:write
  • Required role: admin
  • Category: team
  • Stability: stable

team.revoke_invitation

Revoke Team Invitation

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 status=revoked and stamps revoked_at. Re-revoking is a no-op (idempotent). Refuses revoking an already-accepted invitation — use team.remove_member instead once someone has joined.

  • Required scopes: team:delete
  • Required role: admin
  • Category: team
  • Stability: stable

team.update_member_role

Update Team Member Role

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 target must belong to the caller's business, self-role-change is refused, and demoting the last remaining admin is refused (promote someone first).

  • Required scopes: team:write
  • Required role: admin
  • Category: team
  • Stability: stable

team.update_settings

Update Team Settings

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 other workspace toggles. Unknown keys are rejected at the API boundary so typos cannot silently persist. Returns the full settings object (every allowlisted key, untouched values included) after writes complete.

  • Required scopes: team:write
  • Required role: admin
  • Category: team
  • Stability: stable

Trigger Kind (trigger_kind.*)

2 tools.

trigger_kind.get

Get Trigger Kind

Fetch metadata for a single trigger kind by id (manual / schedule / event / webhook). Use when rendering a single trigger configuration card. Returns null when the id is cataloged but its handler is not yet implemented (e.g. webhook).

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

trigger_kind.list

List Trigger Kinds

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 discover how it can be invoked. Returns id, name, description, category, and the wave each kind ships.

  • Required scopes: artifacts:read
  • Required role: viewer
  • Category: workflows
  • Stability: stable

Voice Profile (voice_profile.*)

2 tools.

voice_profile.get

Get Voice Profile

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 needs the full voice specification before drafting or when surfacing a voice detail view. Returns null when the profile does not exist or belongs to a different business.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

voice_profile.list

List Voice Profiles

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 id before delegating to content_writer. Accepts optional voice_only=true to restrict to first-party authors (self / team) and hide external inspirational-only profiles.

  • Required scopes: context:read
  • Required role: viewer
  • Category: context
  • Stability: stable

Webhook (webhook.*)

3 tools.

webhook.get

Get Webhook

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 never returned.

  • Required scopes: webhooks:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

webhook.list

List Webhooks

List outbound webhook subscriptions for this business. Use when auditing registered subscriptions or checking which endpoints the platform currently fans events out to. Pass active_only=false to include disabled subscriptions; secrets are never returned.

  • Required scopes: webhooks:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

webhook.list_deliveries

List Webhook Deliveries

List delivery attempts for a specific webhook subscription. Use when debugging failures, inspecting retry history, or confirming that recent events reached the configured endpoint. Filter by status (success|failed|pending); paginate via limit + offset.

  • Required scopes: webhooks:read
  • Required role: viewer
  • Category: configuration
  • Stability: stable

Webhooks (webhooks.*)

2 tools.

webhooks.test_fire

Test Fire Webhook

Fire a signed test delivery at a webhook destination and return the captured response. Use when verifying connectivity to a new subscription, debugging signature handling, or checking the receiver is up. Signed with the production HMAC-SHA256 scheme; an X-Webhook-Test: true header lets receivers no-op safely. One attempt only, no retries. Does not affect failure_count or last_delivery_at aggregates.

  • Required scopes: webhooks:write
  • Required role: admin
  • Category: platform
  • Stability: stable

webhooks.write

Write Webhook

Create, update, or delete a webhook subscription. Use when registering a new destination, changing URL / event list / description / active, or removing a subscription. action="create" returns the secret once — record it. action="update" requires id and at least one patch field. action="delete" requires id. Reads use the webhook:// resource family.

  • Required scopes: webhooks:write
  • Required role: admin
  • Category: platform
  • Stability: stable

Workspaces (workspaces.*)

12 tools.

workspaces.add_member

Add Workspace Member

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 account is created and a setup link emailed; by user id, an existing account is attached. Requires workspace admin access on the target.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.create

Create Workspace

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. Validates the name, auto-generates a URL-safe slug from it (or accepts a desired slug, rejecting reserved or taken ones), and caps how many workspaces one user may own.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.delete

Delete Workspace

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 the owner cannot); it stamps deleted_at rather than hard-deleting, so the row can be recovered by an operator if needed.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.get

Get Workspace

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 your own membership level. Returns not-found when the caller is not a member or the workspace is missing or deleted, so existence is never leaked to outsiders.

  • Required scopes: workspaces:read
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.join_by_domain

Join Workspace By Domain

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-signup picker or the switcher). Re-checks eligibility server-side, adds you as a member at the least role, and notifies the owner. Idempotent if you already belong.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.leave

Leave Workspace

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 is blocked at the database level and must transfer ownership first so the workspace is never left without an owner.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.list

List My Workspaces

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 tenants the signed-in user can reach. Returns only the caller's own memberships; soft-deleted workspaces are excluded.

  • Required scopes: workspaces:read
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.list_joinable_by_domain

List Joinable Workspaces

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 rendering a post-signup join picker or the switcher's join-by-domain section. Scoped to the caller's own domain; excludes workspaces they already belong to and public mailbox domains.

  • Required scopes: workspaces:read
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.remove_member

Remove Workspace Member

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 (transfer ownership first). Requires workspace admin access on the target; the owner qualifies as an admin.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.transfer_ownership

Transfer Workspace Ownership

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 tenant over. Only the current owner may call this; the recipient must already be a member. The previous owner keeps their admin seat.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.update

Update Workspace

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 color shown behind the avatar. Requires workspace admin access on the target; the owner qualifies as an admin. Slug, ownership, and membership have dedicated operations.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

workspaces.update_member_role

Update Workspace Member Role

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 cannot be demoted (transfer ownership first). Requires workspace admin access on the target; the owner qualifies as an admin.

  • Required scopes: workspaces:write
  • Required role: viewer
  • Category: team
  • Stability: stable

Writing Samples (writing_samples.*)

7 tools.

writing_samples.archive

Toggle Writing Sample Archive Flag

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 the active voice-learning pool without losing the row — unlike delete, this preserves all junctions and style analysis so unarchiving brings everything back. isArchived defaults to true; pass false to restore. Idempotent; cross-tenant ids are rejected with code=not_found.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

writing_samples.create

Create Writing Sample Row

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 learning or become an inspirational example. Content body is required and capped at the platform sample length; omitted titles are auto-generated by Claude with a graceful null fallback. Style analysis kicks off asynchronously after the row lands so the caller gets an immediate return while classification proceeds in the background.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable

writing_samples.delete

Delete Writing Sample Row

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 voice or when cleaning up misplaced uploads. Junction rows on author_profile_writing_samples cascade via foreign-key ON DELETE; the shadow writing_samples row is removed via the artifact reverse trigger. Destructive — the settings UI should confirm before invoking.

  • Required scopes: config:write
  • Required role: admin
  • Category: context
  • Stability: stable

writing_samples.get

Get Writing Sample Detail Row

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 and needs every column the admin controller used to ship (raw content body, channel, content_type, source_url, style_analysis blob, narrative_pattern, style_tags, style_analyzed_at). Returns null when the id is stale or belongs to another tenant — the REST adapter maps null to HTTP 404.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

writing_samples.list

List Writing Samples With Author Ids

Enumerate every writing_samples row for the caller's workspace, optionally filtered by author_id (via junction), content_type, channel, or archive status, and return them with a flattened author_ids array per row for the settings page's sample-table view. Read when rendering the Writing Samples tab or when a picker needs the canonical sorted list. Archived rows are hidden unless status='archived' or status='all'. Limit capped at 500; offset pagination is supported.

  • Required scopes: config:read
  • Required role: viewer
  • Category: context
  • Stability: stable

writing_samples.propose_split

Propose Writing Sample Split Segments

Ask Claude to decompose a long prose document into coherent candidate writing samples so the operator can review and persist the useful ones individually. Invoke when a paste spans multiple posts/sections and manual splitting is tedious. Pure compute — nothing is persisted. Returns an array of { title?, content } segments plus a truncated flag when the input exceeded the 100k character LLM ceiling. Malformed model output maps to code=llm_invalid_json instead of throwing.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable
  • Expected latency: 15000 ms (median)

writing_samples.update

Patch Writing Sample Fields

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 the settings page or reorders samples in the list view. Metadata fields merge atomically into content_json so sibling keys written by the style analyzer (style_analysis, style_summary, narrative_pattern) survive the update. Content mutations kick off a background style re-analysis; empty patches are rejected with code=no_fields.

  • Required scopes: config:write
  • Required role: editor
  • Category: context
  • Stability: stable