UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

105 lines (104 loc) 4.33 kB
import { n as getRuntimeConfig } from "../io.runtime-B9iJRs3w.js"; import { t as formatErrorMessage } from "../errors-Db3Ymjlb.js"; import { a as routeLogsToStderr } from "../console-BSaonU6s.js"; import { u as resolveToolProfilePolicy } from "../tool-policy-shared-DIyS0iQC.js"; import { n as pickSandboxToolPolicy } from "../sandbox-tool-policy-G7E6RfNN.js"; import { a as collectExplicitDenylist, i as collectExplicitAllowlist, l as mergeAlsoAllowPolicy } from "../tool-policy-Wi0C45cX.js"; import "../config-Cs0XXL3x.js"; import { i as logWarn } from "../logger-DwECwNVZ.js"; import { r as getPluginToolMeta } from "../tool-metadata-B5aqo73s.js"; import { n as resolveEffectiveToolPolicy } from "../agent-tools.policy-NF_9Y4S4.js"; import { n as buildDefaultToolPolicyPipelineSteps, t as applyToolPolicyPipeline } from "../tool-policy-pipeline-BwOD5Xc9.js"; import { n as resolvePluginTools, t as ensureStandalonePluginToolRegistryLoaded } from "../tools-D1ohN2ZT.js"; import { i as resolveToolsMcpAgentId, n as createToolsMcpServer, o as resolveToolsMcpSessionContext, t as connectToolsMcpServerToStdio } from "../tools-stdio-server-DFc7sxGX.js"; import { pathToFileURL } from "node:url"; import "@modelcontextprotocol/sdk/server/index.js"; //#region src/mcp/plugin-tools-serve.ts /** * Standalone MCP server that exposes OpenClaw plugin-registered tools * (e.g. memory-lancedb's memory_recall, memory_store, memory_forget) * so ACP sessions running Claude Code can use them. * * Run via: node --import tsx src/mcp/plugin-tools-serve.ts * Or: bun src/mcp/plugin-tools-serve.ts */ function resolvePluginToolPolicy(config, context) { const effective = context.agentId ? resolveEffectiveToolPolicy({ config, agentId: context.agentId, sessionKey: context.sessionKey }) : void 0; const profilePolicy = mergeAlsoAllowPolicy(resolveToolProfilePolicy(effective?.profile ?? config.tools?.profile), effective?.profileAlsoAllow ?? config.tools?.alsoAllow); const globalPolicy = effective?.globalPolicy ?? pickSandboxToolPolicy(config.tools); const steps = effective ? buildDefaultToolPolicyPipelineSteps({ profilePolicy, profile: effective.profile, globalPolicy, agentPolicy: effective.agentPolicy, agentId: effective.agentId }).map((step) => Object.assign({}, step, { suppressUnavailableCoreToolWarning: true })) : void 0; const policies = steps?.map((step) => step.policy) ?? [profilePolicy, globalPolicy]; const toolAllowlist = collectExplicitAllowlist(policies); const toolDenylist = collectExplicitDenylist(policies); return { ...toolAllowlist.length > 0 ? { toolAllowlist } : {}, ...toolDenylist.length > 0 ? { toolDenylist } : {}, steps }; } function resolvePluginToolsForMcp(params) { const sessionContext = resolveToolsMcpSessionContext(params); const context = { config: params.config, ...sessionContext }; const { steps, ...pluginToolPolicy } = resolvePluginToolPolicy(params.config, sessionContext); const runtimeRegistry = ensureStandalonePluginToolRegistryLoaded({ context, ...pluginToolPolicy }); const tools = resolvePluginTools({ context, ...pluginToolPolicy, suppressNameConflicts: true, runtimeRegistry }); return steps ? applyToolPolicyPipeline({ tools, toolMeta: getPluginToolMeta, warn: logWarn, steps }) : tools; } function createPluginToolsMcpServer(params = {}) { const cfg = params.config ?? getRuntimeConfig(); const tools = params.tools ?? resolvePluginToolsForMcp({ config: cfg, agentSessionKey: params.agentSessionKey, agentId: params.agentId }); return createToolsMcpServer({ name: "openclaw-plugin-tools", tools }); } async function servePluginToolsMcp() { routeLogsToStderr(); const config = getRuntimeConfig(); const tools = resolvePluginToolsForMcp({ config, agentId: resolveToolsMcpAgentId() }); const server = createPluginToolsMcpServer({ config, tools }); if (tools.length === 0) process.stderr.write("plugin-tools-serve: no plugin tools found\n"); await connectToolsMcpServerToStdio(server); } if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) servePluginToolsMcp().catch((err) => { process.stderr.write(`plugin-tools-serve: ${formatErrorMessage(err)}\n`); process.exit(1); }); //#endregion export { createPluginToolsMcpServer, resolvePluginToolsForMcp, servePluginToolsMcp };