fix(skill-mcp): use correct sessionID when registering skill MCP connections
Fixes #3021
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { describe, it, expect, beforeEach, mock } from "bun:test"
|
||||
import { describe, it, expect, beforeEach, mock, spyOn } from "bun:test"
|
||||
import type { ToolContext } from "@opencode-ai/plugin/tool"
|
||||
import { createSkillMcpTool, applyGrepFilter } from "./tools"
|
||||
import { SkillMcpManager } from "../../features/skill-mcp-manager"
|
||||
@@ -165,6 +165,34 @@ describe("skill_mcp tool", () => {
|
||||
expect(tool.description).toBeDefined()
|
||||
})
|
||||
})
|
||||
|
||||
describe("session resolution", () => {
|
||||
it("uses the tool context sessionID when the fallback getter is empty", async () => {
|
||||
// given
|
||||
loadedSkills = [
|
||||
createMockSkillWithMcp("test-skill", {
|
||||
"test-server": { command: "echo", args: ["test"] },
|
||||
}),
|
||||
]
|
||||
const callToolSpy = spyOn(manager, "callTool").mockResolvedValue({ content: [] } as never)
|
||||
const tool = createSkillMcpTool({
|
||||
manager,
|
||||
getLoadedSkills: () => loadedSkills,
|
||||
getSessionID: () => "",
|
||||
})
|
||||
|
||||
// when
|
||||
await tool.execute({ mcp_name: "test-server", tool_name: "some-tool" }, mockContext)
|
||||
|
||||
// then
|
||||
expect(callToolSpy).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ sessionID: mockContext.sessionID }),
|
||||
expect.any(Object),
|
||||
"some-tool",
|
||||
{},
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("applyGrepFilter", () => {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { tool, type ToolDefinition } from "@opencode-ai/plugin"
|
||||
import type { ToolContext } from "@opencode-ai/plugin/tool"
|
||||
import { BUILTIN_MCP_TOOL_HINTS, SKILL_MCP_DESCRIPTION } from "./constants"
|
||||
import type { SkillMcpArgs } from "./types"
|
||||
import type { SkillMcpManager, SkillMcpClientInfo, SkillMcpServerContext } from "../../features/skill-mcp-manager"
|
||||
@@ -7,7 +8,7 @@ import type { LoadedSkill } from "../../features/opencode-skill-loader/types"
|
||||
interface SkillMcpToolOptions {
|
||||
manager: SkillMcpManager
|
||||
getLoadedSkills: () => LoadedSkill[]
|
||||
getSessionID: () => string
|
||||
getSessionID?: () => string | undefined
|
||||
}
|
||||
|
||||
type OperationType = { type: "tool" | "resource" | "prompt"; name: string }
|
||||
@@ -136,7 +137,7 @@ export function createSkillMcpTool(options: SkillMcpToolOptions): ToolDefinition
|
||||
.optional()
|
||||
.describe("Regex pattern to filter output lines (only matching lines returned)"),
|
||||
},
|
||||
async execute(args: SkillMcpArgs) {
|
||||
async execute(args: SkillMcpArgs, toolContext: ToolContext) {
|
||||
const operation = validateOperationParams(args)
|
||||
const skills = getLoadedSkills()
|
||||
const found = findMcpServer(args.mcp_name, skills)
|
||||
@@ -156,10 +157,15 @@ export function createSkillMcpTool(options: SkillMcpToolOptions): ToolDefinition
|
||||
)
|
||||
}
|
||||
|
||||
const sessionID = toolContext.sessionID || getSessionID?.()
|
||||
if (!sessionID) {
|
||||
throw new Error("No active session available for skill MCP call.")
|
||||
}
|
||||
|
||||
const info: SkillMcpClientInfo = {
|
||||
serverName: args.mcp_name,
|
||||
skillName: found.skill.name,
|
||||
sessionID: getSessionID(),
|
||||
sessionID,
|
||||
}
|
||||
|
||||
const context: SkillMcpServerContext = {
|
||||
|
||||
Reference in New Issue
Block a user