@jrmc/adonis-mcp 1.0.0-beta.4 → 1.0.0-beta.6

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 (77) hide show
  1. package/README.md +25 -5
  2. package/build/configure.d.ts.map +1 -1
  3. package/build/configure.js +5 -1
  4. package/build/providers/mcp_provider.d.ts.map +1 -1
  5. package/build/providers/mcp_provider.js +14 -5
  6. package/build/providers/vinejs_provider.d.ts +13 -0
  7. package/build/providers/vinejs_provider.d.ts.map +1 -0
  8. package/build/providers/vinejs_provider.js +10 -0
  9. package/build/src/request.d.ts +6 -2
  10. package/build/src/request.d.ts.map +1 -1
  11. package/build/src/request.js +6 -2
  12. package/build/src/response.d.ts +1 -1
  13. package/build/src/response.d.ts.map +1 -1
  14. package/build/src/response.js +1 -1
  15. package/build/src/server/annotations/is_destructive.d.ts +1 -1
  16. package/build/src/server/annotations/is_destructive.d.ts.map +1 -1
  17. package/build/src/server/annotations/is_idempotent.d.ts +1 -1
  18. package/build/src/server/annotations/is_idempotent.d.ts.map +1 -1
  19. package/build/src/server/annotations/is_open_world.d.ts +1 -1
  20. package/build/src/server/annotations/is_open_world.d.ts.map +1 -1
  21. package/build/src/server/annotations/is_read_only.d.ts +1 -1
  22. package/build/src/server/annotations/is_read_only.d.ts.map +1 -1
  23. package/build/src/server/contents/embedded_resource.js +1 -1
  24. package/build/src/server/contents/error.d.ts +5 -0
  25. package/build/src/server/contents/error.d.ts.map +1 -1
  26. package/build/src/server/contents/error.js +10 -1
  27. package/build/src/server/contents/resource_link.js +1 -1
  28. package/build/src/server/context.d.ts +1 -3
  29. package/build/src/server/context.d.ts.map +1 -1
  30. package/build/src/server/context.js +3 -21
  31. package/build/src/server/contracts/context.d.ts +2 -3
  32. package/build/src/server/contracts/context.d.ts.map +1 -1
  33. package/build/src/server/contracts/request.d.ts +12 -0
  34. package/build/src/server/contracts/request.d.ts.map +1 -0
  35. package/build/src/server/contracts/request.js +1 -0
  36. package/build/src/server/contracts/response.d.ts +1 -1
  37. package/build/src/server/contracts/response.d.ts.map +1 -1
  38. package/build/src/server/exceptions/jsonrpc_error.d.ts +7 -0
  39. package/build/src/server/exceptions/jsonrpc_error.d.ts.map +1 -0
  40. package/build/src/server/exceptions/jsonrpc_error.js +10 -0
  41. package/build/src/server/methods/call_tool.d.ts.map +1 -1
  42. package/build/src/server/methods/call_tool.js +13 -4
  43. package/build/src/server/methods/completion.js +5 -5
  44. package/build/src/server/methods/get_prompt.js +3 -3
  45. package/build/src/server/methods/list_prompts.d.ts.map +1 -1
  46. package/build/src/server/methods/list_prompts.js +1 -12
  47. package/build/src/server/methods/list_resource_templates.d.ts.map +1 -1
  48. package/build/src/server/methods/list_resource_templates.js +2 -13
  49. package/build/src/server/methods/list_resources.d.ts.map +1 -1
  50. package/build/src/server/methods/list_resources.js +2 -13
  51. package/build/src/server/methods/list_tools.d.ts.map +1 -1
  52. package/build/src/server/methods/list_tools.js +1 -12
  53. package/build/src/server/methods/read_resource.d.ts.map +1 -1
  54. package/build/src/server/methods/read_resource.js +11 -4
  55. package/build/src/server/pagination/cursor_paginator.d.ts +6 -4
  56. package/build/src/server/pagination/cursor_paginator.d.ts.map +1 -1
  57. package/build/src/server/pagination/cursor_paginator.js +4 -4
  58. package/build/src/server/prompt.d.ts +2 -1
  59. package/build/src/server/prompt.d.ts.map +1 -1
  60. package/build/src/server/requests/request_validator.d.ts +15 -0
  61. package/build/src/server/requests/request_validator.d.ts.map +1 -0
  62. package/build/src/server/requests/request_validator.js +25 -0
  63. package/build/src/server.d.ts +2 -0
  64. package/build/src/server.d.ts.map +1 -1
  65. package/build/src/server.js +5 -0
  66. package/build/src/types/context.d.ts +7 -6
  67. package/build/src/types/context.d.ts.map +1 -1
  68. package/build/src/types/method.d.ts +19 -11
  69. package/build/src/types/method.d.ts.map +1 -1
  70. package/build/src/types/request.d.ts +25 -2
  71. package/build/src/types/request.d.ts.map +1 -1
  72. package/build/src/types/response.d.ts +10 -3
  73. package/build/src/types/response.d.ts.map +1 -1
  74. package/build/src/utils/find_resource_pattern.js +1 -1
  75. package/build/stubs/make/mcp/prompts/main.ts.stub +2 -2
  76. package/build/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +6 -2
