# Tool catalog

# Tool Catalog

The public API surface, grouped by resource prefix: **Search** (`search.run` / `search.query` / `search.fields`), **Enrich** (`enrich.*`), **Lookalike** (`lookalike.*`), and **Agents** (Chat, the reusable agent library, and Routines). Each entry shows the id, description, required scopes, and required role. These are the only operations reachable over REST with an external credential (a platform API key or an MCP/SDK OAuth token); browse the request/response shapes in the [API reference](../api-reference).

**Total tools: 28.**

## Groups

- [Agents](#agents-agents) (7)
- [Chat](#chat-chat) (7)
- [Enrich](#enrich-enrich) (3)
- [Lookalike](#lookalike-lookalike) (2)
- [Routines](#routines-routines) (6)
- [Search](#search-search) (3)

## Agents (`agents.*`)

7 tools.

### `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.create_agent`

**Create Workspace Agent**

Save a new tenant-authored agent: a named, reusable prompt the workspace can dispatch later by its stable kebab-case slug. Use when a user wants to capture a custom instruction set as a workspace agent. Rejects a slug that shadows an Amdahl library agent (those ship in code and cannot be replaced) and surfaces tenant slug collisions as a typed conflict.

- Required scopes: `agents:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

### `agents.delete_agent`

**Archive Workspace Agent**

Retire a tenant-authored agent by soft-archiving it out of the roster; the row is retained and nothing is destroyed. Use when the workspace no longer dispatches a saved agent. Archived agents disappear from listings immediately, while Amdahl library agents cannot be archived at all - they are code-defined and always available.

- Required scopes: `agents:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

### `agents.get_agent`

**Get Agent By Id Or Slug**

Fetch one named agent by slug or id, including the full prompt text it runs with. Resolves the Amdahl code library first, then falls back to the tenant row. Read when inspecting exactly what instructions an agent carries before dispatching, editing, or duplicating it. Returns null for another tenant or a missing id.

- Required scopes: `agents:read`
- Required role: `viewer`
- Category: `workflows`
- Stability: `stable`

### `agents.list_agents`

**List Workspace Agents**

List the workspace agent roster - Amdahl-shipped library agents merged with tenant-authored ones - as lean rows of slug, name, description, and provenance. Read when choosing which named agent should handle a task or rendering the agent directory. Library entries are code-defined and locked; tenant rows carry their creation time.

- Required scopes: `agents:read`
- Required role: `viewer`
- 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.update_agent`

**Update Workspace Agent**

Revise a tenant-authored agent's name, description, or prompt in place, keeping its slug stable. Call when refining how a saved agent behaves after seeing its output. Amdahl library agents are code-defined and immutable, so edits targeting one are refused with a locked error rather than silently ignored.

- Required scopes: `agents:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

## Chat (`chat.*`)

7 tools.

### `chat.get`

**Get Chat**

Fetch one Chat snapshot: name, status, its runs (with read handles), which runs are still in flight, and any pending human asks with their resume URLs. Read when rendering a Chat view, deciding whether to continue it, or surfacing an awaiting question to the human. Returns null for unknown or cross-workspace ids.

- Required scopes: `conversations:read`
- Required role: `viewer`
- Category: `conversations`
- Stability: `stable`

### `chat.get_preferences`

**Get Chat Preferences**

Fetch the calling user's saved Chat settings for this workspace: their default run-config knobs (depth, on_question, write_outputs/memory, external_search, include_divergence, actions_allowed) and their agent block list. Read when opening the Chat settings surface to seed its controls. Returns defaults when nothing is saved yet.

- Required scopes: `conversations:read`
- Required role: `viewer`
- Category: `conversations`
- Stability: `stable`

### `chat.get_run`

**Get Chat Run**

Read one Chat run snapshot: status, pause payload when awaiting input, the answer envelope (answer_text plus the ordered content_blocks with query and snapshot data), answered asks, and usage. Read when polling a started Chat for its result; pass wait_ms (max 30000) to long-poll until the run settles instead of tight-looping. Pass include=events to also get the persisted activity trace for transcript replay.

- Required scopes: `conversations:read`
- Required role: `viewer`
- Category: `conversations`
- Stability: `stable`

### `chat.list`

**List Chats**

List Chats for this workspace, newest activity first. Read when picking a Chat to continue, rendering a recents rail, or checking what the team has been asking. Each entry is a lean snapshot (name, status, turn count, last activity); filter by status or paginate via limit + offset.

- Required scopes: `conversations:read`
- Required role: `viewer`
- Category: `conversations`
- Stability: `stable`

### `chat.rename`

**Rename Chat**

Rename one Chat so the thread is findable later. Use when a chat was auto-titled from its first ask and deserves a human name, or when its focus shifted. Renames the underlying conversation title in place; runs, substrate, and handles are untouched. Returns the updated chat snapshot.

- Required scopes: `conversations:write`
- Required role: `editor`
- Category: `conversations`
- Stability: `stable`

### `chat.start`

**Chat**

Ask the workspace anything: opens or continues a named Chat and enqueues one Master agent turn. Use when starting an investigation over company data, memory, and connected sources. Always returns handles immediately (chat_id, run_id, stream/read/resume URLs) - subscribe to stream_url or poll read_url with wait_ms for the answer; never blocks.

- Required scopes: `conversations:write`
- Required role: `editor`
- Category: `conversations`
- Stability: `stable`

### `chat.update_preferences`

**Update Chat Preferences**

Save the calling user's Chat settings for this workspace: their default run-config knobs and/or their agent block list (the agents the Master may not delegate to). Use when the user changes a control in the Chat settings surface. A top-level PATCH — only the keys you send change; the block list applies to new Chat turns server-side.

- Required scopes: `conversations:write`
- Required role: `editor`
- Category: `conversations`
- Stability: `stable`

## Enrich (`enrich.*`)

3 tools.

### `enrich.company`

**Tiered Company Enrichment**

Tiered account intelligence for one company by domain. Use when preparing for an account: a cached brief returns instantly; on a miss you get the tenant’s own conversation evidence about that account in a bounded read while a background job rebuilds the full brief. Pass mode=full to wait for the complete web + LinkedIn + Crunchbase fusion instead.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `2000` ms (median)

### `enrich.person`

**Tiered Person Enrichment**

Tiered background on one person, keyed by linkedin_url or email (a bare name is refused as unresolvable). Call before an outreach or a meeting: a cache hit returns the stored person brief immediately; otherwise first-party mentions of them come back within seconds and the deep profile refresh is queued behind the scenes. mode=full blocks for the fused profile.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `2000` ms (median)

### `enrich.topic`

**Tiered Topic Enrichment**

Tiered market read on a topic or category term. Call when scoping a theme: a fresh topic brief from the store returns at once; on a miss the customer-voice evidence for that topic arrives in a bounded read while the full market fan-out regenerates behind the scenes. mode=full runs the whole divergence-map synthesis inline before answering.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `2000` ms (median)

## Lookalike (`lookalike.*`)

2 tools.

### `lookalike.find`

**Entity Lookalikes**

Find the entities most similar to a seed company or deal, ranked by centroid cosine similarity over the tenant’s own conversation corpus. Use for "more accounts like this one" prospect-expansion asks: give an entity_id (or a domain for companies) and get the nearest neighbours with scores. Honest degradation: when centroids are not materialized yet it says so instead of guessing.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `1000` ms (median)

### `lookalike.similar_themes`

**Similar Themes**

Rank the tenant’s ML conversation themes nearest in meaning to a free-text description. Use to locate which existing themes an idea, campaign angle, or complaint maps onto — a millisecond centroid match when the fast vector mirror is synced, transparently falling back to the warehouse theme index otherwise. Returns theme ids, labels, member counts, and similarity scores.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `2000` ms (median)

## Routines (`routines.*`)

6 tools.

### `routines.create`

**Create Routine**

Create a Routine: a cron that fires a Chat each occurrence, running one Master agent turn in a fresh named Chat. Use when the user asks for a standing refresh or a recurring investigation. Provide name, prompt, and cron (plus optional timezone and per-fire config like write_outputs or an agents roster); the fire never pauses on a human and each occurrence opens a new Chat.

- Required scopes: `routines:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

### `routines.delete`

**Delete Routine**

Permanently remove a Routine so its cadence stops firing. Use when the user no longer wants the standing scheduled ask. Deletion affects only future fires - Chats and documents earlier fires produced are untouched. Prefer disabling (routines.update enabled=false) when the user may want it back.

- Required scopes: `routines:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

### `routines.get`

**Get Routine**

Fetch one Routine in full: prompt, cadence, agent roster, per-fire config, enabled state, and the last fire pointers (Chat + run ids). Read when opening a routine detail view or before patching one. Unknown and cross-workspace ids return null.

- Required scopes: `routines:read`
- Required role: `viewer`
- Category: `workflows`
- Stability: `stable`

### `routines.list`

**List Routines**

List the workspace Routines, newest first: each entry carries the prompt, cadence (cron + timezone), agent pin, per-fire config, and last/next fire bookkeeping. Read when rendering the Routines page, checking what refreshes on a schedule, or picking one to update or fire now. Filter by enabled; paginate via limit + offset.

- Required scopes: `routines:read`
- Required role: `viewer`
- Category: `workflows`
- Stability: `stable`

### `routines.run_now`

**Run Routine Now**

Fire one Routine immediately, off-cadence: opens a fresh Chat and starts the Master turn exactly as the cron would. Use when the user wants the standing refresh right now instead of waiting for the next occurrence. Returns the Chat and run handles (stream/read/resume URLs) so the fire can be watched like any Chat.

- Required scopes: `routines:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

### `routines.update`

**Update Routine**

Patch an existing Routine: rename it, change its prompt or cadence, re-pin the agent, adjust per-fire config, or enable/disable it. Use when tuning a standing scheduled ask without recreating it. Only the supplied fields change; a cadence change is re-validated first and takes effect on the next scheduler tick.

- Required scopes: `routines:write`
- Required role: `editor`
- Category: `workflows`
- Stability: `stable`

## Search (`search.*`)

3 tools.

### `search.fields`

**Search Filter Fields**

Read when composing typed predicates for the routed search verb: the per-surface field catalog (interactions, deals, deal_qualification) listing each field with its type, description, and the comparison operators it admits. Derived live from the warehouse schema catalog - exactly what the filter compiler validates against, so it can never drift from the accepted vocabulary.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`

### `search.query`

**Routed Warehouse Search**

One routed door over tenant warehouse data: each ask lands on typed structured filters, an NL-to-SQL pass, or meaning-based vector similarity. Use for lookups where you hold a plain question OR typed field predicates and want the cheapest lane chosen automatically (force one via mode). Replies with which lane ran, rows or similarity matches, any compiled statement, and mirror freshness. Discover filterable fields via search_field://list first.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `2000` ms (median)

### `search.run`

**Fast Search**

Run a fast, synchronous search in ONE blocking call — the low-latency lane beside Chat. Use when you want an answer NOW rather than a full agent run: it plans the ask into one or more sub-questions, writes SQL over the interactions warehouse for each, and runs them in parallel; in blended mode it also does a quick web + news citation pass. Returns the per-question groups (rows + the SQL that ran) and any citations. Point open-ended, multi-step asks at Chat instead.

- Required scopes: `data:read`
- Required role: `viewer`
- Category: `data`
- Stability: `beta`
- Expected latency: `6000` ms (median)
