Riveter MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RIVETER_API_KEY | Yes | Your Riveter API key | |
| RIVETER_OPENAPI_URL | No | OpenAPI spec URL. Use https://docs.riveterhq.com/openapi.legacy.yaml for the legacy generation instead. | https://docs.riveterhq.com/openapi.yaml |
| RIVETER_API_BASE_URL | No | API base URL | https://api.riveterhq.com/v1 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| enrichA | enrich Add AI-researched columns to rows. Rows come from exactly one of Preferred: put the rows in a dataset first ( With
Returns a run. Poll 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_runA | run status This returns the status and progress of a run for any run created from enrichments, datasets, or extractions.
Workflow: Pass |
| get_run_resultA | run result The run plus Pass Output shape by run type
Workflow: |
| stop_runA | 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. |
| list_runsA | 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 Pass |
| runs_summaryA | list runs (summary) All-time run counts by status — a snapshot of the account's run queue. For the runs themselves use GET /runs |
| get_enrichmentA | read enrichment One enrichment by id: |
| update_enrichmentA | update enrichment Edit an enrichment: 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 } |
| delete_enrichmentA | 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 |
| list_enrichmentsA | list enrichments The account's enrichments, newest first: id, name, input / output column names. A legacy enrichment's item also has |
| create_enrichmentA | create enrichment Create an enrichment (no run, free) and the empty dataset it fills, bound to it and in the app at 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" } |
| list_datasetsA | list datasets The account's datasets, newest first (up to 200): id, name, column counts, |
| build_datasetA | build dataset Build a dataset: rows you send or rows Riveter finds. 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 |
| get_datasetA | read dataset One dataset by id: |
| update_datasetA | update dataset Edit a dataset's structure (no run): 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" } |
| delete_datasetA | delete dataset Delete a dataset by id (rows and cells with it; its enrichment stays). 409 |
| list_dataset_rowsA | list rows Rows of a dataset in position order: |
| add_dataset_rowsA | add rows Append up to 100 rows (objects keyed by input column name; free). Duplicates on the index column are skipped ( |
| delete_dataset_rowsA | delete rows Remove rows: |
| import_dataset_rowsA | import rows (CSV) Append rows from CSV text ( |
| build_dataset_rowsA | generate more rows Generate Example — Fifty more, filled on arrival: { "prompt": "Specialty coffee roasters in Oakland and Berkeley", "count": 50, "auto_fill": true } |
| update_dataset_rowA | set input values Write one row ( |
| promote_dataset_columnA | convert output column to input Make a filled output column an input column of the same name ( |
| export_datasetA | export dataset (CSV, Excel, or JSON Lines) The dataset as CSV text (or JSON Lines with |
| build_configured_datasetA | build configured list Run a configured list build — a reusable, pre-configured list template (id Returns the list-build run; poll GET /runs/{id}. The rows land in a dataset named by the run's Example — Fill in template parameters: { "parameters": { "practice_type": "dentists", "state": "ohio" } } Workflow: Starts an async run of a configured list build. Poll |
| run_extractionA | run extraction Execute a
Workflow: Starts an async extraction run. Poll |
| create_extractionA | 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 Creating an extraction charges discovery credits (returned as 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_extractionA | get extraction The extraction's status and definition. |
| list_monitorsA | list monitors List the account's monitors, newest first. An item whose monitor runs a legacy enrichment carries |
| create_monitorA | 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 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_monitorA | get monitor The monitor's schedule, webhook, next run time, and the dataset and |
| update_monitorA | update monitor Pause, resume, or repoint a monitor. Example — Pause: { "enabled": false } Example — Resume: { "enabled": true } Example — Fill two columns only: { "columns": [ "Headcount", "Latest funding round" ] } |
| list_monitor_runsA | list monitor runs The monitor's run history, newest first. Fetch a specific run's data with GET /runs/{id}/result. Supports |
| quick_searchA | quick search Run a web search and get structured results back synchronously — the response is the run with the results already in 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 Quick exampleCredit costs
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" } |
| search_agentA | 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 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 Pass Quick exampleCredit costs
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" } } } } |
| scrapeA | 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 Quick exampleCredit costs
Proxy usageScraping is not guaranteed to succeed without a proxy. Some websites may block requests or require specific geographic locations. To use a proxy, include CachingRecently scraped pages are cached to save credits (0.01 credits on a cache hit). Set |
| list_toolsA | list agent tools The tools an enrichment may list in |
| get_accountA | 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 |
| helpA | Reference docs for using Riveter well. Call before writing an |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.