44from types import SimpleNamespace
55
66import pytest
7+ from mcp .server .fastmcp import FastMCP
78from mcp .shared .exceptions import McpError
8- from mcp .types import ErrorData
9+ from mcp .types import ErrorData , ToolAnnotations
910from telethon .tl .types import Channel , Chat , PeerUser , User
1011
1112import main
@@ -24,6 +25,60 @@ def __init__(self, *args, **kwargs):
2425 self .kwargs = kwargs
2526
2627
28+ def _tool_names (server ):
29+ return {tool .name for tool in server ._tool_manager .list_tools ()}
30+
31+
32+ def _synthetic_mcp ():
33+ server = FastMCP ("test" )
34+
35+ @server .tool (annotations = ToolAnnotations (title = "Read" , readOnlyHint = True ))
36+ def read_tool ():
37+ return "read"
38+
39+ @server .tool (annotations = ToolAnnotations (title = "Write" , destructiveHint = True ))
40+ def write_tool ():
41+ return "write"
42+
43+ return server
44+
45+
46+ def test_get_exposed_tools_mode_defaults_to_all (monkeypatch ):
47+ monkeypatch .delenv ("TELEGRAM_EXPOSED_TOOLS" , raising = False )
48+
49+ assert runtime ._get_exposed_tools_mode () == "all"
50+
51+
52+ def test_apply_exposed_tools_all_keeps_tools ():
53+ server = _synthetic_mcp ()
54+
55+ removed = runtime ._apply_exposed_tools_mode (server , "all" )
56+
57+ assert removed == []
58+ assert _tool_names (server ) == {"read_tool" , "write_tool" }
59+
60+
61+ def test_apply_exposed_tools_read_only_removes_non_read_only_tools ():
62+ server = _synthetic_mcp ()
63+
64+ removed = runtime ._apply_exposed_tools_mode (server , "read-only" )
65+
66+ assert removed == ["write_tool" ]
67+ assert _tool_names (server ) == {"read_tool" }
68+
69+
70+ def test_get_exposed_tools_mode_rejects_invalid_value (monkeypatch ):
71+ monkeypatch .setenv ("TELEGRAM_EXPOSED_TOOLS" , "send-everything" )
72+
73+ with pytest .raises (SystemExit ) as excinfo :
74+ runtime ._get_exposed_tools_mode ()
75+
76+ message = str (excinfo .value )
77+ assert "TELEGRAM_EXPOSED_TOOLS" in message
78+ assert "all" in message
79+ assert "read-only" in message
80+
81+
2782def test_discover_accounts_supports_suffixed_and_default_sessions (monkeypatch ):
2883 _clear_session_env (monkeypatch )
2984 monkeypatch .setenv ("TELEGRAM_SESSION_STRING_WORK" , "work-session" )
0 commit comments