|
|
@@ -1,7 +1,6 @@
|
|
|
import path from "node:path"
|
|
|
import { pathToFileURL } from "node:url"
|
|
|
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
|
|
|
-import { type Tool } from "ai"
|
|
|
import { ConfigV1 } from "@opencode-ai/core/v1/config/config"
|
|
|
import { serviceUse } from "@opencode-ai/core/effect/service-use"
|
|
|
import { Client, type ClientOptions } from "@modelcontextprotocol/sdk/client/index.js"
|
|
|
@@ -154,11 +153,19 @@ export interface ServerInstructions {
|
|
|
tools: string[]
|
|
|
}
|
|
|
|
|
|
+/** An MCP tool in its native shape; consumers adapt it to their own tool format. */
|
|
|
+export interface McpTool {
|
|
|
+ /** Shared cached definition; consumers must copy rather than mutate it. */
|
|
|
+ readonly def: MCPToolDef
|
|
|
+ readonly client: MCPClient
|
|
|
+ readonly timeout?: number
|
|
|
+}
|
|
|
+
|
|
|
export interface Interface {
|
|
|
readonly status: () => Effect.Effect<Record<string, Status>>
|
|
|
readonly clients: () => Effect.Effect<Record<string, MCPClient>>
|
|
|
readonly instructions: () => Effect.Effect<ServerInstructions[]>
|
|
|
- readonly tools: () => Effect.Effect<Record<string, Tool>>
|
|
|
+ readonly tools: () => Effect.Effect<Record<string, McpTool>>
|
|
|
readonly prompts: () => Effect.Effect<Record<string, PromptInfo & { client: string }>>
|
|
|
readonly resources: (clientName?: string) => Effect.Effect<Record<string, ResourceInfo & { client: string }>>
|
|
|
readonly resourceTemplates: (
|
|
|
@@ -656,7 +663,7 @@ const layer = Layer.effect(
|
|
|
}
|
|
|
|
|
|
const tools = Effect.fn("MCP.tools")(function* () {
|
|
|
- const result: Record<string, Tool> = {}
|
|
|
+ const result: Record<string, McpTool> = {}
|
|
|
const s = yield* InstanceState.get(state)
|
|
|
|
|
|
const cfg = yield* cfgSvc.get()
|
|
|
@@ -672,9 +679,8 @@ const layer = Layer.effect(
|
|
|
continue
|
|
|
}
|
|
|
const timeout = requestTimeout(s, clientName, mcpConfig, defaultTimeout)
|
|
|
- for (const mcpTool of listed) {
|
|
|
- const key = McpCatalog.toolName(clientName, mcpTool.name)
|
|
|
- result[key] = McpCatalog.convertTool(mcpTool, client, timeout)
|
|
|
+ for (const def of listed) {
|
|
|
+ result[McpCatalog.toolName(clientName, def.name)] = { def, client, timeout }
|
|
|
}
|
|
|
}
|
|
|
return result
|