@nonz250/notepm-mcp-server 0.1.0 → 0.3.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 (184) hide show
  1. package/README.md +10 -0
  2. package/dist/index.js +13 -6
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp/__tests__/handler.test.d.ts +2 -0
  5. package/dist/mcp/__tests__/handler.test.d.ts.map +1 -0
  6. package/dist/mcp/__tests__/handler.test.js +345 -0
  7. package/dist/mcp/__tests__/handler.test.js.map +1 -0
  8. package/dist/mcp/__tests__/tools.test.d.ts +2 -0
  9. package/dist/mcp/__tests__/tools.test.d.ts.map +1 -0
  10. package/dist/mcp/__tests__/tools.test.js +43 -0
  11. package/dist/mcp/__tests__/tools.test.js.map +1 -0
  12. package/dist/mcp/handler.d.ts +20 -0
  13. package/dist/mcp/handler.d.ts.map +1 -0
  14. package/dist/mcp/handler.js +31 -0
  15. package/dist/mcp/handler.js.map +1 -0
  16. package/dist/mcp/index.d.ts +6 -0
  17. package/dist/mcp/index.d.ts.map +1 -0
  18. package/dist/mcp/index.js +6 -0
  19. package/dist/mcp/index.js.map +1 -0
  20. package/dist/mcp/tools.d.ts +11 -0
  21. package/dist/mcp/tools.d.ts.map +1 -0
  22. package/dist/mcp/tools.js +8 -0
  23. package/dist/mcp/tools.js.map +1 -0
  24. package/dist/notes/__tests__/client.test.d.ts +2 -0
  25. package/dist/notes/__tests__/client.test.d.ts.map +1 -0
  26. package/dist/notes/__tests__/client.test.js +91 -0
  27. package/dist/notes/__tests__/client.test.js.map +1 -0
  28. package/dist/notes/__tests__/schemas.test.d.ts +2 -0
  29. package/dist/notes/__tests__/schemas.test.d.ts.map +1 -0
  30. package/dist/notes/__tests__/schemas.test.js +227 -0
  31. package/dist/notes/__tests__/schemas.test.js.map +1 -0
  32. package/dist/notes/client.d.ts +45 -0
  33. package/dist/notes/client.d.ts.map +1 -0
  34. package/dist/notes/client.js +68 -0
  35. package/dist/notes/client.js.map +1 -0
  36. package/dist/notes/handlers.d.ts +15 -0
  37. package/dist/notes/handlers.d.ts.map +1 -0
  38. package/dist/notes/handlers.js +79 -0
  39. package/dist/notes/handlers.js.map +1 -0
  40. package/dist/notes/index.d.ts +9 -0
  41. package/dist/notes/index.d.ts.map +1 -0
  42. package/dist/notes/index.js +9 -0
  43. package/dist/notes/index.js.map +1 -0
  44. package/dist/notes/schemas.d.ts +57 -0
  45. package/dist/notes/schemas.d.ts.map +1 -0
  46. package/dist/{tools → notes}/schemas.js +10 -37
  47. package/dist/notes/schemas.js.map +1 -0
  48. package/dist/notes/tools.d.ts +6 -0
  49. package/dist/notes/tools.d.ts.map +1 -0
  50. package/dist/notes/tools.js +41 -0
  51. package/dist/notes/tools.js.map +1 -0
  52. package/dist/notes/types.d.ts +64 -0
  53. package/dist/notes/types.d.ts.map +1 -0
  54. package/dist/notes/types.js +14 -0
  55. package/dist/notes/types.js.map +1 -0
  56. package/dist/pages/__tests__/client.test.d.ts +2 -0
  57. package/dist/pages/__tests__/client.test.d.ts.map +1 -0
  58. package/dist/pages/__tests__/client.test.js +119 -0
  59. package/dist/pages/__tests__/client.test.js.map +1 -0
  60. package/dist/pages/__tests__/schemas.test.d.ts +2 -0
  61. package/dist/pages/__tests__/schemas.test.d.ts.map +1 -0
  62. package/dist/pages/__tests__/schemas.test.js +299 -0
  63. package/dist/pages/__tests__/schemas.test.js.map +1 -0
  64. package/dist/pages/client.d.ts +35 -0
  65. package/dist/pages/client.d.ts.map +1 -0
  66. package/dist/pages/client.js +62 -0
  67. package/dist/pages/client.js.map +1 -0
  68. package/dist/pages/handlers.d.ts +15 -0
  69. package/dist/pages/handlers.d.ts.map +1 -0
  70. package/dist/pages/handlers.js +66 -0
  71. package/dist/pages/handlers.js.map +1 -0
  72. package/dist/pages/index.d.ts +9 -0
  73. package/dist/pages/index.d.ts.map +1 -0
  74. package/dist/pages/index.js +9 -0
  75. package/dist/pages/index.js.map +1 -0
  76. package/dist/{tools → pages}/schemas.d.ts +3 -41
  77. package/dist/pages/schemas.d.ts.map +1 -0
  78. package/dist/pages/schemas.js +43 -0
  79. package/dist/pages/schemas.js.map +1 -0
  80. package/dist/pages/tools.d.ts +6 -0
  81. package/dist/pages/tools.d.ts.map +1 -0
  82. package/dist/pages/tools.js +31 -0
  83. package/dist/pages/tools.js.map +1 -0
  84. package/dist/pages/types.d.ts +65 -0
  85. package/dist/pages/types.d.ts.map +1 -0
  86. package/dist/pages/types.js +9 -0
  87. package/dist/pages/types.js.map +1 -0
  88. package/dist/shared/__tests__/config.test.d.ts +2 -0
  89. package/dist/shared/__tests__/config.test.d.ts.map +1 -0
  90. package/dist/shared/__tests__/config.test.js +30 -0
  91. package/dist/shared/__tests__/config.test.js.map +1 -0
  92. package/dist/shared/__tests__/fixtures.d.ts +34 -0
  93. package/dist/shared/__tests__/fixtures.d.ts.map +1 -0
  94. package/dist/shared/__tests__/fixtures.js +79 -0
  95. package/dist/shared/__tests__/fixtures.js.map +1 -0
  96. package/dist/shared/__tests__/http-client.test.d.ts +2 -0
  97. package/dist/shared/__tests__/http-client.test.d.ts.map +1 -0
  98. package/dist/shared/__tests__/http-client.test.js +120 -0
  99. package/dist/shared/__tests__/http-client.test.js.map +1 -0
  100. package/dist/shared/config.d.ts.map +1 -0
  101. package/dist/shared/config.js.map +1 -0
  102. package/dist/shared/errors.d.ts +14 -0
  103. package/dist/shared/errors.d.ts.map +1 -0
  104. package/dist/shared/errors.js +22 -0
  105. package/dist/shared/errors.js.map +1 -0
  106. package/dist/shared/http-client.d.ts +14 -0
  107. package/dist/shared/http-client.d.ts.map +1 -0
  108. package/dist/shared/http-client.js +34 -0
  109. package/dist/shared/http-client.js.map +1 -0
  110. package/dist/shared/index.d.ts +10 -0
  111. package/dist/shared/index.d.ts.map +1 -0
  112. package/dist/shared/index.js +10 -0
  113. package/dist/shared/index.js.map +1 -0
  114. package/dist/shared/result.d.ts +18 -0
  115. package/dist/shared/result.d.ts.map +1 -0
  116. package/dist/shared/result.js +24 -0
  117. package/dist/shared/result.js.map +1 -0
  118. package/dist/shared/schema-utils.d.ts +10 -0
  119. package/dist/shared/schema-utils.d.ts.map +1 -0
  120. package/dist/shared/schema-utils.js +8 -0
  121. package/dist/shared/schema-utils.js.map +1 -0
  122. package/dist/shared/types.d.ts +22 -0
  123. package/dist/shared/types.d.ts.map +1 -0
  124. package/dist/shared/types.js +5 -0
  125. package/dist/shared/types.js.map +1 -0
  126. package/dist/tags/__tests__/client.test.d.ts +2 -0
  127. package/dist/tags/__tests__/client.test.d.ts.map +1 -0
  128. package/dist/tags/__tests__/client.test.js +59 -0
  129. package/dist/tags/__tests__/client.test.js.map +1 -0
  130. package/dist/tags/__tests__/schemas.test.d.ts +2 -0
  131. package/dist/tags/__tests__/schemas.test.d.ts.map +1 -0
  132. package/dist/tags/__tests__/schemas.test.js +105 -0
  133. package/dist/tags/__tests__/schemas.test.js.map +1 -0
  134. package/dist/tags/client.d.ts +25 -0
  135. package/dist/tags/client.d.ts.map +1 -0
  136. package/dist/tags/client.js +38 -0
  137. package/dist/tags/client.js.map +1 -0
  138. package/dist/tags/handlers.d.ts +15 -0
  139. package/dist/tags/handlers.d.ts.map +1 -0
  140. package/dist/tags/handlers.js +36 -0
  141. package/dist/tags/handlers.js.map +1 -0
  142. package/dist/tags/index.d.ts +9 -0
  143. package/dist/tags/index.d.ts.map +1 -0
  144. package/dist/tags/index.js +9 -0
  145. package/dist/tags/index.js.map +1 -0
  146. package/dist/tags/schemas.d.ts +22 -0
  147. package/dist/tags/schemas.d.ts.map +1 -0
  148. package/dist/tags/schemas.js +25 -0
  149. package/dist/tags/schemas.js.map +1 -0
  150. package/dist/tags/tools.d.ts +6 -0
  151. package/dist/tags/tools.d.ts.map +1 -0
  152. package/dist/tags/tools.js +21 -0
  153. package/dist/tags/tools.js.map +1 -0
  154. package/dist/tags/types.d.ts +37 -0
  155. package/dist/tags/types.d.ts.map +1 -0
  156. package/dist/tags/types.js +7 -0
  157. package/dist/tags/types.js.map +1 -0
  158. package/package.json +2 -1
  159. package/dist/config.d.ts.map +0 -1
  160. package/dist/config.js.map +0 -1
  161. package/dist/notepm-client.d.ts +0 -169
  162. package/dist/notepm-client.d.ts.map +0 -1
  163. package/dist/notepm-client.js +0 -141
  164. package/dist/notepm-client.js.map +0 -1
  165. package/dist/tools/constants.d.ts +0 -25
  166. package/dist/tools/constants.d.ts.map +0 -1
  167. package/dist/tools/constants.js +0 -21
  168. package/dist/tools/constants.js.map +0 -1
  169. package/dist/tools/definitions.d.ts +0 -6
  170. package/dist/tools/definitions.d.ts.map +0 -1
  171. package/dist/tools/definitions.js +0 -57
  172. package/dist/tools/definitions.js.map +0 -1
  173. package/dist/tools/handlers.d.ts +0 -10
  174. package/dist/tools/handlers.d.ts.map +0 -1
  175. package/dist/tools/handlers.js +0 -157
  176. package/dist/tools/handlers.js.map +0 -1
  177. package/dist/tools/index.d.ts +0 -8
  178. package/dist/tools/index.d.ts.map +0 -1
  179. package/dist/tools/index.js +0 -8
  180. package/dist/tools/index.js.map +0 -1
  181. package/dist/tools/schemas.d.ts.map +0 -1
  182. package/dist/tools/schemas.js.map +0 -1
  183. /package/dist/{config.d.ts → shared/config.d.ts} +0 -0
  184. /package/dist/{config.js → shared/config.js} +0 -0
