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 (2)
- Agent Profile (1)
- Agent Run (2)
- Agents (7)
- Author Profile (2)
- Authors (14)
- Blueprint Backtest (2)
- Blueprint Output (4)
- Blueprint Run (2)
- Blueprint Schedule (5)
- Blueprints (6)
- Business Profile (8)
- Company (3)
- Connections (9)
- Console (4)
- Context (11)
- Context Entries (1)
- Context Entry (2)
- Conversation (2)
- Conversations (5)
- Data (6)
- External Search (1)
- External Search Jobs (1)
- Inspirational Reference (3)
- Knowledge Base (17)
- Metrics (1)
- Notifications (3)
- Notion Sync (7)
- Operation (2)
- Pages (11)
- Platform (3)
- Prompt (2)
- Prompts (32)
- Reference Document (1)
- Social (20)
- Step Kind (2)
- System (2)
- Team (12)
- Trigger Kind (2)
- Voice Profile (2)
- Webhook (3)
- Webhooks (2)
- Workspaces (12)
- Writing Samples (7)
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:
12000ms (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:
5000ms (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:
2000ms (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:
1000ms (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:
1500ms (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:
30000ms (median)
Actions:
enrich_company-- Full company brief: web + news + LinkedIn + Crunchbase + your interactions, fusedenrich_person-- Full person brief: LinkedIn + Crunchbase + web + Twitter + your interactions where they appear, fusedenrich_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:
8000ms (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:
20000ms (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:
1500ms (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:
3000ms (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:
2500ms (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:
1500ms (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:
2000ms (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:
2000ms (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:
3000ms (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:
3000ms (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:
2000ms (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:
8000ms (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:
15000ms (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