Skip to content

Commit 05afc3f

Browse files
committed
Make MCP stdio clean for Glama
1 parent f41ee03 commit 05afc3f

2 files changed

Lines changed: 38 additions & 13 deletions

File tree

src/sage/mcp/__init__.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,25 @@
1-
"""MCP server integration for SAGE."""
1+
"""MCP server integration for SAGE.
22
3-
from .server import MCPServer
4-
from .tools import SAGE_TOOLS
3+
The package keeps imports lazy so ``python -m sage.mcp.server`` starts with a
4+
clean module state. Eagerly importing ``sage.mcp.server`` from here causes
5+
Python's runpy module to emit a RuntimeWarning before the MCP stdio server
6+
starts, which is noisy for strict MCP registry and Glama checks.
7+
"""
8+
9+
from __future__ import annotations
10+
11+
from typing import Any
512

613
__all__ = ["MCPServer", "SAGE_TOOLS"]
14+
15+
16+
def __getattr__(name: str) -> Any:
17+
if name == "MCPServer":
18+
from .server import MCPServer
19+
20+
return MCPServer
21+
if name == "SAGE_TOOLS":
22+
from .tools import SAGE_TOOLS
23+
24+
return SAGE_TOOLS
25+
raise AttributeError(name)

src/sage/mcp/server.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
MIN_IDLE_TIMEOUT_SECONDS = 10
4545

4646

47+
def _verbose_stderr_enabled() -> bool:
48+
return os.getenv("SAGE_MCP_VERBOSE", "").strip().lower() in {"1", "true", "yes", "on"}
49+
50+
4751
def _mcp_idle_timeout() -> int:
4852
"""Return the MCP stdio idle timeout.
4953
@@ -169,11 +173,12 @@ def _idle_watchdog(self) -> None:
169173
time.sleep(1)
170174
if time.monotonic() - self._last_activity < self.idle_timeout:
171175
continue
172-
print(
173-
f"[SAGE MCP Server] idle for {self.idle_timeout}s; exiting",
174-
file=sys.stderr,
175-
flush=True,
176-
)
176+
if _verbose_stderr_enabled():
177+
print(
178+
f"[SAGE MCP Server] idle for {self.idle_timeout}s; exiting",
179+
file=sys.stderr,
180+
flush=True,
181+
)
177182
self._running = False
178183
self._remove_session()
179184
os._exit(0)
@@ -274,11 +279,12 @@ def run(self):
274279
self._cleanup_session_records()
275280
self._write_session()
276281
self._start_idle_watchdog()
277-
print(
278-
f"[SAGE MCP Server] stdio ready (idle timeout {self.idle_timeout}s)",
279-
file=sys.stderr,
280-
flush=True,
281-
)
282+
if _verbose_stderr_enabled():
283+
print(
284+
f"[SAGE MCP Server] stdio ready (idle timeout {self.idle_timeout}s)",
285+
file=sys.stderr,
286+
flush=True,
287+
)
282288

283289
try:
284290
for line in sys.stdin:

0 commit comments

Comments
 (0)