Riveter MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Riveter MCP ServerEnrich the company domains in my dataset with employee counts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Riveter MCP Server
An MCP (Model Context Protocol) server that connects AI assistants like Claude and Cursor to the Riveter API. Run enrichments, build datasets, scrape webpages, manage monitors, and more — directly from your assistant.
Tools are generated dynamically from Riveter's OpenAPI spec, so they stay up to date automatically.
Two ways to connect:
Hosted —
https://mcp.riveterhq.com/mcp. Nothing to install. Works from claude.ai, Claude Desktop, Cowork, Claude mobile, ChatGPT, Claude Code, and Cursor.Local (
npx) — this npm package, run on your machine over stdio. Use it when your client cannot reach remote servers.
Setup
1a. Hosted server (no API key needed up front)
Add https://mcp.riveterhq.com/mcp as a custom connector and click Connect. A browser window opens on Riveter: sign in and click Allow. Riveter creates an API key for that connection; it is listed in Settings → API keys, and revoking it disconnects the client.
Claude Code:
claude mcp add --transport http riveter https://mcp.riveterhq.com/mcpThen run /mcp and choose Authenticate.
Cursor:
{
"mcpServers": {
"riveter": {
"url": "https://mcp.riveterhq.com/mcp"
}
}
}If the client cannot open a browser, pass a key as a header instead: Authorization: Bearer sk_riv_your_key_here (Claude Code --header "Authorization: Bearer sk_riv_...", Cursor "headers": { "Authorization": "Bearer sk_riv_..." }).
1b. Local server (npx)
Get a Riveter API key at app.riveterhq.com/settings/api.
Claude Desktop — open the config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add the Riveter server:
{
"mcpServers": {
"riveter": {
"command": "npx",
"args": ["-y", "--prefer-online", "riveter-mcp-server@latest"],
"env": {
"RIVETER_API_KEY": "sk_riv_your_key_here"
}
}
}
}Cursor / Windsurf — add the same riveter entry to your MCP config (e.g. ~/.cursor/mcp.json).
Claude Code:
claude mcp add riveter --env RIVETER_API_KEY=sk_riv_your_key_here -- npx -y riveter-mcp-serverCodex:
codex mcp add riveter --env RIVETER_API_KEY=sk_riv_your_key_here -- npx -y riveter-mcp-serverKeeping the tools current: the local server loads the API definition once, when your client starts it, and keeps that process running. After Riveter ships an API change, restart your AI client (or the MCP server from its settings page) to load the new tools. --prefer-online riveter-mcp-server@latest makes the same restart also pick up new server versions. The hosted server needs no restart; it reloads the API definition every 10 minutes.
Related MCP server: Cloudflare Playwright MCP
Environment variables
Local (stdio) server — dist/index.js:
Variable | Required | Default | Description |
| Yes | — | Your Riveter API key |
| No |
| API base URL |
| No |
| OpenAPI spec URL. |
Hosted (Streamable HTTP) server — dist/http.js, deployed by Riveter:
Variable | Default | Description |
|
| Listen port |
|
| Public URL, exactly as users enter it (RFC 9728 |
|
| Authorization server advertised in the protected resource metadata |
|
| How often the spec is re-fetched; |
| as above |
The hosted server holds no API key. It forwards the caller's Authorization: Bearer ... header to the API on every call and answers 401 with a WWW-Authenticate challenge when the header is missing.
How it works
On startup, the server:
Fetches the OpenAPI spec from
docs.riveterhq.com/openapi.yamlParses each endpoint into an MCP tool with typed parameters and annotations (
readOnlyHintfromGET,destructiveHintfromDELETEor the spec'sx-mcp-destructive,openWorldHintfrom the spec'sx-mcp-open-world)Uses the spec's
info.x-mcp-instructionsas the short server-levelinstructions(the long API overview stays on the docs site); an operation'sx-mcp-descriptionreplaces itsdescriptionfor the tool when setAdds one
helptool whose topics (column config, formats, tools,run_when, examples, credits, limits, errors, ...) come from the spec'sinfo.x-mcp-help— long guidance is loaded only when the assistant asks for itServes the tools over stdio (local) or Streamable HTTP (hosted)
When the API docs are updated, the local server picks up the changes the next time your assistant launches, and the hosted server re-fetches the spec every 10 minutes — no rebuild or republish needed.
Development
Source: github.com/riveterhq/riveter-mcp. Issues welcome there.
npm install
npm test # build + unit + stdio e2e + http e2e
npm run dev:http # hosted server on :8080 (set MCP_PUBLIC_URL=http://localhost:8080/mcp)This repository is a read-only mirror of the mcp-server/ directory of Riveter's private monorepo, where development happens. The spec-contract tests need the monorepo's openapi.yaml, so they skip here. Releases are described in PUBLISHING.md.
Support
Questions or issues? See the Riveter API docs or contact support@riveterhq.com.
License
MIT
Available Tools
39 toolsadd_dataset_rowsAdd rowsAInspect
add rows
Append up to 100 rows (objects keyed by input column name; free). Duplicates on the index column are skipped (skipped_duplicates). Returns the inserted rows. Then enrich with dataset_id. More rows: import_dataset_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| rows | Yes | Objects keyed by input column name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so the description is not carrying the safety burden alone. It still adds real behavioral context: duplicate handling on the index column with a `skipped_duplicates` result, that inserted rows are returned, the 100-row cap, and that the call is free. Missing only permission/auth expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded: the limit and row shape come first, then duplicate behavior, return value, and next step. The telegraphic fragments ('Then `enrich` with `dataset_id`', bare 'free') are efficient but slightly under-explained, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema, it covers the key facts an agent needs: cap, row format, duplicate semantics, what is returned, cost, and the natural next call. Auth requirements and failure modes are the notable omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3. The description goes beyond it by introducing the index-column duplicate concept, which is not expressed in the schema and explains how row contents are interpreted, plus restating the 100-item cap in operational terms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Append up to 100 rows') with the row shape defined as objects keyed by input column name. It differentiates from the sibling `import_dataset_rows` for larger volumes, though the first sentence does not explicitly tie the operation to a dataset (that only emerges from the `dataset_id`/`id` reference).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative for the over-100 case ('More rows: `import_dataset_rows`') and sketches the follow-on workflow ('Then `enrich` with `dataset_id`'). It does not say when to prefer this over `update_dataset_row` for modifying existing rows, so routing against that sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_configured_datasetBuild configured listAInspect
build configured list
Run a configured list build — a reusable, pre-configured list template (id cds_...) set up for your account ("Configured list builds" in the app). The spec, prompt template, row cap, and per-run credit cost are all defined on the template; you only supply parameters to fill in its {{ placeholder }} values.
Returns the list-build run; poll GET /runs/{id}. The rows land in a dataset named by the run's dataset_id; fill them with POST /enrich.
Example — Fill in template parameters: { "parameters": { "practice_type": "dentists", "state": "ohio" } }
Workflow: Starts an async run of a configured list build. Poll get_run; the rows land in the dataset the run's dataset_id names (list_dataset_rows), then enrich with it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Configured dataset id (cds_...) | |
| tier | No | Optional pricing/depth tier when the template defines tiers | |
| parameters | No | Values for the template's placeholders (keys defined by the template) | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| dataset_webhook_url | No | URL to POST the dataset results to when the build completes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare mutation, open-world, non-idempotent, non-destructive; the description adds the parts annotations cannot: it is asynchronous, credits are charged, `max_credits` causes a 422 with nothing charged, `estimate_cost` prices without running, and a webhook can receive results. It also says exactly where the output lands (`dataset_id` → `list_dataset_rows`).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then example, then workflow — easy to scan. There is mild redundancy: 'Run a configured list build' and the Workflow's 'Starts an async run of a configured list build' restate the same fact, and the inline markdown links duplicate the sibling names used in Workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates fully by naming the return value (the list-build run), how to poll it, where rows materialize, and the follow-up enrichment call. For a 6-parameter async mutation this is complete enough to invoke correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: `parameters` are values for the template's `{{ placeholder }}` keys, illustrated with a concrete JSON example. `tier` and `dataset_webhook_url` are left to the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a configured list build') and explains the distinguishing mechanism: the spec, prompt template, row cap, and credit cost live on a reusable template (id `cds_...`) so the caller only supplies `parameters`. That functionally separates it from `build_dataset`, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Workflow block gives an explicit when-and-then sequence with named siblings: start the run, poll `get_run`, read rows via `list_dataset_rows`, then `enrich`. It does not state when *not* to use it (e.g. to define an ad-hoc spec, use `build_dataset`), so the alternative routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_datasetBuild datasetAInspect
build dataset
Build a dataset: rows you send or rows Riveter finds. rows (≤ 100 objects keyed by input column name, free) or prompt + count (generated, paid); output columns from attributes or enrichment_id, or, with prompt + count alone, written from the prompt (one typed column per fact it asks for) along with the identity columns; auto_fill: true fills generated rows when they land; budget caps a generation's spend (default 50 + 1.5 per row). Returns the dataset (id, ds_...) and run (the generation run, or null); then enrich with dataset_id alone. estimate_cost: true prices it first. help with datasets.
Example — Rows you have, two columns to fill: { "name": "Targets", "rows": [ { "Company": "Apple", "Website": "apple.com" }, { "Company": "Shopify" } ], "attributes": [ "CEO", "HQ city" ] }
Example — Generate 50 rows on a 100-credit budget, filled when they land, refused above 200 credits: { "prompt": "Specialty coffee roasters in San Francisco", "count": 50, "input_columns": [ "Roaster", "Website" ], "attributes": [ "Founded year" ], "auto_fill": true, "budget": 100, "max_credits": 200 }
Example — The whole dataset from the prompt — identity columns and typed output columns: { "prompt": "Top 50 US fintech startups with their CEO, total funding, and founding year", "count": 50, "auto_fill": true }
Workflow: The response is the dataset and, with prompt + count, a generation run — poll it with get_run, then read the rows with list_dataset_rows (auto_fill: true researches them as they land).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name | |
| rows | No | The rows, keyed by input column name. Up to 100; more with POST /datasets/{id}/rows/import. | |
| count | No | How many rows to generate for prompt. Capped per account. | |
| budget | No | Most credits the build may spend (default 50 + 1.5 per row); charged at kickoff, settled to the agent's spend. A low budget means fewer rows. | |
| prompt | No | What the rows are, for Riveter to find them. Requires count. | |
| auto_fill | No | With count: fill the output columns when the rows land (a second paid run). | |
| attributes | No | Output column names; they become the dataset's own enrichment's columns, typed from their names. Not with enrichment_id. Nothing is filled until POST /enrich (or auto_fill). | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| webhook_url | No | POSTed the list-generation run when it finishes | |
| enrichment_id | No | A saved enrichment (enr_...) whose output columns become the dataset's. Not with attributes. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| input_columns | No | Input column names (row identity). Optional with rows; with prompt, the identity columns to generate — omitted, they are written from the prompt, and with no attributes / enrichment_id the output columns are too. | |
| fill_webhook_url | No | With auto_fill: POSTed the fill run when it finishes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, open-world, non-destructive, but say nothing about cost. The description carries that burden well: `rows` is free, prompt+count is paid, budget is charged at kickoff and settled, `auto_fill` triggers a second paid run, and `max_credits` causes a 422 credit_cap_exceeded with nothing charged. That is exactly the behavioral context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the mode split and the return shape come before the examples, and the three examples each demonstrate a distinct parameter combination rather than repeating prose. The opening line "build dataset" only echoes the name and title and is wasted space in an otherwise efficient definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description covers the return value (`id`, `ds_...`, and `run` or null), the follow-up calls, and the cost model. An agent has enough to choose a mode, construct a valid request, and know what to do with the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds relational meaning the schema does not: the rows/propmt-count mode split, the attributes-vs-enrichment_id exclusivity in practice, and the fact that output columns are written from the prompt when neither is supplied. It also restates budget's default formula, which is already in the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Build a dataset") and immediately splits the tool into its two functional modes: rows you send vs rows Riveter finds. That framing distinguishes it from add_dataset_rows, import_dataset_rows, and build_configured_dataset without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to guidance: use `rows` for data you have, `prompt` + `count` for generation, `estimate_cost: true` to price first, and `help` with `datasets` for more. It also states the post-build workflow (poll `get_run`, read with `list_dataset_rows`). It never explicitly says when to prefer sibling tools like build_dataset_rows or build_configured_dataset, which keeps this below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_dataset_rowsGenerate more rowsAInspect
generate more rows
Generate count more rows for a dataset (paid; estimate_cost first). Needs a index_column on the dataset (update_dataset). prompt says what to find (default: the dataset's last build prompt); the generator skips the existing rows and may find fewer than count — the finished run's progress has requested_rows, generated_rows, added_rows, skipped_duplicate_rows. auto_fill: true fills them when they land. Returns the dataset and run.
Example — Fifty more, filled on arrival: { "prompt": "Specialty coffee roasters in Oakland and Berkeley", "count": 50, "auto_fill": true }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| count | Yes | How many rows to generate. Capped per account. | |
| budget | No | Most credits the build may spend (default 50 + 1.5 per row); charged at kickoff, settled to the agent's spend. A low budget means fewer rows. | |
| prompt | No | What the rows are. Default: the prompt of the dataset's latest build. | |
| auto_fill | No | Fill the new rows' output columns when they land (needs an enrichment on the dataset) | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| webhook_url | No | POSTed the generation run when it finishes | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| fill_webhook_url | No | With auto_fill — POSTed the fill run when it finishes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses billing and settlement behavior, that the generator skips existing rows and may return fewer than requested, the exact progress counters (requested_rows, generated_rows, added_rows, skipped_duplicate_rows), and auto_fill semantics. The return shape (dataset and run) is also stated, which the annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key requirements and cost warning are front-loaded, and the worked JSON example is genuinely illustrative rather than filler. Minor waste from echoing the title phrase ('generate more rows') before the real sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, non-idempotent, open-world mutation with no output schema, the description covers cost, prerequisites, side effects, and return shape. It leaves the budget vs max_credits distinction entirely to the schema, which is a small residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents every parameter including defaults and the max_credits 422 behavior. The description adds the useful default-source detail for `prompt` (the dataset's last build prompt) and the effect of auto_fill, but largely restates what the structured fields provide, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate `count` more rows for a dataset'), making clear this extends an existing dataset rather than creating one. It does not explicitly name the nearest siblings (build_dataset for initial builds, add_dataset_rows for manual rows), so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real preconditions: paid operation, call estimate_cost first, dataset needs an index_column set via update_dataset. That is clear context for when to use it, though it stops short of explicit alternatives and when-not conditions relative to add_dataset_rows or build_dataset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_enrichmentCreate enrichmentAInspect
create enrichment
Create an enrichment (no run, free) and the empty dataset it fills, bound to it and in the app at app_url. A recipe: prompt (the task), output columns (names, or { name, prompt, output_schema, tool } — tool: "<list_tools name>" pins a tool: one call per row, arguments chosen by the agent, result is the cell; help with output_schema / pinned_columns), optional input_columns, budget (credits per row, default 1.5 per output column; follows column adds / removes unless budget_locked), only_tools / additional_tools (list_tools). Prefer prompt alone: the output columns (one typed column per fact asked for), name, and input columns are written from it; the response shows them. Then add_dataset_rows to the dataset_id and enrich with it (preferred), or enrich with enrichment_id + input for a one-off. dataset_id alone answers a dataset's own enrichment as { id, name, app_url, dataset_id } (422 without output columns; add them with update_dataset).
Example — Save a recipe — three columns, one typed: { "name": "Company basics", "prompt": "Research each company from its name and website.", "input_columns": [ "Company", "Website" ], "output": [ "CEO", { "name": "Employee count", "prompt": "Current headcount as an integer", "output_schema": { "type": "integer", "minimum": 0 } }, { "name": "Summary", "prompt": "Two sentences on what the company sells and to whom" } ], "budget": 4 }
Example — The recipe written from the prompt — columns, name, and input columns: { "prompt": "Research each company from its name and website: the CEO, employee count, latest funding round date and amount, and whether it is hiring." }
Example — A dataset's own enrichment: { "dataset_id": "ds_018f6a70-1234-7abc-89ab-0123456789ab" }
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Recipe: display name | |
| budget | No | Recipe: credits the row agent may spend per row. Default 1.5 per output column. | |
| output | No | Recipe: the columns to fill; a plain string is a name whose type is inferred. Omit it and the columns are written from the prompt, one per fact it asks for, each typed. | |
| prompt | No | Recipe: the task prompt the row agent reads for every row. Required without dataset_id. | |
| dataset_id | No | Alone: a dataset's id (ds_...); answers its own enrichment. Not with the fields below. | |
| only_tools | No | Recipe: exactly these tools (GET /tools). Replaces the default set. | |
| budget_locked | No | Recipe: true keeps the budget as set when output columns are later added or removed; false lets it move by 1.5 per column. | |
| input_columns | No | Recipe: the headers rows must carry, the dataset's input columns. Omit for any (one `Input` column), or, without output, for the ones the prompt implies. | |
| additional_tools | No | Recipe: the default tools plus these (GET /tools; some need enabling on the account or a linked key). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say not-readOnly, not-destructive, not-idempotent; the description adds meaningful behavior: no run is triggered, no credits are spent, an empty dataset is created and bound, a 422 is returned when `dataset_id` alone has no output columns, and budget auto-adjusts by 1.5 credits per column unless `budget_locked`. It doesn't cover permissions or what the response looks like beyond the id/name/app_url tuple, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line and the 'Prefer prompt alone' directive are front-loaded, and the three examples are labeled and useful. The first paragraph is a dense run-on packing ~8 distinct rules into one block, which costs some readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers both call modes, the sequencing with `add_dataset_rows`/`enrich`, the error path, budget semantics, and the tool-pinning feature, backed by three concrete payload examples. For a 9-parameter tool with no output schema, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds cross-parameter meaning — the string shorthand for `output`, `tool: "<list_tools name>"` semantics ('one call per row, result is the cell'), budget default and its movement on column add/remove, and the `only_tools` vs `additional_tools` relationship. This goes beyond the per-property schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus its scope: creating an enrichment that does NOT run and is free, along with the empty dataset it fills. It also distinguishes the two modes (recipe creation vs. `dataset_id`-only lookup of a dataset's own enrichment), so an agent can tell it apart from `enrich`, which actually runs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: create here, then `add_dataset_rows` on the returned `dataset_id` and `enrich` with it (marked preferred), versus `enrich` with `enrichment_id` + `input` for a one-off. It also says 'Prefer `prompt` alone' and names `update_dataset` for the 422 case with no output columns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_extractionCreate extractionAInspect
create extraction
Create an extraction — a reusable recipe for scraping structured records from a website — and start its agent discovery. Discovery explores the site, builds the scrape/extract plan, and validates it against your schema.
Poll GET /extractions/{id} until status is ready, then execute it with POST /extractions/{id}/runs. The extraction (ext_...) and its runs (run_...) are different resources.
Creating an extraction charges discovery credits (returned as credits_charged). To see the price first, send estimate_cost: true.
Example — Create an extraction: { "starting_url": "https://example.com/products", "goal_description": "Extract every product with its name and price", "output_record_json_schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" } } }, "required_keys": [ "name" ] }
Workflow: Discovery is async but returns no run — poll get_extraction until status is 'ready', then execute with run_extraction.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| starting_url | Yes | Where the agent starts exploring | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| required_keys | No | Record keys that must be non-empty for a record to count | |
| goal_description | Yes | What records to extract, in plain language | |
| output_record_json_schema | Yes | JSON schema of one output record |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description carries real behavioral weight beyond the annotations: discovery is async and returns no run (a common failure mode for an agent expecting a run handle), credits are charged and surfaced as `credits_charged`, and the estimate path charges nothing. It does not note that the call is non-idempotent (idempotentHint=false), so a retried request would silently create a second extraction — a meaningful omission for a create tool with no annotations covering duplication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the resource definition, then workflow, then example — a sensible ordering that lets an agent stop reading once it has what it needs. It loses a little to the redundant lowercase "create extraction" opener that merely restates the title and to the URL-fragment link syntax, which is noise in an agent-facing description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 7-parameter, multi-step, credit-charging async operation with no output schema, so the description must do the work — and it largely does, covering the async contract, the charge, and the follow-up call. It is a bit thin on what the create response actually contains beyond `credits_charged` and `status` (field names an agent would poll on are only implied).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all seven parameters (including the 422 credit_cap_exceeded behavior for max_credits); baseline is 3. The description goes past that by supplying a worked example that shows the relationship between starting_url, goal_description, output_record_json_schema and required_keys, and by restating estimate_cost as an actionable pricing switch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create an extraction — a reusable recipe for scraping structured records from a website") and immediately bounds the scope: it creates the recipe, not the runs. It explicitly distinguishes the extraction (`ext_...`) from its runs (`run_...`) and names the siblings that operate on each, so an agent can separate it from run_extraction/get_extraction without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the full lifecycle: create → poll `get_extraction` until status is `ready` → execute with `run_extraction`, plus the escape hatch of `estimate_cost: true` to price before committing. When-to-use, what to do next, and which sibling handles each step are all explicit; nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_monitorCreate monitorAInspect
create monitor
Create a monitor: a schedule that fills a dataset's output columns again daily, weekly, or monthly, compares each cell with the previous run, and can POST results (or only changes) to a webhook. Pass dataset_id and optionally columns (output column names; every one when omitted); the rows are the dataset's, no input. Creation is free; every run charges the fill price. estimate_cost: true prices one run. help → monitors.
Example — Daily monitor on a dataset, webhook only on changes: { "dataset_id": "ds_018f5b60-1234-7abc-89ab-0123456789ab", "columns": [ "Headcount", "Latest funding round" ], "cadence": "daily", "hour": 9, "minute": 0, "timezone": "UTC", "alert_rule": "on_diff", "output_format": "include_diffs", "webhook_url": "https://your-server.com/webhook" }
Example — Weekly monitor, every output column, results every run: { "dataset_id": "ds_018f5b60-1234-7abc-89ab-0123456789ab", "cadence": "weekly", "day_of_week": 1, "hour": 7, "minute": 30, "timezone": "America/New_York", "webhook_url": "https://your-server.com/webhook" }
Workflow: Creates a scheduled monitor. Check it with get_monitor, pause it with update_monitor (enabled: false), and list its runs with list_monitor_runs.
| Name | Required | Description | Default |
|---|---|---|---|
| hour | Yes | Hour of the day to run | |
| input | No | Monitors on a legacy enrichment only — fixed rows every scheduled run enriches (same shape as enrich input). Refused on a dataset monitor; its rows are the dataset's. | |
| minute | Yes | Minute of the hour to run | |
| cadence | Yes | How often the monitor runs | |
| columns | No | Output column names each run fills. Omit for every output column, including ones added later. | |
| timezone | Yes | Timezone (e.g. 'UTC', 'America/New_York') | |
| alert_rule | No | When the webhook fires — every run, only when a monitored cell changed since the previous run, or never (default each_run) | |
| dataset_id | No | The dataset to fill again on the schedule (ds_...). One of dataset_id / enrichment_id is required. | |
| day_of_week | No | Day of the week (0=Sunday, required for weekly) | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| webhook_url | No | URL to receive results each scheduled run | |
| day_of_month | No | Day of the month (required for monthly) | |
| enrichment_id | No | Instead of dataset_id — the enrichment bound to the dataset (enr_...). A legacy enrichment's id creates a monitor on it over fixed `input` rows (legacy API docs); the response carries `legacy`. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| output_format | No | include_diffs adds `previous_value` and `changed` to every cell of the run's output and webhook payload (default current_only) | |
| run_immediately | No | Also run the monitor immediately after creation (a paid run) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the billing model (creation free, every run charged, estimate_cost prices one run), the comparison behavior between runs, the webhook firing modes, and the fact that dataset monitors use the dataset's rows rather than input. This is substantial behavioral context for a mutating, non-idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core definition and then uses examples and a workflow sentence, which is appropriate for a 16-parameter creation tool. It is slightly long and opens with a redundant lowercase 'create monitor', but the examples and structure earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count, nested input object, and absence of an output schema, the description is complete enough to call the tool correctly. It covers the schedule, cost model, webhook behavior, dataset versus legacy enrichment distinction, examples, and follow-up workflow while relying on the schema for exhaustive parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description adds practical meaning through examples and clarifications such as omitting columns meaning all output columns, dataset monitors not using input, and estimate_cost returning a price without running. It does not add prose semantics for every parameter, but it improves the most important ones.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource, then explains the monitor's distinctive behavior: scheduled re-filling of dataset output columns, cell-by-cell comparison with the previous run, and optional webhook posting. It also names the sibling tools used to inspect, pause, and list runs, making it clearly distinguishable from create_enrichment or update_monitor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear post-creation workflow guidance with get_monitor, update_monitor, and list_monitor_runs, and explains that dataset_id is the normal path while input is for legacy enrichment monitors. However, it does not explicitly state when to choose create_monitor over other creation tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_datasetDelete datasetADestructiveIdempotentInspect
delete dataset
Delete a dataset by id (rows and cells with it; its enrichment stays). 409 dataset_in_use while a run is on it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds meaningful behavior not in structured data: rows and cells are removed, enrichments survive, and a specific 409 `dataset_in_use` condition fires while a run is active. That cascade and error semantics materially reduce the risk of a mistaken destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is two tight, front-loaded sentences with the cascade semantics and the error condition in priority order. The leading 'delete dataset' line merely restates the name/title and could be dropped, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a trivial one-param input, the description covers what an agent needs: what gets destroyed, what survives, and the blocking condition. It does not state the success response shape or whether the deletion is immediate vs. queued, but that is a small gap for a destructive delete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `id` parameter is fully documented in the schema (including the `ds_...` format), so the description's 'by id' phrasing adds nothing beyond it. Baseline 3 is appropriate when schema coverage is 100% and the description supplies no extra format or lookup guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Delete a dataset by id') and clarifies the cascade scope (rows and cells go with it; enrichment stays). It does not explicitly contrast with the sibling delete_dataset_rows, so the agent must infer the distinction, but the scope of this tool is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a concrete precondition: a 409 `dataset_in_use` error occurs while a run is on the dataset, which tells the agent it must ensure no run is active first. It stops short of naming an alternative tool for deleting individual rows or handling the 409 course of action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dataset_rowsDelete rowsADestructiveIdempotentInspect
delete rows
Remove rows: ids (comma-separated row_... ids) and / or positions (comma-separated positions from 1), up to 100 rows together. Returns the number deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| ids | No | Comma-separated row ids (row_...). ids and positions together name up to 100 rows; one of them is required | |
| positions | No | Comma-separated row positions (integers from 1, as GET rows reports them) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuine extra context: a 100-row cap per call and the fact that it returns the number deleted. It does not dig into partial-failure behavior or what happens with invalid ids, keeping it at a solid but not rich 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the operational rule and the return value front-loaded; nothing wasted beyond the lowercase 'delete rows' fragment that merely echoes the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 3-parameter tool with full schema coverage and annotations carrying the safety profile, the description covers the batch cap and return shape, leaving little an agent needs to know. Edge cases (nonexistent ids, partial deletes) are omitted but are minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains ds_/row_ prefixes, comma-separated syntax, 1-based positions, and the 100-row combined limit. The description restates the same combination rule without adding format nuance, which is baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Remove rows' from a dataset) and enumerates the two ways to identify rows, which distinguishes it from siblings like delete_dataset, update_dataset_row, or list_dataset_rows. It does not explicitly name a sibling it might be confused with, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'ids and/or positions' framing and the note that one is required, but there is no explicit when-to-use versus when-not-to-use guidance or reference to alternatives. An agent can infer the purpose from the model, but routing is left to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_enrichmentDelete enrichmentADestructiveIdempotentInspect
delete enrichment
Delete an enrichment by id. Runs in flight finish; a dataset bound to it keeps its columns. A legacy enrichment's id is refused (422 with legacy); those are deleted in the app.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The enrichment id (enr_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, so the safety profile is covered. The description adds value the annotations cannot: a dataset bound to the enrichment keeps its columns, and legacy ids fail with a specific 422 error code. The phrase 'runs in flight finish' is opaque and the re-delete/idempotency behavior is not spelled out beyond the hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded, three short sentences with no filler. The only waste is the leading lowercase restatement of the tool name, which duplicates the title and the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with rich annotations and no output schema, everything an agent needs is present: what is deleted, what collateral state is preserved (dataset columns), and the specific failure mode for legacy enrichments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema coverage, so the baseline is 3. The description goes one step further by explaining the id namespace constraint (legacy ids are rejected with 422), which is meaningfully more than the schema's 'enr_...' format note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete an enrichment by id'), which is unambiguous and separable from siblings like get_enrichment, update_enrichment, and delete_dataset. An agent can identify the operation without consulting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear negative condition: legacy enrichments are refused with a 422 `legacy` and must be deleted in the app instead. That is real routing guidance. It does not, however, contrast with delete_dataset or discuss any prerequisite checks (e.g., confirm the id first with get_enrichment).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrichEnrichAInspect
enrich
Add AI-researched columns to rows. Rows come from exactly one of dataset_id (ds_..., preferred) or input (inline, columnar: { "Header": ["row1", "row2"] }, all arrays equal length; a one-off, nothing kept).
Preferred: put the rows in a dataset first (build_dataset with rows + attributes or enrichment_id, free; it keeps the rows and filled cells), then enrich with its dataset_id: fills its cells with its enrichment; no column config needed. Default scope: every pending, stale, or failed cell; columns, rows, positions narrow it; force: true re-runs filled cells. prompt + attributes fills the named columns, adding the missing ones first; output is refused (update_dataset sets a column's prompt / schema / tool). help with datasets.
With input, column config is exactly one of, most consistent first:
enrichment_id— a saved enrichment (enr_...,list_enrichments): fixed, tested config; up to 10,000 rows; input headers must match its input columns (get_enrichment).prompt+attributes— the task and up to 20 column names; no setup; up to 1,000 rows.output— per columnprompt, optionaloutput_schema, optional pinnedtool; up to 1,000 rows.helpwithcolumn_configorexamplesfirst.
Returns a run. Poll get_run_result with wait: 50 (or pass webhook_url); a dataset fill's result is { "rows": [...] }, only the rows it ran. estimate_cost: true prices it without running. A legacy key in the response means the call took a legacy mode (a legacy enrichment's id, legacy-pipeline column fields); follow legacy.successor.
Example — Run a saved enrichment: { "enrichment_id": "enr_018f5b60-1234-7abc-89ab-0123456789ab", "input": { "Company Name": [ "Acme Corp", "Tech Solutions Inc" ] } }
Example — Prompt + attributes (a task and column names): { "prompt": "Research each company", "attributes": [ "CEO", "Employee Count", "Industry" ], "input": { "Company": [ "Apple", "Google" ] }, "webhook_url": "https://your-server.com/webhook" }
Example — A spec per output column: { "output": { "Employee Count": { "prompt": "Find the number of employees at this company", "output_schema": { "type": "integer" } } }, "input": { "Company": [ "Apple", "Google" ] } }
Example — Fill a dataset's pending, stale, and failed cells: { "dataset_id": "ds_018f6a70-1234-7abc-89ab-0123456789ab" }
Example — Re-run one column on rows 10–12, even if filled: { "dataset_id": "ds_018f6a70-1234-7abc-89ab-0123456789ab", "columns": [ "CEO" ], "positions": [ 10, 11, 12 ], "force": true }
Workflow: Starts an async run. Call get_run_result with the returned run id and wait: 50 until status is 'success'; its output is the result.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | With dataset_id: only these rows (row_... ids). May be combined with positions. Default: every row. | |
| force | No | With dataset_id: re-run every cell in scope, whatever its state (the same as states naming every state). | |
| input | No | Row source: inline columnar data | |
| output | No | Config source: a spec per output column (prompt, output_schema, tool) | |
| prompt | No | Config source: the task the agent follows for every row (requires attributes) | |
| states | No | With dataset_id: the cell states to run, e.g. ["not_found"] to research the not-found cells again. Default: pending, stale, failed. Not combined with force. | |
| columns | No | With dataset_id: only these output columns (by name). Default: every output column. | |
| run_key | No | Optional idempotency key, unique per account. Becomes the run id ("run_<run_key>"), so it is limited to letters, digits, and . _ ~ - characters. A duplicate returns 409. | |
| targets | No | With dataset_id: several boxes of columns × rows in one run, e.g. CEO on rows 3-4 and HQ on rows 20-22. The scope is their union. Not combined with the flat columns / rows / positions. | |
| positions | No | With dataset_id: only the rows at these positions (from 1, as list_dataset_rows reports them). May be combined with rows. | |
| attributes | No | Config source: the output column names, typed from their names (requires prompt). Max 20. | |
| dataset_id | No | Row source: a ds_... id. Fills the dataset's cells with its bound enrichment; no column config with it. | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| webhook_url | No | URL to POST the results to when the run completes | |
| enrichment_id | No | Config source: id of a saved enrichment (enr_...) | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| allow_duplicate_input | No | With enrichment_id — allow re-running rows already present in the enrichment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the write/open-world/non-destructive profile, and the description adds important runtime behavior: async runs, polling with `get_run_result`, `estimate_cost`, webhooks, `run_key` duplicate 409s, credit-cap 422s, and legacy-mode responses. These are meaningful operational details beyond the annotation surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and well organized around row source, config source, examples, and workflow. It is long, but the 17-parameter surface and nested config justify most of the length; some examples and schema-adjacent restatements could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description fills that gap by explaining that the tool starts an async run, how to poll it, what dataset-fill results look like, and how to use `estimate_cost`. For a complex mutation tool with nested parameters and no output schema, this is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds relational semantics that the schema alone only partly conveys: rows come from exactly one of `dataset_id` or `input`, column config is exactly one of the three ordered modes, and conditional row limits differ by mode. It also explains preferred workflow, default scope, and how `force`, `states`, `columns`, `rows`, and `positions` interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states the specific action: adding AI-researched columns to rows. It clearly distinguishes the two row sources (`dataset_id` vs. inline `input`) and explicitly routes dataset-preparation work to the sibling `build_dataset`. An agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly gives a preferred workflow, names alternatives like `build_dataset` and `update_dataset`, and explains when each configuration mode applies. It also states exclusions such as `output` being refused with `dataset_id` and clarifies default scope versus narrowed scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_datasetExport dataset (CSV, Excel, or JSON Lines)ARead-onlyIdempotentInspect
export dataset (CSV, Excel, or JSON Lines)
The dataset as CSV text (or JSON Lines with output_format: "jsonl"; xlsx is binary and meant for a browser): input columns, then output columns, one line per row. For a few rows prefer list_dataset_rows (it carries cell states).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| output_format | No | `csv` (default), `xlsx`, or `jsonl`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the output is 'CSV text' with input columns then output columns, one line per row, and that xlsx is binary and browser-oriented — a critical operational caveat for an agent that can't handle binary. It does not discuss size limits or truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line restates the title verbatim, which is dead weight, and the second sentence stacks parentheticals (jsonl note, xlsx note, list_dataset_rows note) that tax readability. The useful content is front-loaded, but it could be tightened to two clean sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully describes the returned shape (CSV text, input then output columns, one row per line) and the format alternatives. Combined with annotations covering safety, an agent has enough to call it correctly; the only gap is behavior for large datasets or pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented with an enum. The description still adds meaning beyond the schema by explaining what `jsonl` produces and flagging that `xlsx` is binary/browser-suited, which affects how an agent should pick a format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (export dataset) and enumerates the supported formats (CSV, Excel, JSON Lines), making the operation unambiguous. It also names a sibling (list_dataset_rows) for the small-row case, though the opening line mostly repeats the title rather than framing the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit alternative with a condition: 'For a few rows prefer `list_dataset_rows` (it carries cell states).' It also implicitly steers away from xlsx for agent use by noting it is binary and meant for a browser. No guidance on very large exports or rate/size limits, but the core when-to-use routing is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountAccountARead-onlyIdempotentInspect
account
Information about the account associated with the API key: plan, credit balance, and the key's metadata. Unchanged from the legacy API (response uses the legacy request_status format).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the full safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real context beyond them: it discloses that the response uses the legacy `request_status` format and that the data is scoped to the API key's account, both of which affect how an agent should parse the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the payload contents front-loaded, plus a useful legacy-format caveat. The leading bare word "account" on its own line merely restates the name and earns nothing, which keeps it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden; it identifies the main response contents and flags the legacy format. It stops short of describing the actual field layout of the `request_status` envelope, but for a 0-param read-only lookup this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to compensate for. Nothing is missing in this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and its contents specifically: plan, credit balance, and API-key metadata for the account tied to the credential. No sibling tool touches account data, so it is trivially distinguishable, though the verb is implied ("Information about...") rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer this is the tool to call when it needs credit/plan status, and no sibling competes for that role. There is no explicit when-to-use or exclusion statement, so it stays at the implied-usage level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_datasetRead datasetARead-onlyIdempotentInspect
read dataset
One dataset by id: input_columns, index_column, enrichment_id + output_columns (names; get_enrichment has the prompts), row_count, import_in_progress, newest runs. Rows are list_dataset_rows.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds substantive behavioral content on top: the payload includes `import_in_progress`, signalling that a dataset may be mid-import and its data incomplete, and that `runs` is only the newest set rather than history. It does not mention permissions or failure behavior for a bad id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very compact and front-loaded: identification first, payload contents second, sibling routing last. Every clause carries information and none is filler. The telegraphic, punctuation-dense formatting is slightly harder to parse than plain sentences, which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of describing returns and does so field by field, including the subtle import-state flag. Combined with the annotation coverage, an agent has what it needs to select and invoke this correctly. It omits what happens on a missing or malformed id, a small remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter at 100% schema description coverage, with the `ds_...` format documented in the schema itself. The description says "by id" but adds no format, validation, or lookup-failure semantics beyond that. Baseline 3 is correct when the schema fully carries the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("read dataset", "One dataset by id") and immediately enumerates the returned fields, which lets an agent recognize this as the single-resource fetch. It distinguishes itself from list_datasets and list_dataset_rows by explicitly noting rows come from the other tool. Only minor deduction for the bare heading, which is tautological on its own before the body clarifies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing for two adjacent needs: row data goes to `list_dataset_rows`, and enrichment prompt text goes to `get_enrichment`. That is real when-to-use-something-else guidance rather than implied usage. There is no explicit statement of preconditions or when not to call it at all, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_enrichmentRead enrichmentARead-onlyIdempotentInspect
read enrichment
One enrichment by id: prompt, input_columns (the headers rows must carry), output columns (name, prompt, output_schema, a pinned tool when the column is one tool call), tools, budget_credits_per_row, version. A legacy key means the id is a legacy enrichment's; its successor names the dataset copy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The enrichment id (enr_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description goes beyond that by disclosing the shape of what comes back — prompt, input_columns, output column fields, tools, budget_credits_per_row, version — and by explaining the `legacy`/`successor` key, which is real behavioral context not present in any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and scope, then a compact field enumeration. The second sentence is dense but every listed field earns its place because there is no output schema to carry the return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing return fields and does so, plus it explains the legacy-id/successor edge case that an agent would otherwise misread. Nothing essential to calling this one-parameter read correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema coverage ('The enrichment id (enr_...)'), so the schema already carries the semantics. The description reinforces that the id identifies exactly one enrichment but adds no format or edge-case detail beyond that; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('read enrichment') and narrows scope to 'One enrichment by id', which implicitly distinguishes it from the sibling list_enrichments. It never names the sibling outright, but the singular-by-id framing is enough for an agent to tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: use this to fetch a single enrichment when you already have an id. There is no explicit guidance on when to prefer it over list_enrichments, get_extraction, or get_run, and no prerequisites or failure conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_extractionGet extractionARead-onlyIdempotentInspect
get extraction
The extraction's status and definition. status is discovering while the agent builds the plan, then ready (or discovery_failed). Once ready, execute with POST /extractions/{id}/runs.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The extraction id (ext_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds genuinely new behavioral content beyond them: the state machine of status values (discovering / ready / discovery_failed) and the condition under which execution becomes valid. It does not describe what the 'definition' payload contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The payload statement comes first and the lifecycle/next-step guidance second, with no wasted clauses. The redundant 'get extraction' lead line is the only dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the response, and it only sketches it as 'status and definition' without indicating what the definition object holds or how failure details appear. The lifecycle coverage is good; the return-value coverage is thin for a tool whose whole job is retrieving that payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema fully documents it as 'The extraction id (ext_...)' with 100% coverage. The description adds no format, prefix, or lookup guidance beyond what the schema already gives, so it sits at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The body states precisely what is returned: the extraction's status and definition, for a specific extraction id. The heading 'get extraction' merely restates the name/title and adds nothing, but the second sentence makes the resource and payload unambiguous, so an agent can distinguish it from create_extraction or run_extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The status lifecycle ('discovering' while the agent builds the plan, then 'ready') tells the agent this is the polling tool, and the closing sentence routes it to POST /extractions/{id}/runs once ready. It stops short of an explicit 'call this repeatedly while discovering' instruction or naming the sibling run_extraction by tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_monitorGet monitorARead-onlyIdempotentInspect
get monitor
The monitor's schedule, webhook, next run time, and the dataset and columns it fills. A monitor on a legacy enrichment answers with legacy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The monitor id (mon_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive and closed-world behavior, so safety is covered. The description adds genuinely new behavioral information not in structured fields: the set of fields returned and the special 'legacy' response for monitors on legacy enrichments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the return payload. The leading 'get monitor' line duplicates the title and earns little, but the rest is dense with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description covers the return shape at a useful level and flags the legacy edge case. It stops short of describing the nested schedule/webhook structure an agent might need to parse, but it is sufficient to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter and schema coverage is 100%, with the schema itself documenting the 'mon_...' id format. The description adds nothing about the id, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (monitor) and enumerates what it returns — schedule, webhook, next run time, dataset and columns — which is more than a restatement of the title. It does not explicitly distinguish itself from list_monitors or get_enrichment, but 'get' plus the required id makes single-resource retrieval clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: fetch one monitor's detail by id. There is no statement of when to prefer this over list_monitors or how it relates to list_monitor_runs, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runRun statusARead-onlyIdempotentInspect
run status
This returns the status and progress of a run for any run created from enrichments, datasets, or extractions. status reports the status of the run, and progress gives a completion estimate.
?wait=N (max 50) long-polls: the request holds until the run finishes or the budget elapses.
Workflow: Pass wait (seconds, max 50) to hold the request until the run finishes; repeat until status is 'success' or 'stopped'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The run id (run_...) | |
| wait | No | Seconds to long-poll (0–50, default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, idempotent, non-destructive), while the description adds important operational behavior: wait triggers long-polling that holds the request, and polling should continue until a terminal status. It does not discuss auth requirements, rate limits, or failure statuses, but the key non-obvious behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loads the core purpose, and highlights the polling workflow. It repeats the max-50 wait constraint and long-poll concept across the wait paragraph and workflow paragraph, but the repetition is minor and does not obscure the guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status-check tool with no output schema, the description explains the return concepts (status and progress) and the polling behavior sufficiently. It omits some possible terminal states such as failure, but overall an agent has enough information to call and poll the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context for wait: it long-polls, holds until the run finishes or the budget elapses, and should be repeated until a terminal status. This goes beyond the schema's 'Seconds to long-poll' wording, though the id parameter adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool returns the status and progress of a run, and it scopes that to runs created from enrichments, datasets, or extractions. It distinguishes status/progress from result retrieval implicitly, but it does not name the sibling get_run_result or otherwise explicitly route the agent away from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete polling workflow: pass wait, hold until completion or timeout, and repeat until status is 'success' or 'stopped'. It does not explicitly compare this tool with get_run_result, list_runs, runs_summary, or stop_run, so alternative selection remains somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_resultRun resultARead-onlyIdempotentInspect
run result
The run plus output, null until the run finishes.
Pass ?wait=N (max 50) to long-poll: the request holds until the run finishes or the budget elapses, whichever comes first.
Output shape by run type
enrichment — an object mapping column headers to arrays of cell objects:
{ "Company": [{"value": "Apple"}], "CEO": [{"value": "Tim Cook"}] }dataset_build — the same columnar shape as enrichment
extraction — the extracted records as an array of JSON objects (matching your
output_record_json_schema)quick_search — the search result object
{ "results": [{ "title", "link", "snippet" }, ...], "knowledge_graph"? }, the same data the synchronousPOST /quick_searchresponse already carried. (Runs started on the legacy async/web_searchendpoint share this run type but return the columnar enrichment shape with asearch_resultscolumn.)search_agent — the answer object
{ "result": <string or object> };resultmatches the request'soutput_schemawhen one was given, otherwise it's free text.enrichment on a dataset (
POST /enrichwithdataset_id) —{ "rows": [...] }: only the rows the fill ran, in position order, each in the/datasets/{id}/rowsshape (id,position,input,cellslimited to the columns the fill covered,credits).GET /datasets/{id}/rowsis the live view. Above 5,000 rows, or after the rows expire (30 days),outputisnullandoutput_files(signed CSV and JSONL links to the whole grid;pendinguntil the export lands, valid one hour, seeexpires_at) are the output.enrichment started on
POST /enrich_rows, or onPOST /enrichwithinput— the columnar shape while rows are ≤ 5,000, plus the sameoutput_files. Above 5,000 rows, or after the rows expire (30 days),outputisnulland the files are the output.
Workflow: output is null until the run finishes. Pass wait (seconds, max 50) to long-poll instead of sleeping between calls.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The run id (run_...) | |
| wait | No | Long-poll budget in seconds (0–50, default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description adds value on top: the null-until-finished contract, the long-poll hold semantics, the 5,000-row threshold where `output` flips to `null`, 30-day row expiry, and `output_files` being signed links valid one hour with a `pending` state. These are exactly the non-obvious behaviors an agent needs and none of them are in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The header structure (Output shape by run type, Workflow) makes a long description scannable, and the length is justified by the absence of an output schema. It loses a point for the wasted 'run result' opener and for repeating the '>5,000 rows or 30-day expiry → `output` is null' rule three times in near-identical wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full return-shape burden and does so per run type, including the legacy `/web_search` caveat and the dataset-enrichment row shape. The remaining gap is that the run object's own fields (status, error) are never described, so an agent must discover elsewhere how to tell a finished run from a failed one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by explaining what `wait` actually does — the request holds until the run finishes or the budget elapses, whichever comes first — rather than just stating a 0–50 range. `id` gets no added meaning beyond the schema's 'run_...' hint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The body states concretely what is returned: the run object plus `output`, which is `null` until the run finishes, and it enumerates the payload shape per run type. That is far more specific than the tautological opening line 'run result', which merely restates the title. It never distinguishes itself from the sibling `get_run`, leaving the agent to infer the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is real usage guidance for polling: 'Pass `wait` (seconds, max 50) to long-poll instead of sleeping between calls' and a Workflow note repeating that `output` is null until the run finishes. However, no alternative is named — the sibling `get_run` exists and the description never says when to call that instead, nor what to do on expiry or error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helphelpARead-onlyIdempotentInspect
Reference docs for using Riveter well. Call before writing an output column spec or when an error mentions a limit. Topics: overview, enrich_modes, column_config, run_when, formats, tools, examples, credits, datasets_vs_enrichment, datasets, pinned_columns, output_schema, limits, webhooks, monitors, errors.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which topic to read |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, non-destructive, so the safety profile is fully covered. The description adds only that this returns static reference text keyed by topic, and does not mention response format (markdown vs plain text) or size. Useful but modest value beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load purpose and the primary trigger, then list topics. The topic enumeration duplicates the enum verbatim and costs space, but it aids scanning and is not harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Single required parameter, no output schema, fully described enum; the description supplies the situational triggers the schema cannot. It could close the loop by stating what the docs return, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the `topic` enum lists all 16 values with a description ('Which topic to read'). The description re-lists the same topics and adds no semantics about how to choose between overlapping topics (e.g., datasets vs datasets_vs_enrichment). Baseline 3 is appropriate when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reference docs') scoped to the Riveter product and enumerates the available topics, which makes it unmistakable against siblings like list_tools or get_account. 'Using Riveter well' is slightly marketing-ish phrasing, but the topic list grounds the purpose concretely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete call triggers: before authoring an `output` column spec, and when an error mentions a limit. That is real when-to-use guidance rather than implied context. It doesn't say when the tool is unnecessary (e.g., for run status, use get_run), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_dataset_rowsImport rows (CSV)AInspect
import rows (CSV)
Append rows from CSV text (csv; header row = input and / or output column names, output values land as manual cells; free). Up to 1,000 rows land at once (import.status done); more are accepted and land in the background (importing; get_dataset shows import_in_progress). Duplicates on the index column are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| csv | Yes | The CSV text. First row = input and / or output column names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, non-destructive, non-idempotent mutation. The description adds important behavior beyond that: rows are appended, output values land as manual cells, up to 1,000 rows complete synchronously, larger imports run in the background, and duplicate index values are skipped. These are exactly the operational details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded around the append/CSV behavior. It repeats the title at the start and is somewhat run-on with status jargon, but every sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter import tool with no output schema, the description covers the key async threshold, status values, duplicate handling, and cell landing behavior. It lacks error handling and permission details, but it is otherwise complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds real meaning about the csv parameter: the first row contains input and/or output column names, and output values become manual cells. It does not add much about the id parameter, but the CSV semantics go beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: append rows from CSV text to a dataset. It clearly distinguishes this as a CSV import operation, but it does not explicitly contrast it with sibling tools like add_dataset_rows or build_dataset_rows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the CSV-specific wording and the append semantics, but the description never says when to prefer this tool over add_dataset_rows or build_dataset_rows. It also gives no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dataset_rowsList rowsARead-onlyIdempotentInspect
list rows
Rows of a dataset in position order: input by column name, cells by output column name (value, state: pending / running / ok / not_found / failed / manual / stale, reason + error on failed), credits and not_found_reason per row. limit up to 1,000; pass next_cursor back as cursor for the next page; updated_since for changes only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| limit | No | limit | |
| cursor | No | The `next_cursor` of the previous page | |
| updated_since | No | Only rows updated at or after this time (ISO 8601) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent operation, so the description appropriately focuses on row structure and pagination behavior. It adds useful context about output fields such as `input`, `cells`, `state` values, `credits`, and `not_found_reason`, which is especially helpful because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then efficiently packs row shape, state values, pagination, and filtering into a short passage. The opening 'list rows' is somewhat redundant with the tool name/title, and the dense enumeration of output fields is useful but slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with rich annotations and a fully described input schema, the description is largely complete. It explains the returned row structure and pagination, which are not covered by an output schema, though it could clarify edge cases like empty results or terminal cursor behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `id`, `limit`, `cursor`, and `updated_since`. The description reinforces pagination by connecting `next_cursor` to `cursor` and clarifies `updated_since` as 'changes only', but adds only marginal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: listing rows of a dataset in position order. It is distinguishable from siblings like list_datasets or get_dataset by focusing on row-level data, though it does not explicitly name alternatives or contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance on pagination (`limit` up to 1,000, `next_cursor` as `cursor`) and filtering via `updated_since` for changes only. However, it does not explicitly state when to use this tool versus alternatives such as get_dataset, export_dataset, or list_datasets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsList datasetsARead-onlyIdempotentInspect
list datasets
The account's datasets, newest first (up to 200): id, name, column counts, row_count, newest run. get_dataset has the columns and enrichment.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds value the annotations do not: a hard cap of 200 results, newest-first ordering, and the exact fields returned. It does not discuss pagination beyond the cap, which is the only gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with scope then routing. The leading 'list datasets' restates the title and earns little, but the rest is dense with useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description's field list (id, name, column counts, row_count, newest run) and the 200-item cap are the only place an agent learns what comes back. Nothing needed to call this zero-arg tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly spends no space on parameter semantics and instead documents the fixed output shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (list datasets) and immediately scopes it: the account's datasets, newest first, capped at 200. It also distinguishes itself from get_dataset by noting that sibling carries the columns and enrichment, so an agent can choose without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence routes detail-seeking calls to get_dataset, which is an explicit alternative. There is no explicit 'do not use for X' beyond that, but for a zero-parameter listing tool the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_enrichmentsList enrichmentsARead-onlyIdempotentInspect
list enrichments
The account's enrichments, newest first: id, name, input / output column names. A legacy enrichment's item also has status, app_url, and dataset_id (its dataset copy: enrich that instead). Paginate with page / per_page (max 50); filter by status (legacy only), name. get_enrichment has the columns' config.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring match on the enrichment name | |
| page | No | page | |
| status | No | Comma-separated: pending, enqueued, processing, success, stopped | |
| per_page | No | per_page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: ordering ('newest first'), legacy-specific fields (`status`, `app_url`, `dataset_id`), and a pointer that dataset copies should use `enrich` instead. The parenthetical about dataset copies is somewhat vague, but overall it adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening 'list enrichments' is redundant with the title, and the parenthetical '(its dataset copy: `enrich` that instead)' is syntactically awkward and slightly cryptic. The content is informative but not as tightly front-loaded or waste-free as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description lists the key returned fields and notes legacy-specific additions, which is enough for an agent to understand what to expect. It also covers filtering, pagination, and an alternative for full column config. It does not describe the pagination response envelope (e.g., total count), but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds a crucial semantic not present in the schema: `status` filtering is legacy only. It also restates max 50 for `per_page` and mentions filtering by `name`, which are already in the schema, so the addition is meaningful but not extensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('list enrichments') and then specifies the returned fields ('id, name, input / output column names') and ordering ('newest first'). It also distinguishes the tool from `get_enrichment`, which provides column config, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear filtering and pagination guidance ('Paginate with page / per_page (max 50); filter by status (legacy only), name') and points to `get_enrichment` for detailed column configuration. However, it does not explicitly state when to prefer this tool over `list_datasets` or other listing tools, so it lacks full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitor_runsList monitor runsARead-onlyIdempotentInspect
list monitor runs
The monitor's run history, newest first. Fetch a specific run's data with GET /runs/{id}/result. Supports status, page, and per_page. A monitor on a legacy enrichment answers with legacy.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The monitor id (mon_...) | |
| page | No | page | |
| status | No | status | |
| per_page | No | per_page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover safety, idempotency, and closed-world behavior. The description adds useful behavioral context beyond them: run history is returned newest first, and legacy enrichment monitors return a `legacy` marker.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core purpose. It wastes a little space by repeating the title as the opening line and includes a raw API endpoint link, but otherwise every part is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full schema coverage and clear annotations, the description covers ordering, filtering support, pagination parameters, and the legacy case. It could say more about pagination metadata or response shape, but is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description mentions `status`, `page`, and `per_page`, but adds little semantic meaning beyond what the schema fields and enum already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: listing a monitor's run history, ordered newest first. It distinguishes this from fetching a specific run's data, though it points to a raw API endpoint rather than naming the sibling tool that performs that retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies this tool is for listing a monitor's run history and directs specific-run retrieval elsewhere. However, it does not explicitly name sibling alternatives such as get_run, get_run_result, list_runs, or runs_summary, nor does it state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitorsList monitorsARead-onlyIdempotentInspect
list monitors
List the account's monitors, newest first. An item whose monitor runs a legacy enrichment carries legacy: true.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the bar is lower. The description still adds real value by disclosing result ordering ('newest first') and the meaning of the `legacy: true` field, which the agent cannot get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and the meaningful content is front-loaded. The leading lowercase 'list monitors' line duplicates the name/title and is minor waste, but the rest of the text is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input params and no output schema, the description needs to convey return-value shape; it partially does so by mentioning ordering and the `legacy` field. Missing pagination or result-count behavior keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document in the schema. Baseline of 4 applies; no parameter semantics are needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the account's monitors') and adds scope plus ordering. It implicitly distinguishes itself from get_monitor and list_monitor_runs, though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: it lists all monitors in the account with no filtering. There's no explicit statement of when to prefer get_monitor or list_monitor_runs, so the agent must infer the alternative from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_runsList runsARead-onlyIdempotentInspect
list runs
List the account's runs, newest first. Every async operation shows up here — enrichment runs, dataset builds, extractions, and quick searches.
Filter by type (comma-separated), status, enrichment_id, dataset_id, monitor_id, and created_after / created_before (ISO 8601). Paginate with page / per_page. enrichment_id naming a legacy enrichment still filters and the response carries legacy.
Pass ids (comma-separated, up to 100 run ids) to get those runs' full status objects (same shape as GET /runs/{id}) in one call; not_found lists ids not on this account. Filters and pagination are ignored.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Comma-separated run ids, up to 100. Returns their full status objects plus `not_found`; other filters ignored. | |
| page | No | page | |
| type | No | Comma-separated run types: enrichment, dataset_build, extraction, scrape, quick_search, search_agent | |
| status | No | Filter by run status | |
| per_page | No | per_page | |
| dataset_id | No | Only runs on this dataset (ds_...) — its fills and its list generations | |
| monitor_id | No | Only runs of this monitor (mon_...) | |
| created_after | No | created_after | |
| enrichment_id | No | Only runs of this enrichment (enr_...) | |
| created_before | No | created_before |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/idempotent annotations with real behavior: newest-first ordering, the fact that filters and pagination are silently ignored in `ids` mode, `not_found` reporting for foreign ids, and a `legacy` marker on legacy-enrichment runs. Gaps remain on pagination defaults/limits and on how the list is bounded, which matter for a 10-parameter listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then filters, then the special `ids` branch — a sensible ordering with no filler sentences. The leading lowercase 'list runs' line merely restates the tool name and could be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all ten parameters, both operating modes, and the notable edge cases (legacy, not_found), which is strong for a tool with no output schema. The only shortfall is that the returned list object's shape is never characterized beyond the `ids` mode matching `GET /runs/{id}`, leaving the agent to infer what fields a run row carries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is nominally 100%, but several schema descriptions are placeholders ('page', 'per_page', 'created_after'), so the description earns credit by adding ISO 8601 formatting for the date bounds, comma-separated semantics for `type` and `ids`, the 100-id cap, and the rule that other filters are ignored in `ids` mode. It stops short of documenting page-size defaults or the meaning of negative minimums in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the account's runs, newest first') and enumerates what is included (enrichment runs, dataset builds, extractions, quick searches), which disambiguates it from narrow siblings like list_monitor_runs and get_run. It does not name those siblings explicitly, so differentiation is implied through scope rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear about the two operating modes: filtered/paginated listing versus an `ids` batch lookup whose semantics match `GET /runs/{id}`, which implicitly routes the agent away from calling get_run repeatedly. It does not explicitly say when to prefer runs_summary or get_run for aggregates or single-run reads, so one class of alternative is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_toolsList agent toolsARead-onlyIdempotentInspect
list agent tools
The tools an enrichment may list in only_tools / additional_tools or pin to an output column (tool): name, what it does, what a call takes (inputs, each with required; input_groups when any one complete set is enough) and gives back (returns) — the values a pinned column's row must carry or the agent must find —, credits per call (price_note when the price settles after the call — the LinkedIn email / phone tools only on a contact, text_search_pdf per page, pdf / image by tokens spent reading it), whether it is on by default, whether it needs opt-in and is enabled on this account, and for a tool that uses the account's own provider key (Apollo, Hunter, Findymail, curl, USPTO) whether one is linked (api_key_linked; refused until it is). Also the budget (credits per row) range and per-column default.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, yet the description still adds real behavioral content beyond them: `price_note` semantics per tool (per-page, per-token, settled-after-call), the `api_key_linked` refusal rule ('refused until it is'), opt-in/enabled state, and the `budget` per-row range. It omits return shape/ordering and list size, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information density is high and nothing is truly filler, but it is delivered as one enormous run-on sentence stitched together with em-dashes and nested parentheticals. The lead line is just the title repeated, so the genuinely useful content is not front-loaded and an agent must parse the whole block to extract the schema of the response.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description correctly takes on the job of describing the returned record in detail, including conditional pricing and key-linkage fields. It is nearly complete; only the container shape (array vs. object), ordering, and volume of the result are left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description's field-level vocabulary (`inputs`/`required`, `input_groups`, `returns`) concerns the response payload, not the call signature, and does not confuse the two.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a restatement of the title, then specifies the resource precisely: the catalogue of agent tools usable in an enrichment's `only_tools`/`additional_tools` or pinned to an output column, with the fields each entry carries. That is a clear verb+resource. It never names a sibling (e.g. `help`, `get_account`) to draw a boundary, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the reference to `only_tools`/`additional_tools` and pinned output columns tells an agent the context in which this list matters, but there is no explicit 'call this before create_enrichment/update_enrichment' or 'do not use this to look up a specific tool by name'. No alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_dataset_columnConvert output column to inputADestructiveInspect
convert output column to input
Make a filled output column an input column of the same name (column); every row's value moves with it, so later columns and dedupe can key on it. Not undoable; 409 dataset_in_use while a fill runs.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| column | Yes | The output column name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description adds genuinely new context: the operation is not undoable, values move with the column, and a 409 `dataset_in_use` is returned while a fill is running. That error-condition disclosure is valuable beyond the annotations, though the resulting state after conversion is only loosely described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The verb+resource leads, consequences follow, and failure mode is last — good front-loading. The opening line duplicates the title verbatim, which is a small redundancy but not costly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent two-parameter mutation with no output schema, the description covers reversibility, data movement, and the key error case. What's missing is any hint of the returned representation or whether the previous input columns are affected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both `id` and `column` are already documented. The description reinforces that `column` must be the name of an existing filled output column and that the promoted column keeps the same name, which is modest added meaning over the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('convert output column to input') and names the exact object affected ('`column`'). No sibling tool does anything comparable, so an agent can identify it uniquely without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The rationale ('so later columns and dedupe can key on it') implies when this is useful, and the 409 condition signals when it will fail. But there is no explicit guidance on when to choose this over, e.g., rebuilding the dataset via build_dataset, nor any stated preconditions about the fill having completed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quick_searchQuick searchAInspect
quick search
Run a web search and get structured results back synchronously — the response is the run with the results already in output (no polling, no webhook). Optionally filter to a date range with date_start / date_end (format YYYY-MM-DD); if only date_start is given, date_end defaults to today.
The result is also stored on the run, so it stays re-fetchable at GET /runs/{id}/result.
For bulk searches — up to 100,000 per request, async with webhook_url support — use the legacy POST /v1/web_search endpoint.
Quick example
curl -X POST https://api.riveterhq.com/v1/quick_search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "latest OpenAI news"}'Credit costs
0.04 credits per search.
Example — A simple search: { "query": "latest OpenAI news" }
Example — A search filtered to a date range: { "query": "OpenAI GPT-4o mini", "date_start": "2024-07-01", "date_end": "2024-07-31" }
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query (simpler is better) | |
| run_key | No | Optional idempotency key (becomes the run id "run_<run_key>") | |
| date_end | No | Optional end date filter, format YYYY-MM-DD. Defaults to today if date_start is set | |
| date_start | No | Optional start date filter, format YYYY-MM-DD | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses important behavior: it is synchronous, requires no polling or webhook, stores the result for later re-fetch, and costs 0.04 credits per search. It does not itself cover every failure or auth detail, but the schema documents max_credits and estimate_cost, and the annotations already declare open-world and non-read-only behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and sync behavior are front-loaded well, but the description includes a redundant opening line and duplicative examples: the curl example is followed by two JSON examples that partly repeat the same request shapes. The content is useful, but some sentences and examples do not fully earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, no output schema, and a web-search operation, the description covers the key calling context: synchronous result delivery, result persistence, date filtering, bulk alternative, and credit cost. It does not detail the exact result object shape, but it explains that structured results appear in output and remain re-fetchable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains query, run_key, date filters, max_credits, and estimate_cost. The description restates the date filter format and default for date_end, but does not add much parameter meaning beyond the already complete schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: run a web search and return structured results synchronously. It also distinguishes this quick synchronous tool from the bulk asynchronous legacy endpoint, so the scope is clear without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes bulk workloads to the legacy POST /v1/web_search endpoint and describes the quick_search case as a single synchronous search. It does not explicitly compare against other siblings such as search_agent or scrape, but the intended usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_extractionRun extractionAInspect
run extraction
Execute a ready extraction. Returns a run — poll GET /runs/{id} and fetch the extracted records with GET /runs/{id}/result (the records come back as an array of JSON objects matching your schema), or pass a webhook_url.
variables fills any {{ placeholder }} values the plan defines (e.g. a search term or location). Each run charges run credits (credits_charged).
Workflow: Starts an async extraction run. Poll get_run, then fetch the records with get_run_result.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The extraction id (ext_...) | |
| variables | No | Values for the plan's placeholders | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| webhook_url | No | URL to POST the records to when the run completes | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring openWorld/non-idempotent/non-destructive, the description adds real behavioral context: the call is async, returns a run rather than records, consumes run credits per invocation (`credits_charged`), and can be refused with 422 credit_cap_exceeded without charging. It does not mention credential/permission requirements or how to abort a started run (stop_run exists), leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Reasonably front-loaded: the verb, the precondition, then the delivery options, then costs, then the workflow. Slightly penalized for a redundant lowercase 'run extraction' lead-in that merely restates the title, plus inline markdown anchors that add noise without semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async, non-idempotent, credit-charging tool with no output schema, the description supplies everything the agent needs: that it returns a run object, the exact follow-up calls to obtain the records, the shape of the returned records (array of JSON objects matching the caller's schema), and the webhook escape hatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still earns a bump by explaining what `variables` actually does — filling `{{ placeholder }}` values with concrete examples like a search term or location — and by framing `webhook_url` as the delivery alternative to polling. `max_credits` and `estimate_cost` are left entirely to their schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first content sentence is a specific verb+resource: 'Execute a `ready` extraction', and the workflow line names the async run being started. It implicitly distinguishes itself from create_extraction by requiring an existing `ready` extraction, so an agent knows this is the execute step, not the authoring step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit workflow routing: 'poll `get_run`, then fetch the records with `get_run_result`', or alternatively 'pass a `webhook_url`'. The prerequisite (`ready` extraction) is stated. It stops short of telling the agent when to prefer webhook vs polling, or when to price first via estimate_cost, but the alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runs_summaryList runs (summary)ARead-onlyIdempotentInspect
list runs (summary)
All-time run counts by status — a snapshot of the account's run queue. For the runs themselves use GET /runs?status=....
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds two genuinely useful traits beyond that: the counts are all-time (no date filtering) and they are an account-wide snapshot, which sets expectations about freshness and scope. It stops short of describing the response shape (e.g., per-status buckets) or any refresh/rate behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus a title line; the substance (all-time counts, use the other endpoint for records) is front-loaded with no filler. The embedded markdown REST link is slightly off-register for an MCP tool description and adds a small amount of noise an agent cannot act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, non-destructive aggregate with no output schema, the description covers what it does, its scope (all-time, account-wide), and where to go instead for detail. What it returns is implied ('counts by status') rather than spelled out, which is a minor gap given no output schema exists to fill it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate — baseline 4 applies. The description reinforces this by making clear the result is unfiltered and all-time, so an agent will not go hunting for a date or status argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and aggregation: 'All-time run counts by status — a snapshot of the account's run queue.' That clearly distinguishes an aggregate summary from the individual-run tools. It loses a point because the first line just restates the title, and the contrast is drawn against a REST endpoint ('GET /runs') rather than the sibling tool `list_runs`, which is what an agent actually has to choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit alternative: 'For the runs themselves use ... ?status=...', which tells the agent to go elsewhere for per-run records. There are no exclusion conditions stated beyond that (no mention of time windows, account scoping caveats, or when the summary is stale), and the alternative is named as an HTTP path instead of the MCP sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrapeScrapeAInspect
scrape
Scrape a webpage and return the text content synchronously — the only endpoint here that doesn't return a run to poll. Unchanged from the legacy API (response uses the legacy request_status format).
Quick example
curl -X POST https://api.riveterhq.com/v1/scrape \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'Credit costs
With proxy: 0.30 credits
Without proxy: 0.10 credits
From cache: 0.01 credits
Proxy usage
Scraping is not guaranteed to succeed without a proxy. Some websites may block requests or require specific geographic locations. To use a proxy, include proxy_country_code with a two-character country code (e.g. 'us', 'gb', 'de').
Caching
Recently scraped pages are cached to save credits (0.01 credits on a cache hit). Set skip_cache: true to always fetch fresh content.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape | |
| skip_cache | No | Set to true to bypass cache and always fetch fresh content | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| proxy_country_code | No | Optional two-character country code for proxy (e.g. 'us', 'gb', 'de') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag openWorldHint and non-idempotency, and the description layers on context they cannot carry: synchronous versus run-polling semantics, per-call credit pricing tiers (0.30/0.10/0.01), proxy blocking risk, cache-hit behavior, and the fact that the response uses the legacy request_status format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core synchronous-distinction sentence, then organizes secondary detail into labeled sections (example, credits, proxy, caching) that are easy to scan. The embedded curl example is useful for an HTTP-style API but adds length that a strict reader could call excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the operational essentials: sync execution, credit costs, proxy necessity, caching, and the legacy response format. Since there is no output schema, a brief note on the returned fields beyond 'legacy request_status format' would have closed the last gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema for proxy_country_code (why you need it, with example codes) and skip_cache (tied to credit savings), plus cost implications for the request overall. max_credits and estimate_cost are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scrape a webpage and return the text content') and explicitly differentiates from every run-based sibling by calling itself 'the only endpoint here that doesn't return a run to poll.' An agent can immediately tell this apart from run_extraction, get_run, or get_run_result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance inside the tool: use a proxy when the target may block or require geo, set skip_cache when freshness matters. It does not name alternative tools (e.g. run_extraction for structured extraction or quick_search) as the path to choose when scraping is not the right call, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_agentSearch agentAInspect
search agent
Ask a question and get an answer. This is meant for quick, relatively scoped one-off questions, like "What is the NAICS code for this company...". For more complex questions, use the enrich/ endpoint.
This uses the same AI + web-tool loop that fills a single agent-mode cell in an enrichment (web search, web scraping, PDF reading, HTTP requests), with no enrichment setup.
The run is processed in the background while this request long-polls up to wait seconds (default 50) — most runs finish in time and return the answer inline in output.result. If the agent is still working when the budget elapses, the response comes back with status: processing and output: null; poll GET /runs/{id}/result (it long-polls too) until the run is terminal.
Pass output_schema (a JSON Schema object) to get output.result back as a structured object matching your schema instead of free text. Unanswerable questions return the string "not found".
Quick example
curl -X POST https://api.riveterhq.com/v1/search_agent \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "Who is the current CEO of Anthropic, and when did they take the role?"}'Credit costs
1 credit per call (same as one agent-mode enrichment cell), charged when the agent completes. Failed runs are not charged.
Example — A free-text question: { "prompt": "Who is the current CEO of Anthropic, and when did they take the role?" }
Example — A structured answer via output_schema: { "prompt": "Find the founding year and headquarters city of Anthropic", "output_schema": { "type": "object", "properties": { "founding_year": { "type": "integer" }, "headquarters_city": { "type": "string" } } } }
| Name | Required | Description | Default |
|---|---|---|---|
| wait | No | Seconds to hold this request waiting for the answer (default and max 50). Pass 0 to return immediately and poll GET /runs/{id}/result instead. | |
| prompt | Yes | The question or task for the agent | |
| run_key | No | Optional idempotency key (becomes the run id "run_<run_key>") | |
| max_credits | No | Credit ceiling. Refused with 422 credit_cap_exceeded (nothing charged) when the estimate's maximum exceeds it. | |
| estimate_cost | No | Validate and price the request without running or charging anything; the 200 response is the credit estimate (EstimateCostResult). | |
| output_schema | No | Optional JSON Schema object for the answer, e.g. `{"type": "object", "properties": {"ceo_name": {"type": "string"}}}`. When set, `output.result` is an object matching this schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare openWorldHint=true and readOnlyHint=false; the description goes far beyond them by disclosing the long-poll behavior (up to `wait` seconds, default 50), the `status: processing` / `output: null` fallback and the polling endpoint to use, the `"not found"` sentinel for unanswerable questions, and credit accounting (1 credit charged on completion, failures not charged). These are exactly the operational facts an agent needs and none are inferable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded: the one-line purpose, then scope boundary, then the long-poll mechanics, then credits. It is somewhat heavy for a single tool — a curl example plus two JSON examples partially duplicate each other — but each block carries distinct information, so the length is defensible rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description takes on the return-value burden and discharges it: it specifies `output.result` as free text or a schema-conforming object, the non-terminal `status: processing` state, and the `"not found"` string. Combined with the polling and credit details, an agent can call this correctly and handle every documented outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining the effect of `output_schema` on the return value (structured object in `output.result` instead of free text) and the wait/poll tradeoff, both of which are behavioral rather than mere restatements. `run_key` idempotency and the `max_credits` ceiling are only covered by the schema, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The body states a specific verb+resource ("Ask a question and get an answer") and explains the underlying mechanism: an AI + web-tool loop doing web search, scraping, PDF reading, and HTTP requests with no enrichment setup. It differentiates itself from the `enrich/` endpoint, but the leading "search agent" line merely restates the title, and it never distinguishes itself from the sibling `quick_search`, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage boundary ("quick, relatively scoped one-off questions") and names the alternative for the other case ("For more complex questions, use the `enrich/` endpoint"). However, no guidance covers when to pick this over the closely related `quick_search` or `scrape` siblings, leaving a real routing ambiguity unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_runStop runADestructiveInspect
stop run
Stop a run early. Works for every run type. Already-finished runs are left untouched; the response is the run either way.
Workflow: Stops a running run. The run cannot be resumed after stopping.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The run id (run_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, but the description adds genuinely new behavioral facts: the stop is irreversible ('cannot be resumed after stopping'), finished runs are unaffected, and the response is the run object either way. That last point substitutes for the missing output schema, which is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core facts are front-loaded, but the tool name is restated three times ('stop run', 'Stop a run early', '**Workflow:** Stops a running run'), so a meaningful fraction of a short description is redundant. The irreversibility note is well placed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool whose annotations already flag destructiveness, the description covers the irreversibility, the no-op case, and the return shape. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, fully documented in the schema ('The run id (run_...)'), and the description adds nothing about id format or sourcing. With 100% schema coverage the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Stop a run early') and explicitly scopes it to every run type, which is enough to separate it from siblings like get_run or list_runs. It does not name any sibling it must not be confused with, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (a run is currently running) and clarifies what happens if the run already finished ('left untouched'). However, it never names an alternative such as get_run to check status first, nor does it state prerequisites or exclusions explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_datasetUpdate datasetADestructiveInspect
update dataset
Edit a dataset's structure (no run): name; index_column; input_columns ops ({ "Name": {} } add, { "rename" }, { "delete": true }); output column ops (new name adds, type inferred unless output_schema is given; { "prompt", "output_schema" } changes, cells go stale; { "tool": "<list_tools name>" } pins a tool: one call per row, arguments chosen by the agent, result is the cell (null unpins); { "rename" }; { "delete": true }); budget (credits per row; moves by 1.5 per output column added or removed unless budget_locked) and budget_locked (true / false; sent with column changes it wins over that adjustment). Edits a shared enrichment on a private copy. 409 dataset_in_use while a fill runs. Then enrich with dataset_id. help with datasets, pinned_columns, output_schema.
Example — Change a prompt, add a typed column, remove one: { "output": { "CEO": { "prompt": "Full name of the current CEO" }, "Employee count": { "prompt": "Current headcount as an integer", "output_schema": { "type": "integer", "minimum": 0 } }, "HQ city": { "delete": true } } }
Example — Lock the budget and add columns without moving it: { "budget_locked": true, "output": { "Founded": {}, "Revenue": { "prompt": "Latest annual revenue in USD" } } }
Example — A column pinned to the LinkedIn profile lookup; the agent finds the URL to call it on: { "output": { "Profile": { "prompt": "The LinkedIn profile of the row's person; find the canonical linkedin.com/in/ URL first", "tool": "linkedin_person_profile" } } }
Example — Rename the dataset, add an input column and dedupe on it, rename another: { "name": "Q4 targets", "input_columns": { "Ticker": {}, "Website": { "rename": "Domain" } }, "index_column": "Ticker" }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| name | No | name | |
| budget | No | Credits the row agent may spend per row, on the dataset's enrichment. Sent with column changes, it wins over the per-column adjustment. | |
| output | No | Output column edits keyed by column name. A name not on the enrichment adds a column; `prompt` / `output_schema` / `tool` change one (its filled cells read `stale`); `rename` renames it (cells kept); `delete: true` removes it. | |
| index_column | No | The input column rows are unique on (by name). Every row is re-keyed. | |
| budget_locked | No | true keeps the budget as set when output columns are added or removed; false lets it move by 1.5 per column again. | |
| input_columns | No | Input column edits keyed by column name. `{}` adds the column; `rename` renames it; `delete: true` removes it (not the index column). Rows are untouched: an added column reads empty, a removed column's values are dropped from reads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/idempotent=false/readOnly=false; the description goes far beyond by disclosing that prompt/schema/tool edits turn existing cells `stale`, that rename keeps cells while delete drops them from reads, that added input columns read empty, that index_column re-keys every row, and that a 409 `dataset_in_use` occurs during a running fill. It also explains the copy-on-write safety net for shared enrichments, which is exactly the kind of consequence an agent needs before mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded spec paragraph followed by four examples that each demonstrate a distinct, non-redundant capability. The opening paragraph is very dense — heavy backticking and semicolon chaining make it hard to scan — and the fourth example's `Ticker`/`Website` payload only obliquely demonstrates the stated dedupe behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with deep nested objects, the description covers mutation semantics, budget rules, pinning behavior, and conflict errors thoroughly. It never states what the tool returns on success, which matters slightly more here because no output schema exists to fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds semantics the schema only implies: the 1.5-credit-per-column budget drift, `budget_locked` winning over that adjustment, and type inference on added output columns. The four worked examples concretely demonstrate nesting and operation combinations (`{}`, `rename`, `delete`, `tool`, `null` unpin).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Edit a dataset's structure (no run)' — and immediately scopes it to name, index_column, input_columns, output, budget. The parenthetical '(no run)' plus 'Then enrich with dataset_id' cleanly separates it from enrich and update_enrichment, whose names alone would otherwise make the boundary ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real workflow routing: use this first, then call `enrich` with `dataset_id`, and points to `help` with `datasets`, `pinned_columns`, `output_schema` for deeper reference. 'Edits a shared enrichment on a private copy' hints at when to prefer `update_enrichment` instead, but never names that sibling or states the exclusion explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dataset_rowSet input valuesADestructiveInspect
set input values
Write one row (row_id: a row_... id or a position) by hand. input is { "<input column>": value | null } (an index-column value another row holds is a 422). cells is { "<output column>": value | null }: a value becomes a manual cell (kept by fills unless force); null clears it back to pending. One write for both. 409 row_in_use for input while a fill is on the row; cells land meanwhile and stand over the run's answer.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The dataset id (ds_...) | |
| cells | No | Output column name → value, or null to clear | |
| input | No | Input column name → value, or null to clear | |
| row_id | Yes | The row id (row_...) or its position (an integer from 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring a destructive, non-idempotent, non-read-only mutation, the description adds substantial context: 422 for an index-column value another row holds, 409 `row_in_use` for `input` during a fill, `cells` landing regardless, and `null` reverting to `pending`. This is exactly the kind of error and side-effect disclosure the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operative scope statement is front-loaded and every sentence carries new information (error codes, state transitions, force behavior). It is terse to the point of telegraphic style in places, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive nested-object mutation with no output schema, the description covers the important behavioral edges: partial success, error codes, and value lifecycle. It stops short of describing the response or confirming what the manual cell looks like after success, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the `input` versus `cells` split (input columns vs output columns), the manual-vs-pending state transition on `cells`, and that `force` governs whether fills overwrite a manual cell — semantic value not present in the property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Write one row (`row_id`...)" by hand, and clarifies it sets both input and output cells in one write. It implicitly distinguishes from bulk siblings (`add_dataset_rows`, `import_dataset_rows`) via "by hand" but never names them, so it doesn't fully earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent learns that `input` writes are blocked while a fill runs, that `cells` writes are manual and can be cleared with `null`, and that `force` affects retention. There is no explicit when-to-use-this-vs-alternatives guidance (e.g. versus `add_dataset_rows` or `build_dataset_rows`), so it lands at implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_enrichmentUpdate enrichmentADestructiveInspect
update enrichment
Edit an enrichment: name, prompt, input_columns, budget (credits per row; moves by 1.5 per output column added or removed unless budget_locked), only_tools / additional_tools, and output columns by name: a new name adds a column (type inferred unless output_schema is given), { "prompt", "output_schema" } changes one, { "tool": "<list_tools name>" } pins a tool to it — one call per row is the cell, the agent choosing the arguments (null unpins; help with pinned_columns), { "rename" } renames, { "delete": true } removes. Changed columns make dataset cells stale (re-run by the next enrich). 409 enrichment_in_use while a fill runs. Prefer update_dataset to change one dataset's columns. help with output_schema.
Example — Change one column's prompt, add a typed one: { "output": { "CEO": { "prompt": "Full name of the current CEO" }, "Employee count": { "prompt": "Current headcount as an integer", "output_schema": { "type": "integer", "minimum": 0 } } } }
Example — Rename a column, delete another: { "output": { "HQ": { "rename": "HQ city" }, "Old Column": { "delete": true } } }
Example — New prompt and budget: { "prompt": "Research each company's go-to-market motion", "budget": 8 }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The enrichment id (enr_...) | |
| name | No | Display name. An empty string clears it. | |
| budget | No | Credits the row agent may spend per row. Sent with column changes, it wins over the per-column adjustment. | |
| output | No | Output column edits keyed by column name. A name not on the enrichment adds a column; `prompt` / `output_schema` / `tool` change one (its filled cells read `stale`); `rename` renames it (cells kept); `delete: true` removes it. | |
| prompt | No | The task prompt the row agent reads for every row. | |
| only_tools | No | Exactly these tools (names from GET /tools). Replaces the default set. | |
| budget_locked | No | true keeps the budget as set when output columns are added or removed; false lets it move by 1.5 per column again. | |
| input_columns | No | The headers rows must carry when this enrichment runs (replaces the list; [] = any headers). Names only; no row data. | |
| additional_tools | No | The default tools plus these (e.g. linkedin_person_contact; custom_apollo_people_search once enabled on the account and your Apollo key is linked). See GET /v1/tools. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important side effects: budget movement by 1.5 per column, `budget_locked` behavior, changed cells becoming `stale` until the next `enrich`, tool-pinning semantics, rename behavior, and deletion of columns. These details materially help an agent understand the destructive and non-idempotent nature already flagged by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but appropriately sized for a complex nested mutation, with the core behavior front-loaded before the examples. It could be tightened slightly because the opening 'update enrichment' is tautological and the `help` references are repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter nested mutation with no output schema, the description covers the editable surface, important side effects, conflict behavior, and practical examples. The annotations and rich schema descriptions carry the remaining structural details, so an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: how `budget` interacts with column changes, how `output` entries add/change/rename/delete columns, and how tool pinning produces one call per row. The examples further clarify nested `output` usage, though some parameter detail is duplicated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Edit an enrichment,' then enumerates the exact editable fields, including nested output-column edits. It also distinguishes this tool from the sibling `update_dataset`, which handles changing one dataset's columns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes one alternative case to `update_dataset` and warns that a 409 `enrichment_in_use` occurs while a fill runs. However, it does not fully state when to use this versus `create_enrichment`, `delete_enrichment`, or `get_enrichment`, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_monitorUpdate monitorAInspect
update monitor
Pause, resume, or repoint a monitor. enabled: false pauses, enabled: true resumes; webhook_url replaces the delivery URL; columns changes the output columns each run fills — null for every column (refused on a monitor on a legacy enrichment, whose response carries legacy).
Example — Pause: { "enabled": false }
Example — Resume: { "enabled": true }
Example — Fill two columns only: { "columns": [ "Headcount", "Latest funding round" ] }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The monitor id (mon_...) | |
| columns | No | The output column names each run fills; null for every column | |
| enabled | No | false pauses the monitor, true resumes it | |
| webhook_url | No | webhook_url |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it non-readonly, non-destructive, non-idempotent and open-world. The description adds genuinely useful behavior beyond that: `null` means every column, and null is refused on monitors on a legacy enrichment (response carries `legacy`). It doesn't state auth/permission needs or reversibility of a column reset, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-liner followed by precise parameter-to-behavior mapping, then examples. Three JSON examples are somewhat redundant (pause/resume are trivially obvious) but they remain short and directly illustrative, so nothing is egregiously wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All four parameters are covered, the legacy refusal edge case is documented, and with no output schema the description needn't explain returns. The absence of any note on permissions or the shape of a successful update response is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real meaning beyond the schema: semantics of `null` for `columns`, the legacy-enrichment refusal rule, and the pause/resume semantics of `enabled`. `webhook_url` is only described as a replacement, matching the thin schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the specific verb (update) and resource (monitor), then enumerates the three concrete operations: pause, resume, repoint. An agent can tell this apart from create_monitor/list_monitors/get_monitor without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly maps each parameter to a behavior: `enabled: false` pauses, `enabled: true` resumes, `webhook_url` replaces the delivery URL, `columns` changes filled columns. It gives clear operational context but does not name when to prefer a sibling or list preconditions/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
39 tool updates
v0.3.5- First observed
add_dataset_rows - First observed
build_configured_dataset - First observed
build_dataset - First observed
build_dataset_rows - First observed
create_enrichment - First observed
create_extraction - First observed
create_monitor - First observed
delete_dataset - First observed
delete_dataset_rows - First observed
delete_enrichment - First observed
enrich - First observed
export_dataset - First observed
get_account - First observed
get_dataset - First observed
get_enrichment - First observed
get_extraction - First observed
get_monitor - First observed
get_run - First observed
get_run_result - First observed
help - First observed
import_dataset_rows - First observed
list_dataset_rows - First observed
list_datasets - First observed
list_enrichments - First observed
list_monitor_runs - First observed
list_monitors - First observed
list_runs - First observed
list_tools - First observed
promote_dataset_column - First observed
quick_search - First observed
run_extraction - First observed
runs_summary - First observed
scrape - First observed
search_agent - First observed
stop_run - First observed
update_dataset - First observed
update_dataset_row - First observed
update_enrichment - First observed
update_monitor
TDQS
Scored across 39 tools
The set covers many related resources, and several tools have subtly overlapping purposes: `build_dataset`, `create_enrichment`, `build_configured_dataset`, and `build_dataset_rows` all initiate dataset-like workflows, while `enrich`, `create_enrichment`, and `update_dataset` all touch column filling. The descriptions are very detailed and clarify most boundaries, but the distinctions still require careful reading.
Most tool names follow a clear snake_case verb_noun pattern (`list_datasets`, `get_dataset`, `update_monitor`, `run_extraction`), with predictable `list_`, `get_`, `create_`, `update_`, and `delete_` prefixes. A few names deviate, such as `enrich`, `help`, `scrape`, `quick_search`, and `runs_summary`, but they remain readable and mostly domain-specific.
With 39 tools, the surface is heavy for practical agent selection, spanning datasets, enrichments, runs, extractions, monitors, search, scraping, tools, and account operations. The domain is broad, but the number of closely related tools makes the set feel over-expanded rather than tightly scoped.
Core dataset and enrichment workflows are well covered with create/read/update/delete and row-level operations, and runs/search/monitors have substantial support. However, notable gaps remain: extractions lack list/update/delete tools, monitors lack a delete operation, and some lifecycle operations are only partially exposed.
Maintenance
Related MCP Connectors
Give your agent live data from Twitter, Reddit, the web and GitHub. No API keys, no scraping stack.
Connect your AI assistant to Revensi OS agents, workflows, and business data.
Web data extraction and browser workflows for AI assistants.
Lets Claude, ChatGPT, and Muse read and update your beckett tasks, notes, calendar, and lists.
Related MCP Servers
AlicenseBqualityFmaintenanceConnects AI assistants (Claude, Cursor, etc.) directly to the HiveFlow automation platform, allowing them to create, manage, and execute automation flows through natural language commands.98 npm4MIT- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to control a browser through Playwright automation tools, allowing them to perform web tasks like navigation, typing, clicking, and taking screenshots. Deployed on Cloudflare Workers and compatible with various AI platforms including Claude Desktop and VS Code.Apache 2.0

Dovetail MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceConnects AI tools to the Dovetail API, enabling them to interact with Dovetail features.3,386 npm8MIT
Spicrawl MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI agents in Claude Code, Claude Desktop, Cursor, VS Code, Windsurf, Gemini CLI and Codex to scrape web pages into Markdown, text, HTML, JSON or PDF, extract structured data with selectors or autoparse, capture screenshots and PDFs the model can see, drive pages with typed browser actions, keep logged-in persistent browser sessions, and batch-scrape thousands of URLs as async jobs. It also exposes usage, request-log and documentation tools so agents can check costs, diagnose failures and look up parameters without leaving the chat.25Apache 2.0