Skip to content

Commit 132fa95

Browse files
RafaelPoclaude
andcommitted
Gate sheets tools behind ENABLE_SHEETS_TOOLS env flag
Sheets tools were always registered in HTTP mode and removed in stdio. Now they're opt-in via `enable_sheets_tools` (default False), so HTTP deployments without Google OAuth configured don't expose them either. Also strips `output_spreadsheet_title` from the HTTP results schema when sheets are disabled. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3e3001d commit 132fa95

3 files changed

Lines changed: 17 additions & 14 deletions

File tree

everyrow-mcp/src/everyrow_mcp/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ class Settings(BaseSettings):
108108
description="Maximum response size when fetching CSV from a URL (50 MB).",
109109
)
110110

111+
enable_sheets_tools: bool = Field(
112+
default=False,
113+
description="Enable Google Sheets tools (requires HTTP mode with Google OAuth)",
114+
)
111115
everyrow_api_key: str | None = Field(default=None, repr=False)
112116
google_sheets_credentials_json: str | None = Field(
113117
default=None,

everyrow-mcp/src/everyrow_mcp/server.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from pydantic import BaseModel
1010

11-
import everyrow_mcp.sheets_tools
1211
import everyrow_mcp.tools # noqa: F401 — registers @mcp.tool() decorators
1312
from everyrow_mcp.app import get_instructions, mcp
1413
from everyrow_mcp.config import settings
@@ -21,6 +20,10 @@
2120
)
2221
from everyrow_mcp.uploads import register_upload_tool
2322

23+
# Only register sheets tools when enabled (requires HTTP mode + Google OAuth)
24+
if settings.enable_sheets_tools:
25+
import everyrow_mcp.sheets_tools # noqa: F401
26+
2427

2528
class InputArgs(BaseModel):
2629
http: bool = False
@@ -93,6 +96,13 @@ def main():
9396
meta=_RESULTS_META,
9497
)(everyrow_results_http)
9598

99+
# Strip output_spreadsheet_title from results schema when sheets disabled
100+
if not settings.enable_sheets_tools:
101+
tool = mcp._tool_manager.get_tool("everyrow_results")
102+
if tool:
103+
http_def = tool.parameters.get("$defs", {}).get("HttpResultsInput", {})
104+
http_def.get("properties", {}).pop("output_spreadsheet_title", None)
105+
96106
if input_args.http:
97107
register_upload_tool(mcp)
98108

@@ -123,17 +133,6 @@ def main():
123133
logging.error("Get an API key at https://everyrow.io/api-key")
124134
sys.exit(1)
125135

126-
# Sheets tools require HTTP mode (OAuth provides the Google token).
127-
# Remove them from the tool manager so they don't appear in list_tools().
128-
for name in (
129-
"sheets_list",
130-
"sheets_read",
131-
"sheets_write",
132-
"sheets_create",
133-
"sheets_info",
134-
):
135-
mcp._tool_manager.remove_tool(name)
136-
137136
mcp.run(transport=transport.value)
138137

139138

everyrow-mcp/tests/test_mcp_e2e.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ def _fake_access_token():
5151

5252
@pytest.fixture
5353
def _http_state(fake_redis):
54-
"""Configure settings for HTTP mode and patch Redis."""
54+
"""Configure settings for HTTP mode with sheets tools and patch Redis."""
5555
with (
56-
override_settings(transport="streamable-http"),
56+
override_settings(transport="streamable-http", enable_sheets_tools=True),
5757
patch.object(redis_store, "get_redis_client", return_value=fake_redis),
5858
patch("everyrow_mcp.tools.get_access_token", _fake_access_token),
5959
patch("everyrow_mcp.tool_helpers.get_access_token", _fake_access_token),

0 commit comments

Comments
 (0)