Skip to content

Commit 79670a4

Browse files
authored
chore: bump all deps (sparfenyuk#38)
1 parent b4f3533 commit 79670a4

File tree

7 files changed

+168
-162
lines changed

7 files changed

+168
-162
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ Check the `mcp-proxy` server by running it with the `mcp-server-fetch` server. Y
269269
mcp-proxy --sse-port=8080 uvx mcp-server-fetch &
270270
271271
# Connect to the SSE proxy server spawned above using another instance of mcp-proxy given the URL of the SSE server
272-
mcp-proxy http://localhost:8080/sse
272+
mcp-proxy http://127.0.0.1:8080/sse
273273
274274
# Send CTRL+C to stop the second server
275275

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ classifiers = [
2525
"Topic :: Utilities",
2626
"Typing :: Typed",
2727
]
28-
version = "0.5.0"
28+
version = "0.5.1"
2929
requires-python = ">=3.10"
30-
dependencies = ["mcp>=1.2.0,<2", "uvicorn>=0.34.0"]
30+
dependencies = ["mcp>=1.5.0,<2", "uvicorn>=0.34.0"]
3131

3232
[build-system]
3333
requires = ["setuptools"]

src/mcp_proxy/proxy_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
from mcp.client.session import ClientSession
1010

1111

12-
async def create_proxy_server(remote_app: ClientSession) -> server.Server: # noqa: C901
12+
async def create_proxy_server(remote_app: ClientSession) -> server.Server[object]: # noqa: C901
1313
"""Create a server instance from a remote app."""
1414
response = await remote_app.initialize()
1515
capabilities = response.capabilities
1616

17-
app = server.Server(response.serverInfo.name)
17+
app: server.Server[object] = server.Server(name=response.serverInfo.name)
1818

1919
if capabilities.prompts:
2020

src/mcp_proxy/sse_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class SseServerSettings:
2828

2929

3030
def create_starlette_app(
31-
mcp_server: Server,
31+
mcp_server: Server[object],
3232
*,
3333
allow_origins: list[str] | None = None,
3434
debug: bool = False,

tests/test_proxy_server.py

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
The same test code is run on both to ensure parity.
1010
"""
1111

12+
import typing as t
1213
from collections.abc import AsyncGenerator, Awaitable, Callable
1314
from contextlib import AbstractAsyncContextManager, asynccontextmanager
1415
from unittest.mock import AsyncMock
@@ -25,14 +26,14 @@
2526

2627
TOOL_INPUT_SCHEMA = {"type": "object", "properties": {"input1": {"type": "string"}}}
2728

28-
SessionContextManager = Callable[[Server], AbstractAsyncContextManager[ClientSession]]
29+
SessionContextManager = Callable[[Server[object]], AbstractAsyncContextManager[ClientSession]]
2930

3031
# Direct server connection
3132
in_memory: SessionContextManager = create_connected_server_and_client_session
3233

3334

3435
@asynccontextmanager
35-
async def proxy(server: Server) -> AsyncGenerator[ClientSession, None]:
36+
async def proxy(server: Server[object]) -> AsyncGenerator[ClientSession, None]:
3637
"""Create a connection to the server through the proxy server."""
3738
async with in_memory(server) as session:
3839
wrapped_server = await create_proxy_server(session)
@@ -49,16 +50,16 @@ def session_generator(request: pytest.FixtureRequest) -> SessionContextManager:
4950

5051

5152
@pytest.fixture
52-
def server() -> Server:
53+
def server() -> Server[object]:
5354
"""Return a server instance."""
5455
return Server("test-server")
5556

5657

5758
@pytest.fixture
58-
def server_can_list_prompts(server: Server, prompt: types.Prompt) -> Server:
59+
def server_can_list_prompts(server: Server[object], prompt: types.Prompt) -> Server[object]:
5960
"""Return a server instance with prompts."""
6061

61-
@server.list_prompts()
62+
@server.list_prompts() # type: ignore[no-untyped-call,misc]
6263
async def _() -> list[types.Prompt]:
6364
return [prompt]
6465

@@ -67,39 +68,42 @@ async def _() -> list[types.Prompt]:
6768

6869
@pytest.fixture
6970
def server_can_get_prompt(
70-
server_can_list_prompts: Server,
71+
server_can_list_prompts: Server[object],
7172
prompt_callback: Callable[[str, dict[str, str] | None], Awaitable[types.GetPromptResult]],
72-
) -> Server:
73+
) -> Server[object]:
7374
"""Return a server instance with prompts."""
74-
server_can_list_prompts.get_prompt()(prompt_callback)
75+
server_can_list_prompts.get_prompt()(prompt_callback) # type: ignore[no-untyped-call]
7576

7677
return server_can_list_prompts
7778

7879

7980
@pytest.fixture
80-
def server_can_list_tools(server: Server, tool: types.Tool) -> Server:
81+
def server_can_list_tools(server: Server[object], tool: types.Tool) -> Server[object]:
8182
"""Return a server instance with tools."""
8283

83-
@server.list_tools()
84+
@server.list_tools() # type: ignore[no-untyped-call,misc]
8485
async def _() -> list[types.Tool]:
8586
return [tool]
8687

8788
return server
8889

8990

9091
@pytest.fixture
91-
def server_can_call_tool(server_can_list_tools: Server, tool: Callable[..., ...]) -> Server:
92+
def server_can_call_tool(
93+
server_can_list_tools: Server[object],
94+
tool: Callable[..., t.Any],
95+
) -> Server[object]:
9296
"""Return a server instance with tools."""
93-
server_can_list_tools.call_tool()(tool)
97+
server_can_list_tools.call_tool()(tool) # type: ignore[no-untyped-call]
9498

9599
return server_can_list_tools
96100

97101

98102
@pytest.fixture
99-
def server_can_list_resources(server: Server, resource: types.Resource) -> Server:
103+
def server_can_list_resources(server: Server[object], resource: types.Resource) -> Server[object]:
100104
"""Return a server instance with resources."""
101105

102-
@server.list_resources()
106+
@server.list_resources() # type: ignore[no-untyped-call,misc]
103107
async def _() -> list[types.Resource]:
104108
return [resource]
105109

@@ -108,73 +112,73 @@ async def _() -> list[types.Resource]:
108112

109113
@pytest.fixture
110114
def server_can_subscribe_resource(
111-
server_can_list_resources: Server,
115+
server_can_list_resources: Server[object],
112116
subscribe_callback: Callable[[AnyUrl], Awaitable[None]],
113-
) -> Server:
117+
) -> Server[object]:
114118
"""Return a server instance with resource templates."""
115-
server_can_list_resources.subscribe_resource()(subscribe_callback)
119+
server_can_list_resources.subscribe_resource()(subscribe_callback) # type: ignore[no-untyped-call]
116120

117121
return server_can_list_resources
118122

119123

120124
@pytest.fixture
121125
def server_can_unsubscribe_resource(
122-
server_can_list_resources: Server,
126+
server_can_list_resources: Server[object],
123127
unsubscribe_callback: Callable[[AnyUrl], Awaitable[None]],
124-
) -> Server:
128+
) -> Server[object]:
125129
"""Return a server instance with resource templates."""
126-
server_can_list_resources.unsubscribe_resource()(unsubscribe_callback)
130+
server_can_list_resources.unsubscribe_resource()(unsubscribe_callback) # type: ignore[no-untyped-call]
127131

128132
return server_can_list_resources
129133

130134

131135
@pytest.fixture
132136
def server_can_read_resource(
133-
server_can_list_resources: Server,
137+
server_can_list_resources: Server[object],
134138
resource_callback: Callable[[AnyUrl], Awaitable[str | bytes]],
135-
) -> Server:
139+
) -> Server[object]:
136140
"""Return a server instance with resources."""
137-
server_can_list_resources.read_resource()(resource_callback)
141+
server_can_list_resources.read_resource()(resource_callback) # type: ignore[no-untyped-call]
138142

139143
return server_can_list_resources
140144

141145

142146
@pytest.fixture
143147
def server_can_set_logging_level(
144-
server: Server,
148+
server: Server[object],
145149
logging_level_callback: Callable[[types.LoggingLevel], Awaitable[None]],
146-
) -> Server:
150+
) -> Server[object]:
147151
"""Return a server instance with logging capabilities."""
148-
server.set_logging_level()(logging_level_callback)
152+
server.set_logging_level()(logging_level_callback) # type: ignore[no-untyped-call]
149153

150154
return server
151155

152156

153157
@pytest.fixture
154158
def server_can_send_progress_notification(
155-
server: Server,
156-
) -> Server:
159+
server: Server[object],
160+
) -> Server[object]:
157161
"""Return a server instance with logging capabilities."""
158162
return server
159163

160164

161165
@pytest.fixture
162166
def server_can_complete(
163-
server: Server,
167+
server: Server[object],
164168
complete_callback: Callable[
165169
[types.PromptReference | types.ResourceReference, types.CompletionArgument],
166170
Awaitable[types.Completion | None],
167171
],
168-
) -> Server:
172+
) -> Server[object]:
169173
"""Return a server instance with logging capabilities."""
170-
server.completion()(complete_callback)
174+
server.completion()(complete_callback) # type: ignore[no-untyped-call]
171175
return server
172176

173177

174178
@pytest.mark.parametrize("prompt", [types.Prompt(name="prompt1")])
175179
async def test_list_prompts(
176180
session_generator: SessionContextManager,
177-
server_can_list_prompts: Server,
181+
server_can_list_prompts: Server[object],
178182
prompt: types.Prompt,
179183
) -> None:
180184
"""Test list_prompts."""
@@ -205,7 +209,7 @@ async def test_list_prompts(
205209
)
206210
async def test_list_tools(
207211
session_generator: SessionContextManager,
208-
server_can_list_tools: Server,
212+
server_can_list_tools: Server[object],
209213
tool: types.Tool,
210214
) -> None:
211215
"""Test list_tools."""
@@ -231,7 +235,7 @@ async def test_list_tools(
231235
)
232236
async def test_set_logging_error(
233237
session_generator: SessionContextManager,
234-
server_can_set_logging_level: Server,
238+
server_can_set_logging_level: Server[object],
235239
logging_level_callback: AsyncMock,
236240
log_level: types.LoggingLevel,
237241
) -> None:
@@ -253,7 +257,7 @@ async def test_set_logging_error(
253257
@pytest.mark.parametrize("tool", [AsyncMock()])
254258
async def test_call_tool(
255259
session_generator: SessionContextManager,
256-
server_can_call_tool: Server,
260+
server_can_call_tool: Server[object],
257261
tool: AsyncMock,
258262
) -> None:
259263
"""Test call_tool."""
@@ -287,7 +291,7 @@ async def test_call_tool(
287291
)
288292
async def test_list_resources(
289293
session_generator: SessionContextManager,
290-
server_can_list_resources: Server,
294+
server_can_list_resources: Server[object],
291295
resource: types.Resource,
292296
) -> None:
293297
"""Test get_resource."""
@@ -307,7 +311,7 @@ async def test_list_resources(
307311
@pytest.mark.parametrize("prompt", [types.Prompt(name="prompt1")])
308312
async def test_get_prompt(
309313
session_generator: SessionContextManager,
310-
server_can_get_prompt: Server,
314+
server_can_get_prompt: Server[object],
311315
prompt_callback: AsyncMock,
312316
) -> None:
313317
"""Test get_prompt."""
@@ -334,7 +338,7 @@ async def test_get_prompt(
334338
)
335339
async def test_read_resource(
336340
session_generator: SessionContextManager,
337-
server_can_read_resource: Server,
341+
server_can_read_resource: Server[object],
338342
resource_callback: AsyncMock,
339343
resource: types.Resource,
340344
) -> None:
@@ -361,7 +365,7 @@ async def test_read_resource(
361365
)
362366
async def test_subscribe_resource(
363367
session_generator: SessionContextManager,
364-
server_can_subscribe_resource: Server,
368+
server_can_subscribe_resource: Server[object],
365369
subscribe_callback: AsyncMock,
366370
resource: types.Resource,
367371
) -> None:
@@ -388,7 +392,7 @@ async def test_subscribe_resource(
388392
)
389393
async def test_unsubscribe_resource(
390394
session_generator: SessionContextManager,
391-
server_can_unsubscribe_resource: Server,
395+
server_can_unsubscribe_resource: Server[object],
392396
unsubscribe_callback: AsyncMock,
393397
resource: types.Resource,
394398
) -> None:
@@ -404,7 +408,7 @@ async def test_unsubscribe_resource(
404408

405409
async def test_send_progress_notification(
406410
session_generator: SessionContextManager,
407-
server_can_send_progress_notification: Server,
411+
server_can_send_progress_notification: Server[object],
408412
) -> None:
409413
"""Test send_progress_notification."""
410414
async with session_generator(server_can_send_progress_notification) as session:
@@ -420,7 +424,7 @@ async def test_send_progress_notification(
420424
@pytest.mark.parametrize("complete_callback", [AsyncMock()])
421425
async def test_complete(
422426
session_generator: SessionContextManager,
423-
server_can_complete: Server,
427+
server_can_complete: Server[object],
424428
complete_callback: AsyncMock,
425429
) -> None:
426430
"""Test complete."""
@@ -445,7 +449,7 @@ async def test_complete(
445449
@pytest.mark.parametrize("tool", [AsyncMock()])
446450
async def test_call_tool_with_error(
447451
session_generator: SessionContextManager,
448-
server_can_call_tool: Server,
452+
server_can_call_tool: Server[object],
449453
tool: AsyncMock,
450454
) -> None:
451455
"""Test call_tool."""

tests/test_sse_server.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import asyncio
44
import contextlib
5+
import typing as t
56

67
import uvicorn
78
from mcp import types
@@ -19,7 +20,7 @@ def install_signal_handlers(self) -> None:
1920
"""Do not install signal handlers."""
2021

2122
@contextlib.asynccontextmanager
22-
async def run_in_background(self) -> None:
23+
async def run_in_background(self) -> t.AsyncIterator[None]:
2324
"""Run the server in a background thread."""
2425
task = asyncio.create_task(self.serve())
2526
try:
@@ -41,13 +42,13 @@ def url(self) -> str:
4142

4243
async def test_create_starlette_app() -> None:
4344
"""Test basic glue code for the SSE transport and a fake MCP server."""
44-
server = Server("prompt-server")
45+
mcp_server: Server[object] = Server("prompt-server")
4546

46-
@server.list_prompts()
47+
@mcp_server.list_prompts() # type: ignore[no-untyped-call,misc]
4748
async def list_prompts() -> list[types.Prompt]:
4849
return [types.Prompt(name="prompt1")]
4950

50-
app = create_starlette_app(server, allow_origins=["*"])
51+
app = create_starlette_app(mcp_server, allow_origins=["*"])
5152

5253
config = uvicorn.Config(app, port=0, log_level="info")
5354
server = BackgroundServer(config)

0 commit comments

Comments
 (0)