
























@@ -1,13 +1,9 @@
11import { normalizeConfiguredMcpServers } from "../../config/mcp-config-normalize.js";
22import type { OpenClawConfig } from "../../config/types.openclaw.js";
33import type { BundleMcpConfig, BundleMcpServerConfig } from "../../plugins/bundle-mcp.js";
4-import { normalizeOptionalLowercaseString } from "../../shared/string-coerce.js";
5-import { buildCodexMcpServersConfig } from "../codex-mcp-config.js";
6-import {
7-applyCommonServerConfig,
8-decodeHeaderEnvPlaceholder,
9-normalizeStringRecord,
10-} from "./bundle-mcp-adapter-shared.js";
4+import { isValidAgentId, normalizeAgentId } from "../../routing/session-key.js";
5+import { buildCodexMcpServersConfig, normalizeCodexMcpServerConfig } from "../codex-mcp-config.js";
6+import { isRecord } from "./bundle-mcp-adapter-shared.js";
117import { serializeTomlInlineValue } from "./toml-inline.js";
128139// Mutable JSON shape structurally compatible with the bundled Codex
@@ -24,47 +20,38 @@ type CodexThreadConfigValue =
2420| { [key: string]: CodexThreadConfigValue };
2521type CodexThreadConfigObject = { [key: string]: CodexThreadConfigValue };
262227-function isOpenClawLoopbackMcpServer(name: string, server: BundleMcpServerConfig): boolean {
28-return (
29-name === "openclaw" &&
30-typeof server.url === "string" &&
31-/^https?:\/\/(?:127\.0\.0\.1|localhost):\d+\/mcp(?:[?#].*)?$/.test(server.url)
32-);
23+type CodexUserMcpServersProjectionOptions = {
24+agentId?: string;
25+};
26+27+function normalizeAgentIds(value: unknown): string[] {
28+if (!Array.isArray(value)) {
29+return [];
30+}
31+return value
32+.filter((entry): entry is string => typeof entry === "string")
33+.map((entry) => entry.trim())
34+.filter((entry) => isValidAgentId(entry))
35+.map((entry) => normalizeAgentId(entry));
3336}
343735-function normalizeCodexServerConfig(
36-name: string,
38+function readCodexProjectionConfig(server: BundleMcpServerConfig): Record<string, unknown> {
39+return isRecord(server.codex) ? server.codex : {};
40+}
41+42+function isCodexMcpServerAllowedForAgent(
3743server: BundleMcpServerConfig,
38-): CodexThreadConfigObject {
39- const next: CodexThreadConfigObject = {};
40-applyCommonServerConfig(next, server);
41-if (isOpenClawLoopbackMcpServer(name, server)) {
42-next.default_tools_approval_mode = "approve";
44+ options: CodexUserMcpServersProjectionOptions | undefined,
45+): boolean {
46+const codex = readCodexProjectionConfig(server);
47+if (!Object.hasOwn(codex, "agents")) {
48+return true;
4349}
44-const httpHeaders = normalizeStringRecord(server.headers);
45-if (httpHeaders) {
46-const staticHeaders: Record<string, string> = {};
47-const envHeaders: Record<string, string> = {};
48-for (const [name, value] of Object.entries(httpHeaders)) {
49-const decoded = decodeHeaderEnvPlaceholder(value);
50-if (!decoded) {
51-staticHeaders[name] = value;
52-continue;
53-}
54-if (decoded.bearer && normalizeOptionalLowercaseString(name) === "authorization") {
55-next.bearer_token_env_var = decoded.envVar;
56-continue;
57-}
58-envHeaders[name] = decoded.envVar;
59-}
60-if (Object.keys(staticHeaders).length > 0) {
61-next.http_headers = staticHeaders;
62-}
63-if (Object.keys(envHeaders).length > 0) {
64-next.env_http_headers = envHeaders;
65-}
50+const agentIds = normalizeAgentIds(codex.agents);
51+if (agentIds.length === 0 || !options?.agentId) {
52+return false;
6653}
67-return next;
54+return agentIds.includes(normalizeAgentId(options.agentId));
6855}
69567057export function injectCodexMcpConfigArgs(
@@ -89,6 +76,7 @@ export function injectCodexMcpConfigArgs(
8976 */
9077export function buildCodexUserMcpServersThreadConfigPatch(
9178cfg: OpenClawConfig | undefined,
79+options?: CodexUserMcpServersProjectionOptions,
9280): { mcp_servers: CodexThreadConfigObject } | undefined {
9381const userServers = normalizeConfiguredMcpServers(cfg?.mcp?.servers);
9482const entries = Object.entries(userServers);
@@ -97,7 +85,16 @@ export function buildCodexUserMcpServersThreadConfigPatch(
9785}
9886const mcp_servers: CodexThreadConfigObject = {};
9987for (const [name, server] of entries) {
100-mcp_servers[name] = normalizeCodexServerConfig(name, server as BundleMcpServerConfig);
88+if (!isCodexMcpServerAllowedForAgent(server as BundleMcpServerConfig, options)) {
89+continue;
90+}
91+mcp_servers[name] = normalizeCodexMcpServerConfig(
92+name,
93+server as BundleMcpServerConfig,
94+) as CodexThreadConfigObject;
95+}
96+if (Object.keys(mcp_servers).length === 0) {
97+return undefined;
10198}
10299return { mcp_servers };
103100}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。