openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
105 lines (104 loc) • 4.33 kB
JavaScript
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 };