funifier-mcp 0.3.7 → 0.3.9
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 -1
- package/.github/copilot-instructions.md +1 -1
- package/AGENTS.md +2 -2
- package/datasource-funifier-docs/.coverage.json +1 -1
- package/datasource-funifier-docs/knowledge/modules/database.md +2 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -0
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.js +36 -0
- package/dist/cli/init.test.js.map +1 -1
- package/dist/mcp/bundle.js +89 -83
- package/dist/mcp/tools/index-manager.d.ts.map +1 -1
- package/dist/mcp/tools/index-manager.js +30 -6
- package/dist/mcp/tools/index-manager.js.map +1 -1
- package/dist/mcp/tools/index-manager.test.js +9 -3
- package/dist/mcp/tools/index-manager.test.js.map +1 -1
- package/dist/mcp/tools/search-docs.d.ts.map +1 -1
- package/dist/mcp/tools/search-docs.js +39 -5
- package/dist/mcp/tools/search-docs.js.map +1 -1
- package/dist/mcp/tools/search-docs.test.js +17 -6
- package/dist/mcp/tools/search-docs.test.js.map +1 -1
- package/package.json +2 -2
- package/skills/funifier/SKILL.md +1 -1
- package/skills/funifier/references/manage-indexes.md +21 -13
|
@@ -1 +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,
|
|
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,QA+KxE"}
|
|
@@ -7,7 +7,10 @@ function registerIndexTool(server, apiHolder) {
|
|
|
7
7
|
title: "Funifier MongoDB Index Manager",
|
|
8
8
|
description: "Manage MongoDB indexes on Funifier database collections. " +
|
|
9
9
|
"Use 'list' to inspect existing indexes before creating new ones — avoid duplicates. " +
|
|
10
|
-
"Use 'create' to add a
|
|
10
|
+
"Use 'create' to add a SINGLE-FIELD index (one key in 'keys'). The Funifier REST API does NOT " +
|
|
11
|
+
"support composite/compound indexes — passing multiple fields is rejected. For a true " +
|
|
12
|
+
"composite index, create it from a Funifier trigger/scheduler/public endpoint using " +
|
|
13
|
+
"manager.getJongoConnection() with a BasicDBObject chained .append() spec. " +
|
|
11
14
|
"Use 'drop' to remove an index by its name (get the name from 'list'). " +
|
|
12
15
|
"Requires the API connection to have 'database' in its scope.",
|
|
13
16
|
inputSchema: {
|
|
@@ -22,11 +25,13 @@ function registerIndexTool(server, apiHolder) {
|
|
|
22
25
|
keys: zod_1.z
|
|
23
26
|
.string()
|
|
24
27
|
.optional()
|
|
25
|
-
.describe("For action='create' only. JSON object
|
|
26
|
-
"1 = ascending, -1 = descending. " +
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
28
|
+
.describe("For action='create' only. JSON object with EXACTLY ONE field mapped to sort direction: " +
|
|
29
|
+
"1 = ascending, -1 = descending. Example: '{\"email\": 1}' or '{\"time\": -1}'. " +
|
|
30
|
+
"IMPORTANT: this endpoint does NOT support compound (multi-field) indexes — the Funifier " +
|
|
31
|
+
"REST API loops over keys and creates one single-field index per key, never a composite. " +
|
|
32
|
+
"Passing multiple fields is rejected to avoid silently creating N separate indexes. " +
|
|
33
|
+
"For a true composite index, use a Funifier trigger/scheduler/public endpoint with " +
|
|
34
|
+
"manager.getJongoConnection().getDatabase()... and a BasicDBObject chained .append() spec."),
|
|
30
35
|
name: zod_1.z
|
|
31
36
|
.string()
|
|
32
37
|
.optional()
|
|
@@ -80,6 +85,25 @@ function registerIndexTool(server, apiHolder) {
|
|
|
80
85
|
isError: true,
|
|
81
86
|
};
|
|
82
87
|
}
|
|
88
|
+
if (fieldNames.length > 1) {
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: `Error: composite indexes are NOT supported by this endpoint. The Funifier REST API ` +
|
|
93
|
+
`(POST /database/${collection}/index) iterates the JSON keys and creates ONE single-field ` +
|
|
94
|
+
`index per key — it would NOT produce a single composite '${fieldNames.map((f) => `${f}_${spec[f]}`).join("_")}' index. ` +
|
|
95
|
+
`You passed ${fieldNames.length} fields: ${JSON.stringify(spec)}.\n\n` +
|
|
96
|
+
`Options:\n` +
|
|
97
|
+
` 1) If you really wanted ${fieldNames.length} SEPARATE single-field indexes, call funifier_index ` +
|
|
98
|
+
`once per field, e.g.:\n` +
|
|
99
|
+
fieldNames.map((f) => ` funifier_index action=create collection=${collection} keys='{"${f}": ${spec[f]}}'`).join("\n") +
|
|
100
|
+
`\n 2) For a TRUE composite index, the REST endpoint cannot help — create it from a Funifier ` +
|
|
101
|
+
`trigger/scheduler/public endpoint with manager.getJongoConnection() and ` +
|
|
102
|
+
`BasicDBObject().append("${fieldNames[0]}", ${spec[fieldNames[0]]}).append(...).`,
|
|
103
|
+
}],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
83
107
|
const invalidDirections = fieldNames.filter((f) => spec[f] !== 1 && spec[f] !== -1);
|
|
84
108
|
if (invalidDirections.length > 0) {
|
|
85
109
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../../../src/mcp/tools/index-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,10 +65,16 @@ function makeInvoke(overrides = {}) {
|
|
|
65
65
|
(0, vitest_1.expect)(api.createIndex).toHaveBeenCalledWith("player", { email: 1 });
|
|
66
66
|
(0, vitest_1.expect)(result.content[0].text).toContain("email_1");
|
|
67
67
|
});
|
|
68
|
-
(0, vitest_1.it)("
|
|
68
|
+
(0, vitest_1.it)("rejects multi-key 'keys' because the REST endpoint cannot create composite indexes", async () => {
|
|
69
69
|
const { invoke, api } = makeInvoke();
|
|
70
|
-
await invoke({ action: "create", collection: "action_log", keys: '{"player": 1, "time": -1}' });
|
|
71
|
-
(0, vitest_1.expect)(
|
|
70
|
+
const result = await invoke({ action: "create", collection: "action_log", keys: '{"player": 1, "time": -1}' });
|
|
71
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
72
|
+
(0, vitest_1.expect)(api.createIndex).not.toHaveBeenCalled();
|
|
73
|
+
const text = result.content[0].text;
|
|
74
|
+
(0, vitest_1.expect)(text).toContain("composite indexes are NOT supported");
|
|
75
|
+
(0, vitest_1.expect)(text).toContain('collection=action_log keys=\'{"player": 1}\'');
|
|
76
|
+
(0, vitest_1.expect)(text).toContain('collection=action_log keys=\'{"time": -1}\'');
|
|
77
|
+
(0, vitest_1.expect)(text).toContain("BasicDBObject");
|
|
72
78
|
});
|
|
73
79
|
(0, vitest_1.it)("returns isError when keys is missing", async () => {
|
|
74
80
|
const { invoke } = makeInvoke();
|
|
@@ -1 +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
|
+
{"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":"search-docs.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
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;AA4BpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAwFzE"}
|
|
@@ -38,16 +38,50 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const zod_1 = require("zod");
|
|
40
40
|
const lexical_1 = require("../../core/lexical");
|
|
41
|
+
/**
|
|
42
|
+
* Walk the docs directory and build a SearchIndex from all .md files found.
|
|
43
|
+
* Returns null if the docs directory does not exist.
|
|
44
|
+
*/
|
|
45
|
+
function buildIndexFromDocs(docsPath) {
|
|
46
|
+
if (!fs.existsSync(docsPath))
|
|
47
|
+
return null;
|
|
48
|
+
const files = new Map();
|
|
49
|
+
const walk = (dir, prefix) => {
|
|
50
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
51
|
+
const fullPath = path.join(dir, entry.name);
|
|
52
|
+
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
walk(fullPath, relPath);
|
|
55
|
+
}
|
|
56
|
+
else if (entry.name.endsWith(".md")) {
|
|
57
|
+
files.set(relPath, fs.readFileSync(fullPath, "utf-8"));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
walk(docsPath, "");
|
|
62
|
+
if (files.size === 0)
|
|
63
|
+
return null;
|
|
64
|
+
return (0, lexical_1.buildIndex)(files);
|
|
65
|
+
}
|
|
41
66
|
function registerSearchDocsTool(server, docsPath) {
|
|
42
67
|
const indexPath = path.join(docsPath, "..", ".search-index.json");
|
|
43
68
|
let cachedIndex = null;
|
|
44
69
|
function loadIndex() {
|
|
45
70
|
if (cachedIndex)
|
|
46
71
|
return cachedIndex;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
72
|
+
// 1. Try pre-built index file (fastest path)
|
|
73
|
+
if (fs.existsSync(indexPath)) {
|
|
74
|
+
cachedIndex = JSON.parse(fs.readFileSync(indexPath, "utf-8"));
|
|
75
|
+
return cachedIndex;
|
|
76
|
+
}
|
|
77
|
+
// 2. Auto-build from docs directory (no manual build step required)
|
|
78
|
+
const built = buildIndexFromDocs(docsPath);
|
|
79
|
+
if (built) {
|
|
80
|
+
cachedIndex = built;
|
|
81
|
+
return cachedIndex;
|
|
82
|
+
}
|
|
83
|
+
// 3. Neither index file nor docs directory available
|
|
84
|
+
return null;
|
|
51
85
|
}
|
|
52
86
|
server.registerTool("funifier_search_docs", {
|
|
53
87
|
title: "Search Funifier Documentation",
|
|
@@ -79,7 +113,7 @@ function registerSearchDocsTool(server, docsPath) {
|
|
|
79
113
|
return {
|
|
80
114
|
content: [{
|
|
81
115
|
type: "text",
|
|
82
|
-
text: `Documentation search index
|
|
116
|
+
text: `Documentation not available: no search index file and no docs directory found. ` +
|
|
83
117
|
`If running as an installed package, check that FUNIFIER_DOCS_PATH is set to a valid docs directory ` +
|
|
84
118
|
`or run 'funifier-mcp init' to regenerate the configuration.`,
|
|
85
119
|
}],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,16 +84,27 @@ function invokeWith(dp) {
|
|
|
84
84
|
(0, vitest_1.expect)(text).not.toContain("knowledge/");
|
|
85
85
|
(0, vitest_1.expect)(text).not.toContain(".md");
|
|
86
86
|
});
|
|
87
|
-
(0, vitest_1.it)("returns isError when
|
|
87
|
+
(0, vitest_1.it)("returns isError when neither index file nor docs directory exists", () => {
|
|
88
88
|
const emptyRoot = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-noindex-"));
|
|
89
|
-
const
|
|
90
|
-
|
|
89
|
+
const noDocsPath = path.join(emptyRoot, "knowledge");
|
|
90
|
+
// Don't create the knowledge/ directory — no docs, no index
|
|
91
|
+
const result = invokeWith(noDocsPath)({ query: "trigger" });
|
|
91
92
|
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
92
|
-
(0, vitest_1.expect)(result.content[0].text).toContain("not
|
|
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);
|
|
93
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("Documentation not available");
|
|
95
94
|
fs.rmSync(emptyRoot, { recursive: true, force: true });
|
|
96
95
|
});
|
|
96
|
+
(0, vitest_1.it)("auto-builds index from docs directory when index file is missing", () => {
|
|
97
|
+
const autoRoot = fs.mkdtempSync(path.join(os.tmpdir(), "funifier-autobuild-"));
|
|
98
|
+
const autoDocsPath = path.join(autoRoot, "knowledge", "modules");
|
|
99
|
+
fs.mkdirSync(autoDocsPath, { recursive: true });
|
|
100
|
+
fs.writeFileSync(path.join(autoDocsPath, "scheduler.md"), "# Scheduler\n\n## Cron jobs\n\nScheduler runs periodic tasks using cron expressions.");
|
|
101
|
+
fs.writeFileSync(path.join(autoDocsPath, "action.md"), "# Action\n\n## Player actions\n\nActions track player behaviors with attributes.");
|
|
102
|
+
// No .search-index.json file — tool must auto-build from docs
|
|
103
|
+
const result = invokeWith(path.join(autoRoot, "knowledge"))({ query: "scheduler cron periodic" });
|
|
104
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
105
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("modules/scheduler");
|
|
106
|
+
fs.rmSync(autoRoot, { recursive: true, force: true });
|
|
107
|
+
});
|
|
97
108
|
(0, vitest_1.it)("reports no matches for an unrelated query", () => {
|
|
98
109
|
const result = invokeWith(docsPath)({ query: "zzzznonexistentterm" });
|
|
99
110
|
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
@@ -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.9",
|
|
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,7 +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
|
|
68
|
+
| Create, list, and drop MongoDB single-field indexes on Funifier collections via the REST API. Composite (multi-field) indexes are NOT supported by this endpoint — see Limitation section. | `references/manage-indexes.md` |
|
|
69
69
|
|
|
70
70
|
## Documented Modules
|
|
71
71
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# funifier-manage-indexes
|
|
2
2
|
|
|
3
|
-
Create, list, and drop MongoDB indexes on Funifier collections
|
|
3
|
+
Create, list, and drop MongoDB single-field indexes on Funifier collections via the REST API. Composite (multi-field) indexes are NOT supported by this endpoint — see Limitation section.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ Create, list, and drop MongoDB indexes on Funifier collections — optimize quer
|
|
|
9
9
|
Use the `funifier_search_docs` MCP tool to load only what you need:
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
funifier_search_docs "index indexes mongodb createIndex
|
|
12
|
+
funifier_search_docs "index indexes mongodb createIndex unique sparse performance database funifier_index"
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Then read the most relevant results with `funifier_read_doc path=<path>`.
|
|
@@ -26,6 +26,18 @@ If search returns insufficient results, read these directly:
|
|
|
26
26
|
|
|
27
27
|
Use `funifier_index` (not `funifier_database`) for all index operations.
|
|
28
28
|
|
|
29
|
+
## ⚠ Limitation: no composite indexes
|
|
30
|
+
|
|
31
|
+
The Funifier REST endpoint `POST /database/{coll}/index` does **NOT** support composite (multi-field) indexes. Internally it loops over the JSON keys and calls `createIndex(new BasicDBObject(key, direction))` once per key — so a payload like `{"a": 1, "b": 1}` would produce **two separate** single-field indexes (`a_1` and `b_1`), never a composite `a_1_b_1`.
|
|
32
|
+
|
|
33
|
+
To avoid silently misleading callers, `funifier_index action=create` **rejects** multi-key `keys` payloads. Call once per field, or build a composite via a Funifier trigger/scheduler/public endpoint:
|
|
34
|
+
|
|
35
|
+
```groovy
|
|
36
|
+
manager.getJongoConnection().getDatabase()
|
|
37
|
+
.getCollection("<collection>")
|
|
38
|
+
.createIndex(new BasicDBObject("a", 1).append("b", 1))
|
|
39
|
+
```
|
|
40
|
+
|
|
29
41
|
## Actions
|
|
30
42
|
|
|
31
43
|
### List indexes
|
|
@@ -34,24 +46,19 @@ funifier_index action=list collection=<collection>
|
|
|
34
46
|
```
|
|
35
47
|
Always list first to avoid creating duplicate indexes.
|
|
36
48
|
|
|
37
|
-
### Create index
|
|
49
|
+
### Create index (single-field only)
|
|
38
50
|
|
|
39
|
-
|
|
51
|
+
Ascending:
|
|
40
52
|
```
|
|
41
53
|
funifier_index action=create collection=<collection> keys='{"<field>": 1}'
|
|
42
54
|
```
|
|
43
55
|
|
|
44
|
-
|
|
56
|
+
Descending:
|
|
45
57
|
```
|
|
46
58
|
funifier_index action=create collection=<collection> keys='{"<field>": -1}'
|
|
47
59
|
```
|
|
48
60
|
|
|
49
|
-
|
|
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.
|
|
61
|
+
MongoDB names the index automatically: `<field>_1`, `<field>_-1`.
|
|
55
62
|
|
|
56
63
|
### Drop index
|
|
57
64
|
```
|
|
@@ -62,8 +69,8 @@ Get the index name from `action=list`. The `_id_` index cannot be dropped.
|
|
|
62
69
|
## Rules
|
|
63
70
|
|
|
64
71
|
- **Check before creating** — always run `action=list` first to avoid duplicates
|
|
72
|
+
- **One field per call** — multi-key payloads are rejected (see Limitation above)
|
|
65
73
|
- **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
74
|
- **Scope** — the API token must have `database` in its scope
|
|
68
75
|
- **Collection min length** — collection name must be at least 1 character
|
|
69
76
|
|
|
@@ -73,5 +80,6 @@ Get the index name from `action=list`. The `_id_` index cannot be dropped.
|
|
|
73
80
|
|----------|------|
|
|
74
81
|
| Lookup by field | `{"<field>": 1}` |
|
|
75
82
|
| Sort by time desc | `{"time": -1}` |
|
|
76
|
-
| Player + time | `{"player": 1, "time": -1}` |
|
|
77
83
|
| Unique email | `{"email": 1}` (uniqueness enforced by MongoDB, not this API) |
|
|
84
|
+
|
|
85
|
+
For a composite (e.g. `{player: 1, time: -1}` to back filter+sort in one plan), use the Groovy/trigger path shown in the Limitation section — not this tool.
|