funifier-mcp 0.1.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 (174) hide show
  1. package/README.md +351 -0
  2. package/dist/core/api-client.d.ts +131 -0
  3. package/dist/core/api-client.d.ts.map +1 -0
  4. package/dist/core/api-client.js +796 -0
  5. package/dist/core/api-client.js.map +1 -0
  6. package/dist/core/config.d.ts +11 -0
  7. package/dist/core/config.d.ts.map +1 -0
  8. package/dist/core/config.js +37 -0
  9. package/dist/core/config.js.map +1 -0
  10. package/dist/core/constants.d.ts +51 -0
  11. package/dist/core/constants.d.ts.map +1 -0
  12. package/dist/core/constants.js +57 -0
  13. package/dist/core/constants.js.map +1 -0
  14. package/dist/core/index.d.ts +7 -0
  15. package/dist/core/index.d.ts.map +1 -0
  16. package/dist/core/index.js +26 -0
  17. package/dist/core/index.js.map +1 -0
  18. package/dist/core/types/Action.d.ts +13 -0
  19. package/dist/core/types/Action.d.ts.map +1 -0
  20. package/dist/core/types/Action.js +3 -0
  21. package/dist/core/types/Action.js.map +1 -0
  22. package/dist/core/types/Aggregate.d.ts +11 -0
  23. package/dist/core/types/Aggregate.d.ts.map +1 -0
  24. package/dist/core/types/Aggregate.js +3 -0
  25. package/dist/core/types/Aggregate.js.map +1 -0
  26. package/dist/core/types/AiKnowledge.d.ts +10 -0
  27. package/dist/core/types/AiKnowledge.d.ts.map +1 -0
  28. package/dist/core/types/AiKnowledge.js +3 -0
  29. package/dist/core/types/AiKnowledge.js.map +1 -0
  30. package/dist/core/types/AuthModule.d.ts +12 -0
  31. package/dist/core/types/AuthModule.d.ts.map +1 -0
  32. package/dist/core/types/AuthModule.js +3 -0
  33. package/dist/core/types/AuthModule.js.map +1 -0
  34. package/dist/core/types/Challenge.d.ts +26 -0
  35. package/dist/core/types/Challenge.d.ts.map +1 -0
  36. package/dist/core/types/Challenge.js +3 -0
  37. package/dist/core/types/Challenge.js.map +1 -0
  38. package/dist/core/types/ChallengeAggregate.d.ts +13 -0
  39. package/dist/core/types/ChallengeAggregate.d.ts.map +1 -0
  40. package/dist/core/types/ChallengeAggregate.js +3 -0
  41. package/dist/core/types/ChallengeAggregate.js.map +1 -0
  42. package/dist/core/types/CustomPage.d.ts +15 -0
  43. package/dist/core/types/CustomPage.d.ts.map +1 -0
  44. package/dist/core/types/CustomPage.js +3 -0
  45. package/dist/core/types/CustomPage.js.map +1 -0
  46. package/dist/core/types/Leaderboard.d.ts +33 -0
  47. package/dist/core/types/Leaderboard.d.ts.map +1 -0
  48. package/dist/core/types/Leaderboard.js +3 -0
  49. package/dist/core/types/Leaderboard.js.map +1 -0
  50. package/dist/core/types/Level.d.ts +17 -0
  51. package/dist/core/types/Level.d.ts.map +1 -0
  52. package/dist/core/types/Level.js +3 -0
  53. package/dist/core/types/Level.js.map +1 -0
  54. package/dist/core/types/Point.d.ts +8 -0
  55. package/dist/core/types/Point.d.ts.map +1 -0
  56. package/dist/core/types/Point.js +3 -0
  57. package/dist/core/types/Point.js.map +1 -0
  58. package/dist/core/types/PublicEndpoint.d.ts +14 -0
  59. package/dist/core/types/PublicEndpoint.d.ts.map +1 -0
  60. package/dist/core/types/PublicEndpoint.js +3 -0
  61. package/dist/core/types/PublicEndpoint.js.map +1 -0
  62. package/dist/core/types/Quiz.d.ts +33 -0
  63. package/dist/core/types/Quiz.d.ts.map +1 -0
  64. package/dist/core/types/Quiz.js +3 -0
  65. package/dist/core/types/Quiz.js.map +1 -0
  66. package/dist/core/types/Scheduler.d.ts +15 -0
  67. package/dist/core/types/Scheduler.d.ts.map +1 -0
  68. package/dist/core/types/Scheduler.js +3 -0
  69. package/dist/core/types/Scheduler.js.map +1 -0
  70. package/dist/core/types/Trigger.d.ts +14 -0
  71. package/dist/core/types/Trigger.d.ts.map +1 -0
  72. package/dist/core/types/Trigger.js +3 -0
  73. package/dist/core/types/Trigger.js.map +1 -0
  74. package/dist/core/types/VirtualGood.d.ts +21 -0
  75. package/dist/core/types/VirtualGood.d.ts.map +1 -0
  76. package/dist/core/types/VirtualGood.js +3 -0
  77. package/dist/core/types/VirtualGood.js.map +1 -0
  78. package/dist/core/types/Websocket.d.ts +10 -0
  79. package/dist/core/types/Websocket.d.ts.map +1 -0
  80. package/dist/core/types/Websocket.js +3 -0
  81. package/dist/core/types/Websocket.js.map +1 -0
  82. package/dist/core/types/Widget.d.ts +15 -0
  83. package/dist/core/types/Widget.d.ts.map +1 -0
  84. package/dist/core/types/Widget.js +3 -0
  85. package/dist/core/types/Widget.js.map +1 -0
  86. package/dist/core/types/index.d.ts +18 -0
  87. package/dist/core/types/index.d.ts.map +1 -0
  88. package/dist/core/types/index.js +34 -0
  89. package/dist/core/types/index.js.map +1 -0
  90. package/dist/index.d.ts +7 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +27 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/mcp/api-holder.d.ts +40 -0
  95. package/dist/mcp/api-holder.d.ts.map +1 -0
  96. package/dist/mcp/api-holder.js +72 -0
  97. package/dist/mcp/api-holder.js.map +1 -0
  98. package/dist/mcp/bundle.js +99 -0
  99. package/dist/mcp/index.d.ts +3 -0
  100. package/dist/mcp/index.d.ts.map +1 -0
  101. package/dist/mcp/index.js +36 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/dist/mcp/prompts/templates.d.ts +3 -0
  104. package/dist/mcp/prompts/templates.d.ts.map +1 -0
  105. package/dist/mcp/prompts/templates.js +83 -0
  106. package/dist/mcp/prompts/templates.js.map +1 -0
  107. package/dist/mcp/resources/documentation.d.ts +3 -0
  108. package/dist/mcp/resources/documentation.d.ts.map +1 -0
  109. package/dist/mcp/resources/documentation.js +79 -0
  110. package/dist/mcp/resources/documentation.js.map +1 -0
  111. package/dist/mcp/tools/_fetch-current.d.ts +3 -0
  112. package/dist/mcp/tools/_fetch-current.d.ts.map +1 -0
  113. package/dist/mcp/tools/_fetch-current.js +67 -0
  114. package/dist/mcp/tools/_fetch-current.js.map +1 -0
  115. package/dist/mcp/tools/_merge.d.ts +2 -0
  116. package/dist/mcp/tools/_merge.d.ts.map +1 -0
  117. package/dist/mcp/tools/_merge.js +7 -0
  118. package/dist/mcp/tools/_merge.js.map +1 -0
  119. package/dist/mcp/tools/connect.d.ts +4 -0
  120. package/dist/mcp/tools/connect.d.ts.map +1 -0
  121. package/dist/mcp/tools/connect.js +44 -0
  122. package/dist/mcp/tools/connect.js.map +1 -0
  123. package/dist/mcp/tools/database.d.ts +4 -0
  124. package/dist/mcp/tools/database.d.ts.map +1 -0
  125. package/dist/mcp/tools/database.js +189 -0
  126. package/dist/mcp/tools/database.js.map +1 -0
  127. package/dist/mcp/tools/delete.d.ts +4 -0
  128. package/dist/mcp/tools/delete.d.ts.map +1 -0
  129. package/dist/mcp/tools/delete.js +97 -0
  130. package/dist/mcp/tools/delete.js.map +1 -0
  131. package/dist/mcp/tools/execute.d.ts +4 -0
  132. package/dist/mcp/tools/execute.d.ts.map +1 -0
  133. package/dist/mcp/tools/execute.js +84 -0
  134. package/dist/mcp/tools/execute.js.map +1 -0
  135. package/dist/mcp/tools/get.d.ts +4 -0
  136. package/dist/mcp/tools/get.d.ts.map +1 -0
  137. package/dist/mcp/tools/get.js +123 -0
  138. package/dist/mcp/tools/get.js.map +1 -0
  139. package/dist/mcp/tools/index.d.ts +4 -0
  140. package/dist/mcp/tools/index.d.ts.map +1 -0
  141. package/dist/mcp/tools/index.js +22 -0
  142. package/dist/mcp/tools/index.js.map +1 -0
  143. package/dist/mcp/tools/list.d.ts +4 -0
  144. package/dist/mcp/tools/list.d.ts.map +1 -0
  145. package/dist/mcp/tools/list.js +261 -0
  146. package/dist/mcp/tools/list.js.map +1 -0
  147. package/dist/mcp/tools/logs.d.ts +4 -0
  148. package/dist/mcp/tools/logs.d.ts.map +1 -0
  149. package/dist/mcp/tools/logs.js +50 -0
  150. package/dist/mcp/tools/logs.js.map +1 -0
  151. package/dist/mcp/tools/save.d.ts +4 -0
  152. package/dist/mcp/tools/save.d.ts.map +1 -0
  153. package/dist/mcp/tools/save.js +106 -0
  154. package/dist/mcp/tools/save.js.map +1 -0
  155. package/dist/mcp/tools/save.test.d.ts +2 -0
  156. package/dist/mcp/tools/save.test.d.ts.map +1 -0
  157. package/dist/mcp/tools/save.test.js +198 -0
  158. package/dist/mcp/tools/save.test.js.map +1 -0
  159. package/package.json +65 -0
  160. package/skills/funifier-create-action/SKILL.md +86 -0
  161. package/skills/funifier-create-aggregate/SKILL.md +87 -0
  162. package/skills/funifier-create-challenge/SKILL.md +87 -0
  163. package/skills/funifier-create-custom-page/SKILL.md +87 -0
  164. package/skills/funifier-create-leaderboard/SKILL.md +87 -0
  165. package/skills/funifier-create-level/SKILL.md +86 -0
  166. package/skills/funifier-create-point/SKILL.md +86 -0
  167. package/skills/funifier-create-quiz/SKILL.md +86 -0
  168. package/skills/funifier-create-scheduler/SKILL.md +87 -0
  169. package/skills/funifier-create-trigger/SKILL.md +88 -0
  170. package/skills/funifier-create-virtual-good/SKILL.md +86 -0
  171. package/skills/funifier-debug/SKILL.md +90 -0
  172. package/skills/funifier-help/SKILL.md +85 -0
  173. package/skills/funifier-implement-frontend/SKILL.md +89 -0
  174. package/skills/funifier-index/SKILL.md +50 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const api_holder_1 = require("./api-holder");
