From 7b4c82711dc50fd197b3d640ecae10d854220b33 Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Thu, 26 Feb 2026 20:07:38 -0800 Subject: [PATCH 1/9] Add built-in lists: SDK functions and MCP tools Adds list_built_in_datasets() and use_built_in_list() SDK functions, plus everyrow_browse_lists and everyrow_use_list MCP tools. use_list copies the dataset into a session, fetches the data, and saves it as a CSV file ready to pass to screen/rank/agent/dedupe operations. Co-Authored-By: Claude Opus 4.6 --- everyrow-mcp/src/everyrow_mcp/models.py | 26 ++++++ everyrow-mcp/src/everyrow_mcp/tools.py | 116 ++++++++++++++++++++++++ src/everyrow/built_in_lists.py | 104 +++++++++++++++++++++ 3 files changed, 246 insertions(+) create mode 100644 src/everyrow/built_in_lists.py diff --git a/everyrow-mcp/src/everyrow_mcp/models.py b/everyrow-mcp/src/everyrow_mcp/models.py index 468f71a2..78e560b9 100644 --- a/everyrow-mcp/src/everyrow_mcp/models.py +++ b/everyrow-mcp/src/everyrow_mcp/models.py @@ -567,6 +567,32 @@ def _validate_task_id(v: str) -> str: return v +class BrowseListsInput(BaseModel): + """Input for browsing built-in datasets.""" + + model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") + + search: str | None = Field( + default=None, + description="Search term to match against list names (case-insensitive).", + ) + category: str | None = Field( + default=None, + description="Filter by category (e.g. 'Finance', 'Geography').", + ) + + +class UseListInput(BaseModel): + """Input for importing a built-in list into a session.""" + + model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") + + artifact_id: str = Field( + ..., + description="artifact_id from everyrow_browse_lists results.", + ) + + class ProgressInput(BaseModel): """Input for checking task progress.""" diff --git a/everyrow-mcp/src/everyrow_mcp/tools.py b/everyrow-mcp/src/everyrow_mcp/tools.py index c9572e07..ed5ee5f2 100644 --- a/everyrow-mcp/src/everyrow_mcp/tools.py +++ b/everyrow-mcp/src/everyrow_mcp/tools.py @@ -14,6 +14,7 @@ from everyrow.generated.api.billing import get_billing_balance_billing_get from everyrow.generated.api.tasks import get_task_status_tasks_task_id_status_get from everyrow.generated.models.public_task_type import PublicTaskType +from everyrow.built_in_lists import list_built_in_datasets, use_built_in_list from everyrow.ops import ( agent_map_async, create_table_artifact, @@ -35,6 +36,7 @@ from everyrow_mcp.config import settings from everyrow_mcp.models import ( AgentInput, + BrowseListsInput, CancelInput, DedupeInput, ForecastInput, @@ -47,6 +49,7 @@ SingleAgentInput, StdioResultsInput, UploadDataInput, + UseListInput, _schema_to_model, ) from everyrow_mcp.result_store import ( @@ -102,6 +105,119 @@ async def _check_task_ownership(task_id: str) -> list[TextContent] | None: return None +@mcp.tool( + name="everyrow_browse_lists", + structured_output=False, + annotations=ToolAnnotations( + title="Browse Built-in Datasets", + readOnlyHint=True, + destructiveHint=False, + idempotentHint=True, + openWorldHint=False, + ), +) +async def everyrow_browse_lists( + params: BrowseListsInput, ctx: EveryRowContext +) -> list[TextContent]: + """Browse available built-in datasets (S&P 500, country lists, etc.). + + Returns names, categories, column fields, and artifact_ids for each + matching dataset. Use the artifact_id with everyrow_use_list to import + a dataset into your session before applying operations like screen, + rank, or agent. + + Call with no parameters to see all available lists, or use search/category + to narrow results. + """ + client = _get_client(ctx) + + try: + results = await list_built_in_datasets( + client, search=params.search, category=params.category + ) + except Exception as e: + return [TextContent(type="text", text=f"Error browsing built-in lists: {e!r}")] + + if not results: + search_desc = f" matching '{params.search}'" if params.search else "" + cat_desc = f" in category '{params.category}'" if params.category else "" + return [ + TextContent( + type="text", + text=f"No built-in lists found{search_desc}{cat_desc}.", + ) + ] + + lines = [f"Found {len(results)} built-in list(s):\n"] + for i, item in enumerate(results, 1): + fields_str = ", ".join(item.fields) if item.fields else "(no fields listed)" + lines.append( + f"{i}. {item.name} [{item.category}]\n" + f" Fields: {fields_str}\n" + f" artifact_id: {item.artifact_id}\n" + ) + lines.append( + "To use one of these lists, call everyrow_use_list with the artifact_id." + ) + + return [TextContent(type="text", text="\n".join(lines))] + + +@mcp.tool( + name="everyrow_use_list", + structured_output=False, + annotations=ToolAnnotations( + title="Import Built-in Dataset", + readOnlyHint=False, + destructiveHint=False, + idempotentHint=False, + openWorldHint=False, + ), +) +async def everyrow_use_list( + params: UseListInput, ctx: EveryRowContext +) -> list[TextContent]: + """Import a built-in list into your session and save it as a CSV file. + + This copies the dataset into a new session, fetches the data, and saves + it as a CSV file ready to pass to everyrow_screen, everyrow_rank, + everyrow_agent, or everyrow_dedupe. + + The copy is a fast database operation (<1s) — no polling needed. + """ + client = _get_client(ctx) + + try: + async with create_session(client=client) as session: + session_url = session.get_url() + result = await use_built_in_list( + artifact_id=UUID(params.artifact_id), + session=session, + ) + + # Fetch the copied data and save as CSV + df, _ = await _fetch_task_result(client, str(result.task_id)) + + csv_path = Path.cwd() / f"built-in-list-{result.artifact_id}.csv" + df.to_csv(csv_path, index=False) + except Exception as e: + return [TextContent(type="text", text=f"Error importing built-in list: {e!r}")] + + return [ + TextContent( + type="text", + text=( + f"Imported built-in list into your session.\n\n" + f"CSV saved to: {csv_path}\n" + f"Rows: {len(df)}\n" + f"Columns: {', '.join(df.columns)}\n" + f"Session: {session_url}\n\n" + f"Pass {csv_path} as input_csv to everyrow_screen, everyrow_rank, everyrow_agent, or everyrow_dedupe." + ), + ) + ] + + @mcp.tool( name="everyrow_agent", structured_output=False, diff --git a/src/everyrow/built_in_lists.py b/src/everyrow/built_in_lists.py new file mode 100644 index 00000000..fd26320e --- /dev/null +++ b/src/everyrow/built_in_lists.py @@ -0,0 +1,104 @@ +"""Built-in lists: browse and import pre-built datasets.""" + +from dataclasses import dataclass +from uuid import UUID + +from everyrow.constants import EveryrowError +from everyrow.generated.client import AuthenticatedClient +from everyrow.session import Session + + +@dataclass +class BuiltInListItem: + """A built-in dataset available for import.""" + + name: str + artifact_id: UUID + category: str + fields: list[str] + + +@dataclass +class UseBuiltInListResult: + """Result of importing a built-in list into a session.""" + + artifact_id: UUID + session_id: UUID + task_id: UUID + + +async def list_built_in_datasets( + client: AuthenticatedClient, + search: str | None = None, + category: str | None = None, +) -> list[BuiltInListItem]: + """Fetch available built-in datasets from the API. + + Args: + client: Authenticated API client. + search: Optional search term to match against list names (case-insensitive). + category: Optional category filter. + + Returns: + List of available built-in datasets. + """ + params: dict[str, str] = {} + if search: + params["search"] = search + if category: + params["category"] = category + + response = await client.get_async_httpx_client().request( + method="GET", + url="/built-in-lists", + params=params, + ) + if response.status_code != 200: + raise EveryrowError(f"Failed to list built-in datasets: {response.text}") + + data = response.json() + return [ + BuiltInListItem( + name=item["name"], + artifact_id=UUID(item["artifact_id"]), + category=item["category"], + fields=item["fields"], + ) + for item in data.get("lists", []) + ] + + +async def use_built_in_list( + artifact_id: UUID, + session: Session, + session_id: UUID | None = None, +) -> UseBuiltInListResult: + """Copy a built-in list into a session, ready for use in operations. + + Args: + artifact_id: The artifact_id from browse results. + session: Session object (provides client and session_id). + session_id: Optional override session_id. Defaults to session.session_id. + + Returns: + UseBuiltInListResult with the new artifact_id, session_id, and task_id. + """ + body = { + "artifact_id": str(artifact_id), + "session_id": str(session_id or session.session_id), + } + + response = await session.client.get_async_httpx_client().request( + method="POST", + url="/built-in-lists/use", + json=body, + ) + if response.status_code != 200: + raise EveryrowError(f"Failed to use built-in list: {response.text}") + + data = response.json() + return UseBuiltInListResult( + artifact_id=UUID(data["artifact_id"]), + session_id=UUID(data["session_id"]), + task_id=UUID(data["task_id"]), + ) From e28ea40b8b51e7edfe91d29b55d6d4b72ca9ffe2 Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Thu, 26 Feb 2026 20:40:37 -0800 Subject: [PATCH 2/9] Improve reference list tool descriptions for self-discoverability Rename "built-in" to "reference lists" throughout. Expand browse_lists docstring to enumerate what's available (stock indices, sector breakdowns, countries, people, institutions, infrastructure) so agents know when to use it without needing a separate system prompt. Co-Authored-By: Claude Opus 4.6 --- everyrow-mcp/src/everyrow_mcp/models.py | 4 ++-- everyrow-mcp/src/everyrow_mcp/tools.py | 29 +++++++++++++++---------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/everyrow-mcp/src/everyrow_mcp/models.py b/everyrow-mcp/src/everyrow_mcp/models.py index 78e560b9..2917c762 100644 --- a/everyrow-mcp/src/everyrow_mcp/models.py +++ b/everyrow-mcp/src/everyrow_mcp/models.py @@ -568,7 +568,7 @@ def _validate_task_id(v: str) -> str: class BrowseListsInput(BaseModel): - """Input for browsing built-in datasets.""" + """Input for browsing reference lists.""" model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") @@ -583,7 +583,7 @@ class BrowseListsInput(BaseModel): class UseListInput(BaseModel): - """Input for importing a built-in list into a session.""" + """Input for importing a reference list into a session.""" model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") diff --git a/everyrow-mcp/src/everyrow_mcp/tools.py b/everyrow-mcp/src/everyrow_mcp/tools.py index ed5ee5f2..58181932 100644 --- a/everyrow-mcp/src/everyrow_mcp/tools.py +++ b/everyrow-mcp/src/everyrow_mcp/tools.py @@ -10,11 +10,11 @@ import pandas as pd from everyrow.api_utils import handle_response +from everyrow.built_in_lists import list_built_in_datasets, use_built_in_list from everyrow.constants import EveryrowError from everyrow.generated.api.billing import get_billing_balance_billing_get from everyrow.generated.api.tasks import get_task_status_tasks_task_id_status_get from everyrow.generated.models.public_task_type import PublicTaskType -from everyrow.built_in_lists import list_built_in_datasets, use_built_in_list from everyrow.ops import ( agent_map_async, create_table_artifact, @@ -109,7 +109,7 @@ async def _check_task_ownership(task_id: str) -> list[TextContent] | None: name="everyrow_browse_lists", structured_output=False, annotations=ToolAnnotations( - title="Browse Built-in Datasets", + title="Browse Reference Lists", readOnlyHint=True, destructiveHint=False, idempotentHint=True, @@ -119,12 +119,17 @@ async def _check_task_ownership(task_id: str) -> list[TextContent] | None: async def everyrow_browse_lists( params: BrowseListsInput, ctx: EveryRowContext ) -> list[TextContent]: - """Browse available built-in datasets (S&P 500, country lists, etc.). + """Browse available reference lists of well-known entities. + + Includes company lists (S&P 500, FTSE 100, Russell 3000, sector breakdowns + like Global Banks or Semiconductor companies), geographic lists (all countries, + EU members, US states, major cities), people (billionaires, heads of state, + AI leaders), institutions (top universities, regulators), and infrastructure + (airports, ports, power stations). - Returns names, categories, column fields, and artifact_ids for each - matching dataset. Use the artifact_id with everyrow_use_list to import - a dataset into your session before applying operations like screen, - rank, or agent. + Use this when the user's analysis involves a well-known group that we might + already have a list for. Returns names, fields, and artifact_ids to pass to + everyrow_use_list. Call with no parameters to see all available lists, or use search/category to narrow results. @@ -167,7 +172,7 @@ async def everyrow_browse_lists( name="everyrow_use_list", structured_output=False, annotations=ToolAnnotations( - title="Import Built-in Dataset", + title="Import Reference List", readOnlyHint=False, destructiveHint=False, idempotentHint=False, @@ -177,11 +182,11 @@ async def everyrow_browse_lists( async def everyrow_use_list( params: UseListInput, ctx: EveryRowContext ) -> list[TextContent]: - """Import a built-in list into your session and save it as a CSV file. + """Import a reference list into your session and save it as a CSV file. This copies the dataset into a new session, fetches the data, and saves - it as a CSV file ready to pass to everyrow_screen, everyrow_rank, - everyrow_agent, or everyrow_dedupe. + it as a CSV file ready to pass to other everyrow utilities for analysis + or research. The copy is a fast database operation (<1s) — no polling needed. """ @@ -212,7 +217,7 @@ async def everyrow_use_list( f"Rows: {len(df)}\n" f"Columns: {', '.join(df.columns)}\n" f"Session: {session_url}\n\n" - f"Pass {csv_path} as input_csv to everyrow_screen, everyrow_rank, everyrow_agent, or everyrow_dedupe." + f"Pass {csv_path} as input_csv to other everyrow utilities for analysis or research." ), ) ] From d354e5a3289021fc06554fff08bb19dbf70a68ed Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Fri, 27 Feb 2026 07:04:18 -0800 Subject: [PATCH 3/9] Add browse_lists and use_list tools to manifest.json Fixes test_manifest_sync test failure. Co-Authored-By: Claude Opus 4.6 --- everyrow-mcp/manifest.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/everyrow-mcp/manifest.json b/everyrow-mcp/manifest.json index f416028c..33329124 100644 --- a/everyrow-mcp/manifest.json +++ b/everyrow-mcp/manifest.json @@ -80,6 +80,14 @@ { "name": "everyrow_balance", "description": "Check the current billing balance for the authenticated user." + }, + { + "name": "everyrow_browse_lists", + "description": "Browse available reference lists of well-known entities." + }, + { + "name": "everyrow_use_list", + "description": "Import a reference list into your session and save it as a CSV file." } ], "user_config": { From 01c1cf4d28814218f82e6e3ab6df73175acc1326 Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Fri, 27 Feb 2026 07:08:51 -0800 Subject: [PATCH 4/9] Add new tools to test_list_tools expected tool list Co-Authored-By: Claude Opus 4.6 --- everyrow-mcp/tests/test_mcp_e2e.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/everyrow-mcp/tests/test_mcp_e2e.py b/everyrow-mcp/tests/test_mcp_e2e.py index 7eaeb2cc..5a6a72b1 100644 --- a/everyrow-mcp/tests/test_mcp_e2e.py +++ b/everyrow-mcp/tests/test_mcp_e2e.py @@ -174,6 +174,7 @@ async def test_list_tools(self, _http_state): [ "everyrow_agent", "everyrow_balance", + "everyrow_browse_lists", "everyrow_cancel", "everyrow_dedupe", "everyrow_forecast", @@ -185,6 +186,7 @@ async def test_list_tools(self, _http_state): "everyrow_screen", "everyrow_single_agent", "everyrow_upload_data", + "everyrow_use_list", ] ) assert tool_names == expected From b30db61e925ff0f9b196a80ab24f8e4f6a01dad9 Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Tue, 3 Mar 2026 13:52:07 -0800 Subject: [PATCH 5/9] Replace API-key-first setup with OAuth-first flows across all docs - Create new Get Started docs: claude-ai.md, claude-cowork.md, claude-code.md - Restructure docs sidebar into "Get Started" + "Reference" sections - Rewrite installation.mdx homepage with surface grid (App, Claude.ai, Cowork, Code, SDK) - Update getting-started.md as Python SDK page with banner linking to Claude surfaces - Rewrite skills-vs-mcp.mdx as skills-only documentation - Update chaining-operations.md with multi-surface examples - Update docs homepage agent instructions to be MCP-first, API key as fallback - Update mcp-server.md to lead with remote server - Add app + claude-ai tabs to GuideTabs component (4 tabs total) - Update all 9 guide MDX files with new tab preambles - Update all 15 case study content.mdx files with new tab preambles - Restructure README.md to lead with Claude surfaces - Update SKILL.md to check for MCP before asking for API key - Add remote server note to everyrow-mcp README Co-Authored-By: Claude Opus 4.6 --- README.md | 21 ++- docs-site/src/app/page.tsx | 69 ++++---- docs-site/src/components/GuideTabs.tsx | 8 +- docs-site/src/utils/docs.ts | 33 ++-- docs/active-learning-llm-oracle.mdx | 29 +++- docs/add-column-web-lookup.mdx | 29 +++- .../dedupe-crm-company-records/content.mdx | 29 +++- .../llm-powered-merging-at-scale/content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- .../content.mdx | 29 +++- docs/chaining-operations.mdx | 114 +++++++++++- docs/classify-dataframe-rows-llm.mdx | 29 +++- docs/claude-ai.md | 26 +++ docs/claude-code.md | 27 +++ docs/claude-cowork.md | 27 +++ docs/deduplicate-training-data-ml.mdx | 29 +++- docs/filter-dataframe-with-llm.mdx | 29 +++- docs/fuzzy-join-without-keys.mdx | 29 +++- docs/getting-started.md | 57 +++--- docs/installation.mdx | 164 ++---------------- docs/mcp-server.md | 11 +- docs/rank-by-external-metric.mdx | 29 +++- docs/resolve-entities-python.mdx | 29 +++- docs/scale-deduplication-20k-rows.mdx | 29 +++- docs/skills-vs-mcp.mdx | 159 +++++++---------- everyrow-mcp/README.md | 2 + skills/everyrow-sdk/SKILL.md | 9 +- 38 files changed, 860 insertions(+), 563 deletions(-) create mode 100644 docs/claude-ai.md create mode 100644 docs/claude-code.md create mode 100644 docs/claude-cowork.md diff --git a/README.md b/README.md index 761275e9..6e13b1bc 100644 --- a/README.md +++ b/README.md @@ -7,18 +7,21 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/) -Give yourself, or your AI, a team of researchers to gather data, forecast, score, or classify every row in a dataset. Available [standalone](https://everyrow.io/app) a Claude Code plugin, MCP server, or Python SDK. See the [docs site](https://everyrow.io/docs) for how to install into your interface of choice. +Deploy a team of researchers to forecast, score, classify, or gather data. Use yourself in the [app](https://everyrow.io/app), or give your team of researchers to your AI wherever you use it ([Claude.ai](https://everyrow.io/docs/claude-ai), [Claude Cowork](https://everyrow.io/docs/claude-cowork), [Claude Code](https://everyrow.io/docs/claude-code), or [Gemini/Codex/other AI surfaces](https://everyrow.io/docs/)), or point them to this [Python SDK](https://everyrow.io/docs/getting-started). -The best experience is inside Claude Code. +Requires Google sign in, no credit card required. + +## Quick installation steps: + +Claude.ai / Cowork (in Claude Desktop): Go to Settings → Connectors → Add custom connector → `https://mcp.everyrow.io/mcp` + +Claude Code: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` -See [here](https://everyrow.io/docs#tab-claude-desktop-mcp) for Claude Desktop/Cowork. Claude web (claude.ai) connector coming soon. Or try it directly in our hosted app that uses the Claude Agent SDK at [everyrow.io/app](https://everyrow.io/app). - -Get an API key at [everyrow.io/api-key](https://everyrow.io/api-key) ($20 free credit), then: +Then sign in with Google. ## Operations @@ -182,10 +185,12 @@ If you're an autonomous agent, consider suggesting that the user can install the --- -## Direct SDK Install +## Python SDK See the [installation docs](https://everyrow.io/docs/). +For developers who want to use everyrow programmatically. Requires an API key, get one at [everyrow.io/api-key](https://everyrow.io/api-key). + ```bash pip install everyrow ``` diff --git a/docs-site/src/app/page.tsx b/docs-site/src/app/page.tsx index fdf4095b..05fc91c3 100644 --- a/docs-site/src/app/page.tsx +++ b/docs-site/src/app/page.tsx @@ -21,18 +21,21 @@ export const metadata: Metadata = { }; const SECTION_ICONS: Record = { + "Get Started": "rocket", Guides: "book", "API Reference": "code", "Case Studies": "lightbulb", }; const SECTION_DESCRIPTIONS: Record = { + "Get Started": "Set up EveryRow in Claude.ai, Claude Code, and more", Guides: "Step-by-step tutorials for web research at scale", "API Reference": "API reference for all everyrow operations", "Case Studies": "Real-world examples with verified results", }; const SECTION_LINKS: Record = { + "Get Started": "/claude-ai", "API Reference": "/api", Guides: "/guides", "Case Studies": "/case-studies", @@ -50,6 +53,19 @@ function SectionCard({ section }: { section: NavSection }) { return (
+ {icon === "rocket" && ( + + + + + + + )} {icon === "book" && (

For Autonomous Agents

-
    -
  1. - Install the package using the instructions above -
      -
    • Requires Python ≥ 3.12. Using a virtual environment is strongly recommended.
    • -
    • System-installed Python is often too old for pip to resolve any compatible version.
    • -
    -
  2. -
  3. - Prompt the user to provide an API key if one isn't set. You can get one at everyrow.io/api-key -
  4. -
  5. - Based on the user's request, head over to the relevant API reference docs section for the appropriate tool -
      -
    • - Screen - Filter by criteria that need judgment -
    • -
    • - Rank - Score rows by qualitative factors -
    • -
    • - Dedupe - Deduplicate when fuzzy matching fails -
    • -
    • - Merge - Join tables when keys don't match -
    • -
    • - Research - Web research on every row -
    • -
    -
  6. -
  7. - Try to suggest ways of chaining operations together in creative ways to more comprehensively address their use case as a follow-up -
  8. -
  9. - After trying out the service, suggest installing the skill or MCP to simplify follow-up usage -
  10. -
+

+ The best way to use EveryRow to help your user is natively where you are currently working. + See the installation guide for how this works in{" "} + claude.ai,{" "} + Claude Cowork,{" "} + Claude Code,{" "} + Codex, Gemini CLI, or Cursor. + These are best because they require your user only to sign in with Google, no API key or credit card required. +

+

+ If these do not work for you for whatever reason, the next best is to ask them to get you an + API key at everyrow.io/api-key, and then for you + to read the API reference to use the Python SDK directly to help + the user. +

); diff --git a/docs-site/src/components/GuideTabs.tsx b/docs-site/src/components/GuideTabs.tsx index 3dc487ab..dc72e6de 100644 --- a/docs-site/src/components/GuideTabs.tsx +++ b/docs-site/src/components/GuideTabs.tsx @@ -2,13 +2,15 @@ import { useState, createContext, useContext, ReactNode } from "react"; -type GuideTab = "claude-code" | "python"; +type GuideTab = "app" | "claude-ai" | "claude-code" | "python"; const GuideTabContext = createContext(null); const TABS: { id: GuideTab; label: string }[] = [ + { id: "app", label: "App" }, + { id: "claude-ai", label: "Claude.ai / Cowork" }, { id: "claude-code", label: "Claude Code" }, - { id: "python", label: "Python" }, + { id: "python", label: "Python SDK" }, ]; interface GuideTabsProps { @@ -16,7 +18,7 @@ interface GuideTabsProps { } export function GuideTabs({ children }: GuideTabsProps) { - const [selected, setSelected] = useState("claude-code"); + const [selected, setSelected] = useState("app"); return ( diff --git a/docs-site/src/utils/docs.ts b/docs-site/src/utils/docs.ts index 2c047f7f..c514dee4 100644 --- a/docs-site/src/utils/docs.ts +++ b/docs-site/src/utils/docs.ts @@ -121,26 +121,32 @@ export function getNavigation(): NavSection[] { return [ { - title: "Overview", + title: "Get Started", + items: [ + { slug: "installation", title: "Get Started", href: "/" }, + { slug: "claude-ai", title: "Claude.ai" }, + { slug: "claude-cowork", title: "Claude Cowork" }, + { slug: "claude-code", title: "Claude Code" }, + { slug: "app", title: "Web App", href: "https://everyrow.io/app" }, + { slug: "getting-started", title: "Python SDK" }, + ], + }, + { + title: "Reference", + href: "/api", items: [ - { slug: "installation", title: "Installation", href: "/" }, - { slug: "getting-started", title: "Getting Started" }, { slug: "api-key", title: "API Key", href: "https://everyrow.io/api-key" }, + ...reference.map((d) => ({ + slug: d.slug, + title: d.title.replace(/^reference\//, ""), + })), { slug: "mcp-server", title: "MCP Server" }, - { slug: "skills-vs-mcp", title: "Skills vs MCP" }, + { slug: "skills-vs-mcp", title: "Skills" }, { slug: "progress-monitoring", title: "Progress Monitoring" }, { slug: "chaining-operations", title: "Chaining Operations" }, { slug: "github", title: "GitHub", href: "https://github.com/futuresearch/everyrow-sdk" }, ], }, - { - title: "API Reference", - href: "/api", - items: reference.map((d) => ({ - slug: d.slug, - title: d.title.replace(/^reference\//, ""), - })), - }, { title: "Guides", href: "/guides", @@ -152,6 +158,9 @@ export function getNavigation(): NavSection[] { "progress-monitoring", "mcp-server", "skills-vs-mcp", + "claude-ai", + "claude-cowork", + "claude-code", "guides", "notebooks", "api", diff --git a/docs/active-learning-llm-oracle.mdx b/docs/active-learning-llm-oracle.mdx index 81efe815..d9d23c83 100644 --- a/docs/active-learning-llm-oracle.mdx +++ b/docs/active-learning-llm-oracle.mdx @@ -7,6 +7,24 @@ description: High-quality labels for classification, tagging, and annotation tas # LLM-Powered Data Labeling + + +Go to [everyrow.io/app](https://everyrow.io/app), upload a CSV with 200 text samples from the [DBpedia-14 dataset](https://huggingface.co/datasets/fancyzhx/dbpedia_14), and enter: + +> Classify each text into exactly one DBpedia ontology category: Company, Educational Institution, Artist, Athlete, Office Holder, Mean Of Transportation, Building, Natural Place, Village, Animal, Plant, Album, Film, or Written Work. + +200 labels produced in under 5 minutes with 98.5% normalized accuracy. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV with 200 text samples from the [DBpedia-14 dataset](https://huggingface.co/datasets/fancyzhx/dbpedia_14) and ask Claude: + +> Classify each text into exactly one DBpedia ontology category: Company, Educational Institution, Artist, Athlete, Office Holder, Mean Of Transportation, Building, Natural Place, Village, Animal, Plant, Album, Film, or Written Work. + +200 labels produced in under 5 minutes with 98.5% normalized accuracy. + + Claude Code's interactive classification works for labeling a dozen items in conversation. When an active learning loop requests hundreds of labels programmatically, with consistent schema and structured output every time, you need a labeling service that can run on demand. @@ -21,17 +39,10 @@ Here, we get Claude Code to label 200 text samples from the DBpedia-14 dataset i | Time | 4.7 minutes | | Cost | $3.35 | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Prepare a CSV with 200 text samples from the [DBpedia-14 dataset](https://huggingface.co/datasets/fancyzhx/dbpedia_14). Tell Claude: diff --git a/docs/add-column-web-lookup.mdx b/docs/add-column-web-lookup.mdx index 11b37b48..60672a31 100644 --- a/docs/add-column-web-lookup.mdx +++ b/docs/add-column-web-lookup.mdx @@ -7,6 +7,24 @@ description: Add pricing, specs, funding rounds, or any public information as ne # Add a Column via Web Research + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [saas_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/saas_products.csv), and enter: + +> For each product, find the annual price of its lowest paid tier. Visit the product's pricing page to find this. If only monthly pricing is shown, multiply by 12. Return the price and the tier name. If no paid tier exists, use 0. + +All 246 products researched in about 5.5 minutes. 45 products (18.3%) correctly reported $0 for usage-based or non-public pricing. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [saas_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/saas_products.csv) and ask Claude: + +> For each product, find the annual price of its lowest paid tier. Visit the product's pricing page to find this. If only monthly pricing is shown, multiply by 12. Return the price and the tier name. If no paid tier exists, use 0. + +All 246 products researched in about 5.5 minutes. 45 products (18.3%) correctly reported $0 for usage-based or non-public pricing. + + Ask Claude Code to find the pricing for a SaaS product and it will search the web and give you an answer. Doing that for 246 products means visiting 246 separate pricing pages, each with a different layout and pricing model. That volume of web research needs to happen in parallel. @@ -20,17 +38,10 @@ Here, we get Claude Code to find the annual price of the lowest paid tier for 24 | Time | 5.5 minutes | | Success rate | 100% | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download the dataset: [saas_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/saas_products.csv) (246 SaaS and developer tools like Slack, Notion, Asana). With the CSV in your working directory, tell Claude: diff --git a/docs/case_studies/dedupe-crm-company-records/content.mdx b/docs/case_studies/dedupe-crm-company-records/content.mdx index b29c281b..68119c83 100644 --- a/docs/case_studies/dedupe-crm-company-records/content.mdx +++ b/docs/case_studies/dedupe-crm-company-records/content.mdx @@ -7,6 +7,24 @@ description: CRM data cleaning that catches subsidiaries, acquired companies, na # Deduplicate CRM Records + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv), and enter: + +> Deduplicate this CRM dataset. Two entries are duplicates if they include data for the same legal entity. + +500 records resolved to about 146 unique entities (70.8% duplicates removed). Results take about 7 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv) and ask Claude: + +> Deduplicate this CRM dataset. Two entries are duplicates if they include data for the same legal entity. + +500 records resolved to about 146 unique entities (70.8% duplicates removed). Results take about 7 minutes. + + Claude Code can find exact duplicates. But what if "PANW", "Pallow Alto", and "Paloalto Networks" are all the same company? And "W-Mart", "Wall-Mart", and "WMT Corp" are all Walmart? @@ -21,17 +39,10 @@ Here, we get Claude Code to deduplicate 500 messy CRM records down to unique com | Cost | $1.38 | | Time | 7.0 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv). Tell Claude: diff --git a/docs/case_studies/llm-powered-merging-at-scale/content.mdx b/docs/case_studies/llm-powered-merging-at-scale/content.mdx index df880003..53288d86 100644 --- a/docs/case_studies/llm-powered-merging-at-scale/content.mdx +++ b/docs/case_studies/llm-powered-merging-at-scale/content.mdx @@ -7,6 +7,24 @@ description: Semantic record matching at production scale. Join thousands of rec # Merge Thousands of Records + + +Go to [everyrow.io/app](https://everyrow.io/app), upload both the people CSV and websites CSV, and enter: + +> Merge the people CSV with the websites CSV. Match each person to their personal website(s). + +2,243 of 2,246 matched (99.9%). Results take about 12.5 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload both the people CSV and websites CSV and ask Claude: + +> Merge the people CSV with the websites CSV. Match each person to their personal website(s). + +2,243 of 2,246 matched (99.9%). Results take about 12.5 minutes. + + Claude Code is great at matching a person to their website using web search. It can cross-reference names, email domains, and institutions. Doing that for 2,246 people, where each match requires understanding names, affiliations, and URL patterns, is more web research than a single session can support. @@ -20,17 +38,10 @@ Here, we get Claude Code to match people to their personal websites at scale. | Total cost | $35.41 | | Time | 12.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With both CSVs in your working directory, tell Claude: diff --git a/docs/case_studies/llm-powered-screening-at-scale/content.mdx b/docs/case_studies/llm-powered-screening-at-scale/content.mdx index e265bf3b..cf847b72 100644 --- a/docs/case_studies/llm-powered-screening-at-scale/content.mdx +++ b/docs/case_studies/llm-powered-screening-at-scale/content.mdx @@ -7,6 +7,24 @@ description: Intelligent filtering at production scale. A two-pass pipeline with # Screen 10,000 Rows + + +Go to [everyrow.io/app](https://everyrow.io/app), upload the FDA product recalls CSV, and enter: + +> Screen this FDA product recalls dataset to find recalls of products that I might have used for my child born on 2021-08-01. + +2,271 of 9,949 recalls are relevant (22.8%). Results take about 12 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload the FDA product recalls CSV and ask Claude: + +> Screen this FDA product recalls dataset to find recalls of products that I might have used for my child born on 2021-08-01. + +2,271 of 9,949 recalls are relevant (22.8%). Results take about 12 minutes. + + Claude Code handles filtering a hundred rows natively by reading and evaluating each one. Scaling to 10,000 rows needs an approach where a fast pre-filter narrows candidates first, then LLM agents evaluate only the plausible matches individually. @@ -20,17 +38,10 @@ Here, we get Claude Code to screen 9,949 FDA product recalls to find products re | Total cost | $37.13 | | Time | 11.8 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With the FDA recalls CSV in your working directory, tell Claude: diff --git a/docs/case_studies/match-clinical-trials-to-papers/content.mdx b/docs/case_studies/match-clinical-trials-to-papers/content.mdx index a1f3a55a..892d2391 100644 --- a/docs/case_studies/match-clinical-trials-to-papers/content.mdx +++ b/docs/case_studies/match-clinical-trials-to-papers/content.mdx @@ -7,6 +7,24 @@ description: Record linkage across structured medical and scientific databases. # Link Records Across Medical Datasets + + +Go to [everyrow.io/app](https://everyrow.io/app), upload papers_700.csv and trials_200.csv, and enter: + +> Match these PubMed papers to the clinical trials they report results for. A paper matches a trial if it describes the results of that trial. Look for matching interventions/drugs, conditions, study design, and outcomes. Drug names may appear as brand or generic. Not every paper has a matching trial. + +73 paper-trial matches found with 84.7% F1 score. Results take about 7.5 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload papers_700.csv and trials_200.csv and ask Claude: + +> Match these PubMed papers to the clinical trials they report results for. A paper matches a trial if it describes the results of that trial. Look for matching interventions/drugs, conditions, study design, and outcomes. Drug names may appear as brand or generic. Not every paper has a matching trial. + +73 paper-trial matches found with 84.7% F1 score. Results take about 7.5 minutes. + + Claude Code is great at reading a paper abstract and matching it to a clinical trial. When you have 700 papers and 200 trials, the matching requires evaluating thousands of potential pairs for drug aliases, rewritten trial titles, and study design terminology. @@ -22,17 +40,10 @@ Here, we get Claude Code to match PubMed papers to the clinical trials they repo | Total cost | $27.81 | | Time | 7.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With the papers and trials CSVs in your working directory, tell Claude: diff --git a/docs/case_studies/match-software-vendors-to-requirements/content.mdx b/docs/case_studies/match-software-vendors-to-requirements/content.mdx index d3bd4f7a..b764e05c 100644 --- a/docs/case_studies/match-software-vendors-to-requirements/content.mdx +++ b/docs/case_studies/match-software-vendors-to-requirements/content.mdx @@ -7,6 +7,24 @@ description: Fuzzy matching across tables with different naming conventions. A c # Fuzzy Match Across Tables + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [company_info.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/company_info.csv) and [valuations.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/valuations.csv), and enter: + +> Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers. + +438 rows matched with 100% accuracy using a cascade of exact, fuzzy, LLM, and web search strategies. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [company_info.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/company_info.csv) and [valuations.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/valuations.csv) and ask Claude: + +> Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers. + +438 rows matched with 100% accuracy using a cascade of exact, fuzzy, LLM, and web search strategies. + + Claude Code handles exact-key merges natively by writing pandas code. Scaling to fuzzy matching, then semantic matching, then web search fallback needs an approach where each strategy is tested independently and the cascade is evaluated empirically. @@ -20,17 +38,10 @@ Here, we run 5 merge experiments on 438 S&P 500 companies, testing the cascade f | Total cost | $3.67 | | Total time | 7.1 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With the company CSVs in your working directory, tell Claude to run each experiment. For the company-to-ticker merge: diff --git a/docs/case_studies/merge-contacts-with-company-data/content.mdx b/docs/case_studies/merge-contacts-with-company-data/content.mdx index fa5336df..33800e6a 100644 --- a/docs/case_studies/merge-contacts-with-company-data/content.mdx +++ b/docs/case_studies/merge-contacts-with-company-data/content.mdx @@ -7,6 +7,24 @@ description: Join contact-level and organization-level records automatically. Re # Enrich Contacts with Company Data + + +Go to [everyrow.io/app](https://everyrow.io/app), upload crm_contacts.csv and crm_funds.csv, and enter: + +> Merge crm_contacts.csv with crm_funds.csv. Match contacts to their fund based on company name, ignoring legal suffixes (LLC, Inc, LP), abbreviations (Mgmt = Management, Tech = Technologies), and extra descriptors. + +All 10 contacts matched in seconds for $0.00. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload crm_contacts.csv and crm_funds.csv and ask Claude: + +> Merge crm_contacts.csv with crm_funds.csv. Match contacts to their fund based on company name, ignoring legal suffixes (LLC, Inc, LP), abbreviations (Mgmt = Management, Tech = Technologies), and extra descriptors. + +All 10 contacts matched in seconds for $0.00. + + Claude Code's pandas merge works when column values match exactly. When "Bridgewater" needs to match "Bridgewater Associates" and "D.E. Shaw" needs to match "D. E. Shaw & Co.", the merge needs fuzzy matching that understands company name conventions. @@ -20,17 +38,10 @@ Here, we get Claude Code to merge 10 contacts with 10 fund records, handling com | Total cost | $0.00 | | Time | 9 seconds | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With both CSVs in your working directory, tell Claude: diff --git a/docs/case_studies/merge-overlapping-contact-lists/content.mdx b/docs/case_studies/merge-overlapping-contact-lists/content.mdx index d0e8228d..93a242ea 100644 --- a/docs/case_studies/merge-overlapping-contact-lists/content.mdx +++ b/docs/case_studies/merge-overlapping-contact-lists/content.mdx @@ -7,6 +7,24 @@ description: Identity resolution across contact databases. Accurately match peop # Deduplicate Contact Lists + + +Go to [everyrow.io/app](https://everyrow.io/app), upload both contact CSVs, and enter: + +> Merge these two contact lists to find the same person across both. Account for nicknames (Bob/Robert, Mike/Michael, Tom/Thomas), initials (S. Chen = Sarah Chen), and institution matching. When in doubt, favor false negatives over false positives. + +7 matches found, 5 correctly left unmatched. Results are nearly instant. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload both contact CSVs and ask Claude: + +> Merge these two contact lists to find the same person across both. Account for nicknames (Bob/Robert, Mike/Michael, Tom/Thomas), initials (S. Chen = Sarah Chen), and institution matching. When in doubt, favor false negatives over false positives. + +7 matches found, 5 correctly left unmatched. Results are nearly instant. + + Claude Code can diff two lists. But what if "Dr. Sarah Chen" on one list is "S. Chen" on another, and "Robert Johnson" appears as "Bob Johnson"? You need semantic matching that understands nicknames and initials. @@ -21,17 +39,10 @@ Here, we get Claude Code to merge two overlapping contact lists (12 and 10 peopl | Total cost | $0.00 | | Time | 128 seconds | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With both contact CSVs in your working directory, tell Claude: diff --git a/docs/case_studies/multi-stage-lead-qualification/content.mdx b/docs/case_studies/multi-stage-lead-qualification/content.mdx index 8da09d4f..6594ef6c 100644 --- a/docs/case_studies/multi-stage-lead-qualification/content.mdx +++ b/docs/case_studies/multi-stage-lead-qualification/content.mdx @@ -7,6 +7,24 @@ description: Chain scoring, filtering, enrichment, and screening into a single a # Multi-Stage Lead Qualification + + +Go to [everyrow.io/app](https://everyrow.io/app), upload a CSV of 20 investment funds, and enter: + +> Score each fund 0-100 on likelihood to adopt research tools. + +Then filter results to funds scoring >= 50, re-upload, and run additional stages for team size estimation and final screening. 14 of 20 funds qualified. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV of 20 investment funds and ask Claude: + +> I have a CSV of 20 investment funds. Run this pipeline: 1. Score each fund 0-100 on likelihood to adopt research tools. 2. Filter to funds scoring >= 50. 3. For remaining funds, estimate their investment team size. 4. Final screen: include if score >= 70 OR team size <= 5. + +14 of 20 funds qualified after the three-stage pipeline. Results take about 4 minutes. + + Claude Code handles a single scoring or filtering step natively. Chaining three stages (score by research adoption, filter by threshold, estimate team sizes, then screen by a compound rule) needs an approach where each stage passes its output to the next with custom logic between steps. @@ -21,17 +39,10 @@ Here, we get Claude Code to run a three-stage qualification pipeline on 20 inves | Total cost | $0.53 | | Time | 4.2 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Tell Claude to run the multi-stage pipeline: diff --git a/docs/case_studies/research-and-rank-permit-times/content.mdx b/docs/case_studies/research-and-rank-permit-times/content.mdx index 0a5176f5..28e0a84d 100644 --- a/docs/case_studies/research-and-rank-permit-times/content.mdx +++ b/docs/case_studies/research-and-rank-permit-times/content.mdx @@ -7,6 +7,24 @@ description: Aggregate structured data from dozens of independent websites into # Research and Rank Web Data + + +Go to [everyrow.io/app](https://everyrow.io/app), upload a CSV of 30 Texas cities, and enter: + +> Research and rank these 30 Texas cities by residential building permit processing time in business days. Look up each city's actual permit processing data. + +30 cities researched in about 2.5 minutes. Fastest: San Antonio (3 days). Slowest: Denton (31 days). Average: 10.3 days. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV of 30 Texas cities and ask Claude: + +> Research and rank these 30 Texas cities by residential building permit processing time in business days. Look up each city's actual permit processing data. + +30 cities researched in about 2.5 minutes. Fastest: San Antonio (3 days). Slowest: Denton (31 days). Average: 10.3 days. + + Ask Claude Code to find the permit processing time for San Antonio and it will find the city's website and give you an answer. Doing that for 30 cities, each with a different government website that publishes permit data in a different format, needs 30 independent research agents. @@ -19,17 +37,10 @@ Here, we get Claude Code to research and rank 30 Texas cities by residential bui | Cost | $0.88 | | Time | 2.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With the Texas cities CSV in your working directory, tell Claude: diff --git a/docs/case_studies/score-leads-from-fragmented-data/content.mdx b/docs/case_studies/score-leads-from-fragmented-data/content.mdx index a5738b1f..1ec3fc65 100644 --- a/docs/case_studies/score-leads-from-fragmented-data/content.mdx +++ b/docs/case_studies/score-leads-from-fragmented-data/content.mdx @@ -7,6 +7,24 @@ description: Lead scoring for companies whose data is scattered across disconnec # Score Leads from Fragmented Data + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [b2b_companies.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/b2b_companies.csv), and enter: + +> Score each company from 0-100 on their likelihood of suffering from data fragmentation challenges. High scores for multi-location operations, M&A history, disconnected systems. Low scores for single-location, cloud-native, integrated stacks. + +20 companies scored in about 40 seconds. Multi-location businesses score highest, cloud-native startups lowest. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [b2b_companies.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/b2b_companies.csv) and ask Claude: + +> Score each company from 0-100 on their likelihood of suffering from data fragmentation challenges. High scores for multi-location operations, M&A history, disconnected systems. Low scores for single-location, cloud-native, integrated stacks. + +20 companies scored in about 40 seconds. Multi-location businesses score highest, cloud-native startups lowest. + + Claude Code is great at researching a single company's operations. Scoring 20 prospects on data fragmentation risk is harder. Each one needs web research into operational complexity, M&A history, and system diversity, then a consistent 0-100 score calibrated across the full set. @@ -19,17 +37,10 @@ Here, we get Claude Code to score B2B companies on their likelihood of needing d | Cost | $0.08 | | Time | 40 seconds | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [b2b_companies.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/b2b_companies.csv). Tell Claude: diff --git a/docs/case_studies/score-leads-without-crm-history/content.mdx b/docs/case_studies/score-leads-without-crm-history/content.mdx index 54c955e7..af5e3876 100644 --- a/docs/case_studies/score-leads-without-crm-history/content.mdx +++ b/docs/case_studies/score-leads-without-crm-history/content.mdx @@ -7,6 +7,24 @@ description: Cold lead qualification powered by live web research. Score prospec # Score Cold Leads via Web Research + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [investment_firms.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/investment_firms.csv), and enter: + +> Score each investment firm from 0-100 on their likelihood to purchase third-party research tools. High scores for fundamental/activist/short-sellers. Low scores for passive index funds and pure quant. + +15 firms scored in about 2.5 minutes. Activist and fundamental research firms score highest, quant and passive funds lowest. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [investment_firms.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/investment_firms.csv) and ask Claude: + +> Score each investment firm from 0-100 on their likelihood to purchase third-party research tools. High scores for fundamental/activist/short-sellers. Low scores for passive index funds and pure quant. + +15 firms scored in about 2.5 minutes. Activist and fundamental research firms score highest, quant and passive funds lowest. + + Ask Claude Code to evaluate whether a hedge fund buys research tools and it will investigate the firm's strategy and team structure. Doing that for 15 firms, each with unique investment approaches ranging from pure quant to fundamental research, needs per-firm web research running in parallel. @@ -19,17 +37,10 @@ Here, we get Claude Code to rank investment firms using web research to assess e | Cost | $0.30 | | Time | 149 seconds | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [investment_firms.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/investment_firms.csv). Tell Claude: diff --git a/docs/case_studies/screen-job-postings-by-criteria/content.mdx b/docs/case_studies/screen-job-postings-by-criteria/content.mdx index 937f2112..201857f7 100644 --- a/docs/case_studies/screen-job-postings-by-criteria/content.mdx +++ b/docs/case_studies/screen-job-postings-by-criteria/content.mdx @@ -7,6 +7,24 @@ description: Intelligent job filtering that reads and understands full postings. # Screen Job Listings + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [job_postings.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/job_postings.csv), and enter: + +> Screen each job posting to find roles that meet ALL THREE criteria: 1. Remote-friendly: explicitly allows remote, hybrid, or distributed work. 2. Senior-level: title includes Senior/Staff/Lead/Principal, or requires 5+ years. 3. Salary disclosed: specific compensation figures, not "competitive" or "DOE". + +7 of 15 postings pass (46.7%). Results take under a minute. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [job_postings.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/job_postings.csv) and ask Claude: + +> Screen each job posting to find roles that meet ALL THREE criteria: 1. Remote-friendly: explicitly allows remote, hybrid, or distributed work. 2. Senior-level: title includes Senior/Staff/Lead/Principal, or requires 5+ years. 3. Salary disclosed: specific compensation figures, not "competitive" or "DOE". + +7 of 15 postings pass (46.7%). Results take under a minute. + + Claude Code can read a job posting and tell you if it's remote-friendly. But what if you need to screen many postings against three criteria simultaneously, with structured yes/no output for each? @@ -20,17 +38,10 @@ Here, we get Claude Code to screen 15 job postings for roles that are remote-fri | Total cost | $0.03 | | Time | 57 seconds | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [job_postings.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/job_postings.csv). Tell Claude: diff --git a/docs/case_studies/screen-stocks-by-investment-thesis/content.mdx b/docs/case_studies/screen-stocks-by-investment-thesis/content.mdx index 3b049a52..fa94e719 100644 --- a/docs/case_studies/screen-stocks-by-investment-thesis/content.mdx +++ b/docs/case_studies/screen-stocks-by-investment-thesis/content.mdx @@ -7,6 +7,24 @@ description: Qualitative stock screening across hundreds of tickers. Apply inves # Screen Stocks by Investment Thesis + + +Go to [everyrow.io/app](https://everyrow.io/app), upload your S&P 500 CSV, and enter: + +> Screen to find companies with high-quality recurring revenue business models (>75% recurring) that would also benefit from escalating US-China tensions over Taiwan. Include CHIPS Act beneficiaries, defense contractors, cybersecurity, reshoring plays. Exclude companies dependent on Taiwan manufacturing or with significant China revenue at risk. + +63 of 502 companies pass (12.5%). Results take about 15.5 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload your S&P 500 CSV and ask Claude: + +> Screen to find companies with high-quality recurring revenue business models (>75% recurring) that would also benefit from escalating US-China tensions over Taiwan. Include CHIPS Act beneficiaries, defense contractors, cybersecurity, reshoring plays. Exclude companies dependent on Taiwan manufacturing or with significant China revenue at risk. + +63 of 502 companies pass (12.5%). Results take about 15.5 minutes. + + Ask Claude Code to evaluate whether Apple has >75% recurring revenue and benefits from US-China tensions, and it will research both questions and give you a thorough answer. Applying that same depth of analysis to all 502 S&P 500 companies needs 502 independent research tasks running in parallel. @@ -20,17 +38,10 @@ Here, we get Claude Code to screen the S&P 500 for companies with >75% recurring | Total cost | $17.15 | | Time | 15.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With your S&P 500 CSV in the working directory, tell Claude: diff --git a/docs/case_studies/screen-stocks-by-margin-sensitivity/content.mdx b/docs/case_studies/screen-stocks-by-margin-sensitivity/content.mdx index d6f21e6a..1173bb14 100644 --- a/docs/case_studies/screen-stocks-by-margin-sensitivity/content.mdx +++ b/docs/case_studies/screen-stocks-by-margin-sensitivity/content.mdx @@ -7,6 +7,24 @@ description: Multi-factor sensitivity screening across a stock universe. Evaluat # Screen Stocks by Economic Sensitivity + + +Go to [everyrow.io/app](https://everyrow.io/app), upload your S&P 500 CSV, and enter: + +> Screen to find companies whose profit margins fall when oil prices go up. Consider energy-intensive operations, transportation dependence, consumer discretionary sensitivity, and historical correlation with oil price spikes. Exclude energy companies and those with strong pricing power. + +150 of 502 companies pass (29.9%). Results take about 17.5 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload your S&P 500 CSV and ask Claude: + +> Screen to find companies whose profit margins fall when oil prices go up. Consider energy-intensive operations, transportation dependence, consumer discretionary sensitivity, and historical correlation with oil price spikes. Exclude energy companies and those with strong pricing power. + +150 of 502 companies pass (29.9%). Results take about 17.5 minutes. + + Claude Code is great at researching one company's oil price sensitivity. It can find margin history, check hedging disclosures, and assess energy exposure. Doing that same five-factor analysis for 502 companies requires more parallel web research than a single session can support. @@ -20,17 +38,10 @@ Here, we get Claude Code to screen the S&P 500 for companies whose margins compr | Total cost | $17.22 | | Time | 17.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` With your S&P 500 CSV in the working directory, tell Claude: diff --git a/docs/case_studies/understanding-costs-and-speed-for-merge/content.mdx b/docs/case_studies/understanding-costs-and-speed-for-merge/content.mdx index 53934b24..763e04e2 100644 --- a/docs/case_studies/understanding-costs-and-speed-for-merge/content.mdx +++ b/docs/case_studies/understanding-costs-and-speed-for-merge/content.mdx @@ -7,6 +7,24 @@ description: Empirical cost and speed analysis across five merge strategies. Tra # Merge Costs and Speed + + +Go to [everyrow.io/app](https://everyrow.io/app), upload your company tables, and enter: + +> Merge the tables based on company name and ticker. Match companies to their stock tickers. + +Exact and fuzzy matches are free. Only rows requiring LLM reasoning cost ~$0.002/row. Web search fallback costs ~$0.01/row. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload your company tables and ask Claude: + +> Create a test dataset of 10 companies with exact names, then merge them. Then create a version with typos and merge again. Then test semantic matching (Instagram to Meta, YouTube to Alphabet). Show costs for each. + +Exact and fuzzy matches are free. Only rows requiring LLM reasoning cost ~$0.002/row. Web search fallback costs ~$0.01/row. + + Claude Code is great at merging two tables. But how much does it cost, and what determines the price? The answer depends on how hard each match is: exact and fuzzy matches are free, and only semantic matches that require LLM reasoning incur costs. @@ -19,17 +37,10 @@ Here, we run 5 merge experiments to empirically measure the cost cascade across | Total cost | $0.06 | | Total time | 2.1 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Tell Claude to run each experiment with inline-generated data: diff --git a/docs/chaining-operations.mdx b/docs/chaining-operations.mdx index 7474bf62..b010ce21 100644 --- a/docs/chaining-operations.mdx +++ b/docs/chaining-operations.mdx @@ -5,7 +5,7 @@ description: Combine screen, dedupe, merge, rank, and research operations to bui # Chaining Operations -Operations can be chained together to build complete workflows. Each step refines your data further. +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. @@ -338,15 +338,79 @@ Now you have everything needed to dispatch rescue teams. --- +## 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](https://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. +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 +**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:** ```python # Combine sources @@ -370,7 +434,15 @@ ranked = await rank( **Problem:** You have 200 potential vendors. Need to shortlist ones that meet basic requirements, then rank by fit. -**Workflow:** Screen → Rank +**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:** ```python # Filter to qualified vendors @@ -390,9 +462,18 @@ ranked = await rank( ### 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). +**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 +**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:** ```python # First, enrich products with parent company info @@ -418,7 +499,15 @@ unapproved = matched.data[matched.data["vendor_id"].isna()] **Problem:** CRM has company names but missing firmographic data. Need employee count and industry before assigning to sales territories. -**Workflow:** Research → Rank +**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:** ```python # Enrich with firmographics @@ -439,7 +528,16 @@ ranked = await rank( **Problem:** You scraped company data from LinkedIn, Crunchbase, and news articles. Same companies appear with different descriptions. -**Workflow:** Concatenate → Dedupe +**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:** ```python # Combine all research diff --git a/docs/classify-dataframe-rows-llm.mdx b/docs/classify-dataframe-rows-llm.mdx index f7d15ea7..64ae322d 100644 --- a/docs/classify-dataframe-rows-llm.mdx +++ b/docs/classify-dataframe-rows-llm.mdx @@ -7,6 +7,24 @@ description: Multi-class labeling with LLM-powered classification. Structured ou # Classify and Label Rows + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [hn_jobs_classify.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_classify.csv), and enter: + +> Classify each row by primary engineering role. Use these categories: backend, frontend, fullstack, data, ml_ai, devops_sre, mobile, security, other. For each row, return the category and a short reasoning. + +All 200 rows classified in about a minute. Fullstack dominates at 44% because HN "Who's Hiring" posts are predominantly from startups. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [hn_jobs_classify.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_classify.csv) and ask Claude: + +> Classify each row by primary engineering role. Use these categories: backend, frontend, fullstack, data, ml_ai, devops_sre, mobile, security, other. For each row, return the category and a short reasoning. + +All 200 rows classified in about a minute. Fullstack dominates at 44% because HN "Who's Hiring" posts are predominantly from startups. + + Claude Code's text processing works for classifying a few dozen items in a single prompt. When you have 200 rows that each need consistent, structured labels across 9 categories, you need batched parallel evaluation with a fixed schema. @@ -20,17 +38,10 @@ Here, we get Claude Code to classify 200 job postings into 9 role categories in | Cost | $1.53 | | Cost per row | $0.008 | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: - -```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download the dataset: [hn_jobs_classify.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_classify.csv) (3,616 Hacker News "Who's Hiring" posts). With the CSV in your working directory, tell Claude: diff --git a/docs/claude-ai.md b/docs/claude-ai.md new file mode 100644 index 00000000..26d477e4 --- /dev/null +++ b/docs/claude-ai.md @@ -0,0 +1,26 @@ +--- +title: Give claude.ai a Team of Researchers +description: Add everyrow as a connector in Claude.ai to deploy researchers to gather data, score, classify, or forecast. +--- + +# Use everyrow in Claude.ai + +## Setup + +1. Go to Settings → Connectors → Add custom connector +2. Enter the remote MCP URL: `https://mcp.everyrow.io/mcp` +3. Go to Settings → Capabilities → Code execution and file creation → Additional allowed domains and add `mcp.everyrow.io` — this lets Claude upload your CSVs for the researchers to process. + +Sign in with Google to authenticate. + +## Try it + +Ask Claude: + +> Which US companies are most pro-AI? + +## Same setup for Claude Desktop + +Claude Desktop (the native app) uses the same Connectors settings. Add the connector once and it works in both Chat and the Desktop app. + +See also: [Use everyrow in Claude Cowork](/claude-cowork) diff --git a/docs/claude-code.md b/docs/claude-code.md new file mode 100644 index 00000000..95779d04 --- /dev/null +++ b/docs/claude-code.md @@ -0,0 +1,27 @@ +--- +title: Give Claude Code a Team of Researchers +description: Enable Claude Code to deploy hundreds of researchers to gather data, score, classify, and forecast entire datasets. +--- + +# Use everyrow in Claude Code + +## Setup + +```bash +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp +``` + +Then launch Claude Code and authenticate with Google: + +``` +claude +\mcp → select everyrow → Authenticate +``` + +## Try it + +> Which AI models had the biggest safety implications when released? + +Claude will dispatch everyrow researchers via MCP, poll for progress, and return results directly in your terminal. + +See also: [Skills](/skills-vs-mcp) | [MCP Server](/mcp-server) diff --git a/docs/claude-cowork.md b/docs/claude-cowork.md new file mode 100644 index 00000000..dd9108d6 --- /dev/null +++ b/docs/claude-cowork.md @@ -0,0 +1,27 @@ +--- +title: Give Claude Cowork a Team of Researchers +description: Give Claude Cowork a research team that can gather data, forecast, score, classify, or rank entire datasets. +--- + +# Use everyrow in Claude Cowork + +Cowork is a tab in the Claude Desktop app for multi-step autonomous tasks. With everyrow connected, Cowork can deploy a team of researchers to gather data, score, classify, and forecast entire datasets. + +## Setup + +1. Open Claude Desktop (download from [claude.ai/download](https://claude.ai/download) if needed) +2. Go to Settings → Connectors → Add custom connector +3. Enter the remote MCP URL: `https://mcp.everyrow.io/mcp` +4. Go to Settings → Capabilities → Code execution and file creation → Additional allowed domains and add `mcp.everyrow.io` (this lets Claude upload your CSVs for the researchers to process.) + +Sign in with Google to authenticate. The connector is shared across Chat, Cowork, and Code tabs in Claude Desktop. + +## Try it + +Switch to the Cowork tab, and ask: + +> Which S&P 500 companies are most exposed to China-Taiwan risk? + +## Learn more + +- [Get started with Cowork](https://support.claude.com/en/articles/13345190-get-started-with-cowork) (Claude Help Center) diff --git a/docs/deduplicate-training-data-ml.mdx b/docs/deduplicate-training-data-ml.mdx index 030660d1..4d502e8f 100644 --- a/docs/deduplicate-training-data-ml.mdx +++ b/docs/deduplicate-training-data-ml.mdx @@ -7,6 +7,24 @@ description: Identify paraphrases, reformatted text, and near-copies that share # Deduplicate Training Data + + +Go to [everyrow.io/app](https://everyrow.io/app), upload a CSV of 3,000 sentences from the [PAWS](https://huggingface.co/datasets/google-research-datasets/paws) paraphrase dataset, and enter: + +> Deduplicate this dataset of sentences. Two sentences are duplicates if they convey the same meaning, even if phrased differently. This includes paraphrases, minor grammatical variations, and sentences about the same fact that would be redundant in a training set. They are NOT duplicates if they describe different facts, even if they share many words. + +973 duplicates found and removed (32.4% reduction). Results take about 28 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV of 3,000 sentences from the [PAWS](https://huggingface.co/datasets/google-research-datasets/paws) paraphrase dataset and ask Claude: + +> Deduplicate this dataset of sentences. Two sentences are duplicates if they convey the same meaning, even if phrased differently. This includes paraphrases, minor grammatical variations, and sentences about the same fact that would be redundant in a training set. They are NOT duplicates if they describe different facts, even if they share many words. + +973 duplicates found and removed (32.4% reduction). Results take about 28 minutes. + + Claude Code handles exact deduplication natively by writing Python to hash and compare rows. Scaling to 3,000 sentences where the duplicates are paraphrases needs an approach where each pair is evaluated for semantic equivalence. "The cat sat on the mat" and "On the mat, the cat was sitting" share no exact n-grams but mean the same thing. @@ -21,17 +39,10 @@ Here, we get Claude Code to deduplicate 3,000 sentences from the PAWS paraphrase | Time | 28.2 minutes | | Cost | $13.27 | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` The dataset is 3,000 sentences extracted from the [PAWS](https://huggingface.co/datasets/google-research-datasets/paws) paraphrase dataset, where many sentence pairs convey the same fact with different word order. With the CSV in your working directory, tell Claude: diff --git a/docs/filter-dataframe-with-llm.mdx b/docs/filter-dataframe-with-llm.mdx index d050a162..ee692395 100644 --- a/docs/filter-dataframe-with-llm.mdx +++ b/docs/filter-dataframe-with-llm.mdx @@ -7,6 +7,24 @@ description: Screen rows by nuanced, subjective rules applied in parallel across # Filter a Dataset Intelligently + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [hn_jobs_screen.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_screen.csv), and enter: + +> Screen to find job postings that meet ALL THREE criteria: 1. Remote-friendly: explicitly allows remote work, hybrid, WFH, distributed teams, or "work from anywhere". 2. Senior-level: title contains Senior/Staff/Lead/Principal/Architect, OR requires 5+ years experience, OR mentions "founding engineer". 3. Salary disclosed: specific compensation numbers are mentioned. "$150K-200K" qualifies. "Competitive" or "DOE" does not. + +Of 3,616 postings, about 230 pass the filter (6.4%). Results take about 8 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [hn_jobs_screen.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_screen.csv) and ask Claude: + +> Screen to find job postings that meet ALL THREE criteria: 1. Remote-friendly: explicitly allows remote work, hybrid, WFH, distributed teams, or "work from anywhere". 2. Senior-level: title contains Senior/Staff/Lead/Principal/Architect, OR requires 5+ years experience, OR mentions "founding engineer". 3. Salary disclosed: specific compensation numbers are mentioned. "$150K-200K" qualifies. "Competitive" or "DOE" does not. + +Of 3,616 postings, about 230 pass the filter (6.4%). Results take about 8 minutes. + + Ask Claude Code to filter job postings for remote, senior roles and it will write solid Python with keyword matching. But "remote-friendly" is not always a keyword. A posting might say "team distributed across three time zones" or "occasional office visits in SF." Screening 3,616 rows with that level of judgment needs per-row LLM evaluation. @@ -20,17 +38,10 @@ Here, we get Claude Code to screen 3,616 job postings for "remote-friendly, seni | Total cost | $11.02 | | Time | 8.0 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download the dataset: [hn_jobs_screen.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/hn_jobs_screen.csv) (3,616 Hacker News "Who's Hiring" posts, March 2020 through January 2026). With the CSV in your working directory, tell Claude: diff --git a/docs/fuzzy-join-without-keys.mdx b/docs/fuzzy-join-without-keys.mdx index 33dbd801..14d24616 100644 --- a/docs/fuzzy-join-without-keys.mdx +++ b/docs/fuzzy-join-without-keys.mdx @@ -7,6 +7,24 @@ description: Semantic matching for tables with different naming conventions, abb # Join Tables Without Shared Keys + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [company_info.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/company_info.csv) and [valuations.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/valuations.csv), and enter: + +> Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers. + +437 of 438 companies matched (99.8%). Results take about 11 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [company_info.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/company_info.csv) and [valuations.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/valuations.csv) and ask Claude: + +> Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers. + +437 of 438 companies matched (99.8%). Results take about 11 minutes. + + Claude Code can merge two CSVs when they share a key column. But what if one table has company names and the other has stock tickers, and there's no shared column to join on? @@ -20,17 +38,10 @@ Here, we get Claude Code to join two S&P 500 tables (438 rows) where one has com | Cost | $0.82 | | Time | ~10.9 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: - -```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [company_info.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/company_info.csv) (company names, price, market cap) and [valuations.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/valuations.csv) (tickers, fair value). With both files in your working directory, tell Claude: diff --git a/docs/getting-started.md b/docs/getting-started.md index 1361ea62..93e9dcbe 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,36 +1,30 @@ --- -title: "Getting Started" -description: Install everyrow and run your first operation. +title: Using the EveryRow Python SDK +description: How to directly control your team of research agents to forecast, classify, rank, score, or gather data for you. --- # Getting Started -Everyrow lets you perform qualitative data transformations on noisy real-world data, at quantitative scale. Define your fuzzy logic concisely in natural language, and everyrow handles the complexity of orchestrating the execution. +> **Just want to use everyrow?** Go to [everyrow.io/app](https://everyrow.io/app), add it to [Claude.ai](/claude-ai), [Cowork](/claude-cowork), or [Claude Code](/claude-code). This guide is for developers using the Python SDK. -**Using Claude Code?** Install the plugin and ask Claude in natural language: +Using the Python SDK gives you direct access to the utilities for directing your team of researchers. You can use all the methods documented in the [API Reference](/docs/api) and control the parameters such as effort level, which LLM to use, etc. + +## Python SDK with pip ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch +pip install everyrow ``` -## Prerequisites - -- Python 3.12+ -- API key from [everyrow.io/api-key](https://everyrow.io/api-key) +Requires Python 3.12+. -## Installation +**Important:** be sure to supply your API key when running scripts: ```bash -pip install everyrow -export EVERYROW_API_KEY=your_key_here +export EVERYROW_API_KEY=sk-cho... +python3 example_script.py ``` -See the [docs homepage](/docs) for other options (MCP servers, coding agent plugins). - -## Basic Example - -Shortlist an initial set of companies. +**Quick example:** ```python import asyncio @@ -38,33 +32,30 @@ import pandas as pd from everyrow.ops import screen from pydantic import BaseModel, Field -jobs = pd.DataFrame([ - {"company": "Airtable", "post": "Async-first team, 8+ yrs exp, $185-220K base"}, - {"company": "Vercel", "post": "Lead our NYC team. Competitive comp, DOE"}, - {"company": "Notion", "post": "In-office SF. Staff eng, $200K + equity"}, - {"company": "Linear", "post": "Bootcamp grads welcome! $85K, remote-friendly"}, - {"company": "Descript", "post": "Work from anywhere. Principal architect, $250K"}, +companies = pd.DataFrame([ + {"company": "Airtable",}, {"company": "Vercel",}, {"company": "Notion",} ]) class JobScreenResult(BaseModel): - qualifies: bool = Field(description="True if meets ALL criteria") + qualifies: bool = Field(description="True if company lists jobs with all criteria") async def main(): result = await screen( - task=""" - Qualifies if ALL THREE are met: - 1. Remote-friendly - 2. Senior-level (5+ yrs exp OR Senior/Staff/Principal in title) - 3. Salary disclosed (specific numbers, not "competitive" or "DOE") - """, - input=jobs, + task="""Qualifies if: 1. Remote-friendly, 2. Senior, and 3. Discloses salary""", + input=companies, response_model=JobScreenResult, ) - print(result.data) + print(result.data.head()) asyncio.run(main()) ``` +## Dependencies + +The MCP server requires [**uv**](https://docs.astral.sh/uv/) (if using `uvx`) or [**pip**](https://pip.pypa.io/en/stable/) (if installed directly). The Python SDK requires **Python 3.12+**. + +For the optional terminal progress bar, see the [jq dependency](/docs/progress-monitoring#status-line-progress-bar) in the progress monitoring guide. + ## Sessions Every operation runs within a **session**. Sessions group related operations together and appear in your [everyrow.io](https://everyrow.io) session list. diff --git a/docs/installation.mdx b/docs/installation.mdx index 6154ca1d..01a7f77e 100644 --- a/docs/installation.mdx +++ b/docs/installation.mdx @@ -1,167 +1,39 @@ --- -title: "Install EveryRow: Python SDK, Claude Code Plugin, and MCP Server" -description: Get started with everyrow. Install the Python SDK via pip, add the coding agent plugin for Claude Code, Gemini CLI, Codex, or Cursor, or configure the MCP server. +title: Get your team of EveryRow researchers +description: Use everyrow in the app, Claude.ai, Claude Cowork, Claude Code, or the Python SDK. --- -# Installation +# Get Started -Get an API key at [everyrow.io/api-key](https://everyrow.io/api-key) ($20 free credit included). +## Choose how you want to use everyrow -Select your platform and integration method below. +### [Web App](https://everyrow.io/app) - - - - -Install the everyrow plugin from the marketplace: - -```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` +Only setup is signing in with Google at [everyrow.io/app](https://everyrow.io/app). -This installs both the skill and MCP server together. You can toggle each on/off in Claude Code settings. +### [Claude.ai](/claude-ai) -**Important:** be sure to supply your API key when launching Claude Code: +Add a connector in Settings. Works in Claude Desktop too. -```bash -export EVERYROW_API_KEY=sk-cho... -claude -``` +### [Claude Cowork](/claude-cowork) -You can optionally configure Claude Code to show a [progress bar](/docs/progress-monitoring#progress-bar) for long-running tasks. +Add the connector in Settings. -[Official Claude Code Plugin Docs](https://code.claude.com/docs/en/discover-plugins#add-from-github) +### [Claude Code](/claude-code) - +One command: `claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp` - +### [Python SDK](/getting-started) -Add everyrow to your MCP config (requires [uv](https://docs.astral.sh/uv/)): +For developers writing Python. Requires `pip install everyrow` and an [API key](https://everyrow.io/api-key). -```json -{ - "mcpServers": { - "everyrow": { - "command": "uvx", - "args": ["everyrow-mcp"], - "env": { - "EVERYROW_API_KEY": "${EVERYROW_API_KEY}" - } - } - } -} -``` - -Or install with pip and use `"command": "everyrow-mcp"` instead of uvx. - -Config file location: -- **User scope:** `~/.claude.json` (in the `mcpServers` field) -- **Project scope:** `.mcp.json` in your project root - -[Choosing the right scope](https://code.claude.com/docs/en/mcp#choosing-the-right-scope) - -**Important:** either insert your API key when creating the JSON file, or supply the key when launching Claude Code: - -```bash -export EVERYROW_API_KEY=sk-cho... -claude -``` - -You can optionally configure Claude Code to show a [progress bar](/docs/progress-monitoring#progress-bar) for long-running tasks. - - - - - -```bash -pip install everyrow -``` - -Requires Python 3.12+. - -**Important:** be sure to supply your API key when running scripts: - -```bash -export EVERYROW_API_KEY=sk-cho... -python3 example_script.py -``` - -**Quick example:** - -```python -import asyncio -import pandas as pd -from everyrow.ops import screen -from pydantic import BaseModel, Field - -companies = pd.DataFrame([ - {"company": "Airtable",}, {"company": "Vercel",}, {"company": "Notion",} -]) - -class JobScreenResult(BaseModel): - qualifies: bool = Field(description="True if company lists jobs with all criteria") - -async def main(): - result = await screen( - task="""Qualifies if: 1. Remote-friendly, 2. Senior, and 3. Discloses salary""", - input=companies, - response_model=JobScreenResult, - ) - print(result.data.head()) - -asyncio.run(main()) -``` - - - - - -```bash -uv add everyrow -``` - -Requires Python 3.12+. - -**Quick example:** - -```python -import asyncio -import pandas as pd -from everyrow.ops import screen -from pydantic import BaseModel, Field - -companies = pd.DataFrame([ - {"company": "Airtable",}, {"company": "Vercel",}, {"company": "Notion",} -]) - -class JobScreenResult(BaseModel): - qualifies: bool = Field(description="True if company lists jobs with all criteria") - -async def main(): - result = await screen( - task="""Qualifies if: 1. Remote-friendly, 2. Senior, and 3. Discloses salary""", - input=companies, - response_model=JobScreenResult, - ) - print(result.data.head()) - -asyncio.run(main()) -``` - -See the [API Reference](/docs/api) for full documentation. - - - - - -First, make sure you have [uv installed](https://docs.astral.sh/uv/). +--- -Then, download the latest `.mcpb` bundle from [GitHub Releases](https://github.com/futuresearch/everyrow-sdk/releases) and double-click to install. You'll be prompted for your API key during setup. +## Other AI agents -After installing the bundle, you can use everyrow from Chat, Cowork and Code within Claude Desktop. +These integrations use the local MCP server with an API key. Get one at [everyrow.io/api-key](https://everyrow.io/api-key). - + diff --git a/docs/mcp-server.md b/docs/mcp-server.md index 932aab75..e17663c2 100644 --- a/docs/mcp-server.md +++ b/docs/mcp-server.md @@ -1,13 +1,15 @@ --- title: MCP Server -description: Reference for all everyrow MCP server tools — async operations with progress polling and result retrieval. +description: Reference for all everyrow MCP server tools, async operations with progress polling and result retrieval. --- # MCP Server Reference -The everyrow MCP server exposes tools for AI-powered data processing. These tools are called directly by Claude Code, Codex CLI, and other MCP clients — no Python code is needed. +> Quick setup: Most users should use the hosted remote server. Add it to [Claude.ai](/claude-ai), [Claude Cowork](/claude-cowork), or [Claude Code](/claude-code), authentication is via OAuth. The reference below applies to both the remote and local MCP servers. -All operations use an async pattern: submit the task, poll for progress, then retrieve results. This allows long-running operations (1–10+ minutes) to work reliably with MCP clients. +The everyrow MCP server enables deployment of a team of researchers to forecast, score, rank, or gather data. These tools are called directly by Claude Code, Claude.ai, and other MCP clients, no Python code is needed. + +All operations use an async pattern: submit the task, poll for progress, then retrieve results. This allows long-running operations (1-10+ minutes) to work reliably with MCP clients. ## Operation Tools @@ -184,8 +186,7 @@ The Claude Code plugin (`.claude-plugin/plugin.json`) bundles: Install with: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` See [Progress Monitoring](/docs/progress-monitoring) for status line setup and hook details. diff --git a/docs/rank-by-external-metric.mdx b/docs/rank-by-external-metric.mdx index bd1d83b3..a92943af 100644 --- a/docs/rank-by-external-metric.mdx +++ b/docs/rank-by-external-metric.mdx @@ -7,6 +7,24 @@ description: Sort any dataset by information you don't have yet. Research agents # Rank Data by External Metrics + + +Go to [everyrow.io/app](https://everyrow.io/app), upload a CSV of the top 300 PyPI packages (with `package` and `monthly_downloads` columns), and enter: + +> Rank these packages by days since their last release. Look up each package on pypi.org to find the release date. Sort by most recently released first. + +All 300 packages researched in about 6.5 minutes. Results range from packages released today to ones untouched for 8+ years. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV of the top 300 PyPI packages (with `package` and `monthly_downloads` columns) and ask Claude: + +> Rank these packages by days since their last release. Look up each package on pypi.org to find the release date. Sort by most recently released first. + +All 300 packages researched in about 6.5 minutes. Results range from packages released today to ones untouched for 8+ years. + + Claude Code's web search works well for looking up a few packages. When you need two separate metrics researched for each of 300 packages, that is hundreds of individual lookups that need to happen in parallel. @@ -19,17 +37,10 @@ Here, we get Claude Code to rank 300 PyPI packages by two metrics that require e | Total cost | $13.26 | | Time | ~6.5 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` The dataset is the top 300 PyPI packages by monthly downloads, fetched from the [top-pypi-packages](https://hugovk.github.io/top-pypi-packages/) API. The only columns are `package` and `monthly_downloads`. No release dates, no contributor counts. Tell Claude: diff --git a/docs/resolve-entities-python.mdx b/docs/resolve-entities-python.mdx index f894860a..3c64d434 100644 --- a/docs/resolve-entities-python.mdx +++ b/docs/resolve-entities-python.mdx @@ -7,6 +7,24 @@ description: Consolidate records where the same entity appears under different s # Resolve Duplicate Entities + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv), and enter: + +> Deduplicate this CRM dataset. Two entries are duplicates if they represent the same company. + +500 records resolved to about 156 unique entities (68.8% duplicates removed). Results take about 15 minutes. + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv) and ask Claude: + +> Deduplicate this CRM dataset. Two entries are duplicates if they represent the same company. + +500 records resolved to about 156 unique entities (68.8% duplicates removed). Results take about 15 minutes. + + Claude Code is great at writing normalization code to standardize company names. Stripping "Inc." and lowercasing gets you some matches. But "AbbVie Inc.", "AbbVie Pharmaceutical", "Abbvie", and "Abvie Inc" need more than normalization. Two of those are typos, one is a brand variant, and one is a division name. @@ -21,17 +39,10 @@ Here, we get Claude Code to resolve 500 messy CRM records down to their unique e | Cost | $2.02 | | Time | 15.3 minutes | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: - -```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download the dataset: [case_01_crm_data.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/case_01_crm_data.csv) (500 messy company records with typos, abbreviations, and missing fields). With the CSV in your working directory, tell Claude: diff --git a/docs/scale-deduplication-20k-rows.mdx b/docs/scale-deduplication-20k-rows.mdx index 8802d064..d4946cc7 100644 --- a/docs/scale-deduplication-20k-rows.mdx +++ b/docs/scale-deduplication-20k-rows.mdx @@ -7,6 +7,24 @@ description: Deduplication that scales linearly with dataset size. Embeddings an # Scale Deduplication to 20K Rows + + +Go to [everyrow.io/app](https://everyrow.io/app), upload [fda_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/fda_products.csv), and enter: + +> Deduplicate this dataset. Two rows are duplicates if they have the same ingredient + same strength + same applicant + same dosage form. + +20,000 rows deduplicated in about 22 minutes. 1,922 duplicates removed (9.6% reduction). + + + + +[Add the everyrow connector if you haven't already.](/claude-ai) Then upload [fda_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/fda_products.csv) and ask Claude: + +> Deduplicate this dataset. Two rows are duplicates if they have the same ingredient + same strength + same applicant + same dosage form. + +20,000 rows deduplicated in about 22 minutes. 1,922 duplicates removed (9.6% reduction). + + Claude Code handles deduplication of a few hundred rows natively. Scaling to 20,000 rows needs an approach where embeddings and clustering narrow the search space first, so LLM calls target the ambiguous pairs instead of all 200 million possible combinations. @@ -21,17 +39,10 @@ Here, we get Claude Code to deduplicate 20,000 FDA drug product records, using a | Time | 22.5 minutes | | Cost | $26.11 | -First, install the [everyrow](https://github.com/futuresearch/everyrow-sdk) plugin for Claude Code: +[Add everyrow to Claude Code](/claude-code) if you haven't already: ```bash -claude plugin marketplace add futuresearch/everyrow-sdk -claude plugin install everyrow@futuresearch -``` - -Set your API key before launching Claude Code: - -```bash -export EVERYROW_API_KEY=your_key_here # Get one at everyrow.io/api-key +claude mcp add everyrow --scope project --transport http https://mcp.everyrow.io/mcp ``` Download [fda_products.csv](https://media.githubusercontent.com/media/futuresearch/everyrow-sdk/refs/heads/main/docs/data/fda_products.csv) (20,000 rows from the FDA Drugs@FDA database with ingredient, strength, applicant, and dosage form columns). Tell Claude: diff --git a/docs/skills-vs-mcp.mdx b/docs/skills-vs-mcp.mdx index d83bc7bf..5ae9edb6 100644 --- a/docs/skills-vs-mcp.mdx +++ b/docs/skills-vs-mcp.mdx @@ -1,92 +1,67 @@ -# SDK Skills vs MCP - -everyrow integrates with your agent through SDK Skills or MCP server. Here's how they compare: - -### SDK - -The SDK exposes the Python methods to build on, and the Skill gives your agent guided workflows with best practices built in: - -1. Your agent reads your skill instructions -2. Your agent writes Python code using the everyrow SDK following everyrow patterns -3. The code runs in your local environment -4. Results save to your filesystem - -This gives you full control, and lets you build with the SDK. But the streaming experience is not as nice as the agent-native UIs using the MCP server. - - - - - - - - - Claude Code - - Skill Prompts - - reads - - Python Code - - writes - - everyrow API - - calls - - Your CSV - - saves - - -### MCP Server - -MCP provides direct tool calls without code generation. Your agent calls everyrow MCP tools directly, with results saved to your filesystem and returned in the conversation. No intermediate Python code needed. - - - - - - - - - Claude Code - - MCP Server - - tool call - - everyrow API - - calls - - -### Comparison Table - -| Feature | SDK Skills | MCP Server | -|---------|--------|------------| -| Setup complexity | Requires Python environment | Requires MCP client (e.g. Claude Code, Codex) | -| Code visibility | Full Python code shown | Tool calls only | -| Customization | High (edit generated code) | Limited | -| Multi-step workflows | Excellent (in-memory chaining) | Basic (CSV round-trips) | -| Progress visibility | Customizable progress callback | Conversational updates every few seconds + status bar | -| Preview mode | Yes (`preview=True`) | Not available | -| Custom response models | Full Pydantic BaseModel | JSON schema only | -| Effort/LLM control | `effort_level`, `llm`, `iteration_budget` | Not available | -| Works in Claude Desktop | Cowork mode only | Yes (all modes) | -| Debugging | Requires some Python knowledge | Not needed | - -### Which Should I Start With? - -Start with MCP. Install the plugin, set your API key, and ask your AI assistant to process your data. No Python needed, and you get automatic progress tracking with a status bar. - -When you need `preview=True` to test cheaply, full Pydantic response models with validators, custom effort levels, or multi-step pipelines that chain operations in memory — ask your AI assistant to "write a Python script instead." The SDK Skill kicks in automatically. - -They're the same product at different abstraction levels. The plugin ships both. A user who starts with MCP tools and later needs more control just switches to the SDK path within the same session. - -## Related Reading - -- [Installation Guide](/docs) - Full setup instructions -- [Progress Monitoring](/docs/progress-monitoring) - Status bar, stop guard, and session URLs -- [API Reference](/docs/reference/RESEARCH) - Detailed function documentation -- [Case Studies](/docs/case-studies/dedupe-crm-company-records) - Real-world examples +--- +title: EveryRow Skill for Claude Code +description: Install the everyrow plugin for Claude Code to research, score, classify, and forecast entire datasets from your terminal. +--- + +# EveryRow Skill for Claude Code + +The everyrow plugin gives Claude Code a team of web research agents. Ask Claude to process your data in natural language, and it dispatches parallel researchers to handle every row — screening, scoring, deduplicating, merging, classifying, or forecasting. + +## What It Does + +The plugin bundles three things into a single install: + +1. **MCP server** — exposes everyrow operations as tool calls (screen, rank, dedupe, merge, agent, classify, forecast). Claude calls these directly; no Python code needed. +2. **Hooks** — a stop guard that prevents Claude from ending its turn while an operation is running, a results notification (macOS), and session cleanup on exit. +3. **Skill** — guides Claude to write Python SDK code when you need full control (custom Pydantic models, `preview=True`, effort levels, multi-step pipelines chained in memory). + +## Install + +```bash +claude plugin marketplace add futuresearch/everyrow-sdk +claude plugin install everyrow@futuresearch +``` + +Then launch Claude Code and authenticate: + +``` +claude +\mcp → select everyrow → Authenticate +``` + +That's it. No API key, no Python environment, no MCP config file. The plugin handles everything. + +## Usage + +After installing, just ask Claude in natural language: + +> Score these companies by likelihood to need data integration solutions + +> Deduplicate this CRM export — same company even with Inc/LLC/Ltd variations + +> Research the latest funding round for each company in startups.csv + +Claude will pick the right everyrow operation, dispatch the researchers, poll for progress, and return results as a CSV in your working directory. + +## Progress Bar + +For a persistent progress bar in the Claude Code terminal footer, add this to your project or global settings (`.claude/settings.json`): + +```json +{ + "statusLine": { + "type": "command", + "command": "/everyrow-mcp/scripts/everyrow-statusline.sh", + "padding": 1 + } +} +``` + +Requires [jq](https://jqlang.org/) (`brew install jq` on macOS). See [Progress Monitoring](/docs/progress-monitoring) for details. + +## Related + +- [Claude Code setup](/claude-code) — MCP-only setup (without the plugin) +- [Python SDK](/getting-started) — full SDK documentation for developers +- [MCP Server Reference](/mcp-server) — all MCP tool parameters +- [Progress Monitoring](/docs/progress-monitoring) — status bar, stop guard, and hooks diff --git a/everyrow-mcp/README.md b/everyrow-mcp/README.md index adfbe727..b77ba23e 100644 --- a/everyrow-mcp/README.md +++ b/everyrow-mcp/README.md @@ -1,5 +1,7 @@ # everyrow MCP Server +> Most users don't need to run the MCP server locally. Use the hosted remote server at `https://mcp.everyrow.io/mcp` — it authenticates via OAuth, no API key needed. See the [setup guide](https://everyrow.io/docs). The instructions below are for self-hosted or advanced use cases where an API key is required. + MCP (Model Context Protocol) server for [everyrow](https://everyrow.io): agent ops at spreadsheet scale. This server exposes everyrow's 5 core operations as MCP tools, allowing LLM applications to screen, rank, dedupe, merge, and run agents on CSV files. diff --git a/skills/everyrow-sdk/SKILL.md b/skills/everyrow-sdk/SKILL.md index f5fd7b49..d64e8261 100644 --- a/skills/everyrow-sdk/SKILL.md +++ b/skills/everyrow-sdk/SKILL.md @@ -53,11 +53,16 @@ Config file locations: ## Configuration -Before writing any everyrow code or using the MCP tools, check if `EVERYROW_API_KEY` is set. If not, prompt the user: +First, check if everyrow is already connected via remote MCP. Run `\mcp` and look for `everyrow` in the list. If it's there, no API key is needed, the remote MCP server authenticates via OAuth with Google sign-in only. + +If the user cannot use MCP for some reason, you may fall back to asking them to fetch an EVERYROW_API_KEY. + +Prompt the user: > everyrow requires an API key. Do you have one? +> > - If yes, paste it here -> - If no, get one at https://everyrow.io/api-key ($20 free credit) and paste it back +> - If no, get one at https://everyrow.io/api-key and paste it back Once the user provides the key, set it: From 37563f5bb94ca1a533466aede8d7383c6985c0cc Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Tue, 3 Mar 2026 14:11:28 -0800 Subject: [PATCH 6/9] Fix MDX parsing error: escape < in multi-stage-lead-qualification MDX interprets bare `<=` as a JSX tag opening, causing a compile error. Use HTML entities in the claude-ai tab preamble text. Co-Authored-By: Claude Opus 4.6 --- docs/case_studies/multi-stage-lead-qualification/content.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/case_studies/multi-stage-lead-qualification/content.mdx b/docs/case_studies/multi-stage-lead-qualification/content.mdx index 6594ef6c..17e9dc67 100644 --- a/docs/case_studies/multi-stage-lead-qualification/content.mdx +++ b/docs/case_studies/multi-stage-lead-qualification/content.mdx @@ -20,7 +20,7 @@ Then filter results to funds scoring >= 50, re-upload, and run additional stages [Add the everyrow connector if you haven't already.](/claude-ai) Then upload a CSV of 20 investment funds and ask Claude: -> I have a CSV of 20 investment funds. Run this pipeline: 1. Score each fund 0-100 on likelihood to adopt research tools. 2. Filter to funds scoring >= 50. 3. For remaining funds, estimate their investment team size. 4. Final screen: include if score >= 70 OR team size <= 5. +> I have a CSV of 20 investment funds. Run this pipeline: 1. Score each fund 0-100 on likelihood to adopt research tools. 2. Filter to funds scoring >= 50. 3. For remaining funds, estimate their investment team size. 4. Final screen: include if score >= 70 OR team size <= 5. 14 of 20 funds qualified after the three-stage pipeline. Results take about 4 minutes. From ad04a5ed70dc0d039c05326c7e6f17362ff5e793 Mon Sep 17 00:00:00 2001 From: Dan Schwarz Date: Tue, 3 Mar 2026 17:07:33 -0800 Subject: [PATCH 7/9] Docs site overhaul: tab-based install selector, fix internal links, reorganize sidebar - Make InstallationTabs the top element on docs homepage (remove hero/grid) - Add Claude.ai, Claude Cowork to platform selector; remove Claude Desktop - Add TabContent for all platforms (was missing python-sdk, claude-code, claude-desktop) - Fix 80 internal links missing /docs prefix across 30 files - Reorganize sidebar: rename "Get Started" to "Installation", move Skill and MCP Server into it - Add GitHub icon and tagline to sidebar logo - Rework skill page: correct install commands, clarify relationship to MCP - Rename Python SDK page title from "Getting Started" - Move dependencies info into relevant tab content only Co-Authored-By: Claude Opus 4.6 --- docs-site/src/app/globals.css | 22 +++ docs-site/src/app/page.tsx | 108 +-------------- docs-site/src/components/InstallationTabs.tsx | 16 ++- docs-site/src/components/Sidebar.tsx | 18 ++- docs-site/src/utils/docs.ts | 9 +- docs/active-learning-llm-oracle.mdx | 6 +- docs/add-column-web-lookup.mdx | 4 +- .../dedupe-crm-company-records/content.mdx | 4 +- .../llm-powered-merging-at-scale/content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- .../content.mdx | 4 +- docs/classify-dataframe-rows-llm.mdx | 4 +- docs/claude-ai.md | 2 +- docs/claude-code.md | 2 +- docs/deduplicate-training-data-ml.mdx | 4 +- docs/filter-dataframe-with-llm.mdx | 4 +- docs/fuzzy-join-without-keys.mdx | 4 +- docs/getting-started.md | 22 +-- docs/installation.mdx | 125 ++++++++++++++---- docs/mcp-server.md | 2 +- docs/rank-by-external-metric.mdx | 4 +- docs/resolve-entities-python.mdx | 4 +- docs/scale-deduplication-20k-rows.mdx | 6 +- docs/skills-vs-mcp.mdx | 65 +++------ 35 files changed, 240 insertions(+), 251 deletions(-) diff --git a/docs-site/src/app/globals.css b/docs-site/src/app/globals.css index e639da2a..90d7af96 100644 --- a/docs-site/src/app/globals.css +++ b/docs-site/src/app/globals.css @@ -53,11 +53,33 @@ a:hover { .docs-sidebar-logo { margin-bottom: 2rem; +} + +.docs-sidebar-logo-row { display: flex; align-items: center; gap: 0.5rem; } +.docs-sidebar-tagline { + font-family: var(--font-inter), -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + font-size: 0.75rem; + color: var(--text-muted); + margin-top: 0.25rem; +} + +.docs-sidebar-github { + color: var(--text-muted); + text-decoration: none; + display: flex; + align-items: center; + margin-left: auto; +} + +.docs-sidebar-github:hover { + color: var(--text-primary); +} + .docs-sidebar-logo-text { font-family: var(--font-jetbrains), "JetBrains Mono", ui-monospace, monospace; font-size: 1.125rem; diff --git a/docs-site/src/app/page.tsx b/docs-site/src/app/page.tsx index 05fc91c3..4c440d9f 100644 --- a/docs-site/src/app/page.tsx +++ b/docs-site/src/app/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import Link from "next/link"; import { DocsLayout } from "@/components/DocsLayout"; -import { getNavigation, getDocBySlug, type NavSection } from "@/utils/docs"; +import { getNavigation, getDocBySlug } from "@/utils/docs"; import { MDXContent } from "@/components/MDXContent"; export const metadata: Metadata = { @@ -20,121 +20,17 @@ export const metadata: Metadata = { }, }; -const SECTION_ICONS: Record = { - "Get Started": "rocket", - Guides: "book", - "API Reference": "code", - "Case Studies": "lightbulb", -}; - -const SECTION_DESCRIPTIONS: Record = { - "Get Started": "Set up EveryRow in Claude.ai, Claude Code, and more", - Guides: "Step-by-step tutorials for web research at scale", - "API Reference": "API reference for all everyrow operations", - "Case Studies": "Real-world examples with verified results", -}; - -const SECTION_LINKS: Record = { - "Get Started": "/claude-ai", - "API Reference": "/api", - Guides: "/guides", - "Case Studies": "/case-studies", -}; - -function SectionCard({ section }: { section: NavSection }) { - const icon = SECTION_ICONS[section.title] || "file"; - const description = SECTION_DESCRIPTIONS[section.title] || ""; - const firstItem = section.items[0]; - - if (!firstItem) return null; - - const href = SECTION_LINKS[section.title] || `/${firstItem.slug}`; - - return ( - -
- {icon === "rocket" && ( - - - - - - - )} - {icon === "book" && ( - - - - )} - {icon === "code" && ( - - - - - )} - {icon === "lightbulb" && ( - - - - - - )} -
-

{section.title}

-

{description}

-
- {section.items.length} {section.items.length === 1 ? "page" : "pages"} -
- - ); -} - export default async function DocsHome() { const navigation = getNavigation(); const installationDoc = getDocBySlug("installation"); return ( -
-

everyrow documentation

-

- A researcher for every row -

-
- -
- {navigation - .filter((section) => section.title !== "Overview") - .map((section) => ( - - ))} -
- {installationDoc && ( )} -
+

For Autonomous Agents

The best way to use EveryRow to help your user is natively where you are currently working. diff --git a/docs-site/src/components/InstallationTabs.tsx b/docs-site/src/components/InstallationTabs.tsx index 382a51a6..3d097041 100644 --- a/docs-site/src/components/InstallationTabs.tsx +++ b/docs-site/src/components/InstallationTabs.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, createContext, useContext, ReactNode } from "react"; -type Agent = "python-sdk" | "claude-code" | "claude-desktop" | "codex" | "gemini" | "cursor"; +type Agent = "claude-ai" | "claude-code" | "claude-cowork" | "python-sdk" | "codex" | "gemini" | "cursor"; type IntegrationType = "pip" | "uv" | "skills" | "mcp" | "plugin"; interface TabContextValue { @@ -14,9 +14,10 @@ interface TabContextValue { const TabContext = createContext(null); const AGENTS: { id: Agent; label: string }[] = [ - { id: "python-sdk", label: "Python SDK" }, + { id: "claude-ai", label: "Claude.ai" }, { id: "claude-code", label: "Claude Code" }, - { id: "claude-desktop", label: "Claude Desktop" }, + { id: "claude-cowork", label: "Claude Cowork" }, + { id: "python-sdk", label: "Python SDK" }, { id: "codex", label: "Codex" }, { id: "gemini", label: "Gemini" }, { id: "cursor", label: "Cursor" }, @@ -32,9 +33,10 @@ const TYPES: { id: IntegrationType; label: string }[] = [ // Which integration types are available for each agent const AGENT_TYPES: Record = { + "claude-ai": ["mcp"], + "claude-code": ["mcp", "plugin"], + "claude-cowork": ["mcp"], "python-sdk": ["pip", "uv"], - "claude-code": ["plugin", "mcp"], - "claude-desktop": ["mcp"], "codex": ["skills", "mcp"], "gemini": ["skills", "mcp", "plugin"], "cursor": ["skills", "mcp"], @@ -59,8 +61,8 @@ interface InstallationTabsProps { } export function InstallationTabs({ children }: InstallationTabsProps) { - const [selectedAgent, setSelectedAgent] = useState("python-sdk"); - const [selectedType, setSelectedType] = useState("pip"); + const [selectedAgent, setSelectedAgent] = useState("claude-ai"); + const [selectedType, setSelectedType] = useState("mcp"); // Read hash on mount (client-side only, after hydration) useEffect(() => { diff --git a/docs-site/src/components/Sidebar.tsx b/docs-site/src/components/Sidebar.tsx index facd8243..8103aaf5 100644 --- a/docs-site/src/components/Sidebar.tsx +++ b/docs-site/src/components/Sidebar.tsx @@ -20,8 +20,22 @@ export function Sidebar({ navigation, isOpen, onClose }: SidebarProps) { return (