v7: MCP字段修正——真正生效的开关是disabled不是enabled(会被server schema剥掉);enableMcp改90s重试(启动4~5s location才就绪,过早调用404)
This commit is contained in:
@@ -46,8 +46,9 @@ function projectDisplayName(session, projectMap) {
|
|||||||
return session.projectID ? session.projectID.slice(0, 8) : "unknown"
|
return session.projectID ? session.projectID.slice(0, 8) : "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MCP server 名单:opencode.json 里 enabled:false 的项(启动无 toast),
|
// MCP server 名单:opencode.json 里 disabled:true 的项(启动无自动连接、无 toast),
|
||||||
// 由本插件运行时 connect 启用(官方语义:overriding disabled config until restart)。
|
// 由本插件运行时 connect 启用(官方语义:overriding disabled config until restart)。
|
||||||
|
// 注意:enabled 字段会被 OC 的 server schema 剥掉,真正生效的开关是 disabled。
|
||||||
// 新增被禁用的 MCP server 时把名字加进来即可。
|
// 新增被禁用的 MCP server 时把名字加进来即可。
|
||||||
const MCP_NAMES = ["baota-mcp"]
|
const MCP_NAMES = ["baota-mcp"]
|
||||||
|
|
||||||
@@ -86,39 +87,39 @@ export default Plugin.define({
|
|||||||
log("[oc-session-all] toast interceptor install ERROR: " + e.message)
|
log("[oc-session-all] toast interceptor install ERROR: " + e.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── MCP 运行时启用(config enabled:false + 插件 connect)────────────
|
// ── MCP 运行时启用(config disabled:true + 插件 connect 覆盖)─────────
|
||||||
|
// OC 启动后 location/config 异步就绪(实测约 4~5s),过早调用会 list 为空
|
||||||
|
// → connect 返回 404 "MCP server not found"。这里每 2s 重试直到成功(上限 90s)。
|
||||||
const enableMcp = async () => {
|
const enableMcp = async () => {
|
||||||
// 等服务端 MCP 子系统初始化完成
|
|
||||||
await delay(1500)
|
await delay(1500)
|
||||||
try {
|
const deadline = Date.now() + 90000
|
||||||
// 1) dump 现状(供后续动态化:字段名/状态一并写日志)
|
let attempt = 0
|
||||||
|
let pending = MCP_NAMES.slice()
|
||||||
|
while (pending.length && Date.now() < deadline) {
|
||||||
|
attempt++
|
||||||
try {
|
try {
|
||||||
const list = await context.client.mcp.list({ location: context.location })
|
const list = await context.client.mcp.list({ location: context.location })
|
||||||
const data = list && list.data !== undefined ? list.data : list
|
const data = list && list.data !== undefined ? list.data : list
|
||||||
log("[oc-session-all] mcp.list dump: " + JSON.stringify(data).substring(0, 800))
|
const names = Array.isArray(data) ? data.map((s) => s && s.name).filter(Boolean) : []
|
||||||
|
log("[oc-session-all] mcp.list attempt=" + attempt + " names=[" + names.join(",") + "]")
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("[oc-session-all] mcp.list ERROR: " + e.message)
|
log("[oc-session-all] mcp.list attempt=" + attempt + " ERROR: " + e.message)
|
||||||
}
|
}
|
||||||
// 2) 逐个 connect(POST /api/experimental/mcp/:server/connect)
|
for (const name of pending.slice()) {
|
||||||
for (const name of MCP_NAMES) {
|
|
||||||
try {
|
try {
|
||||||
await context.client.mcp.connect({ server: name, location: context.location })
|
await context.client.mcp.connect({ server: name, location: context.location })
|
||||||
log("[oc-session-all] mcp.connect(" + name + ") OK")
|
log("[oc-session-all] mcp.connect(" + name + ") OK attempt=" + attempt)
|
||||||
|
pending = pending.filter((n) => n !== name)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("[oc-session-all] mcp.connect(" + name + ") ERROR: " + e.message)
|
const msg = String((e && e.message) || e)
|
||||||
|
log("[oc-session-all] mcp.connect(" + name + ") attempt=" + attempt + " ERROR: " + msg)
|
||||||
|
if (/already/i.test(msg)) pending = pending.filter((n) => n !== name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 3) connect 后再拉一次 list(服务端状态已变,日志记录结果)
|
if (pending.length) await delay(2000)
|
||||||
try {
|
|
||||||
const after = await context.client.mcp.list({ location: context.location })
|
|
||||||
const data = after && after.data !== undefined ? after.data : after
|
|
||||||
log("[oc-session-all] mcp.list after connect: " + JSON.stringify(data).substring(0, 800))
|
|
||||||
} catch (e) {
|
|
||||||
log("[oc-session-all] mcp.list(after) ERROR: " + e.message)
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
log("[oc-session-all] enableMcp ERROR: " + e.message)
|
|
||||||
}
|
}
|
||||||
|
if (pending.length) log("[oc-session-all] enableMcp gave up, pending: " + pending.join(","))
|
||||||
|
else log("[oc-session-all] enableMcp done, all connected")
|
||||||
}
|
}
|
||||||
void enableMcp()
|
void enableMcp()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user