7
+ const tools_1 = require("./tools");
8
+ const documentation_1 = require("./resources/documentation");
9
+ const templates_1 = require("./prompts/templates");
10
+ async function main() {
11
+ // Create the API holder (manages connection state)
12
+ const apiHolder = new api_holder_1.ApiHolder();
13
+ // Try to auto-connect from funifier.json or env vars (non-blocking)
14
+ const autoConnected = apiHolder.tryAutoConnect();
15
+ // Create the MCP server
16
+ const server = new mcp_js_1.McpServer({
17
+ name: "funifier-mcp-server",
18
+ version: "0.1.0",
19
+ });
20
+ // Register all tools, resources, and prompts
21
+ (0, tools_1.registerTools)(server, apiHolder);
22
+ (0, documentation_1.registerResources)(server);
23
+ (0, templates_1.registerPrompts)(server);
24
+ // Connect to stdio transport
25
+ const transport = new stdio_js_1.StdioServerTransport();
26
+ await server.connect(transport);
27
+ if (!autoConnected) {
28
+ // Server started without config — tools will ask user to connect via funifier_connect
29
+ console.error("Funifier MCP server started without auto-config. Use funifier_connect tool to connect.");
30
+ }
31
+ }
32
+ main().catch((error) => {
33
+ console.error("Fatal error starting Funifier MCP server:", error);
34
+ process.exit(1);
35
+ });
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,6CAAyC;AACzC,mCAAwC;AACxC,6DAA8D;AAC9D,mDAAsD;AAEtD,KAAK,UAAU,IAAI;IACjB,mDAAmD;IACnD,MAAM,SAAS,GAAG,IAAI,sBAAS,EAAE,CAAC;IAElC,oEAAoE;IACpE,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;IAEjD,wBAAwB;IACxB,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,6CAA6C;IAC7C,IAAA,qBAAa,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,IAAA,iCAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,2BAAe,EAAC,MAAM,CAAC,CAAC;IAExB,6BAA6B;IAC7B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,sFAAsF;QACtF,OAAO,CAAC,KAAK,CACX,wFAAwF,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPrompts(server: McpServer): void;
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/mcp/prompts/templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QA6FhD"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPrompts = registerPrompts;
4
+ const zod_1 = require("zod");
5
+ function registerPrompts(server) {
6
+ server.prompt("create_resource", "Create a new Funifier resource with guided documentation", {
7
+ type: zod_1.z.string().describe("The resource type to create (e.g., trigger, scheduler, aggregate)"),
8
+ }, ({ type }) => {
9
+ return {
10
+ messages: [
11
+ {
12
+ role: "user",
13
+ content: {
14
+ type: "text",
15
+ text: [
16
+ `I want to create a new Funifier ${type}.`,
17
+ "",
18
+ "Please help me by:",
19
+ `1. Reading the relevant documentation using the funifier://docs resource for "${type}"`,
20
+ `2. Using funifier_list to see existing ${type} resources for reference`,
21
+ `3. Guiding me through the required fields and configuration options`,
22
+ `4. Once I provide the details, use funifier_save to create the ${type}`,
23
+ "",
24
+ `Let's start by reviewing the documentation and existing ${type} resources.`,
25
+ ].join("\n"),
26
+ },
27
+ },
28
+ ],
29
+ };
30
+ });
31
+ server.prompt("debug_resource", "Debug a Funifier resource by analyzing code and logs", {
32
+ type: zod_1.z.string().describe("The resource type (e.g., trigger, scheduler)"),
33
+ id: zod_1.z.string().describe("The resource ID to debug"),
34
+ }, ({ type, id }) => {
35
+ return {
36
+ messages: [
37
+ {
38
+ role: "user",
39
+ content: {
40
+ type: "text",
41
+ text: [
42
+ `I need help debugging a Funifier ${type} with ID "${id}".`,
43
+ "",
44
+ "Please help me by:",
45
+ `1. Using funifier_get to retrieve the ${type} configuration and code`,
46
+ `2. Using funifier_logs to check recent execution logs for errors`,
47
+ "3. Analyzing the code for potential issues (syntax errors, logic problems, missing error handling)",
48
+ "4. Checking the logs for exceptions, unexpected outputs, or performance issues",
49
+ "5. Suggesting specific fixes with code examples",
50
+ "",
51
+ `Start by fetching the ${type} details and its logs.`,
52
+ ].join("\n"),
53
+ },
54
+ },
55
+ ],
56
+ };
57
+ });
58
+ server.prompt("implement_frontend", "Implement frontend code using Funifier aggregates", async () => {
59
+ return {
60
+ messages: [
61
+ {
62
+ role: "user",
63
+ content: {
64
+ type: "text",
65
+ text: [
66
+ "I need help implementing frontend code that uses Funifier aggregates.",
67
+ "",
68
+ "Please help me by:",
69
+ "1. Using funifier_list with type 'aggregate' to discover available aggregates",
70
+ "2. For each relevant aggregate, explain what data it provides",
71
+ "3. Help me write fetch/API call code to consume these aggregates",
72
+ "4. Include proper error handling, loading states, and TypeScript types",
73
+ "5. Suggest UI patterns for displaying the data",
74
+ "",
75
+ "Start by listing the available aggregates so we can choose which ones to use.",
76
+ ].join("\n"),
77
+ },
78
+ },
79
+ ],
80
+ };
81
+ });
82
+ }
83
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/mcp/prompts/templates.ts"],"names":[],"mappings":";;AAGA,0CA6FC;AAhGD,6BAAwB;AAGxB,SAAgB,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,0DAA0D,EAC1D;QACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;KAC/F,EACD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACX,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,mCAAmC,IAAI,GAAG;4BAC1C,EAAE;4BACF,oBAAoB;4BACpB,iFAAiF,IAAI,GAAG;4BACxF,0CAA0C,IAAI,0BAA0B;4BACxE,qEAAqE;4BACrE,kEAAkE,IAAI,EAAE;4BACxE,EAAE;4BACF,2DAA2D,IAAI,aAAa;yBAC7E,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,gBAAgB,EAChB,sDAAsD,EACtD;QACE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACzE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACpD,EACD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,oCAAoC,IAAI,aAAa,EAAE,IAAI;4BAC3D,EAAE;4BACF,oBAAoB;4BACpB,yCAAyC,IAAI,yBAAyB;4BACtE,kEAAkE;4BAClE,oGAAoG;4BACpG,gFAAgF;4BAChF,iDAAiD;4BACjD,EAAE;4BACF,yBAAyB,IAAI,wBAAwB;yBACtD,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,mDAAmD,EACnD,KAAK,IAAI,EAAE;QACT,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,uEAAuE;4BACvE,EAAE;4BACF,oBAAoB;4BACpB,+EAA+E;4BAC/E,+DAA+D;4BAC/D,kEAAkE;4BAClE,wEAAwE;4BACxE,gDAAgD;4BAChD,EAAE;4BACF,+EAA+E;yBAChF,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerResources(server: McpServer): void;
3
+ //# sourceMappingURL=documentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAGtF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAyFlD"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerResources = registerResources;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
10
+ function registerResources(server) {
11
+ // Resolve docs. Source of truth is datasource-funifier-docs/knowledge/ at the project root.
12
+ // When running from compiled dist/mcp/resources/documentation.js: __dirname is dist/mcp/resources/ (3 levels up)
13
+ // When running from esbuild bundle dist/mcp/bundle.js: __dirname is dist/mcp/ (2 levels up)
14
+ // Try both paths for datasource-funifier-docs, then fall back to legacy doc/knowledge for published package.
15
+ const threeUp = path_1.default.join(__dirname, "..", "..", "..", "datasource-funifier-docs", "knowledge");
16
+ const twoUp = path_1.default.join(__dirname, "..", "..", "datasource-funifier-docs", "knowledge");
17
+ const legacyThreeUp = path_1.default.join(__dirname, "..", "..", "..", "doc", "knowledge");
18
+ const legacyTwoUp = path_1.default.join(__dirname, "..", "..", "doc", "knowledge");
19
+ const bundledDocsPath = fs_1.default.existsSync(twoUp) ? twoUp
20
+ : fs_1.default.existsSync(threeUp) ? threeUp
21
+ : fs_1.default.existsSync(legacyTwoUp) ? legacyTwoUp
22
+ : legacyThreeUp;
23
+ const docsPath = process.env.FUNIFIER_DOCS_PATH ||
24
+ (fs_1.default.existsSync(bundledDocsPath) ? bundledDocsPath : path_1.default.join(process.cwd(), "datasource-funifier-docs", "knowledge"));
25
+ // Register a resource template for documentation files
26
+ server.resource("funifier-docs", new mcp_js_1.ResourceTemplate("funifier://docs/{+path}", { list: listDocs }), { description: "Funifier platform documentation" }, readDoc);
27
+ function listDocs() {
28
+ const resources = [];
29
+ if (!fs_1.default.existsSync(docsPath)) {
30
+ return { resources };
31
+ }
32
+ collectFiles(docsPath, "", resources);
33
+ return { resources };
34
+ }
35
+ function collectFiles(dir, prefix, resources) {
36
+ const entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
37
+ for (const entry of entries) {
38
+ if (entry.isDirectory()) {
39
+ collectFiles(path_1.default.join(dir, entry.name), prefix ? `${prefix}/${entry.name}` : entry.name, resources);
40
+ }
41
+ else if (entry.name.endsWith(".md")) {
42
+ const name = entry.name.replace(/\.md$/, "");
43
+ const docPath = prefix ? `${prefix}/${name}` : name;
44
+ resources.push({
45
+ uri: `funifier://docs/${docPath}`,
46
+ name: `Funifier Docs: ${docPath}`,
47
+ description: `Documentation for ${docPath}`,
48
+ });
49
+ }
50
+ }
51
+ }
52
+ function readDoc(uri, variables) {
53
+ const pathVar = variables.path;
54
+ const docPath = Array.isArray(pathVar) ? pathVar.join("/") : (pathVar || "");
55
+ const filePath = path_1.default.join(docsPath, `${docPath}.md`);
56
+ if (!fs_1.default.existsSync(filePath)) {
57
+ return {
58
+ contents: [
59
+ {
60
+ uri: uri.href,
61
+ mimeType: "text/plain",
62
+ text: `Documentation not found: ${docPath}`,
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
68
+ return {
69
+ contents: [
70
+ {
71
+ uri: uri.href,
72
+ mimeType: "text/markdown",
73
+ text: content,
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ }
79
+ //# sourceMappingURL=documentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type ResourceType = "trigger" | "scheduler" | "aggregate" | "websocket" | "widget" | "custom-page" | "public-endpoint" | "challenge-aggregate" | "auth-module" | "ai-knowledge" | "action" | "challenge" | "point" | "level" | "leaderboard" | "quiz" | "virtual-good-catalog" | "virtual-good-item";
2
+ export declare function fetchCurrentById(api: any, type: ResourceType, id: string): Promise<any | null>;
3
+ //# sourceMappingURL=_fetch-current.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fetch-current.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/_fetch-current.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,WAAW,GACX,WAAW,GACX,WAAW,GACX,QAAQ,GACR,aAAa,GACb,iBAAiB,GACjB,qBAAqB,GACrB,aAAa,GACb,cAAc,GACd,QAAQ,GACR,WAAW,GACX,OAAO,GACP,OAAO,GACP,aAAa,GACb,MAAM,GACN,sBAAsB,GACtB,mBAAmB,CAAC;AAExB,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,YAAY,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA8DrB"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCurrentById = fetchCurrentById;
4
+ async function fetchCurrentById(api, type, id) {
5
+ let items;
6
+ switch (type) {
7
+ case "trigger":
8
+ items = await api.listTriggers();
9
+ break;
10
+ case "scheduler":
11
+ items = await api.listSchedulers();
12
+ break;
13
+ case "aggregate":
14
+ items = await api.listAggregates();
15
+ break;
16
+ case "websocket":
17
+ items = await api.listWebsockets();
18
+ break;
19
+ case "widget":
20
+ items = await api.listWidgets();
21
+ break;
22
+ case "custom-page":
23
+ items = await api.listCustomPages();
24
+ break;
25
+ case "public-endpoint":
26
+ items = await api.listPublicEndpoints();
27
+ break;
28
+ case "challenge-aggregate":
29
+ items = await api.listChallengeAggregates();
30
+ break;
31
+ case "auth-module":
32
+ items = await api.listAuthModules();
33
+ break;
34
+ case "ai-knowledge":
35
+ items = await api.listAiKnowledge();
36
+ break;
37
+ case "action":
38
+ items = await api.listActions();
39
+ break;
40
+ case "challenge":
41
+ items = await api.listChallenges();
42
+ break;
43
+ case "point":
44
+ items = await api.listPoints();
45
+ break;
46
+ case "level":
47
+ items = await api.listLevels();
48
+ break;
49
+ case "leaderboard":
50
+ items = await api.listLeaderboards();
51
+ break;
52
+ case "quiz":
53
+ items = await api.listQuizzes();
54
+ break;
55
+ case "virtual-good-catalog":
56
+ items = await api.listVirtualGoodCatalogs();
57
+ break;
58
+ case "virtual-good-item":
59
+ items = await api.listVirtualGoodItems();
60
+ break;
61
+ default:
62
+ throw new Error(`Unknown resource type: ${type}`);
63
+ }
64
+ const found = items.find((i) => i._id === id);
65
+ return found ?? null;
66
+ }
67
+ //# sourceMappingURL=_fetch-current.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fetch-current.js","sourceRoot":"","sources":["../../../src/mcp/tools/_fetch-current.ts"],"names":[],"mappings":";;AAoBA,4CAkEC;AAlEM,KAAK,UAAU,gBAAgB,CACpC,GAAQ,EACR,IAAkB,EAClB,EAAU;IAEV,IAAI,KAAY,CAAC;IACjB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,KAAK,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM;QACR,KAAK,WAAW;YACd,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM;QACR,KAAK,WAAW;YACd,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM;QACR,KAAK,WAAW;YACd,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,iBAAiB;YACpB,KAAK,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;YACxC,MAAM;QACR,KAAK,qBAAqB;YACxB,KAAK,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE,CAAC;YAC5C,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,cAAc;YACjB,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM;QACR,KAAK,WAAW;YACd,KAAK,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrC,MAAM;QACR,KAAK,MAAM;YACT,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM;QACR,KAAK,sBAAsB;YACzB,KAAK,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE,CAAC;YAC5C,MAAM;QACR,KAAK,mBAAmB;YACtB,KAAK,GAAG,MAAM,GAAG,CAAC,oBAAoB,EAAE,CAAC;YACzC,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function mergeResource<T extends Record<string, any>>(current: T, payload: Record<string, any>): T;
2
+ //# sourceMappingURL=_merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_merge.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/_merge.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,CAAC,CAEH"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeResource = mergeResource;
4
+ function mergeResource(current, payload) {
5
+ return { ...current, ...payload };
6
+ }
7
+ //# sourceMappingURL=_merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_merge.js","sourceRoot":"","sources":["../../../src/mcp/tools/_merge.ts"],"names":[],"mappings":";;AAAA,sCAKC;AALD,SAAgB,aAAa,CAC3B,OAAU,EACV,OAA4B;IAE5B,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAO,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ApiHolder } from "../api-holder";
3
+ export declare function registerConnectTool(server: McpServer, apiHolder: ApiHolder): void;
4
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/connect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA4C1E"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerConnectTool = registerConnectTool;
4
+ const zod_1 = require("zod");
5
+ function registerConnectTool(server, apiHolder) {
6
+ server.tool("funifier_connect", "Connect to a Funifier gamification instance. Required before using other tools if no funifier.json or env vars are configured. Can also be used to switch between different instances during a session.", {
7
+ apiKey: zod_1.z.string().describe("The Funifier API key"),
8
+ secretKey: zod_1.z.string().describe("The Funifier secret key"),
9
+ serverUrl: zod_1.z.string().describe("The Funifier server URL (e.g., 'https://example.funifier.com')"),
10
+ name: zod_1.z
11
+ .string()
12
+ .optional()
13
+ .describe("Optional friendly name for this connection (e.g., 'production', 'staging')"),
14
+ }, async ({ apiKey, secretKey, serverUrl, name }) => {
15
+ try {
16
+ apiHolder.connect({ apiKey, secretKey, serverUrl }, name);
17
+ // Verify connection by fetching account info
18
+ const client = apiHolder.requireClient();
19
+ const collections = await client.getCollections();
20
+ const displayName = name || serverUrl;
21
+ return {
22
+ content: [
23
+ {
24
+ type: "text",
25
+ text: `Connected to Funifier: ${displayName}\nServer: ${serverUrl}\nCollections available: ${collections.length}\n\nYou can now use all funifier tools. To switch to another instance, call funifier_connect again with different credentials.`,
26
+ },
27
+ ],
28
+ };
29
+ }
30
+ catch (error) {
31
+ apiHolder.disconnect();
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `Failed to connect to Funifier at ${serverUrl}: ${error.message}`,
37
+ },
38
+ ],
39
+ isError: true,
40
+ };
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/mcp/tools/connect.ts"],"names":[],"mappings":";;AAIA,kDA4CC;AAhDD,6BAAwB;AAIxB,SAAgB,mBAAmB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,yMAAyM,EACzM;QACE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACnD,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACzD,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAChG,IAAI,EAAE,OAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4EAA4E,CAAC;KAC1F,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;YAE1D,6CAA6C;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAElD,MAAM,WAAW,GAAG,IAAI,IAAI,SAAS,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,0BAA0B,WAAW,aAAa,SAAS,4BAA4B,WAAW,CAAC,MAAM,gIAAgI;qBAChP;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oCAAoC,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE;qBACxE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ApiHolder } from "../api-holder";
3
+ export declare function registerDatabaseTool(server: McpServer, apiHolder: ApiHolder): void;
4
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA0M3E"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerDatabaseTool = registerDatabaseTool;
4
+ const zod_1 = require("zod");
5
+ function registerDatabaseTool(server, apiHolder) {
6
+ server.tool("funifier_database", "Query or aggregate any Funifier database collection. Use action='query' for simple queries with filters, or action='aggregate' for MongoDB aggregate pipelines. Use action='collections' to list all available collections.", {
7
+ action: zod_1.z
8
+ .enum(["query", "aggregate", "collections", "insert", "update", "delete", "bulk"])
9
+ .describe("'query' for filtered reads, 'aggregate' for pipelines, 'collections' to list all, " +
10
+ "'insert' to create a document (POST), 'update' to update a document (PUT, requires _id in data), " +
11
+ "'delete' to remove documents (requires query filter), 'bulk' to insert/update multiple documents"),
12
+ collection: zod_1.z
13
+ .string()
14
+ .optional()
15
+ .describe("The collection name (e.g., 'player', 'action_log', 'videos__c'). Required for query and aggregate."),
16
+ query: zod_1.z
17
+ .string()
18
+ .optional()
19
+ .describe("For action='query': JSON string of MongoDB query filter (e.g., '{\"userId\":\"john\"}'). Defaults to {} (all documents)."),
20
+ pipeline: zod_1.z
21
+ .string()
22
+ .optional()
23
+ .describe("For action='aggregate': JSON string of MongoDB aggregate pipeline array"),
24
+ sort: zod_1.z
25
+ .string()
26
+ .optional()
27
+ .describe("For action='query': JSON string of sort object (e.g., '{\"time\":-1}')."),
28
+ limit: zod_1.z
29
+ .number()
30
+ .optional()
31
+ .describe("For action='query': Maximum number of documents to return. Default: 20."),
32
+ data: zod_1.z
33
+ .string()
34
+ .optional()
35
+ .describe("For insert/update/bulk: JSON string of document(s). For insert: single object. " +
36
+ "For update: object with _id field. For bulk: array of objects."),
37
+ }, async ({ action, collection, query, pipeline, sort, limit, data }) => {
38
+ try {
39
+ const api = apiHolder.requireClient();
40
+ if (action === "collections") {
41
+ const collections = await api.getCollections();
42
+ return {
43
+ content: [
44
+ {
45
+ type: "text",
46
+ text: `Found ${collections.length} collections:\n\n${collections.join("\n")}`,
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ if (!collection) {
52
+ return {
53
+ content: [{ type: "text", text: "Error: 'collection' is required for query and aggregate actions." }],
54
+ isError: true,
55
+ };
56
+ }
57
+ if (action === "query") {
58
+ const queryFilter = query ? JSON.parse(query) : {};
59
+ const sortObj = sort ? JSON.parse(sort) : undefined;
60
+ const results = await api.queryCollection(collection, queryFilter, {
61
+ sort: sortObj,
62
+ limit: limit || 20,
63
+ });
64
+ const header = `Found ${results.length} document(s) in '${collection}':`;
65
+ return {
66
+ content: [
67
+ {
68
+ type: "text",
69
+ text: header + "\n\n" + JSON.stringify(results, null, 2),
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ if (action === "aggregate") {
75
+ if (!pipeline) {
76
+ return {
77
+ content: [{ type: "text", text: "Error: 'pipeline' is required for aggregate action." }],
78
+ isError: true,
79
+ };
80
+ }
81
+ const pipelineArr = JSON.parse(pipeline);
82
+ const results = await api.aggregateCollection(collection, pipelineArr);
83
+ const count = Array.isArray(results) ? results.length : "N/A";
84
+ const header = `Aggregate result (${count} documents) from '${collection}':`;
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: header + "\n\n" + JSON.stringify(results, null, 2),
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ if (action === "insert") {
95
+ if (!data) {
96
+ return {
97
+ content: [{ type: "text", text: "Error: 'data' is required for insert action." }],
98
+ isError: true,
99
+ };
100
+ }
101
+ const doc = JSON.parse(data);
102
+ const result = await api.insertDocument(collection, doc);
103
+ return {
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: `Inserted document into '${collection}':\n\n${JSON.stringify(result, null, 2)}`,
108
+ },
109
+ ],
110
+ };
111
+ }
112
+ if (action === "update") {
113
+ if (!data) {
114
+ return {
115
+ content: [{ type: "text", text: "Error: 'data' is required for update action." }],
116
+ isError: true,
117
+ };
118
+ }
119
+ const doc = JSON.parse(data);
120
+ if (!doc._id) {
121
+ return {
122
+ content: [{ type: "text", text: "Error: document must have an '_id' field for update." }],
123
+ isError: true,
124
+ };
125
+ }
126
+ const result = await api.updateDocument(collection, doc);
127
+ return {
128
+ content: [
129
+ {
130
+ type: "text",
131
+ text: `Updated document in '${collection}':\n\n${JSON.stringify(result, null, 2)}`,
132
+ },
133
+ ],
134
+ };
135
+ }
136
+ if (action === "delete") {
137
+ if (!query) {
138
+ return {
139
+ content: [{ type: "text", text: "Error: 'query' is required for delete action (JSON filter)." }],
140
+ isError: true,
141
+ };
142
+ }
143
+ const result = await api.deleteDocument(collection, query);
144
+ return {
145
+ content: [
146
+ {
147
+ type: "text",
148
+ text: `Deleted document(s) from '${collection}':\n\n${JSON.stringify(result, null, 2)}`,
149
+ },
150
+ ],
151
+ };
152
+ }
153
+ if (action === "bulk") {
154
+ if (!data) {
155
+ return {
156
+ content: [{ type: "text", text: "Error: 'data' is required for bulk action (JSON array)." }],
157
+ isError: true,
158
+ };
159
+ }
160
+ const docs = JSON.parse(data);
161
+ const result = await api.bulkInsert(collection, docs);
162
+ return {
163
+ content: [
164
+ {
165
+ type: "text",
166
+ text: `Bulk inserted ${Array.isArray(docs) ? docs.length : "?"} documents into '${collection}':\n\n${JSON.stringify(result, null, 2)}`,
167
+ },
168
+ ],
169
+ };
170
+ }
171
+ return {
172
+ content: [{ type: "text", text: `Unknown action: ${action}` }],
173
+ isError: true,
174
+ };
175
+ }
176
+ catch (error) {
177
+ return {
178
+ content: [
179
+ {
180
+ type: "text",
181
+ text: `Error in database ${action} on '${collection}': ${error.message}`,
182
+ },
183
+ ],
184
+ isError: true,
185
+ };
186
+ }
187
+ });
188
+ }
189
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ApiHolder } from "../api-holder";
3
+ export declare function registerDeleteTool(server: McpServer, apiHolder: ApiHolder): void;
4
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAqB1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA+EzE"}