Skip to content

Commit c8df8d0

Browse files
araujofjonpspri
authored andcommitted
chore(mcp): apply review fixes from PR #112
- Fix spurious whitespace in runtime.py f-strings and dict values - Replace broken server.settings.host/port doctests with server.server_config.* - Simplify getattr(_transport_security) to direct attribute access - Update stale "Fast MCP server" docstring and class Examples indentation - Update scaffold template to mcp==2.0.0b1 and mcp-types==2.0.0b1 - Remove unused ErrorData import in test_client_reconnect.py - Remove dead plugin._session_id = None test setup - Rename http_client_instance to http_client Signed-off-by: Frederico Araujo <frederico.araujo@ibm.com>
1 parent 5335f48 commit c8df8d0

5 files changed

Lines changed: 22 additions & 23 deletions

File tree

cpex/framework/external/mcp/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,9 @@ def _tls_httpx_client_factory(
375375

376376
for attempt in range(max_retries):
377377
try:
378-
http_client_instance = _tls_httpx_client_factory()
378+
http_client = _tls_httpx_client_factory()
379379
streamable_client = streamable_http_client(
380-
uri, http_client=http_client_instance, terminate_on_close=True
380+
uri, http_client=http_client, terminate_on_close=True
381381
)
382382
http_transport = await self._exit_stack.enter_async_context(streamable_client)
383383
self._http, self._write = http_transport

cpex/framework/external/mcp/server/runtime.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
- Implements all plugin hook tools (get_plugin_configs, tool_pre_invoke, etc.)
1616
1717
Examples:
18-
Create an SSL-capable FastMCP server:
18+
Create an SSL-capable MCPServer:
1919
2020
>>> from cpex.framework.models import MCPServerConfig
2121
>>> config = MCPServerConfig(host="localhost", port=8000)
2222
>>> server = SSLCapableMCPServer(server_config=config, name="TestServer")
23-
>>> server.settings.host
23+
>>> server.server_config.host
2424
'localhost'
25-
>>> server.settings.port
25+
>>> server.server_config.port
2626
8000
2727
2828
Check SSL configuration returns empty dict when TLS is not configured:
@@ -49,9 +49,9 @@
4949
>>> from cpex.framework.models import MCPServerConfig
5050
>>> config = MCPServerConfig(host="0.0.0.0", port=8080)
5151
>>> server = SSLCapableMCPServer(server_config=config, name="SettingsTest")
52-
>>> server.settings.host
52+
>>> server.server_config.host
5353
'0.0.0.0'
54-
>>> server.settings.port
54+
>>> server.server_config.port
5555
8080
5656
"""
5757

@@ -189,19 +189,19 @@ class SSLCapableMCPServer(MCPServer):
189189
"""MCPServer with SSL/TLS support using MCPServerConfig.
190190
191191
Examples:
192-
Create an SSL-capable MCPServer:
192+
Create an SSL-capable MCPServer:
193193
194194
>>> from cpex.framework.models import MCPServerConfig
195195
>>> config = MCPServerConfig(host="127.0.0.1", port=8000)
196196
>>> server = SSLCapableMCPServer(server_config=config, name="TestServer")
197-
>>> server.settings.host
197+
>>> server.server_config.host
198198
'127.0.0.1'
199-
>>> server.settings.port
199+
>>> server.server_config.port
200200
8000
201201
"""
202202

203203
def __init__(self, server_config: MCPServerConfig, *args, **kwargs):
204-
"""Initialize an SSL capable Fast MCP server.
204+
"""Initialize an SSL capable MCPServer.
205205
206206
Args:
207207
server_config: the MCP server configuration including mTLS information.
@@ -363,10 +363,10 @@ async def metrics_disabled():
363363
# Create a minimal Starlette app with only the health endpoint
364364
health_app = Starlette(routes=routes)
365365

366-
logger.info(f"Starting HTTP health check server on { self.server_config.host}:{health_port}")
366+
logger.info(f"Starting HTTP health check server on {self.server_config.host}:{health_port}")
367367
config = uvicorn.Config(
368368
app=health_app,
369-
host= self.server_config.host,
369+
host=self.server_config.host,
370370
port=health_port,
371371
log_level="warning", # Reduce noise from health checks
372372
)
@@ -382,12 +382,12 @@ async def run_streamable_http_async(self) -> None:
382382
>>> from cpex.framework.models import MCPServerConfig
383383
>>> config = MCPServerConfig(host="0.0.0.0", port=9000)
384384
>>> server = SSLCapableMCPServer(server_config=config, name="HTTPServer")
385-
>>> server.settings.host
385+
>>> server.server_config.host
386386
'0.0.0.0'
387-
>>> server.settings.port
387+
>>> server.server_config.port
388388
9000
389389
"""
390-
starlette_app = self.streamable_http_app(transport_security=getattr(self, '_transport_security', None))
390+
starlette_app = self.streamable_http_app(transport_security=self._transport_security)
391391

392392
# Add health check endpoint to main app
393393
# Third-Party
@@ -440,8 +440,8 @@ async def metrics_disabled():
440440
ssl_config = self._get_ssl_config()
441441
config_kwargs = {
442442
"app": starlette_app,
443-
"host": self.server_config.host,
444-
"port": self.server_config.port,
443+
"host": self.server_config.host,
444+
"port": self.server_config.port,
445445
"log_level": self.settings.log_level.lower(),
446446
}
447447
config_kwargs.update(ssl_config)
@@ -452,13 +452,13 @@ async def metrics_disabled():
452452
config_kwargs["uds"] = self.server_config.uds
453453
logger.info(f"Starting plugin server on unix socket {self.server_config.uds}")
454454
else:
455-
logger.info(f"Starting plugin server on { self.server_config.host}:{ self.server_config.port}")
455+
logger.info(f"Starting plugin server on {self.server_config.host}:{self.server_config.port}")
456456
config = uvicorn.Config(**config_kwargs) # type: ignore[arg-type]
457457
server = uvicorn.Server(config)
458458

459459
# If SSL is enabled, start a separate HTTP health check server
460460
if ssl_config and not self.server_config.uds:
461-
health_port = self.server_config.port + 1000 # Use port+1000 for health checks
461+
health_port = self.server_config.port + 1000 # Use port+1000 for health checks
462462
logger.info(f"SSL enabled - starting separate HTTP health check on port {health_port}")
463463
# Run both servers concurrently
464464
await asyncio.gather(server.serve(), self._start_health_check_server(health_port))

cpex/templates/external/{{cookiecutter.plugin_slug}}/pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ authors = [
4444
]
4545

4646
dependencies = [
47-
"mcp>=1.16.0",
47+
"mcp==2.0.0b1",
48+
"mcp-types==2.0.0b1",
4849
"mcp-contextforge-gateway",
4950
]
5051

tests/unit/cpex/framework/external/mcp/test_client_coverage.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,6 @@ async def test_shutdown_cleans_stdio_state_even_when_proto_is_http(self):
682682
plugin._stdio_stop.set = MagicMock()
683683
plugin._stdio_ready = MagicMock()
684684
plugin._exit_stack = None
685-
plugin._session_id = None
686685

687686
await plugin.shutdown()
688687
assert plugin._stdio_task is None

tests/unit/cpex/framework/external/mcp/test_client_reconnect.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ async def test_invoke_hook_reconnects_on_mcp_error(self, mock_http_plugin_config
210210
plugin._session = mock_session
211211

212212
from mcp import MCPError
213-
from mcp_types import ErrorData
214213

215214
call_count = 0
216215

0 commit comments

Comments
 (0)