@nitrostack/core 1.0.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 (239) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +80 -0
  3. package/dist/auth/api-key.d.ts +118 -0
  4. package/dist/auth/api-key.d.ts.map +1 -0
  5. package/dist/auth/api-key.js +168 -0
  6. package/dist/auth/api-key.js.map +1 -0
  7. package/dist/auth/client.d.ts +151 -0
  8. package/dist/auth/client.d.ts.map +1 -0
  9. package/dist/auth/client.js +330 -0
  10. package/dist/auth/client.js.map +1 -0
  11. package/dist/auth/index.d.ts +31 -0
  12. package/dist/auth/index.d.ts.map +1 -0
  13. package/dist/auth/index.js +46 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/auth/middleware.d.ts +95 -0
  16. package/dist/auth/middleware.d.ts.map +1 -0
  17. package/dist/auth/middleware.js +260 -0
  18. package/dist/auth/middleware.js.map +1 -0
  19. package/dist/auth/pkce.d.ts +53 -0
  20. package/dist/auth/pkce.d.ts.map +1 -0
  21. package/dist/auth/pkce.js +105 -0
  22. package/dist/auth/pkce.js.map +1 -0
  23. package/dist/auth/quick-setup.d.ts +94 -0
  24. package/dist/auth/quick-setup.d.ts.map +1 -0
  25. package/dist/auth/quick-setup.js +210 -0
  26. package/dist/auth/quick-setup.js.map +1 -0
  27. package/dist/auth/secure-secret.d.ts +136 -0
  28. package/dist/auth/secure-secret.d.ts.map +1 -0
  29. package/dist/auth/secure-secret.js +182 -0
  30. package/dist/auth/secure-secret.js.map +1 -0
  31. package/dist/auth/server-integration.d.ts +97 -0
  32. package/dist/auth/server-integration.d.ts.map +1 -0
  33. package/dist/auth/server-integration.js +182 -0
  34. package/dist/auth/server-integration.js.map +1 -0
  35. package/dist/auth/server-metadata.d.ts +51 -0
  36. package/dist/auth/server-metadata.d.ts.map +1 -0
  37. package/dist/auth/server-metadata.js +106 -0
  38. package/dist/auth/server-metadata.js.map +1 -0
  39. package/dist/auth/simple-jwt.d.ts +174 -0
  40. package/dist/auth/simple-jwt.d.ts.map +1 -0
  41. package/dist/auth/simple-jwt.js +162 -0
  42. package/dist/auth/simple-jwt.js.map +1 -0
  43. package/dist/auth/token-store.d.ts +104 -0
  44. package/dist/auth/token-store.d.ts.map +1 -0
  45. package/dist/auth/token-store.js +205 -0
  46. package/dist/auth/token-store.js.map +1 -0
  47. package/dist/auth/token-validation.d.ts +59 -0
  48. package/dist/auth/token-validation.d.ts.map +1 -0
  49. package/dist/auth/token-validation.js +241 -0
  50. package/dist/auth/token-validation.js.map +1 -0
  51. package/dist/auth/types.d.ts +215 -0
  52. package/dist/auth/types.d.ts.map +1 -0
  53. package/dist/auth/types.js +6 -0
  54. package/dist/auth/types.js.map +1 -0
  55. package/dist/core/apikey-module.d.ts +69 -0
  56. package/dist/core/apikey-module.d.ts.map +1 -0
  57. package/dist/core/apikey-module.js +114 -0
  58. package/dist/core/apikey-module.js.map +1 -0
  59. package/dist/core/app-decorator.d.ts +59 -0
  60. package/dist/core/app-decorator.d.ts.map +1 -0
  61. package/dist/core/app-decorator.js +322 -0
  62. package/dist/core/app-decorator.js.map +1 -0
  63. package/dist/core/builders.d.ts +50 -0
  64. package/dist/core/builders.d.ts.map +1 -0
  65. package/dist/core/builders.js +139 -0
  66. package/dist/core/builders.js.map +1 -0
  67. package/dist/core/component.d.ts +111 -0
  68. package/dist/core/component.d.ts.map +1 -0
  69. package/dist/core/component.js +228 -0
  70. package/dist/core/component.js.map +1 -0
  71. package/dist/core/config-module.d.ts +62 -0
  72. package/dist/core/config-module.d.ts.map +1 -0
  73. package/dist/core/config-module.js +94 -0
  74. package/dist/core/config-module.js.map +1 -0
  75. package/dist/core/decorators/cache.decorator.d.ts +61 -0
  76. package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
  77. package/dist/core/decorators/cache.decorator.js +115 -0
  78. package/dist/core/decorators/cache.decorator.js.map +1 -0
  79. package/dist/core/decorators/health-check.decorator.d.ts +80 -0
  80. package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
  81. package/dist/core/decorators/health-check.decorator.js +153 -0
  82. package/dist/core/decorators/health-check.decorator.js.map +1 -0
  83. package/dist/core/decorators/rate-limit.decorator.d.ts +63 -0
  84. package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
  85. package/dist/core/decorators/rate-limit.decorator.js +129 -0
  86. package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
  87. package/dist/core/decorators.d.ts +190 -0
  88. package/dist/core/decorators.d.ts.map +1 -0
  89. package/dist/core/decorators.js +170 -0
  90. package/dist/core/decorators.js.map +1 -0
  91. package/dist/core/di/container.d.ts +64 -0
  92. package/dist/core/di/container.d.ts.map +1 -0
  93. package/dist/core/di/container.js +105 -0
  94. package/dist/core/di/container.js.map +1 -0
  95. package/dist/core/di/injectable.decorator.d.ts +62 -0
  96. package/dist/core/di/injectable.decorator.d.ts.map +1 -0
  97. package/dist/core/di/injectable.decorator.js +66 -0
  98. package/dist/core/di/injectable.decorator.js.map +1 -0
  99. package/dist/core/errors.d.ts +54 -0
  100. package/dist/core/errors.d.ts.map +1 -0
  101. package/dist/core/errors.js +87 -0
  102. package/dist/core/errors.js.map +1 -0
  103. package/dist/core/events/event-emitter.d.ts +50 -0
  104. package/dist/core/events/event-emitter.d.ts.map +1 -0
  105. package/dist/core/events/event-emitter.js +94 -0
  106. package/dist/core/events/event-emitter.js.map +1 -0
  107. package/dist/core/events/event.decorator.d.ts +48 -0
  108. package/dist/core/events/event.decorator.d.ts.map +1 -0
  109. package/dist/core/events/event.decorator.js +72 -0
  110. package/dist/core/events/event.decorator.js.map +1 -0
  111. package/dist/core/events/log-emitter.d.ts +14 -0
  112. package/dist/core/events/log-emitter.d.ts.map +1 -0
  113. package/dist/core/events/log-emitter.js +20 -0
  114. package/dist/core/events/log-emitter.js.map +1 -0
  115. package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
  116. package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
  117. package/dist/core/filters/exception-filter.decorator.js +54 -0
  118. package/dist/core/filters/exception-filter.decorator.js.map +1 -0
  119. package/dist/core/filters/exception-filter.interface.d.ts +39 -0
  120. package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
  121. package/dist/core/filters/exception-filter.interface.js +2 -0
  122. package/dist/core/filters/exception-filter.interface.js.map +1 -0
  123. package/dist/core/guards/apikey.guard.d.ts +22 -0
  124. package/dist/core/guards/apikey.guard.d.ts.map +1 -0
  125. package/dist/core/guards/apikey.guard.js +11 -0
  126. package/dist/core/guards/apikey.guard.js.map +1 -0
  127. package/dist/core/guards/guard.interface.d.ts +18 -0
  128. package/dist/core/guards/guard.interface.d.ts.map +1 -0
  129. package/dist/core/guards/guard.interface.js +2 -0
  130. package/dist/core/guards/guard.interface.js.map +1 -0
  131. package/dist/core/guards/jwt.guard.d.ts +18 -0
  132. package/dist/core/guards/jwt.guard.d.ts.map +1 -0
  133. package/dist/core/guards/jwt.guard.js +2 -0
  134. package/dist/core/guards/jwt.guard.js.map +1 -0
  135. package/dist/core/guards/oauth.guard.d.ts +35 -0
  136. package/dist/core/guards/oauth.guard.d.ts.map +1 -0
  137. package/dist/core/guards/oauth.guard.js +2 -0
  138. package/dist/core/guards/oauth.guard.js.map +1 -0
  139. package/dist/core/guards/use-guards.decorator.d.ts +25 -0
  140. package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
  141. package/dist/core/guards/use-guards.decorator.js +32 -0
  142. package/dist/core/guards/use-guards.decorator.js.map +1 -0
  143. package/dist/core/health/health-checks.resource.d.ts +14 -0
  144. package/dist/core/health/health-checks.resource.d.ts.map +1 -0
  145. package/dist/core/health/health-checks.resource.js +29 -0
  146. package/dist/core/health/health-checks.resource.js.map +1 -0
  147. package/dist/core/index.d.ts +57 -0
  148. package/dist/core/index.d.ts.map +1 -0
  149. package/dist/core/index.js +59 -0
  150. package/dist/core/index.js.map +1 -0
  151. package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
  152. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
  153. package/dist/core/interceptors/interceptor.decorator.js +51 -0
  154. package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
  155. package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
  156. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
  157. package/dist/core/interceptors/interceptor.interface.js +2 -0
  158. package/dist/core/interceptors/interceptor.interface.js.map +1 -0
  159. package/dist/core/jwt-module.d.ts +51 -0
  160. package/dist/core/jwt-module.d.ts.map +1 -0
  161. package/dist/core/jwt-module.js +52 -0
  162. package/dist/core/jwt-module.js.map +1 -0
  163. package/dist/core/logger.d.ts +18 -0
  164. package/dist/core/logger.d.ts.map +1 -0
  165. package/dist/core/logger.js +53 -0
  166. package/dist/core/logger.js.map +1 -0
  167. package/dist/core/middleware/middleware.decorator.d.ts +39 -0
  168. package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
  169. package/dist/core/middleware/middleware.decorator.js +53 -0
  170. package/dist/core/middleware/middleware.decorator.js.map +1 -0
  171. package/dist/core/middleware/middleware.interface.d.ts +29 -0
  172. package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
  173. package/dist/core/middleware/middleware.interface.js +2 -0
  174. package/dist/core/middleware/middleware.interface.js.map +1 -0
  175. package/dist/core/module.d.ts +93 -0
  176. package/dist/core/module.d.ts.map +1 -0
  177. package/dist/core/module.js +87 -0
  178. package/dist/core/module.js.map +1 -0
  179. package/dist/core/oauth-module.d.ts +123 -0
  180. package/dist/core/oauth-module.d.ts.map +1 -0
  181. package/dist/core/oauth-module.js +324 -0
  182. package/dist/core/oauth-module.js.map +1 -0
  183. package/dist/core/pipes/pipe.decorator.d.ts +64 -0
  184. package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
  185. package/dist/core/pipes/pipe.decorator.js +85 -0
  186. package/dist/core/pipes/pipe.decorator.js.map +1 -0
  187. package/dist/core/pipes/pipe.interface.d.ts +41 -0
  188. package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
  189. package/dist/core/pipes/pipe.interface.js +2 -0
  190. package/dist/core/pipes/pipe.interface.js.map +1 -0
  191. package/dist/core/prompt.d.ts +46 -0
  192. package/dist/core/prompt.d.ts.map +1 -0
  193. package/dist/core/prompt.js +76 -0
  194. package/dist/core/prompt.js.map +1 -0
  195. package/dist/core/resource.d.ts +47 -0
  196. package/dist/core/resource.d.ts.map +1 -0
  197. package/dist/core/resource.js +90 -0
  198. package/dist/core/resource.js.map +1 -0
  199. package/dist/core/server.d.ts +129 -0
  200. package/dist/core/server.d.ts.map +1 -0
  201. package/dist/core/server.js +617 -0
  202. package/dist/core/server.js.map +1 -0
  203. package/dist/core/tool.d.ts +108 -0
  204. package/dist/core/tool.d.ts.map +1 -0
  205. package/dist/core/tool.js +241 -0
  206. package/dist/core/tool.js.map +1 -0
  207. package/dist/core/transports/discovery-http-server.d.ts +19 -0
  208. package/dist/core/transports/discovery-http-server.d.ts.map +1 -0
  209. package/dist/core/transports/discovery-http-server.js +54 -0
  210. package/dist/core/transports/discovery-http-server.js.map +1 -0
  211. package/dist/core/transports/http-server.d.ts +108 -0
  212. package/dist/core/transports/http-server.d.ts.map +1 -0
  213. package/dist/core/transports/http-server.js +293 -0
  214. package/dist/core/transports/http-server.js.map +1 -0
  215. package/dist/core/transports/streamable-http.d.ts +177 -0
  216. package/dist/core/transports/streamable-http.d.ts.map +1 -0
  217. package/dist/core/transports/streamable-http.js +1287 -0
  218. package/dist/core/transports/streamable-http.js.map +1 -0
  219. package/dist/core/types.d.ts +195 -0
  220. package/dist/core/types.d.ts.map +1 -0
  221. package/dist/core/types.js +2 -0
  222. package/dist/core/types.js.map +1 -0
  223. package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
  224. package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
  225. package/dist/core/widgets/widget-examples.resource.js +28 -0
  226. package/dist/core/widgets/widget-examples.resource.js.map +1 -0
  227. package/dist/core/widgets/widget-registry.d.ts +56 -0
  228. package/dist/core/widgets/widget-registry.d.ts.map +1 -0
  229. package/dist/core/widgets/widget-registry.js +75 -0
  230. package/dist/core/widgets/widget-registry.js.map +1 -0
  231. package/dist/testing/index.d.ts +103 -0
  232. package/dist/testing/index.d.ts.map +1 -0
  233. package/dist/testing/index.js +161 -0
  234. package/dist/testing/index.js.map +1 -0
  235. package/dist/ui-next/index.d.ts +31 -0
  236. package/dist/ui-next/index.d.ts.map +1 -0
  237. package/dist/ui-next/index.js +687 -0
  238. package/dist/ui-next/index.js.map +1 -0
  239. package/package.json +89 -0
