mcp-use 1.9.0-canary.3 → 1.9.1-canary.0

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.
Files changed (104) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/chunk-2EYAMIT3.js +76 -0
  3. package/dist/chunk-362PI25Z.js +110 -0
  4. package/dist/chunk-5URNFWCQ.js +25 -0
  5. package/dist/chunk-KHTTBIRP.js +280 -0
  6. package/dist/context-storage-TXQ4DVSS.js +11 -0
  7. package/dist/conversion-5MA4VY3B.js +7 -0
  8. package/dist/conversion-OTRZZBUU.js +7 -0
  9. package/dist/src/server/endpoints/index.d.ts +7 -0
  10. package/dist/src/server/endpoints/index.d.ts.map +1 -0
  11. package/dist/src/server/endpoints/mount-mcp.d.ts +21 -0
  12. package/dist/src/server/endpoints/mount-mcp.d.ts.map +1 -0
  13. package/dist/src/server/index.cjs +3738 -3940
  14. package/dist/src/server/index.d.ts +4 -3
  15. package/dist/src/server/index.d.ts.map +1 -1
  16. package/dist/src/server/index.js +3223 -3039
  17. package/dist/src/server/inspector/index.d.ts +5 -0
  18. package/dist/src/server/inspector/index.d.ts.map +1 -0
  19. package/dist/src/server/inspector/mount.d.ts +33 -0
  20. package/dist/src/server/inspector/mount.d.ts.map +1 -0
  21. package/dist/src/server/logging.d.ts.map +1 -1
  22. package/dist/src/server/mcp-server.d.ts +71 -780
  23. package/dist/src/server/mcp-server.d.ts.map +1 -1
  24. package/dist/src/server/notifications/index.d.ts +7 -0
  25. package/dist/src/server/notifications/index.d.ts.map +1 -0
  26. package/dist/src/server/notifications/notification-registration.d.ts +82 -0
  27. package/dist/src/server/notifications/notification-registration.d.ts.map +1 -0
  28. package/dist/src/server/oauth/index.d.ts +1 -0
  29. package/dist/src/server/oauth/index.d.ts.map +1 -1
  30. package/dist/src/server/oauth/setup.d.ts +28 -0
  31. package/dist/src/server/oauth/setup.d.ts.map +1 -0
  32. package/dist/src/server/prompts/conversion.d.ts +22 -0
  33. package/dist/src/server/prompts/conversion.d.ts.map +1 -0
  34. package/dist/src/server/prompts/index.d.ts +60 -0
  35. package/dist/src/server/prompts/index.d.ts.map +1 -0
  36. package/dist/src/server/resources/conversion.d.ts +20 -0
  37. package/dist/src/server/resources/conversion.d.ts.map +1 -0
  38. package/dist/src/server/resources/index.d.ts +116 -0
  39. package/dist/src/server/resources/index.d.ts.map +1 -0
  40. package/dist/src/server/roots/index.d.ts +7 -0
  41. package/dist/src/server/roots/index.d.ts.map +1 -0
  42. package/dist/src/server/roots/roots-registration.d.ts +56 -0
  43. package/dist/src/server/roots/roots-registration.d.ts.map +1 -0
  44. package/dist/src/server/sessions/index.d.ts +6 -0
  45. package/dist/src/server/sessions/index.d.ts.map +1 -0
  46. package/dist/src/server/sessions/notifications.d.ts +25 -0
  47. package/dist/src/server/sessions/notifications.d.ts.map +1 -0
  48. package/dist/src/server/sessions/session-manager.d.ts +41 -0
  49. package/dist/src/server/sessions/session-manager.d.ts.map +1 -0
  50. package/dist/src/server/tools/index.d.ts +10 -0
  51. package/dist/src/server/tools/index.d.ts.map +1 -0
  52. package/dist/src/server/tools/schema-helpers.d.ts +54 -0
  53. package/dist/src/server/tools/schema-helpers.d.ts.map +1 -0
  54. package/dist/src/server/tools/tool-execution-helpers.d.ts +97 -0
  55. package/dist/src/server/tools/tool-execution-helpers.d.ts.map +1 -0
  56. package/dist/src/server/tools/tool-registration.d.ts +85 -0
  57. package/dist/src/server/tools/tool-registration.d.ts.map +1 -0
  58. package/dist/src/server/types/common.d.ts +24 -0
  59. package/dist/src/server/types/common.d.ts.map +1 -1
  60. package/dist/src/server/types/index.d.ts +5 -4
  61. package/dist/src/server/types/index.d.ts.map +1 -1
  62. package/dist/src/server/types/prompt.d.ts +61 -6
  63. package/dist/src/server/types/prompt.d.ts.map +1 -1
  64. package/dist/src/server/types/resource.d.ts +83 -8
  65. package/dist/src/server/types/resource.d.ts.map +1 -1
  66. package/dist/src/server/types/tool-context.d.ts +236 -0
  67. package/dist/src/server/types/tool-context.d.ts.map +1 -0
  68. package/dist/src/server/types/tool.d.ts +62 -5
  69. package/dist/src/server/types/tool.d.ts.map +1 -1
  70. package/dist/src/server/utils/hono-proxy.d.ts +21 -0
  71. package/dist/src/server/utils/hono-proxy.d.ts.map +1 -0
  72. package/dist/src/server/utils/index.d.ts +3 -0
  73. package/dist/src/server/utils/index.d.ts.map +1 -1
  74. package/dist/src/server/utils/jsonrpc-helpers.d.ts +94 -0
  75. package/dist/src/server/utils/jsonrpc-helpers.d.ts.map +1 -0
  76. package/dist/src/server/utils/response-helpers.d.ts +115 -3
  77. package/dist/src/server/utils/response-helpers.d.ts.map +1 -1
  78. package/dist/src/server/utils/server-helpers.d.ts +78 -0
  79. package/dist/src/server/utils/server-helpers.d.ts.map +1 -0
  80. package/dist/src/server/utils/server-lifecycle.d.ts +52 -0
  81. package/dist/src/server/utils/server-lifecycle.d.ts.map +1 -0
  82. package/dist/src/server/utils/session-helpers.d.ts +55 -0
  83. package/dist/src/server/utils/session-helpers.d.ts.map +1 -0
  84. package/dist/src/server/widgets/index.d.ts +30 -0
  85. package/dist/src/server/widgets/index.d.ts.map +1 -0
  86. package/dist/src/server/widgets/mcp-ui-adapter.d.ts.map +1 -0
  87. package/dist/src/server/widgets/mount-widgets-dev.d.ts +28 -0
  88. package/dist/src/server/widgets/mount-widgets-dev.d.ts.map +1 -0
  89. package/dist/src/server/widgets/mount-widgets-production.d.ts +27 -0
  90. package/dist/src/server/widgets/mount-widgets-production.d.ts.map +1 -0
  91. package/dist/src/server/widgets/setup-widget-routes.d.ts +23 -0
  92. package/dist/src/server/widgets/setup-widget-routes.d.ts.map +1 -0
  93. package/dist/src/server/widgets/ui-resource-registration.d.ts +75 -0
  94. package/dist/src/server/widgets/ui-resource-registration.d.ts.map +1 -0
  95. package/dist/src/server/widgets/widget-helpers.d.ts +277 -0
  96. package/dist/src/server/widgets/widget-helpers.d.ts.map +1 -0
  97. package/dist/src/server/widgets/widget-types.d.ts +49 -0
  98. package/dist/src/server/widgets/widget-types.d.ts.map +1 -0
  99. package/dist/tool-execution-helpers-IVUDHXMK.js +23 -0
  100. package/package.json +6 -5
  101. package/dist/chunk-F4UHAA5L.js +0 -854
  102. package/dist/oauth-U4NNKN4B.js +0 -30
  103. package/dist/src/server/adapters/mcp-ui-adapter.d.ts.map +0 -1
  104. /package/dist/src/server/{adapters → widgets}/mcp-ui-adapter.d.ts +0 -0