package/README.md CHANGED
@@ -116,14 +116,20 @@ If you installed globally, replace `npx` with the direct command:
116
116
  | Tool | Description |
117
117
  |------|-------------|
118
118
  | `list_notes` | List all notes in your workspace |
119
+ | `get_note` | Get a note's details including name, description, and scope |
119
120
  | `create_note` | Create a new note with name, description, and access settings |
120
121
  | `update_note` | Update an existing note's name, description, or access settings |
121
122
  | `delete_note` | Delete a note and all its pages (irreversible) |
123
+ | `archive_note` | Archive a note (hidden from default list but can be restored) |
124
+ | `unarchive_note` | Restore an archived note back to the active list |
122
125
  | `search_pages` | Search pages by keyword, note, or tag |
123
126
  | `get_page` | Get a page's full content including title, body, and tags |
124
127
  | `create_page` | Create a new page in a specified note |
125
128
  | `update_page` | Update an existing page's content |
126
129
  | `delete_page` | Delete a page (irreversible) |
130
+ | `list_tags` | List all tags in your workspace |
131
+ | `create_tag` | Create a new tag |
132
+ | `delete_tag` | Delete a tag (irreversible) |
127
133
 
128
134
  ## Environment Variables
129
135
 
@@ -180,6 +186,10 @@ npm run lint
180
186
  npm run format
