Skip to content

Commit 9834251

Browse files
committed
refactor(cli-mcp): remove CLIMCPServer and refactor MCP server lifecycle and logging
1 parent a9eebaf commit 9834251

File tree

8 files changed

+31
-137
lines changed

8 files changed

+31
-137
lines changed

packages/cli-mcp/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from "./fn/definePrompt.js";
22
export * from "./fn/defineResource.js";
33
export * from "./fn/defineTool.js";
4-
export * from "./services/CLIMCPServer.js";
54
export * from "./services/McpServerFactory.js";

packages/cli-mcp/src/services/CLIMCPServer.spec.ts

Lines changed: 0 additions & 59 deletions
This file was deleted.

packages/cli-mcp/src/services/CLIMCPServer.ts

Lines changed: 0 additions & 47 deletions
This file was deleted.

packages/cli-mcp/src/services/McpServerFactory.spec.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,11 @@ describe("McpServerFactory", () => {
6565
injector().settings.set("mcp.mode", "stdio");
6666

6767
const result = inject(MCP_SERVER);
68-
const loggerSpy = vi.spyOn(logger(), "info");
6968

7069
await result.connect();
7170

72-
expect(loggerSpy).toHaveBeenCalledWith({event: "MCP_SERVER_CONNECT"});
73-
expect(loggerSpy).toHaveBeenCalledWith({event: "MCP_SERVER_CONNECTED"});
7471
expect(mcpStdioServer).toHaveBeenCalledWith(result.server);
7572
});
76-
it("should log connection events", async () => {
77-
const result = injector().invoke(MCP_SERVER);
78-
const loggerSpy = vi.spyOn(logger(), "info");
79-
80-
await result.connect();
81-
82-
expect(loggerSpy).toHaveBeenCalledTimes(2);
83-
expect(loggerSpy).toHaveBeenNthCalledWith(1, {event: "MCP_SERVER_CONNECT"});
84-
expect(loggerSpy).toHaveBeenNthCalledWith(2, {event: "MCP_SERVER_CONNECTED"});
85-
});
8673
});
8774
describe("http", () => {
8875
beforeEach(() =>
@@ -102,10 +89,9 @@ describe("McpServerFactory", () => {
10289
const result = inject(MCP_SERVER);
10390
const loggerSpy = vi.spyOn(logger(), "info");
10491

105-
await result.connect();
92+
await result.connect("streamable-http");
10693

107-
expect(loggerSpy).toHaveBeenCalledWith({event: "MCP_SERVER_CONNECT"});
108-
expect(loggerSpy).toHaveBeenCalledWith({event: "MCP_SERVER_CONNECTED"});
94+
expect(loggerSpy).toHaveBeenCalledWith({event: "MCP_SERVER_CONNECT", mode: "streamable-http"});
10995
expect(mcpStreamableServer).toHaveBeenCalled();
11096
});
11197
});

packages/cli-mcp/src/services/McpServerFactory.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {mcpStreamableServer} from "./McpStreamableServer.js";
99

1010
export const MCP_SERVER = injectable(McpServer)
1111
.factory(() => {
12-
const mode = constant<"streamable-http" | "stdio">("mcp.mode");
12+
const defaultMode = constant<"streamable-http" | "stdio">("mcp.mode");
1313
const name = constant<string>("name")!;
1414

1515
const server = new McpServer({
@@ -42,16 +42,14 @@ export const MCP_SERVER = injectable(McpServer)
4242

4343
return {
4444
server,
45-
async connect() {
46-
logger().info({event: "MCP_SERVER_CONNECT"});
47-
45+
async connect(mode: "streamable-http" | "stdio" | undefined = defaultMode) {
4846
if (mode === "streamable-http") {
47+
logger().info({event: "MCP_SERVER_CONNECT", mode});
48+
4949
await mcpStreamableServer(server);
5050
} else {
5151
await mcpStdioServer(server);
5252
}
53-
54-
logger().info({event: "MCP_SERVER_CONNECTED"});
5553
}
5654
};
5755
})

packages/cli-mcp/src/services/McpStdioServer.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {McpServer} from "@modelcontextprotocol/sdk/server/mcp.js";
2+
import {DITest} from "@tsed/di";
23
import {beforeEach, describe, expect, it, vi} from "vitest";
34

45
import {mcpStdioServer} from "./McpStdioServer.js";
@@ -15,6 +16,7 @@ describe("mcpStdioServer", () => {
1516
let mockServer: McpServer;
1617
let mockConnect: any;
1718

19+
beforeEach(() => DITest.create());
1820
beforeEach(async () => {
1921
vi.clearAllMocks();
2022

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import type {McpServer} from "@modelcontextprotocol/sdk/server/mcp.js";
2+
import {logger} from "@tsed/di";
23

34
export async function mcpStdioServer(server: McpServer) {
45
const {StdioServerTransport} = await import("@modelcontextprotocol/sdk/server/stdio.js");
56

67
const transport = new StdioServerTransport();
78

9+
logger().stop();
10+
811
return server.connect(transport);
912
}

packages/cli-mcp/src/services/McpStreamableServer.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {McpServer} from "@modelcontextprotocol/sdk/server/mcp.js";
2+
import {logger} from "@tsed/di";
23

34
export async function mcpStreamableServer(server: McpServer) {
45
const {StreamableHTTPServerTransport} = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
@@ -25,12 +26,23 @@ export async function mcpStreamableServer(server: McpServer) {
2526

2627
const port = parseInt(process.env.PORT || "3000");
2728

28-
app
29-
.listen(port, () => {
30-
console.log(`Demo MCP Server running on http://localhost:${port}/mcp`);
31-
})
32-
.on("error", (error: any) => {
33-
console.error("Server error:", error);
34-
process.exit(1);
35-
});
29+
return new Promise((resolve, reject) => {
30+
app
31+
.listen(port, () => {
32+
logger().info({
33+
event: "MCP_STREAMABLE_SERVER",
34+
state: "OK",
35+
message: `Running http://localhost:${port}/mcp`
36+
});
37+
})
38+
.on("close", () => resolve(true))
39+
.on("error", (error: any) => {
40+
logger().error({
41+
event: "MCP_STREAMABLE_SERVER",
42+
state: "KO",
43+
message: error.message
44+
});
45+
reject(error);
46+
});
47+
});
3648
}

0 commit comments

Comments
 (0)