From 6bb474cc07da573fc54116d6a2cd6203dbeae037 Mon Sep 17 00:00:00 2001 From: WJZ_P <110795301+WJZ-P@users.noreply.github.com> Date: Sun, 22 Mar 2026 19:38:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(mcp):=20=E6=B7=BB=E5=8A=A0=20stdio=20?= =?UTF-8?q?=E4=BF=9D=E6=8A=A4=E6=9C=BA=E5=88=B6=EF=BC=8C=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=B0=86=E9=9D=9E=20JSON-RPC=20=E6=B6=88=E6=81=AF=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E5=88=B0=20stderr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mcp-server.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/mcp-server.js b/src/mcp-server.js index 3d58321..a855cf2 100644 --- a/src/mcp-server.js +++ b/src/mcp-server.js @@ -4,6 +4,23 @@ import { z } from "zod"; import { writeFileSync, mkdirSync } from "node:fs"; import { join } from "node:path"; +// ─── stdio 保护:拦截所有 stdout 写入,强制走 stderr ─── +// 必须放在 import 之后、业务代码之前 +// ES module 的 import 会被提升,所以用 console 重定向 + stdout.write 双保险 +const _origStdoutWrite = process.stdout.write.bind(process.stdout); +process.stdout.write = function (chunk, encoding, callback) { + // 只放行 JSON-RPC 消息(以 { 开头的行),其他全部重定向到 stderr + const str = typeof chunk === 'string' ? chunk : chunk.toString(); + if (str.trimStart().startsWith('{')) { + return _origStdoutWrite(chunk, encoding, callback); + } + return process.stderr.write(chunk, encoding, callback); +}; +console.log = console.error; +console.warn = console.error; +console.info = console.error; +console.debug = console.error; + // 复用已有的统一入口,不修改原有逻辑 import { createGeminiSession, disconnect } from './index.js'; import config from './config.js';