diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index ec7956cc..171e03e0 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ "name": "everyrow", "source": "./", "description": "Give Claude Code a research team. Forecast, score, classify, or research every row of a dataset.", - "version": "0.4.1" + "version": "0.4.2" } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 9d3419e3..346f64b2 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "everyrow", "description": "Give Claude Code a research team. Forecast, score, classify, or research every row of a dataset.", - "version": "0.4.1", + "version": "0.4.2", "author": { "name": "FutureSearch" }, diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 00000000..2b3e1abc --- /dev/null +++ b/.mcp.json @@ -0,0 +1,17 @@ +{ + "mcpServers": { + "everyrow-local": { + "type": "stdio", + "command": "uv", + "args": [ + "--directory", + "/Users/danschwarz/dev/everyrow-sdk-classify/everyrow-mcp", + "run", + "/Users/danschwarz/dev/everyrow-sdk-classify/everyrow-mcp/src/everyrow_mcp/server.py" + ], + "env": { + "EVERYROW_API_KEY": "${EVERYROW_API_KEY}" + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index 60819456..c004f2c6 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), as 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/scripts/check-links.py b/docs-site/scripts/check-links.py index 936ad876..537bf7d1 100644 --- a/docs-site/scripts/check-links.py +++ b/docs-site/scripts/check-links.py @@ -82,6 +82,10 @@ "https://www.kaggle.com/datasets/tunguz/pubmed-title-abstracts-2019-baseline", "https://arxiv.org/abs/2506.21558", "https://arxiv.org/abs/2506.06287", + "https://claude.ai/download", + "https://app.everyrow.com", + "https://docs.google.com/spreadsheets/d/abc123/edit", + "https://support.claude.com/en/articles/13345190-get-started-with-cowork", } 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 fdf4095b..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,144 +20,33 @@ export const metadata: Metadata = { }, }; -const SECTION_ICONS: Record = { - Guides: "book", - "API Reference": "code", - "Case Studies": "lightbulb", -}; - -const SECTION_DESCRIPTIONS: Record = { - 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 = { - "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 === "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

-
    -
  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/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 (