@nonz250/notepm-mcp-server 0.2.0 → 0.4.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 (186) hide show
  1. package/README.md +1 -6
  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 +300 -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 +38 -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 +70 -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 +161 -0
  31. package/dist/notes/__tests__/schemas.test.js.map +1 -0
  32. package/dist/notes/client.d.ts +30 -0
  33. package/dist/notes/client.d.ts.map +1 -0
  34. package/dist/notes/client.js +47 -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 +64 -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 +42 -0
  45. package/dist/notes/schemas.d.ts.map +1 -0
  46. package/dist/notes/schemas.js +42 -0
  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 +26 -0
  51. package/dist/notes/tools.js.map +1 -0
  52. package/dist/notes/types.d.ts +61 -0
  53. package/dist/notes/types.d.ts.map +1 -0
  54. package/dist/notes/types.js +11 -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 +112 -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 +277 -0
  63. package/dist/pages/__tests__/schemas.test.js.map +1 -0
  64. package/dist/pages/client.d.ts +30 -0
  65. package/dist/pages/client.d.ts.map +1 -0
  66. package/dist/pages/client.js +55 -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 +61 -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/pages/schemas.d.ts +39 -0
  77. package/dist/pages/schemas.d.ts.map +1 -0
  78. package/dist/pages/schemas.js +40 -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 +26 -0
  83. package/dist/pages/tools.js.map +1 -0
  84. package/dist/pages/types.d.ts +64 -0
  85. package/dist/pages/types.d.ts.map +1 -0
  86. package/dist/pages/types.js +8 -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 +51 -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 +75 -0
  133. package/dist/tags/__tests__/schemas.test.js.map +1 -0
  134. package/dist/tags/client.d.ts +20 -0
  135. package/dist/tags/client.d.ts.map +1 -0
  136. package/dist/tags/client.js +31 -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 +31 -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 +17 -0
  147. package/dist/tags/schemas.d.ts.map +1 -0
  148. package/dist/tags/schemas.js +22 -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 +16 -0
  153. package/dist/tags/tools.js.map +1 -0
  154. package/dist/tags/types.d.ts +32 -0
  155. package/dist/tags/types.d.ts.map +1 -0
  156. package/dist/tags/types.js +6 -0
  157. package/dist/tags/types.js.map +1 -0
  158. package/package.json +1 -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 -223
  162. package/dist/notepm-client.d.ts.map +0 -1
  163. package/dist/notepm-client.js +0 -194
  164. package/dist/notepm-client.js.map +0 -1
  165. package/dist/tools/constants.d.ts +0 -31
  166. package/dist/tools/constants.d.ts.map +0 -1
  167. package/dist/tools/constants.js +0 -27
  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 -87
  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 -191
  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 +0 -114
  182. package/dist/tools/schemas.d.ts.map +0 -1
  183. package/dist/tools/schemas.js +0 -104
  184. package/dist/tools/schemas.js.map +0 -1
  185. /package/dist/{config.d.ts → shared/config.d.ts} +0 -0
  186. /package/dist/{config.js → shared/config.js} +0 -0
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  An unofficial [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for [NotePM](https://notepm.jp/) - a knowledge management and documentation platform.
22
22
 
23
- This server enables AI assistants like Claude to search, read, create, update, and delete pages in your NotePM workspace.
23
+ This server enables AI assistants like Claude to search, read, create, and update pages in your NotePM workspace.
24
24
 
25
25
  ## Requirements
26
26
 
@@ -119,17 +119,12 @@ If you installed globally, replace `npx` with the direct command:
119
119
  | `get_note` | Get a note's details including name, description, and scope |
120
120
  | `create_note` | Create a new note with name, description, and access settings |
121
121
  | `update_note` | Update an existing note's name, description, or access settings |
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 |
125
122
  | `search_pages` | Search pages by keyword, note, or tag |
126
123
  | `get_page` | Get a page's full content including title, body, and tags |
127
124
  | `create_page` | Create a new page in a specified note |
128
125
  | `update_page` | Update an existing page's content |
129
- | `delete_page` | Delete a page (irreversible) |
130
126
  | `list_tags` | List all tags in your workspace |
131
127
  | `create_tag` | Create a new tag |
132
- | `delete_tag` | Delete a tag (irreversible) |
133
128
 
134
129
  ## Environment Variables
135
130
 
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,300 @@
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
+ });
27
+ const createMockPageClient = () => ({
28
+ search: vi.fn(),
29
+ get: vi.fn(),
30
+ create: vi.fn(),
31
+ update: vi.fn(),
32
+ });
33
+ const createMockTagClient = () => ({
34
+ list: vi.fn(),
35
+ create: vi.fn(),
36
+ });
37
+ describe("handleToolCall", () => {
38
+ let mockNoteClient;
39
+ let mockPageClient;
40
+ let mockTagClient;
41
+ let clients;
42
+ beforeEach(() => {
43
+ mockNoteClient = createMockNoteClient();
44
+ mockPageClient = createMockPageClient();
45
+ mockTagClient = createMockTagClient();
46
+ clients = {
47
+ notes: mockNoteClient,
48
+ pages: mockPageClient,
49
+ tags: mockTagClient,
50
+ };
51
+ vi.clearAllMocks();
52
+ });
53
+ // ============================================================
54
+ // Error Handling Tests
55
+ // ============================================================
56
+ describe("error handling", () => {
57
+ it("should return error for unknown tool", async () => {
58
+ const result = await handleToolCall(clients, "unknown_tool", {});
59
+ expect(result.isError).toBe(true);
60
+ expect(getTextContent(result)).toBe("Unknown tool: unknown_tool");
61
+ });
62
+ it("should return input error for invalid arguments", async () => {
63
+ const result = await handleToolCall(clients, "get_page", {});
64
+ expect(result.isError).toBe(true);
65
+ expect(getTextContent(result)).toContain("Input error:");
66
+ });
67
+ it("should return error for NotePMAPIError", async () => {
68
+ mockPageClient.get.mockRejectedValue(new NotePMAPIError(404, "Not Found", "NotePM API Error: 404 Not Found"));
69
+ const result = await handleToolCall(clients, "get_page", {
70
+ page_code: "nonexistent",
71
+ });
72
+ expect(result.isError).toBe(true);
73
+ expect(getTextContent(result)).toContain("NotePM API Error");
74
+ });
75
+ it("should throw unexpected errors", async () => {
76
+ mockPageClient.get.mockRejectedValue(new Error("Unexpected error"));
77
+ await expect(handleToolCall(clients, "get_page", { page_code: "test" })).rejects.toThrow("Unexpected error");
78
+ });
79
+ });
80
+ // ============================================================
81
+ // Page Tools Tests
82
+ // ============================================================
83
+ describe("search_pages", () => {
84
+ it("should return 'No pages found.' for empty results", async () => {
85
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse([]));
86
+ const result = await handleToolCall(clients, "search_pages", {});
87
+ expect(result.isError).toBeUndefined();
88
+ expect(getTextContent(result)).toBe("No pages found.");
89
+ });
90
+ it("should format search results correctly", async () => {
91
+ const pages = [
92
+ createMockPage({ page_code: "p1", title: "First Page" }),
93
+ createMockPage({ page_code: "p2", title: "Second Page" }),
94
+ ];
95
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse(pages, 2));
96
+ const result = await handleToolCall(clients, "search_pages", { query: "test" });
97
+ expect(result.isError).toBeUndefined();
98
+ expect(getTextContent(result)).toContain("showing 2 of 2 pages");
99
+ expect(getTextContent(result)).toContain("**First Page**");
100
+ expect(getTextContent(result)).toContain("**Second Page**");
101
+ });
102
+ });
103
+ describe("get_page", () => {
104
+ it("should format page with all fields", async () => {
105
+ const page = createMockPage();
106
+ mockPageClient.get.mockResolvedValue(page);
107
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
108
+ expect(result.isError).toBeUndefined();
109
+ expect(getTextContent(result)).toContain("## Test Page");
110
+ expect(getTextContent(result)).toContain("Page code: page123");
111
+ expect(getTextContent(result)).toContain("Tags: tag1, tag2");
112
+ expect(getTextContent(result)).toContain("Test body content");
113
+ });
114
+ it("should handle page with no tags", async () => {
115
+ const page = createMockPage({ tags: [] });
116
+ mockPageClient.get.mockResolvedValue(page);
117
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
118
+ expect(result.isError).toBeUndefined();
119
+ expect(getTextContent(result)).toContain("Tags: None");
120
+ });
121
+ it("should handle page with no body", async () => {
122
+ const page = createMockPage({ body: "" });
123
+ mockPageClient.get.mockResolvedValue(page);
124
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
125
+ expect(result.isError).toBeUndefined();
126
+ expect(getTextContent(result)).toContain("(No body)");
127
+ });
128
+ });
129
+ describe("create_page", () => {
130
+ it("should return success message with page details", async () => {
131
+ const page = createMockPage({ page_code: "new123", title: "New Page" });
132
+ mockPageClient.create.mockResolvedValue(page);
133
+ const result = await handleToolCall(clients, "create_page", {
134
+ note_code: "note123",
135
+ title: "New Page",
136
+ });
137
+ expect(result.isError).toBeUndefined();
138
+ expect(getTextContent(result)).toContain("Page created.");
139
+ expect(getTextContent(result)).toContain("## New Page");
140
+ });
141
+ });
142
+ describe("update_page", () => {
143
+ it("should return success message with updated page details", async () => {
144
+ const page = createMockPage({ page_code: "page123", title: "Updated Page" });
145
+ mockPageClient.update.mockResolvedValue(page);
146
+ const result = await handleToolCall(clients, "update_page", {
147
+ page_code: "page123",
148
+ title: "Updated Page",
149
+ });
150
+ expect(result.isError).toBeUndefined();
151
+ expect(getTextContent(result)).toContain("Page updated.");
152
+ expect(getTextContent(result)).toContain("## Updated Page");
153
+ });
154
+ });
155
+ // ============================================================
156
+ // Note Tools Tests
157
+ // ============================================================
158
+ describe("list_notes", () => {
159
+ it("should return 'No notes found.' for empty results", async () => {
160
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse([]));
161
+ const result = await handleToolCall(clients, "list_notes", {});
162
+ expect(result.isError).toBeUndefined();
163
+ expect(getTextContent(result)).toBe("No notes found.");
164
+ });
165
+ it("should format notes list correctly", async () => {
166
+ const notes = [
167
+ createMockNote({ note_code: "n1", name: "First Note" }),
168
+ createMockNote({ note_code: "n2", name: "Second Note" }),
169
+ ];
170
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 2));
171
+ const result = await handleToolCall(clients, "list_notes", {});
172
+ expect(result.isError).toBeUndefined();
173
+ expect(getTextContent(result)).toContain("showing 2 of 2 notes");
174
+ expect(getTextContent(result)).toContain("**First Note**");
175
+ });
176
+ it("should show archived status in list", async () => {
177
+ const notes = [createMockNote({ note_code: "n1", name: "Archived Note", archived: true })];
178
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
179
+ const result = await handleToolCall(clients, "list_notes", {});
180
+ expect(result.isError).toBeUndefined();
181
+ expect(getTextContent(result)).toContain("[archived]");
182
+ });
183
+ it("should show private scope in list", async () => {
184
+ const notes = [createMockNote({ note_code: "n1", name: "Private Note", scope: "private" })];
185
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
186
+ const result = await handleToolCall(clients, "list_notes", {});
187
+ expect(result.isError).toBeUndefined();
188
+ expect(getTextContent(result)).toContain("(private)");
189
+ });
190
+ it("should show no description placeholder in list", async () => {
191
+ const notes = [createMockNote({ note_code: "n1", name: "No Desc Note", description: "" })];
192
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
193
+ const result = await handleToolCall(clients, "list_notes", {});
194
+ expect(result.isError).toBeUndefined();
195
+ expect(getTextContent(result)).toContain("(No description)");
196
+ });
197
+ });
198
+ describe("get_note", () => {
199
+ it("should format note with all fields", async () => {
200
+ const note = createMockNote();
201
+ mockNoteClient.get.mockResolvedValue(note);
202
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
203
+ expect(result.isError).toBeUndefined();
204
+ expect(getTextContent(result)).toContain("## Test Note");
205
+ expect(getTextContent(result)).toContain("Note code: note123");
206
+ expect(getTextContent(result)).toContain("Scope: All members");
207
+ expect(getTextContent(result)).toContain("Archived: No");
208
+ });
209
+ it("should handle scope as number 0 (open)", async () => {
210
+ const note = createMockNote({ scope: 0 });
211
+ mockNoteClient.get.mockResolvedValue(note);
212
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
213
+ expect(result.isError).toBeUndefined();
214
+ expect(getTextContent(result)).toContain("Scope: All members");
215
+ });
216
+ it("should handle private scope", async () => {
217
+ const note = createMockNote({ scope: "private" });
218
+ mockNoteClient.get.mockResolvedValue(note);
219
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
220
+ expect(result.isError).toBeUndefined();
221
+ expect(getTextContent(result)).toContain("Scope: Participating members only");
222
+ });
223
+ it("should handle archived note", async () => {
224
+ const note = createMockNote({ archived: true });
225
+ mockNoteClient.get.mockResolvedValue(note);
226
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
227
+ expect(result.isError).toBeUndefined();
228
+ expect(getTextContent(result)).toContain("Archived: Yes");
229
+ });
230
+ it("should handle note with no description", async () => {
231
+ const note = createMockNote({ description: "" });
232
+ mockNoteClient.get.mockResolvedValue(note);
233
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
234
+ expect(result.isError).toBeUndefined();
235
+ expect(getTextContent(result)).toContain("(No description)");
236
+ });
237
+ it("should handle note with missing dates", async () => {
238
+ const note = createMockNote({ created_at: undefined, updated_at: undefined });
239
+ mockNoteClient.get.mockResolvedValue(note);
240
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
241
+ expect(result.isError).toBeUndefined();
242
+ expect(getTextContent(result)).toContain("Created at: N/A");
243
+ expect(getTextContent(result)).toContain("Updated at: N/A");
244
+ });
245
+ });
246
+ describe("create_note", () => {
247
+ it("should return success message with note details", async () => {
248
+ const note = createMockNote({ note_code: "new123", name: "New Note" });
249
+ mockNoteClient.create.mockResolvedValue(note);
250
+ const result = await handleToolCall(clients, "create_note", {
251
+ name: "New Note",
252
+ scope: "open",
253
+ });
254
+ expect(result.isError).toBeUndefined();
255
+ expect(getTextContent(result)).toContain("Note created.");
256
+ expect(getTextContent(result)).toContain("## New Note");
257
+ });
258
+ });
259
+ describe("update_note", () => {
260
+ it("should return success message with updated note details", async () => {
261
+ const note = createMockNote({ note_code: "note123", name: "Updated Note" });
262
+ mockNoteClient.update.mockResolvedValue(note);
263
+ const result = await handleToolCall(clients, "update_note", {
264
+ note_code: "note123",
265
+ name: "Updated Note",
266
+ });
267
+ expect(result.isError).toBeUndefined();
268
+ expect(getTextContent(result)).toContain("Note updated.");
269
+ expect(getTextContent(result)).toContain("## Updated Note");
270
+ });
271
+ });
272
+ // ============================================================
273
+ // Tag Tools Tests
274
+ // ============================================================
275
+ describe("list_tags", () => {
276
+ it("should return 'No tags found.' for empty results", async () => {
277
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse([]));
278
+ const result = await handleToolCall(clients, "list_tags", {});
279
+ expect(result.isError).toBeUndefined();
280
+ expect(getTextContent(result)).toBe("No tags found.");
281
+ });
282
+ it("should format tag list correctly", async () => {
283
+ const tags = [{ name: "important" }, { name: "draft" }];
284
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse(tags, 2));
285
+ const result = await handleToolCall(clients, "list_tags", {});
286
+ expect(result.isError).toBeUndefined();
287
+ expect(getTextContent(result)).toContain("showing 2 of 2 tags");
288
+ expect(getTextContent(result)).toContain("1. important");
289
+ });
290
+ });
291
+ describe("create_tag", () => {
292
+ it("should return success message", async () => {
293
+ mockTagClient.create.mockResolvedValue(createMockTag({ name: "new-tag" }));
294
+ const result = await handleToolCall(clients, "create_tag", { name: "new-tag" });
295
+ expect(result.isError).toBeUndefined();
296
+ expect(getTextContent(result)).toBe("Tag created: new-tag");
297
+ });
298
+ });
299
+ });
300
+ //# 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":"AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAI9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;GAEG;AACH,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC;AAMH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,cAA8B,CAAC;IACnC,IAAI,cAA8B,CAAC;IACnC,IAAI,aAA4B,CAAC;IACjC,IAAI,OAAkE,CAAC;IAEvE,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,GAAG,oBAAoB,EAAE,CAAC;QACxC,cAAc,GAAG,oBAAoB,EAAE,CAAC;QACxC,aAAa,GAAG,mBAAmB,EAAE,CAAC;QACtC,OAAO,GAAG;YACR,KAAK,EAAE,cAAuC;YAC9C,KAAK,EAAE,cAAuC;YAC9C,IAAI,EAAE,aAAqC;SAC5C,CAAC;QACF,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,uBAAuB;IACvB,+DAA+D;IAE/D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAClC,IAAI,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,iCAAiC,CAAC,CACxE,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE;gBACvD,SAAS,EAAE,aAAa;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAEpE,MAAM,MAAM,CACV,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAC3D,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAE/D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBACxD,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;aAC1D,CAAC;YACF,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACxE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7E,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,cAAc;aACtB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAE/D,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACvD,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;aACzD,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,CAAsB,EAAE,CAAC,CAAC;YAC/D,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9E,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC5D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC5E,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACxD,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAEhF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,38 @@
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
+ // Note tools
15
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.LIST_NOTES);
16
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.GET_NOTE);
17
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.CREATE_NOTE);
18
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.UPDATE_NOTE);
19
+ // Tag tools
20
+ expect(toolNames).toContain(TAG_TOOL_NAMES.LIST_TAGS);
21
+ expect(toolNames).toContain(TAG_TOOL_NAMES.CREATE_TAG);
22
+ });
23
+ it("should have valid inputSchema for each tool", () => {
24
+ for (const tool of TOOLS) {
25
+ expect(tool.inputSchema).toBeDefined();
26
+ expect(tool.inputSchema.type).toBe("object");
27
+ expect(tool.inputSchema).toHaveProperty("properties");
28
+ }
29
+ });
30
+ it("should have description for each tool", () => {
31
+ for (const tool of TOOLS) {
32
+ expect(tool.description).toBeDefined();
33
+ expect(typeof tool.description).toBe("string");
34
+ expect(tool.description?.length).toBeGreaterThan(0);
35
+ }
36
+ });
37
+ });
38
+ //# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjD,aAAa;QACb,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEzD,aAAa;QACb,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEzD,YAAY;QACZ,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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"}
@@ -0,0 +1,8 @@
1
+ import { NOTE_TOOLS } from "../notes/tools.js";
2
+ import { PAGE_TOOLS } from "../pages/tools.js";
3
+ import { TAG_TOOLS } from "../tags/tools.js";
4
+ /**
5
+ * All available tools for the MCP server
6
+ */
7
+ export const TOOLS = [...PAGE_TOOLS, ...NOTE_TOOLS, ...TAG_TOOLS];
8
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAW,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../src/notes/__tests__/client.test.ts"],"names":[],"mappings":""}