@@ -0,0 +1,108 @@
1
+ import { Tool as McpTool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { z } from 'zod';
3
+ import { Component } from './component.js';
4
+ import { ExecutionContext, JsonValue } from './types.js';
5
+ import { GuardConstructor } from './guards/guard.interface.js';
6
+ import { MiddlewareConstructor } from './middleware/middleware.interface.js';
7
+ import { InterceptorConstructor } from './interceptors/interceptor.interface.js';
8
+ import { PipeConstructor } from './pipes/pipe.interface.js';
9
+ import { ExceptionFilterConstructor } from './filters/exception-filter.interface.js';
10
+ /**
11
+ * JSON Schema representation for tool input
12
+ */
13
+ export interface JsonSchema {
14
+ type?: string;
15
+ properties?: Record<string, JsonSchema>;
16
+ required?: string[];
17
+ items?: JsonSchema;
18
+ additionalProperties?: boolean | JsonSchema;
19
+ description?: string;
20
+ default?: JsonValue;
21
+ enum?: JsonValue[];
22
+ [key: string]: unknown;
23
+ }
24
+ /**
25
+ * Tool input schema - can be Zod schema or JSON Schema
26
+ */
27
+ export type ToolInputSchema = z.ZodSchema | JsonSchema;
28
+ /**
29
+ * Tool handler function type
30
+ */
31
+ export type ToolHandler<TInput = unknown, TOutput = unknown> = (input: TInput, context: ExecutionContext) => Promise<TOutput>;
32
+ /**
33
+ * Tool examples for documentation
34
+ */
35
+ export interface ToolExamples {
36
+ request?: JsonValue;
37
+ response?: JsonValue;
38
+ }
39
+ export interface ToolOptions<TInput = unknown, TOutput = unknown> {
40
+ name: string;
41
+ description: string;
42
+ inputSchema: ToolInputSchema;
43
+ handler: ToolHandler<TInput, TOutput>;
44
+ guards?: GuardConstructor[];
45
+ middlewares?: MiddlewareConstructor[];
46
+ interceptors?: InterceptorConstructor[];
47
+ pipes?: PipeConstructor[];
48
+ filters?: ExceptionFilterConstructor[];
49
+ examples?: ToolExamples;
50
+ widget?: {
51
+ route: string;
52
+ };
53
+ outputTemplate?: string;
54
+ isInitial?: boolean;
55
+ }
56
+ export declare class Tool<TInput = unknown, TOutput = unknown> {
57
+ name: string;
58
+ description: string;
59
+ inputSchema: ToolInputSchema;
60
+ examples?: ToolExamples;
61
+ widget?: {
62
+ route: string;
63
+ };
64
+ outputTemplate?: string;
65
+ isInitial?: boolean;
66
+ private handler;
67
+ private guards;
68
+ private middlewares;
69
+ private interceptors;
70
+ private pipes;
71
+ private filters;
72
+ private component?;
73
+ constructor(options: ToolOptions<TInput, TOutput>);
74
+ /**
75
+ * Execute the tool with full pipeline:
76
+ * Exception Filters -> Guards -> Middleware -> Interceptors -> Pipes -> Handler
77
+ */
78
+ execute(input: TInput, context: ExecutionContext): Promise<TOutput>;
79
+ /**
80
+ * Execute with interceptor chain
81
+ */
82
+ private executeWithInterceptors;
83
+ /**
84
+ * Execute pipes and then the handler
85
+ */
86
+ private executeWithPipes;
87
+ /**
88
+ * Attach a UI component to this tool
89
+ */
90
+ setComponent(component: Component): void;
91
+ /**
92
+ * Check if tool has a component
93
+ */
94
+ hasComponent(): boolean;
95
+ /**
96
+ * Get the attached component
97
+ */
98
+ getComponent(): Component | undefined;
99
+ /**
100
+ * Check if schema is a Zod schema
101
+ */
102
+ private isZodSchema;
103
+ /**
104
+ * Convert to MCP tool format
105
+ */
106
+ toMcpTool(): Promise<McpTool>;
107
+ }
108
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ import { DIContainer } from './di/container.js';
2
+ export class Tool {
3
+ name;
4
+ description;
5
+ inputSchema;
6
+ examples;
7
+ widget;
8
+ outputTemplate;
9
+ isInitial;
10
+ handler;
11
+ guards;
12
+ middlewares;
13
+ interceptors;
14
+ pipes;
15
+ filters;
16
+ component;
17
+ constructor(options) {
18
+ this.name = options.name;
19
+ this.description = options.description;
20
+ this.inputSchema = options.inputSchema;
21
+ this.handler = options.handler;
22
+ this.guards = options.guards || [];
23
+ this.middlewares = options.middlewares || [];
24
+ this.interceptors = options.interceptors || [];
25
+ this.pipes = options.pipes || [];
26
+ this.filters = options.filters || [];
27
+ this.examples = options.examples;
28
+ this.widget = options.widget;
29
+ this.outputTemplate = options.outputTemplate;
30
+ this.isInitial = options.isInitial;
31
+ }
32
+ /**
33
+ * Execute the tool with full pipeline:
34
+ * Exception Filters -> Guards -> Middleware -> Interceptors -> Pipes -> Handler
35
+ */
36
+ async execute(input, context) {
37
+ const container = DIContainer.getInstance();
38
+ try {
39
+ // 1. Execute Guards
40
+ for (const GuardClass of this.guards) {
41
+ const guard = container.has(GuardClass)
42
+ ? container.resolve(GuardClass)
43
+ : new GuardClass();
44
+ const canActivate = await guard.canActivate(context);
45
+ if (!canActivate) {
46
+ throw new Error('Access denied by guard');
47
+ }
48
+ }
49
+ // 2. Build Middleware Chain
50
+ const middlewareChain = async (chainInput) => {
51
+ let index = 0;
52
+ const middlewareInstances = this.middlewares.map(M => container.has(M) ? container.resolve(M) : new M());
53
+ const next = async () => {
54
+ if (index >= middlewareInstances.length) {
55
+ // 3. Build Interceptor Chain
56
+ return await this.executeWithInterceptors(chainInput, context);
57
+ }
58
+ const middleware = middlewareInstances[index++];
59
+ return await middleware.use(context, next);
60
+ };
61
+ return await next();
62
+ };
63
+ return await middlewareChain(input);
64
+ }
65
+ catch (error) {
66
+ // Execute Exception Filters
67
+ if (this.filters.length > 0) {
68
+ for (const FilterClass of this.filters) {
69
+ const filter = container.has(FilterClass)
70
+ ? container.resolve(FilterClass)
71
+ : new FilterClass();
72
+ return await filter.catch(error, context);
73
+ }
74
+ }
75
+ // Re-throw if no filters handled it
76
+ throw error;
77
+ }
78
+ }
79
+ /**
80
+ * Execute with interceptor chain
81
+ */
82
+ async executeWithInterceptors(input, context) {
83
+ const container = DIContainer.getInstance();
84
+ let index = 0;
85
+ const interceptorInstances = this.interceptors.map(I => container.has(I) ? container.resolve(I) : new I());
86
+ const next = async () => {
87
+ if (index >= interceptorInstances.length) {
88
+ // 4. Execute Pipes, then Handler
89
+ return await this.executeWithPipes(input, context);
90
+ }
91
+ const interceptor = interceptorInstances[index++];
92
+ return await interceptor.intercept(context, next);
93
+ };
94
+ return await next();
95
+ }
96
+ /**
97
+ * Execute pipes and then the handler
98
+ */
99
+ async executeWithPipes(input, context) {
100
+ const container = DIContainer.getInstance();
101
+ let transformedInput = input;
102
+ // Execute Pipes
103
+ for (const PipeClass of this.pipes) {
104
+ const pipe = container.has(PipeClass)
105
+ ? container.resolve(PipeClass)
106
+ : new PipeClass();
107
+ transformedInput = await pipe.transform(transformedInput, {
108
+ type: 'body',
109
+ metatype: undefined,
110
+ data: undefined,
111
+ });
112
+ }
113
+ // Finally, execute the actual handler
114
+ return await this.handler(transformedInput, context);
115
+ }
116
+ /**
117
+ * Attach a UI component to this tool
118
+ */
119
+ setComponent(component) {
120
+ this.component = component;
121
+ }
122
+ /**
123
+ * Check if tool has a component
124
+ */
125
+ hasComponent() {
126
+ return this.component !== undefined;
127
+ }
128
+ /**
129
+ * Get the attached component
130
+ */
131
+ getComponent() {
132
+ return this.component;
133
+ }
134
+ /**
135
+ * Check if schema is a Zod schema
136
+ */
137
+ isZodSchema(schema) {
138
+ return schema && typeof schema === 'object' && '_def' in schema;
139
+ }
140
+ /**
141
+ * Convert to MCP tool format
142
+ */
143
+ async toMcpTool() {
144
+ // Convert Zod schema to JSON Schema if needed
145
+ let jsonSchema = this.inputSchema;
146
+ // If it's a Zod schema, convert it
147
+ if (this.isZodSchema(this.inputSchema)) {
148
+ // It's a Zod schema, need to convert to JSON Schema
149
+ try {
150
+ // Dynamic import for ES modules
151
+ const zodToJsonSchemaModule = await import('zod-to-json-schema');
152
+ const zodToJsonSchema = zodToJsonSchemaModule.zodToJsonSchema || zodToJsonSchemaModule.default;
153
+ // Convert with $refStrategy: 'none' to inline all properties
154
+ const converted = zodToJsonSchema(this.inputSchema, {
155
+ $refStrategy: 'none', // Don't use $refs, inline everything
156
+ target: 'jsonSchema7',
157
+ });
158
+ jsonSchema = converted;
159
+ }
160
+ catch (error) {
161
+ // Error converting - use stderr to avoid corrupting MCP protocol
162
+ console.error('Error converting Zod schema:', error);
163
+ // Fallback: create a basic object schema
164
+ jsonSchema = {
165
+ type: 'object',
166
+ properties: {},
167
+ additionalProperties: true,
168
+ };
169
+ }
170
+ }
171
+ // Ensure type is set to "object" if not present
172
+ if (!jsonSchema.type) {
173
+ jsonSchema = {
174
+ ...jsonSchema,
175
+ type: 'object',
176
+ };
177
+ }
178
+ // Construct the final schema, ensuring type is "object"
179
+ const { type: schemaType, ...restSchema } = jsonSchema;
180
+ const finalSchema = {
181
+ ...restSchema,
182
+ type: 'object',
183
+ };
184
+ const mcpTool = {
185
+ name: this.name,
186
+ description: this.description,
187
+ inputSchema: finalSchema,
188
+ };
189
+ // Initialize _meta if needed
190
+ mcpTool._meta = mcpTool._meta || {};
191
+ // Initial tool flag
192
+ if (this.isInitial) {
193
+ mcpTool._meta['tool/initial'] = true;
194
+ }
195
+ // Include examples if available
196
+ if (this.examples) {
197
+ mcpTool.examples = this.examples;
198
+ // CRITICAL: Also store examples in _meta to ensure they're preserved
199
+ // through MCP serialization/deserialization. The studio checks _meta
200
+ // fields, and custom top-level fields may be stripped by the MCP SDK.
201
+ mcpTool._meta['tool/examples'] = this.examples;
202
+ }
203
+ // Include widget if available (for backward compatibility)
204
+ if (this.widget) {
205
+ mcpTool.widget = this.widget;
206
+ }
207
+ // Include outputTemplate if available (for backward compatibility)
208
+ if (this.outputTemplate) {
209
+ mcpTool.outputTemplate = this.outputTemplate;
210
+ }
211
+ // CRITICAL: Also store widget info in _meta to ensure it's preserved
212
+ // through MCP serialization/deserialization. The studio checks _meta
213
+ // fields, and custom top-level fields may be stripped by the MCP SDK.
214
+ // 1. Check if we have an attached component (preferred)
215
+ if (this.component) {
216
+ const resourceUri = this.component.getResourceUri();
217
+ mcpTool._meta['ui/template'] = resourceUri;
218
+ mcpTool._meta['openai/outputTemplate'] = resourceUri;
219
+ // Add other component metadata
220
+ const componentMeta = this.component.getResourceMetadata();
221
+ if (componentMeta) {
222
+ // Merge relevant metadata
223
+ const widgetDesc = componentMeta['openai/widgetDescription'];
224
+ if (widgetDesc !== undefined) {
225
+ mcpTool._meta['openai/widgetDescription'] = widgetDesc;
226
+ }
227
+ }
228
+ }
229
+ // 2. Fallback to legacy widget/outputTemplate options
230
+ else if (this.widget || this.outputTemplate) {
231
+ // Prioritize widget.route over outputTemplate
232
+ const widgetRoute = this.widget?.route || this.outputTemplate;
233
+ if (widgetRoute) {
234
+ mcpTool._meta['ui/template'] = widgetRoute;
235
+ mcpTool._meta['openai/outputTemplate'] = widgetRoute;
236
+ }
237
+ }
238
+ return mcpTool;
239
+ }
240
+ }
241
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/core/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import http from 'http';
2
+ interface Logger {
3
+ info(message: string, ...args: unknown[]): void;
4
+ warn(message: string, ...args: unknown[]): void;
5
+ error(message: string, ...args: unknown[]): void;
6
+ }
7
+ export declare class DiscoveryHttpServer {
8
+ private port;
9
+ private logger;
10
+ private server;
11
+ private handlers;
12
+ constructor(port: number, logger: Logger);
13
+ private handleRequest;
14
+ on(path: string, handler: http.RequestListener): void;
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=discovery-http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-http-server.d.ts","sourceRoot":"","sources":["../../../src/core/transports/discovery-http-server.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,UAAU,MAAM;IACd,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,IAAI;IAAU,OAAO,CAAC,MAAM;IAHhD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAgD;gBAE5C,IAAI,EAAE,MAAM,EAAU,MAAM,EAAE,MAAM;IAIxD,OAAO,CAAC,aAAa;IAYd,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe;IAK9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
@@ -0,0 +1,54 @@
1
+ import http from 'http';
2
+ export class DiscoveryHttpServer {
3
+ port;
4
+ logger;
5
+ server;
6
+ handlers = new Map();
7
+ constructor(port, logger) {
8
+ this.port = port;
9
+ this.logger = logger;
10
+ this.server = http.createServer(this.handleRequest.bind(this));
11
+ }
12
+ handleRequest(req, res) {
13
+ this.logger.info(`DiscoveryHttpServer: Received request for ${req.url}`);
14
+ const handler = this.handlers.get(req.url || '');
15
+ if (handler) {
16
+ handler(req, res);
17
+ }
18
+ else {
19
+ this.logger.warn(`DiscoveryHttpServer: No handler found for ${req.url}`);
20
+ res.writeHead(404);
21
+ res.end();
22
+ }
23
+ }
24
+ on(path, handler) {
25
+ this.logger.info(`DiscoveryHttpServer: Registering handler for ${path}`);
26
+ this.handlers.set(path, handler);
27
+ }
28
+ start() {
29
+ return new Promise((resolve, reject) => {
30
+ this.server.listen(this.port, () => {
31
+ this.logger.info(`🚀 OAuth discovery server running at http://localhost:${this.port}`);
32
+ resolve();
33
+ });
34
+ this.server.on('error', (err) => {
35
+ this.logger.error('OAuth discovery server error', err);
36
+ reject(err);
37
+ });
38
+ });
39
+ }
40
+ stop() {
41
+ return new Promise((resolve) => {
42
+ if (this.server.listening) {
43
+ this.server.close(() => {
44
+ this.logger.info('OAuth discovery server stopped');
45
+ resolve();
46
+ });
47
+ }
48
+ else {
49
+ resolve();
50
+ }
51
+ });
52
+ }
53
+ }
54
+ //# sourceMappingURL=discovery-http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-http-server.js","sourceRoot":"","sources":["../../../src/core/transports/discovery-http-server.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,OAAO,mBAAmB;IAIV;IAAsB;IAHlC,MAAM,CAAc;IACpB,QAAQ,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEhE,YAAoB,IAAY,EAAU,MAAc;QAApC,SAAI,GAAJ,IAAI,CAAQ;QAAU,WAAM,GAAN,MAAM,CAAQ;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,aAAa,CAAC,GAAyB,EAAE,GAAwB;QACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACzE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,EAAE,CAAC,IAAY,EAAE,OAA6B;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yDAAyD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;gBACvD,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBACnD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * HTTP Server Transport for MCP
3
+ *
4
+ * Implements HTTP transport with Server-Sent Events (SSE) for bidirectional communication.
5
+ * Required for OAuth 2.1 authentication as per MCP specification.
6
+ *
7
+ * This transport:
8
+ * - Exposes MCP over HTTP endpoints
9
+ * - Provides OAuth 2.1 metadata endpoints (RFC 9728)
10
+ * - Uses SSE for server-to-client messages
11
+ * - Uses POST for client-to-server messages
12
+ */
13
+ import { Express, Request, Response } from 'express';
14
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
15
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
16
+ export interface HttpServerTransportOptions {
17
+ /**
18
+ * Port to listen on (default: 3000)
19
+ */
20
+ port?: number;
21
+ /**
22
+ * Host to bind to (default: '0.0.0.0')
23
+ */
24
+ host?: string;
25
+ /**
26
+ * Base path for MCP endpoints (default: '/mcp')
27
+ */
28
+ basePath?: string;
29
+ /**
30
+ * OAuth configuration (if enabled)
31
+ */
32
+ oauth?: {
33
+ resourceUri: string;
34
+ authorizationServers: string[];
35
+ scopesSupported?: string[];
36
+ };
37
+ /**
38
+ * Custom Express app (optional - for integration with existing apps)
39
+ */
40
+ app?: Express;
41
+ }
42
+ /**
43
+ * HTTP Server Transport
44
+ *
45
+ * Implements MCP protocol over HTTP with SSE for real-time communication.
46
+ * Compatible with OAuth 2.1 authentication.
47
+ */
48
+ export declare class HttpServerTransport implements Transport {
49
+ private app;
50
+ private server;
51
+ private sseClients;
52
+ private messageHandler?;
53
+ private closeHandler?;
54
+ private errorHandler?;
55
+ private options;
56
+ constructor(options?: HttpServerTransportOptions);
57
+ /**
58
+ * Setup HTTP routes for MCP protocol
59
+ */
60
+ private setupRoutes;
61
+ /**
62
+ * Handle SSE connection for server-to-client messages
63
+ */
64
+ private handleSSE;
65
+ /**
66
+ * Handle incoming message from client
67
+ */
68
+ private handleMessage;
69
+ /**
70
+ * Handle OAuth Protected Resource Metadata request (RFC 9728)
71
+ */
72
+ private handleProtectedResourceMetadata;
73
+ /**
74
+ * Start the HTTP server
75
+ */
76
+ start(): Promise<void>;
77
+ /**
78
+ * Send message to client(s)
79
+ */
80
+ send(message: JSONRPCMessage): Promise<void>;
81
+ /**
82
+ * Close the transport
83
+ */
84
+ close(): Promise<void>;
85
+ /**
86
+ * Set message handler
87
+ */
88
+ set onmessage(handler: (message: JSONRPCMessage) => Promise<void>);
89
+ /**
90
+ * Set close handler
91
+ */
92
+ set onclose(handler: () => void);
93
+ /**
94
+ * Set error handler
95
+ */
96
+ set onerror(handler: (error: Error) => void);
97
+ /**
98
+ * Get the Express app (for adding custom routes)
99
+ */
100
+ getApp(): Express;
101
+ /**
102
+ * Register a custom route handler (compatible with DiscoveryHttpServer interface)
103
+ * @param path - The route path
104
+ * @param handler - The request handler (Node.js http.RequestListener format)
105
+ */
106
+ on(path: string, handler: (req: Request, res: Response) => void): void;
107
+ }
108
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../src/core/transports/http-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B,CAAC;IAEF;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IACnD,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,cAAc,CAAC,CAA6C;IACpE,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,OAAO,CAAgH;gBAEnH,OAAO,GAAE,0BAA+B;IAYpD;;OAEG;IACH,OAAO,CAAC,WAAW;IA8DnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAsBjB;;OAEG;YACW,aAAa;IAqB3B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAiBvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B;;OAEG;IACH,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,EAEhE;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,EAE9B;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAE1C;IAED;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACH,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;CAGvE"}