funifier-mcp 0.3.0 → 0.3.5
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.
- package/.cursor/rules/funifier.mdc +1 -0
- package/.github/copilot-instructions.md +1 -0
- package/AGENTS.md +1 -0
- package/datasource-funifier-docs/.coverage.json +3 -2
- package/dist/core/api-client.d.ts +3 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +29 -0
- package/dist/core/api-client.js.map +1 -1
- package/dist/core/constants.d.ts +2 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +3 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/mcp/bundle.js +103 -89
- package/dist/mcp/check-update.d.ts +7 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +18 -1
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.js +13 -0
- package/dist/mcp/check-update.test.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +33 -15
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/resources/documentation.test.d.ts +2 -0
- package/dist/mcp/resources/documentation.test.d.ts.map +1 -0
- package/dist/mcp/resources/documentation.test.js +99 -0
- package/dist/mcp/resources/documentation.test.js.map +1 -0
- package/dist/mcp/tools/index-manager.d.ts +4 -0
- package/dist/mcp/tools/index-manager.d.ts.map +1 -0
- package/dist/mcp/tools/index-manager.js +137 -0
- package/dist/mcp/tools/index-manager.js.map +1 -0
- package/dist/mcp/tools/index-manager.test.d.ts +2 -0
- package/dist/mcp/tools/index-manager.test.d.ts.map +1 -0
- package/dist/mcp/tools/index-manager.test.js +130 -0
- package/dist/mcp/tools/index-manager.test.js.map +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +4 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list-tools.d.ts +3 -0
- package/dist/mcp/tools/list-tools.d.ts.map +1 -0
- package/dist/mcp/tools/list-tools.js +132 -0
- package/dist/mcp/tools/list-tools.js.map +1 -0
- package/dist/mcp/tools/list-tools.test.d.ts +2 -0
- package/dist/mcp/tools/list-tools.test.d.ts.map +1 -0
- package/dist/mcp/tools/list-tools.test.js +72 -0
- package/dist/mcp/tools/list-tools.test.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts.map +1 -1
- package/dist/mcp/tools/search-docs.js +6 -1
- package/dist/mcp/tools/search-docs.js.map +1 -1
- package/dist/mcp/tools/search-docs.test.js +5 -2
- package/dist/mcp/tools/search-docs.test.js.map +1 -1
- package/package.json +2 -2
- package/skills/funifier/SKILL.md +18 -3
- package/skills/funifier/references/manage-indexes.md +77 -0
package/dist/mcp/tools/index.js
CHANGED
|
@@ -11,6 +11,8 @@ const execute_1 = require("./execute");
|
|
|
11
11
|
const logs_1 = require("./logs");
|
|
12
12
|
const database_1 = require("./database");
|
|
13
13
|
const folder_1 = require("./folder");
|
|
14
|
+
const index_manager_1 = require("./index-manager");
|
|
15
|
+
const list_tools_1 = require("./list-tools");
|
|
14
16
|
const search_docs_1 = require("./search-docs");
|
|
15
17
|
const read_doc_1 = require("./read-doc");
|
|
16
18
|
/**
|
|
@@ -46,7 +48,9 @@ function registerTools(server, apiHolder, docsPath) {
|
|
|
46
48
|
(0, execute_1.registerExecuteTool)(server, apiHolder);
|
|
47
49
|
(0, logs_1.registerLogsTool)(server, apiHolder);
|
|
48
50
|
(0, database_1.registerDatabaseTool)(server, apiHolder);
|
|
51
|
+
(0, index_manager_1.registerIndexTool)(server, apiHolder);
|
|
49
52
|
(0, folder_1.registerFolderTool)(server, apiHolder);
|
|
53
|
+
(0, list_tools_1.registerListToolsTool)(server);
|
|
50
54
|
(0, search_docs_1.registerSearchDocsTool)(server, docsPath);
|
|
51
55
|
(0, read_doc_1.registerReadDocTool)(server, docsPath);
|
|
52
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":";;AAwCA,sCAiBC;AAvDD,kDAAsD;AACtD,uCAAgD;AAChD,iCAA0C;AAC1C,+BAAwC;AACxC,iCAA0C;AAC1C,qCAA8C;AAC9C,uCAAgD;AAChD,iCAA0C;AAC1C,yCAAkD;AAClD,qCAA8C;AAC9C,mDAAoD;AACpD,6CAAqD;AACrD,+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,iCAAiB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,IAAA,2BAAkB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,IAAA,kCAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,oCAAsB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAA,8BAAmB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+HpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAqBtD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerListToolsTool = registerListToolsTool;
|
|
4
|
+
const TOOL_CATALOG = {
|
|
5
|
+
"Connection": [
|
|
6
|
+
{
|
|
7
|
+
name: "funifier_connect",
|
|
8
|
+
requiresApi: false,
|
|
9
|
+
description: "Connect to a Funifier instance with API credentials.",
|
|
10
|
+
keyParams: "apiKey, secretKey, serverUrl, name?",
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
"Resource CRUD": [
|
|
14
|
+
{
|
|
15
|
+
name: "funifier_list",
|
|
16
|
+
requiresApi: true,
|
|
17
|
+
description: "List resources of a given type (player, action, challenge, reward, team, etc.).",
|
|
18
|
+
keyParams: "type, filter?, extra?",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "funifier_get",
|
|
22
|
+
requiresApi: true,
|
|
23
|
+
description: "Get a single resource by type and ID.",
|
|
24
|
+
keyParams: "type, id",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "funifier_save",
|
|
28
|
+
requiresApi: true,
|
|
29
|
+
description: "Create or update a resource. Omit _id to create; include _id to update.",
|
|
30
|
+
keyParams: "type, data (JSON)",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "funifier_delete",
|
|
34
|
+
requiresApi: true,
|
|
35
|
+
description: "Delete a resource by type and ID.",
|
|
36
|
+
keyParams: "type, id",
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
"Gamification": [
|
|
40
|
+
{
|
|
41
|
+
name: "funifier_execute",
|
|
42
|
+
requiresApi: true,
|
|
43
|
+
description: "Execute a game action for a player, triggering rules and point calculations.",
|
|
44
|
+
keyParams: "action, player, data?",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "funifier_logs",
|
|
48
|
+
requiresApi: true,
|
|
49
|
+
description: "View activity logs for a player or action, with optional date/page filters.",
|
|
50
|
+
keyParams: "player?, action?, from?, to?, page?",
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
"Database": [
|
|
54
|
+
{
|
|
55
|
+
name: "funifier_database",
|
|
56
|
+
requiresApi: true,
|
|
57
|
+
description: "Run queries, aggregations, and bulk write operations on any MongoDB collection.",
|
|
58
|
+
keyParams: "operation (query|aggregate|insert|update|delete|bulk), collection, ...",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "funifier_index",
|
|
62
|
+
requiresApi: true,
|
|
63
|
+
description: "Manage MongoDB indexes: list existing indexes, create single-field or compound indexes, drop by name.",
|
|
64
|
+
keyParams: "action (list|create|drop), collection, keys?, name?",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "funifier_folder",
|
|
68
|
+
requiresApi: true,
|
|
69
|
+
description: "Manage learning-trail folders: list, create, update, delete, and reorder content.",
|
|
70
|
+
keyParams: "action, ...",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
"Documentation": [
|
|
74
|
+
{
|
|
75
|
+
name: "funifier_search_docs",
|
|
76
|
+
requiresApi: false,
|
|
77
|
+
description: "Full-text search across all Funifier documentation. Returns ranked file paths.",
|
|
78
|
+
keyParams: "query",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "funifier_read_doc",
|
|
82
|
+
requiresApi: false,
|
|
83
|
+
description: "Read a documentation file by path (use paths returned by funifier_search_docs).",
|
|
84
|
+
keyParams: "path",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "funifier_list_tools",
|
|
88
|
+
requiresApi: false,
|
|
89
|
+
description: "List all tools available in this MCP server, grouped by category, with descriptions and key parameters.",
|
|
90
|
+
keyParams: "(none)",
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
function buildMarkdownTable(entries) {
|
|
95
|
+
const rows = entries.map((e) => `| \`${e.name}\` | ${e.requiresApi ? "yes" : "no"} | ${e.description} | \`${e.keyParams}\` |`);
|
|
96
|
+
return [
|
|
97
|
+
"| Tool | API? | Description | Key params |",
|
|
98
|
+
"|------|------|-------------|------------|",
|
|
99
|
+
...rows,
|
|
100
|
+
].join("\n");
|
|
101
|
+
}
|
|
102
|
+
function buildText() {
|
|
103
|
+
const sections = [];
|
|
104
|
+
let total = 0;
|
|
105
|
+
for (const [category, entries] of Object.entries(TOOL_CATALOG)) {
|
|
106
|
+
total += entries.length;
|
|
107
|
+
sections.push(`### ${category}\n\n${buildMarkdownTable(entries)}`);
|
|
108
|
+
}
|
|
109
|
+
return [
|
|
110
|
+
`## Funifier MCP Tools (${total} available)\n`,
|
|
111
|
+
`> **API?** — whether \`funifier_connect\` (or \`funifier.json\` / env vars) is required before calling this tool.\n`,
|
|
112
|
+
...sections,
|
|
113
|
+
].join("\n");
|
|
114
|
+
}
|
|
115
|
+
function registerListToolsTool(server) {
|
|
116
|
+
server.registerTool("funifier_list_tools", {
|
|
117
|
+
title: "List Funifier MCP Tools",
|
|
118
|
+
description: "Returns the full catalog of tools exposed by this MCP server, organized by category. " +
|
|
119
|
+
"Each entry shows the tool name, whether it requires an active API connection, a short description, and its key parameters. " +
|
|
120
|
+
"Call this when you are unsure which tool to use for a task.",
|
|
121
|
+
inputSchema: {},
|
|
122
|
+
annotations: {
|
|
123
|
+
readOnlyHint: true,
|
|
124
|
+
destructiveHint: false,
|
|
125
|
+
idempotentHint: true,
|
|
126
|
+
openWorldHint: false,
|
|
127
|
+
},
|
|
128
|
+
}, async () => ({
|
|
129
|
+
content: [{ type: "text", text: buildText() }],
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=list-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const list_tools_1 = require("./list-tools");
|
|
5
|
+
function makeInvoke() {
|
|
6
|
+
let handler;
|
|
7
|
+
const server = {
|
|
8
|
+
registerTool: (_name, _config, h) => {
|
|
9
|
+
handler = h;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
(0, list_tools_1.registerListToolsTool)(server);
|
|
13
|
+
return { invoke: () => handler() };
|
|
14
|
+
}
|
|
15
|
+
(0, vitest_1.describe)("funifier_list_tools", () => {
|
|
16
|
+
(0, vitest_1.it)("returns a non-empty text response", async () => {
|
|
17
|
+
const { invoke } = makeInvoke();
|
|
18
|
+
const result = await invoke();
|
|
19
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
20
|
+
(0, vitest_1.expect)(result.content[0].text).toBeTruthy();
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)("lists all 13 tools", async () => {
|
|
23
|
+
const { invoke } = makeInvoke();
|
|
24
|
+
const { content } = await invoke();
|
|
25
|
+
const text = content[0].text;
|
|
26
|
+
const toolNames = [
|
|
27
|
+
"funifier_connect",
|
|
28
|
+
"funifier_list",
|
|
29
|
+
"funifier_get",
|
|
30
|
+
"funifier_save",
|
|
31
|
+
"funifier_delete",
|
|
32
|
+
"funifier_execute",
|
|
33
|
+
"funifier_logs",
|
|
34
|
+
"funifier_database",
|
|
35
|
+
"funifier_index",
|
|
36
|
+
"funifier_folder",
|
|
37
|
+
"funifier_list_tools",
|
|
38
|
+
"funifier_search_docs",
|
|
39
|
+
"funifier_read_doc",
|
|
40
|
+
];
|
|
41
|
+
for (const name of toolNames) {
|
|
42
|
+
(0, vitest_1.expect)(text).toContain(name);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)("groups tools by category", async () => {
|
|
46
|
+
const { invoke } = makeInvoke();
|
|
47
|
+
const { content } = await invoke();
|
|
48
|
+
const text = content[0].text;
|
|
49
|
+
(0, vitest_1.expect)(text).toContain("Connection");
|
|
50
|
+
(0, vitest_1.expect)(text).toContain("Resource CRUD");
|
|
51
|
+
(0, vitest_1.expect)(text).toContain("Gamification");
|
|
52
|
+
(0, vitest_1.expect)(text).toContain("Database");
|
|
53
|
+
(0, vitest_1.expect)(text).toContain("Documentation");
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)("indicates which tools require an API connection", async () => {
|
|
56
|
+
const { invoke } = makeInvoke();
|
|
57
|
+
const { content } = await invoke();
|
|
58
|
+
const text = content[0].text;
|
|
59
|
+
(0, vitest_1.expect)(text).toContain("API?");
|
|
60
|
+
(0, vitest_1.expect)(text).toContain("yes");
|
|
61
|
+
(0, vitest_1.expect)(text).toContain("no");
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)("includes key parameters for each tool", async () => {
|
|
64
|
+
const { invoke } = makeInvoke();
|
|
65
|
+
const { content } = await invoke();
|
|
66
|
+
const text = content[0].text;
|
|
67
|
+
(0, vitest_1.expect)(text).toContain("apiKey");
|
|
68
|
+
(0, vitest_1.expect)(text).toContain("query");
|
|
69
|
+
(0, vitest_1.expect)(text).toContain("collection");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=list-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAE9C,6CAAqD;AAErD,SAAS,UAAU;IACjB,IAAI,OAA2B,CAAC;IAChC,MAAM,MAAM,GAAG;QACb,YAAY,EAAE,CAAC,KAAa,EAAE,OAAY,EAAE,CAAiB,EAAE,EAAE;YAC/D,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;KACsB,CAAC;IAC1B,IAAA,kCAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QAC9B,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,MAAM,SAAS,GAAG;YAChB,kBAAkB;YAClB,eAAe;YACf,cAAc;YACd,eAAe;YACf,iBAAiB;YACjB,kBAAkB;YAClB,eAAe;YACf,mBAAmB;YACnB,gBAAgB;YAChB,iBAAiB;YACjB,qBAAqB;YACrB,sBAAsB;YACtB,mBAAmB;SACpB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACxC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-docs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"search-docs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QA0EzE"}
|
|
@@ -77,7 +77,12 @@ function registerSearchDocsTool(server, docsPath) {
|
|
|
77
77
|
const index = loadIndex();
|
|
78
78
|
if (!index) {
|
|
79
79
|
return {
|
|
80
|
-
content: [{
|
|
80
|
+
content: [{
|
|
81
|
+
type: "text",
|
|
82
|
+
text: `Documentation search index not found at: ${indexPath}. ` +
|
|
83
|
+
`If running as an installed package, check that FUNIFIER_DOCS_PATH is set to a valid docs directory ` +
|
|
84
|
+
`or run 'funifier-mcp init' to regenerate the configuration.`,
|
|
85
|
+
}],
|
|
81
86
|
isError: true,
|
|
82
87
|
};
|
|
83
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wDA0EC;AAhFD,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;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4CAA4C,SAAS,IAAI;4BAC7D,qGAAqG;4BACrG,6DAA6D;qBAChE,CAAC;gBACF,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,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxE,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAChE,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,6FAA6F,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI;iBAC3O,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -86,9 +86,12 @@ function invokeWith(dp) {
|
|
|
86
86
|
});
|
|
87
87
|
(0, vitest_1.it)("returns isError when the search index is missing", () => {
|
|
88
88
|
const emptyRoot = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-noindex-"));
|
|
89
|
-
const
|
|
89
|
+
const docsPath = path.join(emptyRoot, "knowledge");
|
|
90
|
+
const result = invokeWith(docsPath)({ query: "trigger" });
|
|
90
91
|
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
91
|
-
(0, vitest_1.expect)(result.content[0].text).toContain("
|
|
92
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("not found");
|
|
93
|
+
// The error message must include the actual path so it's actionable in MCP logs.
|
|
94
|
+
(0, vitest_1.expect)(result.content[0].text).toContain(emptyRoot);
|
|
92
95
|
fs.rmSync(emptyRoot, { recursive: true, force: true });
|
|
93
96
|
});
|
|
94
97
|
(0, vitest_1.it)("reports no matches for an unrelated query", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-docs.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.test.ts"],"names":[],"mappings":"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
|
|
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.3.
|
|
3
|
+
"version": "0.3.5",
|
|
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",
|
|
@@ -72,4 +72,4 @@
|
|
|
72
72
|
"engines": {
|
|
73
73
|
"node": ">=18"
|
|
74
74
|
}
|
|
75
|
-
}
|
|
75
|
+
}
|
package/skills/funifier/SKILL.md
CHANGED
|
@@ -65,6 +65,7 @@ Then read a result with `funifier_read_doc path=<path>`.
|
|
|
65
65
|
| Configure Funifier security settings — roles, scopes, app tokens, and auth parameters; use when setting up access control, fixing missing database scope errors, or configuring token expiry; not for writing frontend login code (use funifier-implement-frontend) | `references/configure-security.md` |
|
|
66
66
|
| Import or export Funifier platform data via CSV — bulk player import, performance export, and cross-system data migration; use when loading or extracting large datasets, not for individual record CRUD or media file uploads (use funifier-upload-file) | `references/import-csv.md` |
|
|
67
67
|
| Upload files to Funifier — images and documents for player avatars, challenge resources, and visual assets; use when adding media to the platform, not for CSV data import (use funifier-import-csv) or static frontend hosting (use funifier-implement-frontend) | `references/upload-file.md` |
|
|
68
|
+
| Create, list, and drop MongoDB indexes on Funifier collections — optimize query performance with single-field or compound indexes | `references/manage-indexes.md` |
|
|
68
69
|
|
|
69
70
|
## Documented Modules
|
|
70
71
|
|
|
@@ -84,7 +85,21 @@ Then read a result with `funifier_read_doc path=<path>`.
|
|
|
84
85
|
|
|
85
86
|
## MCP
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
| Tool | Use for |
|
|
89
|
+
|------|---------|
|
|
90
|
+
| `funifier_connect` | Connect to a Funifier instance |
|
|
91
|
+
| `funifier_list` | List resources by type (always add `search` parameter) |
|
|
92
|
+
| `funifier_get` | Fetch a resource with full details |
|
|
93
|
+
| `funifier_save` | Create or update a resource |
|
|
94
|
+
| `funifier_delete` | Delete a resource |
|
|
95
|
+
| `funifier_execute` | Run schedulers, aggregates, or public endpoints |
|
|
96
|
+
| `funifier_logs` | Execution logs for triggers and schedulers |
|
|
97
|
+
| `funifier_database` | CRUD and aggregation on any MongoDB collection |
|
|
98
|
+
| `funifier_index` | Create, list, and drop MongoDB indexes on a collection |
|
|
99
|
+
| `funifier_folder` | Manage learning-trail folders and content |
|
|
100
|
+
| `funifier_search_docs` | Find relevant documentation for a query |
|
|
101
|
+
| `funifier_read_doc` | Read a documentation file by path |
|
|
102
|
+
| `funifier_list_tools` | List all available MCP tools with descriptions and key params |
|
|
103
|
+
|
|
104
|
+
- Use MCP for live server data; use docs for correct patterns and syntax
|
|
90
105
|
- Never learn patterns from existing live resources — docs are authoritative
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# funifier-manage-indexes
|
|
2
|
+
|
|
3
|
+
Create, list, and drop MongoDB indexes on Funifier collections — optimize query performance with single-field or compound indexes
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Before starting — find relevant docs
|
|
8
|
+
|
|
9
|
+
Use the `funifier_search_docs` MCP tool to load only what you need:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
funifier_search_docs "index indexes mongodb createIndex compound unique sparse performance database funifier_index"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Then read the most relevant results with `funifier_read_doc path=<path>`.
|
|
16
|
+
|
|
17
|
+
## Primary docs for this skill
|
|
18
|
+
|
|
19
|
+
If search returns insufficient results, read these directly:
|
|
20
|
+
|
|
21
|
+
- `funifier_read_doc path=modules/database`
|
|
22
|
+
|
|
23
|
+
## Steps
|
|
24
|
+
|
|
25
|
+
## Tool
|
|
26
|
+
|
|
27
|
+
Use `funifier_index` (not `funifier_database`) for all index operations.
|
|
28
|
+
|
|
29
|
+
## Actions
|
|
30
|
+
|
|
31
|
+
### List indexes
|
|
32
|
+
```
|
|
33
|
+
funifier_index action=list collection=<collection>
|
|
34
|
+
```
|
|
35
|
+
Always list first to avoid creating duplicate indexes.
|
|
36
|
+
|
|
37
|
+
### Create index
|
|
38
|
+
|
|
39
|
+
Single-field ascending:
|
|
40
|
+
```
|
|
41
|
+
funifier_index action=create collection=<collection> keys='{"<field>": 1}'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Single-field descending:
|
|
45
|
+
```
|
|
46
|
+
funifier_index action=create collection=<collection> keys='{"<field>": -1}'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Compound (multiple fields):
|
|
50
|
+
```
|
|
51
|
+
funifier_index action=create collection=<collection> keys='{"<field1>": 1, "<field2>": -1}'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
MongoDB names the index automatically: `<field>_1`, `<field1>_1_<field2>_-1`, etc.
|
|
55
|
+
|
|
56
|
+
### Drop index
|
|
57
|
+
```
|
|
58
|
+
funifier_index action=drop collection=<collection> name=<index-name>
|
|
59
|
+
```
|
|
60
|
+
Get the index name from `action=list`. The `_id_` index cannot be dropped.
|
|
61
|
+
|
|
62
|
+
## Rules
|
|
63
|
+
|
|
64
|
+
- **Check before creating** — always run `action=list` first to avoid duplicates
|
|
65
|
+
- **Direction** must be `1` (ascending) or `-1` (descending)
|
|
66
|
+
- **Compound indexes** follow MongoDB prefix rules: an index on `{a,b}` also serves queries on `{a}` alone
|
|
67
|
+
- **Scope** — the API token must have `database` in its scope
|
|
68
|
+
- **Collection min length** — collection name must be at least 1 character
|
|
69
|
+
|
|
70
|
+
## Common indexes
|
|
71
|
+
|
|
72
|
+
| Use case | keys |
|
|
73
|
+
|----------|------|
|
|
74
|
+
| Lookup by field | `{"<field>": 1}` |
|
|
75
|
+
| Sort by time desc | `{"time": -1}` |
|
|
76
|
+
| Player + time | `{"player": 1, "time": -1}` |
|
|
77
|
+
| Unique email | `{"email": 1}` (uniqueness enforced by MongoDB, not this API) |
|