MCP Server Reference
Quick setup: Users should use the hosted remote server. Add it to Claude.ai or Claude Code. The reference below describes the hosted server.
The FutureSearch MCP server is called directly by Claude Code, Claude.ai, and other MCP clients, no Python code needed. Operation tools follow an async pattern: submit a task, poll for progress, retrieve results. This lets long-running operations (1–10+ minutes) work reliably across MCP clients.
Data ingestion
futuresearch_upload_data
Upload a CSV from a URL (or local path in stdio mode).
| Parameter | Type | Required | Description |
|---|---|---|---|
source | string | Yes | HTTP(S) URL (Google Sheets and Drive URLs are auto-converted to CSV) or absolute local file path (stdio mode only). |
session_id | string | No | Add to an existing session. |
session_name | string | No | Name for the new (or renamed) session. |
Returns artifact_id, session_id, row count, and column names.
In HTTP mode, local file paths are rejected — use futuresearch_request_upload_url instead.
futuresearch_request_upload_url
Request a presigned URL for uploading a local CSV (HTTP mode only). This bypasses the conversation context, so the file contents don't consume tokens.
| Parameter | Type | Required | Description |
|---|---|---|---|
filename | string | Yes | Filename, must end in .csv. |
session_id | string | No | Session to attach the upload to. |
Returns a presigned URL, expiration, the max file size (50 MB), and a ready-to-execute curl command. The response from the upload contains the artifact_id.
futuresearch_browse_lists
Browse FutureSearch's built-in reference lists — companies (S&P 500, FTSE 100, sector breakdowns), geography (countries, US states, cities), people (billionaires, heads of state), institutions (universities, regulators), and more.
Call with no parameters to see all lists. Browsing the full list (~60 entries) is preferred over filters, which require knowing what's there.
| Parameter | Type | Required | Description |
|---|---|---|---|
search | string | No | Match against list names (case-insensitive). |
category | string | No | Filter by category (e.g. "Finance", "Geography"). |
Returns names, fields, and artifact_ids to pass to futuresearch_use_list.
futuresearch_use_list
Import a reference list into your session.
| Parameter | Type | Required | Description |
|---|---|---|---|
artifact_id | string | Yes | An artifact_id from futuresearch_browse_lists. |
Returns task_id, artifact_id, row count, and column names. Pass the returned artifact_id to any operation tool.
Operations
Operation tools dispatch long-running tasks against your data. They share the conventions described first; the per-tool reference tables below only list tool-specific parameters.
Input source
Every operation tool that processes a table accepts exactly one of:
| Parameter | Type | Description |
|---|---|---|
artifact_id | string (UUID) | A previously-uploaded dataset. Returned by futuresearch_upload_data, futuresearch_request_upload_url, or futuresearch_use_list. |
data | JSON list of objects | Inline rows. Each object is one row; keys are column names. Capped at 5,000 rows — use uploads for larger datasets. |
futuresearch_single_agent and futuresearch_merge are exceptions. See below for details about their inputs.
Session management
Every operation tool optionally accepts:
| Parameter | Type | Description |
|---|---|---|
session_id | string (UUID) | Add this task to an existing session. |
session_name | string | Human-readable name for the session. If session_id is also set, renames the existing session. |
When both are omitted, a new session is auto-created.
Async submission
Operation tools return immediately with a task_id. Track progress in one of two ways:
- MCP clients with widget UIs (Claude.ai, Claude Desktop): call
futuresearch_statusonce. The widget polls automatically and renders results when the task completes. - All other clients: poll
futuresearch_progressuntil the task is done, then callfuturesearch_results.
Example end-to-end flow:
1. futuresearch_upload_data(source="https://example.com/leads.csv")
→ artifact_id, session_id
2. futuresearch_agent(
task="Find each company's latest funding round and lead investors",
artifact_id=...,
)
→ task_id (~0.6s)
3. futuresearch_progress(task_id=...)
→ "Running: 5/50 complete, 8 running (15s elapsed)" + cursor
4. futuresearch_progress(task_id=..., cursor=...)
→ "Completed: 49 succeeded, 1 failed (142s total)"
5. futuresearch_results(task_id=...)
→ preview rows, total count, download URL
In MCP clients with widget UIs, substitute steps 3–5 with a single futuresearch_status(task_id=...) call — the widget handles polling and result display automatically.
Custom response schemas
All tools that accept response_schema take a JSON Schema object:
{
"type": "object",
"properties": {
"annual_revenue": {
"type": "integer",
"description": "Annual revenue in USD"
},
"employee_count": {
"type": "integer",
"description": "Number of employees"
}
},
"required": ["annual_revenue"]
}
Constraints:
- Top-level
typemust beobject. propertiesmust be a non-empty object with at most 50 entries.- Allowed property types:
string,integer,number,boolean,array,object.
futuresearch_rank
Score and sort rows by a qualitative criterion. Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | Description of how to assign a score to an individual row. |
field_name | string | Yes | Output column name for the score. |
field_type | string | No | float (default), int, str, or bool. Only used if response_schema is not specified. |
ascending_order | bool | No | true = lowest first (default). |
response_schema | object | No | JSON Schema for additional output columns. See Custom Response Schemas. If specified, must contain field_name as a top-level property. Overrides field_type. |
futuresearch_classify
Assign each row to one of the provided categories. Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | Classification instructions. |
categories | list[string] | Yes | Allowed categories (minimum 2). Each row is assigned exactly one. |
classification_field | string | No | Output column name (default: "classification"). |
include_reasoning | bool | No | Include a reasoning column (default: false). |
futuresearch_dedupe
Group semantic duplicates and either select a representative, combine rows, or just label clusters. Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
equivalence_relation | string | Yes | Natural-language description of what makes two rows duplicates. |
strategy | string | No | select (default): pick the best representative per cluster. combine: synthesize a single combined row per cluster. identify: cluster only, keep all rows. |
strategy_prompt | string | No | Instructions guiding selection or combination (only with select and combine). |
futuresearch_merge
LEFT JOIN two tables using LLM-powered entity matching. Reference
The left table is being enriched (all rows kept). The right table is the lookup/reference table: its columns are appended to matches. Unmatched left rows get nulls.
Provide exactly one of left_artifact_id / left_data, and exactly one of right_artifact_id / right_data.
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | How to match rows between tables. |
left_artifact_id | string | * | Left table artifact ID. |
left_data | list[object] | * | Inline left table rows. |
right_artifact_id | string | * | Right table artifact ID. |
right_data | list[object] | * | Inline right table rows. |
merge_on_left | string | No | Column name in the left table. Set only if you expect exact string matches on this column, or want to draw agent attention to it. |
merge_on_right | string | No | Same, for the right table. |
relationship_type | string | No | many_to_one (default), one_to_one, one_to_many, or many_to_many. For *_to_many, multiple matches are joined with " | " in each added column. |
use_web_search | string | No | auto (default), yes, or no. |
futuresearch_forecast
Forecast questions about the future — binary, numeric, or date. Reference
The input table needs at minimum a question column. Recommended: resolution_criteria, resolution_date, background.
| Parameter | Type | Required | Description |
|---|---|---|---|
forecast_type | string | Yes | binary — probability (0–100) for yes/no questions. numeric — percentile estimates (p10–p90) for quantity questions. date — date percentile estimates for timing questions. |
context | string | No | Table-level context that applies to every row. |
effort_level | string | No | LOW (faster, cheaper) or HIGH (more accurate). Defaults: HIGH for a single question, LOW for multiple questions. |
output_field | string | Yes for numeric/date | Name of the quantity being forecast (e.g. "price", "launch_date"). |
units | string | Yes for numeric | Units (e.g. "USD per barrel", "thousands"). |
Output columns by mode:
binary:probability(int, 0–100) andrationale(string).numeric:{output_field}_p10…{output_field}_p90(float),units(string),rationale(string).date:{output_field}_p10…{output_field}_p90(YYYY-MM-DD strings),rationale(string).
futuresearch_agent
Run a web research agent on each row. Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | What to research per row. |
response_schema | object | No | Output structure as JSON Schema. Defaults to {"answer": string}. |
effort_level | string | No | low, medium (default), or high. Set to null to use llm / iteration_budget / include_reasoning instead. |
llm | string | No | Specific LLM (e.g. CLAUDE_4_6_SONNET_MEDIUM). Only used when effort_level is null. |
iteration_budget | int (0–20) | No | Max agent iterations per row. Only used when effort_level is null. |
include_reasoning | bool | No | Include reasoning notes. Only used when effort_level is null. |
enforce_row_independence | bool | No | If true, run each row independently without sharing context across rows (default false). |
futuresearch_single_agent
Run one web research agent on a single question, with no input table. Use this for one-off research. Reference
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | What to research. |
input_data | object | No | Optional context as inline JSON (e.g. {"company": "Acme"}). |
response_schema | object | No | Output structure as JSON Schema. Defaults to {"answer": string}. |
return_table | bool | No | Set true when the task asks for a list of items (e.g. "find 15 startups"). Pair with response_schema defining the per-item fields. Default false (single result row). |
effort_level, llm, iteration_budget, include_reasoning | — | No | Same as futuresearch_agent. |
This tool does not take artifact_id / data; it does support session_id / session_name.
futuresearch_multi_agent
Deep parallel research: deploy 3–6 direction agents per row exploring different angles, then synthesize. Use when completeness or depth matters more than per-row cost — e.g. enumerating "all AI startups in Europe", or answers that benefit from parallel investigation across distinct sources, geographies, or methodologies.
| Parameter | Type | Required | Description |
|---|---|---|---|
task | string | Yes | What to research per row. |
directions | list[string] (max 6) | No | Explicit research angles. Each should be a detailed, self-contained brief — not a short title. Auto-generated from task if omitted. |
response_schema | object | No | Output structure for the synthesized result. Defaults to {"answer": string}. |
effort_level | string | No | low (3 agents per row), medium (4, default), high (6). |
Monitoring and retrieval
futuresearch_progress
Poll a running task. Blocks briefly server-side to limit polling rate. After receiving partial results, briefly comment on the new rows for the user, then immediately call futuresearch_progress again, passing the cursor from the previous response, until the task is terminal.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | The task ID. |
cursor | string | No | Cursor from the previous response. Pass it to receive only new rows and summaries. Omit on the first call. |
Returns status text with completion counts, elapsed time, optional newly-completed rows, and agent summaries.
futuresearch_status
Render a live-updating progress widget. Use this in MCP clients that support widgets (Claude.ai, Claude Desktop). The widget polls automatically and displays results when complete. Do not also call futuresearch_progress.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | The task ID. |
futuresearch_results
Retrieve results from a completed task.
In HTTP mode (the hosted server):
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | The completed task. |
offset | int | No | Row offset for pagination (default 0). |
page_size | int (1–10000) | No | Rows to load into the response. For tasks with ≤10 rows, set to the total. For larger tasks, use the page_size value reported in the progress completion message. |
Returns a download URL, total row count, and the requested page of rows.
futuresearch_cancel
Cancel a running task.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | The task ID to cancel. |
Returns confirmation. If the task already completed, returns an error with its current state.
futuresearch_list_sessions
List sessions owned by the user, paginated.
| Parameter | Type | Required | Description |
|---|---|---|---|
offset | int | No | Sessions to skip (default 0). |
limit | int (1–1000) | No | Sessions per page (default 25). |
Returns names, IDs, timestamps, and dashboard URLs.
futuresearch_list_session_tasks
List all tasks within a session.
| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | The session ID (UUID). |
Returns task IDs, types, statuses, timestamps, and any output artifact_ids.
futuresearch_balance
Check the user's billing balance. No parameters.
Returns the current balance in dollars.
futuresearch_task_cost
Get the billed cost of a completed task. There's a delay between task completion and cost calculation; returns pending if not yet settled.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | The task ID. |
Troubleshooting
Auth flow not completing
If the OAuth sign-in window opens but authentication doesn't complete:
- Ensure pop-ups are not blocked in your browser
- Try closing and reopening the MCP connection
- For Claude Code HTTP mode, run
/mcpand re-authenticate from the MCP panel
Task stuck in progress
If futuresearch_progress keeps returning a running state for an extended period:
- Large datasets (1000+ rows) can take 10+ minutes — this is normal
- Use
futuresearch_cancelto stop the task and retry with a smaller dataset
Results appear empty
If futuresearch_results returns fewer rows than expected:
- Some rows may have failed processing — re-run the operation on the filtered subset
- Ensure the input CSV was well-formed (proper headers, no encoding issues)
Token budget exceeded
If you get a token budget error when submitting an operation,
- Upload the input data to the URL returned by
futuresearch_request_upload_url. This consumes less context than passing inline data to the operation tool.
If you get a token budget error when fetching results,
- Save the results to a local file using the URL returned by
futuresearch_results. - Call
futuresearch_resultswith smaller page size.
Privacy & Support
- Privacy Policy: futuresearch.ai/privacy
- Terms of Service: futuresearch.ai/terms
- Support: support@futuresearch.ai