@zmdb/mcp 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +70 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +141 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +153 -0
- package/dist/server.js.map +1 -0
- package/package.json +49 -0
- package/src/client.ts +183 -0
- package/src/index.ts +10 -0
- package/src/server.ts +246 -0
package/README.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# @zmdb/mcp
|
|
2
|
+
|
|
3
|
+
`@zmdb/mcp` provides transport-neutral MCP client and server cores. It validates every protocol envelope, routes only registered tools, resolves caller identity through an application-supplied
|
|
4
|
+
function, and bounds remote call count and response bytes.
|
|
5
|
+
|
|
6
|
+
The package does not open sockets, read process streams, mount an HTTP framework, or depend on an MCP SDK. Applications own stdio or HTTP framing and authentication.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
yarn add @zmdb/ai@1.0.0-beta.1 @zmdb/mcp@1.0.0-beta.1
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
> **Prerelease** (`1.0.0-beta.1`). Requires **Node.js 26+** and is **ESM-only**. The runtime uses platform APIs and caller-supplied transports.
|
|
15
|
+
|
|
16
|
+
## Server
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { defineTools } from '@zmdb/ai/chat';
|
|
20
|
+
import { createMcpServer } from '@zmdb/mcp';
|
|
21
|
+
|
|
22
|
+
const tools = defineTools({
|
|
23
|
+
lookup: {
|
|
24
|
+
spec: {
|
|
25
|
+
name: 'lookup',
|
|
26
|
+
parameters: { type: 'object', properties: {}, required: [] },
|
|
27
|
+
},
|
|
28
|
+
validate: value => value,
|
|
29
|
+
handler: (input, identity) => JSON.stringify({ input, identity }),
|
|
30
|
+
effectful: false,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const server = createMcpServer(tools, {
|
|
35
|
+
serverInfo: { name: 'catalog', version: '1.0.0' },
|
|
36
|
+
identify: transport => authenticateTransport(transport),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const answer = await server.handle(message, transport);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`identify` is mandatory. The application decides how a stdio process or HTTP request becomes an authenticated identity before a tool runs.
|
|
43
|
+
|
|
44
|
+
## Client
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { createMcpClient } from '@zmdb/mcp';
|
|
48
|
+
|
|
49
|
+
const client = createMcpClient(sendJsonRpc, {
|
|
50
|
+
maxCalls: 32,
|
|
51
|
+
maxResponseBytes: 256 * 1024,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const tools = await client.listTools();
|
|
55
|
+
const result = await client.callTool('lookup', { id: 'item-7' });
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`sendJsonRpc` supplies the transport. Remote schemas, arguments, and result text remain untrusted data; validate application payloads at your own boundary.
|
|
59
|
+
|
|
60
|
+
## Entry point
|
|
61
|
+
|
|
62
|
+
- `@zmdb/mcp` — `MCP_PROTOCOL_VERSION`, `createMcpServer`, `createMcpClient`, `McpProtocolError`, and their public contracts.
|
|
63
|
+
|
|
64
|
+
## Documentation
|
|
65
|
+
|
|
66
|
+
Full project documentation is at **https://ambasta.github.io/zmdb/**.
|
|
67
|
+
|
|
68
|
+
## License
|
|
69
|
+
|
|
70
|
+
GNU General Public License v3.0 or later (GPL-3.0-or-later).
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface RemoteTool {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly description?: string;
|
|
4
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
5
|
+
}
|
|
6
|
+
export interface RemoteToolResult {
|
|
7
|
+
readonly content: readonly {
|
|
8
|
+
readonly type: string;
|
|
9
|
+
readonly text?: string;
|
|
10
|
+
}[];
|
|
11
|
+
readonly isError: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface McpClient {
|
|
14
|
+
listTools(): Promise<readonly RemoteTool[]>;
|
|
15
|
+
callTool(name: string, args: unknown): Promise<RemoteToolResult>;
|
|
16
|
+
}
|
|
17
|
+
export interface McpClientOptions {
|
|
18
|
+
readonly maxCalls?: number;
|
|
19
|
+
readonly maxResponseBytes?: number;
|
|
20
|
+
readonly clientInfo?: {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly version: string;
|
|
23
|
+
};
|
|
24
|
+
readonly clientCapabilities?: Readonly<Record<string, unknown>>;
|
|
25
|
+
}
|
|
26
|
+
export declare class McpProtocolError extends Error {
|
|
27
|
+
readonly code: number;
|
|
28
|
+
readonly data: unknown;
|
|
29
|
+
constructor(code: number, message: string, data?: unknown);
|
|
30
|
+
}
|
|
31
|
+
export declare function createMcpClient(send: (message: unknown) => Promise<unknown>, opts?: McpClientOptions): McpClient;
|
|
32
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,IAAI,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjE;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAKxD;CACF;AAiFD,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAwDpH"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Transport-neutral MCP client owned by @zmdb/mcp.
|
|
2
|
+
import { MCP_PROTOCOL_VERSION } from './server.js';
|
|
3
|
+
const PROTOCOL_VERSION_KEY = 'io.modelcontextprotocol/protocolVersion';
|
|
4
|
+
const CLIENT_INFO_KEY = 'io.modelcontextprotocol/clientInfo';
|
|
5
|
+
const CLIENT_CAPABILITIES_KEY = 'io.modelcontextprotocol/clientCapabilities';
|
|
6
|
+
const DEFAULT_MAX_CALLS = 64;
|
|
7
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 1024 * 1024;
|
|
8
|
+
export class McpProtocolError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
data;
|
|
11
|
+
constructor(code, message, data) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'McpProtocolError';
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.data = data;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
19
|
+
const field = (value, key) => Reflect.get(value, key);
|
|
20
|
+
const positiveSafeInteger = (value, name) => {
|
|
21
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
22
|
+
throw new RangeError(`${name} must be a positive safe integer`);
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
const boundedResponse = (value, maxResponseBytes) => {
|
|
26
|
+
const serialised = typeof value === 'string' ? value : JSON.stringify(value);
|
|
27
|
+
if (serialised === undefined)
|
|
28
|
+
throw new TypeError('MCP transport returned a non-JSON value');
|
|
29
|
+
if (new TextEncoder().encode(serialised).byteLength > maxResponseBytes) {
|
|
30
|
+
throw new RangeError(`MCP response exceeds maxResponseBytes (${String(maxResponseBytes)})`);
|
|
31
|
+
}
|
|
32
|
+
if (typeof value !== 'string')
|
|
33
|
+
return value;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new TypeError('MCP transport returned invalid JSON');
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const responseResult = (response, id, maxResponseBytes) => {
|
|
42
|
+
const bounded = boundedResponse(response, maxResponseBytes);
|
|
43
|
+
if (!isRecord(bounded) || field(bounded, 'jsonrpc') !== '2.0' || field(bounded, 'id') !== id) {
|
|
44
|
+
throw new TypeError('invalid MCP response envelope');
|
|
45
|
+
}
|
|
46
|
+
const rawError = field(bounded, 'error');
|
|
47
|
+
if (rawError !== undefined) {
|
|
48
|
+
if (!isRecord(rawError))
|
|
49
|
+
throw new TypeError('invalid MCP error response');
|
|
50
|
+
const code = field(rawError, 'code');
|
|
51
|
+
const message = field(rawError, 'message');
|
|
52
|
+
if (typeof code !== 'number' || !Number.isInteger(code) || typeof message !== 'string') {
|
|
53
|
+
throw new TypeError('invalid MCP error response');
|
|
54
|
+
}
|
|
55
|
+
throw new McpProtocolError(code, message, field(rawError, 'data'));
|
|
56
|
+
}
|
|
57
|
+
const result = field(bounded, 'result');
|
|
58
|
+
if (!isRecord(result))
|
|
59
|
+
throw new TypeError('invalid MCP result response');
|
|
60
|
+
const resultType = field(result, 'resultType');
|
|
61
|
+
if (resultType !== undefined && resultType !== 'complete') {
|
|
62
|
+
throw new TypeError(`unsupported MCP resultType ${String(resultType)}`);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
};
|
|
66
|
+
const remoteToolOf = (value) => {
|
|
67
|
+
if (!isRecord(value))
|
|
68
|
+
throw new TypeError('invalid remote MCP tool');
|
|
69
|
+
const name = field(value, 'name');
|
|
70
|
+
const description = field(value, 'description');
|
|
71
|
+
const inputSchema = field(value, 'inputSchema');
|
|
72
|
+
if (typeof name !== 'string' ||
|
|
73
|
+
(description !== undefined && typeof description !== 'string') ||
|
|
74
|
+
!isRecord(inputSchema)) {
|
|
75
|
+
throw new TypeError('invalid remote MCP tool');
|
|
76
|
+
}
|
|
77
|
+
return description === undefined ? { name, inputSchema } : { name, description, inputSchema };
|
|
78
|
+
};
|
|
79
|
+
const contentBlockOf = (value) => {
|
|
80
|
+
if (!isRecord(value))
|
|
81
|
+
throw new TypeError('invalid remote MCP content block');
|
|
82
|
+
const type = field(value, 'type');
|
|
83
|
+
const text = field(value, 'text');
|
|
84
|
+
if (typeof type !== 'string' || (text !== undefined && typeof text !== 'string')) {
|
|
85
|
+
throw new TypeError('invalid remote MCP content block');
|
|
86
|
+
}
|
|
87
|
+
return text === undefined ? { ...value, type } : { ...value, type, text };
|
|
88
|
+
};
|
|
89
|
+
export function createMcpClient(send, opts = {}) {
|
|
90
|
+
const maxCalls = positiveSafeInteger(opts.maxCalls ?? DEFAULT_MAX_CALLS, 'maxCalls');
|
|
91
|
+
const maxResponseBytes = positiveSafeInteger(opts.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES, 'maxResponseBytes');
|
|
92
|
+
const clientCapabilities = opts.clientCapabilities ?? {};
|
|
93
|
+
let nextId = 1;
|
|
94
|
+
let calls = 0;
|
|
95
|
+
const request = async (method, params) => {
|
|
96
|
+
if (calls >= maxCalls)
|
|
97
|
+
throw new RangeError(`MCP client call budget exhausted (${String(maxCalls)})`);
|
|
98
|
+
calls += 1;
|
|
99
|
+
const id = nextId;
|
|
100
|
+
nextId += 1;
|
|
101
|
+
const meta = opts.clientInfo === undefined
|
|
102
|
+
? {
|
|
103
|
+
[PROTOCOL_VERSION_KEY]: MCP_PROTOCOL_VERSION,
|
|
104
|
+
[CLIENT_CAPABILITIES_KEY]: clientCapabilities,
|
|
105
|
+
}
|
|
106
|
+
: {
|
|
107
|
+
[PROTOCOL_VERSION_KEY]: MCP_PROTOCOL_VERSION,
|
|
108
|
+
[CLIENT_INFO_KEY]: opts.clientInfo,
|
|
109
|
+
[CLIENT_CAPABILITIES_KEY]: clientCapabilities,
|
|
110
|
+
};
|
|
111
|
+
const response = await send({
|
|
112
|
+
jsonrpc: '2.0',
|
|
113
|
+
id,
|
|
114
|
+
method,
|
|
115
|
+
params: { ...params, _meta: meta },
|
|
116
|
+
});
|
|
117
|
+
return responseResult(response, id, maxResponseBytes);
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
async listTools() {
|
|
121
|
+
const result = await request('tools/list', {});
|
|
122
|
+
const tools = field(result, 'tools');
|
|
123
|
+
if (!Array.isArray(tools))
|
|
124
|
+
throw new TypeError('invalid MCP tools/list result');
|
|
125
|
+
return tools.map(remoteToolOf);
|
|
126
|
+
},
|
|
127
|
+
async callTool(name, args) {
|
|
128
|
+
const result = await request('tools/call', { name, arguments: args });
|
|
129
|
+
const content = field(result, 'content');
|
|
130
|
+
const isError = field(result, 'isError');
|
|
131
|
+
if (!Array.isArray(content) || (isError !== undefined && typeof isError !== 'boolean')) {
|
|
132
|
+
throw new TypeError('invalid MCP tools/call result');
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
content: content.map(contentBlockOf),
|
|
136
|
+
isError: isError ?? false,
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { MCP_PROTOCOL_VERSION, createMcpServer, type McpServer, type McpServerOptions } from './server.js';
|
|
2
|
+
export { McpProtocolError, createMcpClient, type McpClient, type McpClientOptions, type RemoteTool, type RemoteToolResult, } from './client.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3G,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAyC,MAAM,aAAa,CAAC;AAC3G,OAAO,EACL,gBAAgB,EAChB,eAAe,GAKhB,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const MCP_PROTOCOL_VERSION = "2026-07-28";
|
|
2
|
+
export interface McpServer {
|
|
3
|
+
handle(message: unknown, transport: unknown): Promise<unknown | undefined>;
|
|
4
|
+
}
|
|
5
|
+
export interface McpServerOptions {
|
|
6
|
+
readonly serverInfo: {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly version: string;
|
|
9
|
+
};
|
|
10
|
+
readonly identify: (transport: unknown) => Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
type McpToolHandler = {
|
|
13
|
+
bivarianceHack(input: unknown, identity?: unknown): unknown | PromiseLike<unknown>;
|
|
14
|
+
}['bivarianceHack'];
|
|
15
|
+
interface McpToolEntry {
|
|
16
|
+
readonly spec: {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly description?: string;
|
|
19
|
+
readonly parameters: unknown;
|
|
20
|
+
};
|
|
21
|
+
readonly validate: (args: unknown) => unknown;
|
|
22
|
+
readonly handler: McpToolHandler;
|
|
23
|
+
readonly effectful?: boolean;
|
|
24
|
+
}
|
|
25
|
+
type McpToolRegistry = Readonly<Record<string, McpToolEntry>>;
|
|
26
|
+
export declare function createMcpServer(tools: McpToolRegistry, opts: McpServerOptions): McpServer;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAqCjD,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED,KAAK,cAAc,GAAG;IACpB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;CACpF,CAAC,gBAAgB,CAAC,CAAC;AAEpB,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,KAAK,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AA8G9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { invokeTool } from '@zmdb/ai/tool-runtime';
|
|
2
|
+
export const MCP_PROTOCOL_VERSION = '2026-07-28';
|
|
3
|
+
const PARSE_ERROR = -32_700;
|
|
4
|
+
const INVALID_REQUEST = -32_600;
|
|
5
|
+
const METHOD_NOT_FOUND = -32_601;
|
|
6
|
+
const INVALID_PARAMS = -32_602;
|
|
7
|
+
const UNSUPPORTED_PROTOCOL_VERSION = -32_022;
|
|
8
|
+
const PROTOCOL_VERSION_KEY = 'io.modelcontextprotocol/protocolVersion';
|
|
9
|
+
const CLIENT_CAPABILITIES_KEY = 'io.modelcontextprotocol/clientCapabilities';
|
|
10
|
+
const SERVER_INFO_KEY = 'io.modelcontextprotocol/serverInfo';
|
|
11
|
+
const toolErrorId = () => [...globalThis.crypto.getRandomValues(new Uint8Array(4))].map(byte => byte.toString(16).padStart(2, '0')).join('');
|
|
12
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
13
|
+
const field = (value, key) => Reflect.get(value, key);
|
|
14
|
+
const requestIdOf = (value) => {
|
|
15
|
+
if (typeof value === 'string')
|
|
16
|
+
return value;
|
|
17
|
+
return typeof value === 'number' && Number.isSafeInteger(value) ? value : null;
|
|
18
|
+
};
|
|
19
|
+
const parseMessage = (message) => {
|
|
20
|
+
let value = message;
|
|
21
|
+
if (typeof message === 'string') {
|
|
22
|
+
try {
|
|
23
|
+
value = JSON.parse(message);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { kind: 'invalid', id: null, code: PARSE_ERROR, message: 'Parse error' };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!isRecord(value)) {
|
|
30
|
+
return { kind: 'invalid', id: null, code: INVALID_REQUEST, message: 'Invalid Request' };
|
|
31
|
+
}
|
|
32
|
+
const rawId = field(value, 'id');
|
|
33
|
+
const id = requestIdOf(rawId);
|
|
34
|
+
if (field(value, 'jsonrpc') !== '2.0' || typeof field(value, 'method') !== 'string') {
|
|
35
|
+
return { kind: 'invalid', id, code: INVALID_REQUEST, message: 'Invalid Request' };
|
|
36
|
+
}
|
|
37
|
+
if (!Object.hasOwn(value, 'id'))
|
|
38
|
+
return { kind: 'notification' };
|
|
39
|
+
if (id === null)
|
|
40
|
+
return { kind: 'invalid', id: null, code: INVALID_REQUEST, message: 'Invalid Request' };
|
|
41
|
+
const method = field(value, 'method');
|
|
42
|
+
const rawParams = field(value, 'params');
|
|
43
|
+
if (rawParams !== undefined && !isRecord(rawParams)) {
|
|
44
|
+
return { kind: 'invalid', id, code: INVALID_PARAMS, message: 'Invalid params' };
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
kind: 'request',
|
|
48
|
+
id,
|
|
49
|
+
method: typeof method === 'string' ? method : '',
|
|
50
|
+
params: rawParams ?? {},
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const errorResponse = (id, code, message, data) => ({
|
|
54
|
+
jsonrpc: '2.0',
|
|
55
|
+
id,
|
|
56
|
+
error: data === undefined ? { code, message } : { code, message, data },
|
|
57
|
+
});
|
|
58
|
+
const responseMeta = (serverInfo) => ({
|
|
59
|
+
[SERVER_INFO_KEY]: serverInfo,
|
|
60
|
+
});
|
|
61
|
+
const resultResponse = (id, serverInfo, result) => ({
|
|
62
|
+
jsonrpc: '2.0',
|
|
63
|
+
id,
|
|
64
|
+
result: {
|
|
65
|
+
...result,
|
|
66
|
+
resultType: 'complete',
|
|
67
|
+
_meta: responseMeta(serverInfo),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const protocolVersionOf = (params) => {
|
|
71
|
+
const meta = field(params, '_meta');
|
|
72
|
+
if (!isRecord(meta))
|
|
73
|
+
return undefined;
|
|
74
|
+
const version = field(meta, PROTOCOL_VERSION_KEY);
|
|
75
|
+
const capabilities = field(meta, CLIENT_CAPABILITIES_KEY);
|
|
76
|
+
return typeof version === 'string' && isRecord(capabilities) ? version : undefined;
|
|
77
|
+
};
|
|
78
|
+
const toolCallOf = (params) => {
|
|
79
|
+
const name = field(params, 'name');
|
|
80
|
+
if (typeof name !== 'string')
|
|
81
|
+
return undefined;
|
|
82
|
+
return { name, args: field(params, 'arguments') ?? {} };
|
|
83
|
+
};
|
|
84
|
+
const contentResult = (id, serverInfo, text, isError) => resultResponse(id, serverInfo, {
|
|
85
|
+
content: [{ type: 'text', text }],
|
|
86
|
+
isError,
|
|
87
|
+
});
|
|
88
|
+
export function createMcpServer(tools, opts) {
|
|
89
|
+
const entries = Object.entries(tools);
|
|
90
|
+
for (const [key, entry] of entries) {
|
|
91
|
+
if (entry.spec.name !== key) {
|
|
92
|
+
throw new Error(`tool registry key ${key} does not match spec name ${entry.spec.name}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const entriesByName = new Map(entries);
|
|
96
|
+
return {
|
|
97
|
+
async handle(message, transport) {
|
|
98
|
+
const identity = await opts.identify(transport);
|
|
99
|
+
const parsed = parseMessage(message);
|
|
100
|
+
if (parsed.kind === 'notification')
|
|
101
|
+
return undefined;
|
|
102
|
+
if (parsed.kind === 'invalid') {
|
|
103
|
+
return errorResponse(parsed.id, parsed.code, parsed.message);
|
|
104
|
+
}
|
|
105
|
+
const protocolVersion = protocolVersionOf(parsed.params);
|
|
106
|
+
if (protocolVersion === undefined) {
|
|
107
|
+
return errorResponse(parsed.id, INVALID_PARAMS, 'Missing required MCP request metadata');
|
|
108
|
+
}
|
|
109
|
+
if (protocolVersion !== MCP_PROTOCOL_VERSION) {
|
|
110
|
+
return errorResponse(parsed.id, UNSUPPORTED_PROTOCOL_VERSION, 'Unsupported protocol version', {
|
|
111
|
+
supported: [MCP_PROTOCOL_VERSION],
|
|
112
|
+
requested: protocolVersion,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (parsed.method === 'server/discover') {
|
|
116
|
+
return resultResponse(parsed.id, opts.serverInfo, {
|
|
117
|
+
supportedVersions: [MCP_PROTOCOL_VERSION],
|
|
118
|
+
capabilities: { tools: {} },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (parsed.method === 'tools/list') {
|
|
122
|
+
return resultResponse(parsed.id, opts.serverInfo, {
|
|
123
|
+
tools: entries.map(([, entry]) => entry.spec.description === undefined
|
|
124
|
+
? { name: entry.spec.name, inputSchema: entry.spec.parameters }
|
|
125
|
+
: {
|
|
126
|
+
name: entry.spec.name,
|
|
127
|
+
description: entry.spec.description,
|
|
128
|
+
inputSchema: entry.spec.parameters,
|
|
129
|
+
}),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (parsed.method !== 'tools/call') {
|
|
133
|
+
return errorResponse(parsed.id, METHOD_NOT_FOUND, 'Method not found');
|
|
134
|
+
}
|
|
135
|
+
const call = toolCallOf(parsed.params);
|
|
136
|
+
if (call === undefined)
|
|
137
|
+
return errorResponse(parsed.id, INVALID_PARAMS, 'Invalid tool call');
|
|
138
|
+
const entry = entriesByName.get(call.name);
|
|
139
|
+
if (entry === undefined)
|
|
140
|
+
return errorResponse(parsed.id, INVALID_PARAMS, `unknown tool ${call.name}`);
|
|
141
|
+
const invocation = await invokeTool(entry, call.args, identity);
|
|
142
|
+
if (invocation.kind === 'success') {
|
|
143
|
+
return contentResult(parsed.id, opts.serverInfo, invocation.content, false);
|
|
144
|
+
}
|
|
145
|
+
if (invocation.kind === 'validation-error' && invocation.content !== undefined) {
|
|
146
|
+
return contentResult(parsed.id, opts.serverInfo, invocation.content, true);
|
|
147
|
+
}
|
|
148
|
+
const id = toolErrorId();
|
|
149
|
+
return contentResult(parsed.id, opts.serverInfo, `tool ${call.name} failed (${id})`, true);
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zmdb/mcp",
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "Transport-neutral MCP client and server cores with validated tool dispatch, authenticated identity, and bounded remote calls.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"json-rpc",
|
|
8
|
+
"llm",
|
|
9
|
+
"mcp",
|
|
10
|
+
"model-context-protocol",
|
|
11
|
+
"typescript",
|
|
12
|
+
"zmdb"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/ambasta/zmdb#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/ambasta/zmdb/issues"
|
|
17
|
+
},
|
|
18
|
+
"license": "GPL-3.0-or-later",
|
|
19
|
+
"author": "zmdb contributors",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/ambasta/zmdb.git",
|
|
23
|
+
"directory": "packages/mcp"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"tag": "beta"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "node ../../scripts/build-package.mjs",
|
|
39
|
+
"test": "vitest run"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@zmdb/ai": "1.0.0-beta.1"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=26"
|
|
46
|
+
},
|
|
47
|
+
"main": "./dist/index.js",
|
|
48
|
+
"types": "./dist/index.d.ts"
|
|
49
|
+
}
|