FutureSearch Logofuturesearch
  • Blog
  • Solutions
  • Research
  • Docs
  • Evals
  • Company
  • Get Researchers
FutureSearch Logo

General inquiry? You can reach us at hello@futuresearch.ai.

Company

Team & CareersPressPrivacy PolicyTerms of Service

Developers

SDK DocsAPI ReferenceCase StudiesGitHub

Follow Us

X (Twitter)@dschwarz26LinkedIn
FutureSearchdocs
Your research team
Installation
  • All install methods
  • Claude.ai
  • Claude Cowork
  • Claude Code
  • Web App
  • Python SDK
  • Skill
  • MCP Server
Reference
  • API Key
  • classify
  • dedupe
  • forecast
  • merge
  • rank
  • agent_map
  • screen
  • Progress Monitoring
  • Chaining Operations
Guides
  • LLM-Powered Data Labeling
  • Add a Column via Web Research
  • Classify and Label Rows
  • Deduplicate Training Data
  • Filter a Dataset Intelligently
  • Join Tables Without Shared Keys
  • Rank Data by External Metrics
  • Resolve Duplicate Entities
  • Scale Deduplication to 20K Rows
Case Studies
  • Deduplicate Contact Lists
  • Deduplicate CRM Records
  • Enrich Contacts with Company Data
  • Fuzzy Match Across Tables
  • Link Records Across Medical Datasets
  • LLM Cost vs. Accuracy
  • Merge Costs and Speed
  • Merge Thousands of Records
  • Multi-Stage Lead Qualification
  • Research and Rank Web Data
  • Run 10,000 LLM Web Research Agents
  • Score Cold Leads via Web Research
  • Score Leads from Fragmented Data
  • Screen 10,000 Rows
  • Screen Job Listings
  • Screen Stocks by Economic Sensitivity
  • Screen Stocks by Investment Thesis
FutureSearchby futuresearch
by futuresearch

Chaining Operations

Operations can be chained together to build complete workflows. Each step refines your data further. You can chain operations from any surface -- Claude Code, Claude.ai, the everyrow web app, or the Python SDK.

Example scenario: A wizard rescuing magical creatures for a sanctuary.

Screen

Start with: Sighting reports from villages—some real, some tall tales.

Goal: Keep only confirmed magical creatures (not "my neighbour's cat acts weird").

class CreatureSighting(BaseModel):
    is_magical: bool = Field(description="True if genuinely magical")

screened = await screen(
    session=session,
    task="Keep only confirmed magical creatures, not mundane animals or tall tales",
    input=sightings,
    response_model=CreatureSighting,
)
LocationReportMillbrookGlowing deer in forestThornwallCat acts strange at nightLakemereSerpent spotted in lakeOldwickBird talked to farmer...46 more reportsSCREENLocationReportMillbrookGlowing deer in forestLakemereSerpent spotted in lake...18 confirmed magical

Chaining from Different Surfaces

You can chain operations from whichever surface fits your workflow. Claude handles the data flow between steps automatically.

In Claude Code

Claude Code has access to everyrow tools and can chain operations in a single conversation. Ask for a multi-step workflow and Claude will run each operation, passing the results forward.

Example prompt:

Screen my vendor list at ~/data/vendors.csv to keep only vendors with SOC2 and 50+ employees. Then rank the ones that pass by fit for our infrastructure needs. Finally, research the top 10 to find their pricing and contract terms.

Claude Code will run the screen, feed the passing rows into rank, then take the top results into a research step -- all within one conversation. Each operation saves results to a CSV that the next operation picks up.

Another example:

Upload this Google Sheet of leads: https://docs.google.com/spreadsheets/d/abc123/edit Dedupe them -- same company even with Inc/LLC differences or abbreviations. Then rank by likelihood to need our data integration product.

In Claude.ai

The everyrow MCP connector is available in Claude.ai. Ask Claude to chain operations in natural language and it will run them sequentially, using the output of each step as input to the next.

Example prompt:

I have a list of 200 SaaS companies. First, screen them to keep only ones with enterprise pricing tiers. Then rank the survivors by AI/ML adoption maturity. Use this data: [paste CSV or provide a Google Sheet link]

Claude will run the screen, show you the passing rows, then automatically rank them. You can review results at each step and adjust before continuing.

Multi-turn chaining also works naturally:

You: Screen this list of job postings to keep only remote-friendly senior roles. [Claude runs the screen, shows results]

You: Great, now research each of those to find salary ranges and tech stack requirements. [Claude runs the research on the screened results]

In the everyrow web app