181
187
  ```
182
188
 
189
+ ## Contributing
190
+
191
+ Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
192
+
183
193
  ## License
184
194
 
185
195
  MIT
package/dist/index.js CHANGED
@@ -13,19 +13,26 @@ import { createRequire } from "node:module";
13
13
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
14
14
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
15
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
16
- import { loadConfig } from "./config.js";
17
- import { NotePMClient } from "./notepm-client.js";
18
- import { TOOLS, handleToolCall } from "./tools/index.js";
16
+ import { handleToolCall, TOOLS } from "./mcp/index.js";
17
+ import { NoteClient } from "./notes/index.js";
18
+ import { PageClient } from "./pages/index.js";
19
+ import { HttpClient, loadConfig } from "./shared/index.js";
20
+ import { TagClient } from "./tags/index.js";
19
21
  // ============================================================
20
22
  // Load package info
21
23
  // ============================================================
22
24
  const require = createRequire(import.meta.url);
23
25
  const packageJson = require("../package.json");
24
26
  // ============================================================
25
- // Load configuration and initialize client
27
+ // Load configuration and initialize clients
26
28
  // ============================================================
27
29
  const config = loadConfig();
28
- const client = new NotePMClient(config);
30
+ const httpClient = new HttpClient(config);
31
+ const clients = {
32
+ notes: new NoteClient(httpClient),
33
+ pages: new PageClient(httpClient),
34
+ tags: new TagClient(httpClient),
35
+ };
29
36
  // ============================================================
30
37
  // Create server instance
31
38
  // ============================================================
@@ -54,7 +61,7 @@ server.setRequestHandler(ListToolsRequestSchema, () => {
54
61
  */
55
62
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
56
63
  const { name, arguments: args } = request.params;
57
- return handleToolCall(client, name, args);
64
+ return handleToolCall(clients, name, args);
58
65
  });
59
66
  // ============================================================
60
67
  // Start server
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF,+DAA+D;AAC/D,2CAA2C;AAC3C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAExC,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,uDAAuD;AACvD,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF,+DAA+D;AAC/D,4CAA4C;AAC5C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC;IACjC,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC;IACjC,IAAI,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;CAChC,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,uDAAuD;AACvD,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/__tests__/handler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,345 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { NotePMAPIError } from "../../shared/errors.js";
3
+ import { createMockNote, createMockNotesResponse, createMockPage, createMockPagesResponse, createMockTag, createMockTagsResponse, } from "../../shared/__tests__/fixtures.js";
4
+ import { handleToolCall } from "../index.js";
5
+ // ============================================================
6
+ // Helper Functions
7
+ // ============================================================
8
+ /**
9
+ * Extract text content from CallToolResult
10
+ */
11
+ function getTextContent(result) {
12
+ const content = result.content[0];
13
+ if (content.type !== "text") {
14
+ throw new Error(`Expected text content, got ${content.type}`);
15
+ }
16
+ return content.text;
17
+ }
18
+ // ============================================================
19
+ // Mock Setup
20
+ // ============================================================
21
+ const createMockNoteClient = () => ({
22
+ list: vi.fn(),
23
+ get: vi.fn(),
24
+ create: vi.fn(),
25
+ update: vi.fn(),
26
+ delete: vi.fn(),
27
+ archive: vi.fn(),
28
+ unarchive: vi.fn(),
29
+ });
30
+ const createMockPageClient = () => ({
31
+ search: vi.fn(),
32
+ get: vi.fn(),
33
+ create: vi.fn(),
34
+ update: vi.fn(),
35
+ delete: vi.fn(),
36
+ });
37
+ const createMockTagClient = () => ({
38
+ list: vi.fn(),
39
+ create: vi.fn(),
40
+ delete: vi.fn(),
41
+ });
42
+ describe("handleToolCall", () => {
43
+ let mockNoteClient;
44
+ let mockPageClient;
45
+ let mockTagClient;
46
+ let clients;
47
+ beforeEach(() => {
48
+ mockNoteClient = createMockNoteClient();
49
+ mockPageClient = createMockPageClient();
50
+ mockTagClient = createMockTagClient();
51
+ clients = {
52
+ notes: mockNoteClient,
53
+ pages: mockPageClient,
54
+ tags: mockTagClient,
55
+ };
56
+ vi.clearAllMocks();
57
+ });
58
+ // ============================================================
59
+ // Error Handling Tests
60
+ // ============================================================
61
+ describe("error handling", () => {
62
+ it("should return error for unknown tool", async () => {
63
+ const result = await handleToolCall(clients, "unknown_tool", {});
64
+ expect(result.isError).toBe(true);
65
+ expect(getTextContent(result)).toBe("Unknown tool: unknown_tool");
66
+ });
67
+ it("should return input error for invalid arguments", async () => {
68
+ const result = await handleToolCall(clients, "get_page", {});
69
+ expect(result.isError).toBe(true);
70
+ expect(getTextContent(result)).toContain("Input error:");
71
+ });
72
+ it("should return error for NotePMAPIError", async () => {
73
+ mockPageClient.get.mockRejectedValue(new NotePMAPIError(404, "Not Found", "NotePM API Error: 404 Not Found"));
74
+ const result = await handleToolCall(clients, "get_page", {
75
+ page_code: "nonexistent",
76
+ });
77
+ expect(result.isError).toBe(true);
78
+ expect(getTextContent(result)).toContain("NotePM API Error");
79
+ });
80
+ it("should throw unexpected errors", async () => {
81
+ mockPageClient.get.mockRejectedValue(new Error("Unexpected error"));
82
+ await expect(handleToolCall(clients, "get_page", { page_code: "test" })).rejects.toThrow("Unexpected error");
83
+ });
84
+ });
85
+ // ============================================================
86
+ // Page Tools Tests
87
+ // ============================================================
88
+ describe("search_pages", () => {
89
+ it("should return 'No pages found.' for empty results", async () => {
90
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse([]));
91
+ const result = await handleToolCall(clients, "search_pages", {});
92
+ expect(result.isError).toBeUndefined();
93
+ expect(getTextContent(result)).toBe("No pages found.");
94
+ });
95
+ it("should format search results correctly", async () => {
96
+ const pages = [
97
+ createMockPage({ page_code: "p1", title: "First Page" }),
98
+ createMockPage({ page_code: "p2", title: "Second Page" }),
99
+ ];
100
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse(pages, 2));
101
+ const result = await handleToolCall(clients, "search_pages", { query: "test" });
102
+ expect(result.isError).toBeUndefined();
103
+ expect(getTextContent(result)).toContain("showing 2 of 2 pages");
104
+ expect(getTextContent(result)).toContain("**First Page**");
105
+ expect(getTextContent(result)).toContain("**Second Page**");
106
+ });
107
+ });
108
+ describe("get_page", () => {
109
+ it("should format page with all fields", async () => {
110
+ const page = createMockPage();
111
+ mockPageClient.get.mockResolvedValue(page);
112
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
113
+ expect(result.isError).toBeUndefined();
114
+ expect(getTextContent(result)).toContain("## Test Page");
115
+ expect(getTextContent(result)).toContain("Page code: page123");
116
+ expect(getTextContent(result)).toContain("Tags: tag1, tag2");
117
+ expect(getTextContent(result)).toContain("Test body content");
118
+ });
119
+ it("should handle page with no tags", async () => {
120
+ const page = createMockPage({ tags: [] });
121
+ mockPageClient.get.mockResolvedValue(page);
122
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
123
+ expect(result.isError).toBeUndefined();
124
+ expect(getTextContent(result)).toContain("Tags: None");
125
+ });
126
+ it("should handle page with no body", async () => {
127
+ const page = createMockPage({ body: "" });
128
+ mockPageClient.get.mockResolvedValue(page);
129
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
130
+ expect(result.isError).toBeUndefined();
131
+ expect(getTextContent(result)).toContain("(No body)");
132
+ });
133
+ });
134
+ describe("create_page", () => {
135
+ it("should return success message with page details", async () => {
136
+ const page = createMockPage({ page_code: "new123", title: "New Page" });
137
+ mockPageClient.create.mockResolvedValue(page);
138
+ const result = await handleToolCall(clients, "create_page", {
139
+ note_code: "note123",
140
+ title: "New Page",
141
+ });
142
+ expect(result.isError).toBeUndefined();
143
+ expect(getTextContent(result)).toContain("Page created.");
144
+ expect(getTextContent(result)).toContain("## New Page");
145
+ });
146
+ });
147
+ describe("update_page", () => {
148
+ it("should return success message with updated page details", async () => {
149
+ const page = createMockPage({ page_code: "page123", title: "Updated Page" });
150
+ mockPageClient.update.mockResolvedValue(page);
151
+ const result = await handleToolCall(clients, "update_page", {
152
+ page_code: "page123",
153
+ title: "Updated Page",
154
+ });
155
+ expect(result.isError).toBeUndefined();
156
+ expect(getTextContent(result)).toContain("Page updated.");
157
+ expect(getTextContent(result)).toContain("## Updated Page");
158
+ });
159
+ });
160
+ describe("delete_page", () => {
161
+ it("should return success message", async () => {
162
+ mockPageClient.delete.mockResolvedValue(undefined);
163
+ const result = await handleToolCall(clients, "delete_page", { page_code: "page123" });
164
+ expect(result.isError).toBeUndefined();
165
+ expect(getTextContent(result)).toBe("Page deleted: page123");
166
+ });
167
+ });
168
+ // ============================================================
169
+ // Note Tools Tests
170
+ // ============================================================
171
+ describe("list_notes", () => {
172
+ it("should return 'No notes found.' for empty results", async () => {
173
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse([]));
174
+ const result = await handleToolCall(clients, "list_notes", {});
175
+ expect(result.isError).toBeUndefined();
176
+ expect(getTextContent(result)).toBe("No notes found.");
177
+ });
178
+ it("should format notes list correctly", async () => {
179
+ const notes = [
180
+ createMockNote({ note_code: "n1", name: "First Note" }),
181
+ createMockNote({ note_code: "n2", name: "Second Note" }),
182
+ ];
183
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 2));
184
+ const result = await handleToolCall(clients, "list_notes", {});
185
+ expect(result.isError).toBeUndefined();
186
+ expect(getTextContent(result)).toContain("showing 2 of 2 notes");
187
+ expect(getTextContent(result)).toContain("**First Note**");
188
+ });
189
+ it("should show archived status in list", async () => {
190
+ const notes = [createMockNote({ note_code: "n1", name: "Archived Note", archived: true })];
191
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
192
+ const result = await handleToolCall(clients, "list_notes", {});
193
+ expect(result.isError).toBeUndefined();
194
+ expect(getTextContent(result)).toContain("[archived]");
195
+ });
196
+ it("should show private scope in list", async () => {
197
+ const notes = [createMockNote({ note_code: "n1", name: "Private Note", scope: "private" })];
198
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
199
+ const result = await handleToolCall(clients, "list_notes", {});
200
+ expect(result.isError).toBeUndefined();
201
+ expect(getTextContent(result)).toContain("(private)");
202
+ });
203
+ it("should show no description placeholder in list", async () => {
204
+ const notes = [createMockNote({ note_code: "n1", name: "No Desc Note", description: "" })];
205
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
206
+ const result = await handleToolCall(clients, "list_notes", {});
207
+ expect(result.isError).toBeUndefined();
208
+ expect(getTextContent(result)).toContain("(No description)");
209
+ });
210
+ });
211
+ describe("get_note", () => {
212
+ it("should format note with all fields", async () => {
213
+ const note = createMockNote();
214
+ mockNoteClient.get.mockResolvedValue(note);
215
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
216
+ expect(result.isError).toBeUndefined();
217
+ expect(getTextContent(result)).toContain("## Test Note");
218
+ expect(getTextContent(result)).toContain("Note code: note123");
219
+ expect(getTextContent(result)).toContain("Scope: All members");
220
+ expect(getTextContent(result)).toContain("Archived: No");
221
+ });
222
+ it("should handle scope as number 0 (open)", async () => {
223
+ const note = createMockNote({ scope: 0 });
224
+ mockNoteClient.get.mockResolvedValue(note);
225
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
226
+ expect(result.isError).toBeUndefined();
227
+ expect(getTextContent(result)).toContain("Scope: All members");
228
+ });
229
+ it("should handle private scope", async () => {
230
+ const note = createMockNote({ scope: "private" });
231
+ mockNoteClient.get.mockResolvedValue(note);
232
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
233
+ expect(result.isError).toBeUndefined();
234
+ expect(getTextContent(result)).toContain("Scope: Participating members only");
235
+ });
236
+ it("should handle archived note", async () => {
237
+ const note = createMockNote({ archived: true });
238
+ mockNoteClient.get.mockResolvedValue(note);
239
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
240
+ expect(result.isError).toBeUndefined();
241
+ expect(getTextContent(result)).toContain("Archived: Yes");
242
+ });
243
+ it("should handle note with no description", async () => {
244
+ const note = createMockNote({ description: "" });
245
+ mockNoteClient.get.mockResolvedValue(note);
246
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
247
+ expect(result.isError).toBeUndefined();
248
+ expect(getTextContent(result)).toContain("(No description)");
249
+ });
250
+ it("should handle note with missing dates", async () => {
251
+ const note = createMockNote({ created_at: undefined, updated_at: undefined });
252
+ mockNoteClient.get.mockResolvedValue(note);
253
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
254
+ expect(result.isError).toBeUndefined();
255
+ expect(getTextContent(result)).toContain("Created at: N/A");
256
+ expect(getTextContent(result)).toContain("Updated at: N/A");
257
+ });
258
+ });
259
+ describe("create_note", () => {
260
+ it("should return success message with note details", async () => {
261
+ const note = createMockNote({ note_code: "new123", name: "New Note" });
262
+ mockNoteClient.create.mockResolvedValue(note);
263
+ const result = await handleToolCall(clients, "create_note", {
264
+ name: "New Note",
265
+ scope: "open",
266
+ });
267
+ expect(result.isError).toBeUndefined();
268
+ expect(getTextContent(result)).toContain("Note created.");
269
+ expect(getTextContent(result)).toContain("## New Note");
270
+ });
271
+ });
272
+ describe("update_note", () => {
273
+ it("should return success message with updated note details", async () => {
274
+ const note = createMockNote({ note_code: "note123", name: "Updated Note" });
275
+ mockNoteClient.update.mockResolvedValue(note);
276
+ const result = await handleToolCall(clients, "update_note", {
277
+ note_code: "note123",
278
+ name: "Updated Note",
279
+ });
280
+ expect(result.isError).toBeUndefined();
281
+ expect(getTextContent(result)).toContain("Note updated.");
282
+ expect(getTextContent(result)).toContain("## Updated Note");
283
+ });
284
+ });
285
+ describe("delete_note", () => {
286
+ it("should return success message", async () => {
287
+ mockNoteClient.delete.mockResolvedValue(undefined);
288
+ const result = await handleToolCall(clients, "delete_note", { note_code: "note123" });
289
+ expect(result.isError).toBeUndefined();
290
+ expect(getTextContent(result)).toBe("Note deleted: note123");
291
+ });
292
+ });
293
+ describe("archive_note", () => {
294
+ it("should return success message", async () => {
295
+ mockNoteClient.archive.mockResolvedValue(undefined);
296
+ const result = await handleToolCall(clients, "archive_note", { note_code: "note123" });
297
+ expect(result.isError).toBeUndefined();
298
+ expect(getTextContent(result)).toBe("Note archived: note123");
299
+ });
300
+ });
301
+ describe("unarchive_note", () => {
302
+ it("should return success message", async () => {
303
+ mockNoteClient.unarchive.mockResolvedValue(undefined);
304
+ const result = await handleToolCall(clients, "unarchive_note", { note_code: "note123" });
305
+ expect(result.isError).toBeUndefined();
306
+ expect(getTextContent(result)).toBe("Note unarchived: note123");
307
+ });
308
+ });
309
+ // ============================================================
310
+ // Tag Tools Tests
311
+ // ============================================================
312
+ describe("list_tags", () => {
313
+ it("should return 'No tags found.' for empty results", async () => {
314
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse([]));
315
+ const result = await handleToolCall(clients, "list_tags", {});
316
+ expect(result.isError).toBeUndefined();
317
+ expect(getTextContent(result)).toBe("No tags found.");
318
+ });
319
+ it("should format tag list correctly", async () => {
320
+ const tags = [{ name: "important" }, { name: "draft" }];
321
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse(tags, 2));
322
+ const result = await handleToolCall(clients, "list_tags", {});
323
+ expect(result.isError).toBeUndefined();
324
+ expect(getTextContent(result)).toContain("showing 2 of 2 tags");
325
+ expect(getTextContent(result)).toContain("1. important");
326
+ });
327
+ });
328
+ describe("create_tag", () => {
329
+ it("should return success message", async () => {
330
+ mockTagClient.create.mockResolvedValue(createMockTag({ name: "new-tag" }));
331
+ const result = await handleToolCall(clients, "create_tag", { name: "new-tag" });
332
+ expect(result.isError).toBeUndefined();
333
+ expect(getTextContent(result)).toBe("Tag created: new-tag");
334
+ });
335
+ });
336
+ describe("delete_tag", () => {
337
+ it("should return success message", async () => {
338
+ mockTagClient.delete.mockResolvedValue(undefined);
339
+ const result = await handleToolCall(clients, "delete_tag", { name: "tag-to-delete" });
340
+ expect(result.isError).toBeUndefined();
341
+ expect(getTextContent(result)).toBe("Tag deleted: tag-to-delete");
342
+ });
343
+ });
344
+ });
345
+ //# sourceMappingURL=handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/handler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { NOTE_TOOL_NAMES } from "../../notes/types.js";
3
+ import { PAGE_TOOL_NAMES } from "../../pages/types.js";
4
+ import { TAG_TOOL_NAMES } from "../../tags/types.js";
5
+ import { TOOLS } from "../index.js";
6
+ describe("TOOLS", () => {
7
+ it("should have all expected tools defined", () => {
8
+ const toolNames = TOOLS.map((tool) => tool.name);
9
+ // Page tools
10
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.SEARCH_PAGES);
11
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.GET_PAGE);
12
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.CREATE_PAGE);
13
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.UPDATE_PAGE);
14
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.DELETE_PAGE);
15
+ // Note tools
16
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.LIST_NOTES);
17
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.GET_NOTE);
18
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.CREATE_NOTE);
19
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.UPDATE_NOTE);
20
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.DELETE_NOTE);
21
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.ARCHIVE_NOTE);
22
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.UNARCHIVE_NOTE);
23
+ // Tag tools
24
+ expect(toolNames).toContain(TAG_TOOL_NAMES.LIST_TAGS);
25
+ expect(toolNames).toContain(TAG_TOOL_NAMES.CREATE_TAG);
26
+ expect(toolNames).toContain(TAG_TOOL_NAMES.DELETE_TAG);
27
+ });
28
+ it("should have valid inputSchema for each tool", () => {
29
+ for (const tool of TOOLS) {
30
+ expect(tool.inputSchema).toBeDefined();
31
+ expect(tool.inputSchema.type).toBe("object");
32
+ expect(tool.inputSchema).toHaveProperty("properties");
33
+ }
34
+ });
35
+ it("should have description for each tool", () => {
36
+ for (const tool of TOOLS) {
37
+ expect(tool.description).toBeDefined();
38
+ expect(typeof tool.description).toBe("string");
39
+ expect(tool.description?.length).toBeGreaterThan(0);
40
+ }
41
+ });
42
+ });
43
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MCP Handler Router
3
+ *
4
+ * Routes tool calls to the appropriate domain handler.
5
+ */
6
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
7
+ import { NoteClient } from "../notes/index.js";
8
+ import { PageClient } from "../pages/index.js";
9
+ import { TagClient } from "../tags/index.js";
10
+ interface Clients {
11
+ notes: NoteClient;
12
+ pages: PageClient;
13
+ tags: TagClient;
14
+ }
15
+ /**
16
+ * Handle tool call by routing to appropriate domain handler
17
+ */
18
+ export declare function handleToolCall(clients: Clients, name: string, args: unknown): Promise<CallToolResult>;
19
+ export {};
20
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAsC,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAsC,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEnF,OAAO,EAAoC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE/E,UAAU,OAAO;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,CAwBzB"}
@@ -0,0 +1,31 @@
1
+ import { handleNoteToolCall, isNoteToolName } from "../notes/index.js";
2
+ import { handlePageToolCall, isPageToolName } from "../pages/index.js";
3
+ import { error, InputError, NotePMAPIError } from "../shared/index.js";
4
+ import { handleTagToolCall, isTagToolName } from "../tags/index.js";
5
+ /**
6
+ * Handle tool call by routing to appropriate domain handler
7
+ */
8
+ export async function handleToolCall(clients, name, args) {
9
+ try {
10
+ if (isNoteToolName(name)) {
11
+ return await handleNoteToolCall(clients.notes, name, args);
12
+ }
13
+ if (isPageToolName(name)) {
14
+ return await handlePageToolCall(clients.pages, name, args);
15
+ }
16
+ if (isTagToolName(name)) {
17
+ return await handleTagToolCall(clients.tags, name, args);
18
+ }
19
+ return error(`Unknown tool: ${name}`);
20
+ }
21
+ catch (err) {
22
+ if (err instanceof InputError) {
23
+ return error(`Input error: ${err.message}`);
24
+ }
25
+ if (err instanceof NotePMAPIError) {
26
+ return error(err.message);
27
+ }
28
+ throw err;
29
+ }
30
+ }
31
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAa,MAAM,kBAAkB,CAAC;AAQ/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,IAAY,EACZ,IAAa;IAEb,IAAI,CAAC;QACH,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP layer exports
3
+ */
4
+ export * from "./tools.js";
5
+ export * from "./handler.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP layer exports
3
+ */
4
+ export * from "./tools.js";
5
+ export * from "./handler.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP Tools Aggregator
3
+ *
4
+ * Aggregates all domain tools into a single list for the MCP server.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ /**
8
+ * All available tools for the MCP server
9
+ */
10
+ export declare const TOOLS: Tool[];
11
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAM/D;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,IAAI,EAAiD,CAAC"}