@metorial/mcp-server 1.0.0-rc.1 → 1.0.0-rc.2
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/dist/index.cjs +54 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -5
- package/dist/index.d.ts +29 -5
- package/dist/index.js +55 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter.ts +26 -2
- package/src/auth.ts +27 -1
- package/src/index.ts +10 -0
- package/src/instance.ts +18 -5
package/dist/index.cjs
CHANGED
|
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
|
+
McpTool: () => import_mcp2.McpTool,
|
|
33
34
|
auth: () => auth,
|
|
34
35
|
clientAdapter: () => clientAdapter,
|
|
35
36
|
config: () => config,
|
|
@@ -116,6 +117,26 @@ var getAuthConfigImplementation = (configValue) => {
|
|
|
116
117
|
let self = configValue["__config__"];
|
|
117
118
|
return McpServerAuthConfig.getImplementation(self);
|
|
118
119
|
};
|
|
120
|
+
var setAuthConfigValue = (configValue, value) => {
|
|
121
|
+
let self = configValue["__config__"];
|
|
122
|
+
self.setValue(value);
|
|
123
|
+
};
|
|
124
|
+
var getAuthConfigSchema = (configValue) => {
|
|
125
|
+
let self = configValue["__config__"];
|
|
126
|
+
return self.schema.toJSONSchema({
|
|
127
|
+
unrepresentable: "any",
|
|
128
|
+
override: (ctx) => {
|
|
129
|
+
let def = ctx.zodSchema._zod.def;
|
|
130
|
+
if (def.type === "date") {
|
|
131
|
+
ctx.jsonSchema.type = "string";
|
|
132
|
+
ctx.jsonSchema.format = "date-time";
|
|
133
|
+
}
|
|
134
|
+
if (def.type === "bigint") {
|
|
135
|
+
ctx.jsonSchema.type = "number";
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
};
|
|
119
140
|
|
|
120
141
|
// src/client.ts
|
|
121
142
|
var import_mcp_transport_memory = require("@metorial/mcp-transport-memory");
|
|
@@ -234,6 +255,7 @@ var McpServerInstance = class _McpServerInstance {
|
|
|
234
255
|
configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,
|
|
235
256
|
oauth: this.instance.authConfig ? {
|
|
236
257
|
status: "enabled",
|
|
258
|
+
authConfig: getAuthConfigSchema(this.instance.authConfig),
|
|
237
259
|
hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig).tokenRefreshHandler
|
|
238
260
|
} : {
|
|
239
261
|
status: "disabled"
|
|
@@ -241,7 +263,12 @@ var McpServerInstance = class _McpServerInstance {
|
|
|
241
263
|
};
|
|
242
264
|
}
|
|
243
265
|
handleMcpMessages(opts) {
|
|
244
|
-
|
|
266
|
+
if (this.instance.config) {
|
|
267
|
+
setConfigValue(this.instance.config, opts.config);
|
|
268
|
+
}
|
|
269
|
+
if (opts.authConfig && this.instance.authConfig) {
|
|
270
|
+
setAuthConfigValue(this.instance.authConfig, opts.authConfig);
|
|
271
|
+
}
|
|
245
272
|
return handleMcpMessages(this.#server, opts.client, opts.message);
|
|
246
273
|
}
|
|
247
274
|
getOauthAuthorizationUrl(d) {
|
|
@@ -306,11 +333,24 @@ var oauthTokenRefreshMessage = import_zod3.default.object({
|
|
|
306
333
|
clientSecret: import_zod3.default.string()
|
|
307
334
|
})
|
|
308
335
|
});
|
|
336
|
+
var handleMcpMessage = import_zod3.default.object({
|
|
337
|
+
type: import_zod3.default.literal("metorial-mcp.handle-mcp-message"),
|
|
338
|
+
params: import_zod3.default.object({
|
|
339
|
+
authConfig: import_zod3.default.optional(import_zod3.default.record(import_zod3.default.string(), import_zod3.default.any())),
|
|
340
|
+
config: import_zod3.default.record(import_zod3.default.string(), import_zod3.default.any()),
|
|
341
|
+
client: import_zod3.default.object({
|
|
342
|
+
client: import_zod3.default.record(import_zod3.default.string(), import_zod3.default.any()),
|
|
343
|
+
capabilities: import_zod3.default.record(import_zod3.default.string(), import_zod3.default.any())
|
|
344
|
+
}),
|
|
345
|
+
messages: import_zod3.default.array(import_zod3.default.any())
|
|
346
|
+
})
|
|
347
|
+
});
|
|
309
348
|
var allMessages = import_zod3.default.union([
|
|
310
349
|
discoverMessage,
|
|
311
350
|
authUrlMessage,
|
|
312
351
|
oauthCallbackMessage,
|
|
313
|
-
oauthTokenRefreshMessage
|
|
352
|
+
oauthTokenRefreshMessage,
|
|
353
|
+
handleMcpMessage
|
|
314
354
|
]);
|
|
315
355
|
var serverAdapter = async (instance, messages) => Promise.all(
|
|
316
356
|
messages.map(async (message) => {
|
|
@@ -328,6 +368,14 @@ var serverAdapter = async (instance, messages) => Promise.all(
|
|
|
328
368
|
case "metorial-mcp.handle-oauth-token-refresh": {
|
|
329
369
|
return instance.handleOauthTokenRefresh(parsed.params);
|
|
330
370
|
}
|
|
371
|
+
case "metorial-mcp.handle-mcp-message": {
|
|
372
|
+
return instance.handleMcpMessages({
|
|
373
|
+
config: parsed.params.config || {},
|
|
374
|
+
authConfig: parsed.params.authConfig || {},
|
|
375
|
+
client: parsed.params.client,
|
|
376
|
+
message: parsed.params.messages
|
|
377
|
+
});
|
|
378
|
+
}
|
|
331
379
|
}
|
|
332
380
|
throw new Error(`Unknown message type: ${message.type}`);
|
|
333
381
|
})
|
|
@@ -384,8 +432,12 @@ var clientAdapter = (transport) => {
|
|
|
384
432
|
}
|
|
385
433
|
};
|
|
386
434
|
};
|
|
435
|
+
|
|
436
|
+
// src/index.ts
|
|
437
|
+
var import_mcp2 = require("@metorial/mcp");
|
|
387
438
|
// Annotate the CommonJS export names for ESM import in node:
|
|
388
439
|
0 && (module.exports = {
|
|
440
|
+
McpTool,
|
|
389
441
|
auth,
|
|
390
442
|
clientAdapter,
|
|
391
443
|
config,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/instance.ts","../src/auth.ts","../src/client.ts","../src/config.ts","../src/adapter.ts"],"sourcesContent":["export {\n createMcpServer,\n type McpServerInstance,\n type McpServerInstanceOpts,\n type McpServerInstanceServer\n} from './instance';\n\nexport {\n clientAdapter,\n serverAdapter,\n type McpServerInstanceAdapterResponses,\n type McpServerInstanceMessage\n} from './adapter';\n\nexport {\n auth,\n createAuth,\n type McpServerAuthCallbackHandler,\n type McpServerAuthCallbackHandlerParams,\n type McpServerAuthCallbackHandlerResult,\n type McpServerAuthConfig,\n type McpServerAuthTokenRefreshHandler,\n type McpServerAuthTokenRefreshHandlerParams,\n type McpServerAuthTokenRefreshHandlerResult,\n type McpServerAuthUrlHandler,\n type McpServerAuthUrlHandlerInternal,\n type McpServerAuthUrlHandlerParams,\n type McpServerAuthUrlHandlerResult,\n type McpServerAuthValue\n} from './auth';\n\nexport { config, createConfig, type McpServerConfig } from './config';\n","import {\n createMcpServer as createMcpServerInternal,\n CreateMcpServerOpts\n} from '@metorial/mcp';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp';\nimport { JSONRPCMessage } from '@modelcontextprotocol/sdk/types';\nimport {\n getAuthConfigImplementation,\n McpServerAuthCallbackHandlerParams,\n McpServerAuthTokenRefreshHandlerParams,\n McpServerAuthUrlHandlerParams\n} from './auth';\nimport { ClientOpts, handleMcpMessages } from './client';\nimport { getConfigSchema, setConfigValue } from './config';\n\nexport type McpServerInstanceServer = CreateMcpServerOpts | { server: McpServer };\nlet getServer = (instance: McpServerInstanceServer) => {\n if ('server' in instance) {\n return instance.server;\n } else {\n return createMcpServerInternal(instance);\n }\n};\n\nexport type McpServerInstanceOpts = McpServerInstanceServer & {\n config?: any;\n authConfig?: any;\n};\n\nexport class McpServerInstance {\n #server: McpServer;\n\n private constructor(private instance: McpServerInstanceOpts) {\n this.#server = getServer(instance);\n }\n\n static create(instance: McpServerInstanceOpts) {\n return new McpServerInstance(instance);\n }\n\n discover() {\n return {\n configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,\n oauth: this.instance.authConfig\n ? {\n status: 'enabled' as const,\n hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig)\n .tokenRefreshHandler\n }\n : {\n status: 'disabled' as const\n }\n };\n }\n\n handleMcpMessages(opts: { config: any; client: ClientOpts; message: JSONRPCMessage[] }) {\n setConfigValue(this.instance.config, opts.config);\n\n return handleMcpMessages(this.#server, opts.client, opts.message);\n }\n\n getOauthAuthorizationUrl(d: McpServerAuthUrlHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.getAuthUrlHandler(d);\n }\n\n handleOauthCallback(d: McpServerAuthCallbackHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.callbackHandler(d);\n }\n\n handleOauthTokenRefresh(d: McpServerAuthTokenRefreshHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n if (!impl.tokenRefreshHandler) {\n return null;\n }\n\n return impl.tokenRefreshHandler(d);\n }\n}\n\nexport let createMcpServer = (instance: McpServerInstanceOpts) => {\n return McpServerInstance.create(instance);\n};\n","import z from 'zod';\n\nexport type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n clientId: string;\n clientSecret: string;\n state: string;\n redirectUri: string;\n};\n\nexport type McpServerAuthUrlHandlerResult = {\n authorizationUrl: string;\n authState?: Record<string, string> | null;\n};\n\nexport type McpServerAuthUrlHandlerInternal = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthUrlHandler = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<string | McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthCallbackHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n clientId: string;\n clientSecret: string;\n code: string;\n state: string;\n redirectUri: string;\n callbackUrl: string;\n authorizationUrl: string;\n};\n\nexport type McpServerAuthCallbackHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthCallbackHandler = <AuthConfig extends {}>(\n d: McpServerAuthCallbackHandlerParams<AuthConfig>\n) => Promise<McpServerAuthCallbackHandlerResult>;\n\nexport type McpServerAuthTokenRefreshHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\nexport type McpServerAuthTokenRefreshHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthTokenRefreshHandler = <AuthConfig extends {}>(\n d: McpServerAuthTokenRefreshHandlerParams<AuthConfig>\n) => Promise<McpServerAuthTokenRefreshHandlerResult>;\n\nexport type McpServerAuthValue = {\n accessToken: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport class McpServerAuthConfig<AuthConfig extends {}> {\n #value: McpServerAuthValue | null = null;\n\n #getAuthUrlHandler?: McpServerAuthUrlHandlerInternal;\n #callbackHandler?: McpServerAuthCallbackHandler;\n #tokenRefreshHandler?: McpServerAuthTokenRefreshHandler;\n\n private constructor(private readonly schema: z.ZodType<AuthConfig>) {}\n\n static create<AuthConfig extends {}>(schema?: z.ZodType<AuthConfig>) {\n return new McpServerAuthConfig(schema ?? (z.object({}) as z.ZodType<AuthConfig>));\n }\n\n static getImplementation(config: McpServerAuthConfig<any>) {\n if (!config.#getAuthUrlHandler || !config.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n return {\n getAuthUrlHandler: config.#getAuthUrlHandler,\n callbackHandler: config.#callbackHandler,\n tokenRefreshHandler: config.#tokenRefreshHandler\n };\n }\n\n setValue(value: McpServerAuthValue) {\n this.#value = value;\n }\n\n getAuthorizationUrl(cb: McpServerAuthUrlHandler) {\n this.#getAuthUrlHandler = async d => {\n let res = await cb(d);\n if (typeof res == 'string') {\n return { authorizationUrl: res };\n }\n return res;\n };\n return this;\n }\n\n handleCallback(cb: McpServerAuthCallbackHandler) {\n this.#callbackHandler = cb;\n return this;\n }\n\n refreshToken(cb: McpServerAuthTokenRefreshHandler) {\n this.#tokenRefreshHandler = cb;\n return this;\n }\n\n build(): AuthConfig {\n if (!this.#getAuthUrlHandler || !this.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server auth config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as AuthConfig;\n }\n}\n\nexport let createAuth = <Config extends {}>(schema?: z.ZodType<Config>) => {\n return McpServerAuthConfig.create(schema);\n};\n\nexport let auth = <Config extends {}>(schema?: z.ZodType<Config>) => createAuth(schema);\n\nexport let getAuthConfigImplementation = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return McpServerAuthConfig.getImplementation(self);\n};\n","import { createInMemoryTransport } from '@metorial/mcp-transport-memory';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ClientCapabilities,\n JSONRPCMessage,\n Notification\n} from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nexport interface ClientOpts {\n client: {\n name: string;\n version: string;\n };\n capabilities: ClientCapabilities;\n}\n\nexport let getClient = async (\n server: McpServer,\n notificationListener: (notification: Notification) => Promise<void>,\n opts: ClientOpts\n) => {\n let transport = createInMemoryTransport();\n await server.connect(transport.server);\n\n let client = new Client(opts.client);\n\n client.registerCapabilities(opts.capabilities);\n client.fallbackNotificationHandler = notificationListener;\n\n await client.connect(transport.client);\n\n return client;\n};\n\nexport let handleMcpMessages = async (\n server: McpServer,\n opts: ClientOpts,\n messages: JSONRPCMessage[]\n) => {\n let responses: JSONRPCMessage[] = [];\n\n let client = await getClient(\n server,\n async notification => {\n responses.push(notification as JSONRPCMessage);\n },\n opts\n );\n\n let error: Error | null = null;\n\n for (let message of messages) {\n try {\n if ('id' in message) {\n let res = await client.request(message as any, z.any());\n responses.push(res);\n } else {\n await client.notification(message as any);\n }\n } catch (err) {\n error = err as Error;\n break;\n }\n }\n\n return { messages: responses, error };\n};\n","import z from 'zod';\n\nexport class McpServerConfig<Config extends {}> {\n #value: Config | null = null;\n\n private constructor(public readonly schema: z.ZodType<Config>) {}\n\n static create<Config extends {}>(schema: z.ZodType<Config>) {\n return new McpServerConfig(schema);\n }\n\n setValue(value: unknown) {\n let parsed = this.schema.parse(value);\n this.#value = parsed;\n }\n\n value(): Config {\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as Config;\n }\n}\n\nexport let createConfig = <Config extends {}>(schema: z.ZodType<Config>) => {\n return McpServerConfig.create(schema).value();\n};\n\nexport let config = <Config extends {}>(schema: z.ZodType<Config>) => createConfig(schema);\n\nexport let setConfigValue = <Config extends {}>(configValue: any, value: Config) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n self.setValue(value);\n};\n\nexport let getConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import z from 'zod';\nimport { McpServerInstance } from './instance';\n\nlet discoverMessage = z.object({\n type: z.literal('metorial-mcp.discover')\n});\ntype DiscoverMessage = z.infer<typeof discoverMessage>;\n\nlet authUrlMessage = z.object({\n type: z.literal('metorial-mcp.get-oauth-authorization-url'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n clientId: z.string(),\n clientSecret: z.string(),\n state: z.string(),\n redirectUri: z.string()\n })\n});\ntype AuthUrlMessage = z.infer<typeof authUrlMessage>;\n\nlet oauthCallbackMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-callback'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n clientId: z.string(),\n clientSecret: z.string(),\n code: z.string(),\n state: z.string(),\n redirectUri: z.string(),\n callbackUrl: z.string(),\n authorizationUrl: z.string()\n })\n});\ntype OauthCallbackMessage = z.infer<typeof oauthCallbackMessage>;\n\nlet oauthTokenRefreshMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-token-refresh'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n refreshToken: z.string(),\n clientId: z.string(),\n clientSecret: z.string()\n })\n});\ntype OauthTokenRefreshMessage = z.infer<typeof oauthTokenRefreshMessage>;\n\nlet allMessages = z.union([\n discoverMessage,\n authUrlMessage,\n oauthCallbackMessage,\n oauthTokenRefreshMessage\n]);\n\nexport type McpServerInstanceMessage =\n | DiscoverMessage\n | AuthUrlMessage\n | OauthCallbackMessage\n | OauthTokenRefreshMessage;\n\nexport let serverAdapter = async (\n instance: McpServerInstance,\n messages: McpServerInstanceMessage[]\n) =>\n Promise.all(\n messages.map(async message => {\n let parsed = allMessages.parse(message);\n\n switch (parsed.type) {\n case 'metorial-mcp.discover': {\n return instance.discover();\n }\n case 'metorial-mcp.get-oauth-authorization-url': {\n return instance.getOauthAuthorizationUrl(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-callback': {\n return instance.handleOauthCallback(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-token-refresh': {\n return instance.handleOauthTokenRefresh(parsed.params);\n }\n }\n\n throw new Error(`Unknown message type: ${(message as any).type}`);\n })\n );\n\nexport type McpServerInstanceAdapterResponses = Awaited<ReturnType<typeof serverAdapter>>;\n\nexport let clientAdapter = (\n transport: (\n messages: McpServerInstanceMessage[]\n ) => Promise<McpServerInstanceAdapterResponses>\n) => {\n let queue: {\n msg: McpServerInstanceMessage;\n resolve: (res: any) => void;\n reject: (err: any) => void;\n }[] = [];\n let isSent = { current: false };\n let isSending = { current: false };\n\n let send = async (message: McpServerInstanceMessage) => {\n let promise = new Promise<any>((resolve, reject) => {\n queue.push({ msg: message, resolve, reject });\n });\n\n if (!isSending.current) {\n isSending.current = true;\n\n setTimeout(async () => {\n isSent.current = true;\n\n try {\n let res = await transport(queue.map(q => q.msg));\n res.forEach((r, i) => {\n queue[i].resolve(r);\n });\n } catch (err) {\n queue.forEach(q => {\n q.reject(err);\n });\n } finally {\n queue = [];\n }\n }, 2);\n }\n\n return promise;\n };\n\n return {\n discover: async () => {\n return send({ type: 'metorial-mcp.discover' }) as Promise<\n Awaited<ReturnType<McpServerInstance['discover']>>\n >;\n },\n\n getOauthAuthorizationUrl: async (\n d: Parameters<McpServerInstance['getOauthAuthorizationUrl']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.get-oauth-authorization-url',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['getOauthAuthorizationUrl']>>>;\n },\n\n handleOauthCallback: async (\n d: Parameters<McpServerInstance['handleOauthCallback']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-callback',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthCallback']>>>;\n },\n\n handleOauthTokenRefresh: async (\n d: Parameters<McpServerInstance['handleOauthTokenRefresh']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-token-refresh',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthTokenRefresh']>>>;\n }\n };\n};\n"],"mappings":"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","names":["z","config","import_zod","z","createMcpServerInternal","import_zod","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/instance.ts","../src/auth.ts","../src/client.ts","../src/config.ts","../src/adapter.ts"],"sourcesContent":["export {\n createMcpServer,\n type McpServerInstance,\n type McpServerInstanceOpts,\n type McpServerInstanceServer\n} from './instance';\n\nexport {\n clientAdapter,\n serverAdapter,\n type McpServerInstanceAdapterResponses,\n type McpServerInstanceMessage\n} from './adapter';\n\nexport {\n auth,\n createAuth,\n type McpServerAuthCallbackHandler,\n type McpServerAuthCallbackHandlerParams,\n type McpServerAuthCallbackHandlerResult,\n type McpServerAuthConfig,\n type McpServerAuthTokenRefreshHandler,\n type McpServerAuthTokenRefreshHandlerParams,\n type McpServerAuthTokenRefreshHandlerResult,\n type McpServerAuthUrlHandler,\n type McpServerAuthUrlHandlerInternal,\n type McpServerAuthUrlHandlerParams,\n type McpServerAuthUrlHandlerResult,\n type McpServerAuthValue\n} from './auth';\n\nexport { config, createConfig, type McpServerConfig } from './config';\n\nexport {\n McpTool,\n type McpServerInfo,\n type McpToolAnnotations,\n type McpToolHandlerOutput,\n type McpToolHandlerOutputSync,\n type McpToolImplementation,\n type McpToolOpts\n} from '@metorial/mcp';\n","import {\n createMcpServer as createMcpServerInternal,\n CreateMcpServerOpts\n} from '@metorial/mcp';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';\nimport {\n getAuthConfigImplementation,\n getAuthConfigSchema,\n McpServerAuthCallbackHandlerParams,\n McpServerAuthTokenRefreshHandlerParams,\n McpServerAuthUrlHandlerParams,\n setAuthConfigValue\n} from './auth';\nimport { ClientOpts, handleMcpMessages } from './client';\nimport { getConfigSchema, setConfigValue } from './config';\n\nexport type McpServerInstanceServer = CreateMcpServerOpts | { server: McpServer };\nlet getServer = (instance: McpServerInstanceServer) => {\n if ('server' in instance) {\n return instance.server;\n } else {\n return createMcpServerInternal(instance);\n }\n};\n\nexport type McpServerInstanceOpts = McpServerInstanceServer & {\n config?: any;\n authConfig?: any;\n};\n\nexport class McpServerInstance {\n #server: McpServer;\n\n private constructor(private instance: McpServerInstanceOpts) {\n this.#server = getServer(instance);\n }\n\n static create(instance: McpServerInstanceOpts) {\n return new McpServerInstance(instance);\n }\n\n discover() {\n return {\n configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,\n oauth: this.instance.authConfig\n ? {\n status: 'enabled' as const,\n authConfig: getAuthConfigSchema(this.instance.authConfig),\n hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig)\n .tokenRefreshHandler\n }\n : {\n status: 'disabled' as const\n }\n };\n }\n\n handleMcpMessages(opts: {\n config: any;\n authConfig: any;\n client: ClientOpts;\n message: JSONRPCMessage[];\n }) {\n if (this.instance.config) {\n setConfigValue(this.instance.config, opts.config);\n }\n if (opts.authConfig && this.instance.authConfig) {\n setAuthConfigValue(this.instance.authConfig, opts.authConfig);\n }\n\n return handleMcpMessages(this.#server, opts.client, opts.message);\n }\n\n getOauthAuthorizationUrl(d: McpServerAuthUrlHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.getAuthUrlHandler(d);\n }\n\n handleOauthCallback(d: McpServerAuthCallbackHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.callbackHandler(d);\n }\n\n handleOauthTokenRefresh(d: McpServerAuthTokenRefreshHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n if (!impl.tokenRefreshHandler) {\n return null;\n }\n\n return impl.tokenRefreshHandler(d);\n }\n}\n\nexport let createMcpServer = (instance: McpServerInstanceOpts) => {\n return McpServerInstance.create(instance);\n};\n","import z from 'zod';\n\nexport type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n clientId: string;\n clientSecret: string;\n state: string;\n redirectUri: string;\n};\n\nexport type McpServerAuthUrlHandlerResult = {\n authorizationUrl: string;\n authState?: Record<string, string> | null;\n};\n\nexport type McpServerAuthUrlHandlerInternal = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthUrlHandler = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<string | McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthCallbackHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n clientId: string;\n clientSecret: string;\n code: string;\n state: string;\n redirectUri: string;\n callbackUrl: string;\n authorizationUrl: string;\n};\n\nexport type McpServerAuthCallbackHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthCallbackHandler = <AuthConfig extends {}>(\n d: McpServerAuthCallbackHandlerParams<AuthConfig>\n) => Promise<McpServerAuthCallbackHandlerResult>;\n\nexport type McpServerAuthTokenRefreshHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\nexport type McpServerAuthTokenRefreshHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthTokenRefreshHandler = <AuthConfig extends {}>(\n d: McpServerAuthTokenRefreshHandlerParams<AuthConfig>\n) => Promise<McpServerAuthTokenRefreshHandlerResult>;\n\nexport type McpServerAuthValue = {\n accessToken: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport class McpServerAuthConfig<AuthConfig extends {}> {\n #value: McpServerAuthValue | null = null;\n\n #getAuthUrlHandler?: McpServerAuthUrlHandlerInternal;\n #callbackHandler?: McpServerAuthCallbackHandler;\n #tokenRefreshHandler?: McpServerAuthTokenRefreshHandler;\n\n private constructor(public readonly schema: z.ZodType<AuthConfig>) {}\n\n static create<AuthConfig extends {}>(schema?: z.ZodType<AuthConfig>) {\n return new McpServerAuthConfig(schema ?? (z.object({}) as z.ZodType<AuthConfig>));\n }\n\n static getImplementation(config: McpServerAuthConfig<any>) {\n if (!config.#getAuthUrlHandler || !config.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n return {\n getAuthUrlHandler: config.#getAuthUrlHandler,\n callbackHandler: config.#callbackHandler,\n tokenRefreshHandler: config.#tokenRefreshHandler\n };\n }\n\n setValue(value: McpServerAuthValue) {\n this.#value = value;\n }\n\n getAuthorizationUrl(cb: McpServerAuthUrlHandler) {\n this.#getAuthUrlHandler = async d => {\n let res = await cb(d);\n if (typeof res == 'string') {\n return { authorizationUrl: res };\n }\n return res;\n };\n return this;\n }\n\n handleCallback(cb: McpServerAuthCallbackHandler) {\n this.#callbackHandler = cb;\n return this;\n }\n\n refreshToken(cb: McpServerAuthTokenRefreshHandler) {\n this.#tokenRefreshHandler = cb;\n return this;\n }\n\n build(): AuthConfig {\n if (!this.#getAuthUrlHandler || !this.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server auth config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as AuthConfig;\n }\n}\n\nexport let createAuth = <Config extends {}>(schema?: z.ZodType<Config>) => {\n return McpServerAuthConfig.create(schema);\n};\n\nexport let auth = <Config extends {}>(schema?: z.ZodType<Config>) => createAuth(schema);\n\nexport let getAuthConfigImplementation = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return McpServerAuthConfig.getImplementation(self);\n};\n\nexport let setAuthConfigValue = <Config extends {}>(\n configValue: any,\n value: McpServerAuthValue\n) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n self.setValue(value);\n};\n\nexport let getAuthConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import { createInMemoryTransport } from '@metorial/mcp-transport-memory';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ClientCapabilities,\n JSONRPCMessage,\n Notification\n} from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nexport interface ClientOpts {\n client: {\n name: string;\n version: string;\n };\n capabilities: ClientCapabilities;\n}\n\nexport let getClient = async (\n server: McpServer,\n notificationListener: (notification: Notification) => Promise<void>,\n opts: ClientOpts\n) => {\n let transport = createInMemoryTransport();\n await server.connect(transport.server);\n\n let client = new Client(opts.client);\n\n client.registerCapabilities(opts.capabilities);\n client.fallbackNotificationHandler = notificationListener;\n\n await client.connect(transport.client);\n\n return client;\n};\n\nexport let handleMcpMessages = async (\n server: McpServer,\n opts: ClientOpts,\n messages: JSONRPCMessage[]\n) => {\n let responses: JSONRPCMessage[] = [];\n\n let client = await getClient(\n server,\n async notification => {\n responses.push(notification as JSONRPCMessage);\n },\n opts\n );\n\n let error: Error | null = null;\n\n for (let message of messages) {\n try {\n if ('id' in message) {\n let res = await client.request(message as any, z.any());\n responses.push(res);\n } else {\n await client.notification(message as any);\n }\n } catch (err) {\n error = err as Error;\n break;\n }\n }\n\n return { messages: responses, error };\n};\n","import z from 'zod';\n\nexport class McpServerConfig<Config extends {}> {\n #value: Config | null = null;\n\n private constructor(public readonly schema: z.ZodType<Config>) {}\n\n static create<Config extends {}>(schema: z.ZodType<Config>) {\n return new McpServerConfig(schema);\n }\n\n setValue(value: unknown) {\n let parsed = this.schema.parse(value);\n this.#value = parsed;\n }\n\n value(): Config {\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as Config;\n }\n}\n\nexport let createConfig = <Config extends {}>(schema: z.ZodType<Config>) => {\n return McpServerConfig.create(schema).value();\n};\n\nexport let config = <Config extends {}>(schema: z.ZodType<Config>) => createConfig(schema);\n\nexport let setConfigValue = <Config extends {}>(configValue: any, value: Config) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n self.setValue(value);\n};\n\nexport let getConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import z from 'zod';\nimport { McpServerInstance } from './instance';\n\nlet discoverMessage = z.object({\n type: z.literal('metorial-mcp.discover')\n});\ntype DiscoverMessage = z.infer<typeof discoverMessage>;\n\nlet authUrlMessage = z.object({\n type: z.literal('metorial-mcp.get-oauth-authorization-url'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n clientId: z.string(),\n clientSecret: z.string(),\n state: z.string(),\n redirectUri: z.string()\n })\n});\ntype AuthUrlMessage = z.infer<typeof authUrlMessage>;\n\nlet oauthCallbackMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-callback'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n clientId: z.string(),\n clientSecret: z.string(),\n code: z.string(),\n state: z.string(),\n redirectUri: z.string(),\n callbackUrl: z.string(),\n authorizationUrl: z.string()\n })\n});\ntype OauthCallbackMessage = z.infer<typeof oauthCallbackMessage>;\n\nlet oauthTokenRefreshMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-token-refresh'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n refreshToken: z.string(),\n clientId: z.string(),\n clientSecret: z.string()\n })\n});\ntype OauthTokenRefreshMessage = z.infer<typeof oauthTokenRefreshMessage>;\n\nlet handleMcpMessage = z.object({\n type: z.literal('metorial-mcp.handle-mcp-message'),\n params: z.object({\n authConfig: z.optional(z.record(z.string(), z.any())),\n config: z.record(z.string(), z.any()),\n client: z.object({\n client: z.record(z.string(), z.any()),\n capabilities: z.record(z.string(), z.any())\n }),\n messages: z.array(z.any())\n })\n});\ntype HandleMcpMessage = z.infer<typeof handleMcpMessage>;\n\nlet allMessages = z.union([\n discoverMessage,\n authUrlMessage,\n oauthCallbackMessage,\n oauthTokenRefreshMessage,\n handleMcpMessage\n]);\n\nexport type McpServerInstanceMessage =\n | DiscoverMessage\n | AuthUrlMessage\n | OauthCallbackMessage\n | OauthTokenRefreshMessage\n | HandleMcpMessage;\n\nexport let serverAdapter = async (\n instance: McpServerInstance,\n messages: McpServerInstanceMessage[]\n) =>\n Promise.all(\n messages.map(async message => {\n let parsed = allMessages.parse(message);\n\n switch (parsed.type) {\n case 'metorial-mcp.discover': {\n return instance.discover();\n }\n case 'metorial-mcp.get-oauth-authorization-url': {\n return instance.getOauthAuthorizationUrl(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-callback': {\n return instance.handleOauthCallback(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-token-refresh': {\n return instance.handleOauthTokenRefresh(parsed.params);\n }\n case 'metorial-mcp.handle-mcp-message': {\n return instance.handleMcpMessages({\n config: parsed.params.config || {},\n authConfig: parsed.params.authConfig || {},\n client: parsed.params.client as any,\n message: parsed.params.messages\n });\n }\n }\n\n throw new Error(`Unknown message type: ${(message as any).type}`);\n })\n );\n\nexport type McpServerInstanceAdapterResponses = Awaited<ReturnType<typeof serverAdapter>>;\n\nexport let clientAdapter = (\n transport: (\n messages: McpServerInstanceMessage[]\n ) => Promise<McpServerInstanceAdapterResponses>\n) => {\n let queue: {\n msg: McpServerInstanceMessage;\n resolve: (res: any) => void;\n reject: (err: any) => void;\n }[] = [];\n let isSent = { current: false };\n let isSending = { current: false };\n\n let send = async (message: McpServerInstanceMessage) => {\n let promise = new Promise<any>((resolve, reject) => {\n queue.push({ msg: message, resolve, reject });\n });\n\n if (!isSending.current) {\n isSending.current = true;\n\n setTimeout(async () => {\n isSent.current = true;\n\n try {\n let res = await transport(queue.map(q => q.msg));\n res.forEach((r, i) => {\n queue[i].resolve(r);\n });\n } catch (err) {\n queue.forEach(q => {\n q.reject(err);\n });\n } finally {\n queue = [];\n }\n }, 2);\n }\n\n return promise;\n };\n\n return {\n discover: async () => {\n return send({ type: 'metorial-mcp.discover' }) as Promise<\n Awaited<ReturnType<McpServerInstance['discover']>>\n >;\n },\n\n getOauthAuthorizationUrl: async (\n d: Parameters<McpServerInstance['getOauthAuthorizationUrl']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.get-oauth-authorization-url',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['getOauthAuthorizationUrl']>>>;\n },\n\n handleOauthCallback: async (\n d: Parameters<McpServerInstance['handleOauthCallback']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-callback',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthCallback']>>>;\n },\n\n handleOauthTokenRefresh: async (\n d: Parameters<McpServerInstance['handleOauthTokenRefresh']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-token-refresh',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthTokenRefresh']>>>;\n }\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAGO;;;ACHP,iBAAc;AA6EP,IAAM,sBAAN,MAAM,qBAA2C;AAAA,EAO9C,YAA4B,QAA+B;AAA/B;AAAA,EAAgC;AAAA,EANpE,SAAoC;AAAA,EAEpC;AAAA,EACA;AAAA,EACA;AAAA,EAIA,OAAO,OAA8B,QAAgC;AACnE,WAAO,IAAI,qBAAoB,UAAW,WAAAA,QAAE,OAAO,CAAC,CAAC,CAA2B;AAAA,EAClF;AAAA,EAEA,OAAO,kBAAkBC,SAAkC;AACzD,QAAI,CAACA,QAAO,sBAAsB,CAACA,QAAO,kBAAkB;AAC1D,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,WAAO;AAAA,MACL,mBAAmBA,QAAO;AAAA,MAC1B,iBAAiBA,QAAO;AAAA,MACxB,qBAAqBA,QAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,SAAS,OAA2B;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,oBAAoB,IAA6B;AAC/C,SAAK,qBAAqB,OAAM,MAAK;AACnC,UAAI,MAAM,MAAM,GAAG,CAAC;AACpB,UAAI,OAAO,OAAO,UAAU;AAC1B,eAAO,EAAE,kBAAkB,IAAI;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,IAAkC;AAC/C,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,IAAsC;AACjD,SAAK,uBAAuB;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,QAAoB;AAClB,QAAI,CAAC,KAAK,sBAAsB,CAAC,KAAK,kBAAkB;AACtD,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,QAAI,OAAO;AAIX,WAAO,IAAI;AAAA,MACT,CAAC;AAAA,MACD;AAAA,QACE,KAAK,CAAC,QAAQ,MAAM,aAAa;AAC/B,cAAI,QAAQ,cAAc;AACxB,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,WAAW,MAAM;AACxB,kBAAM,IAAI,MAAM,sCAAsC;AAAA,UACxD;AAEA,iBAAQ,KAAK,OAAe,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAI,aAAa,CAAoB,WAA+B;AACzE,SAAO,oBAAoB,OAAO,MAAM;AAC1C;AAEO,IAAI,OAAO,CAAoB,WAA+B,WAAW,MAAM;AAE/E,IAAI,8BAA8B,CAAoB,gBAAqB;AAChF,MAAI,OAAO,YAAY,YAAY;AACnC,SAAO,oBAAoB,kBAAkB,IAAI;AACnD;AAEO,IAAI,qBAAqB,CAC9B,aACA,UACG;AACH,MAAI,OAAO,YAAY,YAAY;AACnC,OAAK,SAAS,KAAK;AACrB;AAEO,IAAI,sBAAsB,CAAoB,gBAAqB;AACxE,MAAI,OAAO,YAAY,YAAY;AACnC,SAAO,KAAK,OAAO,aAAa;AAAA,IAC9B,iBAAiB;AAAA,IACjB,UAAU,SAAO;AACf,UAAI,MAAM,IAAI,UAAU,KAAK;AAE7B,UAAI,IAAI,SAAS,QAAQ;AACvB,YAAI,WAAW,OAAO;AACtB,YAAI,WAAW,SAAS;AAAA,MAC1B;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,YAAI,WAAW,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC9LA,kCAAwC;AACxC,oBAAuB;AAOvB,IAAAC,cAAc;AAUP,IAAI,YAAY,OACrB,QACA,sBACA,SACG;AACH,MAAI,gBAAY,qDAAwB;AACxC,QAAM,OAAO,QAAQ,UAAU,MAAM;AAErC,MAAI,SAAS,IAAI,qBAAO,KAAK,MAAM;AAEnC,SAAO,qBAAqB,KAAK,YAAY;AAC7C,SAAO,8BAA8B;AAErC,QAAM,OAAO,QAAQ,UAAU,MAAM;AAErC,SAAO;AACT;AAEO,IAAI,oBAAoB,OAC7B,QACA,MACA,aACG;AACH,MAAI,YAA8B,CAAC;AAEnC,MAAI,SAAS,MAAM;AAAA,IACjB;AAAA,IACA,OAAM,iBAAgB;AACpB,gBAAU,KAAK,YAA8B;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAsB;AAE1B,WAAS,WAAW,UAAU;AAC5B,QAAI;AACF,UAAI,QAAQ,SAAS;AACnB,YAAI,MAAM,MAAM,OAAO,QAAQ,SAAgB,YAAAC,QAAE,IAAI,CAAC;AACtD,kBAAU,KAAK,GAAG;AAAA,MACpB,OAAO;AACL,cAAM,OAAO,aAAa,OAAc;AAAA,MAC1C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ;AACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,WAAW,MAAM;AACtC;;;AClEO,IAAM,kBAAN,MAAM,iBAAmC;AAAA,EAGtC,YAA4B,QAA2B;AAA3B;AAAA,EAA4B;AAAA,EAFhE,SAAwB;AAAA,EAIxB,OAAO,OAA0B,QAA2B;AAC1D,WAAO,IAAI,iBAAgB,MAAM;AAAA,EACnC;AAAA,EAEA,SAAS,OAAgB;AACvB,QAAI,SAAS,KAAK,OAAO,MAAM,KAAK;AACpC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAgB;AACd,QAAI,OAAO;AAIX,WAAO,IAAI;AAAA,MACT,CAAC;AAAA,MACD;AAAA,QACE,KAAK,CAAC,QAAQ,MAAM,aAAa;AAC/B,cAAI,QAAQ,cAAc;AACxB,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,WAAW,MAAM;AACxB,kBAAM,IAAI,MAAM,iCAAiC;AAAA,UACnD;AAEA,iBAAQ,KAAK,OAAe,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAI,eAAe,CAAoB,WAA8B;AAC1E,SAAO,gBAAgB,OAAO,MAAM,EAAE,MAAM;AAC9C;AAEO,IAAI,SAAS,CAAoB,WAA8B,aAAa,MAAM;AAElF,IAAI,iBAAiB,CAAoB,aAAkB,UAAkB;AAClF,MAAI,OAAO,YAAY,YAAY;AACnC,OAAK,SAAS,KAAK;AACrB;AAEO,IAAI,kBAAkB,CAAoB,gBAAqB;AACpE,MAAI,OAAO,YAAY,YAAY;AACnC,SAAO,KAAK,OAAO,aAAa;AAAA,IAC9B,iBAAiB;AAAA,IACjB,UAAU,SAAO;AACf,UAAI,MAAM,IAAI,UAAU,KAAK;AAE7B,UAAI,IAAI,SAAS,QAAQ;AACvB,YAAI,WAAW,OAAO;AACtB,YAAI,WAAW,SAAS;AAAA,MAC1B;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,YAAI,WAAW,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AHjDA,IAAI,YAAY,CAAC,aAAsC;AACrD,MAAI,YAAY,UAAU;AACxB,WAAO,SAAS;AAAA,EAClB,OAAO;AACL,eAAO,WAAAC,iBAAwB,QAAQ;AAAA,EACzC;AACF;AAOO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAGrB,YAAoB,UAAiC;AAAjC;AAC1B,SAAK,UAAU,UAAU,QAAQ;AAAA,EACnC;AAAA,EAJA;AAAA,EAMA,OAAO,OAAO,UAAiC;AAC7C,WAAO,IAAI,mBAAkB,QAAQ;AAAA,EACvC;AAAA,EAEA,WAAW;AACT,WAAO;AAAA,MACL,cAAc,KAAK,SAAS,SAAS,gBAAgB,KAAK,SAAS,MAAM,IAAI;AAAA,MAC7E,OAAO,KAAK,SAAS,aACjB;AAAA,QACE,QAAQ;AAAA,QACR,YAAY,oBAAoB,KAAK,SAAS,UAAU;AAAA,QACxD,iBAAiB,CAAC,CAAC,4BAA4B,KAAK,SAAS,UAAU,EACpE;AAAA,MACL,IACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,IACN;AAAA,EACF;AAAA,EAEA,kBAAkB,MAKf;AACD,QAAI,KAAK,SAAS,QAAQ;AACxB,qBAAe,KAAK,SAAS,QAAQ,KAAK,MAAM;AAAA,IAClD;AACA,QAAI,KAAK,cAAc,KAAK,SAAS,YAAY;AAC/C,yBAAmB,KAAK,SAAS,YAAY,KAAK,UAAU;AAAA,IAC9D;AAEA,WAAO,kBAAkB,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO;AAAA,EAClE;AAAA,EAEA,yBAAyB,GAAuC;AAC9D,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,WAAO,KAAK,kBAAkB,CAAC;AAAA,EACjC;AAAA,EAEA,oBAAoB,GAA4C;AAC9D,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,WAAO,KAAK,gBAAgB,CAAC;AAAA,EAC/B;AAAA,EAEA,wBAAwB,GAAgD;AACtE,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,oBAAoB,CAAC;AAAA,EACnC;AACF;AAEO,IAAI,kBAAkB,CAAC,aAAoC;AAChE,SAAO,kBAAkB,OAAO,QAAQ;AAC1C;;;AItGA,IAAAC,cAAc;AAGd,IAAI,kBAAkB,YAAAC,QAAE,OAAO;AAAA,EAC7B,MAAM,YAAAA,QAAE,QAAQ,uBAAuB;AACzC,CAAC;AAGD,IAAI,iBAAiB,YAAAA,QAAE,OAAO;AAAA,EAC5B,MAAM,YAAAA,QAAE,QAAQ,0CAA0C;AAAA,EAC1D,QAAQ,YAAAA,QAAE,OAAO;AAAA,IACf,YAAY,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,IACxC,UAAU,YAAAA,QAAE,OAAO;AAAA,IACnB,cAAc,YAAAA,QAAE,OAAO;AAAA,IACvB,OAAO,YAAAA,QAAE,OAAO;AAAA,IAChB,aAAa,YAAAA,QAAE,OAAO;AAAA,EACxB,CAAC;AACH,CAAC;AAGD,IAAI,uBAAuB,YAAAA,QAAE,OAAO;AAAA,EAClC,MAAM,YAAAA,QAAE,QAAQ,oCAAoC;AAAA,EACpD,QAAQ,YAAAA,QAAE,OAAO;AAAA,IACf,YAAY,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,IACxC,WAAW,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,OAAO,CAAC;AAAA,IAC1C,UAAU,YAAAA,QAAE,OAAO;AAAA,IACnB,cAAc,YAAAA,QAAE,OAAO;AAAA,IACvB,MAAM,YAAAA,QAAE,OAAO;AAAA,IACf,OAAO,YAAAA,QAAE,OAAO;AAAA,IAChB,aAAa,YAAAA,QAAE,OAAO;AAAA,IACtB,aAAa,YAAAA,QAAE,OAAO;AAAA,IACtB,kBAAkB,YAAAA,QAAE,OAAO;AAAA,EAC7B,CAAC;AACH,CAAC;AAGD,IAAI,2BAA2B,YAAAA,QAAE,OAAO;AAAA,EACtC,MAAM,YAAAA,QAAE,QAAQ,yCAAyC;AAAA,EACzD,QAAQ,YAAAA,QAAE,OAAO;AAAA,IACf,YAAY,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,IACxC,WAAW,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,OAAO,CAAC;AAAA,IAC1C,cAAc,YAAAA,QAAE,OAAO;AAAA,IACvB,UAAU,YAAAA,QAAE,OAAO;AAAA,IACnB,cAAc,YAAAA,QAAE,OAAO;AAAA,EACzB,CAAC;AACH,CAAC;AAGD,IAAI,mBAAmB,YAAAA,QAAE,OAAO;AAAA,EAC9B,MAAM,YAAAA,QAAE,QAAQ,iCAAiC;AAAA,EACjD,QAAQ,YAAAA,QAAE,OAAO;AAAA,IACf,YAAY,YAAAA,QAAE,SAAS,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC,CAAC;AAAA,IACpD,QAAQ,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,IACpC,QAAQ,YAAAA,QAAE,OAAO;AAAA,MACf,QAAQ,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,MACpC,cAAc,YAAAA,QAAE,OAAO,YAAAA,QAAE,OAAO,GAAG,YAAAA,QAAE,IAAI,CAAC;AAAA,IAC5C,CAAC;AAAA,IACD,UAAU,YAAAA,QAAE,MAAM,YAAAA,QAAE,IAAI,CAAC;AAAA,EAC3B,CAAC;AACH,CAAC;AAGD,IAAI,cAAc,YAAAA,QAAE,MAAM;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,IAAI,gBAAgB,OACzB,UACA,aAEA,QAAQ;AAAA,EACN,SAAS,IAAI,OAAM,YAAW;AAC5B,QAAI,SAAS,YAAY,MAAM,OAAO;AAEtC,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,yBAAyB;AAC5B,eAAO,SAAS,SAAS;AAAA,MAC3B;AAAA,MACA,KAAK,4CAA4C;AAC/C,eAAO,SAAS,yBAAyB,OAAO,MAAM;AAAA,MACxD;AAAA,MACA,KAAK,sCAAsC;AACzC,eAAO,SAAS,oBAAoB,OAAO,MAAM;AAAA,MACnD;AAAA,MACA,KAAK,2CAA2C;AAC9C,eAAO,SAAS,wBAAwB,OAAO,MAAM;AAAA,MACvD;AAAA,MACA,KAAK,mCAAmC;AACtC,eAAO,SAAS,kBAAkB;AAAA,UAChC,QAAQ,OAAO,OAAO,UAAU,CAAC;AAAA,UACjC,YAAY,OAAO,OAAO,cAAc,CAAC;AAAA,UACzC,QAAQ,OAAO,OAAO;AAAA,UACtB,SAAS,OAAO,OAAO;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yBAA0B,QAAgB,IAAI,EAAE;AAAA,EAClE,CAAC;AACH;AAIK,IAAI,gBAAgB,CACzB,cAGG;AACH,MAAI,QAIE,CAAC;AACP,MAAI,SAAS,EAAE,SAAS,MAAM;AAC9B,MAAI,YAAY,EAAE,SAAS,MAAM;AAEjC,MAAI,OAAO,OAAO,YAAsC;AACtD,QAAI,UAAU,IAAI,QAAa,CAAC,SAAS,WAAW;AAClD,YAAM,KAAK,EAAE,KAAK,SAAS,SAAS,OAAO,CAAC;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,UAAU,SAAS;AACtB,gBAAU,UAAU;AAEpB,iBAAW,YAAY;AACrB,eAAO,UAAU;AAEjB,YAAI;AACF,cAAI,MAAM,MAAM,UAAU,MAAM,IAAI,OAAK,EAAE,GAAG,CAAC;AAC/C,cAAI,QAAQ,CAAC,GAAG,MAAM;AACpB,kBAAM,CAAC,EAAE,QAAQ,CAAC;AAAA,UACpB,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,gBAAM,QAAQ,OAAK;AACjB,cAAE,OAAO,GAAG;AAAA,UACd,CAAC;AAAA,QACH,UAAE;AACA,kBAAQ,CAAC;AAAA,QACX;AAAA,MACF,GAAG,CAAC;AAAA,IACN;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU,YAAY;AACpB,aAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAAA,IAG/C;AAAA,IAEA,0BAA0B,OACxB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IAEA,qBAAqB,OACnB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IAEA,yBAAyB,OACvB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AL7JA,IAAAC,cAQO;","names":["z","config","import_zod","z","createMcpServerInternal","import_zod","z","import_mcp"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,9 +2,10 @@ import * as z from 'zod';
|
|
|
2
2
|
import z__default from 'zod';
|
|
3
3
|
import * as zod_v4_core from 'zod/v4/core';
|
|
4
4
|
import { CreateMcpServerOpts } from '@metorial/mcp';
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
export { McpServerInfo, McpTool, McpToolAnnotations, McpToolHandlerOutput, McpToolHandlerOutputSync, McpToolImplementation, McpToolOpts } from '@metorial/mcp';
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { ClientCapabilities, JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import * as _modelcontextprotocol_sdk_types from '@modelcontextprotocol/sdk/types';
|
|
8
9
|
|
|
9
10
|
type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {
|
|
10
11
|
authConfig: AuthConfig;
|
|
@@ -64,7 +65,7 @@ type McpServerAuthValue = {
|
|
|
64
65
|
};
|
|
65
66
|
declare class McpServerAuthConfig<AuthConfig extends {}> {
|
|
66
67
|
#private;
|
|
67
|
-
|
|
68
|
+
readonly schema: z__default.ZodType<AuthConfig>;
|
|
68
69
|
private constructor();
|
|
69
70
|
static create<AuthConfig extends {}>(schema?: z__default.ZodType<AuthConfig>): McpServerAuthConfig<AuthConfig>;
|
|
70
71
|
static getImplementation(config: McpServerAuthConfig<any>): {
|
|
@@ -105,14 +106,17 @@ declare class McpServerInstance {
|
|
|
105
106
|
configSchema: zod_v4_core.ZodStandardJSONSchemaPayload<z.ZodType<{}, unknown, zod_v4_core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
106
107
|
oauth: {
|
|
107
108
|
status: "enabled";
|
|
109
|
+
authConfig: zod_v4_core.ZodStandardJSONSchemaPayload<z.ZodType<{}, unknown, zod_v4_core.$ZodTypeInternals<{}, unknown>>>;
|
|
108
110
|
hasTokenRefresh: boolean;
|
|
109
111
|
} | {
|
|
110
112
|
status: "disabled";
|
|
113
|
+
authConfig?: undefined;
|
|
111
114
|
hasTokenRefresh?: undefined;
|
|
112
115
|
};
|
|
113
116
|
};
|
|
114
117
|
handleMcpMessages(opts: {
|
|
115
118
|
config: any;
|
|
119
|
+
authConfig: any;
|
|
116
120
|
client: ClientOpts;
|
|
117
121
|
message: JSONRPCMessage[];
|
|
118
122
|
}): Promise<{
|
|
@@ -166,14 +170,32 @@ declare let oauthTokenRefreshMessage: z__default.ZodObject<{
|
|
|
166
170
|
}, z__default.core.$strip>;
|
|
167
171
|
}, z__default.core.$strip>;
|
|
168
172
|
type OauthTokenRefreshMessage = z__default.infer<typeof oauthTokenRefreshMessage>;
|
|
169
|
-
|
|
173
|
+
declare let handleMcpMessage: z__default.ZodObject<{
|
|
174
|
+
type: z__default.ZodLiteral<"metorial-mcp.handle-mcp-message">;
|
|
175
|
+
params: z__default.ZodObject<{
|
|
176
|
+
authConfig: z__default.ZodOptional<z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>>;
|
|
177
|
+
config: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
178
|
+
client: z__default.ZodObject<{
|
|
179
|
+
client: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
180
|
+
capabilities: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
181
|
+
}, z__default.core.$strip>;
|
|
182
|
+
messages: z__default.ZodArray<z__default.ZodAny>;
|
|
183
|
+
}, z__default.core.$strip>;
|
|
184
|
+
}, z__default.core.$strip>;
|
|
185
|
+
type HandleMcpMessage = z__default.infer<typeof handleMcpMessage>;
|
|
186
|
+
type McpServerInstanceMessage = DiscoverMessage | AuthUrlMessage | OauthCallbackMessage | OauthTokenRefreshMessage | HandleMcpMessage;
|
|
170
187
|
declare let serverAdapter: (instance: McpServerInstance, messages: McpServerInstanceMessage[]) => Promise<(McpServerAuthUrlHandlerResult | McpServerAuthCallbackHandlerResult | {
|
|
188
|
+
messages: _modelcontextprotocol_sdk_types.JSONRPCMessage[];
|
|
189
|
+
error: Error | null;
|
|
190
|
+
} | {
|
|
171
191
|
configSchema: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
172
192
|
oauth: {
|
|
173
193
|
status: "enabled";
|
|
194
|
+
authConfig: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>>;
|
|
174
195
|
hasTokenRefresh: boolean;
|
|
175
196
|
} | {
|
|
176
197
|
status: "disabled";
|
|
198
|
+
authConfig?: undefined;
|
|
177
199
|
hasTokenRefresh?: undefined;
|
|
178
200
|
};
|
|
179
201
|
} | null)[]>;
|
|
@@ -183,9 +205,11 @@ declare let clientAdapter: (transport: (messages: McpServerInstanceMessage[]) =>
|
|
|
183
205
|
configSchema: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
184
206
|
oauth: {
|
|
185
207
|
status: "enabled";
|
|
208
|
+
authConfig: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>>;
|
|
186
209
|
hasTokenRefresh: boolean;
|
|
187
210
|
} | {
|
|
188
211
|
status: "disabled";
|
|
212
|
+
authConfig?: undefined;
|
|
189
213
|
hasTokenRefresh?: undefined;
|
|
190
214
|
};
|
|
191
215
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import * as z from 'zod';
|
|
|
2
2
|
import z__default from 'zod';
|
|
3
3
|
import * as zod_v4_core from 'zod/v4/core';
|
|
4
4
|
import { CreateMcpServerOpts } from '@metorial/mcp';
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
export { McpServerInfo, McpTool, McpToolAnnotations, McpToolHandlerOutput, McpToolHandlerOutputSync, McpToolImplementation, McpToolOpts } from '@metorial/mcp';
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { ClientCapabilities, JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import * as _modelcontextprotocol_sdk_types from '@modelcontextprotocol/sdk/types';
|
|
8
9
|
|
|
9
10
|
type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {
|
|
10
11
|
authConfig: AuthConfig;
|
|
@@ -64,7 +65,7 @@ type McpServerAuthValue = {
|
|
|
64
65
|
};
|
|
65
66
|
declare class McpServerAuthConfig<AuthConfig extends {}> {
|
|
66
67
|
#private;
|
|
67
|
-
|
|
68
|
+
readonly schema: z__default.ZodType<AuthConfig>;
|
|
68
69
|
private constructor();
|
|
69
70
|
static create<AuthConfig extends {}>(schema?: z__default.ZodType<AuthConfig>): McpServerAuthConfig<AuthConfig>;
|
|
70
71
|
static getImplementation(config: McpServerAuthConfig<any>): {
|
|
@@ -105,14 +106,17 @@ declare class McpServerInstance {
|
|
|
105
106
|
configSchema: zod_v4_core.ZodStandardJSONSchemaPayload<z.ZodType<{}, unknown, zod_v4_core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
106
107
|
oauth: {
|
|
107
108
|
status: "enabled";
|
|
109
|
+
authConfig: zod_v4_core.ZodStandardJSONSchemaPayload<z.ZodType<{}, unknown, zod_v4_core.$ZodTypeInternals<{}, unknown>>>;
|
|
108
110
|
hasTokenRefresh: boolean;
|
|
109
111
|
} | {
|
|
110
112
|
status: "disabled";
|
|
113
|
+
authConfig?: undefined;
|
|
111
114
|
hasTokenRefresh?: undefined;
|
|
112
115
|
};
|
|
113
116
|
};
|
|
114
117
|
handleMcpMessages(opts: {
|
|
115
118
|
config: any;
|
|
119
|
+
authConfig: any;
|
|
116
120
|
client: ClientOpts;
|
|
117
121
|
message: JSONRPCMessage[];
|
|
118
122
|
}): Promise<{
|
|
@@ -166,14 +170,32 @@ declare let oauthTokenRefreshMessage: z__default.ZodObject<{
|
|
|
166
170
|
}, z__default.core.$strip>;
|
|
167
171
|
}, z__default.core.$strip>;
|
|
168
172
|
type OauthTokenRefreshMessage = z__default.infer<typeof oauthTokenRefreshMessage>;
|
|
169
|
-
|
|
173
|
+
declare let handleMcpMessage: z__default.ZodObject<{
|
|
174
|
+
type: z__default.ZodLiteral<"metorial-mcp.handle-mcp-message">;
|
|
175
|
+
params: z__default.ZodObject<{
|
|
176
|
+
authConfig: z__default.ZodOptional<z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>>;
|
|
177
|
+
config: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
178
|
+
client: z__default.ZodObject<{
|
|
179
|
+
client: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
180
|
+
capabilities: z__default.ZodRecord<z__default.ZodString, z__default.ZodAny>;
|
|
181
|
+
}, z__default.core.$strip>;
|
|
182
|
+
messages: z__default.ZodArray<z__default.ZodAny>;
|
|
183
|
+
}, z__default.core.$strip>;
|
|
184
|
+
}, z__default.core.$strip>;
|
|
185
|
+
type HandleMcpMessage = z__default.infer<typeof handleMcpMessage>;
|
|
186
|
+
type McpServerInstanceMessage = DiscoverMessage | AuthUrlMessage | OauthCallbackMessage | OauthTokenRefreshMessage | HandleMcpMessage;
|
|
170
187
|
declare let serverAdapter: (instance: McpServerInstance, messages: McpServerInstanceMessage[]) => Promise<(McpServerAuthUrlHandlerResult | McpServerAuthCallbackHandlerResult | {
|
|
188
|
+
messages: _modelcontextprotocol_sdk_types.JSONRPCMessage[];
|
|
189
|
+
error: Error | null;
|
|
190
|
+
} | {
|
|
171
191
|
configSchema: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
172
192
|
oauth: {
|
|
173
193
|
status: "enabled";
|
|
194
|
+
authConfig: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>>;
|
|
174
195
|
hasTokenRefresh: boolean;
|
|
175
196
|
} | {
|
|
176
197
|
status: "disabled";
|
|
198
|
+
authConfig?: undefined;
|
|
177
199
|
hasTokenRefresh?: undefined;
|
|
178
200
|
};
|
|
179
201
|
} | null)[]>;
|
|
@@ -183,9 +205,11 @@ declare let clientAdapter: (transport: (messages: McpServerInstanceMessage[]) =>
|
|
|
183
205
|
configSchema: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>> | null;
|
|
184
206
|
oauth: {
|
|
185
207
|
status: "enabled";
|
|
208
|
+
authConfig: z__default.core.ZodStandardJSONSchemaPayload<z__default.ZodType<{}, unknown, z__default.core.$ZodTypeInternals<{}, unknown>>>;
|
|
186
209
|
hasTokenRefresh: boolean;
|
|
187
210
|
} | {
|
|
188
211
|
status: "disabled";
|
|
212
|
+
authConfig?: undefined;
|
|
189
213
|
hasTokenRefresh?: undefined;
|
|
190
214
|
};
|
|
191
215
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -76,6 +76,26 @@ var getAuthConfigImplementation = (configValue) => {
|
|
|
76
76
|
let self = configValue["__config__"];
|
|
77
77
|
return McpServerAuthConfig.getImplementation(self);
|
|
78
78
|
};
|
|
79
|
+
var setAuthConfigValue = (configValue, value) => {
|
|
80
|
+
let self = configValue["__config__"];
|
|
81
|
+
self.setValue(value);
|
|
82
|
+
};
|
|
83
|
+
var getAuthConfigSchema = (configValue) => {
|
|
84
|
+
let self = configValue["__config__"];
|
|
85
|
+
return self.schema.toJSONSchema({
|
|
86
|
+
unrepresentable: "any",
|
|
87
|
+
override: (ctx) => {
|
|
88
|
+
let def = ctx.zodSchema._zod.def;
|
|
89
|
+
if (def.type === "date") {
|
|
90
|
+
ctx.jsonSchema.type = "string";
|
|
91
|
+
ctx.jsonSchema.format = "date-time";
|
|
92
|
+
}
|
|
93
|
+
if (def.type === "bigint") {
|
|
94
|
+
ctx.jsonSchema.type = "number";
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
};
|
|
79
99
|
|
|
80
100
|
// src/client.ts
|
|
81
101
|
import { createInMemoryTransport } from "@metorial/mcp-transport-memory";
|
|
@@ -194,6 +214,7 @@ var McpServerInstance = class _McpServerInstance {
|
|
|
194
214
|
configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,
|
|
195
215
|
oauth: this.instance.authConfig ? {
|
|
196
216
|
status: "enabled",
|
|
217
|
+
authConfig: getAuthConfigSchema(this.instance.authConfig),
|
|
197
218
|
hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig).tokenRefreshHandler
|
|
198
219
|
} : {
|
|
199
220
|
status: "disabled"
|
|
@@ -201,7 +222,12 @@ var McpServerInstance = class _McpServerInstance {
|
|
|
201
222
|
};
|
|
202
223
|
}
|
|
203
224
|
handleMcpMessages(opts) {
|
|
204
|
-
|
|
225
|
+
if (this.instance.config) {
|
|
226
|
+
setConfigValue(this.instance.config, opts.config);
|
|
227
|
+
}
|
|
228
|
+
if (opts.authConfig && this.instance.authConfig) {
|
|
229
|
+
setAuthConfigValue(this.instance.authConfig, opts.authConfig);
|
|
230
|
+
}
|
|
205
231
|
return handleMcpMessages(this.#server, opts.client, opts.message);
|
|
206
232
|
}
|
|
207
233
|
getOauthAuthorizationUrl(d) {
|
|
@@ -266,11 +292,24 @@ var oauthTokenRefreshMessage = z3.object({
|
|
|
266
292
|
clientSecret: z3.string()
|
|
267
293
|
})
|
|
268
294
|
});
|
|
295
|
+
var handleMcpMessage = z3.object({
|
|
296
|
+
type: z3.literal("metorial-mcp.handle-mcp-message"),
|
|
297
|
+
params: z3.object({
|
|
298
|
+
authConfig: z3.optional(z3.record(z3.string(), z3.any())),
|
|
299
|
+
config: z3.record(z3.string(), z3.any()),
|
|
300
|
+
client: z3.object({
|
|
301
|
+
client: z3.record(z3.string(), z3.any()),
|
|
302
|
+
capabilities: z3.record(z3.string(), z3.any())
|
|
303
|
+
}),
|
|
304
|
+
messages: z3.array(z3.any())
|
|
305
|
+
})
|
|
306
|
+
});
|
|
269
307
|
var allMessages = z3.union([
|
|
270
308
|
discoverMessage,
|
|
271
309
|
authUrlMessage,
|
|
272
310
|
oauthCallbackMessage,
|
|
273
|
-
oauthTokenRefreshMessage
|
|
311
|
+
oauthTokenRefreshMessage,
|
|
312
|
+
handleMcpMessage
|
|
274
313
|
]);
|
|
275
314
|
var serverAdapter = async (instance, messages) => Promise.all(
|
|
276
315
|
messages.map(async (message) => {
|
|
@@ -288,6 +327,14 @@ var serverAdapter = async (instance, messages) => Promise.all(
|
|
|
288
327
|
case "metorial-mcp.handle-oauth-token-refresh": {
|
|
289
328
|
return instance.handleOauthTokenRefresh(parsed.params);
|
|
290
329
|
}
|
|
330
|
+
case "metorial-mcp.handle-mcp-message": {
|
|
331
|
+
return instance.handleMcpMessages({
|
|
332
|
+
config: parsed.params.config || {},
|
|
333
|
+
authConfig: parsed.params.authConfig || {},
|
|
334
|
+
client: parsed.params.client,
|
|
335
|
+
message: parsed.params.messages
|
|
336
|
+
});
|
|
337
|
+
}
|
|
291
338
|
}
|
|
292
339
|
throw new Error(`Unknown message type: ${message.type}`);
|
|
293
340
|
})
|
|
@@ -344,7 +391,13 @@ var clientAdapter = (transport) => {
|
|
|
344
391
|
}
|
|
345
392
|
};
|
|
346
393
|
};
|
|
394
|
+
|
|
395
|
+
// src/index.ts
|
|
396
|
+
import {
|
|
397
|
+
McpTool
|
|
398
|
+
} from "@metorial/mcp";
|
|
347
399
|
export {
|
|
400
|
+
McpTool,
|
|
348
401
|
auth,
|
|
349
402
|
clientAdapter,
|
|
350
403
|
config,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/instance.ts","../src/auth.ts","../src/client.ts","../src/config.ts","../src/adapter.ts"],"sourcesContent":["import {\n createMcpServer as createMcpServerInternal,\n CreateMcpServerOpts\n} from '@metorial/mcp';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp';\nimport { JSONRPCMessage } from '@modelcontextprotocol/sdk/types';\nimport {\n getAuthConfigImplementation,\n McpServerAuthCallbackHandlerParams,\n McpServerAuthTokenRefreshHandlerParams,\n McpServerAuthUrlHandlerParams\n} from './auth';\nimport { ClientOpts, handleMcpMessages } from './client';\nimport { getConfigSchema, setConfigValue } from './config';\n\nexport type McpServerInstanceServer = CreateMcpServerOpts | { server: McpServer };\nlet getServer = (instance: McpServerInstanceServer) => {\n if ('server' in instance) {\n return instance.server;\n } else {\n return createMcpServerInternal(instance);\n }\n};\n\nexport type McpServerInstanceOpts = McpServerInstanceServer & {\n config?: any;\n authConfig?: any;\n};\n\nexport class McpServerInstance {\n #server: McpServer;\n\n private constructor(private instance: McpServerInstanceOpts) {\n this.#server = getServer(instance);\n }\n\n static create(instance: McpServerInstanceOpts) {\n return new McpServerInstance(instance);\n }\n\n discover() {\n return {\n configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,\n oauth: this.instance.authConfig\n ? {\n status: 'enabled' as const,\n hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig)\n .tokenRefreshHandler\n }\n : {\n status: 'disabled' as const\n }\n };\n }\n\n handleMcpMessages(opts: { config: any; client: ClientOpts; message: JSONRPCMessage[] }) {\n setConfigValue(this.instance.config, opts.config);\n\n return handleMcpMessages(this.#server, opts.client, opts.message);\n }\n\n getOauthAuthorizationUrl(d: McpServerAuthUrlHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.getAuthUrlHandler(d);\n }\n\n handleOauthCallback(d: McpServerAuthCallbackHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.callbackHandler(d);\n }\n\n handleOauthTokenRefresh(d: McpServerAuthTokenRefreshHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n if (!impl.tokenRefreshHandler) {\n return null;\n }\n\n return impl.tokenRefreshHandler(d);\n }\n}\n\nexport let createMcpServer = (instance: McpServerInstanceOpts) => {\n return McpServerInstance.create(instance);\n};\n","import z from 'zod';\n\nexport type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n clientId: string;\n clientSecret: string;\n state: string;\n redirectUri: string;\n};\n\nexport type McpServerAuthUrlHandlerResult = {\n authorizationUrl: string;\n authState?: Record<string, string> | null;\n};\n\nexport type McpServerAuthUrlHandlerInternal = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthUrlHandler = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<string | McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthCallbackHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n clientId: string;\n clientSecret: string;\n code: string;\n state: string;\n redirectUri: string;\n callbackUrl: string;\n authorizationUrl: string;\n};\n\nexport type McpServerAuthCallbackHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthCallbackHandler = <AuthConfig extends {}>(\n d: McpServerAuthCallbackHandlerParams<AuthConfig>\n) => Promise<McpServerAuthCallbackHandlerResult>;\n\nexport type McpServerAuthTokenRefreshHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\nexport type McpServerAuthTokenRefreshHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthTokenRefreshHandler = <AuthConfig extends {}>(\n d: McpServerAuthTokenRefreshHandlerParams<AuthConfig>\n) => Promise<McpServerAuthTokenRefreshHandlerResult>;\n\nexport type McpServerAuthValue = {\n accessToken: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport class McpServerAuthConfig<AuthConfig extends {}> {\n #value: McpServerAuthValue | null = null;\n\n #getAuthUrlHandler?: McpServerAuthUrlHandlerInternal;\n #callbackHandler?: McpServerAuthCallbackHandler;\n #tokenRefreshHandler?: McpServerAuthTokenRefreshHandler;\n\n private constructor(private readonly schema: z.ZodType<AuthConfig>) {}\n\n static create<AuthConfig extends {}>(schema?: z.ZodType<AuthConfig>) {\n return new McpServerAuthConfig(schema ?? (z.object({}) as z.ZodType<AuthConfig>));\n }\n\n static getImplementation(config: McpServerAuthConfig<any>) {\n if (!config.#getAuthUrlHandler || !config.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n return {\n getAuthUrlHandler: config.#getAuthUrlHandler,\n callbackHandler: config.#callbackHandler,\n tokenRefreshHandler: config.#tokenRefreshHandler\n };\n }\n\n setValue(value: McpServerAuthValue) {\n this.#value = value;\n }\n\n getAuthorizationUrl(cb: McpServerAuthUrlHandler) {\n this.#getAuthUrlHandler = async d => {\n let res = await cb(d);\n if (typeof res == 'string') {\n return { authorizationUrl: res };\n }\n return res;\n };\n return this;\n }\n\n handleCallback(cb: McpServerAuthCallbackHandler) {\n this.#callbackHandler = cb;\n return this;\n }\n\n refreshToken(cb: McpServerAuthTokenRefreshHandler) {\n this.#tokenRefreshHandler = cb;\n return this;\n }\n\n build(): AuthConfig {\n if (!this.#getAuthUrlHandler || !this.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server auth config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as AuthConfig;\n }\n}\n\nexport let createAuth = <Config extends {}>(schema?: z.ZodType<Config>) => {\n return McpServerAuthConfig.create(schema);\n};\n\nexport let auth = <Config extends {}>(schema?: z.ZodType<Config>) => createAuth(schema);\n\nexport let getAuthConfigImplementation = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return McpServerAuthConfig.getImplementation(self);\n};\n","import { createInMemoryTransport } from '@metorial/mcp-transport-memory';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ClientCapabilities,\n JSONRPCMessage,\n Notification\n} from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nexport interface ClientOpts {\n client: {\n name: string;\n version: string;\n };\n capabilities: ClientCapabilities;\n}\n\nexport let getClient = async (\n server: McpServer,\n notificationListener: (notification: Notification) => Promise<void>,\n opts: ClientOpts\n) => {\n let transport = createInMemoryTransport();\n await server.connect(transport.server);\n\n let client = new Client(opts.client);\n\n client.registerCapabilities(opts.capabilities);\n client.fallbackNotificationHandler = notificationListener;\n\n await client.connect(transport.client);\n\n return client;\n};\n\nexport let handleMcpMessages = async (\n server: McpServer,\n opts: ClientOpts,\n messages: JSONRPCMessage[]\n) => {\n let responses: JSONRPCMessage[] = [];\n\n let client = await getClient(\n server,\n async notification => {\n responses.push(notification as JSONRPCMessage);\n },\n opts\n );\n\n let error: Error | null = null;\n\n for (let message of messages) {\n try {\n if ('id' in message) {\n let res = await client.request(message as any, z.any());\n responses.push(res);\n } else {\n await client.notification(message as any);\n }\n } catch (err) {\n error = err as Error;\n break;\n }\n }\n\n return { messages: responses, error };\n};\n","import z from 'zod';\n\nexport class McpServerConfig<Config extends {}> {\n #value: Config | null = null;\n\n private constructor(public readonly schema: z.ZodType<Config>) {}\n\n static create<Config extends {}>(schema: z.ZodType<Config>) {\n return new McpServerConfig(schema);\n }\n\n setValue(value: unknown) {\n let parsed = this.schema.parse(value);\n this.#value = parsed;\n }\n\n value(): Config {\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as Config;\n }\n}\n\nexport let createConfig = <Config extends {}>(schema: z.ZodType<Config>) => {\n return McpServerConfig.create(schema).value();\n};\n\nexport let config = <Config extends {}>(schema: z.ZodType<Config>) => createConfig(schema);\n\nexport let setConfigValue = <Config extends {}>(configValue: any, value: Config) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n self.setValue(value);\n};\n\nexport let getConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import z from 'zod';\nimport { McpServerInstance } from './instance';\n\nlet discoverMessage = z.object({\n type: z.literal('metorial-mcp.discover')\n});\ntype DiscoverMessage = z.infer<typeof discoverMessage>;\n\nlet authUrlMessage = z.object({\n type: z.literal('metorial-mcp.get-oauth-authorization-url'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n clientId: z.string(),\n clientSecret: z.string(),\n state: z.string(),\n redirectUri: z.string()\n })\n});\ntype AuthUrlMessage = z.infer<typeof authUrlMessage>;\n\nlet oauthCallbackMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-callback'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n clientId: z.string(),\n clientSecret: z.string(),\n code: z.string(),\n state: z.string(),\n redirectUri: z.string(),\n callbackUrl: z.string(),\n authorizationUrl: z.string()\n })\n});\ntype OauthCallbackMessage = z.infer<typeof oauthCallbackMessage>;\n\nlet oauthTokenRefreshMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-token-refresh'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n refreshToken: z.string(),\n clientId: z.string(),\n clientSecret: z.string()\n })\n});\ntype OauthTokenRefreshMessage = z.infer<typeof oauthTokenRefreshMessage>;\n\nlet allMessages = z.union([\n discoverMessage,\n authUrlMessage,\n oauthCallbackMessage,\n oauthTokenRefreshMessage\n]);\n\nexport type McpServerInstanceMessage =\n | DiscoverMessage\n | AuthUrlMessage\n | OauthCallbackMessage\n | OauthTokenRefreshMessage;\n\nexport let serverAdapter = async (\n instance: McpServerInstance,\n messages: McpServerInstanceMessage[]\n) =>\n Promise.all(\n messages.map(async message => {\n let parsed = allMessages.parse(message);\n\n switch (parsed.type) {\n case 'metorial-mcp.discover': {\n return instance.discover();\n }\n case 'metorial-mcp.get-oauth-authorization-url': {\n return instance.getOauthAuthorizationUrl(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-callback': {\n return instance.handleOauthCallback(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-token-refresh': {\n return instance.handleOauthTokenRefresh(parsed.params);\n }\n }\n\n throw new Error(`Unknown message type: ${(message as any).type}`);\n })\n );\n\nexport type McpServerInstanceAdapterResponses = Awaited<ReturnType<typeof serverAdapter>>;\n\nexport let clientAdapter = (\n transport: (\n messages: McpServerInstanceMessage[]\n ) => Promise<McpServerInstanceAdapterResponses>\n) => {\n let queue: {\n msg: McpServerInstanceMessage;\n resolve: (res: any) => void;\n reject: (err: any) => void;\n }[] = [];\n let isSent = { current: false };\n let isSending = { current: false };\n\n let send = async (message: McpServerInstanceMessage) => {\n let promise = new Promise<any>((resolve, reject) => {\n queue.push({ msg: message, resolve, reject });\n });\n\n if (!isSending.current) {\n isSending.current = true;\n\n setTimeout(async () => {\n isSent.current = true;\n\n try {\n let res = await transport(queue.map(q => q.msg));\n res.forEach((r, i) => {\n queue[i].resolve(r);\n });\n } catch (err) {\n queue.forEach(q => {\n q.reject(err);\n });\n } finally {\n queue = [];\n }\n }, 2);\n }\n\n return promise;\n };\n\n return {\n discover: async () => {\n return send({ type: 'metorial-mcp.discover' }) as Promise<\n Awaited<ReturnType<McpServerInstance['discover']>>\n >;\n },\n\n getOauthAuthorizationUrl: async (\n d: Parameters<McpServerInstance['getOauthAuthorizationUrl']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.get-oauth-authorization-url',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['getOauthAuthorizationUrl']>>>;\n },\n\n handleOauthCallback: async (\n d: Parameters<McpServerInstance['handleOauthCallback']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-callback',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthCallback']>>>;\n },\n\n handleOauthTokenRefresh: async (\n d: Parameters<McpServerInstance['handleOauthTokenRefresh']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-token-refresh',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthTokenRefresh']>>>;\n }\n };\n};\n"],"mappings":";AAAA;AAAA,EACE,mBAAmB;AAAA,OAEd;;;ACHP,OAAO,OAAO;AA6EP,IAAM,sBAAN,MAAM,qBAA2C;AAAA,EAO9C,YAA6B,QAA+B;AAA/B;AAAA,EAAgC;AAAA,EANrE,SAAoC;AAAA,EAEpC;AAAA,EACA;AAAA,EACA;AAAA,EAIA,OAAO,OAA8B,QAAgC;AACnE,WAAO,IAAI,qBAAoB,UAAW,EAAE,OAAO,CAAC,CAAC,CAA2B;AAAA,EAClF;AAAA,EAEA,OAAO,kBAAkBA,SAAkC;AACzD,QAAI,CAACA,QAAO,sBAAsB,CAACA,QAAO,kBAAkB;AAC1D,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,WAAO;AAAA,MACL,mBAAmBA,QAAO;AAAA,MAC1B,iBAAiBA,QAAO;AAAA,MACxB,qBAAqBA,QAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,SAAS,OAA2B;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,oBAAoB,IAA6B;AAC/C,SAAK,qBAAqB,OAAM,MAAK;AACnC,UAAI,MAAM,MAAM,GAAG,CAAC;AACpB,UAAI,OAAO,OAAO,UAAU;AAC1B,eAAO,EAAE,kBAAkB,IAAI;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,IAAkC;AAC/C,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,IAAsC;AACjD,SAAK,uBAAuB;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,QAAoB;AAClB,QAAI,CAAC,KAAK,sBAAsB,CAAC,KAAK,kBAAkB;AACtD,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,QAAI,OAAO;AAIX,WAAO,IAAI;AAAA,MACT,CAAC;AAAA,MACD;AAAA,QACE,KAAK,CAAC,QAAQ,MAAM,aAAa;AAC/B,cAAI,QAAQ,cAAc;AACxB,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,WAAW,MAAM;AACxB,kBAAM,IAAI,MAAM,sCAAsC;AAAA,UACxD;AAEA,iBAAQ,KAAK,OAAe,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAI,aAAa,CAAoB,WAA+B;AACzE,SAAO,oBAAoB,OAAO,MAAM;AAC1C;AAEO,IAAI,OAAO,CAAoB,WAA+B,WAAW,MAAM;AAE/E,IAAI,8BAA8B,CAAoB,gBAAqB;AAChF,MAAI,OAAO,YAAY,YAAY;AACnC,SAAO,oBAAoB,kBAAkB,IAAI;AACnD;;;ACpKA,SAAS,+BAA+B;AACxC,SAAS,cAAc;AAOvB,OAAOC,QAAO;AAUP,IAAI,YAAY,OACrB,QACA,sBACA,SACG;AACH,MAAI,YAAY,wBAAwB;AACxC,QAAM,OAAO,QAAQ,UAAU,MAAM;AAErC,MAAI,SAAS,IAAI,OAAO,KAAK,MAAM;AAEnC,SAAO,qBAAqB,KAAK,YAAY;AAC7C,SAAO,8BAA8B;AAErC,QAAM,OAAO,QAAQ,UAAU,MAAM;AAErC,SAAO;AACT;AAEO,IAAI,oBAAoB,OAC7B,QACA,MACA,aACG;AACH,MAAI,YAA8B,CAAC;AAEnC,MAAI,SAAS,MAAM;AAAA,IACjB;AAAA,IACA,OAAM,iBAAgB;AACpB,gBAAU,KAAK,YAA8B;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAsB;AAE1B,WAAS,WAAW,UAAU;AAC5B,QAAI;AACF,UAAI,QAAQ,SAAS;AACnB,YAAI,MAAM,MAAM,OAAO,QAAQ,SAAgBA,GAAE,IAAI,CAAC;AACtD,kBAAU,KAAK,GAAG;AAAA,MACpB,OAAO;AACL,cAAM,OAAO,aAAa,OAAc;AAAA,MAC1C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ;AACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,WAAW,MAAM;AACtC;;;AClEO,IAAM,kBAAN,MAAM,iBAAmC;AAAA,EAGtC,YAA4B,QAA2B;AAA3B;AAAA,EAA4B;AAAA,EAFhE,SAAwB;AAAA,EAIxB,OAAO,OAA0B,QAA2B;AAC1D,WAAO,IAAI,iBAAgB,MAAM;AAAA,EACnC;AAAA,EAEA,SAAS,OAAgB;AACvB,QAAI,SAAS,KAAK,OAAO,MAAM,KAAK;AACpC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAgB;AACd,QAAI,OAAO;AAIX,WAAO,IAAI;AAAA,MACT,CAAC;AAAA,MACD;AAAA,QACE,KAAK,CAAC,QAAQ,MAAM,aAAa;AAC/B,cAAI,QAAQ,cAAc;AACxB,mBAAO;AAAA,UACT;AAEA,cAAI,KAAK,WAAW,MAAM;AACxB,kBAAM,IAAI,MAAM,iCAAiC;AAAA,UACnD;AAEA,iBAAQ,KAAK,OAAe,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAI,eAAe,CAAoB,WAA8B;AAC1E,SAAO,gBAAgB,OAAO,MAAM,EAAE,MAAM;AAC9C;AAEO,IAAI,SAAS,CAAoB,WAA8B,aAAa,MAAM;AAElF,IAAI,iBAAiB,CAAoB,aAAkB,UAAkB;AAClF,MAAI,OAAO,YAAY,YAAY;AACnC,OAAK,SAAS,KAAK;AACrB;AAEO,IAAI,kBAAkB,CAAoB,gBAAqB;AACpE,MAAI,OAAO,YAAY,YAAY;AACnC,SAAO,KAAK,OAAO,aAAa;AAAA,IAC9B,iBAAiB;AAAA,IACjB,UAAU,SAAO;AACf,UAAI,MAAM,IAAI,UAAU,KAAK;AAE7B,UAAI,IAAI,SAAS,QAAQ;AACvB,YAAI,WAAW,OAAO;AACtB,YAAI,WAAW,SAAS;AAAA,MAC1B;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,YAAI,WAAW,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AHnDA,IAAI,YAAY,CAAC,aAAsC;AACrD,MAAI,YAAY,UAAU;AACxB,WAAO,SAAS;AAAA,EAClB,OAAO;AACL,WAAO,wBAAwB,QAAQ;AAAA,EACzC;AACF;AAOO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAGrB,YAAoB,UAAiC;AAAjC;AAC1B,SAAK,UAAU,UAAU,QAAQ;AAAA,EACnC;AAAA,EAJA;AAAA,EAMA,OAAO,OAAO,UAAiC;AAC7C,WAAO,IAAI,mBAAkB,QAAQ;AAAA,EACvC;AAAA,EAEA,WAAW;AACT,WAAO;AAAA,MACL,cAAc,KAAK,SAAS,SAAS,gBAAgB,KAAK,SAAS,MAAM,IAAI;AAAA,MAC7E,OAAO,KAAK,SAAS,aACjB;AAAA,QACE,QAAQ;AAAA,QACR,iBAAiB,CAAC,CAAC,4BAA4B,KAAK,SAAS,UAAU,EACpE;AAAA,MACL,IACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,IACN;AAAA,EACF;AAAA,EAEA,kBAAkB,MAAsE;AACtF,mBAAe,KAAK,SAAS,QAAQ,KAAK,MAAM;AAEhD,WAAO,kBAAkB,KAAK,SAAS,KAAK,QAAQ,KAAK,OAAO;AAAA,EAClE;AAAA,EAEA,yBAAyB,GAAuC;AAC9D,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,WAAO,KAAK,kBAAkB,CAAC;AAAA,EACjC;AAAA,EAEA,oBAAoB,GAA4C;AAC9D,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,WAAO,KAAK,gBAAgB,CAAC;AAAA,EAC/B;AAAA,EAEA,wBAAwB,GAAgD;AACtE,QAAI,CAAC,KAAK,SAAS,WAAY,QAAO;AACtC,QAAI,OAAO,4BAA4B,KAAK,SAAS,UAAU;AAE/D,QAAI,CAAC,KAAK,qBAAqB;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,oBAAoB,CAAC;AAAA,EACnC;AACF;AAEO,IAAI,kBAAkB,CAAC,aAAoC;AAChE,SAAO,kBAAkB,OAAO,QAAQ;AAC1C;;;AIzFA,OAAOC,QAAO;AAGd,IAAI,kBAAkBA,GAAE,OAAO;AAAA,EAC7B,MAAMA,GAAE,QAAQ,uBAAuB;AACzC,CAAC;AAGD,IAAI,iBAAiBA,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,QAAQ,0CAA0C;AAAA,EAC1D,QAAQA,GAAE,OAAO;AAAA,IACf,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,IAAI,CAAC;AAAA,IACxC,UAAUA,GAAE,OAAO;AAAA,IACnB,cAAcA,GAAE,OAAO;AAAA,IACvB,OAAOA,GAAE,OAAO;AAAA,IAChB,aAAaA,GAAE,OAAO;AAAA,EACxB,CAAC;AACH,CAAC;AAGD,IAAI,uBAAuBA,GAAE,OAAO;AAAA,EAClC,MAAMA,GAAE,QAAQ,oCAAoC;AAAA,EACpD,QAAQA,GAAE,OAAO;AAAA,IACf,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,IAAI,CAAC;AAAA,IACxC,WAAWA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC;AAAA,IAC1C,UAAUA,GAAE,OAAO;AAAA,IACnB,cAAcA,GAAE,OAAO;AAAA,IACvB,MAAMA,GAAE,OAAO;AAAA,IACf,OAAOA,GAAE,OAAO;AAAA,IAChB,aAAaA,GAAE,OAAO;AAAA,IACtB,aAAaA,GAAE,OAAO;AAAA,IACtB,kBAAkBA,GAAE,OAAO;AAAA,EAC7B,CAAC;AACH,CAAC;AAGD,IAAI,2BAA2BA,GAAE,OAAO;AAAA,EACtC,MAAMA,GAAE,QAAQ,yCAAyC;AAAA,EACzD,QAAQA,GAAE,OAAO;AAAA,IACf,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,IAAI,CAAC;AAAA,IACxC,WAAWA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC;AAAA,IAC1C,cAAcA,GAAE,OAAO;AAAA,IACvB,UAAUA,GAAE,OAAO;AAAA,IACnB,cAAcA,GAAE,OAAO;AAAA,EACzB,CAAC;AACH,CAAC;AAGD,IAAI,cAAcA,GAAE,MAAM;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAQM,IAAI,gBAAgB,OACzB,UACA,aAEA,QAAQ;AAAA,EACN,SAAS,IAAI,OAAM,YAAW;AAC5B,QAAI,SAAS,YAAY,MAAM,OAAO;AAEtC,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,yBAAyB;AAC5B,eAAO,SAAS,SAAS;AAAA,MAC3B;AAAA,MACA,KAAK,4CAA4C;AAC/C,eAAO,SAAS,yBAAyB,OAAO,MAAM;AAAA,MACxD;AAAA,MACA,KAAK,sCAAsC;AACzC,eAAO,SAAS,oBAAoB,OAAO,MAAM;AAAA,MACnD;AAAA,MACA,KAAK,2CAA2C;AAC9C,eAAO,SAAS,wBAAwB,OAAO,MAAM;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yBAA0B,QAAgB,IAAI,EAAE;AAAA,EAClE,CAAC;AACH;AAIK,IAAI,gBAAgB,CACzB,cAGG;AACH,MAAI,QAIE,CAAC;AACP,MAAI,SAAS,EAAE,SAAS,MAAM;AAC9B,MAAI,YAAY,EAAE,SAAS,MAAM;AAEjC,MAAI,OAAO,OAAO,YAAsC;AACtD,QAAI,UAAU,IAAI,QAAa,CAAC,SAAS,WAAW;AAClD,YAAM,KAAK,EAAE,KAAK,SAAS,SAAS,OAAO,CAAC;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,UAAU,SAAS;AACtB,gBAAU,UAAU;AAEpB,iBAAW,YAAY;AACrB,eAAO,UAAU;AAEjB,YAAI;AACF,cAAI,MAAM,MAAM,UAAU,MAAM,IAAI,OAAK,EAAE,GAAG,CAAC;AAC/C,cAAI,QAAQ,CAAC,GAAG,MAAM;AACpB,kBAAM,CAAC,EAAE,QAAQ,CAAC;AAAA,UACpB,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,gBAAM,QAAQ,OAAK;AACjB,cAAE,OAAO,GAAG;AAAA,UACd,CAAC;AAAA,QACH,UAAE;AACA,kBAAQ,CAAC;AAAA,QACX;AAAA,MACF,GAAG,CAAC;AAAA,IACN;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU,YAAY;AACpB,aAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAAA,IAG/C;AAAA,IAEA,0BAA0B,OACxB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IAEA,qBAAqB,OACnB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IAEA,yBAAyB,OACvB,MACG;AACH,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["config","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/instance.ts","../src/auth.ts","../src/client.ts","../src/config.ts","../src/adapter.ts","../src/index.ts"],"sourcesContent":["import {\n createMcpServer as createMcpServerInternal,\n CreateMcpServerOpts\n} from '@metorial/mcp';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';\nimport {\n getAuthConfigImplementation,\n getAuthConfigSchema,\n McpServerAuthCallbackHandlerParams,\n McpServerAuthTokenRefreshHandlerParams,\n McpServerAuthUrlHandlerParams,\n setAuthConfigValue\n} from './auth';\nimport { ClientOpts, handleMcpMessages } from './client';\nimport { getConfigSchema, setConfigValue } from './config';\n\nexport type McpServerInstanceServer = CreateMcpServerOpts | { server: McpServer };\nlet getServer = (instance: McpServerInstanceServer) => {\n if ('server' in instance) {\n return instance.server;\n } else {\n return createMcpServerInternal(instance);\n }\n};\n\nexport type McpServerInstanceOpts = McpServerInstanceServer & {\n config?: any;\n authConfig?: any;\n};\n\nexport class McpServerInstance {\n #server: McpServer;\n\n private constructor(private instance: McpServerInstanceOpts) {\n this.#server = getServer(instance);\n }\n\n static create(instance: McpServerInstanceOpts) {\n return new McpServerInstance(instance);\n }\n\n discover() {\n return {\n configSchema: this.instance.config ? getConfigSchema(this.instance.config) : null,\n oauth: this.instance.authConfig\n ? {\n status: 'enabled' as const,\n authConfig: getAuthConfigSchema(this.instance.authConfig),\n hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig)\n .tokenRefreshHandler\n }\n : {\n status: 'disabled' as const\n }\n };\n }\n\n handleMcpMessages(opts: {\n config: any;\n authConfig: any;\n client: ClientOpts;\n message: JSONRPCMessage[];\n }) {\n if (this.instance.config) {\n setConfigValue(this.instance.config, opts.config);\n }\n if (opts.authConfig && this.instance.authConfig) {\n setAuthConfigValue(this.instance.authConfig, opts.authConfig);\n }\n\n return handleMcpMessages(this.#server, opts.client, opts.message);\n }\n\n getOauthAuthorizationUrl(d: McpServerAuthUrlHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.getAuthUrlHandler(d);\n }\n\n handleOauthCallback(d: McpServerAuthCallbackHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n return impl.callbackHandler(d);\n }\n\n handleOauthTokenRefresh(d: McpServerAuthTokenRefreshHandlerParams<any>) {\n if (!this.instance.authConfig) return null;\n let impl = getAuthConfigImplementation(this.instance.authConfig);\n\n if (!impl.tokenRefreshHandler) {\n return null;\n }\n\n return impl.tokenRefreshHandler(d);\n }\n}\n\nexport let createMcpServer = (instance: McpServerInstanceOpts) => {\n return McpServerInstance.create(instance);\n};\n","import z from 'zod';\n\nexport type McpServerAuthUrlHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n clientId: string;\n clientSecret: string;\n state: string;\n redirectUri: string;\n};\n\nexport type McpServerAuthUrlHandlerResult = {\n authorizationUrl: string;\n authState?: Record<string, string> | null;\n};\n\nexport type McpServerAuthUrlHandlerInternal = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthUrlHandler = <AuthConfig extends {}>(\n d: McpServerAuthUrlHandlerParams<AuthConfig>\n) => Promise<string | McpServerAuthUrlHandlerResult>;\n\nexport type McpServerAuthCallbackHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n clientId: string;\n clientSecret: string;\n code: string;\n state: string;\n redirectUri: string;\n callbackUrl: string;\n authorizationUrl: string;\n};\n\nexport type McpServerAuthCallbackHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthCallbackHandler = <AuthConfig extends {}>(\n d: McpServerAuthCallbackHandlerParams<AuthConfig>\n) => Promise<McpServerAuthCallbackHandlerResult>;\n\nexport type McpServerAuthTokenRefreshHandlerParams<AuthConfig extends {}> = {\n authConfig: AuthConfig;\n authState: Record<string, string>;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\nexport type McpServerAuthTokenRefreshHandlerResult = {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport type McpServerAuthTokenRefreshHandler = <AuthConfig extends {}>(\n d: McpServerAuthTokenRefreshHandlerParams<AuthConfig>\n) => Promise<McpServerAuthTokenRefreshHandlerResult>;\n\nexport type McpServerAuthValue = {\n accessToken: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n [key: string]: any;\n};\n\nexport class McpServerAuthConfig<AuthConfig extends {}> {\n #value: McpServerAuthValue | null = null;\n\n #getAuthUrlHandler?: McpServerAuthUrlHandlerInternal;\n #callbackHandler?: McpServerAuthCallbackHandler;\n #tokenRefreshHandler?: McpServerAuthTokenRefreshHandler;\n\n private constructor(public readonly schema: z.ZodType<AuthConfig>) {}\n\n static create<AuthConfig extends {}>(schema?: z.ZodType<AuthConfig>) {\n return new McpServerAuthConfig(schema ?? (z.object({}) as z.ZodType<AuthConfig>));\n }\n\n static getImplementation(config: McpServerAuthConfig<any>) {\n if (!config.#getAuthUrlHandler || !config.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n return {\n getAuthUrlHandler: config.#getAuthUrlHandler,\n callbackHandler: config.#callbackHandler,\n tokenRefreshHandler: config.#tokenRefreshHandler\n };\n }\n\n setValue(value: McpServerAuthValue) {\n this.#value = value;\n }\n\n getAuthorizationUrl(cb: McpServerAuthUrlHandler) {\n this.#getAuthUrlHandler = async d => {\n let res = await cb(d);\n if (typeof res == 'string') {\n return { authorizationUrl: res };\n }\n return res;\n };\n return this;\n }\n\n handleCallback(cb: McpServerAuthCallbackHandler) {\n this.#callbackHandler = cb;\n return this;\n }\n\n refreshToken(cb: McpServerAuthTokenRefreshHandler) {\n this.#tokenRefreshHandler = cb;\n return this;\n }\n\n build(): AuthConfig {\n if (!this.#getAuthUrlHandler || !this.#callbackHandler) {\n throw new Error('MCP Server auth config is missing required handlers');\n }\n\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server auth config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as AuthConfig;\n }\n}\n\nexport let createAuth = <Config extends {}>(schema?: z.ZodType<Config>) => {\n return McpServerAuthConfig.create(schema);\n};\n\nexport let auth = <Config extends {}>(schema?: z.ZodType<Config>) => createAuth(schema);\n\nexport let getAuthConfigImplementation = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return McpServerAuthConfig.getImplementation(self);\n};\n\nexport let setAuthConfigValue = <Config extends {}>(\n configValue: any,\n value: McpServerAuthValue\n) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n self.setValue(value);\n};\n\nexport let getAuthConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerAuthConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import { createInMemoryTransport } from '@metorial/mcp-transport-memory';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n ClientCapabilities,\n JSONRPCMessage,\n Notification\n} from '@modelcontextprotocol/sdk/types.js';\nimport z from 'zod';\n\nexport interface ClientOpts {\n client: {\n name: string;\n version: string;\n };\n capabilities: ClientCapabilities;\n}\n\nexport let getClient = async (\n server: McpServer,\n notificationListener: (notification: Notification) => Promise<void>,\n opts: ClientOpts\n) => {\n let transport = createInMemoryTransport();\n await server.connect(transport.server);\n\n let client = new Client(opts.client);\n\n client.registerCapabilities(opts.capabilities);\n client.fallbackNotificationHandler = notificationListener;\n\n await client.connect(transport.client);\n\n return client;\n};\n\nexport let handleMcpMessages = async (\n server: McpServer,\n opts: ClientOpts,\n messages: JSONRPCMessage[]\n) => {\n let responses: JSONRPCMessage[] = [];\n\n let client = await getClient(\n server,\n async notification => {\n responses.push(notification as JSONRPCMessage);\n },\n opts\n );\n\n let error: Error | null = null;\n\n for (let message of messages) {\n try {\n if ('id' in message) {\n let res = await client.request(message as any, z.any());\n responses.push(res);\n } else {\n await client.notification(message as any);\n }\n } catch (err) {\n error = err as Error;\n break;\n }\n }\n\n return { messages: responses, error };\n};\n","import z from 'zod';\n\nexport class McpServerConfig<Config extends {}> {\n #value: Config | null = null;\n\n private constructor(public readonly schema: z.ZodType<Config>) {}\n\n static create<Config extends {}>(schema: z.ZodType<Config>) {\n return new McpServerConfig(schema);\n }\n\n setValue(value: unknown) {\n let parsed = this.schema.parse(value);\n this.#value = parsed;\n }\n\n value(): Config {\n let self = this;\n\n // Proxy for getting the config values\n // or throwing an error if not set\n return new Proxy(\n {},\n {\n get: (target, prop, receiver) => {\n if (prop == '__config__') {\n return self;\n }\n\n if (self.#value === null) {\n throw new Error('MCP Server config value not set');\n }\n\n return (self.#value as any)[prop];\n }\n }\n ) as any as Config;\n }\n}\n\nexport let createConfig = <Config extends {}>(schema: z.ZodType<Config>) => {\n return McpServerConfig.create(schema).value();\n};\n\nexport let config = <Config extends {}>(schema: z.ZodType<Config>) => createConfig(schema);\n\nexport let setConfigValue = <Config extends {}>(configValue: any, value: Config) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n self.setValue(value);\n};\n\nexport let getConfigSchema = <Config extends {}>(configValue: any) => {\n let self = configValue['__config__'] as McpServerConfig<Config>;\n return self.schema.toJSONSchema({\n unrepresentable: 'any',\n override: ctx => {\n let def = ctx.zodSchema._zod.def;\n\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string';\n ctx.jsonSchema.format = 'date-time';\n }\n if (def.type === 'bigint') {\n ctx.jsonSchema.type = 'number';\n }\n }\n });\n};\n","import z from 'zod';\nimport { McpServerInstance } from './instance';\n\nlet discoverMessage = z.object({\n type: z.literal('metorial-mcp.discover')\n});\ntype DiscoverMessage = z.infer<typeof discoverMessage>;\n\nlet authUrlMessage = z.object({\n type: z.literal('metorial-mcp.get-oauth-authorization-url'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n clientId: z.string(),\n clientSecret: z.string(),\n state: z.string(),\n redirectUri: z.string()\n })\n});\ntype AuthUrlMessage = z.infer<typeof authUrlMessage>;\n\nlet oauthCallbackMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-callback'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n clientId: z.string(),\n clientSecret: z.string(),\n code: z.string(),\n state: z.string(),\n redirectUri: z.string(),\n callbackUrl: z.string(),\n authorizationUrl: z.string()\n })\n});\ntype OauthCallbackMessage = z.infer<typeof oauthCallbackMessage>;\n\nlet oauthTokenRefreshMessage = z.object({\n type: z.literal('metorial-mcp.handle-oauth-token-refresh'),\n params: z.object({\n authConfig: z.record(z.string(), z.any()),\n authState: z.record(z.string(), z.string()),\n refreshToken: z.string(),\n clientId: z.string(),\n clientSecret: z.string()\n })\n});\ntype OauthTokenRefreshMessage = z.infer<typeof oauthTokenRefreshMessage>;\n\nlet handleMcpMessage = z.object({\n type: z.literal('metorial-mcp.handle-mcp-message'),\n params: z.object({\n authConfig: z.optional(z.record(z.string(), z.any())),\n config: z.record(z.string(), z.any()),\n client: z.object({\n client: z.record(z.string(), z.any()),\n capabilities: z.record(z.string(), z.any())\n }),\n messages: z.array(z.any())\n })\n});\ntype HandleMcpMessage = z.infer<typeof handleMcpMessage>;\n\nlet allMessages = z.union([\n discoverMessage,\n authUrlMessage,\n oauthCallbackMessage,\n oauthTokenRefreshMessage,\n handleMcpMessage\n]);\n\nexport type McpServerInstanceMessage =\n | DiscoverMessage\n | AuthUrlMessage\n | OauthCallbackMessage\n | OauthTokenRefreshMessage\n | HandleMcpMessage;\n\nexport let serverAdapter = async (\n instance: McpServerInstance,\n messages: McpServerInstanceMessage[]\n) =>\n Promise.all(\n messages.map(async message => {\n let parsed = allMessages.parse(message);\n\n switch (parsed.type) {\n case 'metorial-mcp.discover': {\n return instance.discover();\n }\n case 'metorial-mcp.get-oauth-authorization-url': {\n return instance.getOauthAuthorizationUrl(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-callback': {\n return instance.handleOauthCallback(parsed.params);\n }\n case 'metorial-mcp.handle-oauth-token-refresh': {\n return instance.handleOauthTokenRefresh(parsed.params);\n }\n case 'metorial-mcp.handle-mcp-message': {\n return instance.handleMcpMessages({\n config: parsed.params.config || {},\n authConfig: parsed.params.authConfig || {},\n client: parsed.params.client as any,\n message: parsed.params.messages\n });\n }\n }\n\n throw new Error(`Unknown message type: ${(message as any).type}`);\n })\n );\n\nexport type McpServerInstanceAdapterResponses = Awaited<ReturnType<typeof serverAdapter>>;\n\nexport let clientAdapter = (\n transport: (\n messages: McpServerInstanceMessage[]\n ) => Promise<McpServerInstanceAdapterResponses>\n) => {\n let queue: {\n msg: McpServerInstanceMessage;\n resolve: (res: any) => void;\n reject: (err: any) => void;\n }[] = [];\n let isSent = { current: false };\n let isSending = { current: false };\n\n let send = async (message: McpServerInstanceMessage) => {\n let promise = new Promise<any>((resolve, reject) => {\n queue.push({ msg: message, resolve, reject });\n });\n\n if (!isSending.current) {\n isSending.current = true;\n\n setTimeout(async () => {\n isSent.current = true;\n\n try {\n let res = await transport(queue.map(q => q.msg));\n res.forEach((r, i) => {\n queue[i].resolve(r);\n });\n } catch (err) {\n queue.forEach(q => {\n q.reject(err);\n });\n } finally {\n queue = [];\n }\n }, 2);\n }\n\n return promise;\n };\n\n return {\n discover: async () => {\n return send({ type: 'metorial-mcp.discover' }) as Promise<\n Awaited<ReturnType<McpServerInstance['discover']>>\n >;\n },\n\n getOauthAuthorizationUrl: async (\n d: Parameters<McpServerInstance['getOauthAuthorizationUrl']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.get-oauth-authorization-url',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['getOauthAuthorizationUrl']>>>;\n },\n\n handleOauthCallback: async (\n d: Parameters<McpServerInstance['handleOauthCallback']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-callback',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthCallback']>>>;\n },\n\n handleOauthTokenRefresh: async (\n d: Parameters<McpServerInstance['handleOauthTokenRefresh']>[0]\n ) => {\n return send({\n type: 'metorial-mcp.handle-oauth-token-refresh',\n params: d\n }) as Promise<Awaited<ReturnType<McpServerInstance['handleOauthTokenRefresh']>>>;\n }\n };\n};\n","export {\n createMcpServer,\n type McpServerInstance,\n type McpServerInstanceOpts,\n type McpServerInstanceServer\n} from './instance';\n\nexport {\n clientAdapter,\n serverAdapter,\n type McpServerInstanceAdapterResponses,\n type McpServerInstanceMessage\n} from './adapter';\n\nexport {\n auth,\n createAuth,\n type McpServerAuthCallbackHandler,\n type McpServerAuthCallbackHandlerParams,\n type McpServerAuthCallbackHandlerResult,\n type McpServerAuthConfig,\n type McpServerAuthTokenRefreshHandler,\n type McpServerAuthTokenRefreshHandlerParams,\n type McpServerAuthTokenRefreshHandlerResult,\n type McpServerAuthUrlHandler,\n type McpServerAuthUrlHandlerInternal,\n type McpServerAuthUrlHandlerParams,\n type McpServerAuthUrlHandlerResult,\n type McpServerAuthValue\n} from './auth';\n\nexport { config, createConfig, type McpServerConfig } from './config';\n\nexport {\n McpTool,\n type McpServerInfo,\n type McpToolAnnotations,\n type McpToolHandlerOutput,\n type McpToolHandlerOutputSync,\n type McpToolImplementation,\n type McpToolOpts\n} from '@metorial/mcp';\n"],"mappings":"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","names":["config","z","z"]}
|
package/package.json
CHANGED
package/src/adapter.ts
CHANGED
|
@@ -46,18 +46,34 @@ let oauthTokenRefreshMessage = z.object({
|
|
|
46
46
|
});
|
|
47
47
|
type OauthTokenRefreshMessage = z.infer<typeof oauthTokenRefreshMessage>;
|
|
48
48
|
|
|
49
|
+
let handleMcpMessage = z.object({
|
|
50
|
+
type: z.literal('metorial-mcp.handle-mcp-message'),
|
|
51
|
+
params: z.object({
|
|
52
|
+
authConfig: z.optional(z.record(z.string(), z.any())),
|
|
53
|
+
config: z.record(z.string(), z.any()),
|
|
54
|
+
client: z.object({
|
|
55
|
+
client: z.record(z.string(), z.any()),
|
|
56
|
+
capabilities: z.record(z.string(), z.any())
|
|
57
|
+
}),
|
|
58
|
+
messages: z.array(z.any())
|
|
59
|
+
})
|
|
60
|
+
});
|
|
61
|
+
type HandleMcpMessage = z.infer<typeof handleMcpMessage>;
|
|
62
|
+
|
|
49
63
|
let allMessages = z.union([
|
|
50
64
|
discoverMessage,
|
|
51
65
|
authUrlMessage,
|
|
52
66
|
oauthCallbackMessage,
|
|
53
|
-
oauthTokenRefreshMessage
|
|
67
|
+
oauthTokenRefreshMessage,
|
|
68
|
+
handleMcpMessage
|
|
54
69
|
]);
|
|
55
70
|
|
|
56
71
|
export type McpServerInstanceMessage =
|
|
57
72
|
| DiscoverMessage
|
|
58
73
|
| AuthUrlMessage
|
|
59
74
|
| OauthCallbackMessage
|
|
60
|
-
| OauthTokenRefreshMessage
|
|
75
|
+
| OauthTokenRefreshMessage
|
|
76
|
+
| HandleMcpMessage;
|
|
61
77
|
|
|
62
78
|
export let serverAdapter = async (
|
|
63
79
|
instance: McpServerInstance,
|
|
@@ -80,6 +96,14 @@ export let serverAdapter = async (
|
|
|
80
96
|
case 'metorial-mcp.handle-oauth-token-refresh': {
|
|
81
97
|
return instance.handleOauthTokenRefresh(parsed.params);
|
|
82
98
|
}
|
|
99
|
+
case 'metorial-mcp.handle-mcp-message': {
|
|
100
|
+
return instance.handleMcpMessages({
|
|
101
|
+
config: parsed.params.config || {},
|
|
102
|
+
authConfig: parsed.params.authConfig || {},
|
|
103
|
+
client: parsed.params.client as any,
|
|
104
|
+
message: parsed.params.messages
|
|
105
|
+
});
|
|
106
|
+
}
|
|
83
107
|
}
|
|
84
108
|
|
|
85
109
|
throw new Error(`Unknown message type: ${(message as any).type}`);
|
package/src/auth.ts
CHANGED
|
@@ -82,7 +82,7 @@ export class McpServerAuthConfig<AuthConfig extends {}> {
|
|
|
82
82
|
#callbackHandler?: McpServerAuthCallbackHandler;
|
|
83
83
|
#tokenRefreshHandler?: McpServerAuthTokenRefreshHandler;
|
|
84
84
|
|
|
85
|
-
private constructor(
|
|
85
|
+
private constructor(public readonly schema: z.ZodType<AuthConfig>) {}
|
|
86
86
|
|
|
87
87
|
static create<AuthConfig extends {}>(schema?: z.ZodType<AuthConfig>) {
|
|
88
88
|
return new McpServerAuthConfig(schema ?? (z.object({}) as z.ZodType<AuthConfig>));
|
|
@@ -163,3 +163,29 @@ export let getAuthConfigImplementation = <Config extends {}>(configValue: any) =
|
|
|
163
163
|
let self = configValue['__config__'] as McpServerAuthConfig<Config>;
|
|
164
164
|
return McpServerAuthConfig.getImplementation(self);
|
|
165
165
|
};
|
|
166
|
+
|
|
167
|
+
export let setAuthConfigValue = <Config extends {}>(
|
|
168
|
+
configValue: any,
|
|
169
|
+
value: McpServerAuthValue
|
|
170
|
+
) => {
|
|
171
|
+
let self = configValue['__config__'] as McpServerAuthConfig<Config>;
|
|
172
|
+
self.setValue(value);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export let getAuthConfigSchema = <Config extends {}>(configValue: any) => {
|
|
176
|
+
let self = configValue['__config__'] as McpServerAuthConfig<Config>;
|
|
177
|
+
return self.schema.toJSONSchema({
|
|
178
|
+
unrepresentable: 'any',
|
|
179
|
+
override: ctx => {
|
|
180
|
+
let def = ctx.zodSchema._zod.def;
|
|
181
|
+
|
|
182
|
+
if (def.type === 'date') {
|
|
183
|
+
ctx.jsonSchema.type = 'string';
|
|
184
|
+
ctx.jsonSchema.format = 'date-time';
|
|
185
|
+
}
|
|
186
|
+
if (def.type === 'bigint') {
|
|
187
|
+
ctx.jsonSchema.type = 'number';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -30,3 +30,13 @@ export {
|
|
|
30
30
|
} from './auth';
|
|
31
31
|
|
|
32
32
|
export { config, createConfig, type McpServerConfig } from './config';
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
McpTool,
|
|
36
|
+
type McpServerInfo,
|
|
37
|
+
type McpToolAnnotations,
|
|
38
|
+
type McpToolHandlerOutput,
|
|
39
|
+
type McpToolHandlerOutputSync,
|
|
40
|
+
type McpToolImplementation,
|
|
41
|
+
type McpToolOpts
|
|
42
|
+
} from '@metorial/mcp';
|
package/src/instance.ts
CHANGED
|
@@ -2,13 +2,15 @@ import {
|
|
|
2
2
|
createMcpServer as createMcpServerInternal,
|
|
3
3
|
CreateMcpServerOpts
|
|
4
4
|
} from '@metorial/mcp';
|
|
5
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
|
|
6
|
-
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types';
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
7
7
|
import {
|
|
8
8
|
getAuthConfigImplementation,
|
|
9
|
+
getAuthConfigSchema,
|
|
9
10
|
McpServerAuthCallbackHandlerParams,
|
|
10
11
|
McpServerAuthTokenRefreshHandlerParams,
|
|
11
|
-
McpServerAuthUrlHandlerParams
|
|
12
|
+
McpServerAuthUrlHandlerParams,
|
|
13
|
+
setAuthConfigValue
|
|
12
14
|
} from './auth';
|
|
13
15
|
import { ClientOpts, handleMcpMessages } from './client';
|
|
14
16
|
import { getConfigSchema, setConfigValue } from './config';
|
|
@@ -44,6 +46,7 @@ export class McpServerInstance {
|
|
|
44
46
|
oauth: this.instance.authConfig
|
|
45
47
|
? {
|
|
46
48
|
status: 'enabled' as const,
|
|
49
|
+
authConfig: getAuthConfigSchema(this.instance.authConfig),
|
|
47
50
|
hasTokenRefresh: !!getAuthConfigImplementation(this.instance.authConfig)
|
|
48
51
|
.tokenRefreshHandler
|
|
49
52
|
}
|
|
@@ -53,8 +56,18 @@ export class McpServerInstance {
|
|
|
53
56
|
};
|
|
54
57
|
}
|
|
55
58
|
|
|
56
|
-
handleMcpMessages(opts: {
|
|
57
|
-
|
|
59
|
+
handleMcpMessages(opts: {
|
|
60
|
+
config: any;
|
|
61
|
+
authConfig: any;
|
|
62
|
+
client: ClientOpts;
|
|
63
|
+
message: JSONRPCMessage[];
|
|
64
|
+
}) {
|
|
65
|
+
if (this.instance.config) {
|
|
66
|
+
setConfigValue(this.instance.config, opts.config);
|
|
67
|
+
}
|
|
68
|
+
if (opts.authConfig && this.instance.authConfig) {
|
|
69
|
+
setAuthConfigValue(this.instance.authConfig, opts.authConfig);
|
|
70
|
+
}
|
|
58
71
|
|
|
59
72
|
return handleMcpMessages(this.#server, opts.client, opts.message);
|
|
60
73
|
}
|