




















@@ -1,8 +1,16 @@
11import crypto from "node:crypto";
2+import { createRequire } from "node:module";
23import { Client } from "@modelcontextprotocol/sdk/client/index.js";
34import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
45import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
56import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
7+import { AjvJsonSchemaValidator } from "@modelcontextprotocol/sdk/validation/ajv-provider.js";
8+import type {
9+JsonSchemaType,
10+JsonSchemaValidator,
11+jsonSchemaValidator,
12+} from "@modelcontextprotocol/sdk/validation/types.js";
13+import type { ErrorObject, ValidateFunction } from "ajv";
614import type { OpenClawConfig } from "../config/types.openclaw.js";
715import { logWarn } from "../logger.js";
816import { resolveGlobalSingleton } from "../shared/global-singleton.js";
@@ -34,7 +42,53 @@ type CreateSessionMcpRuntime = (
3442params: Parameters<typeof createSessionMcpRuntime>[0] & { configFingerprint?: string },
3543) => SessionMcpRuntime;
364445+const require = createRequire(import.meta.url);
3746const SESSION_MCP_RUNTIME_MANAGER_KEY = Symbol.for("openclaw.sessionMcpRuntimeManager");
47+const DRAFT_2020_12_SCHEMA = "https://json-schema.org/draft/2020-12/schema";
48+49+type Ajv2020Like = {
50+compile: (schema: JsonSchemaType) => ValidateFunction;
51+errorsText: (errors?: ErrorObject[] | null) => string;
52+};
53+54+function isDraft202012Schema(schema: JsonSchemaType): boolean {
55+return (schema as { $schema?: unknown }).$schema === DRAFT_2020_12_SCHEMA;
56+}
57+58+export function createBundleMcpJsonSchemaValidator(): jsonSchemaValidator {
59+const defaultValidator = new AjvJsonSchemaValidator();
60+const Ajv2020Ctor = require("ajv/dist/2020") as new (opts?: object) => Ajv2020Like;
61+const ajv2020 = new Ajv2020Ctor({
62+strict: false,
63+validateFormats: false,
64+validateSchema: false,
65+allErrors: true,
66+});
67+68+return {
69+getValidator<T>(schema: JsonSchemaType): JsonSchemaValidator<T> {
70+if (!isDraft202012Schema(schema)) {
71+return defaultValidator.getValidator<T>(schema);
72+}
73+const ajvValidator = ajv2020.compile(schema);
74+return (input: unknown) => {
75+const valid = ajvValidator(input);
76+if (valid) {
77+return {
78+valid: true,
79+data: input as T,
80+errorMessage: undefined,
81+};
82+}
83+return {
84+valid: false,
85+data: undefined,
86+errorMessage: ajv2020.errorsText(ajvValidator.errors),
87+};
88+};
89+},
90+};
91+}
38923993function connectWithTimeout(
4094client: Client,
@@ -178,7 +232,9 @@ export function createSessionMcpRuntime(params: {
178232name: "openclaw-bundle-mcp",
179233version: "0.0.0",
180234},
181-{},
235+{
236+jsonSchemaValidator: createBundleMcpJsonSchemaValidator(),
237+},
182238);
183239const session: BundleMcpSession = {
184240 serverName,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。