


























@@ -1,5 +1,8 @@
11import { execFile } from "node:child_process";
2+import http from "node:http";
23import { promisify } from "node:util";
4+import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5+import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
36import { describe, expect, it } from "vitest";
47import { isLiveTestEnabled } from "../live-test-helpers.js";
58import { prepareCliBundleMcpConfig } from "./bundle-mcp.js";
@@ -17,6 +20,42 @@ async function canRunGemini(command: string): Promise<boolean> {
1720}
1821}
192223+async function startLocalStreamableHttpMcpServer(): Promise<{
24+url: string;
25+close: () => Promise<void>;
26+}> {
27+const mcpServer = new McpServer({ name: "openclaw-gemini-live-probe", version: "1.0.0" });
28+mcpServer.tool("openclaw_live_probe", "OpenClaw Gemini MCP live probe", async () => ({
29+content: [{ type: "text", text: "ok" }],
30+}));
31+32+const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
33+await mcpServer.connect(transport);
34+const httpServer = http.createServer(async (req, res) => {
35+if (!req.url?.startsWith("/mcp")) {
36+res.writeHead(404).end();
37+return;
38+}
39+await transport.handleRequest(req, res);
40+});
41+42+await new Promise<void>((resolve) => {
43+httpServer.listen(0, "127.0.0.1", resolve);
44+});
45+const address = httpServer.address();
46+const port = typeof address === "object" && address ? address.port : 0;
47+48+return {
49+url: `http://127.0.0.1:${port}/mcp`,
50+close: async () => {
51+await transport.close().catch(() => undefined);
52+await new Promise<void>((resolve, reject) =>
53+httpServer.close((error) => (error ? reject(error) : resolve())),
54+);
55+},
56+};
57+}
58+2059describeLive("Gemini CLI MCP settings smoke", () => {
2160it("connects to an OpenClaw-configured streamable-http server", async () => {
2261const geminiCommand = process.env.OPENCLAW_LIVE_GEMINI_COMMAND ?? "gemini";
@@ -25,10 +64,7 @@ describeLive("Gemini CLI MCP settings smoke", () => {
2564return;
2665}
276628-const inheritedEnv =
29-typeof process.env.CONTEXT7_API_KEY === "string" && process.env.CONTEXT7_API_KEY
30- ? { CONTEXT7_API_KEY: process.env.CONTEXT7_API_KEY }
31- : undefined;
67+const probeServer = await startLocalStreamableHttpMcpServer();
3268const prepared = await prepareCliBundleMcpConfig({
3369enabled: true,
3470mode: "gemini-system-settings",
@@ -41,15 +77,13 @@ describeLive("Gemini CLI MCP settings smoke", () => {
4177plugins: { enabled: false },
4278mcp: {
4379servers: {
44-context7: {
80+openclawLiveProbe: {
4581transport: "streamable-http",
46-url: "https://mcp.context7.com/mcp",
47- ...(inheritedEnv ? { headers: { Authorization: "Bearer ${CONTEXT7_API_KEY}" } } : {}),
82+url: probeServer.url,
4883},
4984},
5085},
5186},
52-env: inheritedEnv,
5387});
54885589try {
@@ -62,11 +96,12 @@ describeLive("Gemini CLI MCP settings smoke", () => {
6296maxBuffer: 1024 * 1024,
6397});
6498const output = `${result.stdout}\n${result.stderr}`;
65-expect(output).toContain("context7");
99+expect(output).toContain("openclawLiveProbe");
66100expect(output).toMatch(/\(http\)|type:\s*http|http/i);
67101expect(output).not.toContain("transport");
68102} finally {
69103await prepared.cleanup?.();
104+await probeServer.close();
70105}
71106}, 60_000);
72107});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。