openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
92 lines (91 loc) • 3.88 kB
JavaScript
import { t as formatErrorMessage } from "../errors-BvOkmQM5.mjs";
import { i as routeLogsToStderr } from "../console-CI_QNGt_.mjs";
import { s as resolveCoreToolProfilePolicy } from "../tool-catalog-DfaCehx8.mjs";
import { n as pickSandboxToolPolicy } from "../sandbox-tool-policy-B4OWlHAG.mjs";
import { a as collectExplicitDenylist, i as collectExplicitAllowlist, l as mergeAlsoAllowPolicy } from "../tool-policy-BrMCyUgN.mjs";
import { r as getRuntimeConfig } from "../io.runtime-B134MOMz.mjs";
import "../config-VnHbY_QV.mjs";
import { i as logWarn } from "../logger-DZaOV_pr.mjs";
import { r as getPluginToolMeta } from "../tool-metadata-D5DsuLcG.mjs";
import { n as resolveEffectiveToolPolicy } from "../agent-tools.policy-B-XJsXps.mjs";
import { n as buildDefaultToolPolicyPipelineSteps, t as applyToolPolicyPipeline } from "../tool-policy-pipeline-4Av_cTF8.mjs";
import { n as acquireStandalonePluginToolRegistry } from "../tools-DQdRObqo.mjs";
import { a as resolveToolsMcpAgentId, n as createToolsMcpServer, r as serveRegisteredToolsMcpServer, s as resolveToolsMcpSessionContext } from "../tools-stdio-server-C2me9TYO.mjs";
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.
*/
async function acquirePluginToolsForMcp(params) {
const { config } = params;
const context = {
config,
...resolveToolsMcpSessionContext(params)
};
const effective = context.agentId ? resolveEffectiveToolPolicy({
config,
agentId: context.agentId,
sessionKey: context.sessionKey
}) : void 0;
const profilePolicy = mergeAlsoAllowPolicy(resolveCoreToolProfilePolicy(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);
const acquisition = await acquireStandalonePluginToolRegistry({
context,
...toolAllowlist.length > 0 ? { toolAllowlist } : {},
...toolDenylist.length > 0 ? { toolDenylist } : {},
suppressNameConflicts: true
});
return {
...acquisition,
resolveTools: () => {
const tools = acquisition.resolveTools();
return steps ? applyToolPolicyPipeline({
tools,
toolMeta: getPluginToolMeta,
warn: logWarn,
steps
}) : tools;
}
};
}
function createPluginToolsMcpServer(params) {
return createToolsMcpServer({
name: "openclaw-plugin-tools",
...params
});
}
async function servePluginToolsMcp() {
routeLogsToStderr();
await serveRegisteredToolsMcpServer({
acquireRegistry: () => acquirePluginToolsForMcp({
config: getRuntimeConfig(),
agentId: resolveToolsMcpAgentId()
}),
createServer: (tools, sdkResourceHost) => {
if (tools.length === 0) process.stderr.write("plugin-tools-serve: no plugin tools found\n");
return createPluginToolsMcpServer({
tools,
sdkResourceHost
});
}
});
}
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 { acquirePluginToolsForMcp, createPluginToolsMcpServer, servePluginToolsMcp };