mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-10 22:21:22 -07:00
Initial support for reloading extensions in the CLI - mcp servers only (#12239)
This commit is contained in:
@@ -4,17 +4,21 @@
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
||||
import {
|
||||
McpServer,
|
||||
type ToolCallback,
|
||||
} from '@modelcontextprotocol/sdk/server/mcp.js';
|
||||
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
||||
import express from 'express';
|
||||
import { type Server as HTTPServer } from 'node:http';
|
||||
|
||||
import { randomUUID } from 'node:crypto';
|
||||
import { type ZodRawShape } from 'zod';
|
||||
|
||||
export class TestMcpServer {
|
||||
private server: HTTPServer | undefined;
|
||||
|
||||
async start(): Promise<number> {
|
||||
async start(
|
||||
tools?: Record<string, ToolCallback<ZodRawShape>>,
|
||||
): Promise<number> {
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
const mcpServer = new McpServer(
|
||||
@@ -22,18 +26,30 @@ export class TestMcpServer {
|
||||
name: 'test-mcp-server',
|
||||
version: '1.0.0',
|
||||
},
|
||||
{ capabilities: {} },
|
||||
{ capabilities: { tools: {} } },
|
||||
);
|
||||
|
||||
const transport = new StreamableHTTPServerTransport({
|
||||
sessionIdGenerator: () => randomUUID(),
|
||||
});
|
||||
mcpServer.connect(transport);
|
||||
if (tools) {
|
||||
for (const [name, cb] of Object.entries(tools)) {
|
||||
mcpServer.registerTool(name, {}, cb);
|
||||
}
|
||||
}
|
||||
|
||||
app.post('/mcp', async (req, res) => {
|
||||
const transport = new StreamableHTTPServerTransport({
|
||||
sessionIdGenerator: undefined,
|
||||
enableJsonResponse: true,
|
||||
});
|
||||
res.on('close', () => {
|
||||
transport.close();
|
||||
});
|
||||
await mcpServer.connect(transport);
|
||||
await transport.handleRequest(req, res, req.body);
|
||||
});
|
||||
|
||||
app.get('/mcp', async (req, res) => {
|
||||
res.status(405).send('Not supported');
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this.server = app.listen(0, () => {
|
||||
const address = this.server!.address();
|
||||
|
||||
Reference in New Issue
Block a user