In the web app at app.everyrow.com, chaining works through sessions. Each operation produces a result table that you can feed into the next operation.

  1. Run your first operation (e.g., screen a CSV).
  2. When it completes, the results appear as a new table in your session.
  3. Start a new operation in the same session, selecting the previous result as input.
  4. Repeat -- each step builds on the last.

You can also download the CSV results from one session and upload them as input to a new session if you want to work across sessions.


Common Workflows

Here are practical examples of chaining 2-3 operations for everyday analyst tasks. Each workflow is shown with a natural language prompt (for Claude Code or Claude.ai) and the equivalent Python SDK code.

Consolidate messy lead lists

Problem: You have leads from a trade show, a purchased list, and your CRM export. Same companies appear under different names.

Workflow: Concatenate -> Dedupe -> Rank

In Claude Code or Claude.ai:

I have three CSV files of leads: trade_show.csv, purchased_list.csv, and crm_export.csv. Combine them, then dedupe -- same company accounting for Inc/LLC variations, abbreviations, and parent/subsidiary relationships. Then rank the deduped list by likelihood to need our data integration product.

Python SDK:

# Combine sources
all_leads = pd.concat([trade_show, purchased_list, crm_export])

# Dedupe across sources
deduped = await dedupe(
    input=all_leads,
    equivalence_relation="Same company, accounting for Inc/LLC variations, abbreviations, and parent/subsidiary relationships",
)

# Prioritize for outreach
ranked = await rank(
    task="Score by likelihood to need our data integration product",
    input=deduped.data,
    field_name="fit_score",
)

Vet vendors before RFP

Problem: You have 200 potential vendors. Need to shortlist ones that meet basic requirements, then rank by fit.

Workflow: Screen -> Rank

In Claude Code or Claude.ai:

Screen this vendor list to keep only vendors with SOC2 certification, 50+ employees, and enterprise references. Then rank the qualified ones by alignment with our technical requirements and budget constraints.

Python SDK:

# Filter to qualified vendors
screened = await screen(
    task="Must have SOC2 certification, 50+ employees, and enterprise references",
    input=vendor_list,
    response_model=VendorQualification,
)

# Rank survivors by fit
ranked = await rank(
    task="Score by alignment with our technical requirements and budget constraints",
    input=screened.data,
    field_name="fit_score",
)

Match products to approved suppliers

Problem: Procurement has a list of software products in use. Need to check each against the approved vendor list -- but product names don't match company names (Photoshop vs Adobe).

Workflow: Research -> Merge

In Claude Code or Claude.ai:

I have two files: software_products.csv (list of tools we use) and approved_vendors.csv (our approved vendor list). First, research each software product to find its parent company. Then merge with the approved vendors list by parent company, and show me which products are from unapproved vendors.

Python SDK:

# First, enrich products with parent company info
enriched = await agent_map(
    task="Find the parent company that makes this software product",
    input=software_products,
)

# Now merge with approved vendors
matched = await merge(
    task="Match products to approved vendors by parent company",
    left_table=enriched.data,
    right_table=approved_vendors,
    merge_on_left="parent_company",
    merge_on_right="vendor_name",
)

# Flag unapproved software for review
unapproved = matched.data[matched.data["vendor_id"].isna()]

Enrich accounts before territory planning

Problem: CRM has company names but missing firmographic data. Need employee count and industry before assigning to sales territories.

Workflow: Research -> Rank

In Claude Code or Claude.ai:

Take my accounts list in accounts.csv and research each company to find their employee count, industry, and headquarters location. Then score them by revenue potential based on company size and industry fit for territory assignment.

Python SDK:

# Enrich with firmographics
enriched = await agent_map(
    task="Find employee count, industry, and headquarters location",
    input=accounts,
)

# Score for territory assignment
ranked = await rank(
    task="Score by revenue potential based on company size and industry fit",
    input=enriched.data,
    field_name="territory_priority",
)

Dedupe research from multiple sources

Problem: You scraped company data from LinkedIn, Crunchbase, and news articles. Same companies appear with different descriptions.

Workflow: Concatenate -> Dedupe

In Claude Code or Claude.ai:

I have company data from three sources: linkedin_data.csv, crunchbase_data.csv, and news_mentions.csv. Combine them and dedupe -- two rows are the same company if names match accounting for legal suffixes, or if they share the same website domain or headquarters address.

Python SDK:

# Combine all research
all_research = pd.concat([linkedin_data, crunchbase_data, news_mentions])

# Consolidate into canonical records
deduped = await dedupe(
    input=all_research,
    equivalence_relation="""
        Same company if names match accounting for legal suffixes,
        or if they share the same website domain or headquarters address
    """,
)
# Result includes best available data from all sources