everyrow-mcp 0.1.9__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/.gitignore +9 -0
- everyrow_mcp-0.2.0/.mcpbignore +13 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/PKG-INFO +20 -4
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/README.md +19 -3
- everyrow_mcp-0.2.0/manifest.json +70 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/pyproject.toml +1 -1
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/server.json +2 -2
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/src/everyrow_mcp/server.py +15 -2
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/uv.lock +3 -3
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/src/everyrow_mcp/__init__.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/src/everyrow_mcp/utils.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/tests/__init__.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/tests/conftest.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/tests/test_integration.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/tests/test_server.py +0 -0
- {everyrow_mcp-0.1.9 → everyrow_mcp-0.2.0}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: everyrow-mcp
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: MCP server for everyrow: agent ops at spreadsheet scale
|
|
5
5
|
Requires-Python: >=3.12
|
|
6
6
|
Requires-Dist: everyrow>=0.1.5
|
|
@@ -17,11 +17,27 @@ This server exposes everyrow's 5 core operations as MCP tools, allowing LLM appl
|
|
|
17
17
|
|
|
18
18
|
**All tools operate on local CSV files.** Provide absolute file paths as input, and transformed results are written to new CSV files at your specified output path.
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Installation
|
|
21
21
|
|
|
22
22
|
The server requires an everyrow API key. Get one at [everyrow.io/api-key](https://everyrow.io/api-key) ($20 free credit).
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
### Claude Desktop
|
|
25
|
+
|
|
26
|
+
Download the latest `.mcpb` bundle from the [GitHub Releases](https://github.com/futuresearch/everyrow-sdk/releases) page and double-click to install in Claude Desktop. You'll be prompted to enter your everyrow API key during setup.
|
|
27
|
+
|
|
28
|
+
> **Note:** The MCPB bundle works in Claude Desktop's **Chat** mode. Due to a [known limitation](https://github.com/anthropics/claude-code/issues/20377), local MCP servers are not currently exposed in Cowork mode.
|
|
29
|
+
|
|
30
|
+
### Cursor
|
|
31
|
+
Set the environment variable in your terminal shell before opening cursor. You may need to re-open cursor from your shell after this. Alternatively, hardcode the api key within cursor settings instead of the hard-coded `${env:EVERYROW_API_KEY}`
|
|
32
|
+
```bash
|
|
33
|
+
export EVERYROW_API_KEY=your_key_here
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=everyrow&config=eyJlbnYiOnsiRVZFUllST1dfQVBJX0tFWSI6IiR7ZW52OkVWRVJZUk9XX0FQSV9LRVl9In0sImNvbW1hbmQiOiJ1dnggZXZlcnlyb3ctbWNwIn0%3D)
|
|
37
|
+
|
|
38
|
+
### Manual Config
|
|
39
|
+
|
|
40
|
+
Either set the API key in your shell environment as mentioned above, or hardcode it directly in the config below. Environment variable interpolation may differ between MCP clients.
|
|
25
41
|
|
|
26
42
|
```bash
|
|
27
43
|
export EVERYROW_API_KEY=your_key_here
|
|
@@ -140,7 +156,7 @@ cd everyrow-mcp
|
|
|
140
156
|
uv sync
|
|
141
157
|
uv run pytest
|
|
142
158
|
```
|
|
143
|
-
For MCP registry publishing:
|
|
159
|
+
For MCP [registry publishing](https://modelcontextprotocol.info/tools/registry/publishing/#package-deployment):
|
|
144
160
|
|
|
145
161
|
mcp-name: io.github.futuresearch/everyrow-mcp
|
|
146
162
|
|
|
@@ -6,11 +6,27 @@ This server exposes everyrow's 5 core operations as MCP tools, allowing LLM appl
|
|
|
6
6
|
|
|
7
7
|
**All tools operate on local CSV files.** Provide absolute file paths as input, and transformed results are written to new CSV files at your specified output path.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Installation
|
|
10
10
|
|
|
11
11
|
The server requires an everyrow API key. Get one at [everyrow.io/api-key](https://everyrow.io/api-key) ($20 free credit).
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
### Claude Desktop
|
|
14
|
+
|
|
15
|
+
Download the latest `.mcpb` bundle from the [GitHub Releases](https://github.com/futuresearch/everyrow-sdk/releases) page and double-click to install in Claude Desktop. You'll be prompted to enter your everyrow API key during setup.
|
|
16
|
+
|
|
17
|
+
> **Note:** The MCPB bundle works in Claude Desktop's **Chat** mode. Due to a [known limitation](https://github.com/anthropics/claude-code/issues/20377), local MCP servers are not currently exposed in Cowork mode.
|
|
18
|
+
|
|
19
|
+
### Cursor
|
|
20
|
+
Set the environment variable in your terminal shell before opening cursor. You may need to re-open cursor from your shell after this. Alternatively, hardcode the api key within cursor settings instead of the hard-coded `${env:EVERYROW_API_KEY}`
|
|
21
|
+
```bash
|
|
22
|
+
export EVERYROW_API_KEY=your_key_here
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=everyrow&config=eyJlbnYiOnsiRVZFUllST1dfQVBJX0tFWSI6IiR7ZW52OkVWRVJZUk9XX0FQSV9LRVl9In0sImNvbW1hbmQiOiJ1dnggZXZlcnlyb3ctbWNwIn0%3D)
|
|
26
|
+
|
|
27
|
+
### Manual Config
|
|
28
|
+
|
|
29
|
+
Either set the API key in your shell environment as mentioned above, or hardcode it directly in the config below. Environment variable interpolation may differ between MCP clients.
|
|
14
30
|
|
|
15
31
|
```bash
|
|
16
32
|
export EVERYROW_API_KEY=your_key_here
|
|
@@ -129,7 +145,7 @@ cd everyrow-mcp
|
|
|
129
145
|
uv sync
|
|
130
146
|
uv run pytest
|
|
131
147
|
```
|
|
132
|
-
For MCP registry publishing:
|
|
148
|
+
For MCP [registry publishing](https://modelcontextprotocol.info/tools/registry/publishing/#package-deployment):
|
|
133
149
|
|
|
134
150
|
mcp-name: io.github.futuresearch/everyrow-mcp
|
|
135
151
|
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": "0.4",
|
|
3
|
+
"name": "everyrow-mcp",
|
|
4
|
+
"display_name": "Everyrow MCP Server",
|
|
5
|
+
"version": "0.2.0",
|
|
6
|
+
"description": "AI-powered dataframe ops: transform, dedupe, merge, rank, and screen with natural language",
|
|
7
|
+
"long_description": "MCP server for everyrow: 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. All tools operate on local CSV files.",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "FutureSearch",
|
|
10
|
+
"url": "https://everyrow.io"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/futuresearch/everyrow-sdk.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://everyrow.io",
|
|
17
|
+
"documentation": "https://github.com/futuresearch/everyrow-sdk/tree/main/everyrow-mcp",
|
|
18
|
+
"support": "https://github.com/futuresearch/everyrow-sdk/issues",
|
|
19
|
+
"server": {
|
|
20
|
+
"type": "uv",
|
|
21
|
+
"entry_point": "src/everyrow_mcp/server.py",
|
|
22
|
+
"mcp_config": {
|
|
23
|
+
"command": "uv",
|
|
24
|
+
"args": ["run", "${__dirname}/src/everyrow_mcp/server.py"],
|
|
25
|
+
"env": {
|
|
26
|
+
"EVERYROW_API_KEY": "${user_config.api_key}"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"tools": [
|
|
31
|
+
{
|
|
32
|
+
"name": "everyrow_screen",
|
|
33
|
+
"description": "Filter CSV rows based on criteria that require judgment"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "everyrow_rank",
|
|
37
|
+
"description": "Score and sort CSV rows based on qualitative criteria"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "everyrow_dedupe",
|
|
41
|
+
"description": "Remove duplicate rows using semantic equivalence"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "everyrow_merge",
|
|
45
|
+
"description": "Join two CSV files using intelligent entity matching"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "everyrow_agent",
|
|
49
|
+
"description": "Run web research agents on each row of a CSV"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"user_config": {
|
|
53
|
+
"api_key": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"title": "Everyrow API Key",
|
|
56
|
+
"description": "Your API key from https://everyrow.io/api-key ($20 free credit)",
|
|
57
|
+
"sensitive": true,
|
|
58
|
+
"required": true
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"compatibility": {
|
|
62
|
+
"platforms": ["darwin", "linux", "win32"],
|
|
63
|
+
"runtimes": {
|
|
64
|
+
"python": ">=3.12"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"keywords": ["everyrow", "dataframe", "csv", "ai", "data-processing", "dedupe", "merge", "rank", "screen"],
|
|
68
|
+
"license": "MIT",
|
|
69
|
+
"privacy_policies": ["https://futuresearch.ai/privacy/"]
|
|
70
|
+
}
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"subfolder": "everyrow-mcp"
|
|
10
10
|
},
|
|
11
11
|
"websiteUrl": "https://github.com/futuresearch/everyrow-sdk/tree/main/everyrow-mcp",
|
|
12
|
-
"version": "0.
|
|
12
|
+
"version": "0.2.0",
|
|
13
13
|
"packages": [
|
|
14
14
|
{
|
|
15
15
|
"registryType": "pypi",
|
|
16
16
|
"registryBaseUrl": "https://pypi.org",
|
|
17
17
|
"identifier": "everyrow-mcp",
|
|
18
|
-
"version": "0.
|
|
18
|
+
"version": "0.2.0",
|
|
19
19
|
"runtimeHint": "uvx",
|
|
20
20
|
"transport": {
|
|
21
21
|
"type": "stdio"
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"""MCP server for everyrow SDK operations."""
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import logging
|
|
4
5
|
import os
|
|
5
6
|
import sys
|
|
6
7
|
from contextlib import asynccontextmanager
|
|
7
|
-
from typing import Any
|
|
8
|
+
from typing import Any, Literal
|
|
8
9
|
|
|
9
10
|
import pandas as pd
|
|
10
11
|
from everyrow.api_utils import create_client
|
|
@@ -30,7 +31,6 @@ async def lifespan(_server: FastMCP):
|
|
|
30
31
|
response = await whoami(client=c)
|
|
31
32
|
if response is None:
|
|
32
33
|
raise RuntimeError("Failed to authenticate with everyrow API")
|
|
33
|
-
print("everyrow-mcp: Authenticated successfully")
|
|
34
34
|
except Exception as e:
|
|
35
35
|
raise RuntimeError(f"everyrow-mcp startup failed: {e}") from e
|
|
36
36
|
|
|
@@ -354,6 +354,10 @@ class MergeInput(BaseModel):
|
|
|
354
354
|
description="Optional column name in the right table to use as the merge key. "
|
|
355
355
|
"If not provided, the LLM will determine the best matching strategy.",
|
|
356
356
|
)
|
|
357
|
+
use_web_search: Literal["auto", "yes", "no"] | None = Field(
|
|
358
|
+
default=None,
|
|
359
|
+
description='Optional. Control web search behavior: "auto" tries LLM merge first then conditionally searches, "no" skips web search entirely, "yes" forces web search on every row. Defaults to "auto" if not provided.',
|
|
360
|
+
)
|
|
357
361
|
|
|
358
362
|
@field_validator("left_csv", "right_csv")
|
|
359
363
|
@classmethod
|
|
@@ -395,6 +399,7 @@ async def everyrow_merge(params: MergeInput) -> str:
|
|
|
395
399
|
right_table=right_df,
|
|
396
400
|
merge_on_left=params.merge_on_left,
|
|
397
401
|
merge_on_right=params.merge_on_right,
|
|
402
|
+
use_web_search=params.use_web_search,
|
|
398
403
|
)
|
|
399
404
|
|
|
400
405
|
output_file = resolve_output_path(params.output_path, params.left_csv, "merged")
|
|
@@ -539,6 +544,14 @@ def _schema_to_model(name: str, schema: dict[str, Any]) -> type[BaseModel]:
|
|
|
539
544
|
|
|
540
545
|
def main():
|
|
541
546
|
"""Run the MCP server."""
|
|
547
|
+
# Configure logging to use stderr only (stdout is reserved for JSON-RPC)
|
|
548
|
+
logging.basicConfig(
|
|
549
|
+
level=logging.WARNING,
|
|
550
|
+
stream=sys.stderr,
|
|
551
|
+
format="%(levelname)s: %(message)s",
|
|
552
|
+
force=True,
|
|
553
|
+
)
|
|
554
|
+
|
|
542
555
|
# Check for API key before starting
|
|
543
556
|
if "EVERYROW_API_KEY" not in os.environ:
|
|
544
557
|
print(
|
|
@@ -214,7 +214,7 @@ wheels = [
|
|
|
214
214
|
|
|
215
215
|
[[package]]
|
|
216
216
|
name = "everyrow-mcp"
|
|
217
|
-
version = "0.1.
|
|
217
|
+
version = "0.1.9"
|
|
218
218
|
source = { editable = "." }
|
|
219
219
|
dependencies = [
|
|
220
220
|
{ name = "everyrow" },
|
|
@@ -972,8 +972,8 @@ name = "uvicorn"
|
|
|
972
972
|
version = "0.40.0"
|
|
973
973
|
source = { registry = "https://pypi.org/simple" }
|
|
974
974
|
dependencies = [
|
|
975
|
-
{ name = "click" },
|
|
976
|
-
{ name = "h11" },
|
|
975
|
+
{ name = "click", marker = "sys_platform != 'emscripten'" },
|
|
976
|
+
{ name = "h11", marker = "sys_platform != 'emscripten'" },
|
|
977
977
|
]
|
|
978
978
|
sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" }
|
|
979
979
|
wheels = [
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|