funifier-mcp 0.3.1 → 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 -90
- 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
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAwCtF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAmH3D"}
|
|
@@ -7,22 +7,40 @@ exports.registerResources = registerResources;
|
|
|
7
7
|
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
|
+
// Resolve docsPath using: explicit env var → bundled package paths → cwd fallback.
|
|
11
|
+
// Emits a console.error for each invalid/stale path so the failure is visible in MCP logs.
|
|
12
|
+
function resolveDocsPath() {
|
|
13
|
+
const envPath = process.env.FUNIFIER_DOCS_PATH;
|
|
14
|
+
if (envPath) {
|
|
15
|
+
if (fs_1.default.existsSync(envPath))
|
|
16
|
+
return envPath;
|
|
17
|
+
console.error(`[funifier-mcp] FUNIFIER_DOCS_PATH="${envPath}" does not exist. ` +
|
|
18
|
+
`Falling back to auto-resolution. Run 'funifier-mcp init' to update the config.`);
|
|
19
|
+
}
|
|
20
|
+
// Auto-resolve from __dirname:
|
|
21
|
+
// bundle (dist/mcp/bundle.js) → __dirname is dist/mcp/ → 2 levels up to package root
|
|
22
|
+
// compiled (dist/mcp/resources/*.js) → __dirname is dist/mcp/resources/ → 3 levels up
|
|
23
|
+
const candidates = [
|
|
24
|
+
path_1.default.join(__dirname, "..", "..", "datasource-funifier-docs", "knowledge"),
|
|
25
|
+
path_1.default.join(__dirname, "..", "..", "..", "datasource-funifier-docs", "knowledge"),
|
|
26
|
+
path_1.default.join(__dirname, "..", "..", "doc", "knowledge"),
|
|
27
|
+
path_1.default.join(__dirname, "..", "..", "..", "doc", "knowledge"),
|
|
28
|
+
];
|
|
29
|
+
for (const candidate of candidates) {
|
|
30
|
+
if (fs_1.default.existsSync(candidate))
|
|
31
|
+
return candidate;
|
|
32
|
+
}
|
|
33
|
+
// Last resort: backward-compat with old init that copied docs to the project root.
|
|
34
|
+
const cwdFallback = path_1.default.join(process.cwd(), "datasource-funifier-docs", "knowledge");
|
|
35
|
+
if (!fs_1.default.existsSync(cwdFallback)) {
|
|
36
|
+
console.error(`[funifier-mcp] Documentation directory not found. Tried: ${[...candidates, cwdFallback].join(", ")}. ` +
|
|
37
|
+
`Tools funifier_search_docs and funifier_read_doc will not work. ` +
|
|
38
|
+
`Set FUNIFIER_DOCS_PATH or run 'funifier-mcp init' to fix.`);
|
|
39
|
+
}
|
|
40
|
+
return cwdFallback;
|
|
41
|
+
}
|
|
10
42
|
function registerResources(server) {
|
|
11
|
-
|
|
12
|
-
// this file (the project root in dev, node_modules/funifier-mcp/ when installed as a package).
|
|
13
|
-
// When running from compiled dist/mcp/resources/documentation.js: __dirname is dist/mcp/resources/ (3 levels up)
|
|
14
|
-
// When running from esbuild bundle dist/mcp/bundle.js: __dirname is dist/mcp/ (2 levels up)
|
|
15
|
-
// Try both paths for datasource-funifier-docs, then fall back to legacy doc/knowledge for published package.
|
|
16
|
-
const threeUp = path_1.default.join(__dirname, "..", "..", "..", "datasource-funifier-docs", "knowledge");
|
|
17
|
-
const twoUp = path_1.default.join(__dirname, "..", "..", "datasource-funifier-docs", "knowledge");
|
|
18
|
-
const legacyThreeUp = path_1.default.join(__dirname, "..", "..", "..", "doc", "knowledge");
|
|
19
|
-
const legacyTwoUp = path_1.default.join(__dirname, "..", "..", "doc", "knowledge");
|
|
20
|
-
const bundledDocsPath = fs_1.default.existsSync(twoUp) ? twoUp
|
|
21
|
-
: fs_1.default.existsSync(threeUp) ? threeUp
|
|
22
|
-
: fs_1.default.existsSync(legacyTwoUp) ? legacyTwoUp
|
|
23
|
-
: legacyThreeUp;
|
|
24
|
-
const docsPath = process.env.FUNIFIER_DOCS_PATH ||
|
|
25
|
-
(fs_1.default.existsSync(bundledDocsPath) ? bundledDocsPath : path_1.default.join(process.cwd(), "datasource-funifier-docs", "knowledge"));
|
|
43
|
+
const docsPath = resolveDocsPath();
|
|
26
44
|
const docCache = new Map();
|
|
27
45
|
const docMetaCache = new Map();
|
|
28
46
|
function readCached(filePath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentation.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
function makeStubServer() {
|
|
41
|
+
return {
|
|
42
|
+
resource: () => { },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Re-import registerResources fresh each time so resolveDocsPath() re-evaluates env vars.
|
|
46
|
+
async function importRegisterResources() {
|
|
47
|
+
vitest_1.vi.resetModules();
|
|
48
|
+
const mod = await import("./documentation.js");
|
|
49
|
+
return mod.registerResources;
|
|
50
|
+
}
|
|
51
|
+
(0, vitest_1.describe)("registerResources — docsPath resolution", () => {
|
|
52
|
+
const originalEnv = process.env.FUNIFIER_DOCS_PATH;
|
|
53
|
+
let tmpDir;
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
let errSpy;
|
|
56
|
+
(0, vitest_1.beforeEach)(() => {
|
|
57
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-doctest-"));
|
|
58
|
+
errSpy = vitest_1.vi.spyOn(console, "error").mockImplementation(() => { });
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.afterEach)(() => {
|
|
61
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
62
|
+
if (originalEnv === undefined) {
|
|
63
|
+
delete process.env.FUNIFIER_DOCS_PATH;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.env.FUNIFIER_DOCS_PATH = originalEnv;
|
|
67
|
+
}
|
|
68
|
+
vitest_1.vi.restoreAllMocks();
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)("uses FUNIFIER_DOCS_PATH when it points to an existing directory", async () => {
|
|
71
|
+
const docsDir = path.join(tmpDir, "knowledge");
|
|
72
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
|
73
|
+
process.env.FUNIFIER_DOCS_PATH = docsDir;
|
|
74
|
+
const registerResources = await importRegisterResources();
|
|
75
|
+
const returned = registerResources(makeStubServer());
|
|
76
|
+
(0, vitest_1.expect)(returned).toBe(docsDir);
|
|
77
|
+
(0, vitest_1.expect)(errSpy).not.toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)("emits console.error and falls back when FUNIFIER_DOCS_PATH does not exist", async () => {
|
|
80
|
+
const stalePath = path.join(tmpDir, "this-does-not-exist", "knowledge");
|
|
81
|
+
process.env.FUNIFIER_DOCS_PATH = stalePath;
|
|
82
|
+
const registerResources = await importRegisterResources();
|
|
83
|
+
registerResources(makeStubServer());
|
|
84
|
+
const firstCall = errSpy.mock.calls[0]?.[0];
|
|
85
|
+
(0, vitest_1.expect)(firstCall).toBeDefined();
|
|
86
|
+
(0, vitest_1.expect)(firstCall).toContain(stalePath);
|
|
87
|
+
(0, vitest_1.expect)(firstCall).toContain("does not exist");
|
|
88
|
+
(0, vitest_1.expect)(firstCall).toContain("funifier-mcp init");
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("falls back away from stale FUNIFIER_DOCS_PATH and does not return the stale path", async () => {
|
|
91
|
+
const stalePath = path.join(tmpDir, "ghost", "knowledge");
|
|
92
|
+
process.env.FUNIFIER_DOCS_PATH = stalePath;
|
|
93
|
+
const registerResources = await importRegisterResources();
|
|
94
|
+
const returned = registerResources(makeStubServer());
|
|
95
|
+
(0, vitest_1.expect)(returned).not.toBe(stalePath);
|
|
96
|
+
(0, vitest_1.expect)(errSpy.mock.calls.some((c) => c[0].includes(stalePath))).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=documentation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentation.test.js","sourceRoot":"","sources":["../../../src/mcp/resources/documentation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAsJxE"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerIndexTool = registerIndexTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
function registerIndexTool(server, apiHolder) {
|
|
6
|
+
server.registerTool("funifier_index", {
|
|
7
|
+
title: "Funifier MongoDB Index Manager",
|
|
8
|
+
description: "Manage MongoDB indexes on Funifier database collections. " +
|
|
9
|
+
"Use 'list' to inspect existing indexes before creating new ones — avoid duplicates. " +
|
|
10
|
+
"Use 'create' to add a single-field or compound index. " +
|
|
11
|
+
"Use 'drop' to remove an index by its name (get the name from 'list'). " +
|
|
12
|
+
"Requires the API connection to have 'database' in its scope.",
|
|
13
|
+
inputSchema: {
|
|
14
|
+
action: zod_1.z
|
|
15
|
+
.enum(["list", "create", "drop"])
|
|
16
|
+
.describe("'list' — GET /database/{collection}/index, returns all index definitions. " +
|
|
17
|
+
"'create' — POST /database/{collection}/index with the 'keys' field spec; returns updated index list. " +
|
|
18
|
+
"'drop' — DELETE /database/{collection}/index/{name}; requires 'name' (the index name from 'list')."),
|
|
19
|
+
collection: zod_1.z
|
|
20
|
+
.string()
|
|
21
|
+
.describe("Collection name (e.g. 'player', 'action_log', 'videos__c'). Required for all actions."),
|
|
22
|
+
keys: zod_1.z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("For action='create' only. JSON object mapping field names to sort direction: " +
|
|
26
|
+
"1 = ascending, -1 = descending. " +
|
|
27
|
+
"Single-field: '{\"email\": 1}'. " +
|
|
28
|
+
"Compound: '{\"team\": 1, \"score\": -1}'. " +
|
|
29
|
+
"MongoDB names the index automatically (e.g. 'email_1', 'team_1_score_-1')."),
|
|
30
|
+
name: zod_1.z
|
|
31
|
+
.string()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("For action='drop' only. Exact index name as returned by 'list' (e.g. 'email_1'). " +
|
|
34
|
+
"The '_id_' index cannot be dropped."),
|
|
35
|
+
},
|
|
36
|
+
annotations: {
|
|
37
|
+
readOnlyHint: false,
|
|
38
|
+
destructiveHint: true,
|
|
39
|
+
idempotentHint: false,
|
|
40
|
+
openWorldHint: true,
|
|
41
|
+
},
|
|
42
|
+
}, async ({ action, collection, keys, name }) => {
|
|
43
|
+
try {
|
|
44
|
+
const api = apiHolder.requireClient();
|
|
45
|
+
if (action === "list") {
|
|
46
|
+
const indexes = await api.listIndexes(collection);
|
|
47
|
+
if (indexes.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: "text", text: `No indexes found on '${collection}' (or collection does not exist).` }],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
content: [{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: `Indexes on '${collection}' (${indexes.length}):\n\n${JSON.stringify(indexes, null, 2)}`,
|
|
56
|
+
}],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (action === "create") {
|
|
60
|
+
if (!keys) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: "Error: 'keys' is required for action='create'. Example: '{\"email\": 1}'" }],
|
|
63
|
+
isError: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
let spec;
|
|
67
|
+
try {
|
|
68
|
+
spec = JSON.parse(keys);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return {
|
|
72
|
+
content: [{ type: "text", text: `Error: 'keys' is not valid JSON: ${keys}` }],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const fieldNames = Object.keys(spec);
|
|
77
|
+
if (fieldNames.length === 0) {
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: "text", text: "Error: 'keys' must contain at least one field." }],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const invalidDirections = fieldNames.filter((f) => spec[f] !== 1 && spec[f] !== -1);
|
|
84
|
+
if (invalidDirections.length > 0) {
|
|
85
|
+
return {
|
|
86
|
+
content: [{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: `Error: direction must be 1 (ascending) or -1 (descending). Invalid: ${JSON.stringify(Object.fromEntries(invalidDirections.map((f) => [f, spec[f]])))}`,
|
|
89
|
+
}],
|
|
90
|
+
isError: true,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const indexes = await api.createIndex(collection, spec);
|
|
94
|
+
const indexName = fieldNames.map((f) => `${f}_${spec[f]}`).join("_");
|
|
95
|
+
return {
|
|
96
|
+
content: [{
|
|
97
|
+
type: "text",
|
|
98
|
+
text: `Index created on '${collection}' (expected name: '${indexName}').\n\n` +
|
|
99
|
+
`Current indexes (${indexes.length}):\n\n${JSON.stringify(indexes, null, 2)}`,
|
|
100
|
+
}],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (action === "drop") {
|
|
104
|
+
if (!name) {
|
|
105
|
+
return {
|
|
106
|
+
content: [{ type: "text", text: "Error: 'name' is required for action='drop'. Use action='list' to see index names." }],
|
|
107
|
+
isError: true,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (name === "_id_") {
|
|
111
|
+
return {
|
|
112
|
+
content: [{ type: "text", text: "Error: the '_id_' index cannot be dropped." }],
|
|
113
|
+
isError: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const result = await api.dropIndex(collection, name);
|
|
117
|
+
return {
|
|
118
|
+
content: [{
|
|
119
|
+
type: "text",
|
|
120
|
+
text: `Index '${name}' dropped from '${collection}'.\n\n${JSON.stringify(result, null, 2)}`,
|
|
121
|
+
}],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: `Unknown action: ${action}` }],
|
|
126
|
+
isError: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: "text", text: `Error in funifier_index ${action} on '${collection}': ${error.message}` }],
|
|
132
|
+
isError: true,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=index-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const index_manager_1 = require("./index-manager");
|
|
5
|
+
const SAMPLE_INDEXES = [
|
|
6
|
+
{ name: "_id_", key: { _id: 1 }, unique: true },
|
|
7
|
+
{ name: "email_1", key: { email: 1 } },
|
|
8
|
+
];
|
|
9
|
+
function makeServer() {
|
|
10
|
+
let handler;
|
|
11
|
+
const server = {
|
|
12
|
+
registerTool: (_name, _config, h) => { handler = h; },
|
|
13
|
+
};
|
|
14
|
+
(0, index_manager_1.registerIndexTool)(server, makeApiHolder());
|
|
15
|
+
return {
|
|
16
|
+
server,
|
|
17
|
+
invoke: (args) => handler(args),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function makeApiHolder(overrides = {}) {
|
|
21
|
+
const api = { ...fakeApi(), ...overrides };
|
|
22
|
+
return {
|
|
23
|
+
requireClient: () => api,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function fakeApi() {
|
|
27
|
+
return {
|
|
28
|
+
listIndexes: vitest_1.vi.fn().mockResolvedValue(SAMPLE_INDEXES),
|
|
29
|
+
createIndex: vitest_1.vi.fn().mockResolvedValue([...SAMPLE_INDEXES, { name: "score_-1", key: { score: -1 } }]),
|
|
30
|
+
dropIndex: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Rebuild the handler pointing at a custom apiHolder
|
|
34
|
+
function makeInvoke(overrides = {}) {
|
|
35
|
+
const api = { ...fakeApi(), ...overrides };
|
|
36
|
+
const holder = { requireClient: () => api };
|
|
37
|
+
let handler;
|
|
38
|
+
const server = {
|
|
39
|
+
registerTool: (_name, _config, h) => { handler = h; },
|
|
40
|
+
};
|
|
41
|
+
(0, index_manager_1.registerIndexTool)(server, holder);
|
|
42
|
+
return { invoke: (args) => handler(args), api };
|
|
43
|
+
}
|
|
44
|
+
(0, vitest_1.describe)("funifier_index", () => {
|
|
45
|
+
(0, vitest_1.describe)("action=list", () => {
|
|
46
|
+
(0, vitest_1.it)("returns formatted index list", async () => {
|
|
47
|
+
const { invoke } = makeInvoke();
|
|
48
|
+
const result = await invoke({ action: "list", collection: "player" });
|
|
49
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
50
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("email_1");
|
|
51
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("2");
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)("returns a message when no indexes found", async () => {
|
|
54
|
+
const { invoke } = makeInvoke({ listIndexes: vitest_1.vi.fn().mockResolvedValue([]) });
|
|
55
|
+
const result = await invoke({ action: "list", collection: "empty_collection" });
|
|
56
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
57
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("No indexes found");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.describe)("action=create", () => {
|
|
61
|
+
(0, vitest_1.it)("creates a single-field ascending index", async () => {
|
|
62
|
+
const { invoke, api } = makeInvoke();
|
|
63
|
+
const result = await invoke({ action: "create", collection: "player", keys: '{"email": 1}' });
|
|
64
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
65
|
+
(0, vitest_1.expect)(api.createIndex).toHaveBeenCalledWith("player", { email: 1 });
|
|
66
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("email_1");
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)("creates a compound index", async () => {
|
|
69
|
+
const { invoke, api } = makeInvoke();
|
|
70
|
+
await invoke({ action: "create", collection: "action_log", keys: '{"player": 1, "time": -1}' });
|
|
71
|
+
(0, vitest_1.expect)(api.createIndex).toHaveBeenCalledWith("action_log", { player: 1, time: -1 });
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.it)("returns isError when keys is missing", async () => {
|
|
74
|
+
const { invoke } = makeInvoke();
|
|
75
|
+
const result = await invoke({ action: "create", collection: "player" });
|
|
76
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
77
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("'keys' is required");
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)("returns isError when keys is invalid JSON", async () => {
|
|
80
|
+
const { invoke } = makeInvoke();
|
|
81
|
+
const result = await invoke({ action: "create", collection: "player", keys: "not-json" });
|
|
82
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
83
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("not valid JSON");
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)("returns isError when direction is not 1 or -1", async () => {
|
|
86
|
+
const { invoke } = makeInvoke();
|
|
87
|
+
const result = await invoke({ action: "create", collection: "player", keys: '{"email": 2}' });
|
|
88
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
89
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("direction must be");
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.it)("returns isError when keys object is empty", async () => {
|
|
92
|
+
const { invoke } = makeInvoke();
|
|
93
|
+
const result = await invoke({ action: "create", collection: "player", keys: "{}" });
|
|
94
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
95
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("at least one field");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.describe)("action=drop", () => {
|
|
99
|
+
(0, vitest_1.it)("drops an index by name", async () => {
|
|
100
|
+
const { invoke, api } = makeInvoke();
|
|
101
|
+
const result = await invoke({ action: "drop", collection: "player", name: "email_1" });
|
|
102
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
103
|
+
(0, vitest_1.expect)(api.dropIndex).toHaveBeenCalledWith("player", "email_1");
|
|
104
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("email_1");
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.it)("returns isError when name is missing", async () => {
|
|
107
|
+
const { invoke } = makeInvoke();
|
|
108
|
+
const result = await invoke({ action: "drop", collection: "player" });
|
|
109
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
110
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("'name' is required");
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)("refuses to drop the _id_ index", async () => {
|
|
113
|
+
const { invoke } = makeInvoke();
|
|
114
|
+
const result = await invoke({ action: "drop", collection: "player", name: "_id_" });
|
|
115
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
116
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("cannot be dropped");
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
(0, vitest_1.describe)("error handling", () => {
|
|
120
|
+
(0, vitest_1.it)("returns isError when the API throws", async () => {
|
|
121
|
+
const { invoke } = makeInvoke({
|
|
122
|
+
createIndex: vitest_1.vi.fn().mockRejectedValue(new Error("connection refused")),
|
|
123
|
+
});
|
|
124
|
+
const result = await invoke({ action: "create", collection: "player", keys: '{"email": 1}' });
|
|
125
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
126
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("connection refused");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=index-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.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;
|
|
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;AAuC1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAiBtF"}
|
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"}
|