funifier-mcp 0.2.4 → 0.2.8
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 +2 -2
- package/.github/copilot-instructions.md +1 -1
- package/AGENTS.md +3 -3
- package/README.md +109 -190
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/prompts.d.ts +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +57 -2
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/search.d.ts +2 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +93 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/core/lexical.d.ts +22 -0
- package/dist/core/lexical.d.ts.map +1 -0
- package/dist/core/lexical.js +79 -0
- package/dist/core/lexical.js.map +1 -0
- package/dist/mcp/bundle.js +88 -81
- package/dist/mcp/index.js +9 -3
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +33 -21
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.d.ts +2 -0
- package/dist/mcp/tools/database.test.d.ts.map +1 -0
- package/dist/mcp/tools/database.test.js +96 -0
- package/dist/mcp/tools/database.test.js.map +1 -0
- package/package.json +2 -2
- package/skills/funifier-create-action/SKILL.md +1 -1
- package/skills/funifier-create-aggregate/SKILL.md +1 -1
- package/skills/funifier-create-challenge/SKILL.md +1 -1
- package/skills/funifier-create-custom-page/SKILL.md +1 -1
- package/skills/funifier-create-leaderboard/SKILL.md +1 -1
- package/skills/funifier-create-level/SKILL.md +1 -1
- package/skills/funifier-create-point/SKILL.md +1 -1
- package/skills/funifier-create-quiz/SKILL.md +1 -1
- package/skills/funifier-create-scheduler/SKILL.md +1 -1
- package/skills/funifier-create-trigger/SKILL.md +1 -1
- package/skills/funifier-create-virtual-good/SKILL.md +1 -1
- package/skills/funifier-debug/SKILL.md +1 -1
- package/skills/funifier-help/SKILL.md +1 -1
- package/skills/funifier-implement-frontend/SKILL.md +1 -1
- package/skills/funifier-index/SKILL.md +1 -1
package/dist/mcp/index.js
CHANGED
|
@@ -14,6 +14,11 @@ async function main() {
|
|
|
14
14
|
await runInit();
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
+
if (subcommand === "search") {
|
|
18
|
+
const { default: runSearch } = require("../cli/search");
|
|
19
|
+
runSearch();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
17
22
|
if (subcommand === "--version" || subcommand === "-v") {
|
|
18
23
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
19
24
|
const pkg = require("../../package.json");
|
|
@@ -21,9 +26,10 @@ async function main() {
|
|
|
21
26
|
return;
|
|
22
27
|
}
|
|
23
28
|
if (subcommand === "--help" || subcommand === "-h") {
|
|
24
|
-
console.log("Usage: funifier-mcp
|
|
25
|
-
console.log(" funifier-mcp init
|
|
26
|
-
console.log(
|
|
29
|
+
console.log("Usage: funifier-mcp Start the MCP server (stdio)");
|
|
30
|
+
console.log(" funifier-mcp init Interactive setup for AI platforms");
|
|
31
|
+
console.log(' funifier-mcp search "<query>" Search Funifier documentation');
|
|
32
|
+
console.log(" funifier-mcp --version Print version");
|
|
27
33
|
return;
|
|
28
34
|
}
|
|
29
35
|
// Create the API holder (manages connection state)
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +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,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACtD,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,
|
|
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,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QACxD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACtD,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,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,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"}
|
|
@@ -1 +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,
|
|
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,QA0N3E"}
|
|
@@ -3,6 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerDatabaseTool = registerDatabaseTool;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
function registerDatabaseTool(server, apiHolder) {
|
|
6
|
+
const MAX_RESPONSE_CHARS = 50000;
|
|
7
|
+
function applyCharGuard(docs, header) {
|
|
8
|
+
const full = JSON.stringify(docs, null, 2);
|
|
9
|
+
if (full.length <= MAX_RESPONSE_CHARS) {
|
|
10
|
+
return { content: [{ type: "text", text: header + "\n\n" + full }] };
|
|
11
|
+
}
|
|
12
|
+
const kept = [];
|
|
13
|
+
let size = 0;
|
|
14
|
+
for (const doc of docs) {
|
|
15
|
+
const s = JSON.stringify(doc, null, 2);
|
|
16
|
+
if (size + s.length > MAX_RESPONSE_CHARS && kept.length > 0)
|
|
17
|
+
break;
|
|
18
|
+
kept.push(doc);
|
|
19
|
+
size += s.length;
|
|
20
|
+
}
|
|
21
|
+
const truncatedJson = JSON.stringify(kept, null, 2);
|
|
22
|
+
const warning = `\n\n⚠ Result truncated: showing ${kept.length} of ${docs.length} document(s) (response exceeded 50k chars). Use a smaller limit, add query filters, or increase offset to paginate.`;
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: "text", text: header + "\n\n" + truncatedJson + warning }],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
6
27
|
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
28
|
action: zod_1.z
|
|
8
29
|
.enum(["query", "aggregate", "collections", "insert", "update", "delete", "bulk"])
|
|
@@ -28,13 +49,17 @@ function registerDatabaseTool(server, apiHolder) {
|
|
|
28
49
|
limit: zod_1.z
|
|
29
50
|
.number()
|
|
30
51
|
.optional()
|
|
31
|
-
.describe("For action='query': Maximum number of documents to return. Default:
|
|
52
|
+
.describe("For action='query': Maximum number of documents to return. Default: 10."),
|
|
53
|
+
offset: zod_1.z
|
|
54
|
+
.number()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("For action='query': Number of documents to skip for pagination. Default: 0."),
|
|
32
57
|
data: zod_1.z
|
|
33
58
|
.string()
|
|
34
59
|
.optional()
|
|
35
60
|
.describe("For insert/update/bulk: JSON string of document(s). For insert: single object. " +
|
|
36
61
|
"For update: object with _id field. For bulk: array of objects."),
|
|
37
|
-
}, async ({ action, collection, query, pipeline, sort, limit, data }) => {
|
|
62
|
+
}, async ({ action, collection, query, pipeline, sort, limit, offset, data }) => {
|
|
38
63
|
try {
|
|
39
64
|
const api = apiHolder.requireClient();
|
|
40
65
|
if (action === "collections") {
|
|
@@ -59,17 +84,11 @@ function registerDatabaseTool(server, apiHolder) {
|
|
|
59
84
|
const sortObj = sort ? JSON.parse(sort) : undefined;
|
|
60
85
|
const results = await api.queryCollection(collection, queryFilter, {
|
|
61
86
|
sort: sortObj,
|
|
62
|
-
limit: limit
|
|
87
|
+
limit: limit ?? 10,
|
|
88
|
+
skip: offset ?? 0,
|
|
63
89
|
});
|
|
64
90
|
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
|
-
};
|
|
91
|
+
return applyCharGuard(results, header);
|
|
73
92
|
}
|
|
74
93
|
if (action === "aggregate") {
|
|
75
94
|
if (!pipeline) {
|
|
@@ -80,16 +99,9 @@ function registerDatabaseTool(server, apiHolder) {
|
|
|
80
99
|
}
|
|
81
100
|
const pipelineArr = JSON.parse(pipeline);
|
|
82
101
|
const results = await api.aggregateCollection(collection, pipelineArr);
|
|
83
|
-
const
|
|
84
|
-
const header = `Aggregate result (${
|
|
85
|
-
return
|
|
86
|
-
content: [
|
|
87
|
-
{
|
|
88
|
-
type: "text",
|
|
89
|
-
text: header + "\n\n" + JSON.stringify(results, null, 2),
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
};
|
|
102
|
+
const docs = Array.isArray(results) ? results : [results];
|
|
103
|
+
const header = `Aggregate result (${docs.length} document(s)) from '${collection}':`;
|
|
104
|
+
return applyCharGuard(docs, header);
|
|
93
105
|
}
|
|
94
106
|
if (action === "insert") {
|
|
95
107
|
if (!data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/database.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const database_1 = require("./database");
|
|
5
|
+
const MAX_CHARS = 50000;
|
|
6
|
+
function makeHarness(fakeApi) {
|
|
7
|
+
const handlers = {};
|
|
8
|
+
const server = {
|
|
9
|
+
tool: (_name, _desc, _schema, handler) => {
|
|
10
|
+
handlers[_name] = handler;
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
const apiHolder = { requireClient: () => fakeApi };
|
|
14
|
+
(0, database_1.registerDatabaseTool)(server, apiHolder);
|
|
15
|
+
return (args) => handlers["funifier_database"](args);
|
|
16
|
+
}
|
|
17
|
+
(0, vitest_1.describe)("funifier_database query char guard", () => {
|
|
18
|
+
(0, vitest_1.it)("returns full result when under 50k chars", async () => {
|
|
19
|
+
const docs = [{ _id: "1", name: "small" }];
|
|
20
|
+
const fakeApi = { queryCollection: async () => docs };
|
|
21
|
+
const invoke = makeHarness(fakeApi);
|
|
22
|
+
const result = await invoke({ action: "query", collection: "test", limit: 10 });
|
|
23
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
24
|
+
(0, vitest_1.expect)(result.content[0].text).toContain('"_id": "1"');
|
|
25
|
+
(0, vitest_1.expect)(result.content[0].text).not.toContain("truncated");
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)("truncates and warns when result exceeds 50k chars", async () => {
|
|
28
|
+
const bigValue = "x".repeat(30000);
|
|
29
|
+
const docs = [
|
|
30
|
+
{ _id: "1", payload: bigValue },
|
|
31
|
+
{ _id: "2", payload: bigValue },
|
|
32
|
+
];
|
|
33
|
+
const fakeApi = { queryCollection: async () => docs };
|
|
34
|
+
const invoke = makeHarness(fakeApi);
|
|
35
|
+
const result = await invoke({ action: "query", collection: "scheduler", limit: 10 });
|
|
36
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
37
|
+
const text = result.content[0].text;
|
|
38
|
+
(0, vitest_1.expect)(text).toContain("truncated");
|
|
39
|
+
(0, vitest_1.expect)(text).toContain("showing 1");
|
|
40
|
+
(0, vitest_1.expect)(text.length).toBeLessThan(MAX_CHARS + 500);
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)("returns first doc even if single doc exceeds 50k chars", async () => {
|
|
43
|
+
const bigValue = "x".repeat(60000);
|
|
44
|
+
const docs = [{ _id: "1", payload: bigValue }];
|
|
45
|
+
const fakeApi = { queryCollection: async () => docs };
|
|
46
|
+
const invoke = makeHarness(fakeApi);
|
|
47
|
+
const result = await invoke({ action: "query", collection: "scheduler", limit: 1 });
|
|
48
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
49
|
+
(0, vitest_1.expect)(result.content[0].text).toContain('"_id": "1"');
|
|
50
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("truncated");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.describe)("funifier_database aggregate char guard", () => {
|
|
54
|
+
(0, vitest_1.it)("truncates and warns when aggregate result exceeds 50k chars", async () => {
|
|
55
|
+
const bigValue = "x".repeat(30000);
|
|
56
|
+
const docs = [{ _id: "1", data: bigValue }, { _id: "2", data: bigValue }];
|
|
57
|
+
const fakeApi = { aggregateCollection: async () => docs };
|
|
58
|
+
const invoke = makeHarness(fakeApi);
|
|
59
|
+
const result = await invoke({
|
|
60
|
+
action: "aggregate",
|
|
61
|
+
collection: "scheduler",
|
|
62
|
+
pipeline: "[]",
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
65
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("truncated");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.describe)("funifier_database offset", () => {
|
|
69
|
+
(0, vitest_1.it)("passes offset as skip to queryCollection", async () => {
|
|
70
|
+
let capturedOptions = null;
|
|
71
|
+
const fakeApi = {
|
|
72
|
+
queryCollection: async (_col, _q, opts) => {
|
|
73
|
+
capturedOptions = opts;
|
|
74
|
+
return [];
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
const invoke = makeHarness(fakeApi);
|
|
78
|
+
await invoke({ action: "query", collection: "test", limit: 5, offset: 20 });
|
|
79
|
+
(0, vitest_1.expect)(capturedOptions.skip).toBe(20);
|
|
80
|
+
(0, vitest_1.expect)(capturedOptions.limit).toBe(5);
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)("defaults offset to 0 when not provided", async () => {
|
|
83
|
+
let capturedOptions = null;
|
|
84
|
+
const fakeApi = {
|
|
85
|
+
queryCollection: async (_col, _q, opts) => {
|
|
86
|
+
capturedOptions = opts;
|
|
87
|
+
return [];
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
const invoke = makeHarness(fakeApi);
|
|
91
|
+
await invoke({ action: "query", collection: "test" });
|
|
92
|
+
(0, vitest_1.expect)(capturedOptions.skip).toBe(0);
|
|
93
|
+
(0, vitest_1.expect)(capturedOptions.limit).toBe(10);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=database.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.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.
|
|
3
|
+
"version": "0.2.8",
|
|
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",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"build": "tsc",
|
|
35
35
|
"bundle": "npm run build && esbuild dist/mcp/index.js --bundle --outfile=dist/mcp/bundle.js --format=cjs --platform=node --minify",
|
|
36
36
|
"dev": "tsc --watch",
|
|
37
|
-
"prepublishOnly": "npm run bundle",
|
|
37
|
+
"prepublishOnly": "npm run build:skills && npm run bundle",
|
|
38
38
|
"test": "vitest run",
|
|
39
39
|
"test:watch": "vitest watch",
|
|
40
40
|
"build:skills": "tsx scripts/build-skills.ts",
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "action track player behavior attributes log event" --skill funifier-create-action
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -73,7 +73,7 @@ Note que `aggregate` é uma **string** contendo JSON serializado (com `\n` e `\"
|
|
|
73
73
|
Run lexical search to load only what you need:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
npx
|
|
76
|
+
npx funifier-mcp search "aggregate mongodb pipeline report dashboard query prepared" --skill funifier-create-aggregate
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "challenge mission reward rules action points gamification" --skill funifier-create-challenge
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -73,7 +73,7 @@ Note que `aggregate` é uma **string** contendo JSON serializado (com `\n` e `\"
|
|
|
73
73
|
Run lexical search to load only what you need:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
npx
|
|
76
|
+
npx funifier-mcp search "custom page studio dashboard angularjs bootstrap admin crud kpi" --skill funifier-create-custom-page
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "leaderboard ranking score top players classification board" --skill funifier-create-leaderboard
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "level progression rank tier xp points unlock" --skill funifier-create-level
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "point xp coin currency score metric category" --skill funifier-create-point
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "quiz question answer questionnaire multiple choice survey" --skill funifier-create-quiz
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -73,7 +73,7 @@ Note que `aggregate` é uma **string** contendo JSON serializado (com `\n` e `\"
|
|
|
73
73
|
Run lexical search to load only what you need:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
npx
|
|
76
|
+
npx funifier-mcp search "scheduler cron groovy java scheduled job periodic" --skill funifier-create-scheduler
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -73,7 +73,7 @@ Note que `aggregate` é uma **string** contendo JSON serializado (com `\n` e `\"
|
|
|
73
73
|
Run lexical search to load only what you need:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
npx
|
|
76
|
+
npx funifier-mcp search "trigger event groovy java before_create after_win entity script" --skill funifier-create-trigger
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "virtual good item catalog store purchase marketplace shop" --skill funifier-create-virtual-good
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "debug error log exception timeout groovy stack trace fix" --skill funifier-debug
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "help documentation guide module question how what funifier" --skill funifier-help
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -34,7 +34,7 @@ Só então prossiga com a implementação.
|
|
|
34
34
|
Run lexical search to load only what you need:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
npx
|
|
37
|
+
npx funifier-mcp search "frontend api authentication fetch jwt token javascript react angular" --skill funifier-implement-frontend
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
Read only files returned with score > 0.5 (this threshold is printed in the search output).
|
|
@@ -12,7 +12,7 @@ description: Entry point for all Funifier skills — routes to the right skill f
|
|
|
12
12
|
3. For general questions with no matching skill, run lexical search:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
npx
|
|
15
|
+
npx funifier-mcp search "<user question>"
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
## Available Skills
|