funifier-mcp 0.2.28 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.cursor/rules/funifier.mdc +7 -7
  2. package/.github/copilot-instructions.md +10 -8
  3. package/AGENTS.md +8 -4
  4. package/README.md +6 -12
  5. package/datasource-funifier-docs/.coverage.json +1 -1
  6. package/dist/cli/init.d.ts.map +1 -1
  7. package/dist/cli/init.js +13 -9
  8. package/dist/cli/init.js.map +1 -1
  9. package/dist/cli/init.test.js +28 -9
  10. package/dist/cli/init.test.js.map +1 -1
  11. package/dist/cli/prompts.d.ts +1 -0
  12. package/dist/cli/prompts.d.ts.map +1 -1
  13. package/dist/cli/prompts.js +8 -0
  14. package/dist/cli/prompts.js.map +1 -1
  15. package/dist/cli/search.js +3 -3
  16. package/dist/cli/search.js.map +1 -1
  17. package/dist/cli/search.test.js +9 -9
  18. package/dist/cli/search.test.js.map +1 -1
  19. package/dist/mcp/bundle.js +84 -84
  20. package/dist/mcp/resources/documentation.d.ts.map +1 -1
  21. package/dist/mcp/resources/documentation.js +2 -1
  22. package/dist/mcp/resources/documentation.js.map +1 -1
  23. package/dist/mcp/tools/docs-flow.test.d.ts +2 -0
  24. package/dist/mcp/tools/docs-flow.test.d.ts.map +1 -0
  25. package/dist/mcp/tools/docs-flow.test.js +91 -0
  26. package/dist/mcp/tools/docs-flow.test.js.map +1 -0
  27. package/dist/mcp/tools/index.d.ts.map +1 -1
  28. package/dist/mcp/tools/index.js +2 -0
  29. package/dist/mcp/tools/index.js.map +1 -1
  30. package/dist/mcp/tools/read-doc.d.ts +3 -0
  31. package/dist/mcp/tools/read-doc.d.ts.map +1 -0
  32. package/dist/mcp/tools/read-doc.js +97 -0
  33. package/dist/mcp/tools/read-doc.js.map +1 -0
  34. package/dist/mcp/tools/read-doc.test.d.ts +2 -0
  35. package/dist/mcp/tools/read-doc.test.d.ts.map +1 -0
  36. package/dist/mcp/tools/read-doc.test.js +92 -0
  37. package/dist/mcp/tools/read-doc.test.js.map +1 -0
  38. package/dist/mcp/tools/search-docs.js +3 -3
  39. package/dist/mcp/tools/search-docs.js.map +1 -1
  40. package/dist/mcp/tools/search-docs.test.d.ts +2 -0
  41. package/dist/mcp/tools/search-docs.test.d.ts.map +1 -0
  42. package/dist/mcp/tools/search-docs.test.js +100 -0
  43. package/dist/mcp/tools/search-docs.test.js.map +1 -0
  44. package/package.json +1 -1
  45. package/skills/funifier/SKILL.md +5 -3
  46. package/skills/funifier/references/configure-security.md +7 -7
  47. package/skills/funifier/references/create-action.md +7 -7
  48. package/skills/funifier/references/create-aggregate.md +8 -8
  49. package/skills/funifier/references/create-challenge.md +8 -8
  50. package/skills/funifier/references/create-competition.md +6 -6
  51. package/skills/funifier/references/create-crossword.md +1 -1
  52. package/skills/funifier/references/create-custom-object.md +7 -7
  53. package/skills/funifier/references/create-custom-page.md +8 -8
  54. package/skills/funifier/references/create-folder.md +6 -6
  55. package/skills/funifier/references/create-lastmile.md +1 -1
  56. package/skills/funifier/references/create-leaderboard.md +8 -8
  57. package/skills/funifier/references/create-level.md +7 -7
  58. package/skills/funifier/references/create-notification.md +7 -7
  59. package/skills/funifier/references/create-point.md +7 -7
  60. package/skills/funifier/references/create-quiz.md +7 -7
  61. package/skills/funifier/references/create-scheduler.md +10 -10
  62. package/skills/funifier/references/create-story.md +1 -1
  63. package/skills/funifier/references/create-swap.md +6 -6
  64. package/skills/funifier/references/create-trigger.md +14 -14
  65. package/skills/funifier/references/create-virtual-good.md +7 -7
  66. package/skills/funifier/references/create-webhook.md +7 -7
  67. package/skills/funifier/references/create-websocket.md +8 -8
  68. package/skills/funifier/references/create-widget.md +7 -7
  69. package/skills/funifier/references/debug.md +16 -16
  70. package/skills/funifier/references/help.md +8 -8
  71. package/skills/funifier/references/implement-frontend.md +15 -15
  72. package/skills/funifier/references/import-csv.md +7 -7
  73. package/skills/funifier/references/manage-player.md +6 -6
  74. package/skills/funifier/references/manage-team.md +6 -6
  75. package/skills/funifier/references/upload-file.md +6 -6
