Skip to content

Commit c0e2549

Browse files
refactor: 修复异步操作顺序导致的注册能力错误
Co-authored-by: aider (vertex_ai/gemini-2.5-pro) <aider@aider.chat>
1 parent a45e73a commit c0e2549

File tree

1 file changed

+42
-33
lines changed

1 file changed

+42
-33
lines changed

packages/mcp-server/src/bridge/bridge.ts

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ export class GcliMcpBridge {
4646
}
4747

4848
// **辅助方法:创建一个新的 McpServer 实例**
49-
private createNewMcpServer(): McpServer {
49+
private async createNewMcpServer(): Promise<McpServer> {
5050
const server = new McpServer(
5151
{
5252
name: 'gemini-cli-mcp-server',
5353
version: this.cliVersion,
5454
},
55-
{ capabilities: { tools: { listChanged: true }, logging: {} } },
55+
{ capabilities: { logging: {} } },
5656
);
5757
// 在这里立即注册所有工具
58-
this.registerAllGcliTools(server);
58+
await this.registerAllGcliTools(server);
5959
return server;
6060
}
6161

@@ -79,40 +79,49 @@ export class GcliMcpBridge {
7979
);
8080
}
8181

82-
// **修改 6: 为新会话创建独立的 McpServer 和 Transport**
83-
const newMcpServer = this.createNewMcpServer();
84-
const newTransport = new StreamableHTTPServerTransport({
85-
sessionIdGenerator: () => randomUUID(),
86-
onsessioninitialized: (newSessionId) => {
87-
if (this.debugMode) {
88-
console.log(
89-
`${LOG_PREFIX} Session initialized: ${newSessionId}`,
90-
);
91-
}
92-
// 存储新的会话对象
93-
this.sessions[newSessionId] = {
94-
mcpServer: newMcpServer,
95-
transport: newTransport,
96-
};
97-
},
98-
});
82+
try {
83+
// **修改 6: 为新会话创建独立的 McpServer 和 Transport**
84+
const newMcpServer = await this.createNewMcpServer();
85+
const newTransport = new StreamableHTTPServerTransport({
86+
sessionIdGenerator: () => randomUUID(),
87+
onsessioninitialized: (newSessionId) => {
88+
if (this.debugMode) {
89+
console.log(
90+
`${LOG_PREFIX} Session initialized: ${newSessionId}`,
91+
);
92+
}
93+
// 存储新的会话对象
94+
this.sessions[newSessionId] = {
95+
mcpServer: newMcpServer,
96+
transport: newTransport,
97+
};
98+
},
99+
});
99100

100-
newTransport.onclose = () => {
101-
const sid = newTransport.sessionId;
102-
if (sid && this.sessions[sid]) {
103-
if (this.debugMode) {
104-
console.log(
105-
`${LOG_PREFIX} Session ${sid} closed, removing session object.`,
106-
);
101+
newTransport.onclose = () => {
102+
const sid = newTransport.sessionId;
103+
if (sid && this.sessions[sid]) {
104+
if (this.debugMode) {
105+
console.log(
106+
`${LOG_PREFIX} Session ${sid} closed, removing session object.`,
107+
);
108+
}
109+
delete this.sessions[sid];
107110
}
108-
delete this.sessions[sid];
109-
}
110-
};
111+
};
111112

112-
// 将新的 transport 连接到新的 McpServer 实例
113-
await newMcpServer.connect(newTransport);
113+
// 将新的 transport 连接到新的 McpServer 实例
114+
await newMcpServer.connect(newTransport);
114115

115-
session = { mcpServer: newMcpServer, transport: newTransport };
116+
session = { mcpServer: newMcpServer, transport: newTransport };
117+
} catch (e) {
118+
// Handle errors during server creation
119+
console.error(`${LOG_PREFIX} Error creating new MCP session:`, e);
120+
if (!res.headersSent) {
121+
res.status(500).json({ error: 'Failed to create session' });
122+
}
123+
return;
124+
}
116125
} else {
117126
console.error(
118127
`${LOG_PREFIX} Bad Request: Missing session ID for non-initialize request.`,

0 commit comments

Comments
 (0)