diff --git a/package.json b/package.json index 84c6b0906..f62f9f496 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,13 @@ "modelcontextprotocol", "mcp" ], + "imports": { + "#default-validator": { + "workerd": "./dist/esm/validation/default-workerd.js", + "import": "./dist/esm/validation/default.js", + "require": "./dist/cjs/validation/default.js" + } + }, "exports": { ".": { "import": "./dist/esm/index.js", @@ -60,10 +67,10 @@ ], "scripts": { "fetch:spec-types": "curl -o spec.types.ts https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/refs/heads/main/schema/draft/schema.ts", - "build": "npm run build:esm && npm run build:cjs", - "build:esm": "mkdir -p dist/esm && echo '{\"type\": \"module\"}' > dist/esm/package.json && tsc -p tsconfig.prod.json", + "build": "rm -rf dist && npm run build:esm && npm run build:cjs", + "build:esm": "mkdir -p dist/esm && tsc -p tsconfig.prod.json", "build:esm:w": "npm run build:esm -- -w", - "build:cjs": "mkdir -p dist/cjs && echo '{\"type\": \"commonjs\"}' > dist/cjs/package.json && tsc -p tsconfig.cjs.json", + "build:cjs": "mkdir -p dist/cjs && tsc -p tsconfig.cjs.json", "build:cjs:w": "npm run build:cjs -- -w", "examples:simple-server:w": "tsx --watch src/examples/server/simpleStreamableHttp.ts --oauth", "prepack": "npm run build:esm && npm run build:cjs", diff --git a/src/server/index.ts b/src/server/index.ts index c7f571f62..08af230f9 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -31,7 +31,7 @@ import { SetLevelRequestSchema, SUPPORTED_PROTOCOL_VERSIONS } from '../types.js'; -import { AjvJsonSchemaValidator } from '../validation/ajv-provider.js'; +import DefaultJsonSchemaValidator from '#default-validator'; import type { JsonSchemaType, jsonSchemaValidator } from '../validation/types.js'; export type ServerOptions = ProtocolOptions & { @@ -128,7 +128,7 @@ export class Server< super(options); this._capabilities = options?.capabilities ?? {}; this._instructions = options?.instructions; - this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new AjvJsonSchemaValidator(); + this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new DefaultJsonSchemaValidator(); this.setRequestHandler(InitializeRequestSchema, request => this._oninitialize(request)); this.setNotificationHandler(InitializedNotificationSchema, () => this.oninitialized?.()); diff --git a/src/validation/default-workerd.ts b/src/validation/default-workerd.ts new file mode 100644 index 000000000..3d21569ae --- /dev/null +++ b/src/validation/default-workerd.ts @@ -0,0 +1,3 @@ +import { CfWorkerJsonSchemaValidator } from './cfworker-provider.js'; + +export default CfWorkerJsonSchemaValidator; diff --git a/src/validation/default.ts b/src/validation/default.ts new file mode 100644 index 000000000..e3448c8d1 --- /dev/null +++ b/src/validation/default.ts @@ -0,0 +1,3 @@ +import { AjvJsonSchemaValidator } from './ajv-provider.js'; + +export default AjvJsonSchemaValidator; diff --git a/src/validation/index.ts b/src/validation/index.ts index a6df86d6a..7b8389cdc 100644 --- a/src/validation/index.ts +++ b/src/validation/index.ts @@ -2,27 +2,25 @@ * JSON Schema validation * * This module provides configurable JSON Schema validation for the MCP SDK. - * Choose a validator based on your runtime environment: + * The SDK automatically selects the appropriate validator based on your runtime + * environment using export conditions: * - * - AjvJsonSchemaValidator: Best for Node.js (default, fastest) - * Import from: @modelcontextprotocol/sdk/validation/ajv - * Requires peer dependencies: ajv, ajv-formats + * - Node.js: Automatically uses AjvJsonSchemaValidator (fastest, requires ajv and ajv-formats) + * - Cloudflare Workers (workerd): Automatically uses CfWorkerJsonSchemaValidator (requires @cfworker/json-schema) * - * - CfWorkerJsonSchemaValidator: Best for edge runtimes - * Import from: @modelcontextprotocol/sdk/validation/cfworker - * Requires peer dependency: @cfworker/json-schema + * Simply import the default validator and it will work in your environment: * * @example * ```typescript - * // For Node.js with AJV - * import { AjvJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/ajv'; - * const validator = new AjvJsonSchemaValidator(); - * - * // For Cloudflare Workers - * import { CfWorkerJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/cfworker'; - * const validator = new CfWorkerJsonSchemaValidator(); + * // Automatically selects the right validator for your runtime + * import DefaultValidator from '@modelcontextprotocol/sdk/validation/default'; + * const validator = new DefaultValidator(); * ``` * + * For advanced use cases, you can also import validators directly: + * - `@modelcontextprotocol/sdk/validation/ajv` - AjvJsonSchemaValidator (Node.js) + * - `@modelcontextprotocol/sdk/validation/cfworker` - CfWorkerJsonSchemaValidator (edge runtimes) + * * @module validation */ diff --git a/tsconfig.json b/tsconfig.json index 4cc22bf1b..14a682781 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,8 +14,10 @@ "isolatedModules": true, "skipLibCheck": true, "baseUrl": ".", + "rootDir": "./src", "paths": { - "pkce-challenge": ["node_modules/pkce-challenge/dist/index.node"] + "pkce-challenge": ["node_modules/pkce-challenge/dist/index.node"], + "#default-validator": ["./src/validation/default.js"] } }, "include": ["src/**/*"],