@@ -1 +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,GAAG,MAAM,CAiI3D"}
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,GAAG,MAAM,CAkI3D"}
@@ -8,7 +8,8 @@ const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
10
10
  function registerResources(server) {
11
- // Resolve docs. Source of truth is datasource-funifier-docs/knowledge/ at the project root.
11
+ // Resolve docs. Source of truth is datasource-funifier-docs/knowledge/, resolved relative to
12
+ // this file (the project root in dev, node_modules/funifier-mcp/ when installed as a package).
12
13
  // When running from compiled dist/mcp/resources/documentation.js: __dirname is dist/mcp/resources/ (3 levels up)
13
14
  // When running from esbuild bundle dist/mcp/bundle.js: __dirname is dist/mcp/ (2 levels up)
14
15
  // Try both paths for datasource-funifier-docs, then fall back to legacy doc/knowledge for published package.
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":";;;;;AAKA,8CAiIC;AAtID,4CAAoB;AACpB,gDAAwB;AACxB,oEAAsF;AAGtF,SAAgB,iBAAiB,CAAC,MAAiB;IACjD,4FAA4F;IAC5F,iHAAiH;IACjH,4FAA4F;IAC5F,6GAA6G;IAC7G,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,CAAC,CAAC;IAChG,MAAM,KAAK,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACjF,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,YAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;QAClD,CAAC,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;YAClC,CAAC,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW;gBAC1C,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,CAAC,YAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,SAAS,UAAU,CAAC,QAAgB;QAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7C,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,iFAAiF;IACjF,SAAS,WAAW,CAAC,QAAgB,EAAE,OAAe;QACpD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAExC,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,OAAO;iBACrB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC1C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACf,WAAW;gBACT,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACjB,CAAC,CAAC,GAAG,OAAO,MAAM,MAAM,mBAAmB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAChE,CAAC,CAAC,GAAG,OAAO,MAAM,MAAM,KAAK,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,qBAAqB,OAAO,EAAE,CAAC;QAC/C,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,QAAQ,CACb,eAAe,EACf,IAAI,yBAAgB,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EACnE,EAAE,WAAW,EAAE,iCAAiC,EAAE,EAClD,OAAO,CACR,CAAC;IAEF,SAAS,QAAQ;QACf,MAAM,SAAS,GAA+D,EAAE,CAAC;QAEjF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,CAAC;QAED,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,YAAY,CACnB,GAAW,EACX,MAAc,EACd,SAAqE;QAErE,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,YAAY,CACV,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAC1B,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAC/C,SAAS,CACV,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC;oBACb,GAAG,EAAE,mBAAmB,OAAO,EAAE;oBACjC,IAAI,EAAE,kBAAkB,OAAO,EAAE;oBACjC,WAAW,EAAE,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,OAAO,CAAC,GAAQ,EAAE,SAAoB;QAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,KAAK,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,4BAA4B,OAAO,EAAE;qBAC5C;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;iBAC3B;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=docs-flow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-flow.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/docs-flow.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const search_docs_1 = require("./search-docs");
41
+ const read_doc_1 = require("./read-doc");
42
+ const lexical_1 = require("../../core/lexical");
43
+ // End-to-end guarantee of the "swap": docs live only in a package-style root
44
+ // (knowledge/ + .search-index.json) — never copied into the project cwd — and the
45
+ // path that funifier_search_docs returns is consumed verbatim by funifier_read_doc.
46
+ let root;
47
+ let docsPath;
48
+ const TRIGGER_BODY = "# Trigger\n\n## Groovy event\n\nUNIQUE-MARKER-DOC-CONTENT — fires on before_win with a groovy script.";
49
+ function harness() {
50
+ const handlers = {};
51
+ const server = {
52
+ registerTool: (name, _config, handler) => {
53
+ handlers[name] = handler;
54
+ },
55
+ };
56
+ (0, search_docs_1.registerSearchDocsTool)(server, docsPath);
57
+ (0, read_doc_1.registerReadDocTool)(server, docsPath);
58
+ return handlers;
59
+ }
60
+ (0, vitest_1.beforeAll)(() => {
61
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-docsflow-"));
62
+ docsPath = path.join(root, "knowledge");
63
+ fs.mkdirSync(path.join(docsPath, "modules"), { recursive: true });
64
+ fs.writeFileSync(path.join(docsPath, "modules", "trigger.md"), TRIGGER_BODY);
65
+ fs.writeFileSync(path.join(docsPath, "modules", "quiz.md"), "# Quiz\n\nQuestions and answers.");
66
+ const files = new Map([
67
+ ["knowledge/modules/trigger.md", TRIGGER_BODY],
68
+ ["knowledge/modules/quiz.md", "# Quiz\n\nQuestions and answers."],
69
+ ]);
70
+ fs.writeFileSync(path.join(root, ".search-index.json"), JSON.stringify((0, lexical_1.buildIndex)(files)));
71
+ });
72
+ (0, vitest_1.afterAll)(() => {
73
+ fs.rmSync(root, { recursive: true, force: true });
74
+ });
75
+ (0, vitest_1.describe)("docs search -> read flow (package layout, no cwd copy)", () => {
76
+ (0, vitest_1.it)("search returns a path that read consumes verbatim to return the doc content", () => {
77
+ const h = harness();
78
+ const search = h["funifier_search_docs"]({ query: "trigger groovy event before_win" });
79
+ (0, vitest_1.expect)(search.isError).toBeUndefined();
80
+ const text = search.content[0].text;
81
+ const match = text.match(/^\s*1\.\s+(\S+)\s+\[score:/m);
82
+ (0, vitest_1.expect)(match).not.toBeNull();
83
+ const topPath = match[1];
84
+ (0, vitest_1.expect)(topPath).toBe("modules/trigger");
85
+ // Feed the search result straight into the read tool — the formats must line up.
86
+ const read = h["funifier_read_doc"]({ path: topPath });
87
+ (0, vitest_1.expect)(read.isError).toBeUndefined();
88
+ (0, vitest_1.expect)(read.content[0].text).toContain("UNIQUE-MARKER-DOC-CONTENT");
89
+ });
90
+ });
91
+ //# sourceMappingURL=docs-flow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-flow.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/docs-flow.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAoC1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QActF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAqC1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAetF"}
@@ -12,6 +12,7 @@ const logs_1 = require("./logs");
12
12
  const database_1 = require("./database");
13
13
  const folder_1 = require("./folder");
14
14
  const search_docs_1 = require("./search-docs");
15
+ const read_doc_1 = require("./read-doc");
15
16
  /**
16
17
  * Wraps every tool handler so a pending update notice is prepended to the first
17
18
  * tool result of the session. Tool results are the only channel the user reliably
@@ -47,5 +48,6 @@ function registerTools(server, apiHolder, docsPath) {
47
48
  (0, database_1.registerDatabaseTool)(server, apiHolder);
48
49
  (0, folder_1.registerFolderTool)(server, apiHolder);
49
50
  (0, search_docs_1.registerSearchDocsTool)(server, docsPath);
51
+ (0, read_doc_1.registerReadDocTool)(server, docsPath);
50
52
  }
51
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":";;AAqCA,sCAcC;AAjDD,kDAAsD;AACtD,uCAAgD;AAChD,iCAA0C;AAC1C,+BAAwC;AACxC,iCAA0C;AAC1C,qCAA8C;AAC9C,uCAAgD;AAChD,iCAA0C;AAC1C,yCAAkD;AAClD,qCAA8C;AAC9C,+CAAuD;AAEvD;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,MAAiB;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAA4B,CAAC;IAC7E,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,WAAkB,EAAE,EAAE;gBACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAA,kCAAmB,GAAE,CAAC;gBACrC,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,CAAC,CAA+B,CAAC;AACnC,CAAC;AAED,SAAgB,aAAa,CAAC,MAAiB,EAAE,SAAoB,EAAE,QAAgB;IACrF,2EAA2E;IAC3E,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAA,6BAAmB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,qBAAe,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,2BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,IAAA,6BAAmB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,+BAAoB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,IAAA,2BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,IAAA,oCAAsB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":";;AAsCA,sCAeC;AAnDD,kDAAsD;AACtD,uCAAgD;AAChD,iCAA0C;AAC1C,+BAAwC;AACxC,iCAA0C;AAC1C,qCAA8C;AAC9C,uCAAgD;AAChD,iCAA0C;AAC1C,yCAAkD;AAClD,qCAA8C;AAC9C,+CAAuD;AACvD,yCAAiD;AAEjD;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,MAAiB;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAA4B,CAAC;IAC7E,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,WAAkB,EAAE,EAAE;gBACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAA,kCAAmB,GAAE,CAAC;gBACrC,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,CAAC,CAA+B,CAAC;AACnC,CAAC;AAED,SAAgB,aAAa,CAAC,MAAiB,EAAE,SAAoB,EAAE,QAAgB;IACrF,2EAA2E;IAC3E,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAA,6BAAmB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,qBAAe,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,2BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,IAAA,6BAAmB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,IAAA,uBAAgB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,IAAA,+BAAoB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,IAAA,2BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,IAAA,oCAAsB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAA,8BAAmB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerReadDocTool(server: McpServer, docsPath: string): void;
3
+ //# sourceMappingURL=read-doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-doc.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/read-doc.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAuDtE"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerReadDocTool = registerReadDocTool;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const zod_1 = require("zod");
40
+ // Accepts the same identifiers the search tool and skill references emit:
41
+ // "modules/trigger", "funifier://docs/modules/trigger", or "knowledge/modules/trigger.md".
42
+ function normalizeDocPath(input) {
43
+ return input
44
+ .trim()
45
+ .replace(/^funifier:\/\/docs\//, "")
46
+ .replace(/^\/+/, "")
47
+ .replace(/^knowledge\//, "")
48
+ .replace(/\.md$/, "");
49
+ }
50
+ function registerReadDocTool(server, docsPath) {
51
+ const root = path.resolve(docsPath);
52
+ server.registerTool("funifier_read_doc", {
53
+ title: "Read Funifier Documentation",
54
+ description: "Read the full markdown of a Funifier documentation file by path. " +
55
+ "Use after funifier_search_docs to load the most relevant docs. " +
56
+ "Accepts paths like 'modules/trigger', 'guides/java-entities', or a 'funifier://docs/...' URI.",
57
+ inputSchema: {
58
+ path: zod_1.z
59
+ .string()
60
+ .describe("Doc path — e.g. 'modules/trigger', 'guides/aggregates', or 'funifier://docs/modules/trigger'"),
61
+ },
62
+ annotations: {
63
+ readOnlyHint: true,
64
+ destructiveHint: false,
65
+ idempotentHint: true,
66
+ openWorldHint: false,
67
+ },
68
+ }, ({ path: docPath }) => {
69
+ const normalized = normalizeDocPath(docPath);
70
+ if (!normalized) {
71
+ return {
72
+ content: [{ type: "text", text: "Provide a doc path, e.g. funifier_read_doc path=modules/trigger" }],
73
+ isError: true,
74
+ };
75
+ }
76
+ const filePath = path.resolve(root, `${normalized}.md`);
77
+ if (filePath !== root && !filePath.startsWith(root + path.sep)) {
78
+ return {
79
+ content: [{ type: "text", text: `Invalid doc path: ${docPath}` }],
80
+ isError: true,
81
+ };
82
+ }
83
+ if (!fs.existsSync(filePath)) {
84
+ return {
85
+ content: [{
86
+ type: "text",
87
+ text: `Documentation not found: ${normalized}. Use funifier_search_docs to find valid paths.`,
88
+ }],
89
+ isError: true,
90
+ };
91
+ }
92
+ return {
93
+ content: [{ type: "text", text: fs.readFileSync(filePath, "utf-8") }],
94
+ };
95
+ });
96
+ }
97
+ //# sourceMappingURL=read-doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-doc.js","sourceRoot":"","sources":["../../../src/mcp/tools/read-doc.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,kDAuDC;AAvED,uCAAyB;AACzB,2CAA6B;AAC7B,6BAAwB;AAGxB,0EAA0E;AAC1E,2FAA2F;AAC3F,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAiB,EAAE,QAAgB;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EACT,mEAAmE;YACnE,iEAAiE;YACjE,+FAA+F;QACjG,WAAW,EAAE;YACX,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,8FAA8F,CAAC;SAC5G;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iEAAiE,EAAE,CAAC;gBACpG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,UAAU,KAAK,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,OAAO,EAAE,EAAE,CAAC;gBACjE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,UAAU,iDAAiD;qBAC9F,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=read-doc.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-doc.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/read-doc.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const read_doc_1 = require("./read-doc");
41
+ let docsRoot;
42
+ function makeInvoke() {
43
+ const handlers = {};
44
+ const server = {
45
+ registerTool: (name, _config, handler) => {
46
+ handlers[name] = handler;
47
+ },
48
+ };
49
+ (0, read_doc_1.registerReadDocTool)(server, docsRoot);
50
+ return (args) => handlers["funifier_read_doc"](args);
51
+ }
52
+ (0, vitest_1.beforeAll)(() => {
53
+ docsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-docs-"));
54
+ fs.mkdirSync(path.join(docsRoot, "modules"), { recursive: true });
55
+ fs.writeFileSync(path.join(docsRoot, "modules", "trigger.md"), "# Trigger\n\nHello trigger.");
56
+ fs.writeFileSync(path.join(docsRoot, "secret.md"), "TOP SECRET");
57
+ });
58
+ (0, vitest_1.afterAll)(() => {
59
+ fs.rmSync(docsRoot, { recursive: true, force: true });
60
+ });
61
+ (0, vitest_1.describe)("funifier_read_doc", () => {
62
+ (0, vitest_1.it)("returns markdown content for a bare path", () => {
63
+ const result = makeInvoke()({ path: "modules/trigger" });
64
+ (0, vitest_1.expect)(result.isError).toBeUndefined();
65
+ (0, vitest_1.expect)(result.content[0].text).toContain("Hello trigger.");
66
+ });
67
+ (0, vitest_1.it)("accepts the funifier://docs/ URI form", () => {
68
+ const result = makeInvoke()({ path: "funifier://docs/modules/trigger" });
69
+ (0, vitest_1.expect)(result.isError).toBeUndefined();
70
+ (0, vitest_1.expect)(result.content[0].text).toContain("Hello trigger.");
71
+ });
72
+ (0, vitest_1.it)("accepts the knowledge/...md form", () => {
73
+ const result = makeInvoke()({ path: "knowledge/modules/trigger.md" });
74
+ (0, vitest_1.expect)(result.isError).toBeUndefined();
75
+ (0, vitest_1.expect)(result.content[0].text).toContain("Hello trigger.");
76
+ });
77
+ (0, vitest_1.it)("returns isError for a missing doc", () => {
78
+ const result = makeInvoke()({ path: "modules/does-not-exist" });
79
+ (0, vitest_1.expect)(result.isError).toBe(true);
80
+ (0, vitest_1.expect)(result.content[0].text).toContain("not found");
81
+ });
82
+ (0, vitest_1.it)("rejects path traversal outside the docs root", () => {
83
+ const result = makeInvoke()({ path: "../secret" });
84
+ (0, vitest_1.expect)(result.isError).toBe(true);
85
+ (0, vitest_1.expect)(result.content[0].text).not.toContain("TOP SECRET");
86
+ });
87
+ (0, vitest_1.it)("returns isError for an empty path", () => {
88
+ const result = makeInvoke()({ path: " " });
89
+ (0, vitest_1.expect)(result.isError).toBe(true);
90
+ });
91
+ });
92
+ //# sourceMappingURL=read-doc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-doc.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/read-doc.test.ts"],"names":[],"mappings":"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"}
@@ -88,13 +88,13 @@ function registerSearchDocsTool(server, docsPath) {
88
88
  };
89
89
  }
90
90
  const lines = results.map((r, i) => {
91
- const resourcePath = r.file.replace(/^knowledge\//, "").replace(/\.md$/, "");
92
- return `${i + 1}. funifier://docs/${resourcePath} [score: ${r.score.toFixed(2)}]`;
91
+ const docPath = r.file.replace(/^knowledge\//, "").replace(/\.md$/, "");
92
+ return `${i + 1}. ${docPath} [score: ${r.score.toFixed(2)}]`;
93
93
  });
94
94
  return {
95
95
  content: [{
96
96
  type: "text",
97
- text: `Documentation search results for "${query}":\n\n${lines.join("\n")}\n\nFetch a resource with its funifier://docs/... URI to read the full content.`,
97
+ text: `Documentation search results for "${query}":\n\n${lines.join("\n")}\n\nRead the full content with funifier_read_doc path=<path> (e.g. funifier_read_doc path=${results[0].file.replace(/^knowledge\//, "").replace(/\.md$/, "")}).`,
98
98
  }],
99
99
  };
100
100
  });
@@ -1 +1 @@
1
- {"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wDAqEC;AA3ED,uCAAyB;AACzB,2CAA6B;AAC7B,6BAAwB;AAExB,gDAAkE;AAElE,SAAgB,sBAAsB,CAAC,MAAiB,EAAE,QAAgB;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAClE,IAAI,WAAW,GAAuB,IAAI,CAAC;IAE3C,SAAS,SAAS;QAChB,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAgB,CAAC;QAC7E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,6FAA6F;YAC7F,yGAAyG;YACzG,oEAAoE;QACtE,WAAW,EAAE;YACX,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,CAAC,4GAA4G,CAAC;YACzH,GAAG,EAAE,OAAC;iBACH,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,SAAS,EAAE,OAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;SAC1E;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kFAAkF,EAAE,CAAC;gBACrH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAExF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,KAAK,uBAAuB,EAAE,CAAC;aACpG,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7E,OAAO,GAAG,CAAC,GAAG,CAAC,qBAAqB,YAAY,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qCAAqC,KAAK,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iFAAiF;iBAC3J,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-docs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-docs.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const search_docs_1 = require("./search-docs");
41
+ const lexical_1 = require("../../core/lexical");
42
+ // Package-style layout: docsPath is the knowledge/ dir; the index sits one level up,
43
+ // exactly where the tool resolves it (path.join(docsPath, "..", ".search-index.json")).
44
+ let root;
45
+ let docsPath;
46
+ function invokeWith(dp) {
47
+ const handlers = {};
48
+ const server = {
49
+ registerTool: (name, _config, handler) => {
50
+ handlers[name] = handler;
51
+ },
52
+ };
53
+ (0, search_docs_1.registerSearchDocsTool)(server, dp);
54
+ return (args) => handlers["funifier_search_docs"](args);
55
+ }
56
+ (0, vitest_1.beforeAll)(() => {
57
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-searchdocs-"));
58
+ docsPath = path.join(root, "knowledge");
59
+ fs.mkdirSync(docsPath, { recursive: true });
60
+ // Index keys carry the knowledge/ prefix, like the real build output, so the
61
+ // tool's strip of `^knowledge/` and `.md` is exercised.
62
+ const files = new Map([
63
+ [
64
+ "knowledge/modules/trigger.md",
65
+ "# Trigger\n\n## Groovy event\n\nTrigger fires on before_win events with a groovy script.",
66
+ ],
67
+ ["knowledge/modules/quiz.md", "# Quiz\n\nQuestions and answers for players."],
68
+ ]);
69
+ fs.writeFileSync(path.join(root, ".search-index.json"), JSON.stringify((0, lexical_1.buildIndex)(files)));
70
+ });
71
+ (0, vitest_1.afterAll)(() => {
72
+ fs.rmSync(root, { recursive: true, force: true });
73
+ });
74
+ (0, vitest_1.describe)("funifier_search_docs", () => {
75
+ (0, vitest_1.it)("loads the index next to docsPath and ranks matching docs", () => {
76
+ const result = invokeWith(docsPath)({ query: "trigger groovy event before_win" });
77
+ (0, vitest_1.expect)(result.isError).toBeUndefined();
78
+ (0, vitest_1.expect)(result.content[0].text).toContain("modules/trigger");
79
+ });
80
+ (0, vitest_1.it)("returns paths stripped of knowledge/ and .md, pointing at funifier_read_doc (not a resource URI)", () => {
81
+ const text = invokeWith(docsPath)({ query: "trigger groovy event before_win" }).content[0].text;
82
+ (0, vitest_1.expect)(text).toContain("funifier_read_doc path=");
83
+ (0, vitest_1.expect)(text).not.toContain("funifier://docs/");
84
+ (0, vitest_1.expect)(text).not.toContain("knowledge/");
85
+ (0, vitest_1.expect)(text).not.toContain(".md");
86
+ });
87
+ (0, vitest_1.it)("returns isError when the search index is missing", () => {
88
+ const emptyRoot = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-noindex-"));
89
+ const result = invokeWith(path.join(emptyRoot, "knowledge"))({ query: "trigger" });
90
+ (0, vitest_1.expect)(result.isError).toBe(true);
91
+ (0, vitest_1.expect)(result.content[0].text).toContain("index not found");
92
+ fs.rmSync(emptyRoot, { recursive: true, force: true });
93
+ });
94
+ (0, vitest_1.it)("reports no matches for an unrelated query", () => {
95
+ const result = invokeWith(docsPath)({ query: "zzzznonexistentterm" });
96
+ (0, vitest_1.expect)(result.isError).toBeUndefined();
97
+ (0, vitest_1.expect)(result.content[0].text).toContain("No documentation found");
98
+ });
99
+ });
100
+ //# sourceMappingURL=search-docs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-docs.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "funifier-mcp",
3
- "version": "0.2.28",
3
+ "version": "0.3.0",
4
4
  "description": "Funifier AI toolkit — MCP server, API client, and Claude Code skills for the Funifier gamification platform",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,11 +21,13 @@ Only proceed directly with MCP tools when no row matches.
21
21
  3. Read the file listed in the Reference column
22
22
  4. Follow the workflow in that file
23
23
 
24
- For general questions with no matching task, run lexical search:
24
+ For general questions with no matching task, search the docs with the MCP tool:
25
25
 
26
- ```bash
27
- npx funifier-mcp search "<user question>"
28
26
  ```
27
+ funifier_search_docs "<user question>"
28
+ ```
29
+
30
+ Then read a result with `funifier_read_doc path=<path>`.
29
31
 
30
32
  ## Routing Table
31
33
 
@@ -6,19 +6,19 @@ Configure Funifier security settings — roles, scopes, app tokens, and auth par
6
6
 
7
7
  ## Before starting — find relevant docs
8
8
 
9
- Run lexical search to load only what you need:
9
+ Use the `funifier_search_docs` MCP tool to load only what you need:
10
10
 
11
- ```bash
12
- npx funifier-mcp search "security role scope token auth app permission basic bearer access-control" --skill funifier-configure-security
11
+ ```
12
+ funifier_search_docs "security role scope token auth app permission basic bearer access-control"
13
13
  ```
14
14
 
15
- Read only files returned with score > 0.5 (this threshold is printed in the search output).
15
+ Then read the most relevant results with `funifier_read_doc path=<path>`.
16
16
 
17
17
  ## Primary docs for this skill
18
18
 
19
- If search returns insufficient results, read directly:
19
+ If search returns insufficient results, read these directly:
20
20
 
21
- - `datasource-funifier-docs/knowledge/modules/security.md`
21
+ - `funifier_read_doc path=modules/security`
22
22
 
23
23
  ## Steps
24
24
 
@@ -54,7 +54,7 @@ Authorization: Bearer <studio_token>
54
54
  ### 2. Ler a documentação do módulo
55
55
 
56
56
  ```
57
- datasource-funifier-docs/knowledge/modules/security.md
57
+ funifier_read_doc path=modules/security
58
58
  ```
59
59
 
60
60
  ### 3. Definir roles e apps