Subindex MCP Server
Integrates with Perplexity AI to conduct web searches and gather verified information for research table generation and validation.
Click on "Install 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., "@Subindex MCP Servergenerate a table of top AI companies"
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.
Subindex
Verified Research Engine · subindex.ai · Launch App
Subindex generates, validates, and updates research tables by synthesizing hundreds of calls to Perplexity and Claude. Give it a prompt or an existing table and it returns structured, verified answers across an entire research domain — not just a single query, but a complete field of questions answered at once.
What you want to do | How | Live example |
Gather everything — survey a complete research domain at once | Prompt → structured verified table | |
Monitor anything — news, analyst projections, time-sensitive data | Upload or generate → keep current | |
See everywhere — run the same questions across many entities | One table, many subjects |
How to Access
You want to… | Use |
Try it out or iron out your use case | subindex.ai/app — web GUI for table validation and generation |
Fact-check text or documents interactively | subindex.ai/chex — web GUI for reference checks |
Let an AI agent drive a workflow autonomously | MCP server — install once, describe your task in plain English |
One-off automation without writing code | MCP server via Claude Code, Claude Desktop, or any MCP-compatible client |
Run repeatable pipelines or batch jobs | REST API + example scripts |
Integrate into a product or SaaS | REST API directly |
GUI → API: The web GUIs are ideal for exploring and refining your use case. Once you know what you want, the MCP server or REST API is the better path — faster, repeatable, and fully automatable.
Related MCP server: GPT Researcher MCP Server
Table of Contents
Get Your API Key
Get your API key at subindex.ai/account. New accounts receive $20 in free credits.
Download Examples
All scripts require Python 3.10+ and
pip install requests.
Script | Description | Download |
| Shared REST client (required by all examples) | |
| Validate an existing table | |
| Generate a table from a prompt | |
| Re-run validation on a completed job | |
| Fact-check text or documents |
Or clone the full example set:
# Download all examples at once
curl -O https://subindex-storage.s3.amazonaws.com/website_downloads/examples/subindex_client.py \
-O https://subindex-storage.s3.amazonaws.com/website_downloads/examples/01_validate_table.py \
-O https://subindex-storage.s3.amazonaws.com/website_downloads/examples/02_generate_table.py \
-O https://subindex-storage.s3.amazonaws.com/website_downloads/examples/03_update_table.py \
-O https://subindex-storage.s3.amazonaws.com/website_downloads/examples/04_reference_check.py
pip install requests
export SUBINDEX_API_KEY=sbx_live_...Quick Start: MCP
The MCP server lets any AI agent drive the full Subindex workflow autonomously — no scripting required.
Option A — Direct HTTP connection to Railway (recommended for Claude Code)
Connects directly to the hosted Subindex server over HTTP. No local install, no uvx, no package management — just one command.
Claude Code:
claude mcp add subindex \
--transport http \
https://mcp-server-subindex-production.up.railway.app/ \
--header "X-Api-Key: sbx_live_your_key_here"Via config file (.mcp.json in your repo root, or claude_desktop_config.json):
{
"mcpServers": {
"subindex": {
"type": "http",
"url": "https://mcp-server-subindex-production.up.railway.app/",
"headers": {
"X-Api-Key": "sbx_live_your_key_here"
}
}
}
}Why HTTP over uvx? The HTTP connection runs on Railway — always up to date, no local Python environment needed, and no version drift between the package you installed and the live server. Recommended for Claude Code and any project-level config.
Option B — Local install via uvx
Runs the server locally on your machine using uvx. Useful for Claude Desktop or offline/air-gapped environments.
Claude Code:
claude mcp add subindex uvx mcp-server-subindex \
-e SUBINDEX_API_KEY=sbx_live_your_key_hereClaude Desktop — add to claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"subindex": {
"command": "uvx",
"args": ["mcp-server-subindex"],
"env": {
"SUBINDEX_API_KEY": "sbx_live_your_key_here"
}
}
}
}Project config (shared repo) — add .mcp.json to your repo root. Each person uses their own key; no key is committed to the repo:
{
"mcpServers": {
"subindex": {
"command": "uvx",
"args": ["mcp-server-subindex"],
"env": {
"SUBINDEX_API_KEY": "${SUBINDEX_API_KEY}"
}
}
}
}OpenAI Codex CLI — add to your Codex config file (~/.codex/config.toml on macOS/Linux, %USERPROFILE%\.codex\config.toml on Windows):
[mcp_servers.subindex]
command = "uvx"
args = ["mcp-server-subindex"]
[mcp_servers.subindex.env]
SUBINDEX_API_KEY = "sbx_live_your_key_here"Then restart Codex and verify:
codex mcp listOption C — Smithery
Smithery is an MCP registry that works with Claude Code and other MCP-compatible clients including OpenClaw.
Step 1 — Install and log in:
npx -y @smithery/cli@latest login
npx -y @smithery/cli@latest mcp add subindex/subindex --client claude-codeStep 2 — Authenticate with your API key:
Open your MCP client (e.g. Claude Code), go to /mcp, click subindex → Authenticate, and enter your Subindex API key in the Smithery page that opens.
Smithery login is a one-time step. You must log in before adding servers, or authentication will not be set up correctly.
What to Ask Your Agent
Once the MCP server is installed, describe your task in plain English. The agent drives the full workflow, pausing only when your input is genuinely needed.
Validate a table:
"Validate
companies.xlsxusing Subindex. Interview me about what each column means, then run the preview. If the results look good, approve the full validation."
Generate a table:
"Use Subindex to generate a table of the top 20 US hedge funds with columns: fund name, AUM, primary strategy, founding year, and HQ city. Approve the full validation when the preview looks right."
Re-run validation on the same table:
"Re-run update_table on job
session_20260217_103045_abc123to get an updated validation pass."
Fact-check a document:
"Use Subindex to fact-check this analyst report." (paste the text or share the file path)
Workflows
1. Validate an Existing Table
Minimum rows: Subindex is designed for tables with 4 or more data rows. Fewer rows may produce low-quality results.
Full flow: upload → interview → preview → refine → approve → download
upload_file(filename, file_type, file_size [, file_path]) ← omit file_path on HTTP/Railway transport; run returned curl_command instead
→ start_table_validation(session_id, s3_key, filename)
┌── match found (score ≥ 0.85) → [preview auto-queued; response has preview_queued=true + job_id]
└── no match → interview auto-started
→ wait_for_conversation / poll get_conversation
→ send_conversation_reply (if AI asks questions)
→ [interview complete → preview auto-queued]
→ wait_for_job(job_id or session_id) ← blocks until preview_complete
→ [optional] refine_config(conv_id, session_id, instructions)
→ approve_validation(job_id, cost_usd)
→ wait_for_job(job_id) ← blocks until completed
→ get_results(job_id)Key behavior: The preview is always auto-queued — after the interview finishes (
trigger_config_generation=true), or when a config match is found (match_score ≥ 0.85, response includespreview_queued: trueandjob_id). Callwait_for_job(session_id)directly in all cases (see Config reuse).
Upload interview auto-approval: The interview may auto-approve in a single turn. If the conversation response has
user_reply_needed: falseandstatus: approved, proceed towait_for_job(session_id)immediately — no reply is needed, even if the AI's message appears to ask for confirmation.
Skip the interview with instructions (fire-and-forget config generation):
Pass instructions to start_table_validation to bypass the interactive interview. The AI reads the table structure + your instructions and generates a config directly, then auto-triggers the preview — no clarifying questions needed.
start_table_validation(session_id, s3_key, filename,
instructions="This table lists hedge funds. Validate AUM, strategy, and HQ city. Use Bloomberg and SEC filings.")
→ response includes instructions_mode=true
→ wait_for_job(session_id) ← config generation + preview tracked automatically
→ approve_validation(job_id, cost_usd)
→ wait_for_job(job_id)
→ get_results(job_id)Cost gate: Config generation and the 3-row preview are free. Full validation is charged at
approve_validation— you always see the cost estimate atpreview_completebefore anything is billed. If your balance is insufficient,approve_validationreturns aninsufficient_balanceerror with the required amount.
Refine the config before approving by calling refine_config. This adjusts how columns are validated (sources, strictness, interpretation) — it cannot add or remove columns:
refine_config(conversation_id, session_id,
"Use SEC filings as the primary source for revenue. Require exact match for ticker symbols.")A new preview runs automatically after refinement.
Python script: examples/01_validate_table.py
export SUBINDEX_API_KEY=sbx_live_...
python examples/01_validate_table.py companies.xlsx
python examples/01_validate_table.py companies.xlsx --refine "Add LinkedIn URL column"
Fire-and-forget: provide instructions to skip the interview entirely
python examples/01_validate_table.py companies.xlsx \
--instructions "This table lists hedge funds. Validate AUM, strategy, and HQ city."Which mode to use: Always try
file_pathfirst. If the server can read the file (stdio/uvx transport), upload completes in one step. If you get "File not found" (HTTP/Railway transport — server is remote), call again withoutfile_pathto receive a presigned S3 URL and a ready-to-runcurl_command. The two-step path requires shell access to run curl; Claude Desktop users should use the uvx transport sofile_pathworks.
2. Generate a Table from a Prompt
Describe the table you want — rows, columns, scope — and Subindex builds and validates it from scratch. Designed for tables with 4 or more rows.
start_table_maker("Top 20 US biotech companies: name, ticker, market cap, lead drug, phase")
→ wait_for_conversation / poll get_conversation
→ send_conversation_reply (if AI asks clarifying questions)
→ [table builds → preview auto-queued]
→ wait_for_job(session_id) ← spans table-maker + preview phases
→ approve_validation(job_id, cost_usd)
→ wait_for_job(job_id)
→ get_results(job_id)Auto-approve: The agent can auto-approve the preview and proceed to full validation without human intervention. The preview table is included inline in the
preview_completeresponse.
Cost: ~$0.05/cell (standard), up to ~$0.25/cell (advanced). $2 minimum per run.
Skip confirmation with auto_start=True (fire-and-forget generation):
Pass auto_start=True to skip the AI's clarifying questions and structure-confirmation step. The AI generates the table immediately from the message alone. Use when your message fully describes the desired table.
start_table_maker(
"Top 20 US hedge funds: fund name, AUM, primary strategy, founding year, HQ city",
auto_start=True)
→ wait_for_conversation(conversation_id, session_id)
← returns trigger_execution=true on first response (no Q&A)
→ wait_for_job(session_id) ← table building + preview
→ approve_validation(job_id, cost_usd)
→ wait_for_job(job_id)
→ get_results(job_id)Why
wait_for_conversationwithauto_start=True? Even though there is no Q&A,wait_for_conversationis still required — it returnstrigger_execution: truein a single blocking call (no reply needed), signaling that the table-maker has started. Callingwait_for_jobbefore this call returns would be premature, as the table-maker may not have been triggered yet.
Cost gate: Table building and the 3-row preview are free. Full validation is charged at
approve_validation— you always see the cost estimate atpreview_completebefore anything is billed. If your balance is insufficient,approve_validationreturns aninsufficient_balanceerror with the required amount.
Python script: examples/02_generate_table.py
python examples/02_generate_table.py "Top 10 US hedge funds: fund name, AUM, strategy, HQ city"
python examples/02_generate_table.py --prompt-file my_spec.txt
Fire-and-forget: skip clarifying Q&A and generate immediately from the prompt
python examples/02_generate_table.py --auto-start "Top 10 US hedge funds: fund name, AUM, strategy, HQ city"3. Update a Table (Re-run Validation Pass)
Re-run validation on a completed job — no re-upload or manual edits needed. The table iterates automatically, re-validating the same data with the same config to pick up any changes in source data.
If you want to incorporate manual edits to the output file, re-upload the edited file via upload_file + start_table_validation — a matching config will be found automatically (score ≥ 0.85).
update_table(source_job_id) ← re-validates existing enriched output
→ wait_for_job(new_job_id) ← blocks until preview_complete
→ approve_validation(new_job_id, cost_usd)
→ wait_for_job(new_job_id)
→ get_results(new_job_id)Python script: examples/03_update_table.py
python examples/03_update_table.py session_20260217_103045_abc123
python examples/03_update_table.py session_20260217_103045_abc123 --version 24. Fact-Check Text or Documents (Chex)
Submit any text, report, or document. Subindex checks each factual claim against authoritative sources and returns the same output format as standard table validation: an Excel (XLSX) file, an interactive viewer URL, and a metadata JSON.
Minimum claims: Subindex is designed for text with 4 or more factual claims. Fewer claims may produce low-quality results.
start_reference_check(text="...") ← inline text (or auto_approve=True to skip the gate)
or
upload_file(filename, "pdf", file_size [, file_path]) ← upload PDF/document first
→ start_reference_check(s3_key=s3_key)
→ wait_for_job(job_id) ← spans extraction + 3-row preview; stops at preview_complete
→ preview_table (3 validated sample claims) + cost_estimate shown in response
→ approve_validation(job_id, approved_cost_usd=X) ← triggers Phase 2
→ wait_for_job(job_id) ← waits for completed
→ get_results(job_id) ← download_url (XLSX) + interactive_viewer_url + metadata_urlThree-phase flow: Phase 1 (claim extraction, free) runs automatically, then a 3-row preview validates sample claims (free, auto-triggered). Both phases are tracked by a single
wait_for_jobcall that stops atstatus=preview_complete. Reviewpreview_table(3 validated sample claims with support level and citations) andcost_estimate, then callapprove_validationto start Phase 2 (full validation, charged). Passauto_approve=Trueto skip the gate and run straight through tocompleted.
Progress tracking:
get_job_messagesreturns empty during claim extraction (Phase 1). Progress messages are available during the preview validation phase.wait_for_jobhandles both phases automatically.
Output: Excel (XLSX) file with per-claim rows. Support levels: SUPPORTED / PARTIAL / UNSUPPORTED / UNVERIFIABLE. Share interactive_viewer_url with human stakeholders — it renders sources and confidence scores in a clean UI.
Python script: examples/04_reference_check.py | Sample output: sample_outputs/reference_check_output.json
# Fact-check inline text
python examples/04_reference_check.py --text "Bitcoin was created by Satoshi Nakamoto in 2009."
# Fact-check a PDF
python examples/04_reference_check.py --file analyst_report.pdf
# Fact-check multiple documents concatenated
cat doc1.txt doc2.txt | python examples/04_reference_check.py --stdin--stdin: Concatenates all piped content as a single inline text payload. All claims are attributed to the combined document.
Environment Variables
Variable | Description |
| API key from subindex.ai/account. Required. New accounts get $20 free. |
| Override the API base URL (useful for dev/staging environments). |
Direct REST API
All tools in the MCP server are thin wrappers over the REST API. You can call it directly from any language.
Base URL: https://api.subindex.ai/v1
Auth: Authorization: Bearer sbx_live_your_key_here
Response envelope:
{
"success": true,
"data": { ... },
"meta": { "request_id": "...", "timestamp": "..." }
}Python client (minimal)
import os, requests
BASE_URL = "https://api.subindex.ai/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SUBINDEX_API_KEY']}"}
def api_get(path, **kwargs):
r = requests.get(f"{BASE_URL}{path}", headers=HEADERS, **kwargs)
r.raise_for_status()
return r.json()["data"]
def api_post(path, **kwargs):
r = requests.post(f"{BASE_URL}{path}", headers=HEADERS, **kwargs)
r.raise_for_status()
return r.json()["data"]A full standalone client module is in examples/subindex_client.py.
API Endpoint Reference
Uploads
Method | Path | Description |
|
| Get a presigned S3 URL to upload a file |
|
| Upload file bytes directly to S3 (no auth header) |
|
| Confirm upload; detect config matches; auto-start interview if no match |
Presigned upload request:
{
"filename": "companies.xlsx",
"file_size": 2048000,
"file_type": "excel",
"content_type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
}Content types: excel → .xlsx, csv → .csv, pdf → .pdf
Confirm upload request (optional fields):
{
"session_id": "session_20260305_...",
"s3_key": "results/.../file.xlsx",
"filename": "companies.xlsx",
"instructions": "Validate AUM, strategy, and HQ city. Use Bloomberg and SEC filings as sources.",
"config_id": "session_20260217_103045_abc123_config_v1_..."
}instructions — if provided, bypasses the interactive upload interview. The AI generates the config directly from the table structure + instructions. Response includes instructions_mode: true and conversation_id. Use wait_for_job(session_id) to track progress — do NOT poll the conversation.
config_id — if provided, skips matching and the interview entirely. The specified config is applied immediately and the preview is auto-queued. Response includes preview_queued: true and job_id. Use wait_for_job(job_id) to track progress. The configuration_id for any completed job is returned by GET /jobs/{id}/results under job_info.configuration_id.
Conversations
Method | Path | Description |
|
| Start a Table Maker session with a natural language prompt |
|
| Poll conversation for status / AI messages |
|
| Send a reply to the AI |
|
| Refine the config with natural language instructions |
Table Maker request body:
{
"message": "Top 20 US hedge funds: fund name, AUM, primary strategy, founding year, HQ city",
"auto_start": true
}auto_start — if true, the AI skips clarifying questions and the structure-confirmation step, proceeding directly to table generation. The first get_conversation response will have trigger_execution: true. Use when your message fully describes the desired table.
Jobs
Method | Path | Description |
|
| Get job status and progress |
|
| Fetch live progress messages (paginated by |
|
| Approve full validation — credits charged here |
|
| Fetch download URL, metadata, viewer URL |
|
| Re-validate enriched output after corrections |
|
| Submit text or file for claim verification |
Job status values:
Status | Meaning |
| Accepted, waiting to start |
| Actively running |
| Free preview done — review results and approve full run |
| Full validation complete, results ready |
| Error — check |
Account
Method | Path | Description |
|
| Current credit balance and this-month usage |
|
| Billing history (supports |
MCP Prompts
Three built-in prompts act as workflow starters — select them from the prompt picker in your MCP client (Claude Code: / menu; Claude Desktop: the prompt icon) and fill in the arguments.
Prompt | Arguments | What it does |
|
| Builds a step-by-step instruction for creating a new research table from a natural language description |
|
| Generates the full validation workflow for an existing Excel or CSV file |
|
| Generates the reference-check workflow for fact-checking a text passage |
MCP Tool Reference
Every tool response includes a _guidance block with a plain-English summary and the exact next tool call(s) — enabling fully autonomous agent workflows.
Tool | Description |
| Upload Excel, CSV, or PDF. Try with |
| Confirm upload; detect config matches; auto-start interview if needed |
| Start an AI conversation to generate a table from a prompt |
| Poll a conversation for AI responses or status changes |
| Reply to AI questions during an interview or table-maker session |
| Block until conversation needs input or finishes (emits live progress) |
| Refine the validation config with natural language instructions (adjusts sources, strictness, interpretation — cannot add or remove columns) |
| Block until |
| One-shot status poll |
| Fetch progress messages with native percentages (paginated) |
| Approve preview → start full validation (credits charged here) |
| Download URL, inline metadata, interactive viewer URL |
| Re-validate enriched output after analyst corrections |
| Submit text or file for claim and citation verification |
| Check credit balance |
| Review billing history |
Key Behaviors
Auto-queued preview
The preview is automatically queued in all three paths after start_table_validation:
Path | Trigger | What to call next |
Config match (score ≥ 0.85) |
|
|
|
|
|
Interview ran |
|
|
To reuse a config from a different session, pass config_id to start_table_validation — the preview will be auto-queued immediately.
Config reuse
If start_table_validation returns match_score ≥ 0.85, the preview is automatically queued using the matched config. The response includes preview_queued: true and job_id — call wait_for_job(job_id) directly, no interview needed.
The configuration_id from any completed job's get_results response can be reused on future uploads of similar tables.
Cost confirmation gate
approve_validation requires approved_cost_usd matching the preview estimate. This prevents surprise charges. The estimate is in the preview_complete job status response under cost_estimate.estimated_total_cost_usd.
This gate applies regardless of whether instructions or auto_start was used — both only skip the interview/confirmation conversation, not the cost approval step. If your balance is insufficient when approve_validation is called, the API returns:
{ "error": "insufficient_balance", "required_usd": 4.20, "current_balance_usd": 1.50 }Fire-and-forget shortcuts
Two optional flags let fully automated pipelines skip interactive steps:
Flag | Tool | Skips | Next step |
|
| Upload interview Q&A |
|
|
| Structure confirmation |
|
These flags use different terminal signals: instructions= (a config-gen flow) causes trigger_config_generation: true on the conversation response; auto_start=True (a table-maker flow) causes trigger_execution: true. Both skip interactive Q&A but produce different fields — do not wait for trigger_execution when using the instructions= upload path. The preview_complete cost gate and approve_validation still apply.
Consuming results: humans vs AI agents
Output files generated per run:
File | Format | Description |
Preview table | Markdown (inline) | First 3 rows as markdown text; returned inline in the |
Enriched results | Excel ( | Ideal for sharing with humans; sources and citations are embedded in cell comments |
Full metadata |
| Complete per-cell detail for every row; use the |
get_results returns:
Field | Type | Best for |
| URL | Humans — web viewer with confidence indicators (requires login at subindex.ai with the same email as your API key) |
| Presigned URL | Humans — download the enriched Excel (.xlsx) directly |
| Presigned URL | AI agents — JSON file with all rows, per-cell details, and source citations |
Recommended AI agent workflow:
At
preview_complete: read the inlinepreview_table(markdown, 3 rows) fromGET /jobs/{id}to survey the table structure and spot-check values. The AI agent can review this inline table and callapprove_validationdirectly — no human approval step is required.After full validation: fetch
results.metadata_url→table_metadata.json. This contains every validated row.Use
rows[].row_key(stable SHA-256) to cross-reference rows between the markdown summary and the detailed JSON.Per-cell fields in
table_metadata.json:cells[col].value— validated value (legacy files may usefull_value)cells[col].confidence—HIGH/MEDIUM/LOW/IDcells[col].comment.validator_explanation— reasoningcells[col].comment.key_citation— top authoritative sourcecells[col].comment.sources[]— all sources withurlandsnippet
Pricing
Mode | Cost |
Preview (first 3 rows) | Free |
Standard validation | ~$0.05 / cell |
Advanced validation | up to ~$0.25 / cell |
Minimum per run | $2.00 |
Reference check | TBD — contact support |
Credits are prepaid. Get $20 free at subindex.ai/account.
Standard validation is used for most tables. Advanced validation is selected automatically when the table requires more sophisticated reasoning (e.g., scientific data, complex financial metrics, or cells with high ambiguity).
Links
MCP server (HTTP, recommended):
claude mcp add subindex --transport http https://mcp-server-subindex-production.up.railway.app/ --header "X-Api-Key: sbx_live_..."— no install neededMCP server (PyPI/uvx):
uvx mcp-server-subindex— for Claude Desktop or offline useDocumentation: subindex.ai/mcp
API reference: subindex.ai/api
Account & credits: subindex.ai/account
Available Tools
25 toolsadd_pending_rowA
Add a new entity as a pending row to be included in the full validation run.
The source Excel is NOT modified — the row is stored in session state and injected in-memory at validation time. Fully reversible before approving the full run.
The full-run cost quote updates to include the new row count.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID. | |
| entity_id | Yes | Unique identifier for the new entity (e.g. ticker, ID, slug). | |
| entity_name | Yes | Human-readable name of the entity. | |
| extra_fields | No | Additional column values as a dict, e.g. {"Ticker": "AAPL", "Exchange": "NASDAQ"}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) indicate mutability but non-destructiveness. The description adds nuance: 'source Excel is NOT modified' and 'fully reversible before approving the full run', clarifying the session-level mutability. This extra context is valuable and consistent with 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 extremely concise (4 sentences) with front-loaded action statement. Each sentence adds essential context: purpose, in-memory behavior, reversibility, and cost update. No superfluous words.
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 tool's complexity (4 parameters, output schema exists), the description fully covers behavioral context: non-modification, session storage, reversibility, and cost impact. The agent can understand the tool's role and side effects without needing additional explanation.
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?
Input schema covers all 4 parameters with descriptions (100% coverage). The description does not elaborate on parameters beyond the schema, but baseline is 3 due to schema coverage. No additional semantic value is provided by the 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 description clearly specifies the action ('Add a new entity as a pending row') and the context ('to be included in the full validation run'). This distinguishes it from siblings like 'add_validated_rows' (adds pre-validated rows) and 'include_row' (re-includes excluded rows), providing a unique purpose.
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 explains the tool's behavior (no modification to source Excel, stored in session state, reversible before approval) which gives clear context for when to use it. It implicitly advises against using it for permanent modifications, though it lacks explicit 'do not use when' guidance or direct sibling comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_validated_rowsA
Add new rows to a completed validation table.
Deduplication runs against existing rows. If confirmed=False, returns a cost quote (N_new_rows x per_row_rate from last run). If confirmed=True, appends rows to source Excel, runs validation on new rows only, and merges results into the output Excel.
Only available after full validation completes (status=completed).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID of a completed validation. | |
| entities | Yes | List of new entities to add. Each dict must have 'entity_id', 'entity_name', and optional 'extra_fields'. | |
| confirmed | No | Set True to approve and trigger the RowAdd run. Set False (default) to see the cost quote first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by detailing deduplication, cost quoting, and the append-and-validate behavior. It explains the effect on source Excel and the merging of results. This provides comprehensive behavioral transparency without contradicting annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true agree).
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 concise: one sentence for purpose, two sentences for key behavior, one sentence for precondition. It is front-loaded with the main action and every sentence adds value without 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?
Given the tool's complexity (3 parameters, output schema exists), the description covers purpose, behavior, precondition, deduplication, cost quote, and validation merging. It is complete for an agent to understand and invoke 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 baseline is 3. However, the description adds significant context about the confirmed parameter's dual behavior, deduplication logic, and cost quoting. It enriches understanding beyond the parameter descriptions, earning a 4.
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 the tool's action: 'Add new rows to a completed validation table.' It specifies the resource (validation table) and the verb (add), and distinguishes from siblings by noting it operates on completed validation tables, unlike add_pending_row or other row-related tools.
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 provides a clear precondition: 'Only available after full validation completes (status=completed).' It also explains the two-phase use via the confirmed parameter. While it doesn't explicitly list alternatives, the context is sufficient for an agent to decide when 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.
approve_validationA
Approve a preview and start full validation processing.
job_id: the session_id value — "job_id" and "session_id" are the same string.
approved_cost_usd MUST be provided and must match the estimated cost from the preview_complete response. This prevents accidental billing without first reviewing preview results and the cost estimate.
Workflow:
Call wait_for_job to reach preview_complete — read the inline preview_table (3-row sample) and cost_estimate.estimated_total_cost_usd from the response
Call approve_validation(job_id=, approved_cost_usd=)
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Session ID / job ID in preview_complete state to approve for full validation. | |
| approved_cost_usd | No | The estimated cost from the preview_complete response — must match exactly to confirm you reviewed the cost before billing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) and non-idempotent (idempotentHint=false). The description adds behavioral context: it starts full validation processing and requires exact cost confirmation to prevent accidental billing. No contradictions with 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 concise, using short sentences and a clear workflow structure (numbered steps). Every sentence adds value without unnecessary detail.
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 presence of an output schema (not shown) and good annotations, the description covers the tool's purpose, parameters, and workflow. It could briefly mention what happens after approval (e.g., the job transitions to a new state), but is otherwise complete for an agent.
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% with good descriptions. The description adds extra value by clarifying that 'job_id' is the same as 'session_id' and emphasizing that 'approved_cost_usd' must exactly match the estimated cost. This goes beyond the schema's basic 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 clearly states 'Approve a preview and start full validation processing,' specifying a specific verb and resource. It distinguishes from sibling tools like 'trigger_preview' and 'wait_for_job' through the workflow mention.
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 provides explicit workflow steps: call 'wait_for_job' first to reach preview_complete, then call 'approve_validation' with the exact cost. It explains the reason for requiring 'approved_cost_usd' to match the estimate, but does not explicitly mention when not to use the tool or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_rowsA
Discover and add new rows to an existing validated table using AI-powered search.
Uses the existing table's config and validated data to plan a targeted row discovery run. The planner derives search strategy from the config, then RowDiscovery finds candidates and QC filters them.
If confirmed=False, returns a cost estimate. If confirmed=True, enqueues the discovery pipeline (planner -> search -> QC -> pending_rows).
Discovered rows land in pending_rows with source='row_discover'. Run add_validated_rows to validate them, or trigger a preview to see them.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID of a completed validation. | |
| instruction | Yes | What rows to discover, e.g. 'add 5 EU pharma companies' or 'find more entries matching the existing pattern'. | |
| count | No | Target number of new rows to discover. | |
| confirmed | No | Set True to approve and trigger the RowDiscover run. Set False (default) to see the cost quote first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides extensive behavioral details beyond annotations: it explains the pipeline (planner -> search -> QC -> pending_rows), the source label, the cost estimate mode, and that discovered rows land in pending_rows. This exceeds the not read-only, not destructive, open-world hints provided by 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 well-structured with clear sections, front-loading the core action. It is slightly verbose with pipeline details but remains efficient and readable. Each sentence adds relevant 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?
Given the complexity of the tool (AI-powered discovery pipeline), the description is comprehensive. It covers prerequisites (validated table), workflow steps, output (pending_rows), and next steps (add_validated_rows). The presence of an output schema (though not shown) reduces the need for return value 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?
All four parameters are described in the input schema with 100% coverage. The description adds context by explaining the role of session_id (from a completed validation), instruction (natural language request), count (target number), and confirmed (triggers vs quotes). This adds value but is not essential given schema 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 clearly states the tool's purpose: 'Discover and add new rows to an existing validated table using AI-powered search.' It specifies the resource (rows), action (discover/add), and method (AI-powered search). This distinguishes it from siblings like add_validated_rows (which validates pending rows) and get_results (which retrieves data).
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 explains when to use the tool (to discover new rows via AI) and outlines the two modes (confirmed=False for cost estimate, confirmed=True to enqueue). It mentions the dependency on a completed validation session and points to add_validated_rows for subsequent validation. However, it does not explicitly state when not to use it or list all alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exclude_rowA
Exclude a row from the full validation run.
Call with confirmed=False first to see a warning, then re-call with confirmed=True to apply. Reversible via include_row at any point before approving the full validation run.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID. | |
| row_key | Yes | Row key of the row to exclude. | |
| confirmed | No | Set True to confirm exclusion. Set False (default) to preview the warning first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation) and destructiveHint=false. The description adds crucial behavioral details: the two-step confirmation process and reversibility, which are not in annotations. No contradiction.
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?
Three succinct sentences, front-loaded with the main purpose. Every sentence adds essential information without 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?
Given 100% schema coverage and presence of an output schema (not shown, but context signals indicate it exists), the description is complete, covering usage pattern, reversibility, and relationship to sibling tools.
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 covers all parameters with descriptions (100% coverage). The description adds contextual usage for the 'confirmed' parameter, explaining its role in the two-step flow. This adds value beyond the schema's basic 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 description clearly states the action (exclude) and the target (a row from the full validation run), distinguishing it from siblings like 'include_row'.
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?
Explicitly guides the agent to call with confirmed=False first to preview a warning, then re-call with confirmed=True. Also notes reversibility via include_row, providing clear when-to-use and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceARead-only
Return the current account credit balance in USD.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the description adds the unit 'in USD' and 'current' but no further behavioral traits. With annotations present, the description provides adequate context beyond what is structured.
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?
A single, front-loaded sentence efficiently states the tool's purpose without 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?
Given zero parameters and presence of an output schema, the description suffices. It conveys the essential information (balance retrieval in USD) for a read-only tool.
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?
No parameters exist, so the baseline is 4. The description clarifies the return value (balance in USD), which adds meaning beyond the empty input schema and complements the output 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 ('Return') and resource ('account credit balance'), clearly indicating what value is retrieved. It stands out among sibling tools like get_usage which likely returns different information.
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 usage for checking balance but does not provide explicit when-to-use or when-not-to-use guidance. For a zero-parameter tool, this is minimally acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationARead-only
Poll a conversation for new messages or a status change.
Key statuses: processing → poll again in ~15s user_reply_needed → send_conversation_reply trigger_execution → preview is auto-queued; switch to get_job_status
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | Conversation ID returned by start_table_maker or start_table_validation. | |
| session_id | Yes | Session ID associated with the conversation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds behavioral context by explaining that the tool returns intermediate statuses and suggests polling intervals. However, it does not disclose auth requirements or rate limits, which would further enhance transparency.
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 very concise: one opening sentence plus a bullet list of three statuses. Every sentence adds value, and the structure front-loads the key action. There is no redundancy or fluff.
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 that an output schema exists (as per context signals), the description does not need to detail return values. It covers the main use case, statuses, and follow-up actions. It could mention polling timeout or when to stop, but it is sufficiently complete for a polling tool with sibling 'wait_for_conversation' for automatic polling.
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 input schema already documents both parameters. The description adds no additional parameter details beyond what is in the schema (e.g., 'Conversation ID returned by...'). Per the rubric, baseline is 3 when coverage is high, and the description does not add meaningful extra semantics.
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 the tool's purpose: 'Poll a conversation for new messages or a status change.' It specifies the verb 'poll' and the resource 'conversation', making the action unambiguous. The list of key statuses further distinguishes this tool from siblings like 'send_conversation_reply' and 'get_job_status'.
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 provides explicit guidance on when to use the tool (polling for new messages or status change) and includes specific statuses with recommended actions: 'poll again in ~15s', 'send_conversation_reply', and 'switch to get_job_status'. This gives clear context for alternative tools, exceeding basic usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_messagesARead-only
Fetch live progress messages for a running job.
Pass since_seq from the last message to receive only new messages.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Session ID / job ID to fetch progress messages for. | |
| since_seq | No | Return only messages with sequence number greater than this value. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true. Description adds minimal behavioral context (live, running job) but no extra safety or side-effect details 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?
Two sentences with a clear front-loaded purpose and no wasted words.
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 an output schema present, the description adequately covers purpose and key parameter usage, though it could optionally clarify behavior when since_seq is omitted.
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?
Input schema has 100% coverage, so baseline 3. Description reiterates the since_seq behavior but does not add new 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 the verb 'Fetch' and the resource 'live progress messages for a running job', distinguishing it from siblings like get_job_status which focus on overall status.
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?
Provides a clear usage hint for the since_seq parameter to fetch only new messages, but does not explicitly mention when not to use or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusARead-only
One-shot job status check. Prefer wait_for_job for tracking long-running jobs.
Use this for quick status inspections or as a fallback when wait_for_job is not appropriate. For polling loops, wait_for_job is more efficient — it holds the connection, emits live MCP progress notifications, and handles the multi-phase pipeline (table-maker → preview) automatically.
Key statuses: queued / processing → call wait_for_job instead of re-polling manually preview_complete → approve_validation (or refine_config) completed → get_results failed → check error field
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Session ID / job ID returned by upload_file, start_table_validation, or start_table_maker. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description confirms it is a one-shot, non-blocking read operation, consistent with readOnlyHint. It adds value by mapping statuses to recommended next actions, giving the agent a behavioral model.
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?
Concise and well-structured: opening sentence, usage guidance, bullet list of status mappings. Every sentence is informative with no filler.
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 one fully-described parameter, good annotations, and output schema, the description covers purpose, usage, and next steps. No gaps for a simple query tool.
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 parameter job_id is fully described in the schema (100% coverage). The description adds context by listing where job_id comes from (upload_file, start_table_validation, start_table_maker), which aids in value selection.
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?
Description starts with 'One-shot job status check,' clearly stating the purpose. It contrasts with wait_for_job, making it easy to distinguish.
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?
Explicitly says 'Prefer wait_for_job for tracking long-running jobs' and provides status-specific guidance (queued/processing → wait_for_job, preview_complete → approve_validation, etc.).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_preview_stateARead-only
Get the current structural editing state of a session.
Returns the preview table, excluded rows, pending rows, ignored columns, and current row order so you can review before triggering the full validation run.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds value by listing what is returned (preview table, excluded rows, pending rows, ignored columns, row order) and the purpose (review). No contradiction.
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?
Three sentences, each serving a purpose: state action, list return items, state usage context. No extraneous information. Front-loaded with the verb and resource.
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?
Despite having an output schema, the description still explains the key components returned. For a simple read-only tool with one parameter, this is complete and sufficient guidance.
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 has 100% coverage with a single parameter 'session_id' described only as 'Session ID.' Description does not add additional semantics about the parameter beyond what the schema provides, so 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?
Clearly states 'Get the current structural editing state of a session,' specifying the action (get), resource (preview state), and scope (session). Distinguishes from sibling tools like 'trigger_preview' and 'add_pending_row' which modify state.
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?
Explicitly says to use it 'before triggering the full validation run' to review current state. Does not mention alternatives or when not to use, but the context is clear enough for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resultsARead-only
Fetch the final validated/enriched results for a completed job.
job_id: the session_id value — "job_id" and "session_id" are the same string.
Automatically downloads table_metadata.json and embeds it inline so no separate HTTP fetch is needed. Key fields in the response:
results.markdown_table — START HERE. Self-contained markdown document: full validated table (all rows, all values), confidence icons, viewer/download links, and a guide to navigating citations. Read this first. results.metadata.rows[] — per-row data keyed by row_key; each cell has value, confidence, comment (with citations). (legacy files may use full_value; both are equivalent) results.interactive_viewer_url — share with humans; renders sources + confidence. results.download_url — enriched Excel file for offline sharing.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Session ID / job ID of a completed validation job. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations by revealing that table_metadata.json is automatically embedded, avoiding separate HTTP fetches. Also outlines key response fields. Annotations already indicate readOnlyHint=true, so the description complements without contradiction.
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?
Well-structured with a clear opening sentence, bullet points for key response fields, and a 'START HERE' emphasis. Every sentence is informative and earns its place; no fluff.
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 tool with one parameter, high schema coverage, and an output schema, the description is comprehensive: explains purpose, parameter usage, and response structure. Provides a mental map of the output without redundancy.
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%, baseline is 3. Description adds clarifying detail that job_id and session_id are the same string, and implies job_id must be for a completed job, which goes beyond the schema's 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?
Description clearly states 'Fetch the final validated/enriched results for a completed job,' providing a specific verb, resource, and constraint. It distinguishes from sibling tools like get_job_status or get_preview_state by focusing on completed job results.
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?
Provides context that job_id equals session_id and emphasizes starting with results.markdown_table. However, it does not explicitly state when to use this tool versus alternatives (e.g., get_job_status, get_preview_state), lacking exclusions or when-not scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-only
Return API usage history. Dates in YYYY-MM-DD format.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | No | Filter start date in YYYY-MM-DD format. | |
| end_date | No | Filter end date in YYYY-MM-DD format. | |
| limit | No | Maximum number of records to return. | |
| offset | No | Number of records to skip for pagination. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, making the behavioral expectations clear. The description adds a date format hint but does not discuss other behaviors like pagination or rate limits, which are not covered by 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?
Two sentences communicate purpose and a key format detail with no wasted words.
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 presence of an output schema and annotations, the description covers the essential purpose and date format. It could detail what constitutes 'usage history' but remains adequate for a read-only list tool.
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 description does not need to compensate. The date format hint redundantly reinforces parameter descriptions, adding no new meaning.
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 'Return API usage history', which specifies a verb and a resource. The purpose is distinct from sibling tools like get_balance or get_conversation.
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 provides no guidance on when to use this tool versus alternatives. It lacks any context about suitable scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
include_rowA
Re-include a previously excluded row.
No confirmation needed. Can be called at any point before approving the full validation run.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID. | |
| row_key | Yes | Row key of the row to re-include. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral context beyond annotations: no confirmation required and valid only before approval. This informs the agent about side effects and constraints without contradicting 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?
Two sentences, no extraneous words, front-loaded with the core action. Every sentence provides essential 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?
With an output schema present and a simple tool (2 params), the description covers action, constraints, and timing. Could mention error conditions, but overall adequately 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?
Schema descriptions cover both parameters (session_id and row_key) completely. The description does not add additional semantic value beyond what the schema provides, so baseline score 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?
The description uses the specific verb 're-include' and resource 'row', clearly stating the action. It naturally distinguishes from sibling 'exclude_row' by implying the opposite operation.
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?
Explicitly states no confirmation needed and the timing constraint ('at any point before approving the full validation run'). While it doesn't list alternatives, the context is sufficient for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_columnA
Add a new column to a completed validation table.
If confirmed=False, returns a cost ceiling estimate (max-case: all rows x all columns x per_cell_cost x 1.25; likely much less if run within 1 day of original validation due to cache).
If confirmed=True, adds column header to source Excel, runs validation with updated config (old columns hit cache, new column fully validated), merges new column results into output Excel. No QC on column patch runs (single-column QC is not meaningful; full-table QC ran on the original validation).
Only available after full validation completes (status=completed).
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID of a completed validation. | |
| column_name | Yes | Name of the new column to add. | |
| validation_target | Yes | Validation target spec for the new column (same structure as config.validation_targets entries). | |
| confirmed | No | Set True to approve and trigger the ColPatch run. Set False (default) to see the cost estimate first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses behavioral traits: the cost estimate formula, caching behavior, merging of results, and lack of QC on patch runs. Annotations (readOnlyHint=false, destructiveHint=false) are consistent with the described non-destructive modification, and no contradictions exist.
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 concise with a front-loaded purpose statement and subsequent paragraphs explaining behavior in a logical flow. Every sentence adds necessary information without 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?
Given the complexity (4 parameters, nested objects, output schema), the description covers all essential aspects: precondition (completed validation), two-phase execution, caching, cost estimation, and result integration. It is complete for an agent to determine correct usage.
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 value by explaining the 'confirmed' parameter's role in toggling between estimate and execution, and provides context for the cost calculation. For other parameters, the schema descriptions already suffice.
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 starts with 'Add a new column to a completed validation table,' which is a specific verb and resource. It clearly distinguishes this tool from siblings like start_table_validation or refine_config by focusing on adding a column after validation completion.
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 explains the two-mode behavior (confirmed=False for cost estimate, confirmed=True for execution) and explicitly states it is only available after full validation completes. However, it does not explicitly mention when not to use it or alternative tools for modifying existing columns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refine_configA
Refine the generated validation config using natural language instructions.
Example instructions: 'Add a column for LinkedIn URL. Remove the revenue column. Make email validation stricter.'
Set defer_preview=True if you plan to do structural editing (exclude_row, add_pending_row, etc.) before the preview — this prevents a premature auto-preview from firing before your edits are complete.
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | Conversation ID of the refine session. | |
| session_id | Yes | Session ID associated with the conversation. | |
| instructions | Yes | Natural-language instructions describing the config changes to make. | |
| defer_preview | No | Set True to suppress the auto-preview that fires after config refinement. Use when you intend to do structural editing (exclude rows, add pending rows, add columns) before the preview. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-readonly, non-destructive, open-world. Description adds auto-preview behavior and the effect of defer_preview. Does not detail persistence or rollback, but adds useful behavioral context.
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 terse paragraphs: purpose with examples, then defer_preview guidance. No excess words. Highly 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?
Assumes existence of conversation/session (required params) but does not explain lifecycle context (e.g., must have started refinement via start_table_validation). Output schema exists so return values not needed, but prerequisites are implicit.
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% with clear descriptions. Description adds example instructions and clarifies defer_preview usage beyond schema (e.g., 'prevents premature auto-preview'). Baseline 3 improved to 4.
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?
Description clearly states the verb 'refine' and resource 'validation config', with natural language instructions. Examples provided distinguish from sibling tools like 'start_table_validation' or 'approve_validation'.
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?
Provides specific guidance on when to set defer_preview to avoid premature auto-preview. However, does not explicitly compare to sibling tools for granular edits (e.g., exclude_row, add_pending_row) that might be alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_preview_rowsA
Set the output row order for the validation run.
This is a display preference — it does not affect which rows are validated or the validation itself. Rows not in the list are sorted to the end.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID. | |
| row_keys_in_order | Yes | Complete ordered list of row keys defining the desired output order. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description adds critical behavioral context: it is a display preference, does not affect validation, and rows not in the list are sorted to the end. No contradictions.
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?
Three concise sentences, front-loaded with purpose, then clarifying details. No wasted words.
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 reordering tool with good annotations and schema, the description covers all key behavioral aspects and is 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?
Schema coverage is 100% and both parameters are described. The description adds value by explaining the sorting behavior for omitted rows, going 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 the tool sets the output row order for the validation run and explicitly clarifies it is a display preference, distinguishing it from tools that affect validation or row inclusion.
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 explicitly states when to use (to reorder display) and what it does not do (affect validation), with clear implications that alternatives like include_row/exclude_row are for validation changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_conversation_replyA
Send a user reply in an ongoing conversation (interview or table-maker).
After sending, poll get_conversation for the AI's next response.
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | Conversation ID to send the reply to. | |
| session_id | Yes | Session ID associated with the conversation. | |
| message | Yes | Reply message text to send to the AI. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool triggers a stateful action (openWorldHint=true) and requires polling for AI response, adding value beyond annotations. However, does not detail rate limits, authentication needs, or potential delays.
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 concise sentences: one for purpose, one for next step. No redundant or vague phrasing; efficient and clear.
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?
Tool is straightforward and the description, combined with annotations and output schema (not shown but present), covers key behavioral aspects. Explains the polling pattern, which is critical for correct usage.
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?
Input schema covers 100% of parameter descriptions, so the description adds no additional parameter semantics. 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?
Description clearly states the action (send a user reply) and context (ongoing conversation, interview or table-maker). Distinguishes from sibling tools like get_conversation and wait_for_conversation, which serve different purposes.
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?
Provides explicit instruction to poll get_conversation after sending, guiding the agent on the expected workflow. Lacks explicit when-not-to-use or alternatives, but for a focused tool this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_reference_checkA
Submit a reference-check job to fact-check text or a document.
For inline text: start_reference_check(text="The claims to fact-check...")
For a PDF or document, upload it first then pass the s3_key: upload_file(file_path, file_type="pdf") → returns s3_key start_reference_check(s3_key=s3_key) Do NOT call start_table_validation for PDFs — that starts the table validation pipeline, which is not what you want for a reference check.
Designed for text with 4 or more factual claims; fewer claims may produce low-quality results.
Three phases:
Phase 1 (free): claim extraction + 3-row preview validation (auto-triggered). wait_for_job blocks until status=preview_complete. Review preview_table (3 validated sample claims) and cost_estimate.
Approval gate: call approve_validation to proceed.
Phase 2 (charged): full claim validation. Returns XLSX, viewer URL, metadata.
Set auto_approve=True to skip the approval gate and run straight through to completion automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Inline text to fact-check (provide either text or s3_key, not both). | |
| s3_key | No | S3 key of an already-uploaded file to fact-check (provide either text or s3_key). | |
| auto_approve | No | Skip the preview approval gate and run straight through to full validation automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and openWorldHint=true. The description goes well beyond by detailing the three-phase workflow, auto-approve option, cost implications, and expected outputs (XLSX, viewer URL, metadata). It explains the approval gate and how wait_for_job interacts with phases, providing rich behavioral context.
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 well-structured with clear sections for inline text, file upload, and phases. It is informative but slightly lengthy; some details like the exact return of upload_file could be omitted. Overall, it is organized and front-loaded with key purpose.
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 tool's multi-phase complexity, the description covers all essential aspects: input formats, phase details, approval gate, auto-approve, output types, and links to other tools (upload_file, wait_for_job, approve_validation). The output schema exists to cover return values, so completeness is excellent.
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% with clear descriptions for all three parameters. The description adds value by explaining the mutual exclusivity of text and s3_key, and clarifying the behavior of auto_approve. However, most parameter meaning is already in the schema, so the description enhances rather than replaces.
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 the tool submits a reference-check job to fact-check text or documents. It distinguishes itself from sibling tool start_table_validation by explicitly stating not to use that for PDFs, and provides two input modes: inline text or S3 key of an uploaded file.
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 provides explicit when-to-use guidance: for fact-checking text with 4+ claims, and when not to use: fewer claims may produce low-quality results. It also warns against using start_table_validation for PDFs, naming an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_table_makerA
Start a Table Maker conversation to generate a research table.
Describe the table you want in natural language, e.g.: 'Create a table of AI startups that raised Series A in 2024 with columns: company name, funding amount, investors, product description.'
auto_start: When True, the AI skips the confirmation step and generates the table immediately from the message alone, without asking clarifying questions or showing a structure for approval. Use when the message fully describes the desired table and no back-and-forth is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Natural-language description of the table to generate, including desired columns and subject matter. | |
| auto_start | No | When True, skip clarifying questions and generate the table immediately from the message alone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is not read-only and not destructive, but the description adds transparency by detailing the conversation initiation and the auto_start behavior, which skips confirmation steps. It does not contradict 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 concise, front-loaded with the purpose, includes a clear example, and explains parameters efficiently. Every sentence serves a purpose without 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?
Given the tool's complexity, the description covers the main parameters and usage. With an output schema present (as per context signals), the description does not need to explain return values. It is complete for effective tool 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 coverage is 100%, but the description adds value by providing examples for the message parameter and clarifying when to use auto_start. This goes beyond the schema descriptions, which are already adequate.
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 the tool starts a Table Maker conversation for generating research tables, using a specific verb and resource. It provides an example and distinguishes itself from sibling tools like start_reference_check or start_table_validation by its unique purpose.
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 explains how to use the tool, including the auto_start parameter behavior, but does not explicitly mention when to use it versus alternatives or when not to use it. It lacks guidance on prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_table_validationA
Confirm the upload and detect matching prior configs.
Call this immediately after upload_file completes (or after the curl upload finishes when using HTTP/Railway transport). Returns config_matches with match_score — if score >= 0.85 a prior config can be reused directly.
instructions: Optional natural-language description of what to validate and how (e.g. "This table lists clinical trials — validate that trial IDs, phase, and primary endpoints are accurate"). When provided, the upload interview is bypassed: the AI reads the table structure + instructions and generates a config directly without asking clarifying questions. Preview is auto-triggered immediately after.
config_id: Optional ID of a known prior configuration to reuse directly. When provided, skips matching and the interview entirely — applies the config and queues the preview immediately. Response includes preview_queued=true and job_id. Use when you already know the config_id (e.g. from a previous job's get_results response).
Config generation and the 3-row preview are free. Full validation is charged at approve_validation — you still see the cost at preview_complete before anything is billed. If balance is insufficient at that point, approve_validation returns an insufficient_balance error.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID returned by upload_file. | |
| s3_key | Yes | S3 key returned by upload_file identifying the uploaded file. | |
| filename | Yes | Original filename of the uploaded file. | |
| instructions | No | Optional natural-language description of what to validate; bypasses the upload interview when provided. | |
| config_id | No | Optional ID of a prior configuration to reuse; skips the interview and queues the preview immediately. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate the tool is not read-only and not destructive. The description adds behavioral context: config generation and preview are free, full validation is charged at approve_validation, and balance insufficiency leads to an error. It does not fully describe all side effects, but 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 description is well-structured with clear separation of concepts and front-loaded key information. It is slightly verbose but every sentence adds value. Could be more concise, but efficiently conveys important details.
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 tool's complexity (5 parameters, output schema exists), the description covers the workflow, charging model, and error handling. It does not detail return values, but output schema likely provides that. It is adequately 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 input schema already provides 100% coverage with descriptions, but the description elaborates on parameters like instructions and config_id, explaining their effects (bypassing interview, skipping matching). This adds meaningful context 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 the tool's purpose: to confirm upload and detect matching prior configs. It specifies the action verb ('confirm', 'detect'), the resource (upload and prior configs), and distinguishes from siblings like start_reference_check or start_table_maker.
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 explicitly instructs to call this immediately after upload_file completes, and explains when to use config_id vs instructions. It also mentions that if match_score >= 0.85, a prior config can be reused directly, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_previewA
Trigger a preview run after structural editing is complete.
Call this after finishing row/column edits (exclude_row, add_pending_row, add_column, etc.) to explicitly queue a preview job.
This clears skip_auto_preview and queues the preview. Then call wait_for_job(session_id) to track progress.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID to trigger preview for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide basic traits (non-readonly, non-destructive). The description adds specific behavioral details: 'clears skip_auto_preview and queues the preview.' This goes beyond annotations and gives the agent a better understanding of side effects.
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 three sentences, each serving a distinct purpose: stating the action, clarifying context, and explaining behavior plus next step. No filler or 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?
Given the tool's low complexity (single param, output schema exists), the description covers purpose, usage context, behavioral effect, and next step. It lacks mention of return values but is otherwise 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?
Schema description coverage is 100%, with the session_id parameter already described as 'Session ID to trigger preview for.' The description does not significantly elaborate beyond that, but it reinforces usage context by mentioning session_id in the follow-up step. Baseline of 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 clearly states the verb 'Trigger a preview run' and specifies the resource ('preview run') and context ('after structural editing is complete'). It distinguishes itself from sibling tools by mentioning it is called after row/column edits, providing explicit examples.
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 explicitly instructs when to call this tool ('after finishing row/column edits') and provides follow-up steps ('call wait_for_job(session_id) to track progress'). While it does not mention alternatives or when not to use, the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tableA
Re-run validation on a previously processed table (update in place).
source_version can pin a specific prior result version; omit for latest.
| Name | Required | Description | Default |
|---|---|---|---|
| source_job_id | Yes | Job ID of the previously processed table to re-run validation on. | |
| source_version | No | Specific prior result version to pin; omit to use the latest version. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description says 'update in place' implying modification, consistent with readOnlyHint=false. However, no additional behavioral details beyond annotations; no mention of overwrite behavior or side effects.
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 terse sentences, no fluff, critical info front-loaded. Every word contributes.
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?
Output schema exists, so return values are covered. However, the description omits what 'update in place' means for previous results (overwrite vs new version). Functional but leaves some questions for a validation tool.
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% with adequate parameter descriptions. Description adds context for source_version ('pin...latest'), but largely redundant with schema. 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?
Description clearly states 'Re-run validation on a previously processed table', specifying verb and resource. No ambiguity; distinguishes from siblings like add_validated_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?
Provides guidance on the source_version parameter but lacks explicit when-to-use vs alternatives. Implied for re-running validation, but could contrast with add_validated_rows or start_table_validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Upload a file to Subindex.
RECOMMENDED: always try with file_path first. If the server can read the file (stdio/uvx transport), it uploads in one step and returns session_id
s3_key immediately. If the server is remote (HTTP/Railway transport), file_path raises "File not found" — in that case call again without file_path to get a presigned S3 upload_url and curl_command instead.
With file_path (one step — stdio/uvx transport): upload_file(filename="data.xlsx", file_type="excel", file_size=12345, file_path="/abs/path/data.xlsx") → server reads + uploads → returns session_id, s3_key
Without file_path (two step — HTTP/Railway transport or any remote server): upload_file(filename="data.xlsx", file_type="excel", file_size=12345) → returns upload_url + curl_command → run the curl_command (requires shell/Bash access), then call start_table_validation(session_id, s3_key, filename)
Note: the two-step path requires shell access to run curl. If you have no shell (e.g. Claude Desktop), use the stdio/uvx transport instead so file_path works.
file_type must be one of: "excel", "csv", "pdf" The presigned URL expires in ~15 minutes — run curl immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Original filename including extension (e.g. 'data.xlsx', 'report.csv', 'doc.pdf'). | |
| file_type | Yes | File format — must be one of: "excel", "csv", "pdf". | |
| file_size | Yes | File size in bytes. Run: stat -c%s <file> (Linux/macOS) or (Get-Item '<file>').Length (PowerShell). | |
| file_path | No | Absolute local path to upload directly (uvx/local transport only — the MCP server reads the file). Omit when using HTTP/Railway transport; the response curl_command handles the upload instead. | |
| session_id | No | Optional existing session ID to associate this upload with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the two-step behavior, presigned URL expiration (15 minutes), and transport dependency. Annotations (readOnlyHint=false) are consistent; description adds valuable context 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?
Well-structured with headings and examples, but slightly verbose. Front-loads purpose and uses clear sections, though some repetition 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?
Given tool complexity (two modes, transport-dependent) and presence of output schema, the description covers fallback logic, expiration, and prerequisites thoroughly.
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%, but description adds extra context for file_path (recommendation, transport dependency) and example usage. Adds meaning beyond 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?
Clearly states 'Upload a file to Subindex' and distinguishes two modes based on transport. The verb+resource is specific and distinct from sibling tools.
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?
Provides explicit guidance: 'always try with file_path first', explains when to use without file_path, and notes shell access requirement. Offers alternatives for different transports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_conversationARead-only
Wait for a conversation turn to complete, emitting live synthetic progress.
Preferred over manually polling get_conversation. Since conversation processing has no native progress signal, this tool emits time-based synthetic progress — advancing quickly at first, then slowing as it approaches expected_seconds — so the MCP host shows a "still thinking" indicator rather than a frozen bar.
Returns when any of these conditions are met: user_reply_needed=True → AI asked a question; call send_conversation_reply trigger_execution=True → AI approved execution; preview is auto-queued, switch to wait_for_job(session_id) Non-processing status → unexpected terminal (inspect status field) Timeout → returns last known state with _wait_timeout note
Applies to all conversation types: upload interview, table-maker interview, config refinement.
expected_seconds: typical AI response time for this turn (default 120). First table-maker turn (research + planning): ~120–180s. Upload interview first turn (CSV analysis + plan): ~90–150s. Follow-up confirmations ("yes, proceed"): ~30–60s. poll_interval: seconds between status checks (default 8). timeout_seconds: max wall time before returning (default 900). Upload interview turns can take up to 15 minutes — set accordingly.
| Name | Required | Description | Default |
|---|---|---|---|
| conversation_id | Yes | Conversation ID to wait on. | |
| session_id | Yes | Session ID associated with the conversation. | |
| expected_seconds | No | Expected AI response time in seconds — used to shape synthetic progress curve (default 120). | |
| timeout_seconds | No | Maximum wall-clock seconds to wait before returning last known state (default 900). | |
| poll_interval | No | Seconds between status poll cycles (default 8). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the synthetic progress behavior, timing curve, and detailed return conditions. Annotations already indicate readOnlyHint=true, and the description adds significant behavioral context beyond that.
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 thorough and well-structured with bullet points for return conditions and parameter guidance. Although lengthy, every sentence adds value and the organization aids 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?
Given the output schema exists, the description covers all necessary aspects: purpose, usage, parameter guidance, return conditions, and scope. No gaps remain for effective tool selection and 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?
While the input schema covers 100% of parameter descriptions, the description adds contextual guidance (e.g., expected_seconds ranges for different turn types) that enhances understanding 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 the tool waits for a conversation turn to complete and emits synthetic progress. It specifies return conditions and distinguishes itself from manually polling get_conversation.
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 explicitly recommends this over polling get_conversation, provides context for all conversation types, and gives detailed guidance on expected_seconds values based on turn type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_jobARead-only
Wait for a job to reach a terminal state, emitting live MCP progress notifications.
Preferred over manually looping get_job_status. The MCP host shows a live progress indicator while this tool holds the connection — no extra token cost.
Architecture ──────────── Every poll cycle does two things in sequence:
Fetch /messages → extract native progress %, emit MCP notification
Fetch /status → act on phase transitions or terminal states
This separation means messages drive the visual indicator (they are more real-time) while status is the authoritative source for workflow transitions. Neither endpoint is used as a shortcut to skip the other; both are polled every cycle so transient failures in one don't cause false terminations.
Progress is always monotonically non-decreasing. Within a phase, msg_progress can oscillate (e.g. QC triggers new row-discovery rounds in the table-maker), but the emitted value is clamped to last_emitted. Across phases a geometric slice scheme is used so the bar never goes backward regardless of how many phases occur.
Progress geometry (lazy split) ────────────────────────────── Starts with the full 0–99 range so single-phase jobs (e.g. full validation after approve_validation) map their native 0–100% directly across the whole bar. On each intermediate phase transition, 80% of the current range is "spent" on the completed phase and the remaining 20% is handed to the next phase — keeping progress monotonic for any number of QC re-discovery rounds or pipeline stages. True terminal always emits exactly 100.
Terminal states: preview_complete, failed, completed-without-intermediate-step. Intermediate: completed + current_step in (Config Generation, Table Making, Claim Extraction, …) — tool advances phase and keeps polling.
Returns the same payload shape as get_job_status so downstream tools (approve_validation, get_results, etc.) apply directly.
job_id: the session_id value returned by upload_file / start_table_validation / start_table_maker. "job_id" and "session_id" are the same string — every workflow uses session_id as its job identifier throughout the pipeline. timeout_seconds: max wall time before returning last known state (default 900). Upload-interview + config-gen phases and large table previews can take up to 15 minutes — set timeout_seconds=900 or higher for long-running jobs. poll_interval: seconds between poll cycles (default 10) warmup_seconds: when > 0, applies synthetic sqrt-curve progress from 0→70% over this many seconds during the pre-message phase (before the first progress message or intermediate step arrives). Use this when the pipeline has a silent setup phase (e.g. instructions= mode where the backend runs an internal AI interview + config generation before preview messages begin). The warmup is automatically disabled once the first intermediate step completes (phase-split takes over). For instructions= mode, pass 300.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Session ID returned by upload_file, start_table_validation, or start_table_maker. | |
| timeout_seconds | No | Maximum wall-clock seconds to wait before returning last known state (default 900). | |
| poll_interval | No | Seconds between status poll cycles (default 10). | |
| warmup_seconds | No | Seconds of synthetic sqrt-curve progress during silent setup phases (default 0; use 300 for instructions= mode). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavioral details: the polling cycle (fetch messages then status), progress monotonicity, progress geometry (lazy split with 80/20 rule), terminal vs intermediate states, and the warmup mechanism. These go far beyond the annotations (readOnlyHint, openWorldHint) and are consistent with them.
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 fairly long but well-organized with section headings (Architecture, Progress geometry, etc.). The key purpose and preference statement are front-loaded. Every section provides necessary detail for correct usage, so it earns its length.
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 complexity (4 parameters, output schema present), the description is complete: it explains return shape (same as get_job_status), covers all parameters with usage notes, details internal polling architecture, and provides edge-case handling (warmup, intermediate phases). No gaps remain.
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?
All 4 parameters have schema descriptions (100% coverage). The description adds extra context: job_id is same as session_id, timeout_seconds default with real-world time guidance, warmup_seconds with use-case-specific advice. This adds meaning beyond the schema, justifying a score above 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 'Wait for a job to reach a terminal state, emitting live MCP progress notifications.' This is a specific verb+resource combination and explicitly distinguishes from sibling tool get_job_status by stating it is 'preferred over manually looping get_job_status.'
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 provides clear usage guidance: it is preferred over get_job_status for waiting, and it explains when to use warmup_seconds (e.g., 300 for instructions= mode). However, it does not explicitly state when not to use this tool or list alternatives beyond get_job_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct aspect of the validation pipeline—row management, job control, configuration, results, and account info—with no overlapping purposes. Even similar tools like add_pending_row vs add_validated_rows are clearly differentiated by stage.
All 25 tool names follow a consistent verb_noun pattern (e.g., add_pending_row, get_results, wait_for_job). The naming is uniform and predictable, making it easy to infer functionality.
With 25 tools, the set is on the higher side but each tool is justified by the server's comprehensive workflow (upload, config, preview, editing, validation, results, updates, and account management). Some consolidation of polling tools might be possible, but overall the count is reasonable for the scope.
The tool surface covers the entire lifecycle: file upload, table configuration, preview, structural editing, approval, full validation, result retrieval, post-validation updates, and even reference checking. Account tools (get_balance, get_usage) are also included, leaving no obvious gaps for the stated domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Fan out deep research across multiple AI providers, synthesize into one unified report.
Web search, fetch, extract, and research for AI agents. Markdown output + AI-synthesized answers.
Real-time fact-check, citation verification, and source-freshness for AI agents.
Source-traced evidence research for AI agents. We organise the evidence; you decide.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables iterative deep research by integrating AI agents with search engines, web scraping, and large language models for efficient data gathering and comprehensive reporting.8323MIT
- AlicenseNot gradedqualityCmaintenanceEnhances LLM applications with deep autonomous web research capabilities, delivering higher quality information than standard search tools by exploring and validating numerous trusted sources.364MIT
- AlicenseAqualityCmaintenanceEnables AI agents to perform professional-grade deep research by aggregating real-time data from multiple sources, evaluating source credibility, and generating comprehensive reports.311Apache 2.0
- AlicenseAqualityDmaintenanceA multi-agent research system that decomposes complex queries into targeted sub-questions, searches the web in parallel, scores source credibility, and synthesizes findings into structured markdown reports.11MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/EliyahuAI/mcp-server-subindex'
If you have feedback or need assistance with the MCP directory API, please join our Discord server