package/README.md CHANGED
@@ -26,15 +26,15 @@ AdonisJS MCP - Server MCP for your AdonisJS applications.
26
26
  - [x] Inspector
27
27
  - [x] Session
28
28
  - [x] Documentation
29
- - [ ] Output tool
30
- - [ ] Vine integration
29
+ - [x] Inject support
30
+ - [x] VineJs integration
31
+ - [ ] JSON Schema with VineJs
31
32
  - [ ] Bounce integration (WIP)
32
33
  - [ ] Auth helpers (WIP)
33
- - [ ] Inject support
34
34
  - [ ] Events
35
35
  - [ ] Logger
36
36
  - [ ] Alternative transports (SSE)
37
- - [ ] JSON Schema with Vine ???
37
+ - [ ] Output tool
38
38
  - [ ] Login flow
39
39
  - [ ] Starter kit
40
40
  - [ ] Demo applications
@@ -92,7 +92,6 @@ export default class MyToolTool extends Tool<Schema> {
92
92
  description = 'Tool description'
93
93
 
94
94
  async handle({ args, response }: ToolContext<Schema>) {
95
- console.log(args.text)
96
95
  return response.text('Hello, world!')
97
96
  }
98
97
 
@@ -152,6 +151,27 @@ schema() {
152
151
  }
153
152
  ```
154
153
 
154
+ You can also use VineJS(>= [v4](https://vinejs.dev/docs/json-schema-generation)) to define your schema:
155
+
156
+ ```typescript
157
+ import vine from '@vinejs/vine'
158
+
159
+ const vineSchema = vine.object({
160
+ page: vine.number().meta({
161
+ description: 'page number for pagination',
162
+ }),
163
+ perPage: vine.number().optional().meta({
164
+ description: 'per page limit for pagination',
165
+ })
166
+ })
167
+
168
+ schema() {
169
+ return vine.create(
170
+ vineSchema
171
+ ).toJSONSchema() as Schema
172
+ }
173
+ ```
174
+
155
175
  ### Handler Implementation
156
176
 
157
177
  The `handle` method contains your tool's logic. It receives a typed context with validated arguments:
@@ -1 +1 @@
1
- {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAG9D,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBAuBjD"}
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAG9D,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBA4BjD"}
@@ -18,11 +18,15 @@ export async function configure(command) {
18
18
  await codemods.registerMiddleware('router', [
19
19
  { path: '#middleware/mcp_middleware', position: 'after' },
20
20
  ]);
21
+ const useVine = await command.prompt.toggle('Is Vinejs used for validation?', ['Yes', 'No']);
21
22
  /**
22
23
  * Register provider
23
24
  */
24
25
  await codemods.updateRcFile((rcFile) => {
25
- rcFile.addProvider('@jrmc/adonis-mcp/mcp_provider');
26
26
  rcFile.addCommand('@jrmc/adonis-mcp/commands');
27
+ rcFile.addProvider('@jrmc/adonis-mcp/mcp_provider');
28
+ if (useVine) {
29
+ rcFile.addProvider('@jrmc/adonis-mcp/vinejs_provider');
30
+ }
27
31
  });
28
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp_provider.d.ts","sourceRoot":"","sources":["../../providers/mcp_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAKrD,OAAO,SAAS,MAAM,kBAAkB,CAAA;AAExC,MAAM,CAAC,OAAO,OAAO,WAAW;IAClB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IAQF,KAAK;IAeL,aAAa;IAIb,iBAAiB;IAIjB,eAAe;IAIf,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ;CAsC3D;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,MAAM;QACd,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;KACtC;CACF;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,iBAAiB;QACzB,UAAU,EAAE,SAAS,CAAA;KACtB;CACF"}
1
+ {"version":3,"file":"mcp_provider.d.ts","sourceRoot":"","sources":["../../providers/mcp_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMrD,OAAO,SAAS,MAAM,kBAAkB,CAAA;AAExC,MAAM,CAAC,OAAO,OAAO,WAAW;IAClB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IAQF,KAAK;IAeL,aAAa;IAIb,iBAAiB;IAIjB,eAAe;IAIf,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ;CA6C3D;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,MAAM;QACd,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,UAAU,CAAA;KACtC;CACF;AAED,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,iBAAiB;QACzB,UAAU,EAAE,SAAS,CAAA;KACtB;CACF"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { fsReadAll } from '@adonisjs/core/helpers';
8
8
  import string from '@adonisjs/core/helpers/string';
9
+ import { UriTemplate } from '../src/utils/uri_template.js';
9
10
  import McpServer from '../src/server.js';
10
11
  export default class McpProvider {
11
12
  app;
@@ -50,20 +51,28 @@ export default class McpProvider {
50
51
  const path = this.app.makePath(mcpPath, file);
51
52
  const { default: Method } = await import(path);
52
53
  const instance = new Method();
54
+ const entry = { path, json: instance.toJson() };
53
55
  switch (type) {
54
56
  case 'tool':
55
57
  server.addTool({
56
- [instance.name]: path,
58
+ [instance.name]: entry,
57
59
  });
58
60
  break;
59
61
  case 'resource':
60
- server.addResource({
61
- [instance.uri]: path,
62
- });
62
+ if (UriTemplate.isTemplate(instance.uri)) {
63
+ server.addResourceTemplate({
64
+ [instance.uri]: entry,
65
+ });
66
+ }
67
+ else {
68
+ server.addResource({
69
+ [instance.uri]: entry,
70
+ });
71
+ }
63
72
  break;
64
73
  case 'prompt':
65
74
  server.addPrompt({
66
- [instance.name]: path,
75
+ [instance.name]: entry,
67
76
  });
68
77
  break;
69
78
  }
@@ -0,0 +1,13 @@
1
+ import { RequestValidator } from '../src/server/requests/request_validator.js';
2
+ export default class VineJSServiceProvider {
3
+ boot(): void;
4
+ }
5
+ declare module '../src/types/request.js' {
6
+ interface McpResourceRequest extends RequestValidator {
7
+ }
8
+ interface McpToolRequest extends RequestValidator {
9
+ }
10
+ interface McpPromptRequest extends RequestValidator {
11
+ }
12
+ }
13
+ //# sourceMappingURL=vinejs_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vinejs_provider.d.ts","sourceRoot":"","sources":["../../providers/vinejs_provider.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAA;AAE9E,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,IAAI;CAQL;AAED,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,kBAAmB,SAAQ,gBAAgB;KAAG;IACxD,UAAU,cAAe,SAAQ,gBAAgB;KAAG;IACpD,UAAU,gBAAiB,SAAQ,gBAAgB;KAAG;CACvD"}
@@ -0,0 +1,10 @@
1
+ import McpRequest from '../src/request.js';
2
+ import { RequestValidator } from '../src/server/requests/request_validator.js';
3
+ export default class VineJSServiceProvider {
4
+ boot() {
5
+ ;
6
+ McpRequest.macro('validateUsing', function (validator, options) {
7
+ return new RequestValidator(this.ctx).validateUsing(validator, options);
8
+ });
9
+ }
10
+ }
@@ -5,7 +5,11 @@
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
7
  import type { JsonRpcRequest } from './types/jsonrpc.js';
8
- export default class Request implements JsonRpcRequest {
8
+ import type { Request } from './server/contracts/request.js';
9
+ import type { Context } from './server/contracts/context.js';
10
+ import Macroable from '@poppinss/macroable';
11
+ export default class McpRequest extends Macroable implements Request {
12
+ ctx: Context;
9
13
  jsonrpc: '2.0';
10
14
  id: string | number;
11
15
  method: string;
@@ -13,6 +17,6 @@ export default class Request implements JsonRpcRequest {
13
17
  cursor?: string;
14
18
  [key: string]: unknown;
15
19
  };
16
- constructor(request: JsonRpcRequest);
20
+ constructor(ctx: Context, request: JsonRpcRequest);
17
21
  }
18
22
  //# sourceMappingURL=request.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,cAAc;IACpD,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;gBAEW,OAAO,EAAE,cAAc;CAMpC"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAE5D,OAAO,SAAS,MAAM,qBAAqB,CAAA;AAE3C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAU,YAAW,OAAO;IAClE,GAAG,EAAE,OAAO,CAAA;IACZ,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;gBAEW,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc;CAQlD"}
@@ -1,9 +1,13 @@
1
- export default class Request {
1
+ import Macroable from '@poppinss/macroable';
2
+ export default class McpRequest extends Macroable {
3
+ ctx;
2
4
  jsonrpc;
3
5
  id;
4
6
  method;
5
7
  params;
6
- constructor(request) {
8
+ constructor(ctx, request) {
9
+ super();
10
+ this.ctx = ctx;
7
11
  this.jsonrpc = request.jsonrpc;
8
12
  this.id = request.id;
9
13
  this.method = request.method;
@@ -26,7 +26,7 @@ export default class<T extends McpRequestType = McpRequestType> implements Respo
26
26
  structured(object: Record<string, unknown>): Structured;
27
27
  resourceLink(uri: string): ResourceLink;
28
28
  embeddedResource(uri: string): EmbeddedResource;
29
- error(message: string): Error;
29
+ error(message?: string): Error;
30
30
  complete(completion: Completion): Completion;
31
31
  static toJsonRpc({ id, result, error }: Omit<JsonRpcResponse, 'jsonrpc'>): JsonRpcResponse;
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,IAAI,MAAM,2BAA2B,CAAA;AAC5C,OAAO,IAAI,MAAM,2BAA2B,CAAA;AAC5C,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAC9C,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAC9C,OAAO,UAAU,MAAM,iCAAiC,CAAA;AACxD,OAAO,YAAY,MAAM,oCAAoC,CAAA;AAC7D,OAAO,gBAAgB,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,YAAW,QAAQ;IACjF,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;gBAEJ,cAAc,EAAE,cAAc;IAc1C,IAAI,CAAC,IAAI,EAAE,MAAM;IAIjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAIjB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIpC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIpC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1C,YAAY,CAAC,GAAG,EAAE,MAAM;IAIxB,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAI5B,KAAK,CAAC,OAAO,EAAE,MAAM;IAIrB,QAAQ,CAAC,UAAU,EAAE,UAAU;IAI/B,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,eAAe;CAQ3F"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,IAAI,MAAM,2BAA2B,CAAA;AAC5C,OAAO,IAAI,MAAM,2BAA2B,CAAA;AAC5C,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAC9C,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAC9C,OAAO,UAAU,MAAM,iCAAiC,CAAA;AACxD,OAAO,YAAY,MAAM,oCAAoC,CAAA;AAC7D,OAAO,gBAAgB,MAAM,wCAAwC,CAAA;AACrE,OAAO,KAAK,MAAM,4BAA4B,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,YAAW,QAAQ;IACjF,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;gBAEJ,cAAc,EAAE,cAAc;IAc1C,IAAI,CAAC,IAAI,EAAE,MAAM;IAIjB,IAAI,CAAC,IAAI,EAAE,MAAM;IAIjB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIpC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIpC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1C,YAAY,CAAC,GAAG,EAAE,MAAM;IAIxB,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAI5B,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM;IAItB,QAAQ,CAAC,UAAU,EAAE,UAAU;IAI/B,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,eAAe;CAQ3F"}
@@ -21,7 +21,7 @@ export default class {
21
21
  else if (jsonRpcRequest.method === 'prompts/get') {
22
22
  this.type = 'prompts/get';
23
23
  }
24
- else if (jsonRpcRequest.method === 'prompts/get') {
24
+ else if (jsonRpcRequest.method === 'tools/call') {
25
25
  this.type = 'tools/call';
26
26
  }
27
27
  else if (jsonRpcRequest.method === 'completion/complete') {
@@ -5,7 +5,7 @@
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
7
  import type { ToolAnnotations } from '../../types/jsonrpc.js';
8
- export declare function isDestructive(destructive?: true | false): <T extends {
8
+ export declare function isDestructive(destructive?: boolean): <T extends {
9
9
  new (...args: any[]): {
10
10
  annotations?: ToolAnnotations;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"is_destructive.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_destructive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,aAAa,CAAC,WAAW,GAAE,IAAI,GAAG,KAAY,IAC3C,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
1
+ {"version":3,"file":"is_destructive.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_destructive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,aAAa,CAAC,WAAW,GAAE,OAAc,IACtC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
@@ -5,7 +5,7 @@
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
7
  import type { ToolAnnotations } from '../../types/jsonrpc.js';
8
- export declare function isIdempotent(idempotent?: true | false): <T extends {
8
+ export declare function isIdempotent(idempotent?: boolean): <T extends {
9
9
  new (...args: any[]): {
10
10
  annotations?: ToolAnnotations;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"is_idempotent.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_idempotent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,YAAY,CAAC,UAAU,GAAE,IAAI,GAAG,KAAY,IACzC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
1
+ {"version":3,"file":"is_idempotent.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_idempotent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,YAAY,CAAC,UAAU,GAAE,OAAc,IACpC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
@@ -5,7 +5,7 @@
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
7
  import type { ToolAnnotations } from '../../types/jsonrpc.js';
8
- export declare function isOpenWorld(openWorld?: true | false): <T extends {
8
+ export declare function isOpenWorld(openWorld?: boolean): <T extends {
9
9
  new (...args: any[]): {
10
10
  annotations?: ToolAnnotations;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"is_open_world.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_open_world.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,WAAW,CAAC,SAAS,GAAE,IAAI,GAAG,KAAY,IACvC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
1
+ {"version":3,"file":"is_open_world.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_open_world.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,WAAW,CAAC,SAAS,GAAE,OAAc,IAClC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
@@ -5,7 +5,7 @@
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
7
  import type { ToolAnnotations } from '../../types/jsonrpc.js';
8
- export declare function isReadOnly(readonly?: true | false): <T extends {
8
+ export declare function isReadOnly(readonly?: boolean): <T extends {
9
9
  new (...args: any[]): {
10
10
  annotations?: ToolAnnotations;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"is_read_only.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_read_only.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,UAAU,CAAC,QAAQ,GAAE,IAAI,GAAG,KAAY,IACrC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
1
+ {"version":3,"file":"is_read_only.d.ts","sourceRoot":"","sources":["../../../../src/server/annotations/is_read_only.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,wBAAgB,UAAU,CAAC,QAAQ,GAAE,OAAc,IAChC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,WAAW,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CAAE,EACpF,aAAa,CAAC;kBAGS,GAAG,EAAE;sBAJqC,eAAe;;MAmBnF"}
@@ -24,7 +24,7 @@ export default class EmbeddedResource {
24
24
  this.#resource = await findResource({
25
25
  app: this.app,
26
26
  uri: this.#uri,
27
- resourceList: ctx.resources,
27
+ resourceList: { ...ctx.resources, ...ctx.resourceTemplates },
28
28
  ctx,
29
29
  });
30
30
  return this;
@@ -6,9 +6,14 @@
6
6
  */
7
7
  import type { Content } from '../contracts/content.js';
8
8
  import type { Prompt } from '../prompt.js';
9
+ import type { Tool } from '../tool.js';
9
10
  import type { Resource } from '../resource.js';
11
+ import type { TextContent } from '../../types/jsonrpc.js';
10
12
  import Text from './text.js';
11
13
  export default class Error extends Text implements Content {
14
+ #private;
15
+ constructor(text?: string);
16
+ toTool(tool: Tool): Promise<TextContent>;
12
17
  toPrompt(_prompt: Prompt): never;
13
18
  toResource(_resource: Resource): never;
14
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../src/server/contents/error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,IAAK,YAAW,OAAO;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAIhC,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK;CAGvC"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../src/server/contents/error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,IAAK,YAAW,OAAO;;gBAG5C,IAAI,CAAC,EAAE,MAAM;IAKnB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IAK9C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAIhC,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK;CAGvC"}
@@ -7,10 +7,19 @@
7
7
  import Text from './text.js';
8
8
  import { createError } from '@adonisjs/core/exceptions';
9
9
  export default class Error extends Text {
10
+ #text;
11
+ constructor(text) {
12
+ super(text);
13
+ this.#text = text;
14
+ }
15
+ async toTool(tool) {
16
+ this.#text = this.#text || 'An error occurred';
17
+ return super.toTool(tool);
18
+ }
10
19
  toPrompt(_prompt) {
11
20
  throw createError('Error content may not be used in prompts.', 'E_ERROR_NOT_SUPPORTED');
12
21
  }
13
22
  toResource(_resource) {
14
- throw createError('Error content may not be used in resources.', 'E_ERROR_NOT_SUPPORTED');
23
+ throw createError(this.#text || 'Resource not found', 'E_ERROR_NOT_FOUND');
15
24
  }
16
25
  }
@@ -21,7 +21,7 @@ export default class ResourceLink {
21
21
  this.#resource = await findResource({
22
22
  app: this.app,
23
23
  uri: this.#uri,
24
- resourceList: ctx.resources,
24
+ resourceList: { ...ctx.resources, ...ctx.resourceTemplates },
25
25
  ctx,
26
26
  });
27
27
  return this;
@@ -10,7 +10,6 @@ import type { ServerContextOptions } from '../types/context.js';
10
10
  import type { ToolList, ResourceList, PromptList } from '../types/method.js';
11
11
  import type { McpRequest, McpRequestType } from '../types/request.js';
12
12
  export default class ServerContext implements Context {
13
- #private;
14
13
  readonly requestMethod: McpRequestType;
15
14
  supportedProtocolVersions: string[];
16
15
  serverCapabilities: Record<string, any>;
@@ -21,12 +20,11 @@ export default class ServerContext implements Context {
21
20
  defaultPaginationLength: number;
22
21
  tools: ToolList;
23
22
  resources: ResourceList;
23
+ resourceTemplates: ResourceList;
24
24
  prompts: PromptList;
25
25
  request: McpRequest<this['requestMethod']>;
26
26
  response: McpResponse<this['requestMethod']>;
27
27
  constructor(options: ServerContextOptions);
28
28
  getPerPage(requestedPerPage?: number): number;
29
- getResources(): Promise<ResourceList>;
30
- getResourceTemplates(): Promise<ResourceList>;
31
29
  }
32
30
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAMrE,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO;;IACnD,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAA;IAEtC,yBAAyB,EAAE,MAAM,EAAE,CAAA;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,UAAU,CAAA;IACnB,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAC1C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;gBAEhC,OAAO,EAAE,oBAAoB;IAoBzC,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM;IAIvC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAIrC,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC;CA2BpD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAKrE,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO;IACnD,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAA;IAEtC,yBAAyB,EAAE,MAAM,EAAE,CAAA;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,YAAY,CAAA;IACvB,iBAAiB,EAAE,YAAY,CAAA;IAC/B,OAAO,EAAE,UAAU,CAAA;IACnB,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAC1C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;gBAEhC,OAAO,EAAE,oBAAoB;IAuBzC,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM;CAG9C"}
@@ -6,7 +6,6 @@
6
6
  */
7
7
  import Request from '../request.js';
8
8
  import Response from '../response.js';
9
- import { UriTemplate } from '../utils/uri_template.js';
10
9
  export default class ServerContext {
11
10
  requestMethod;
12
11
  supportedProtocolVersions;
@@ -18,6 +17,7 @@ export default class ServerContext {
18
17
  defaultPaginationLength;
19
18
  tools;
20
19
  resources;
20
+ resourceTemplates;
21
21
  prompts;
22
22
  request;
23
23
  response;
@@ -32,30 +32,12 @@ export default class ServerContext {
32
32
  this.defaultPaginationLength = options.defaultPaginationLength;
33
33
  this.tools = options.tools;
34
34
  this.resources = options.resources;
35
+ this.resourceTemplates = options.resourceTemplates;
35
36
  this.prompts = options.prompts;
36
- this.request = new Request(options.jsonRpcRequest);
37
+ this.request = new Request(this, options.jsonRpcRequest);
37
38
  this.response = new Response(options.jsonRpcRequest);
38
39
  }
39
40
  getPerPage(requestedPerPage) {
40
41
  return Math.min(requestedPerPage ?? this.defaultPaginationLength, this.maxPaginationLength);
41
42
  }
42
- async getResources() {
43
- return this.#filterResources({ includeTemplates: false });
44
- }
45
- async getResourceTemplates() {
46
- return this.#filterResources({ includeTemplates: true });
47
- }
48
- async #filterResources({ includeTemplates, }) {
49
- const resourceEntries = Object.entries(this.resources);
50
- const filteredEntries = await Promise.all(resourceEntries.map(async ([key, resource]) => {
51
- const { default: Resource } = await import(resource);
52
- const resourceInstance = new Resource();
53
- const isTemplate = this.#isResourceTemplate(resourceInstance);
54
- return (includeTemplates ? isTemplate : !isTemplate) ? [key, resource] : null;
55
- }));
56
- return Object.fromEntries(filteredEntries.filter((entry) => entry !== null));
57
- }
58
- #isResourceTemplate(resource) {
59
- return UriTemplate.isTemplate(resource.uri);
60
- }
61
43
  }
@@ -8,6 +8,7 @@ import type { ToolList, ResourceList, PromptList } from '../../types/method.js';
8
8
  import type { McpRequest, McpRequestType } from '../../types/request.js';
9
9
  import type { McpResponse } from '../../types/response.js';
10
10
  export interface Context {
11
+ args?: Record<string, unknown>;
11
12
  requestMethod: McpRequestType;
12
13
  supportedProtocolVersions: string[];
13
14
  serverCapabilities: Record<string, any>;
@@ -18,12 +19,10 @@ export interface Context {
18
19
  defaultPaginationLength: number;
19
20
  tools: ToolList;
20
21
  resources: ResourceList;
21
- resourceTemplates?: string[];
22
+ resourceTemplates: ResourceList;
22
23
  prompts: PromptList;
23
24
  request: McpRequest<this['requestMethod']>;
24
25
  response: McpResponse<this['requestMethod']>;
25
26
  getPerPage(requestedPerPage?: number): number;
26
- getResources(): Promise<ResourceList>;
27
- getResourceTemplates(): Promise<ResourceList>;
28
27
  }
29
28
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/server/contracts/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,cAAc,CAAA;IAE7B,yBAAyB,EAAE,MAAM,EAAE,CAAA;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,YAAY,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,OAAO,EAAE,UAAU,CAAA;IACnB,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAC1C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAE5C,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7C,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IACrC,oBAAoB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;CAC9C"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/server/contracts/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE9B,aAAa,EAAE,cAAc,CAAA;IAE7B,yBAAyB,EAAE,MAAM,EAAE,CAAA;IACnC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,YAAY,CAAA;IACvB,iBAAiB,EAAE,YAAY,CAAA;IAC/B,OAAO,EAAE,UAAU,CAAA;IACnB,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAC1C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAE5C,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9C"}
@@ -0,0 +1,12 @@
1
+ import type { Context } from './context.js';
2
+ export interface Request {
3
+ ctx: Context;
4
+ jsonrpc: '2.0';
5
+ id: string | number;
6
+ method: string;
7
+ params?: {
8
+ cursor?: string;
9
+ [key: string]: unknown;
10
+ };
11
+ }
12
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../../src/server/contracts/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,OAAO,CAAA;IACZ,OAAO,EAAE,KAAK,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -19,7 +19,7 @@ export interface Response<T extends McpRequestType = McpRequestType> {
19
19
  structured(object: Record<string, unknown>): Structured;
20
20
  resourceLink(uri: string): ResourceLinkContent;
21
21
  embeddedResource(uri: string): EmbeddedResourceContent;
22
- error(message: string): Error;
22
+ error(message?: string): Error;
23
23
  complete(completion: Completion): Completion;
24
24
  }
25
25
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/server/contracts/response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,KAAK,EACL,YAAY,IAAI,mBAAmB,EACnC,gBAAgB,IAAI,uBAAuB,EAC5C,MAAM,wBAAwB,CAAA;AAE/B,KAAK,gBAAgB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,UAAU,GAAG,IAAI,CAAA;AAC7F,KAAK,iBAAiB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,WAAW,GAAG,KAAK,CAAA;AAChG,KAAK,iBAAiB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,WAAW,GAAG,KAAK,CAAA;AAEhG,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5F,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5F,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAA;IACvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC9C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAA;IACtD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAA;CAC7C"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/server/contracts/response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,KAAK,EACL,YAAY,IAAI,mBAAmB,EACnC,gBAAgB,IAAI,uBAAuB,EAC5C,MAAM,wBAAwB,CAAA;AAE/B,KAAK,gBAAgB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,UAAU,GAAG,IAAI,CAAA;AAC7F,KAAK,iBAAiB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,WAAW,GAAG,KAAK,CAAA;AAChG,KAAK,iBAAiB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,aAAa,GAAG,WAAW,GAAG,KAAK,CAAA;AAEhG,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IAChB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5F,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAC5F,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAA;IACvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC9C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAA;IACtD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAA;CAC7C"}
@@ -0,0 +1,7 @@
1
+ import Error from '../contents/error.js';
2
+ export default class JsonRpcError {
3
+ #private;
4
+ constructor(messages: Record<string, string>[]);
5
+ toJsonRpcResponse(): Error[];
6
+ }
7
+ //# sourceMappingURL=jsonrpc_error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc_error.d.ts","sourceRoot":"","sources":["../../../../src/server/exceptions/jsonrpc_error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,sBAAsB,CAAA;AAExC,MAAM,CAAC,OAAO,OAAO,YAAY;;gBAGnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAI9C,iBAAiB,IAAI,KAAK,EAAE;CAG7B"}
@@ -0,0 +1,10 @@
1
+ import Error from '../contents/error.js';
2
+ export default class JsonRpcError {
3
+ #messages;
4
+ constructor(messages) {
5
+ this.#messages = messages;
6
+ }
7
+ toJsonRpcResponse() {
8
+ return this.#messages.map((m) => new Error(m.message));
9
+ }
10
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"call_tool.d.ts","sourceRoot":"","sources":["../../../../src/server/methods/call_tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAA;AAa1E,MAAM,CAAC,OAAO,OAAO,QAAS,YAAW,MAAM;IACvC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,oDAAqB;CAoExD"}
1
+ {"version":3,"file":"call_tool.d.ts","sourceRoot":"","sources":["../../../../src/server/methods/call_tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAA;AAa1E,MAAM,CAAC,OAAO,OAAO,QAAS,YAAW,MAAM;IACvC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,oDAAqB;CA6ExD"}
@@ -18,13 +18,13 @@ export default class CallTool {
18
18
  if (!params?.name) {
19
19
  throw new JsonRpcException(`The tool name is required.`, ErrorCode.InvalidParams, ctx.request.id);
20
20
  }
21
- const pathToTool = ctx.tools[params.name];
22
- if (!pathToTool) {
21
+ const entry = ctx.tools[params.name];
22
+ if (!entry) {
23
23
  throw new JsonRpcException(`The tool ${params.name} was not found.`, ErrorCode.InvalidParams, ctx.request.id);
24
24
  }
25
25
  let Tool;
26
26
  try {
27
- const module = await import(pathToTool);
27
+ const module = await import(entry.path);
28
28
  Tool = module.default;
29
29
  }
30
30
  catch (error) {
@@ -33,7 +33,16 @@ export default class CallTool {
33
33
  ;
34
34
  ctx.args = params.arguments ?? {};
35
35
  const tool = await app.container.make(Tool);
36
- const contents = await app.container.call(tool, 'handle', [ctx]);
36
+ let contents;
37
+ try {
38
+ contents = await app.container.call(tool, 'handle', [ctx]);
39
+ }
40
+ catch (error) {
41
+ if (error instanceof JsonRpcException) {
42
+ throw error;
43
+ }
44
+ contents = error;
45
+ }
37
46
  let data;
38
47
  if (!Array.isArray(contents)) {
39
48
  data = [contents];
@@ -17,20 +17,20 @@ export default class Completion {
17
17
  const argument = params.argument;
18
18
  const context = params.context;
19
19
  const ref = params.ref;
20
- let path = null;
20
+ let entry = null;
21
21
  let key = null;
22
22
  if (ref && ref.type === 'ref/prompt') {
23
23
  key = ref.name;
24
- path = ctx.prompts[key];
24
+ entry = ctx.prompts[key];
25
25
  }
26
26
  else if (ref && ref.type === 'ref/resource') {
27
27
  key = ref.uri;
28
- path = ctx.resources[key];
28
+ entry = ctx.resources[key] ?? ctx.resourceTemplates[key];
29
29
  }
30
- if (!path) {
30
+ if (!entry) {
31
31
  throw new JsonRpcException(`${key} was not found.`, ErrorCode.InvalidParams, ctx.request.id);
32
32
  }
33
- const { default: Model } = await import(path);
33
+ const { default: Model } = await import(entry.path);
34
34
  const entity = await app.container.make(Model);
35
35
  let args = {};
36
36
  if (context?.arguments) {
@@ -18,11 +18,11 @@ export default class GetPrompt {
18
18
  if (!params?.name) {
19
19
  throw new JsonRpcException(`The prompt name is required.`, ErrorCode.InvalidParams, ctx.request.id);
20
20
  }
21
- const pathToPrompt = ctx.prompts[params.name];
22
- if (!pathToPrompt) {
21
+ const entry = ctx.prompts[params.name];
22
+ if (!entry) {
23
23
  throw new JsonRpcException(`The prompt ${params.name} was not found.`, ErrorCode.InvalidParams, ctx.request.id);
24
24
  }
25
- const { default: Prompt } = await import(pathToPrompt);
25
+ const { default: Prompt } = await import(entry.path);
26
26
  ctx.args = params.arguments ?? {};
27
27
  const prompt = await app.container.make(Prompt);
28
28
  const contents = await app.container.call(prompt, 'handle', [ctx]);
@@ -1 +1 @@
1
- {"version":3,"file":"list_prompts.d.ts","sourceRoot":"","sources":["../../../../src/server/methods/list_prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAOnD,MAAM,CAAC,OAAO,OAAO,WAAY,YAAW,MAAM;IAC1C,MAAM,CAAC,GAAG,EAAE,UAAU;CAoC7B"}
1
+ {"version":3,"file":"list_prompts.d.ts","sourceRoot":"","sources":["../../../../src/server/methods/list_prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAoB,MAAM,uBAAuB,CAAA;AAKrE,MAAM,CAAC,OAAO,OAAO,WAAY,YAAW,MAAM;IAC1C,MAAM,CAAC,GAAG,EAAE,UAAU;CAqB7B"}