fix(skill-mcp): use correct sessionID when registering skill MCP connections
Fixes #3021
This commit is contained in:
@@ -172,6 +172,34 @@ describe("skill tool - MCP schema display", () => {
|
||||
})
|
||||
|
||||
describe("formatMcpCapabilities with inputSchema", () => {
|
||||
it("uses the tool context sessionID when the fallback getter is empty", async () => {
|
||||
// given
|
||||
loadedSkills = [
|
||||
createMockSkillWithMcp("test-skill", {
|
||||
playwright: { command: "npx", args: ["-y", "@anthropic-ai/mcp-playwright"] },
|
||||
}),
|
||||
]
|
||||
|
||||
const listToolsSpy = spyOn(manager, "listTools").mockResolvedValue([])
|
||||
spyOn(manager, "listResources").mockResolvedValue([])
|
||||
spyOn(manager, "listPrompts").mockResolvedValue([])
|
||||
|
||||
const tool = createSkillTool({
|
||||
skills: loadedSkills,
|
||||
mcpManager: manager,
|
||||
getSessionID: () => "",
|
||||
})
|
||||
|
||||
// when
|
||||
await tool.execute({ name: "test-skill" }, mockContext)
|
||||
|
||||
// then
|
||||
expect(listToolsSpy).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ sessionID: mockContext.sessionID }),
|
||||
expect.any(Object),
|
||||
)
|
||||
})
|
||||
|
||||
it("displays tool inputSchema when available", async () => {
|
||||
// given
|
||||
const mockToolsWithSchema: McpTool[] = [
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { dirname } from "node:path"
|
||||
import { tool, type ToolDefinition } from "@opencode-ai/plugin"
|
||||
import type { ToolContext } from "@opencode-ai/plugin/tool"
|
||||
import { TOOL_DESCRIPTION_NO_SKILLS, TOOL_DESCRIPTION_PREFIX } from "./constants"
|
||||
import type { SkillArgs, SkillInfo, SkillLoadOptions } from "./types"
|
||||
import type { LoadedSkill } from "../../features/opencode-skill-loader"
|
||||
@@ -316,7 +317,7 @@ export function createSkillTool(options: SkillLoadOptions = {}): ToolDefinition
|
||||
.optional()
|
||||
.describe("Optional arguments or context for command invocation. Example: name='publish', user_message='patch'"),
|
||||
},
|
||||
async execute(args: SkillArgs, ctx?: { agent?: string }) {
|
||||
async execute(args: SkillArgs, ctx?: ToolContext) {
|
||||
const skills = await getSkills()
|
||||
const commands = getCommands()
|
||||
cachedDescription = formatCombinedDescription(skills.map(loadedSkillToInfo), commands)
|
||||
@@ -359,11 +360,17 @@ export function createSkillTool(options: SkillLoadOptions = {}): ToolDefinition
|
||||
body,
|
||||
]
|
||||
|
||||
if (options.mcpManager && options.getSessionID && matchedSkill.mcpConfig) {
|
||||
if (options.mcpManager && matchedSkill.mcpConfig) {
|
||||
const sessionID = ctx?.sessionID || options.getSessionID?.()
|
||||
|
||||
if (!sessionID) {
|
||||
return output.join("\n")
|
||||
}
|
||||
|
||||
const mcpInfo = await formatMcpCapabilities(
|
||||
matchedSkill,
|
||||
options.mcpManager,
|
||||
options.getSessionID()
|
||||
sessionID
|
||||
)
|
||||
if (mcpInfo) {
|
||||
output.push(mcpInfo)
|
||||
|
||||
@@ -29,7 +29,7 @@ export interface SkillLoadOptions {
|
||||
/** MCP manager for querying skill-embedded MCP servers */
|
||||
mcpManager?: SkillMcpManager
|
||||
/** Session ID getter for MCP client identification */
|
||||
getSessionID?: () => string
|
||||
getSessionID?: () => string | undefined
|
||||
/** Git master configuration for watermark/co-author settings */
|
||||
gitMasterConfig?: GitMasterConfig
|
||||
disabledSkills?: Set<string>
|
||||
|
||||
Reference in New Issue
Block a user