@@ -1,198 +1,46 @@
1
- import type { CreateMessageRequest, CreateMessageResult, ElicitResult } from "@modelcontextprotocol/sdk/types.js";
2
- import { z } from "zod";
3
- /**
4
- * Options for the sample() function in tool context.
5
- */
6
- export interface SampleOptions {
7
- /**
8
- * Timeout in milliseconds for the sampling request.
9
- * Default: no timeout (Infinity) - waits indefinitely for the LLM response.
10
- * Set this if you want to limit how long to wait for sampling.
11
- */
12
- timeout?: number;
13
- /**
14
- * Interval in milliseconds between progress notifications.
15
- * Default: 5000 (5 seconds).
16
- * Progress notifications are sent to the client to prevent timeout
17
- * when the client has resetTimeoutOnProgress enabled.
18
- */
19
- progressIntervalMs?: number;
20
- /**
21
- * Optional callback called each time a progress notification is sent.
22
- * Useful for logging or custom progress handling.
23
- */
24
- onProgress?: (progress: {
25
- progress: number;
26
- total?: number;
27
- message: string;
28
- }) => void;
29
- }
30
- /**
31
- * Options for the elicit() function in tool context.
32
- */
33
- export interface ElicitOptions {
34
- /**
35
- * Timeout in milliseconds for the elicitation request.
36
- * Default: no timeout (Infinity) - waits indefinitely for user response.
37
- * Set this if you want to limit how long to wait for user input.
38
- *
39
- * @example
40
- * ```typescript
41
- * // Wait indefinitely (default)
42
- * await ctx.elicit(message, schema);
43
- *
44
- * // With 2 minute timeout
45
- * await ctx.elicit(message, schema, { timeout: 120000 });
46
- * ```
47
- */
48
- timeout?: number;
49
- }
50
- /**
51
- * Parameters for form mode elicitation.
52
- * Used to request structured data from users with optional JSON schema validation.
53
- */
54
- export interface ElicitFormParams {
55
- /** Human-readable message explaining why the information is needed */
56
- message: string;
57
- /** JSON Schema defining the structure of the expected response */
58
- requestedSchema: Record<string, any>;
59
- /** Mode specifier (optional for backwards compatibility, defaults to "form") */
60
- mode?: "form";
61
- }
62
- /**
63
- * Parameters for URL mode elicitation.
64
- * Used to direct users to external URLs for sensitive interactions.
65
- * MUST be used for interactions involving sensitive information like credentials.
66
- */
67
- export interface ElicitUrlParams {
68
- /** Human-readable message explaining why the interaction is needed */
69
- message: string;
70
- /** URL for the user to navigate to */
71
- url: string;
72
- /** Mode specifier (required for URL mode) */
73
- mode: "url";
74
- }
75
- /**
76
- * Context object passed to tool callbacks.
77
- * Provides access to sampling, elicitation, and progress reporting capabilities.
78
- */
79
- export interface ToolContext {
80
- /**
81
- * Request sampling from the client's LLM with automatic progress notifications.
82
- *
83
- * Progress notifications are sent every 5 seconds (configurable) while waiting
84
- * for the sampling response. This prevents client-side timeouts when the client
85
- * has `resetTimeoutOnProgress: true` enabled.
86
- *
87
- * By default, there is no timeout - the function waits indefinitely for the
88
- * LLM response. Set `options.timeout` to limit the wait time.
89
- *
90
- * @param params - Sampling parameters (messages, model preferences, etc.)
91
- * @param options - Optional configuration for timeout and progress
92
- * @returns The sampling result from the client's LLM
93
- *
94
- * @example
95
- * ```typescript
96
- * // Basic usage - waits indefinitely with automatic progress notifications
97
- * const result = await ctx.sample({
98
- * messages: [{ role: 'user', content: { type: 'text', text: 'Hello' } }],
99
- * });
100
- *
101
- * // With timeout and custom progress handling
102
- * const result = await ctx.sample(
103
- * { messages: [...] },
104
- * {
105
- * timeout: 120000, // 2 minute timeout
106
- * progressIntervalMs: 3000, // Report progress every 3 seconds
107
- * onProgress: ({ progress, message }) => console.log(message),
108
- * }
109
- * );
110
- * ```
111
- */
112
- sample: (params: CreateMessageRequest["params"], options?: SampleOptions) => Promise<CreateMessageResult>;
113
- /**
114
- * Request user input via the client through elicitation.
115
- *
116
- * Supports two modes with automatic mode detection:
117
- * - **Form mode**: Pass a Zod schema as second parameter - collects structured data
118
- * - **URL mode**: Pass a URL string as second parameter - directs to external URL
119
- * - **Verbose mode**: Pass an object with explicit mode for backwards compatibility
120
- *
121
- * By default, there is no timeout - waits indefinitely for user response.
122
- * Set `options.timeout` to limit the wait time.
123
- *
124
- * @example
125
- * ```typescript
126
- * // Form mode (simplified) - automatically inferred from Zod schema
127
- * const result = await ctx.elicit(
128
- * "Please provide your information",
129
- * z.object({
130
- * name: z.string().default("Anonymous"),
131
- * age: z.number().default(0)
132
- * })
133
- * );
134
- * // result.data is typed as { name: string, age: number }
135
- *
136
- * // With timeout
137
- * const result = await ctx.elicit(
138
- * "Enter info",
139
- * z.object({ name: z.string() }),
140
- * { timeout: 60000 } // 1 minute timeout
141
- * );
142
- *
143
- * // URL mode (simplified) - automatically inferred from URL string
144
- * const authResult = await ctx.elicit(
145
- * "Please authorize access",
146
- * "https://example.com/oauth/authorize"
147
- * );
148
- *
149
- * // Verbose API (backwards compatible)
150
- * const verboseResult = await ctx.elicit({
151
- * message: "Please provide your information",
152
- * requestedSchema: { type: "object", properties: {...} },
153
- * mode: "form"
154
- * });
155
- * ```
156
- */
157
- elicit: {
158
- <T extends z.ZodObject<any>>(message: string, schema: T, options?: ElicitOptions): Promise<ElicitResult & {
159
- data: z.infer<T>;
160
- }>;
161
- (message: string, url: string, options?: ElicitOptions): Promise<ElicitResult>;
162
- (params: ElicitFormParams | ElicitUrlParams, options?: ElicitOptions): Promise<ElicitResult>;
163
- };
164
- /**
165
- * Send a progress notification to the client.
166
- * Only available if the client requested progress updates for this tool call.
167
- *
168
- * @param progress - Current progress value (should increase with each call)
169
- * @param total - Total progress value if known
170
- * @param message - Optional message describing current progress
171
- */
172
- reportProgress?: (progress: number, total?: number, message?: string) => Promise<void>;
173
- }
174
- import type { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
175
- import { type Hono as HonoType } from "hono";
176
- import type { PromptDefinition, ResourceDefinition, ResourceTemplateDefinition, ServerConfig, ToolDefinition, ToolCallback, UIResourceDefinition, InferToolInput, InferToolOutput } from "./types/index.js";
177
- export declare class McpServer<HasOAuth extends boolean = false> {
178
- private server;
1
+ import { McpServer as OfficialMcpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { CreateMessageRequest, CreateMessageResult } from "@modelcontextprotocol/sdk/types.js";
3
+ import type { Hono as HonoType } from "hono";
4
+ import { toolRegistration, convertZodSchemaToParams, createParamsSchema } from "./tools/index.js";
5
+ import { registerResource, registerResourceTemplate } from "./resources/index.js";
6
+ import { registerPrompt } from "./prompts/index.js";
7
+ import type { ToolContext, SampleOptions, ElicitOptions, ElicitFormParams, ElicitUrlParams } from "./types/tool-context.js";
8
+ export type { ToolContext, SampleOptions, ElicitOptions, ElicitFormParams, ElicitUrlParams, };
9
+ import { onRootsChanged, listRoots } from "./roots/index.js";
10
+ import type { SessionData } from "./sessions/index.js";
11
+ import { getActiveSessions, sendNotification, sendNotificationToSession } from "./notifications/index.js";
12
+ import type { ServerConfig } from "./types/index.js";
13
+ import { parseTemplateUri as parseTemplateUriHelper } from "./utils/index.js";
14
+ export declare class McpServer {
15
+ /**
16
+ * Native MCP server instance from @modelcontextprotocol/sdk
17
+ * Exposed publicly for advanced use cases
18
+ */
19
+ readonly nativeServer: OfficialMcpServer;
20
+ /** @deprecated Use nativeServer instead - kept for backward compatibility */
21
+ get server(): OfficialMcpServer;
179
22
  private config;
180
- private app;
23
+ app: HonoType;
181
24
  private mcpMounted;
182
25
  private inspectorMounted;
183
- private serverPort?;
184
- private serverHost;
185
- private serverBaseUrl?;
186
- private registeredTools;
187
- private registeredPrompts;
188
- private registeredResources;
189
- private buildId?;
190
- private sessions;
26
+ serverPort?: number;
27
+ serverHost: string;
28
+ serverBaseUrl?: string;
29
+ registeredTools: string[];
30
+ registeredPrompts: string[];
31
+ registeredResources: string[];
32
+ buildId?: string;
33
+ sessions: Map<string, SessionData>;
191
34
  private idleCleanupInterval?;
35
+ private oauthConfig?;
36
+ private oauthSetupState;
192
37
  private oauthProvider?;
193
38
  private oauthMiddleware?;
194
- private oauthConfig?;
195
- private oauthSetupComplete;
39
+ /**
40
+ * Storage for registration "recipes" that can be replayed on new server instances
41
+ * Following the official SDK pattern where each session gets its own server instance
42
+ */
43
+ private registrationRecipes;
196
44
  /**
197
45
  * Creates a new MCP server instance with Hono integration
198
46
  *
@@ -205,407 +53,37 @@ export declare class McpServer<HasOAuth extends boolean = false> {
205
53
  */
206
54
  constructor(config: ServerConfig);
207
55
  /**
208
- * Gets the server base URL with fallback to host:port if not configured
209
- * @returns The complete base URL for the server
210
- */
211
- private getServerBaseUrl;
212
- /**
213
- * Gets additional CSP URLs from environment variable
214
- * Supports comma-separated list or single URL
215
- * @returns Array of URLs to add to CSP resource_domains
216
- */
217
- private getCSPUrls;
218
- /**
219
- * Setup OAuth authentication
220
- *
221
- * Initializes OAuth provider, creates bearer auth middleware,
222
- * sets up OAuth routes, and applies auth to /mcp endpoints.
223
- *
224
- * @private
225
- */
226
- private setupOAuth;
227
- /**
228
- * Define a static resource that can be accessed by clients
229
- *
230
- * Registers a resource with the MCP server that clients can access via HTTP.
231
- * Resources are static content like files, data, or pre-computed results that
232
- * can be retrieved by clients without requiring parameters.
233
- *
234
- * @param resourceDefinition - Configuration object containing resource metadata and handler function
235
- * @param resourceDefinition.name - Unique identifier for the resource
236
- * @param resourceDefinition.uri - URI pattern for accessing the resource
237
- * @param resourceDefinition.title - Optional human-readable title for the resource
238
- * @param resourceDefinition.description - Optional description of the resource
239
- * @param resourceDefinition.mimeType - MIME type of the resource content
240
- * @param resourceDefinition.annotations - Optional annotations (audience, priority, lastModified)
241
- * @param resourceDefinition.readCallback - Async callback function that returns the resource content
242
- * @returns The server instance for method chaining
243
- *
244
- * @example
245
- * ```typescript
246
- * server.resource({
247
- * name: 'config',
248
- * uri: 'config://app-settings',
249
- * title: 'Application Settings',
250
- * mimeType: 'application/json',
251
- * description: 'Current application configuration',
252
- * annotations: {
253
- * audience: ['user'],
254
- * priority: 0.8
255
- * },
256
- * readCallback: async () => ({
257
- * contents: [{
258
- * uri: 'config://app-settings',
259
- * mimeType: 'application/json',
260
- * text: JSON.stringify({ theme: 'dark', language: 'en' })
261
- * }]
262
- * })
263
- * })
264
- * ```
265
- */
266
- resource(resourceDefinition: ResourceDefinition): this;
267
- /**
268
- * Define a dynamic resource template with parameters
269
- *
270
- * Registers a parameterized resource template with the MCP server. Templates use URI
271
- * patterns with placeholders that can be filled in at request time, allowing dynamic
272
- * resource generation based on parameters.
273
- *
274
- * @param resourceTemplateDefinition - Configuration object for the resource template
275
- * @param resourceTemplateDefinition.name - Unique identifier for the template
276
- * @param resourceTemplateDefinition.resourceTemplate - ResourceTemplate object with uriTemplate and metadata
277
- * @param resourceTemplateDefinition.readCallback - Async callback function that generates resource content from URI and params
278
- * @returns The server instance for method chaining
279
- *
280
- * @example
281
- * ```typescript
282
- * server.resourceTemplate({
283
- * name: 'user-profile',
284
- * resourceTemplate: {
285
- * uriTemplate: 'user://{userId}/profile',
286
- * name: 'User Profile',
287
- * mimeType: 'application/json'
288
- * },
289
- * readCallback: async (uri, params) => ({
290
- * contents: [{
291
- * uri: uri.toString(),
292
- * mimeType: 'application/json',
293
- * text: JSON.stringify({ userId: params.userId, name: 'John Doe' })
294
- * }]
295
- * })
296
- * })
297
- * ```
298
- */
299
- resourceTemplate(resourceTemplateDefinition: ResourceTemplateDefinition): this;
300
- /**
301
- * Define a tool that can be called by clients
302
- *
303
- * Registers a tool with the MCP server that clients can invoke with parameters.
304
- * Tools are functions that perform actions, computations, or operations and
305
- * return results. They accept structured input parameters and return structured output.
306
- *
307
- * Supports Apps SDK metadata for ChatGPT integration via the _meta field.
308
- *
309
- * @param toolDefinition - Configuration object containing tool metadata and handler function
310
- * @param toolDefinition.name - Unique identifier for the tool
311
- * @param toolDefinition.description - Optional human-readable description of what the tool does
312
- * @param toolDefinition.inputs - Array of input parameter definitions (legacy, use schema instead)
313
- * @param toolDefinition.schema - Zod object schema for input validation (preferred)
314
- * @param toolDefinition.outputSchema - Zod object schema for structured output validation
315
- * @param toolDefinition.cb - Async callback function that executes the tool logic with provided parameters
316
- * @param toolDefinition._meta - Optional metadata for the tool (e.g. Apps SDK metadata)
317
- * @param callback - Optional separate callback function (alternative to cb property)
318
- * @returns The server instance for method chaining
319
- *
320
- * @example
321
- * ```typescript
322
- * // Using Zod schema (preferred)
323
- * server.tool({
324
- * name: 'calculate',
325
- * description: 'Performs mathematical calculations',
326
- * schema: z.object({
327
- * expression: z.string(),
328
- * precision: z.number().optional()
329
- * }),
330
- * cb: async ({ expression, precision = 2 }) => {
331
- * const result = eval(expression)
332
- * return text(`Result: ${result.toFixed(precision)}`)
333
- * }
334
- * })
335
- *
336
- * // Using legacy inputs array
337
- * server.tool({
338
- * name: 'greet',
339
- * inputs: [{ name: 'name', type: 'string', required: true }],
340
- * cb: async ({ name }) => text(`Hello, ${name}!`)
341
- * })
342
- *
343
- * // With separate callback for better typing
344
- * server.tool({
345
- * name: 'add',
346
- * schema: z.object({ a: z.number(), b: z.number() })
347
- * }, async ({ a, b }) => text(`${a + b}`))
348
- * ```
349
- */
350
- tool<T extends ToolDefinition<any, any, HasOAuth>>(toolDefinition: T, callback: ToolCallback<InferToolInput<T>, InferToolOutput<T>, HasOAuth>): this;
351
- tool<T extends ToolDefinition<any, any, HasOAuth>>(toolDefinition: T): this;
352
- /**
353
- * Define a prompt template
354
- *
355
- * Registers a prompt template with the MCP server that clients can use to generate
356
- * structured prompts for AI models. Prompt templates accept parameters and return
357
- * formatted text that can be used as input to language models or other AI systems.
358
- *
359
- * @param promptDefinition - Configuration object containing prompt metadata and handler function
360
- * @param promptDefinition.name - Unique identifier for the prompt template
361
- * @param promptDefinition.description - Human-readable description of the prompt's purpose
362
- * @param promptDefinition.args - Array of argument definitions with types and validation
363
- * @param promptDefinition.cb - Async callback function that generates the prompt from provided arguments
364
- * @returns The server instance for method chaining
365
- *
366
- * @example
367
- * ```typescript
368
- * server.prompt({
369
- * name: 'code-review',
370
- * description: 'Generates a code review prompt',
371
- * args: [
372
- * { name: 'language', type: 'string', required: true },
373
- * { name: 'focus', type: 'string', required: false }
374
- * ],
375
- * cb: async ({ language, focus = 'general' }) => {
376
- * return {
377
- * messages: [{
378
- * role: 'user',
379
- * content: `Please review this ${language} code with focus on ${focus}...`
380
- * }]
381
- * }
382
- * }
383
- * })
384
- * ```
385
- */
386
- prompt(promptDefinition: PromptDefinition): this;
387
- /**
388
- * Request LLM sampling from connected clients.
389
- *
390
- * This method allows server tools to request LLM completions from clients
391
- * that support the sampling capability. The client will handle model selection,
392
- * user approval (human-in-the-loop), and return the generated response.
393
- *
394
- * @param params - Sampling request parameters including messages, model preferences, etc.
395
- * @param options - Optional request options (timeouts, cancellation, etc.)
396
- * @returns Promise resolving to the generated message from the client's LLM
397
- *
398
- * @example
399
- * ```typescript
400
- * // In a tool callback
401
- * server.tool({
402
- * name: 'analyze-sentiment',
403
- * description: 'Analyze sentiment using LLM',
404
- * inputs: [{ name: 'text', type: 'string', required: true }],
405
- * cb: async (params, ctx) => {
406
- * const result = await ctx.sample({
407
- * messages: [{
408
- * role: 'user',
409
- * content: { type: 'text', text: `Analyze sentiment: ${params.text}` }
410
- * }],
411
- * modelPreferences: {
412
- * intelligencePriority: 0.8,
413
- * speedPriority: 0.5
414
- * }
415
- * });
416
- * return {
417
- * content: [{ type: 'text', text: result.content.text }]
418
- * };
419
- * }
420
- * })
421
- * ```
422
- */
423
- createMessage(params: CreateMessageRequest["params"], options?: RequestOptions): Promise<CreateMessageResult>;
424
- /**
425
- * Register a UI widget as both a tool and a resource
426
- *
427
- * Creates a unified interface for MCP-UI compatible widgets that can be accessed
428
- * either as tools (with parameters) or as resources (static access). The tool
429
- * allows dynamic parameter passing while the resource provides discoverable access.
430
- *
431
- * Supports multiple UI resource types:
432
- * - externalUrl: Legacy MCP-UI iframe-based widgets
433
- * - rawHtml: Legacy MCP-UI raw HTML content
434
- * - remoteDom: Legacy MCP-UI Remote DOM scripting
435
- * - appsSdk: OpenAI Apps SDK compatible widgets (text/html+skybridge)
436
- *
437
- * @param widgetNameOrDefinition - Widget name (string) for auto-loading schema, or full configuration object
438
- * @param definition.name - Unique identifier for the resource
439
- * @param definition.type - Type of UI resource (externalUrl, rawHtml, remoteDom, appsSdk)
440
- * @param definition.title - Human-readable title for the widget
441
- * @param definition.description - Description of the widget's functionality
442
- * @param definition.props - Widget properties configuration with types and defaults
443
- * @param definition.size - Preferred iframe size [width, height] (e.g., ['900px', '600px'])
444
- * @param definition.annotations - Resource annotations for discovery
445
- * @param definition.appsSdkMetadata - Apps SDK specific metadata (CSP, widget description, etc.)
446
- * @returns The server instance for method chaining
447
- *
448
- * @example
449
- * ```typescript
450
- * // Simple usage - auto-loads from generated schema
451
- * server.uiResource('display-weather')
452
- *
453
- * // Legacy MCP-UI widget
454
- * server.uiResource({
455
- * type: 'externalUrl',
456
- * name: 'kanban-board',
457
- * widget: 'kanban-board',
458
- * title: 'Kanban Board',
459
- * description: 'Interactive task management board',
460
- * props: {
461
- * initialTasks: {
462
- * type: 'array',
463
- * description: 'Initial tasks to display',
464
- * required: false
465
- * }
466
- * },
467
- * size: ['900px', '600px']
468
- * })
469
- *
470
- * // Apps SDK widget
471
- * server.uiResource({
472
- * type: 'appsSdk',
473
- * name: 'kanban-board',
474
- * title: 'Kanban Board',
475
- * description: 'Interactive task management board',
476
- * htmlTemplate: `
477
- * <div id="kanban-root"></div>
478
- * <style>${kanbanCSS}</style>
479
- * <script type="module">${kanbanJS}</script>
480
- * `,
481
- * appsSdkMetadata: {
482
- * 'openai/widgetDescription': 'Displays an interactive kanban board',
483
- * 'openai/widgetCSP': {
484
- * connect_domains: [],
485
- * resource_domains: ['https://cdn.example.com']
486
- * }
487
- * }
488
- * })
489
- * ```
490
- */
491
- uiResource(definition: UIResourceDefinition): this;
492
- /**
493
- * Create a UIResource object for a widget with the given parameters
494
- *
495
- * This method is shared between tool and resource handlers to avoid duplication.
496
- * It creates a consistent UIResource structure that can be rendered by MCP-UI
497
- * compatible clients.
498
- *
499
- * @private
500
- * @param definition - UIResource definition
501
- * @param params - Parameters to pass to the widget via URL
502
- * @returns UIResource object compatible with MCP-UI
503
- */
504
- private createWidgetUIResource;
505
- /**
506
- * Generate a widget URI with optional build ID for cache busting
507
- *
508
- * @private
509
- * @param widgetName - Widget name/identifier
510
- * @param extension - Optional file extension (e.g., '.html')
511
- * @param suffix - Optional suffix (e.g., random ID for dynamic URIs)
512
- * @returns Widget URI with build ID if available
513
- */
514
- private generateWidgetUri;
515
- /**
516
- * Convert widget props definition to tool input schema
517
- *
518
- * Transforms the widget props configuration into the format expected by
519
- * the tool registration system, mapping types and handling defaults.
520
- *
521
- * @private
522
- * @param props - Widget props configuration
523
- * @returns Array of InputDefinition objects for tool registration
56
+ * Wrap registration methods to capture recipes following official SDK pattern.
57
+ * Each session will get a fresh server instance with all registrations replayed.
524
58
  */
525
- private convertPropsToInputs;
59
+ private wrapRegistrationMethods;
526
60
  /**
527
- * Apply default values to widget props
528
- *
529
- * Extracts default values from the props configuration to use when
530
- * the resource is accessed without parameters.
531
- *
532
- * @private
533
- * @param props - Widget props configuration
534
- * @returns Object with default values for each prop
61
+ * Create a new server instance for a session following official SDK pattern.
62
+ * This is called for each initialize request to create an isolated server.
535
63
  */
536
- private applyDefaultProps;
64
+ getServerForSession(): OfficialMcpServer;
537
65
  /**
538
- * Check if server is running in production mode
539
- *
540
- * @private
541
- * @returns true if in production mode, false otherwise
542
- */
543
- private isProductionMode;
544
- /**
545
- * Read build manifest file
546
- *
547
- * @private
548
- * @returns Build manifest or null if not found
549
- */
550
- private readBuildManifest;
551
- /**
552
- * Mount widget files - automatically chooses between dev and production mode
553
- *
554
- * In development mode: creates Vite dev servers with HMR support
555
- * In production mode: serves pre-built static widgets
556
- *
557
- * @param options - Configuration options
558
- * @param options.baseRoute - Base route for widgets (defaults to '/mcp-use/widgets')
559
- * @param options.resourcesDir - Directory containing widget files (defaults to 'resources')
560
- * @returns Promise that resolves when all widgets are mounted
561
- */
562
- mountWidgets(options?: {
563
- baseRoute?: string;
564
- resourcesDir?: string;
565
- }): Promise<void>;
566
- /**
567
- * Mount individual widget files from resources/ directory in development mode
568
- *
569
- * Scans the resources/ directory for .tsx/.ts widget files and creates individual
570
- * Vite dev servers for each widget with HMR support. Each widget is served at its
571
- * own route: /mcp-use/widgets/{widget-name}
572
- *
573
- * @private
574
- * @param options - Configuration options
575
- * @param options.baseRoute - Base route for widgets (defaults to '/mcp-use/widgets')
576
- * @param options.resourcesDir - Directory containing widget files (defaults to 'resources')
577
- * @returns Promise that resolves when all widgets are mounted
578
- */
579
- private mountWidgetsDev;
580
- /**
581
- * Mount pre-built widgets from dist/resources/widgets/ directory in production mode
582
- *
583
- * Serves static widget bundles that were built using the build command.
584
- * Sets up Express routes to serve the HTML and asset files, then registers
585
- * tools and resources for each widget.
586
- *
587
- * @private
588
- * @param options - Configuration options
589
- * @param options.baseRoute - Base route for widgets (defaults to '/mcp-use/widgets')
590
- * @returns Promise that resolves when all widgets are mounted
591
- */
592
- private mountWidgetsProduction;
593
- /**
594
- * Helper to wait for transport.handleRequest to complete and response to be written
595
- *
596
- * Wraps the transport.handleRequest call in a Promise that only resolves when
597
- * expressRes.end() is called, ensuring all async operations complete before
598
- * we attempt to read the response.
599
- *
600
- * @private
66
+ * Gets the server base URL with fallback to host:port if not configured
67
+ * @returns The complete base URL for the server
601
68
  */
602
- private waitForRequestComplete;
69
+ private getServerBaseUrl;
70
+ tool: typeof toolRegistration;
71
+ convertZodSchemaToParams: typeof convertZodSchemaToParams;
72
+ createParamsSchema: typeof createParamsSchema;
73
+ parseTemplateUri: typeof parseTemplateUriHelper;
74
+ resource: typeof registerResource;
75
+ resourceTemplate: typeof registerResourceTemplate;
76
+ prompt: typeof registerPrompt;
77
+ getActiveSessions: typeof getActiveSessions;
78
+ sendNotification: typeof sendNotification;
79
+ sendNotificationToSession: typeof sendNotificationToSession;
80
+ uiResource: any;
603
81
  /**
604
82
  * Mount MCP server endpoints at /mcp and /sse
605
83
  *
606
84
  * Sets up the HTTP transport layer for the MCP server, creating endpoints for
607
85
  * Server-Sent Events (SSE) streaming, POST message handling, and DELETE session cleanup.
608
- * Transports are reused per session ID to maintain state across requests.
86
+ * The transport manages multiple sessions through a single server instance.
609
87
  *
610
88
  * This method is called automatically when the server starts listening and ensures
611
89
  * that MCP clients can communicate with the server over HTTP.
@@ -630,7 +108,7 @@ export declare class McpServer<HasOAuth extends boolean = false> {
630
108
  * The server will be accessible at the specified port with MCP endpoints at /mcp and /sse
631
109
  * and inspector UI at /inspector (if the inspector package is installed).
632
110
  *
633
- * @param port - Port number to listen on (defaults to 3001 if not specified)
111
+ * @param port - Port number to listen on (defaults to 3000 if not specified)
634
112
  * @returns Promise that resolves when the server is successfully listening
635
113
  *
636
114
  * @example
@@ -645,6 +123,13 @@ export declare class McpServer<HasOAuth extends boolean = false> {
645
123
  * Log registered tools, prompts, and resources to console
646
124
  */
647
125
  private logRegisteredItems;
126
+ getBuildId(): string | undefined;
127
+ getServerPort(): number;
128
+ /**
129
+ * Create a message for sampling (calling the LLM)
130
+ * Delegates to the native SDK server
131
+ */
132
+ createMessage(params: CreateMessageRequest["params"], options?: any): Promise<CreateMessageResult>;
648
133
  listen(port?: number): Promise<void>;
649
134
  /**
650
135
  * Get the fetch handler for the server after mounting all endpoints
@@ -682,132 +167,8 @@ export declare class McpServer<HasOAuth extends boolean = false> {
682
167
  getHandler(options?: {
683
168
  provider?: "supabase" | "cloudflare" | "deno-deploy";
684
169
  }): Promise<(req: Request) => Promise<Response>>;
685
- /**
686
- * Get array of active session IDs
687
- *
688
- * Returns an array of all currently active session IDs. This is useful for
689
- * sending targeted notifications to specific clients or iterating over
690
- * connected clients.
691
- *
692
- * Note: This only works in stateful mode. In stateless mode (edge environments),
693
- * this will return an empty array.
694
- *
695
- * @returns Array of active session ID strings
696
- *
697
- * @example
698
- * ```typescript
699
- * const sessions = server.getActiveSessions();
700
- * console.log(`${sessions.length} clients connected`);
701
- *
702
- * // Send notification to first connected client
703
- * if (sessions.length > 0) {
704
- * server.sendNotificationToSession(sessions[0], "custom/hello", { message: "Hi!" });
705
- * }
706
- * ```
707
- */
708
- getActiveSessions(): string[];
709
- /**
710
- * Send a notification to all connected clients
711
- *
712
- * Broadcasts a JSON-RPC notification to all active sessions. Notifications are
713
- * one-way messages that do not expect a response from the client.
714
- *
715
- * Note: This only works in stateful mode with active sessions. If no sessions
716
- * are connected, the notification is silently discarded (per MCP spec: "server MAY send").
717
- *
718
- * @param method - The notification method name (e.g., "custom/my-notification")
719
- * @param params - Optional parameters to include in the notification
720
- *
721
- * @example
722
- * ```typescript
723
- * // Send a simple notification to all clients
724
- * server.sendNotification("custom/server-status", {
725
- * status: "ready",
726
- * timestamp: new Date().toISOString()
727
- * });
728
- *
729
- * // Notify all clients that resources have changed
730
- * server.sendNotification("notifications/resources/list_changed");
731
- * ```
732
- */
733
- sendNotification(method: string, params?: Record<string, unknown>): Promise<void>;
734
- /**
735
- * Send a notification to a specific client session
736
- *
737
- * Sends a JSON-RPC notification to a single client identified by their session ID.
738
- * This allows sending customized notifications to individual clients.
739
- *
740
- * Note: This only works in stateful mode. If the session ID doesn't exist,
741
- * the notification is silently discarded.
742
- *
743
- * @param sessionId - The target session ID (from getActiveSessions())
744
- * @param method - The notification method name (e.g., "custom/my-notification")
745
- * @param params - Optional parameters to include in the notification
746
- * @returns true if the notification was sent, false if session not found
747
- *
748
- * @example
749
- * ```typescript
750
- * const sessions = server.getActiveSessions();
751
- *
752
- * // Send different messages to different clients
753
- * sessions.forEach((sessionId, index) => {
754
- * server.sendNotificationToSession(sessionId, "custom/welcome", {
755
- * message: `Hello client #${index + 1}!`,
756
- * clientNumber: index + 1
757
- * });
758
- * });
759
- * ```
760
- */
761
- sendNotificationToSession(sessionId: string, method: string, params?: Record<string, unknown>): Promise<boolean>;
762
- private onRootsChangedCallback?;
763
- /**
764
- * Register a callback for when a client's roots change
765
- *
766
- * When a client sends a `notifications/roots/list_changed` notification,
767
- * the server will automatically request the updated roots list and call
768
- * this callback with the new roots.
769
- *
770
- * @param callback - Function called with the updated roots array
771
- *
772
- * @example
773
- * ```typescript
774
- * server.onRootsChanged(async (roots) => {
775
- * console.log("Client roots updated:", roots);
776
- * roots.forEach(root => {
777
- * console.log(` - ${root.name || "unnamed"}: ${root.uri}`);
778
- * });
779
- * });
780
- * ```
781
- */
782
- onRootsChanged(callback: (roots: Array<{
783
- uri: string;
784
- name?: string;
785
- }>) => void | Promise<void>): this;
786
- /**
787
- * Request the current roots list from a specific client session
788
- *
789
- * This sends a `roots/list` request to the client and returns
790
- * the list of roots the client has configured.
791
- *
792
- * @param sessionId - The session ID of the client to query
793
- * @returns Array of roots, or null if the session doesn't exist or request fails
794
- *
795
- * @example
796
- * ```typescript
797
- * const sessions = server.getActiveSessions();
798
- * if (sessions.length > 0) {
799
- * const roots = await server.listRoots(sessions[0]);
800
- * if (roots) {
801
- * console.log(`Client has ${roots.length} roots:`);
802
- * roots.forEach(r => console.log(` - ${r.uri}`));
803
- * }
804
- * }
805
- * ```
806
- */
807
- listRoots(sessionId: string): Promise<Array<{
808
- uri: string;
809
- name?: string;
810
- }> | null>;
170
+ onRootsChanged: typeof onRootsChanged;
171
+ listRoots: typeof listRoots;
811
172
  /**
812
173
  * Mount MCP Inspector UI at /inspector
813
174
  *
@@ -831,78 +192,8 @@ export declare class McpServer<HasOAuth extends boolean = false> {
831
192
  * - No inspector UI available
832
193
  */
833
194
  private mountInspector;
834
- /**
835
- * Setup default widget serving routes
836
- *
837
- * Configures Hono routes to serve MCP UI widgets and their static assets.
838
- * Widgets are served from the dist/resources/widgets directory and can
839
- * be accessed via HTTP endpoints for embedding in web applications.
840
- *
841
- * Routes created:
842
- * - GET /mcp-use/widgets/:widget - Serves widget's index.html
843
- * - GET /mcp-use/widgets/:widget/assets/* - Serves widget-specific assets
844
- * - GET /mcp-use/widgets/assets/* - Fallback asset serving with auto-discovery
845
- *
846
- * @private
847
- * @returns void
848
- *
849
- * @example
850
- * Widget routes:
851
- * - http://localhost:3001/mcp-use/widgets/kanban-board
852
- * - http://localhost:3001/mcp-use/widgets/todo-list/assets/style.css
853
- * - http://localhost:3001/mcp-use/widgets/assets/script.js (auto-discovered)
854
- */
855
- private setupWidgetRoutes;
856
- /**
857
- * Convert a Zod object schema to the internal Record<string, z.ZodSchema> format
858
- *
859
- * @param zodSchema - Zod object schema to convert
860
- * @returns Object mapping parameter names to Zod validation schemas
861
- */
862
- private convertZodSchemaToParams;
863
- /**
864
- * Create input schema for tools
865
- *
866
- * Converts tool input definitions into Zod validation schemas for runtime validation.
867
- * Supports common data types (string, number, boolean, object, array) and optional
868
- * parameters. Used internally when registering tools with the MCP server.
869
- *
870
- * @param inputs - Array of input parameter definitions with name, type, and optional flag
871
- * @returns Object mapping parameter names to Zod validation schemas
872
- *
873
- * @example
874
- * ```typescript
875
- * const schema = this.createParamsSchema([
876
- * { name: 'query', type: 'string', required: true, description: 'Search query' },
877
- * { name: 'limit', type: 'number', required: false }
878
- * ])
879
- * // Returns: { query: z.string().describe('Search query'), limit: z.number().optional() }
880
- * ```
881
- */
882
- private createParamsSchema;
883
- /**
884
- * Parse parameter values from a URI based on a template
885
- *
886
- * Extracts parameter values from an actual URI by matching it against a URI template.
887
- * The template contains placeholders like {param} which are extracted as key-value pairs.
888
- *
889
- * @param template - URI template with placeholders (e.g., "user://{userId}/posts/{postId}")
890
- * @param uri - Actual URI to parse (e.g., "user://123/posts/456")
891
- * @returns Object mapping parameter names to their values
892
- *
893
- * @example
894
- * ```typescript
895
- * const params = this.parseTemplateUri("user://{userId}/posts/{postId}", "user://123/posts/456")
896
- * // Returns: { userId: "123", postId: "456" }
897
- * ```
898
- */
899
- private parseTemplateUri;
900
195
  }
901
- export type McpServerInstance<HasOAuth extends boolean = false> = Omit<McpServer<HasOAuth>, keyof HonoType> & HonoType & {
902
- getHandler: (options?: {
903
- provider?: "supabase" | "cloudflare" | "deno-deploy";
904
- }) => Promise<(req: Request) => Promise<Response>>;
905
- };
196
+ export type McpServerInstance = McpServer & HonoType;
906
197
  /**
907
198
  * Create a new MCP server instance
908
199
  *
@@ -951,6 +242,6 @@ export type McpServerInstance<HasOAuth extends boolean = false> = Omit<McpServer
951
242
  */
952
243
  export declare function createMCPServer(name: string, config: Partial<ServerConfig> & {
953
244
  oauth: NonNullable<ServerConfig["oauth"]>;
954
- }): McpServerInstance<true>;
955
- export declare function createMCPServer(name: string, config?: Partial<ServerConfig>): McpServerInstance<false>;
245
+ }): McpServerInstance;
246
+ export declare function createMCPServer(name: string, config?: Partial<ServerConfig>): McpServerInstance;
956
247
  //# sourceMappingURL=mcp-server.d.ts.map