{"_id":"@bernierllc/mcp-server-core","_rev":"7-4a0eb4ef37dcdcd836e9f19c6de7c8f8","name":"@bernierllc/mcp-server-core","dist-tags":{"latest":"3.0.0"},"versions":{"1.0.0":{"name":"@bernierllc/mcp-server-core","version":"1.0.0","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"257f1852590c5012308c9119049a9164b9f97912","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.0.0.tgz","fileCount":13,"integrity":"sha512-2JtE3P3RYtkdLrIeCtBHMF5MwefggdR+nUvVHM/Fv031VwhLoK47eEybqStkMda4fEKBVS1NnATzEPww8fXe+Q==","signatures":[{"sig":"MEQCIEoSUFrtyUslBBV5r7WJLOCNmnQbhmiNUcIIvIuYd3HpAiAsspaY5DZLB/DPbkPrvG6If66JD0hfR0rhYP/zb7pkbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44258},"main":"./dist/index.js","types":"./dist/index.d.ts","gitHead":"a6ea1e5b27d01dcc5ae707ecbf304507ab0fc8e2","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_npmVersion":"11.4.2","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"24.4.1","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"workspace:*","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"workspace:*"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.0.0_1761601638158_0.990412693404884","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/mcp-server-core","version":"1.0.2","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"060b81457f8d729260a3fe5773cd98bd10fcfe5e","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.0.2.tgz","fileCount":13,"integrity":"sha512-YXJdSxC/pZUr6GjiZHYHMJiWUg2EV+iBiaVUBQeU99kPiF8Z4as9Zlk/njWuAuKgMKVHy291WTEJZ5GG1XenIQ==","signatures":[{"sig":"MEYCIQDHHQCdQLV/AdArYDg+3yFZ4XjCBqBCVJpzoiG950EHfgIhAMLgdizBCZh3xtRl2qEYwtQl3iozzwPvPwxGlXD4Tqu8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44350},"main":"./dist/index.js","types":"./dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"20.19.6","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"0.1.2","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"1.0.2"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.0.2_1767642413742_0.6872031671904999","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/mcp-server-core","version":"1.0.4","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"d060a16f3d249d67721fa4c9160a32d07f2f909f","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.0.4.tgz","fileCount":13,"integrity":"sha512-6+GdM5SZN3ACEkwlm0nFYyhsplujYob0FbyPamG8W2Pg0JPP29etv4ho9CFl37SFo1ucodnlZ91lbaV4Pwke6A==","signatures":[{"sig":"MEQCIDaENtgAtD89f7uMdTrqWQ5hlHzh3QkIOHo6GA+cL3yUAiA/oP29cPzLF2Zo4FLtl0+jw2cktcb6LZUn9drn3eIpjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44292},"main":"./dist/index.js","_from":"file:bernierllc-mcp-server-core-1.0.4.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"_resolved":"/home/runner/work/tools/tools/packages/core/mcp-server-core/bernierllc-mcp-server-core-1.0.4.tgz","_integrity":"sha512-6+GdM5SZN3ACEkwlm0nFYyhsplujYob0FbyPamG8W2Pg0JPP29etv4ho9CFl37SFo1ucodnlZ91lbaV4Pwke6A==","_npmVersion":"11.11.0","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"20.20.0","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"0.1.4","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"1.0.4"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.0.4_1773163225057_0.7330377441298186","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/mcp-server-core","version":"1.1.0","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"37f2e613e13b61d867d9fc0188259b8979294513","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.1.0.tgz","fileCount":13,"integrity":"sha512-Xd1NeG4lV589aHHbmgUF572dyJ+BUnuY0FjPsySF1Xil26BQ8dx/6++cmTFFe+jRn91YRvwWpP4TTRSkszkfMQ==","signatures":[{"sig":"MEUCIQCIBZC4YVUgwGDN+aM5f1ez5EiDTkD46SKVqIGfJKgI4QIgF5D5ETBnXpgUuRaFVXkOMR5j3P9lDawWVn2SG8B3Fq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44292},"main":"./dist/index.js","_from":"file:bernierllc-mcp-server-core-1.1.0.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"_resolved":"/home/runner/work/tools/tools/packages/core/mcp-server-core/bernierllc-mcp-server-core-1.1.0.tgz","_integrity":"sha512-Xd1NeG4lV589aHHbmgUF572dyJ+BUnuY0FjPsySF1Xil26BQ8dx/6++cmTFFe+jRn91YRvwWpP4TTRSkszkfMQ==","_npmVersion":"11.14.1","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"0.2.0","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"1.2.0"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.1.0_1779241237143_0.1448738531216638","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@bernierllc/mcp-server-core","version":"1.1.1","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"072c0a5c9e4cb6a6e00e447f1660fbe67898010e","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.1.1.tgz","fileCount":13,"integrity":"sha512-JmWeU8CjP9RSPiYiltcn6s5SaxUQI7uTURa3/EoZYDzE3HQcINJ+2KCB6jHDwQKXpS/eKhSrIbWGklwGSJe6PA==","signatures":[{"sig":"MEYCIQCRmXUFCw/2BbZYvPxqJ53ENggqkUKfEdPExKKOB85E6wIhAJjwPyVyZOjQr5yXoFumaDcMYxLqjkDGZx/cGiLjOYVE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44292},"main":"./dist/index.js","_from":"file:bernierllc-mcp-server-core-1.1.1.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"_resolved":"/home/runner/work/tools/tools/packages/core/mcp-server-core/bernierllc-mcp-server-core-1.1.1.tgz","_integrity":"sha512-JmWeU8CjP9RSPiYiltcn6s5SaxUQI7uTURa3/EoZYDzE3HQcINJ+2KCB6jHDwQKXpS/eKhSrIbWGklwGSJe6PA==","_npmVersion":"11.14.1","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"0.4.0","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"1.2.0"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.1.1_1779243242481_0.8507854042803218","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/mcp-server-core","version":"1.2.0","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bernierllc/mcp-server-core@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"c835084722f62f50d2b9e63c799b5c62493707f6","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-1.2.0.tgz","fileCount":13,"integrity":"sha512-b5Q/RQmZqiuudFw7E+o3CtxI7YN/P1msH18lWksDdGIE+vlfTbl2YzJWfaOqkJG/iUf9IdibggDbY/JAgYyZRw==","signatures":[{"sig":"MEYCIQDXuAPMlwymEYxIIk2V/eNm3qrXx01k5uxJhACtCPn1sAIhAKBd8ij2TjhBty4NflrH+2Ng6P1i2Vv0OP78UtEjTAzB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44292},"main":"./dist/index.js","_from":"file:bernierllc-mcp-server-core-1.2.0.tgz","types":"./dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"_resolved":"/home/runner/work/tools/tools/packages/core/mcp-server-core/bernierllc-mcp-server-core-1.2.0.tgz","_integrity":"sha512-b5Q/RQmZqiuudFw7E+o3CtxI7YN/P1msH18lWksDdGIE+vlfTbl2YzJWfaOqkJG/iUf9IdibggDbY/JAgYyZRw==","_npmVersion":"11.14.1","description":"Generic MCP server framework with tool registration, validation, and error handling","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@bernierllc/work-item-core":"0.5.0","@typescript-eslint/eslint-plugin":"^6.0.0","@bernierllc/planning-session-core":"1.3.0"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-core_1.2.0_1779249985126_0.6330688271654763","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@bernierllc/mcp-server-core","version":"3.0.0","description":"Generic MCP server framework with tool registration, validation, and error handling","main":"./dist/index.js","types":"./dist/index.d.ts","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","dependencies":{"ajv":"^8.12.0","ajv-formats":"^2.1.1"},"peerDependencies":{"@bernierllc/logger":"^1.0.0"},"peerDependenciesMeta":{"@bernierllc/logger":{"optional":true}},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@bernierllc/planning-session-core":"1.3.0","@bernierllc/work-item-core":"0.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rm -rf dist"},"_id":"@bernierllc/mcp-server-core@3.0.0","_integrity":"sha512-y1NpMatgK0tOrrjBJhuZD6nNzEM6DYzWNNlu9gon8kB2eVX4DDiwR1mCL1qwwZ5ba7RFzkiaQcxYVeDmermqZQ==","_resolved":"/home/runner/work/tools/tools/packages/core/mcp-server-core/bernierllc-mcp-server-core-3.0.0.tgz","_from":"file:bernierllc-mcp-server-core-3.0.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-y1NpMatgK0tOrrjBJhuZD6nNzEM6DYzWNNlu9gon8kB2eVX4DDiwR1mCL1qwwZ5ba7RFzkiaQcxYVeDmermqZQ==","shasum":"4641e435c87424466b797cabf2ae862ebfcce692","tarball":"https://registry.npmjs.org/@bernierllc/mcp-server-core/-/mcp-server-core-3.0.0.tgz","fileCount":13,"unpackedSize":47255,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAa6acJUeIg8OC4Cj5pI0Sp4pBg50X3l0qPrOzLdXYjJAiEAvQ9KsxZlk7DLYNkIRoe1wn4C4lzTsnT91+fk8LFo7Nw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cebb79f6-a89a-40c9-bd43-4cda06cf6cac"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server-core_3.0.0_1779304621816_0.8929251795820552"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-27T21:47:18.055Z","modified":"2026-05-20T19:17:02.116Z","1.0.0":"2025-10-27T21:47:18.362Z","1.0.2":"2026-01-05T19:46:53.895Z","1.0.4":"2026-03-10T17:20:25.200Z","1.1.0":"2026-05-20T01:40:37.295Z","1.1.1":"2026-05-20T02:14:02.620Z","1.2.0":"2026-05-20T04:06:25.268Z","3.0.0":"2026-05-20T19:17:01.972Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.md","keywords":["mcp","model-context-protocol","json-rpc","server","framework","tools","agent","ai"],"description":"Generic MCP server framework with tool registration, validation, and error handling","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/mcp-server-core\n\nGeneric MCP (Model Context Protocol) server framework with tool registration, validation, and error handling following JSON-RPC 2.0 specification.\n\n## Installation\n\n```bash\nnpm install @bernierllc/mcp-server-core\n```\n\n## Quick Start\n\n```typescript\nimport { MCPServer } from '@bernierllc/mcp-server-core';\n\n// Create server\nconst server = new MCPServer({\n  name: 'my-tools',\n  version: '1.0.0',\n  validate: true\n});\n\n// Register a tool\nserver.registerTool({\n  name: 'math.add',\n  description: 'Add two numbers',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      a: { type: 'number' },\n      b: { type: 'number' }\n    },\n    required: ['a', 'b']\n  },\n  handler: async (input) => {\n    return { result: input.a + input.b };\n  }\n});\n\n// Start server\nawait server.start();\n\n// Handle requests\nconst response = await server.handleRequest({\n  jsonrpc: '2.0',\n  method: 'math.add',\n  params: { a: 5, b: 3 },\n  id: 1\n});\n\nconsole.log(response.result); // { result: 8 }\n```\n\n## Core Concepts\n\n### Tools\n\nTools are the fundamental building blocks of an MCP server. Each tool represents a specific operation that can be invoked by clients.\n\n```typescript\ninterface MCPTool {\n  name: string;              // Unique tool identifier\n  description: string;       // Human-readable description\n  inputSchema: JSONSchema;   // JSON Schema for input validation\n  handler: ToolHandler;      // Async function that executes the tool\n  validate?: Function;       // Optional custom validation\n  metadata?: ToolMetadata;   // Optional metadata (category, version, etc.)\n}\n```\n\n### Handlers\n\nHandlers are async functions that execute tool logic. They receive validated input and a context object.\n\n```typescript\ntype ToolHandler<TInput, TOutput> = (\n  input: TInput,\n  context: ToolContext\n) => Promise<TOutput>;\n\ninterface ToolContext {\n  requestId: string | number;\n  meta?: RequestMetadata;\n  server: MCPServer;\n  logger?: Logger;\n}\n```\n\n### Middleware\n\nMiddleware functions intercept requests before they reach handlers, enabling cross-cutting concerns like authentication, logging, and rate limiting.\n\n```typescript\ntype MCPMiddleware = (\n  request: MCPRequest,\n  next: () => Promise<MCPResponse>\n) => Promise<MCPResponse>;\n```\n\n## API Reference\n\n### MCPServer\n\n#### Constructor\n\n```typescript\nnew MCPServer(config: MCPServerConfig)\n```\n\n**Config Options:**\n- `name` (required): Server name\n- `version` (required): Server version\n- `validate` (optional): Enable automatic input validation (default: true)\n- `strictMode` (optional): Strict error handling (default: true)\n- `logger` (optional): Logger instance compatible with @bernierllc/logger\n- `errorHandler` (optional): Custom error handler function\n- `middleware` (optional): Array of middleware functions\n- `description` (optional): Server description\n- `metadata` (optional): Custom metadata object\n\n#### Server Lifecycle\n\n```typescript\nawait server.start(): Promise<void>\n```\nStart the server and mark it as ready to handle requests.\n\n```typescript\nawait server.stop(): Promise<void>\n```\nStop the server and mark it as not ready.\n\n```typescript\nserver.isReady(): boolean\n```\nCheck if server is ready to handle requests.\n\n```typescript\nserver.getStatus(): ServerStatus\n```\nGet current server status including tool count and uptime.\n\n```typescript\nserver.getServerInfo(): ServerInfo\n```\nGet server information including name, version, and categories.\n\n#### Tool Registration\n\n```typescript\nserver.registerTool(tool: MCPTool): void\n```\nRegister a single tool. Throws `ToolAlreadyRegisteredError` if tool name is already registered.\n\n```typescript\nserver.registerTools(tools: MCPTool[]): void\n```\nRegister multiple tools at once.\n\n```typescript\nserver.unregisterTool(name: string): boolean\n```\nUnregister a tool by name. Returns true if tool was found and removed.\n\n#### Tool Discovery\n\n```typescript\nserver.listTools(): MCPToolMetadata[]\n```\nList all registered tools (lightweight metadata only).\n\n```typescript\nserver.getTool(name: string): MCPTool | null\n```\nGet a specific tool by name.\n\n```typescript\nserver.hasTool(name: string): boolean\n```\nCheck if a tool is registered.\n\n```typescript\nserver.getToolsByCategory(category: string): MCPToolMetadata[]\n```\nGet all tools in a specific category.\n\n#### Request Handling\n\n```typescript\nawait server.handleRequest(request: MCPRequest): Promise<MCPResponse>\n```\nHandle a single JSON-RPC 2.0 request.\n\n```typescript\nawait server.handleBatch(requests: MCPRequest[]): Promise<MCPResponse[]>\n```\nHandle multiple requests in a batch.\n\n#### Middleware\n\n```typescript\nserver.use(middleware: MCPMiddleware): void\n```\nAdd middleware to the server. Middleware is executed in registration order.\n\n## Tool Registration Examples\n\n### Simple Tool\n\n```typescript\nserver.registerTool({\n  name: 'echo',\n  description: 'Echo the input message',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      message: { type: 'string' }\n    },\n    required: ['message']\n  },\n  handler: async (input) => {\n    return { echo: input.message };\n  }\n});\n```\n\n### Tool with Custom Validation\n\n```typescript\nserver.registerTool({\n  name: 'user.create',\n  description: 'Create a new user',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      email: { type: 'string', format: 'email' },\n      name: { type: 'string', minLength: 2 }\n    },\n    required: ['email', 'name']\n  },\n  validate: (input) => {\n    // Custom business logic validation\n    if (input.email.includes('+spam')) {\n      return {\n        valid: false,\n        errors: [{ field: 'email', message: 'Email appears suspicious' }]\n      };\n    }\n    return { valid: true };\n  },\n  handler: async (input, context) => {\n    context.logger?.info('Creating user', { email: input.email });\n    return { userId: '123', ...input };\n  }\n});\n```\n\n### Tool with Metadata\n\n```typescript\nserver.registerTool({\n  name: 'packages.query',\n  description: 'Query packages with filters',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      filters: {\n        type: 'object',\n        properties: {\n          status: { type: 'array', items: { type: 'string' } }\n        }\n      },\n      limit: { type: 'number', minimum: 1, maximum: 100 }\n    }\n  },\n  handler: async (input) => {\n    // Query logic here\n    return { packages: [], count: 0 };\n  },\n  metadata: {\n    version: '1.0.0',\n    category: 'packages',\n    tags: ['query', 'search', 'filter'],\n    examples: [\n      {\n        name: 'Query core packages',\n        description: 'Find all core packages with status pending',\n        input: {\n          filters: { status: ['pending'] },\n          limit: 10\n        }\n      }\n    ]\n  }\n});\n```\n\n## Middleware Examples\n\n### Request Logging\n\n```typescript\nconst loggingMiddleware: MCPMiddleware = async (request, next) => {\n  const start = Date.now();\n  console.log(`[${request.id}] ${request.method} - START`);\n\n  try {\n    const response = await next();\n    const duration = Date.now() - start;\n    console.log(`[${request.id}] ${request.method} - OK (${duration}ms)`);\n    return response;\n  } catch (error) {\n    const duration = Date.now() - start;\n    console.error(`[${request.id}] ${request.method} - ERROR (${duration}ms)`);\n    throw error;\n  }\n};\n\nserver.use(loggingMiddleware);\n```\n\n### Authentication\n\n```typescript\nconst authMiddleware: MCPMiddleware = async (request, next) => {\n  const apiKey = request.meta?.api_key;\n\n  if (!apiKey || apiKey !== process.env.API_KEY) {\n    return {\n      jsonrpc: '2.0',\n      error: {\n        code: -32004,\n        message: 'Invalid or missing API key',\n        data: { required: 'api_key in meta' }\n      },\n      id: request.id\n    };\n  }\n\n  return next();\n};\n\nserver.use(authMiddleware);\n```\n\n### Rate Limiting\n\n```typescript\nconst rateLimitMiddleware: MCPMiddleware = async (request, next) => {\n  const agentId = request.meta?.agent_id || 'anonymous';\n\n  if (await rateLimiter.isRateLimited(agentId)) {\n    return {\n      jsonrpc: '2.0',\n      error: {\n        code: -32003,\n        message: 'Rate limit exceeded. Please try again later.',\n        data: { agent_id: agentId }\n      },\n      id: request.id\n    };\n  }\n\n  return next();\n};\n\nserver.use(rateLimitMiddleware);\n```\n\n## Error Handling\n\n### Standard JSON-RPC Error Codes\n\n```typescript\nenum JSONRPCErrorCode {\n  ParseError = -32700,       // Invalid JSON\n  InvalidRequest = -32600,   // Not JSON-RPC 2.0 compliant\n  MethodNotFound = -32601,   // Method doesn't exist\n  InvalidParams = -32602,    // Invalid parameters\n  InternalError = -32603,    // Server error\n}\n```\n\n### Custom MCP Error Codes\n\n```typescript\nenum MCPErrorCode {\n  ResourceNotFound = -32000,\n  ValidationFailed = -32001,\n  Conflict = -32002,\n  RateLimited = -32003,\n  AuthenticationFailed = -32004,\n}\n```\n\n### Custom Error Handler\n\n```typescript\nconst server = new MCPServer({\n  name: 'my-server',\n  version: '1.0.0',\n  errorHandler: (error, context) => {\n    // Custom error formatting\n    if (error instanceof MyCustomError) {\n      return {\n        code: -32000,\n        message: 'Custom error occurred',\n        data: { custom: true, details: error.details }\n      };\n    }\n\n    // Default error handling\n    return {\n      code: -32603,\n      message: 'Internal server error'\n    };\n  }\n});\n```\n\n## Validation\n\n### JSON Schema Validation\n\nThe server automatically validates all tool inputs against their JSON Schema. This uses [Ajv](https://ajv.js.org/) for schema validation with support for:\n\n- Type validation (string, number, boolean, object, array)\n- Required fields\n- Format validation (email, uri, date-time, etc.)\n- Constraints (minimum, maximum, minLength, maxLength, pattern)\n- Nested objects and arrays\n- Enum values\n\n```typescript\nserver.registerTool({\n  name: 'user.create',\n  description: 'Create user',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      email: { type: 'string', format: 'email' },\n      age: { type: 'number', minimum: 0, maximum: 120 },\n      role: { type: 'string', enum: ['admin', 'user', 'guest'] }\n    },\n    required: ['email']\n  },\n  handler: async (input) => {\n    // Input is guaranteed to be valid\n    return { created: true };\n  }\n});\n```\n\n### Custom Validation\n\nFor business logic validation beyond JSON Schema:\n\n```typescript\nserver.registerTool({\n  name: 'product.create',\n  description: 'Create product',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      sku: { type: 'string' },\n      price: { type: 'number', minimum: 0 }\n    },\n    required: ['sku', 'price']\n  },\n  validate: async (input) => {\n    // Check if SKU already exists (async validation)\n    const exists = await db.products.findBySKU(input.sku);\n    if (exists) {\n      return {\n        valid: false,\n        errors: [{ field: 'sku', message: 'SKU already exists' }]\n      };\n    }\n    return { valid: true };\n  },\n  handler: async (input) => {\n    // Create product\n    return { productId: '123' };\n  }\n});\n```\n\n## Best Practices\n\n### 1. Use Descriptive Tool Names\n\n```typescript\n// Good: Clear hierarchy and purpose\n'math.add'\n'user.create'\n'packages.query'\n\n// Bad: Ambiguous or generic\n'add'\n'create'\n'query'\n```\n\n### 2. Provide Complete Input Schemas\n\n```typescript\n// Good: Detailed schema with descriptions\n{\n  type: 'object',\n  properties: {\n    email: {\n      type: 'string',\n      format: 'email',\n      description: 'User email address'\n    },\n    age: {\n      type: 'number',\n      minimum: 0,\n      maximum: 120,\n      description: 'User age in years'\n    }\n  },\n  required: ['email']\n}\n```\n\n### 3. Use Metadata for Tool Discovery\n\n```typescript\n{\n  metadata: {\n    version: '1.0.0',\n    category: 'users',\n    tags: ['create', 'user', 'registration'],\n    examples: [\n      {\n        name: 'Create admin user',\n        description: 'Create a new user with admin role',\n        input: { email: 'admin@example.com', role: 'admin' }\n      }\n    ]\n  }\n}\n```\n\n### 4. Handle Errors Gracefully\n\n```typescript\nhandler: async (input, context) => {\n  try {\n    const result = await doSomething(input);\n    return { success: true, data: result };\n  } catch (error) {\n    context.logger?.error('Operation failed', { error, input });\n    throw error; // Let server handle error formatting\n  }\n}\n```\n\n### 5. Use Middleware for Cross-Cutting Concerns\n\nDon't repeat authentication, logging, or rate limiting logic in every handler. Use middleware instead.\n\n## Integration with @bernierllc/logger\n\n```typescript\nimport { MCPServer } from '@bernierllc/mcp-server-core';\nimport { Logger } from '@bernierllc/logger';\n\nconst logger = new Logger({\n  level: 'info',\n  name: 'mcp-server'\n});\n\nconst server = new MCPServer({\n  name: 'my-tools',\n  version: '1.0.0',\n  logger // Logger available in all tool handlers\n});\n\nserver.registerTool({\n  name: 'example',\n  description: 'Example tool',\n  inputSchema: { type: 'object' },\n  handler: async (input, context) => {\n    // Use logger from context\n    context.logger?.info('Processing request', { input });\n    return { success: true };\n  }\n});\n```\n\n## Integration Status\n\n- **Logger**: Optional integration via peer dependency - server works with or without @bernierllc/logger\n- **Docs-Suite**: Ready - complete API documentation and examples provided\n- **NeverHub**: Not applicable - core package, no service orchestration needed\n\n## License\n\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n\n## See Also\n\n- [Ajv JSON Schema Validator](https://ajv.js.org/) - Used for input validation\n- [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification) - Protocol specification\n- [@bernierllc/logger](../logger) - Optional logging integration\n","readmeFilename":"README.md"}