Skip to content

Commit 8b88b59

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 e2216b0 commit 8b88b59

3 files changed

Lines changed: 20 additions & 13 deletions

File tree

everyrow-mcp/src/everyrow_mcp/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ class Settings(BaseSettings):
121121
description="Upload rate limit sliding window in seconds (1 hour)",
122122
)
123123

124+
enable_sheets_tools: bool = Field(
125+
default=False,
126+
description="Enable Google Sheets tools (requires HTTP mode with Google OAuth)",
127+
)
124128
everyrow_api_key: str | None = Field(default=None, repr=False)
125129
google_sheets_credentials_json: str | None = Field(
126130
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
# ── HTTP mode logging ──────────────────────────────────────
98108
# INFO level so operational events show up in Cloud Logging.
@@ -136,17 +146,6 @@ def main():
136146
logging.error("Get an API key at https://everyrow.io/api-key")
137147
sys.exit(1)
138148

139-
# Sheets tools require HTTP mode (OAuth provides the Google token).
140-
# Remove them from the tool manager so they don't appear in list_tools().
141-
for name in (
142-
"sheets_list",
143-
"sheets_read",
144-
"sheets_write",
145-
"sheets_create",
146-
"sheets_info",
147-
):
148-
mcp._tool_manager.remove_tool(name)
149-
150149
mcp.run(transport=transport.value)
151150

152151

everyrow-mcp/tests/test_mcp_e2e.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ def _http_state(fake_redis):
7070
)(everyrow_results_http)
7171

7272
with (
73-
override_settings(transport="streamable-http", upload_secret="test-secret"),
73+
override_settings(
74+
transport="streamable-http",
75+
upload_secret="test-secret",
76+
enable_sheets_tools=True,
77+
),
7478
patch.object(redis_store, "get_redis_client", return_value=fake_redis),
7579
patch("everyrow_mcp.tools.get_access_token", _fake_access_token),
7680
patch("everyrow_mcp.tool_helpers.get_access_token", _fake_access_token),

0 commit comments

Comments
 (0)