openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
102 lines (101 loc) • 4.2 kB
JavaScript
import { t as formatErrorMessage } from "../errors-BSdPMFao.mjs";
import { i as routeLogsToStderr } from "../console-cjqeMbm6.mjs";
import { a as resolveCoreToolProfilePolicy } from "../tool-catalog-D1rzNkvG.mjs";
import { n as pickSandboxToolPolicy } from "../sandbox-tool-policy-DMflEE2E.mjs";
import { a as collectExplicitDenylist, i as collectExplicitAllowlist, l as mergeAlsoAllowPolicy } from "../tool-policy-C57wduz9.mjs";
import { r as getRuntimeConfig } from "../io.runtime-FunTy0y1.mjs";
import "../config-B-SAEPyK.mjs";
import { i as logWarn } from "../logger-CYgsNcie.mjs";
import { r as getPluginToolMeta } from "../tool-metadata--ndgGyn8.mjs";
import { n as resolveEffectiveToolPolicy } from "../agent-tools.policy-E-66VU7i.mjs";
import { n as buildDefaultToolPolicyPipelineSteps, t as applyToolPolicyPipeline } from "../tool-policy-pipeline-D74b29TM.mjs";
import { n as acquireStandalonePluginToolRegistry } from "../tools-Dg9RYqLc.mjs";
import { a as resolveToolsMcpAgentId, n as createToolsMcpServer, r as serveRegisteredToolsMcpServer, s as resolveToolsMcpSessionContext } from "../tools-stdio-server-DDAY9Oxd.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.
*
* 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(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);
return {
...toolAllowlist.length > 0 ? { toolAllowlist } : {},
...toolDenylist.length > 0 ? { toolDenylist } : {},
steps
};
}
async function acquirePluginToolsForMcp(params) {
const sessionContext = resolveToolsMcpSessionContext(params);
const context = {
config: params.config,
...sessionContext
};
const { steps, ...pluginToolPolicy } = resolvePluginToolPolicy(params.config, sessionContext);
const acquisition = await acquireStandalonePluginToolRegistry({
context,
...pluginToolPolicy,
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 };