funifier-mcp 0.3.6 → 0.3.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 +1 -1
- package/.github/copilot-instructions.md +1 -1
- package/AGENTS.md +1 -45
- package/datasource-funifier-docs/.coverage.json +1 -1
- package/datasource-funifier-docs/knowledge/modules/database.md +2 -0
- package/dist/cli/init.js +2 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/mcp/bundle.js +10 -4
- 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/package.json +1 -1
- package/skills/funifier/SKILL.md +1 -1
- package/skills/funifier/references/manage-indexes.md +21 -13
|
@@ -57,7 +57,7 @@ Then read a result with `funifier_read_doc path=<path>`.
|
|
|
57
57
|
| `skills/funifier/references/configure-security.md` | 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) |
|
|
58
58
|
| `skills/funifier/references/import-csv.md` | 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) |
|
|
59
59
|
| `skills/funifier/references/upload-file.md` | 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) |
|
|
60
|
-
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB indexes on Funifier collections
|
|
60
|
+
| `skills/funifier/references/manage-indexes.md` | 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. |
|
|
61
61
|
|
|
62
62
|
Full workflow files: `skills/funifier/references/`
|
|
63
63
|
|
|
@@ -50,7 +50,7 @@ Detailed guided workflows live in `skills/funifier/references/`:
|
|
|
50
50
|
| `skills/funifier/references/configure-security.md` | 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) |
|
|
51
51
|
| `skills/funifier/references/import-csv.md` | 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) |
|
|
52
52
|
| `skills/funifier/references/upload-file.md` | 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) |
|
|
53
|
-
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB indexes on Funifier collections
|
|
53
|
+
| `skills/funifier/references/manage-indexes.md` | 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. |
|
|
54
54
|
|
|
55
55
|
### Funifier Modules
|
|
56
56
|
|
package/AGENTS.md
CHANGED
|
@@ -85,7 +85,7 @@ Before any `funifier_*` MCP tool call or Funifier task, find the matching row an
|
|
|
85
85
|
| `skills/funifier/references/configure-security.md` | 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) |
|
|
86
86
|
| `skills/funifier/references/import-csv.md` | 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) |
|
|
87
87
|
| `skills/funifier/references/upload-file.md` | 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) |
|
|
88
|
-
| `skills/funifier/references/manage-indexes.md` | Create, list, and drop MongoDB indexes on Funifier collections
|
|
88
|
+
| `skills/funifier/references/manage-indexes.md` | 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. |
|
|
89
89
|
|
|
90
90
|
## Funifier Modules
|
|
91
91
|
|
|
@@ -108,47 +108,3 @@ Before any `funifier_*` MCP tool call or Funifier task, find the matching row an
|
|
|
108
108
|
- **Never list all MCP resources** without a `search` parameter — always filter.
|
|
109
109
|
- **Docs are authoritative for patterns**: never infer patterns from existing live resources.
|
|
110
110
|
- **Find docs with `funifier_search_docs`** and read them with `funifier_read_doc` — never guess field semantics.
|
|
111
|
-
|
|
112
|
-
<!-- gitnexus:start -->
|
|
113
|
-
# GitNexus — Code Intelligence
|
|
114
|
-
|
|
115
|
-
This project is indexed by GitNexus as **funifier-ai** (5268 symbols, 5953 relationships, 34 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
|
|
116
|
-
|
|
117
|
-
> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.
|
|
118
|
-
|
|
119
|
-
## Always Do
|
|
120
|
-
|
|
121
|
-
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
|
122
|
-
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
|
|
123
|
-
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
|
124
|
-
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
|
125
|
-
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.
|
|
126
|
-
|
|
127
|
-
## Never Do
|
|
128
|
-
|
|
129
|
-
- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
|
|
130
|
-
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
|
|
131
|
-
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
|
|
132
|
-
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.
|
|
133
|
-
|
|
134
|
-
## Resources
|
|
135
|
-
|
|
136
|
-
| Resource | Use for |
|
|
137
|
-
|----------|---------|
|
|
138
|
-
| `gitnexus://repo/funifier-ai/context` | Codebase overview, check index freshness |
|
|
139
|
-
| `gitnexus://repo/funifier-ai/clusters` | All functional areas |
|
|
140
|
-
| `gitnexus://repo/funifier-ai/processes` | All execution flows |
|
|
141
|
-
| `gitnexus://repo/funifier-ai/process/{name}` | Step-by-step execution trace |
|
|
142
|
-
|
|
143
|
-
## CLI
|
|
144
|
-
|
|
145
|
-
| Task | Read this skill file |
|
|
146
|
-
|------|---------------------|
|
|
147
|
-
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
|
|
148
|
-
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
|
|
149
|
-
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
|
|
150
|
-
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
|
|
151
|
-
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
|
|
152
|
-
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
|
|
153
|
-
|
|
154
|
-
<!-- gitnexus:end -->
|
|
@@ -450,6 +450,8 @@ Sem estágios no body, executa `{$match:{}}` (retorna tudo).
|
|
|
450
450
|
|
|
451
451
|
Todos exigem scope `database` e `collection > 0`.
|
|
452
452
|
|
|
453
|
+
> ⚠️ **Sem suporte a índices compostos.** `DatabaseRest.insertIndex` itera as chaves do body e chama `createIndex(new BasicDBObject(key, direction))` uma vez por chave — então `{"a":1,"b":1}` cria **dois índices single-field separados** (`a_1` e `b_1`), nunca um composto `a_1_b_1`. Para um composto real (filter+sort em um único plano de query), use trigger/scheduler/public endpoint Groovy: `manager.getJongoConnection().getDatabase().getCollection("col").createIndex(new BasicDBObject("a",1).append("b",1))`.
|
|
454
|
+
|
|
453
455
|
### 4.13 Fila assíncrona
|
|
454
456
|
|
|
455
457
|
- `GET /v3/database/queue/info` — `getQueueInfo()`.
|
package/dist/cli/init.js
CHANGED
|
@@ -191,9 +191,9 @@ function removeLegacyFunifierSkills(skillsDir) {
|
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
function installFunifierMcp(projectDir) {
|
|
194
|
-
console.log("📥 Installing funifier-mcp locally...");
|
|
194
|
+
console.log("📥 Installing funifier-mcp@latest locally...");
|
|
195
195
|
try {
|
|
196
|
-
(0, child_process_1.execSync)("npm install funifier-mcp --save", { cwd: projectDir, stdio: "inherit" });
|
|
196
|
+
(0, child_process_1.execSync)("npm install funifier-mcp@latest --save", { cwd: projectDir, stdio: "inherit" });
|
|
197
197
|
}
|
|
198
198
|
catch {
|
|
199
199
|
console.warn(" ⚠ npm install failed — continuing with package cache");
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/bundle.js
CHANGED
|
@@ -61,7 +61,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
61
61
|
`);return o===-1?"":n.stack.slice(o+1)})();try{if(!i.stack)i.stack=a;else if(a){let o=a.indexOf(`
|
|
62
62
|
`),s=o===-1?-1:a.indexOf(`
|
|
63
63
|
`,o+1),c=s===-1?"":a.slice(s+1);String(i.stack).endsWith(c)||(i.stack+=`
|
|
64
|
-
`+a)}}catch{}}throw i}}_request(t,r){typeof t=="string"?(r=r||{},r.url=t):r=t||{},r=Xa(this.defaults,r);let{transitional:i,paramsSerializer:n,headers:a}=r;i!==void 0&&sp.assertOptions(i,{silentJSONParsing:Jr.transitional(Jr.boolean),forcedJSONParsing:Jr.transitional(Jr.boolean),clarifyTimeoutError:Jr.transitional(Jr.boolean),legacyInterceptorReqResOrdering:Jr.transitional(Jr.boolean)},!1),n!=null&&(E.isFunction(n)?r.paramsSerializer={serialize:n}:sp.assertOptions(n,{encode:Jr.function,serialize:Jr.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),sp.assertOptions(r,{baseUrl:Jr.spelling("baseURL"),withXsrfToken:Jr.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let o=a&&E.merge(a.common,a[r.method]);a&&E.forEach(["delete","get","head","post","put","patch","query","common"],x=>{delete a[x]}),r.headers=wt.concat(o,a);let s=[],c=!0;this.interceptors.request.forEach(function(y){if(typeof y.runWhen=="function"&&y.runWhen(r)===!1)return;c=c&&y.synchronous;let _=r.transitional||xp;_&&_.legacyInterceptorReqResOrdering?s.unshift(y.fulfilled,y.rejected):s.push(y.fulfilled,y.rejected)});let u=[];this.interceptors.response.forEach(function(y){u.push(y.fulfilled,y.rejected)});let l,p=0,m;if(!c){let x=[EE.bind(this),void 0];for(x.unshift(...s),x.push(...u),m=x.length,l=Promise.resolve(r);p<m;)l=l.then(x[p++],x[p++]);return l}m=s.length;let h=r;for(;p<m;){let x=s[p++],y=s[p++];try{h=x(h)}catch(_){y.call(this,_);break}}try{l=EE.call(this,h)}catch(x){return Promise.reject(x)}for(p=0,m=u.length;p<m;)l=l.then(u[p++],u[p++]);return l}getUri(t){t=Xa(this.defaults,t);let r=Ax(t.baseURL,t.url,t.allowAbsoluteUrls);return kx(r,t.params,t.paramsSerializer)}};E.forEach(["delete","get","head","options"],function(t){Ei.prototype[t]=function(r,i){return this.request(Xa(i||{},{method:t,url:r,data:(i||{}).data}))}});E.forEach(["post","put","patch","query"],function(t){function r(i){return function(a,o,s){return this.request(Xa(s||{},{method:t,headers:i?{"Content-Type":"multipart/form-data"}:{},url:a,data:o}))}}Ei.prototype[t]=r(),t!=="query"&&(Ei.prototype[t+"Form"]=r(!0))});var Px=class e{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(a){r=a});let i=this;this.promise.then(n=>{if(!i._listeners)return;let a=i._listeners.length;for(;a-- >0;)i._listeners[a](n);i._listeners=null}),this.promise.then=n=>{let a,o=new Promise(s=>{i.subscribe(s),a=s}).then(n);return o.cancel=function(){i.unsubscribe(a)},o},t(function(a,o,s){i.reason||(i.reason=new Oi(a,o,s),r(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;let r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let t=new AbortController,r=i=>{t.abort(i)};return this.subscribe(r),t.signal.unsubscribe=()=>this.unsubscribe(r),t.signal}static source(){let t;return{token:new e(function(n){t=n}),cancel:t}}};function kX(e){return function(r){return e.apply(null,r)}}function RX(e){return E.isObject(e)&&e.isAxiosError===!0}var jx={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(jx).forEach(([e,t])=>{jx[t]=e});function t4(e){let t=new Ei(e),r=IE(Ei.prototype.request,t);return E.extend(r,Ei.prototype,t,{allOwnKeys:!0}),E.extend(r,t,null,{allOwnKeys:!0}),r.create=function(n){return t4(Xa(e,n))},r}var St=t4(Wc);St.Axios=Ei;St.CanceledError=Oi;St.CancelToken=Px;St.isCancel=BE;St.VERSION=Vc;St.toFormData=gp;St.AxiosError=R;St.Cancel=St.CanceledError;St.all=function(t){return Promise.all(t)};St.spread=kX;St.isAxiosError=RX;St.mergeConfig=Xa;St.AxiosHeaders=wt;St.formToJSON=e=>LE(E.isHTMLForm(e)?new FormData(e):e);St.getAdapter=e4.getAdapter;St.HttpStatusCode=jx;St.default=St;r4.exports=St});var Mx=v(ds=>{"use strict";Object.defineProperty(ds,"__esModule",{value:!0});ds.Endpoints=ds.API=void 0;ds.API={RANGE_HEADER:"items=0-1000",BASE_PATH:"/v3"};ds.Endpoints={TRIGGER:"/trigger",SCHEDULER:"/scheduler",SCHEDULER_FETCH:"/database/scheduler",WIDGET:"/widget",CUSTOM_PAGE:"/database/studio_page",AGGREGATE:"/database/prepared_aggregate",AGGREGATE_BY_ID:e=>`/prepared/aggregate/${e}`,AGGREGATE_PARAMS:e=>`/find/${e}/params`,AGGREGATE_FIND:e=>`/find/${e}`,AGGREGATE_ANALYZE:e=>`/prepared/aggregate/${e}/analyze`,PUBLIC_ENDPOINT:"/database/public_endpoint",PUBLIC_ENDPOINT_UPDATE:"/public",PUBLIC_ENDPOINT_BY_ID:e=>`/public/${e}`,CHALLENGE_AGGREGATE:"/database/challenge_rule_prepared",AUTH_MODULE:"/database/auth_module",AUTH_MODULE_UPDATE:"/auth/module",WEBSOCKET:"/database/websocket",WEBSOCKET_UPDATE:"/websocket",AI_KNOWLEDGE:"/system/ai/knowledge",SCHEDULER_LOG:"/scheduler/log",TRIGGER_LOG:"/database/trigger_log/aggregate",CRON_VALIDATE:"/util/cron/evaluate",ACCOUNT_INFO:"/account/info",COLLECTIONS:"/database/collections",GAMIFICATION:e=>`/gamification/${e}`,ACTION:"/action",CHALLENGE:"/challenge",CHALLENGE_FETCH:"/database/challenge",POINT:"/point",LEVEL:"/level",LEVEL_CONFIG:"/database/level_config",LEVEL_POSITION:"/level/position",LEADERBOARD:"/leaderboard",LEADERBOARD_LEADERS:e=>`/leaderboard/${e}/leader/aggregate`,LEADERBOARD_RESET:"/leaderboard/reset",QUIZ:"/quiz",QUIZ_LIST:"/database/quiz",QUIZ_QUESTION:"/question",QUIZ_QUESTION_BY_QUIZ:e=>`/quiz/${e}/question`,QUIZ_START:"/quiz/start",QUIZ_FINISH:"/quiz/finish",QUESTION_LOG_BULK:"/question/log/bulk",VIRTUAL_GOOD_CATALOG:"/virtualgoods/catalog",VIRTUAL_GOOD_ITEM:"/virtualgoods/item",VIRTUAL_GOOD_PURCHASE:"/virtualgoods/purchase",FOLDER:"/folder",FOLDER_BY_ID:e=>`/folder/${e}`,FOLDER_INSIDE:"/folder/inside",FOLDER_PROGRESS:"/folder/progress",FOLDER_BREADCRUMB:"/folder/breadcrumb",FOLDER_MOVE:e=>`/folder/${e}/move`,FOLDER_CONTENT:"/folder/content",FOLDER_CONTENT_BY_ID:e=>`/folder/content/${e}`,FOLDER_CONTENT_DATA:e=>`/folder/content/${e}/data`,FOLDER_CONTENT_AGGREGATE:"/folder/content/aggregate",FOLDER_CONTENT_MOVE:e=>`/folder/content/${e}/move`,FOLDER_LOG:"/folder/log",FOLDER_LOG_BY_ID:e=>`/folder/log/${e}`,FOLDER_CONTENT_TYPE:"/database/folder_content_type",INDEX:e=>`/database/${e}/index`,INDEX_BY_NAME:(e,t)=>`/database/${e}/index/${encodeURIComponent(t)}`}});var a4=v(ps=>{"use strict";var AX=ps&&ps.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ps,"__esModule",{value:!0});ps.serializeToFunifierQuery=i4;ps.createAPIClient=MX;var NX=AX(n4()),z=Mx();function oe(e){if(e?.response?.data){let t=e.response.data;return typeof t=="string"?t:t.errorMessage?t.errorMessage:t.message?t.message:JSON.stringify(t)}return e?.message?e.message:String(e)}function i4(e){return Object.entries(e).map(([t,r])=>{if(r!==null&&typeof r=="object")throw Array.isArray(r)?new Error(`Array value for field "${t}" not supported in action=query. Use action=aggregate with [{"$match": {"${t}": {"$in": <array>}}}] instead.`):new Error(`Operator in field "${t}" not supported in action=query. Use action=aggregate with [{"$match": <filter>}] instead.`);return typeof r=="string"?`${t}:"${r}"`:`${t}:${r}`}).join(",")}function MX(e){if(!e.apiKey||!e.secretKey||!e.serverUrl)throw new Error("Funifier config is required: apiKey, secretKey, and serverUrl must be provided");let t=NX.default.create({baseURL:`${e.serverUrl}${z.API.BASE_PATH}`,headers:{"Content-Type":"application/json",Authorization:`Basic ${Buffer.from(`${e.apiKey}:${e.secretKey}`).toString("base64")}`,Range:z.API.RANGE_HEADER}});return{listTriggers:async()=>{try{return(await t.get(z.Endpoints.TRIGGER)).data}catch(r){return console.error(r),[]}},saveTrigger:async r=>{try{return(await t.post(z.Endpoints.TRIGGER,r)).data}catch(i){throw new Error("Failed to update trigger: "+oe(i))}},deleteTrigger:async r=>{try{return(await t.delete(`${z.Endpoints.TRIGGER}/${r}`)).data}catch(i){throw new Error("Failed to delete trigger: "+oe(i))}},getTriggerLogs:async r=>{try{let i=[{$match:{_id:r}}];return(await t.post(z.Endpoints.TRIGGER_LOG,i)).data}catch(i){return console.error(i),[]}},listSchedulers:async()=>{try{return(await t.get(z.Endpoints.SCHEDULER_FETCH)).data}catch(r){return console.error(r),[]}},saveScheduler:async r=>{try{return(await t.post(z.Endpoints.SCHEDULER,r)).data}catch(i){throw new Error("Failed to save scheduler: "+oe(i))}},deleteScheduler:async r=>{try{return(await t.delete(`${z.Endpoints.SCHEDULER}/${r}`)).data}catch(i){throw new Error("Failed to delete scheduler: "+oe(i))}},executeScheduler:async r=>{try{return(await t.get(`${z.Endpoints.SCHEDULER}/execute/${r}`)).data}catch(i){throw console.error(i),new Error("Failed to execute scheduler: "+oe(i))}},getSchedulerLogs:async r=>{try{return(await t.get(z.Endpoints.SCHEDULER_LOG,{params:{orderby:"time",reverse:!0,max_results:10,item:r}})).data}catch(i){return console.error(i),[]}},listAggregates:async()=>{try{return(await t.get(z.Endpoints.AGGREGATE)).data}catch(r){return console.error(r),[]}},saveAggregate:async r=>{try{return(await t.put(z.Endpoints.AGGREGATE,r)).data}catch(i){throw new Error("Failed to save aggregate: "+oe(i))}},deleteAggregate:async r=>{try{return(await t.delete(z.Endpoints.AGGREGATE_BY_ID(r))).data}catch(i){throw new Error("Failed to delete aggregate: "+oe(i))}},executeAggregate:async(r,i)=>{try{return(await t.post(z.Endpoints.AGGREGATE_FIND(r),i)).data}catch(n){throw console.error(n),new Error("Failed to execute aggregate: "+oe(n))}},analyzeAggregate:async(r,i)=>{try{return(await t.post(z.Endpoints.AGGREGATE_ANALYZE(r),i)).data}catch(n){throw console.error(n),new Error("Failed to analyze aggregate: "+oe(n))}},getAggregateParams:async r=>{try{return(await t.get(z.Endpoints.AGGREGATE_PARAMS(r))).data}catch(i){throw console.error(i),new Error("Failed to get aggregate params: "+oe(i))}},listWebsockets:async()=>{try{return(await t.get(z.Endpoints.WEBSOCKET)).data}catch(r){return console.error(r),[]}},saveWebsocket:async(r,i)=>{try{let n={...r,isNew:i};return(await t.post(z.Endpoints.WEBSOCKET_UPDATE,n)).data}catch(n){throw new Error("Failed to save websocket: "+oe(n))}},deleteWebsocket:async r=>{try{return await t.delete(`${z.Endpoints.WEBSOCKET_UPDATE}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete websocket: "+oe(i))}},listWidgets:async()=>{try{return(await t.get(z.Endpoints.WIDGET)).data}catch(r){return console.error(r),[]}},getWidgetById:async r=>{try{return(await t.get(`${z.Endpoints.WIDGET}/${r}`)).data}catch(i){console.error(i);return}},saveWidget:async r=>{try{return(await t.post(z.Endpoints.WIDGET,r)).data}catch(i){throw new Error("Failed to save widget: "+oe(i))}},deleteWidget:async r=>{try{return(await t.delete(`${z.Endpoints.WIDGET}/${r}`)).data}catch(i){throw new Error("Failed to delete widget: "+oe(i))}},listCustomPages:async()=>{try{return(await t.get(z.Endpoints.CUSTOM_PAGE)).data}catch(r){return console.error(r),[]}},saveCustomPage:async r=>{try{return(await t.put(z.Endpoints.CUSTOM_PAGE,r)).data}catch(i){throw new Error("Failed to save custom page: "+oe(i))}},deleteCustomPage:async r=>{try{return(await t.delete(`${z.Endpoints.CUSTOM_PAGE}?q=_id:'${r}'`)).data}catch(i){throw new Error("Failed to delete custom page: "+oe(i))}},listPublicEndpoints:async()=>{try{return(await t.get(z.Endpoints.PUBLIC_ENDPOINT)).data}catch(r){return console.error(r),[]}},savePublicEndpoint:async r=>{try{return(await t.post(z.Endpoints.PUBLIC_ENDPOINT_UPDATE,r)).data}catch(i){throw new Error("Failed to save public endpoint: "+oe(i))}},deletePublicEndpoint:async r=>{try{return(await t.delete(z.Endpoints.PUBLIC_ENDPOINT_BY_ID(r))).data}catch(i){throw new Error("Failed to delete public endpoint: "+oe(i))}},executePublicEndpoint:async(r,i,n,a)=>{try{let o=`/pub/${r}/${i}`;return(a.toUpperCase()==="GET"?await t.get(o):await t.post(o,n)).data}catch(o){if(console.error(o),o.response?.data)return o.response.data;throw new Error("Failed to execute public endpoint: "+oe(o))}},listChallengeAggregates:async()=>{try{return(await t.get(z.Endpoints.CHALLENGE_AGGREGATE)).data}catch(r){return console.error(r),[]}},saveChallengeAggregate:async r=>{try{return(await t.put(z.Endpoints.CHALLENGE_AGGREGATE,r)).data}catch(i){throw new Error("Failed to execute aggregate: "+oe(i))}},deleteChallengeAggregate:async r=>{try{return(await t.delete(`${z.Endpoints.CHALLENGE_AGGREGATE}?q=_id:'${r}'`)).data}catch(i){throw new Error("Failed to delete challenge aggregate: "+oe(i))}},listAuthModules:async()=>{try{return(await t.get(z.Endpoints.AUTH_MODULE)).data}catch(r){return console.error(r),[]}},saveAuthModule:async(r,i)=>{try{let n={...r,isNew:i};return(await t.post(z.Endpoints.AUTH_MODULE_UPDATE,n)).data}catch(n){throw new Error("Failed to save auth module: "+oe(n))}},deleteAuthModule:async r=>{try{return await t.delete(`${z.Endpoints.AUTH_MODULE_UPDATE}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete auth module: "+oe(i))}},listAiKnowledge:async()=>{try{return(await t.post(`${z.Endpoints.AI_KNOWLEDGE}/aggregate`,[])).data}catch(r){return console.error(r),[]}},saveAiKnowledge:async r=>{try{return(await t.post(z.Endpoints.AI_KNOWLEDGE,r)).data}catch(i){throw new Error("Failed to save AI knowledge: "+oe(i))}},deleteAiKnowledge:async r=>{try{return(await t.delete(`${z.Endpoints.AI_KNOWLEDGE}/${r}`)).data}catch(i){throw new Error("Failed to delete AI knowledge: "+oe(i))}},getStudioPageFolders:async()=>{try{let i=(await t.get(`${z.Endpoints.CUSTOM_PAGE}_folder`)).data;return Array.isArray(i)?i:i&&typeof i=="object"?[i]:[]}catch(r){return console.error(r),[]}},listFolders:async()=>{try{return(await t.get("/database/folder")).data}catch(r){return console.error(r),[]}},saveFolder:async r=>{try{return(await t.post(z.Endpoints.FOLDER,r)).data}catch(i){throw new Error("Failed to save folder: "+oe(i))}},deleteFolder:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder: "+oe(i))}},listFolderContents:async()=>{try{return(await t.get("/database/folder_content")).data}catch(r){return console.error(r),[]}},saveFolderContent:async r=>{try{return(await t.post(z.Endpoints.FOLDER_CONTENT,r)).data}catch(i){throw new Error("Failed to save folder content: "+oe(i))}},deleteFolderContent:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_CONTENT_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder content: "+oe(i))}},listFolderContentTypes:async()=>{try{return(await t.get(z.Endpoints.FOLDER_CONTENT_TYPE)).data}catch(r){return console.error(r),[]}},saveFolderContentType:async r=>{try{return(await t.put(z.Endpoints.FOLDER_CONTENT_TYPE,r)).data}catch(i){throw new Error("Failed to save folder content type: "+oe(i))}},listFolderLogs:async()=>{try{return(await t.get("/database/folder_log")).data}catch(r){return console.error(r),[]}},saveFolderLog:async r=>{try{return(await t.post(z.Endpoints.FOLDER_LOG,r)).data}catch(i){throw new Error("Failed to save folder log: "+oe(i))}},deleteFolderLog:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_LOG_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder log: "+oe(i))}},folderInside:async r=>{try{return(await t.post(z.Endpoints.FOLDER_INSIDE,{folder:r})).data}catch(i){throw new Error("Failed to get folder inside: "+oe(i))}},folderProgress:async(r,i)=>{try{return(await t.post(z.Endpoints.FOLDER_PROGRESS,{folder:r,player:i})).data}catch(n){throw new Error("Failed to get folder progress: "+oe(n))}},folderBreadcrumb:async r=>{try{return(await t.post(z.Endpoints.FOLDER_BREADCRUMB,{folder:r})).data}catch(i){throw new Error("Failed to get folder breadcrumb: "+oe(i))}},evaluateCron:async r=>{try{return(await t.post(z.Endpoints.CRON_VALIDATE,{expression:r,language:"en"})).data}catch(i){throw console.error(i),new Error("Failed to evaluate cron expression: "+oe(i))}},getCollections:async()=>{try{return(await t.get(z.Endpoints.COLLECTIONS)).data}catch(r){return console.error(r),[]}},queryCollection:async(r,i={},n={})=>{let a={};Object.keys(i).length>0&&(a.q=i4(i));try{n.sort&&(a.sort=JSON.stringify(n.sort));let o=n.skip??0,s=n.limit??10;return(await t.get(`/database/${r}`,{params:a,headers:{Range:`items=${o}-${s}`}})).data}catch(o){return console.error(o),[]}},aggregateCollection:async(r,i)=>{try{return(await t.post(`/database/${r}/aggregate`,i)).data}catch(n){throw console.error(n),new Error(`Failed to aggregate on ${r}: ${n}`)}},insertDocument:async(r,i)=>{try{return(await t.post(`/database/${r}`,i)).data}catch(n){throw console.error(n),new Error(`Failed to insert document into ${r}: ${n}`)}},updateDocument:async(r,i)=>{try{return(await t.put(`/database/${r}`,i)).data}catch(n){throw console.error(n),new Error(`Failed to update document in ${r}: ${n}`)}},deleteDocument:async(r,i)=>{try{return(await t.delete(`/database/${r}?q=${i}`)).data}catch(n){throw console.error(n),new Error(`Failed to delete document from ${r}: ${n}`)}},bulkInsert:async(r,i)=>{try{return(await t.post(`/database/${r}/bulk`,i)).data}catch(n){throw console.error(n),new Error(`Failed to bulk insert into ${r}: ${n}`)}},listIndexes:async r=>{try{return(await t.get(z.Endpoints.INDEX(r))).data}catch(i){return console.error(i),[]}},createIndex:async(r,i)=>{try{return(await t.post(z.Endpoints.INDEX(r),i)).data}catch(n){throw new Error(`Failed to create index on '${r}': ${oe(n)}`)}},dropIndex:async(r,i)=>{try{return(await t.delete(z.Endpoints.INDEX_BY_NAME(r,i))).data}catch(n){throw new Error(`Failed to drop index '${i}' on '${r}': ${oe(n)}`)}},listActions:async()=>{try{return(await t.get(z.Endpoints.ACTION)).data}catch(r){return console.error(r),[]}},saveAction:async r=>{try{return(await t.post(z.Endpoints.ACTION,r)).data}catch(i){throw new Error("Failed to save action: "+oe(i))}},deleteAction:async r=>{try{return(await t.delete(`${z.Endpoints.ACTION}/${r}`)).data}catch(i){throw new Error("Failed to delete action: "+oe(i))}},listChallenges:async()=>{try{return(await t.get(z.Endpoints.CHALLENGE_FETCH)).data}catch(r){return console.error(r),[]}},saveChallenge:async r=>{try{return(await t.post(z.Endpoints.CHALLENGE,r)).data}catch(i){throw new Error("Failed to save challenge: "+oe(i))}},deleteChallenge:async r=>{try{return(await t.delete(`${z.Endpoints.CHALLENGE}/${r}`)).data}catch(i){throw new Error("Failed to delete challenge: "+oe(i))}},listPoints:async()=>{try{return(await t.get(z.Endpoints.POINT)).data}catch(r){return console.error(r),[]}},savePoint:async r=>{try{return(await t.post(z.Endpoints.POINT,r)).data}catch(i){throw new Error("Failed to save point: "+oe(i))}},deletePoint:async r=>{try{return(await t.delete(`${z.Endpoints.POINT}/${r}`)).data}catch(i){throw new Error("Failed to delete point: "+oe(i))}},listLevels:async()=>{try{return(await t.get(z.Endpoints.LEVEL)).data}catch(r){return console.error(r),[]}},saveLevel:async r=>{try{return(await t.post(z.Endpoints.LEVEL,r)).data}catch(i){throw new Error("Failed to save level: "+oe(i))}},deleteLevel:async r=>{try{return(await t.delete(`${z.Endpoints.LEVEL}/${r}`)).data}catch(i){throw new Error("Failed to delete level: "+oe(i))}},saveLevelConfig:async r=>{try{return(await t.put(z.Endpoints.LEVEL_CONFIG,r)).data}catch(i){throw new Error("Failed to save level config: "+oe(i))}},listLeaderboards:async()=>{try{return(await t.get(z.Endpoints.LEADERBOARD)).data}catch(r){return console.error(r),[]}},saveLeaderboard:async r=>{try{return(await t.post(z.Endpoints.LEADERBOARD,r)).data}catch(i){throw new Error("Failed to save leaderboard: "+oe(i))}},deleteLeaderboard:async r=>{try{return(await t.delete(`${z.Endpoints.LEADERBOARD}/${r}`)).data}catch(i){throw new Error("Failed to delete leaderboard: "+oe(i))}},getLeaderboardResults:async r=>{try{return(await t.post(z.Endpoints.LEADERBOARD_LEADERS(r),[])).data}catch(i){return console.error(i),[]}},listQuizzes:async()=>{try{return(await t.get(z.Endpoints.QUIZ_LIST)).data}catch(r){return console.error(r),[]}},saveQuiz:async r=>{try{return(await t.post(z.Endpoints.QUIZ,r)).data}catch(i){throw new Error("Failed to save quiz: "+oe(i))}},deleteQuiz:async r=>{try{return(await t.delete(`${z.Endpoints.QUIZ}/${r}`)).data}catch(i){throw new Error("Failed to delete quiz: "+oe(i))}},listQuizQuestions:async r=>{try{return(await t.get(z.Endpoints.QUIZ_QUESTION_BY_QUIZ(r))).data}catch(i){return console.error(i),[]}},saveQuestion:async r=>{try{return(await t.post(z.Endpoints.QUIZ_QUESTION,r)).data}catch(i){throw new Error("Failed to save question: "+oe(i))}},listVirtualGoodCatalogs:async()=>{try{return(await t.get(z.Endpoints.VIRTUAL_GOOD_CATALOG)).data}catch(r){return console.error(r),[]}},saveVirtualGoodCatalog:async r=>{try{return(await t.post(z.Endpoints.VIRTUAL_GOOD_CATALOG,r)).data}catch(i){throw new Error("Failed to save virtual good catalog: "+oe(i))}},listVirtualGoodItems:async()=>{try{return(await t.get(z.Endpoints.VIRTUAL_GOOD_ITEM)).data}catch(r){return console.error(r),[]}},saveVirtualGoodItem:async r=>{try{return(await t.post(z.Endpoints.VIRTUAL_GOOD_ITEM,r)).data}catch(i){throw new Error("Failed to save virtual good item: "+oe(i))}},deleteVirtualGoodCatalog:async r=>{try{return await t.delete(`${z.Endpoints.VIRTUAL_GOOD_CATALOG}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete virtual good catalog: "+oe(i))}},deleteVirtualGoodItem:async r=>{try{return await t.delete(`${z.Endpoints.VIRTUAL_GOOD_ITEM}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete virtual good item: "+oe(i))}},getGamification:async r=>{try{return(await t.get(z.Endpoints.GAMIFICATION(r))).data}catch(i){if(i.response?.data)return i.response.data;throw console.error(i),i}}}}});var c4=v(Yc=>{"use strict";var s4=Yc&&Yc.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Yc,"__esModule",{value:!0});Yc.resolveConfig=ZX;var o4=s4(require("fs")),FX=s4(require("path"));function ZX(e){let t=e||FX.default.join(process.cwd(),"funifier.json");if(o4.default.existsSync(t)){let a=o4.default.readFileSync(t,"utf-8"),o=JSON.parse(a);if(o.apiKey&&o.secretKey&&o.serverUrl)return{apiKey:o.apiKey,secretKey:o.secretKey,serverUrl:o.serverUrl};throw new Error(`funifier.json at ${t} is missing required fields (apiKey, secretKey, serverUrl)`)}let r=process.env.FUNIFIER_API_KEY,i=process.env.FUNIFIER_SECRET_KEY,n=process.env.FUNIFIER_SERVER_URL;if(r&&i&&n)return{apiKey:r,secretKey:i,serverUrl:n};throw new Error("Funifier config not found. Provide funifier.json in the working directory or set FUNIFIER_API_KEY, FUNIFIER_SECRET_KEY, and FUNIFIER_SERVER_URL environment variables.")}});var l4=v(u4=>{"use strict";Object.defineProperty(u4,"__esModule",{value:!0})});var p4=v(d4=>{"use strict";Object.defineProperty(d4,"__esModule",{value:!0})});var m4=v(f4=>{"use strict";Object.defineProperty(f4,"__esModule",{value:!0})});var g4=v(h4=>{"use strict";Object.defineProperty(h4,"__esModule",{value:!0})});var v4=v(x4=>{"use strict";Object.defineProperty(x4,"__esModule",{value:!0})});var y4=v(b4=>{"use strict";Object.defineProperty(b4,"__esModule",{value:!0})});var w4=v(_4=>{"use strict";Object.defineProperty(_4,"__esModule",{value:!0})});var D4=v(S4=>{"use strict";Object.defineProperty(S4,"__esModule",{value:!0})});var E4=v($4=>{"use strict";Object.defineProperty($4,"__esModule",{value:!0})});var P4=v(O4=>{"use strict";Object.defineProperty(O4,"__esModule",{value:!0})});var T4=v(j4=>{"use strict";Object.defineProperty(j4,"__esModule",{value:!0})});var C4=v(I4=>{"use strict";Object.defineProperty(I4,"__esModule",{value:!0})});var R4=v(k4=>{"use strict";Object.defineProperty(k4,"__esModule",{value:!0})});var N4=v(A4=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0})});var F4=v(M4=>{"use strict";Object.defineProperty(M4,"__esModule",{value:!0})});var z4=v(Z4=>{"use strict";Object.defineProperty(Z4,"__esModule",{value:!0})});var U4=v(q4=>{"use strict";Object.defineProperty(q4,"__esModule",{value:!0})});var B4=v(L4=>{"use strict";Object.defineProperty(L4,"__esModule",{value:!0})});var H4=v(V4=>{"use strict";Object.defineProperty(V4,"__esModule",{value:!0})});var K4=v(G4=>{"use strict";Object.defineProperty(G4,"__esModule",{value:!0})});var W4=v(J4=>{"use strict";Object.defineProperty(J4,"__esModule",{value:!0})});var Y4=v(Ye=>{"use strict";var zX=Ye&&Ye.__createBinding||(Object.create?function(e,t,r,i){i===void 0&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){i===void 0&&(i=r),e[i]=t[r]}),ht=Ye&&Ye.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&zX(t,e,r)};Object.defineProperty(Ye,"__esModule",{value:!0});ht(l4(),Ye);ht(p4(),Ye);ht(m4(),Ye);ht(g4(),Ye);ht(v4(),Ye);ht(y4(),Ye);ht(w4(),Ye);ht(D4(),Ye);ht(E4(),Ye);ht(P4(),Ye);ht(T4(),Ye);ht(C4(),Ye);ht(R4(),Ye);ht(N4(),Ye);ht(F4(),Ye);ht(z4(),Ye);ht(U4(),Ye);ht(B4(),Ye);ht(H4(),Ye);ht(K4(),Ye);ht(W4(),Ye)});var Q4=v(nr=>{"use strict";var qX=nr&&nr.__createBinding||(Object.create?function(e,t,r,i){i===void 0&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){i===void 0&&(i=r),e[i]=t[r]}),UX=nr&&nr.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&qX(t,e,r)};Object.defineProperty(nr,"__esModule",{value:!0});nr.Endpoints=nr.API=nr.resolveConfig=nr.createAPIClient=void 0;var LX=a4();Object.defineProperty(nr,"createAPIClient",{enumerable:!0,get:function(){return LX.createAPIClient}});var BX=c4();Object.defineProperty(nr,"resolveConfig",{enumerable:!0,get:function(){return BX.resolveConfig}});var X4=Mx();Object.defineProperty(nr,"API",{enumerable:!0,get:function(){return X4.API}});Object.defineProperty(nr,"Endpoints",{enumerable:!0,get:function(){return X4.Endpoints}});UX(Y4(),nr)});var tO=v(bp=>{"use strict";Object.defineProperty(bp,"__esModule",{value:!0});bp.ApiHolder=void 0;var eO=Q4(),Fx=class{constructor(){this.client=null,this.currentConfig=null,this.connectionName=null}tryAutoConnect(){try{let t=(0,eO.resolveConfig)();return this.connect(t),!0}catch{return!1}}connect(t,r){this.client=(0,eO.createAPIClient)(t),this.currentConfig=t,this.connectionName=r||t.serverUrl}getClient(){return this.client}requireClient(){if(!this.client)throw new Error("Not connected to any Funifier instance. Use the funifier_connect tool first with your apiKey, secretKey, and serverUrl.");return this.client}getConnectionInfo(){return{connected:this.client!==null,serverUrl:this.currentConfig?.serverUrl||null,name:this.connectionName}}disconnect(){this.client=null,this.currentConfig=null,this.connectionName=null}};bp.ApiHolder=Fx});var Zx=v((Rce,VX)=>{VX.exports={name:"funifier-mcp",version:"0.3.6",description:"Funifier AI toolkit \u2014 MCP server, API client, and Claude Code skills for the Funifier gamification platform",main:"dist/index.js",types:"dist/index.d.ts",bin:{"funifier-mcp":"dist/mcp/index.js"},files:["dist","skills","doc","datasource-funifier-docs","AGENTS.md",".github/copilot-instructions.md",".cursor/rules/funifier.mdc","README.md","LICENSE"],repository:{type:"git",url:"git+https://github.com/funifierinc/funifier-mcp.git"},bugs:{url:"https://github.com/funifierinc/funifier-mcp/issues"},homepage:"https://github.com/funifierinc/funifier-mcp#readme",author:"Funifier",publishConfig:{access:"public"},scripts:{build:"tsc",bundle:"npm run build && esbuild dist/mcp/index.js --bundle --outfile=dist/mcp/bundle.js --format=cjs --platform=node --minify",dev:"tsc --watch",prepublishOnly:"npm run build:skills && npm run bundle",test:"vitest run","test:watch":"vitest watch","build:skills":"tsx scripts/build-skills.ts","build:skills:force":"tsx scripts/build-skills.ts --force","search:docs":"tsx scripts/search-docs.ts","validate:skills":"tsx scripts/validate-skills.ts","enrich:skills":"tsx scripts/enrich-skills.ts","generate:skills":"tsx scripts/generate-skills.ts","dev:init":"npm run build && node scripts/dev-init.js"},keywords:["funifier","gamification","mcp","model-context-protocol","claude","ai","api-client"],license:"MIT",dependencies:{"@inquirer/prompts":"^7.10.1","@modelcontextprotocol/sdk":"^1.0.0",axios:"^1.6.0",zod:"^3.25.76"},devDependencies:{"@anthropic-ai/sdk":"^0.96.0","@types/node":"^25.5.0",esbuild:"^0.20.0",tsx:"^4.21.0",typescript:"^5.3.0",vitest:"^1.0.0"},engines:{node:">=18"}}});var qx=v(Qa=>{"use strict";Object.defineProperty(Qa,"__esModule",{value:!0});Qa.setUpdateNotice=nO;Qa.consumeUpdateNotice=HX;Qa.formatUpdateNotice=iO;Qa.checkForUpdate=GX;Qa.isOutdated=rO;function rO(e,t){let r=u=>u.replace(/[^0-9.]/g,"").split(".").map(Number),[i,n,a]=r(e),[o,s,c]=r(t);return o!==i?o>i:s!==n?s>n:c>a}var zx=null;function nO(e){zx=e}function HX(){let e=zx;return zx=null,e}function iO(e,t){return[`\u2B06 funifier-mcp: nova vers\xE3o dispon\xEDvel (${e} \u2192 ${t}).`,"","[assistant instruction] Before continuing, tell the user \u2014 in one short sentence, in the language they are using \u2014 that a newer version of funifier-mcp is available and that they should run `npx funifier-mcp@latest init` to update. One line only, do not speculate about the changelog, then continue with their task."].join(`
|
|
64
|
+
`+a)}}catch{}}throw i}}_request(t,r){typeof t=="string"?(r=r||{},r.url=t):r=t||{},r=Xa(this.defaults,r);let{transitional:i,paramsSerializer:n,headers:a}=r;i!==void 0&&sp.assertOptions(i,{silentJSONParsing:Jr.transitional(Jr.boolean),forcedJSONParsing:Jr.transitional(Jr.boolean),clarifyTimeoutError:Jr.transitional(Jr.boolean),legacyInterceptorReqResOrdering:Jr.transitional(Jr.boolean)},!1),n!=null&&(E.isFunction(n)?r.paramsSerializer={serialize:n}:sp.assertOptions(n,{encode:Jr.function,serialize:Jr.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),sp.assertOptions(r,{baseUrl:Jr.spelling("baseURL"),withXsrfToken:Jr.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let o=a&&E.merge(a.common,a[r.method]);a&&E.forEach(["delete","get","head","post","put","patch","query","common"],x=>{delete a[x]}),r.headers=wt.concat(o,a);let s=[],c=!0;this.interceptors.request.forEach(function(y){if(typeof y.runWhen=="function"&&y.runWhen(r)===!1)return;c=c&&y.synchronous;let _=r.transitional||xp;_&&_.legacyInterceptorReqResOrdering?s.unshift(y.fulfilled,y.rejected):s.push(y.fulfilled,y.rejected)});let u=[];this.interceptors.response.forEach(function(y){u.push(y.fulfilled,y.rejected)});let l,p=0,m;if(!c){let x=[EE.bind(this),void 0];for(x.unshift(...s),x.push(...u),m=x.length,l=Promise.resolve(r);p<m;)l=l.then(x[p++],x[p++]);return l}m=s.length;let h=r;for(;p<m;){let x=s[p++],y=s[p++];try{h=x(h)}catch(_){y.call(this,_);break}}try{l=EE.call(this,h)}catch(x){return Promise.reject(x)}for(p=0,m=u.length;p<m;)l=l.then(u[p++],u[p++]);return l}getUri(t){t=Xa(this.defaults,t);let r=Ax(t.baseURL,t.url,t.allowAbsoluteUrls);return kx(r,t.params,t.paramsSerializer)}};E.forEach(["delete","get","head","options"],function(t){Ei.prototype[t]=function(r,i){return this.request(Xa(i||{},{method:t,url:r,data:(i||{}).data}))}});E.forEach(["post","put","patch","query"],function(t){function r(i){return function(a,o,s){return this.request(Xa(s||{},{method:t,headers:i?{"Content-Type":"multipart/form-data"}:{},url:a,data:o}))}}Ei.prototype[t]=r(),t!=="query"&&(Ei.prototype[t+"Form"]=r(!0))});var Px=class e{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(a){r=a});let i=this;this.promise.then(n=>{if(!i._listeners)return;let a=i._listeners.length;for(;a-- >0;)i._listeners[a](n);i._listeners=null}),this.promise.then=n=>{let a,o=new Promise(s=>{i.subscribe(s),a=s}).then(n);return o.cancel=function(){i.unsubscribe(a)},o},t(function(a,o,s){i.reason||(i.reason=new Oi(a,o,s),r(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;let r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let t=new AbortController,r=i=>{t.abort(i)};return this.subscribe(r),t.signal.unsubscribe=()=>this.unsubscribe(r),t.signal}static source(){let t;return{token:new e(function(n){t=n}),cancel:t}}};function kX(e){return function(r){return e.apply(null,r)}}function RX(e){return E.isObject(e)&&e.isAxiosError===!0}var jx={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(jx).forEach(([e,t])=>{jx[t]=e});function t4(e){let t=new Ei(e),r=IE(Ei.prototype.request,t);return E.extend(r,Ei.prototype,t,{allOwnKeys:!0}),E.extend(r,t,null,{allOwnKeys:!0}),r.create=function(n){return t4(Xa(e,n))},r}var St=t4(Wc);St.Axios=Ei;St.CanceledError=Oi;St.CancelToken=Px;St.isCancel=BE;St.VERSION=Vc;St.toFormData=gp;St.AxiosError=R;St.Cancel=St.CanceledError;St.all=function(t){return Promise.all(t)};St.spread=kX;St.isAxiosError=RX;St.mergeConfig=Xa;St.AxiosHeaders=wt;St.formToJSON=e=>LE(E.isHTMLForm(e)?new FormData(e):e);St.getAdapter=e4.getAdapter;St.HttpStatusCode=jx;St.default=St;r4.exports=St});var Mx=v(ds=>{"use strict";Object.defineProperty(ds,"__esModule",{value:!0});ds.Endpoints=ds.API=void 0;ds.API={RANGE_HEADER:"items=0-1000",BASE_PATH:"/v3"};ds.Endpoints={TRIGGER:"/trigger",SCHEDULER:"/scheduler",SCHEDULER_FETCH:"/database/scheduler",WIDGET:"/widget",CUSTOM_PAGE:"/database/studio_page",AGGREGATE:"/database/prepared_aggregate",AGGREGATE_BY_ID:e=>`/prepared/aggregate/${e}`,AGGREGATE_PARAMS:e=>`/find/${e}/params`,AGGREGATE_FIND:e=>`/find/${e}`,AGGREGATE_ANALYZE:e=>`/prepared/aggregate/${e}/analyze`,PUBLIC_ENDPOINT:"/database/public_endpoint",PUBLIC_ENDPOINT_UPDATE:"/public",PUBLIC_ENDPOINT_BY_ID:e=>`/public/${e}`,CHALLENGE_AGGREGATE:"/database/challenge_rule_prepared",AUTH_MODULE:"/database/auth_module",AUTH_MODULE_UPDATE:"/auth/module",WEBSOCKET:"/database/websocket",WEBSOCKET_UPDATE:"/websocket",AI_KNOWLEDGE:"/system/ai/knowledge",SCHEDULER_LOG:"/scheduler/log",TRIGGER_LOG:"/database/trigger_log/aggregate",CRON_VALIDATE:"/util/cron/evaluate",ACCOUNT_INFO:"/account/info",COLLECTIONS:"/database/collections",GAMIFICATION:e=>`/gamification/${e}`,ACTION:"/action",CHALLENGE:"/challenge",CHALLENGE_FETCH:"/database/challenge",POINT:"/point",LEVEL:"/level",LEVEL_CONFIG:"/database/level_config",LEVEL_POSITION:"/level/position",LEADERBOARD:"/leaderboard",LEADERBOARD_LEADERS:e=>`/leaderboard/${e}/leader/aggregate`,LEADERBOARD_RESET:"/leaderboard/reset",QUIZ:"/quiz",QUIZ_LIST:"/database/quiz",QUIZ_QUESTION:"/question",QUIZ_QUESTION_BY_QUIZ:e=>`/quiz/${e}/question`,QUIZ_START:"/quiz/start",QUIZ_FINISH:"/quiz/finish",QUESTION_LOG_BULK:"/question/log/bulk",VIRTUAL_GOOD_CATALOG:"/virtualgoods/catalog",VIRTUAL_GOOD_ITEM:"/virtualgoods/item",VIRTUAL_GOOD_PURCHASE:"/virtualgoods/purchase",FOLDER:"/folder",FOLDER_BY_ID:e=>`/folder/${e}`,FOLDER_INSIDE:"/folder/inside",FOLDER_PROGRESS:"/folder/progress",FOLDER_BREADCRUMB:"/folder/breadcrumb",FOLDER_MOVE:e=>`/folder/${e}/move`,FOLDER_CONTENT:"/folder/content",FOLDER_CONTENT_BY_ID:e=>`/folder/content/${e}`,FOLDER_CONTENT_DATA:e=>`/folder/content/${e}/data`,FOLDER_CONTENT_AGGREGATE:"/folder/content/aggregate",FOLDER_CONTENT_MOVE:e=>`/folder/content/${e}/move`,FOLDER_LOG:"/folder/log",FOLDER_LOG_BY_ID:e=>`/folder/log/${e}`,FOLDER_CONTENT_TYPE:"/database/folder_content_type",INDEX:e=>`/database/${e}/index`,INDEX_BY_NAME:(e,t)=>`/database/${e}/index/${encodeURIComponent(t)}`}});var a4=v(ps=>{"use strict";var AX=ps&&ps.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ps,"__esModule",{value:!0});ps.serializeToFunifierQuery=i4;ps.createAPIClient=MX;var NX=AX(n4()),z=Mx();function oe(e){if(e?.response?.data){let t=e.response.data;return typeof t=="string"?t:t.errorMessage?t.errorMessage:t.message?t.message:JSON.stringify(t)}return e?.message?e.message:String(e)}function i4(e){return Object.entries(e).map(([t,r])=>{if(r!==null&&typeof r=="object")throw Array.isArray(r)?new Error(`Array value for field "${t}" not supported in action=query. Use action=aggregate with [{"$match": {"${t}": {"$in": <array>}}}] instead.`):new Error(`Operator in field "${t}" not supported in action=query. Use action=aggregate with [{"$match": <filter>}] instead.`);return typeof r=="string"?`${t}:"${r}"`:`${t}:${r}`}).join(",")}function MX(e){if(!e.apiKey||!e.secretKey||!e.serverUrl)throw new Error("Funifier config is required: apiKey, secretKey, and serverUrl must be provided");let t=NX.default.create({baseURL:`${e.serverUrl}${z.API.BASE_PATH}`,headers:{"Content-Type":"application/json",Authorization:`Basic ${Buffer.from(`${e.apiKey}:${e.secretKey}`).toString("base64")}`,Range:z.API.RANGE_HEADER}});return{listTriggers:async()=>{try{return(await t.get(z.Endpoints.TRIGGER)).data}catch(r){return console.error(r),[]}},saveTrigger:async r=>{try{return(await t.post(z.Endpoints.TRIGGER,r)).data}catch(i){throw new Error("Failed to update trigger: "+oe(i))}},deleteTrigger:async r=>{try{return(await t.delete(`${z.Endpoints.TRIGGER}/${r}`)).data}catch(i){throw new Error("Failed to delete trigger: "+oe(i))}},getTriggerLogs:async r=>{try{let i=[{$match:{_id:r}}];return(await t.post(z.Endpoints.TRIGGER_LOG,i)).data}catch(i){return console.error(i),[]}},listSchedulers:async()=>{try{return(await t.get(z.Endpoints.SCHEDULER_FETCH)).data}catch(r){return console.error(r),[]}},saveScheduler:async r=>{try{return(await t.post(z.Endpoints.SCHEDULER,r)).data}catch(i){throw new Error("Failed to save scheduler: "+oe(i))}},deleteScheduler:async r=>{try{return(await t.delete(`${z.Endpoints.SCHEDULER}/${r}`)).data}catch(i){throw new Error("Failed to delete scheduler: "+oe(i))}},executeScheduler:async r=>{try{return(await t.get(`${z.Endpoints.SCHEDULER}/execute/${r}`)).data}catch(i){throw console.error(i),new Error("Failed to execute scheduler: "+oe(i))}},getSchedulerLogs:async r=>{try{return(await t.get(z.Endpoints.SCHEDULER_LOG,{params:{orderby:"time",reverse:!0,max_results:10,item:r}})).data}catch(i){return console.error(i),[]}},listAggregates:async()=>{try{return(await t.get(z.Endpoints.AGGREGATE)).data}catch(r){return console.error(r),[]}},saveAggregate:async r=>{try{return(await t.put(z.Endpoints.AGGREGATE,r)).data}catch(i){throw new Error("Failed to save aggregate: "+oe(i))}},deleteAggregate:async r=>{try{return(await t.delete(z.Endpoints.AGGREGATE_BY_ID(r))).data}catch(i){throw new Error("Failed to delete aggregate: "+oe(i))}},executeAggregate:async(r,i)=>{try{return(await t.post(z.Endpoints.AGGREGATE_FIND(r),i)).data}catch(n){throw console.error(n),new Error("Failed to execute aggregate: "+oe(n))}},analyzeAggregate:async(r,i)=>{try{return(await t.post(z.Endpoints.AGGREGATE_ANALYZE(r),i)).data}catch(n){throw console.error(n),new Error("Failed to analyze aggregate: "+oe(n))}},getAggregateParams:async r=>{try{return(await t.get(z.Endpoints.AGGREGATE_PARAMS(r))).data}catch(i){throw console.error(i),new Error("Failed to get aggregate params: "+oe(i))}},listWebsockets:async()=>{try{return(await t.get(z.Endpoints.WEBSOCKET)).data}catch(r){return console.error(r),[]}},saveWebsocket:async(r,i)=>{try{let n={...r,isNew:i};return(await t.post(z.Endpoints.WEBSOCKET_UPDATE,n)).data}catch(n){throw new Error("Failed to save websocket: "+oe(n))}},deleteWebsocket:async r=>{try{return await t.delete(`${z.Endpoints.WEBSOCKET_UPDATE}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete websocket: "+oe(i))}},listWidgets:async()=>{try{return(await t.get(z.Endpoints.WIDGET)).data}catch(r){return console.error(r),[]}},getWidgetById:async r=>{try{return(await t.get(`${z.Endpoints.WIDGET}/${r}`)).data}catch(i){console.error(i);return}},saveWidget:async r=>{try{return(await t.post(z.Endpoints.WIDGET,r)).data}catch(i){throw new Error("Failed to save widget: "+oe(i))}},deleteWidget:async r=>{try{return(await t.delete(`${z.Endpoints.WIDGET}/${r}`)).data}catch(i){throw new Error("Failed to delete widget: "+oe(i))}},listCustomPages:async()=>{try{return(await t.get(z.Endpoints.CUSTOM_PAGE)).data}catch(r){return console.error(r),[]}},saveCustomPage:async r=>{try{return(await t.put(z.Endpoints.CUSTOM_PAGE,r)).data}catch(i){throw new Error("Failed to save custom page: "+oe(i))}},deleteCustomPage:async r=>{try{return(await t.delete(`${z.Endpoints.CUSTOM_PAGE}?q=_id:'${r}'`)).data}catch(i){throw new Error("Failed to delete custom page: "+oe(i))}},listPublicEndpoints:async()=>{try{return(await t.get(z.Endpoints.PUBLIC_ENDPOINT)).data}catch(r){return console.error(r),[]}},savePublicEndpoint:async r=>{try{return(await t.post(z.Endpoints.PUBLIC_ENDPOINT_UPDATE,r)).data}catch(i){throw new Error("Failed to save public endpoint: "+oe(i))}},deletePublicEndpoint:async r=>{try{return(await t.delete(z.Endpoints.PUBLIC_ENDPOINT_BY_ID(r))).data}catch(i){throw new Error("Failed to delete public endpoint: "+oe(i))}},executePublicEndpoint:async(r,i,n,a)=>{try{let o=`/pub/${r}/${i}`;return(a.toUpperCase()==="GET"?await t.get(o):await t.post(o,n)).data}catch(o){if(console.error(o),o.response?.data)return o.response.data;throw new Error("Failed to execute public endpoint: "+oe(o))}},listChallengeAggregates:async()=>{try{return(await t.get(z.Endpoints.CHALLENGE_AGGREGATE)).data}catch(r){return console.error(r),[]}},saveChallengeAggregate:async r=>{try{return(await t.put(z.Endpoints.CHALLENGE_AGGREGATE,r)).data}catch(i){throw new Error("Failed to execute aggregate: "+oe(i))}},deleteChallengeAggregate:async r=>{try{return(await t.delete(`${z.Endpoints.CHALLENGE_AGGREGATE}?q=_id:'${r}'`)).data}catch(i){throw new Error("Failed to delete challenge aggregate: "+oe(i))}},listAuthModules:async()=>{try{return(await t.get(z.Endpoints.AUTH_MODULE)).data}catch(r){return console.error(r),[]}},saveAuthModule:async(r,i)=>{try{let n={...r,isNew:i};return(await t.post(z.Endpoints.AUTH_MODULE_UPDATE,n)).data}catch(n){throw new Error("Failed to save auth module: "+oe(n))}},deleteAuthModule:async r=>{try{return await t.delete(`${z.Endpoints.AUTH_MODULE_UPDATE}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete auth module: "+oe(i))}},listAiKnowledge:async()=>{try{return(await t.post(`${z.Endpoints.AI_KNOWLEDGE}/aggregate`,[])).data}catch(r){return console.error(r),[]}},saveAiKnowledge:async r=>{try{return(await t.post(z.Endpoints.AI_KNOWLEDGE,r)).data}catch(i){throw new Error("Failed to save AI knowledge: "+oe(i))}},deleteAiKnowledge:async r=>{try{return(await t.delete(`${z.Endpoints.AI_KNOWLEDGE}/${r}`)).data}catch(i){throw new Error("Failed to delete AI knowledge: "+oe(i))}},getStudioPageFolders:async()=>{try{let i=(await t.get(`${z.Endpoints.CUSTOM_PAGE}_folder`)).data;return Array.isArray(i)?i:i&&typeof i=="object"?[i]:[]}catch(r){return console.error(r),[]}},listFolders:async()=>{try{return(await t.get("/database/folder")).data}catch(r){return console.error(r),[]}},saveFolder:async r=>{try{return(await t.post(z.Endpoints.FOLDER,r)).data}catch(i){throw new Error("Failed to save folder: "+oe(i))}},deleteFolder:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder: "+oe(i))}},listFolderContents:async()=>{try{return(await t.get("/database/folder_content")).data}catch(r){return console.error(r),[]}},saveFolderContent:async r=>{try{return(await t.post(z.Endpoints.FOLDER_CONTENT,r)).data}catch(i){throw new Error("Failed to save folder content: "+oe(i))}},deleteFolderContent:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_CONTENT_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder content: "+oe(i))}},listFolderContentTypes:async()=>{try{return(await t.get(z.Endpoints.FOLDER_CONTENT_TYPE)).data}catch(r){return console.error(r),[]}},saveFolderContentType:async r=>{try{return(await t.put(z.Endpoints.FOLDER_CONTENT_TYPE,r)).data}catch(i){throw new Error("Failed to save folder content type: "+oe(i))}},listFolderLogs:async()=>{try{return(await t.get("/database/folder_log")).data}catch(r){return console.error(r),[]}},saveFolderLog:async r=>{try{return(await t.post(z.Endpoints.FOLDER_LOG,r)).data}catch(i){throw new Error("Failed to save folder log: "+oe(i))}},deleteFolderLog:async r=>{try{return(await t.delete(z.Endpoints.FOLDER_LOG_BY_ID(r))).data}catch(i){throw new Error("Failed to delete folder log: "+oe(i))}},folderInside:async r=>{try{return(await t.post(z.Endpoints.FOLDER_INSIDE,{folder:r})).data}catch(i){throw new Error("Failed to get folder inside: "+oe(i))}},folderProgress:async(r,i)=>{try{return(await t.post(z.Endpoints.FOLDER_PROGRESS,{folder:r,player:i})).data}catch(n){throw new Error("Failed to get folder progress: "+oe(n))}},folderBreadcrumb:async r=>{try{return(await t.post(z.Endpoints.FOLDER_BREADCRUMB,{folder:r})).data}catch(i){throw new Error("Failed to get folder breadcrumb: "+oe(i))}},evaluateCron:async r=>{try{return(await t.post(z.Endpoints.CRON_VALIDATE,{expression:r,language:"en"})).data}catch(i){throw console.error(i),new Error("Failed to evaluate cron expression: "+oe(i))}},getCollections:async()=>{try{return(await t.get(z.Endpoints.COLLECTIONS)).data}catch(r){return console.error(r),[]}},queryCollection:async(r,i={},n={})=>{let a={};Object.keys(i).length>0&&(a.q=i4(i));try{n.sort&&(a.sort=JSON.stringify(n.sort));let o=n.skip??0,s=n.limit??10;return(await t.get(`/database/${r}`,{params:a,headers:{Range:`items=${o}-${s}`}})).data}catch(o){return console.error(o),[]}},aggregateCollection:async(r,i)=>{try{return(await t.post(`/database/${r}/aggregate`,i)).data}catch(n){throw console.error(n),new Error(`Failed to aggregate on ${r}: ${n}`)}},insertDocument:async(r,i)=>{try{return(await t.post(`/database/${r}`,i)).data}catch(n){throw console.error(n),new Error(`Failed to insert document into ${r}: ${n}`)}},updateDocument:async(r,i)=>{try{return(await t.put(`/database/${r}`,i)).data}catch(n){throw console.error(n),new Error(`Failed to update document in ${r}: ${n}`)}},deleteDocument:async(r,i)=>{try{return(await t.delete(`/database/${r}?q=${i}`)).data}catch(n){throw console.error(n),new Error(`Failed to delete document from ${r}: ${n}`)}},bulkInsert:async(r,i)=>{try{return(await t.post(`/database/${r}/bulk`,i)).data}catch(n){throw console.error(n),new Error(`Failed to bulk insert into ${r}: ${n}`)}},listIndexes:async r=>{try{return(await t.get(z.Endpoints.INDEX(r))).data}catch(i){return console.error(i),[]}},createIndex:async(r,i)=>{try{return(await t.post(z.Endpoints.INDEX(r),i)).data}catch(n){throw new Error(`Failed to create index on '${r}': ${oe(n)}`)}},dropIndex:async(r,i)=>{try{return(await t.delete(z.Endpoints.INDEX_BY_NAME(r,i))).data}catch(n){throw new Error(`Failed to drop index '${i}' on '${r}': ${oe(n)}`)}},listActions:async()=>{try{return(await t.get(z.Endpoints.ACTION)).data}catch(r){return console.error(r),[]}},saveAction:async r=>{try{return(await t.post(z.Endpoints.ACTION,r)).data}catch(i){throw new Error("Failed to save action: "+oe(i))}},deleteAction:async r=>{try{return(await t.delete(`${z.Endpoints.ACTION}/${r}`)).data}catch(i){throw new Error("Failed to delete action: "+oe(i))}},listChallenges:async()=>{try{return(await t.get(z.Endpoints.CHALLENGE_FETCH)).data}catch(r){return console.error(r),[]}},saveChallenge:async r=>{try{return(await t.post(z.Endpoints.CHALLENGE,r)).data}catch(i){throw new Error("Failed to save challenge: "+oe(i))}},deleteChallenge:async r=>{try{return(await t.delete(`${z.Endpoints.CHALLENGE}/${r}`)).data}catch(i){throw new Error("Failed to delete challenge: "+oe(i))}},listPoints:async()=>{try{return(await t.get(z.Endpoints.POINT)).data}catch(r){return console.error(r),[]}},savePoint:async r=>{try{return(await t.post(z.Endpoints.POINT,r)).data}catch(i){throw new Error("Failed to save point: "+oe(i))}},deletePoint:async r=>{try{return(await t.delete(`${z.Endpoints.POINT}/${r}`)).data}catch(i){throw new Error("Failed to delete point: "+oe(i))}},listLevels:async()=>{try{return(await t.get(z.Endpoints.LEVEL)).data}catch(r){return console.error(r),[]}},saveLevel:async r=>{try{return(await t.post(z.Endpoints.LEVEL,r)).data}catch(i){throw new Error("Failed to save level: "+oe(i))}},deleteLevel:async r=>{try{return(await t.delete(`${z.Endpoints.LEVEL}/${r}`)).data}catch(i){throw new Error("Failed to delete level: "+oe(i))}},saveLevelConfig:async r=>{try{return(await t.put(z.Endpoints.LEVEL_CONFIG,r)).data}catch(i){throw new Error("Failed to save level config: "+oe(i))}},listLeaderboards:async()=>{try{return(await t.get(z.Endpoints.LEADERBOARD)).data}catch(r){return console.error(r),[]}},saveLeaderboard:async r=>{try{return(await t.post(z.Endpoints.LEADERBOARD,r)).data}catch(i){throw new Error("Failed to save leaderboard: "+oe(i))}},deleteLeaderboard:async r=>{try{return(await t.delete(`${z.Endpoints.LEADERBOARD}/${r}`)).data}catch(i){throw new Error("Failed to delete leaderboard: "+oe(i))}},getLeaderboardResults:async r=>{try{return(await t.post(z.Endpoints.LEADERBOARD_LEADERS(r),[])).data}catch(i){return console.error(i),[]}},listQuizzes:async()=>{try{return(await t.get(z.Endpoints.QUIZ_LIST)).data}catch(r){return console.error(r),[]}},saveQuiz:async r=>{try{return(await t.post(z.Endpoints.QUIZ,r)).data}catch(i){throw new Error("Failed to save quiz: "+oe(i))}},deleteQuiz:async r=>{try{return(await t.delete(`${z.Endpoints.QUIZ}/${r}`)).data}catch(i){throw new Error("Failed to delete quiz: "+oe(i))}},listQuizQuestions:async r=>{try{return(await t.get(z.Endpoints.QUIZ_QUESTION_BY_QUIZ(r))).data}catch(i){return console.error(i),[]}},saveQuestion:async r=>{try{return(await t.post(z.Endpoints.QUIZ_QUESTION,r)).data}catch(i){throw new Error("Failed to save question: "+oe(i))}},listVirtualGoodCatalogs:async()=>{try{return(await t.get(z.Endpoints.VIRTUAL_GOOD_CATALOG)).data}catch(r){return console.error(r),[]}},saveVirtualGoodCatalog:async r=>{try{return(await t.post(z.Endpoints.VIRTUAL_GOOD_CATALOG,r)).data}catch(i){throw new Error("Failed to save virtual good catalog: "+oe(i))}},listVirtualGoodItems:async()=>{try{return(await t.get(z.Endpoints.VIRTUAL_GOOD_ITEM)).data}catch(r){return console.error(r),[]}},saveVirtualGoodItem:async r=>{try{return(await t.post(z.Endpoints.VIRTUAL_GOOD_ITEM,r)).data}catch(i){throw new Error("Failed to save virtual good item: "+oe(i))}},deleteVirtualGoodCatalog:async r=>{try{return await t.delete(`${z.Endpoints.VIRTUAL_GOOD_CATALOG}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete virtual good catalog: "+oe(i))}},deleteVirtualGoodItem:async r=>{try{return await t.delete(`${z.Endpoints.VIRTUAL_GOOD_ITEM}/${r}`),{success:!0}}catch(i){throw new Error("Failed to delete virtual good item: "+oe(i))}},getGamification:async r=>{try{return(await t.get(z.Endpoints.GAMIFICATION(r))).data}catch(i){if(i.response?.data)return i.response.data;throw console.error(i),i}}}}});var c4=v(Yc=>{"use strict";var s4=Yc&&Yc.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Yc,"__esModule",{value:!0});Yc.resolveConfig=ZX;var o4=s4(require("fs")),FX=s4(require("path"));function ZX(e){let t=e||FX.default.join(process.cwd(),"funifier.json");if(o4.default.existsSync(t)){let a=o4.default.readFileSync(t,"utf-8"),o=JSON.parse(a);if(o.apiKey&&o.secretKey&&o.serverUrl)return{apiKey:o.apiKey,secretKey:o.secretKey,serverUrl:o.serverUrl};throw new Error(`funifier.json at ${t} is missing required fields (apiKey, secretKey, serverUrl)`)}let r=process.env.FUNIFIER_API_KEY,i=process.env.FUNIFIER_SECRET_KEY,n=process.env.FUNIFIER_SERVER_URL;if(r&&i&&n)return{apiKey:r,secretKey:i,serverUrl:n};throw new Error("Funifier config not found. Provide funifier.json in the working directory or set FUNIFIER_API_KEY, FUNIFIER_SECRET_KEY, and FUNIFIER_SERVER_URL environment variables.")}});var l4=v(u4=>{"use strict";Object.defineProperty(u4,"__esModule",{value:!0})});var p4=v(d4=>{"use strict";Object.defineProperty(d4,"__esModule",{value:!0})});var m4=v(f4=>{"use strict";Object.defineProperty(f4,"__esModule",{value:!0})});var g4=v(h4=>{"use strict";Object.defineProperty(h4,"__esModule",{value:!0})});var v4=v(x4=>{"use strict";Object.defineProperty(x4,"__esModule",{value:!0})});var y4=v(b4=>{"use strict";Object.defineProperty(b4,"__esModule",{value:!0})});var w4=v(_4=>{"use strict";Object.defineProperty(_4,"__esModule",{value:!0})});var D4=v(S4=>{"use strict";Object.defineProperty(S4,"__esModule",{value:!0})});var E4=v($4=>{"use strict";Object.defineProperty($4,"__esModule",{value:!0})});var P4=v(O4=>{"use strict";Object.defineProperty(O4,"__esModule",{value:!0})});var T4=v(j4=>{"use strict";Object.defineProperty(j4,"__esModule",{value:!0})});var C4=v(I4=>{"use strict";Object.defineProperty(I4,"__esModule",{value:!0})});var R4=v(k4=>{"use strict";Object.defineProperty(k4,"__esModule",{value:!0})});var N4=v(A4=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0})});var F4=v(M4=>{"use strict";Object.defineProperty(M4,"__esModule",{value:!0})});var z4=v(Z4=>{"use strict";Object.defineProperty(Z4,"__esModule",{value:!0})});var U4=v(q4=>{"use strict";Object.defineProperty(q4,"__esModule",{value:!0})});var B4=v(L4=>{"use strict";Object.defineProperty(L4,"__esModule",{value:!0})});var H4=v(V4=>{"use strict";Object.defineProperty(V4,"__esModule",{value:!0})});var K4=v(G4=>{"use strict";Object.defineProperty(G4,"__esModule",{value:!0})});var W4=v(J4=>{"use strict";Object.defineProperty(J4,"__esModule",{value:!0})});var Y4=v(Ye=>{"use strict";var zX=Ye&&Ye.__createBinding||(Object.create?function(e,t,r,i){i===void 0&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){i===void 0&&(i=r),e[i]=t[r]}),ht=Ye&&Ye.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&zX(t,e,r)};Object.defineProperty(Ye,"__esModule",{value:!0});ht(l4(),Ye);ht(p4(),Ye);ht(m4(),Ye);ht(g4(),Ye);ht(v4(),Ye);ht(y4(),Ye);ht(w4(),Ye);ht(D4(),Ye);ht(E4(),Ye);ht(P4(),Ye);ht(T4(),Ye);ht(C4(),Ye);ht(R4(),Ye);ht(N4(),Ye);ht(F4(),Ye);ht(z4(),Ye);ht(U4(),Ye);ht(B4(),Ye);ht(H4(),Ye);ht(K4(),Ye);ht(W4(),Ye)});var Q4=v(nr=>{"use strict";var qX=nr&&nr.__createBinding||(Object.create?function(e,t,r,i){i===void 0&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){i===void 0&&(i=r),e[i]=t[r]}),UX=nr&&nr.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&qX(t,e,r)};Object.defineProperty(nr,"__esModule",{value:!0});nr.Endpoints=nr.API=nr.resolveConfig=nr.createAPIClient=void 0;var LX=a4();Object.defineProperty(nr,"createAPIClient",{enumerable:!0,get:function(){return LX.createAPIClient}});var BX=c4();Object.defineProperty(nr,"resolveConfig",{enumerable:!0,get:function(){return BX.resolveConfig}});var X4=Mx();Object.defineProperty(nr,"API",{enumerable:!0,get:function(){return X4.API}});Object.defineProperty(nr,"Endpoints",{enumerable:!0,get:function(){return X4.Endpoints}});UX(Y4(),nr)});var tO=v(bp=>{"use strict";Object.defineProperty(bp,"__esModule",{value:!0});bp.ApiHolder=void 0;var eO=Q4(),Fx=class{constructor(){this.client=null,this.currentConfig=null,this.connectionName=null}tryAutoConnect(){try{let t=(0,eO.resolveConfig)();return this.connect(t),!0}catch{return!1}}connect(t,r){this.client=(0,eO.createAPIClient)(t),this.currentConfig=t,this.connectionName=r||t.serverUrl}getClient(){return this.client}requireClient(){if(!this.client)throw new Error("Not connected to any Funifier instance. Use the funifier_connect tool first with your apiKey, secretKey, and serverUrl.");return this.client}getConnectionInfo(){return{connected:this.client!==null,serverUrl:this.currentConfig?.serverUrl||null,name:this.connectionName}}disconnect(){this.client=null,this.currentConfig=null,this.connectionName=null}};bp.ApiHolder=Fx});var Zx=v((Rce,VX)=>{VX.exports={name:"funifier-mcp",version:"0.3.8",description:"Funifier AI toolkit \u2014 MCP server, API client, and Claude Code skills for the Funifier gamification platform",main:"dist/index.js",types:"dist/index.d.ts",bin:{"funifier-mcp":"dist/mcp/index.js"},files:["dist","skills","doc","datasource-funifier-docs","AGENTS.md",".github/copilot-instructions.md",".cursor/rules/funifier.mdc","README.md","LICENSE"],repository:{type:"git",url:"git+https://github.com/funifierinc/funifier-mcp.git"},bugs:{url:"https://github.com/funifierinc/funifier-mcp/issues"},homepage:"https://github.com/funifierinc/funifier-mcp#readme",author:"Funifier",publishConfig:{access:"public"},scripts:{build:"tsc",bundle:"npm run build && esbuild dist/mcp/index.js --bundle --outfile=dist/mcp/bundle.js --format=cjs --platform=node --minify",dev:"tsc --watch",prepublishOnly:"npm run build:skills && npm run bundle",test:"vitest run","test:watch":"vitest watch","build:skills":"tsx scripts/build-skills.ts","build:skills:force":"tsx scripts/build-skills.ts --force","search:docs":"tsx scripts/search-docs.ts","validate:skills":"tsx scripts/validate-skills.ts","enrich:skills":"tsx scripts/enrich-skills.ts","generate:skills":"tsx scripts/generate-skills.ts","dev:init":"npm run build && node scripts/dev-init.js"},keywords:["funifier","gamification","mcp","model-context-protocol","claude","ai","api-client"],license:"MIT",dependencies:{"@inquirer/prompts":"^7.10.1","@modelcontextprotocol/sdk":"^1.0.0",axios:"^1.6.0",zod:"^3.25.76"},devDependencies:{"@anthropic-ai/sdk":"^0.96.0","@types/node":"^25.5.0",esbuild:"^0.20.0",tsx:"^4.21.0",typescript:"^5.3.0",vitest:"^1.0.0"},engines:{node:">=18"}}});var qx=v(Qa=>{"use strict";Object.defineProperty(Qa,"__esModule",{value:!0});Qa.setUpdateNotice=nO;Qa.consumeUpdateNotice=HX;Qa.formatUpdateNotice=iO;Qa.checkForUpdate=GX;Qa.isOutdated=rO;function rO(e,t){let r=u=>u.replace(/[^0-9.]/g,"").split(".").map(Number),[i,n,a]=r(e),[o,s,c]=r(t);return o!==i?o>i:s!==n?s>n:c>a}var zx=null;function nO(e){zx=e}function HX(){let e=zx;return zx=null,e}function iO(e,t){return[`\u2B06 funifier-mcp: nova vers\xE3o dispon\xEDvel (${e} \u2192 ${t}).`,"","[assistant instruction] Before continuing, tell the user \u2014 in one short sentence, in the language they are using \u2014 that a newer version of funifier-mcp is available and that they should run `npx funifier-mcp@latest init` to update. One line only, do not speculate about the changelog, then continue with their task."].join(`
|
|
65
65
|
`)}async function GX(){let{version:e}=Zx(),t;try{let i=await fetch("https://registry.npmjs.org/funifier-mcp/latest",{signal:AbortSignal.timeout(3e3)});if(!i.ok)return;t=(await i.json()).version}catch{return}if(!rO(e,t))return;let r=iO(e,t);nO(r),console.error(r)}});var aO=v(Ux=>{"use strict";Object.defineProperty(Ux,"__esModule",{value:!0});Ux.registerConnectTool=KX;var yp=rr();function KX(e,t){e.registerTool("funifier_connect",{title:"Connect to Funifier",description:"Connect to a Funifier gamification instance. Required before using other tools if no funifier.json or env vars are configured. Can also be used to switch between different instances during a session.",inputSchema:{apiKey:yp.z.string().describe("The Funifier API key"),secretKey:yp.z.string().describe("The Funifier secret key"),serverUrl:yp.z.string().describe("The Funifier server URL (e.g., 'https://example.funifier.com')"),name:yp.z.string().optional().describe("Optional friendly name for this connection (e.g., 'production', 'staging')")},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},async({apiKey:r,secretKey:i,serverUrl:n,name:a})=>{try{t.connect({apiKey:r,secretKey:i,serverUrl:n},a);let s=await t.requireClient().getCollections();return{content:[{type:"text",text:`Connected to Funifier: ${a||n}
|
|
66
66
|
Server: ${n}
|
|
67
67
|
Collections available: ${s.length}
|
|
@@ -109,9 +109,15 @@ ${JSON.stringify(h,null,2)}`}]}}if(r==="delete"){if(!n)return{content:[{type:"te
|
|
|
109
109
|
|
|
110
110
|
${JSON.stringify(m,null,2)}`}]}}if(r==="bulk"){if(!u)return{content:[{type:"text",text:"Error: 'data' is required for bulk action (JSON array)."}],isError:!0};let m=JSON.parse(u),h=await l.bulkInsert(i,m);return{content:[{type:"text",text:`Bulk inserted ${Array.isArray(m)?m.length:"?"} documents into '${i}':
|
|
111
111
|
|
|
112
|
-
${JSON.stringify(h,null,2)}`}]}}return{content:[{type:"text",text:`Unknown action: ${r}`}],isError:!0}}catch(l){return{content:[{type:"text",text:`Error in database ${r} on '${i}': ${l.message}`}],isError:!0}}})}});var _O=v(nv=>{"use strict";Object.defineProperty(nv,"__esModule",{value:!0});nv.registerFolderTool=ZQ;var yO=rr();function ZQ(e,t){e.registerTool("funifier_folder",{title:"Funifier Folder Operations",description:"Execute folder-specific operations that require server-side business logic. Use 'inside' to get the full folder tree. Use 'progress' to get a player's progress across the folder tree (also fires the folder_progress trigger). Use 'breadcrumb' to get the path from root to a specific folder node.",inputSchema:{operation:yO.z.enum(["inside","progress","breadcrumb"]).describe(`'inside': get full tree of subfolders and contents sorted by position. Payload: {"folder": "<id>"}. 'progress': get player progress across the tree; fires folder_progress trigger. Payload: {"folder": "<id>", "player": "<playerId>"}. 'breadcrumb': get path from root to this folder. Payload: {"folder": "<id>"}.`),payload:yO.z.string().describe("JSON string with operation parameters. See operation description for required fields.")},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},async({operation:r,payload:i})=>{try{let n=t.requireClient(),a=JSON.parse(i);if(!a.folder)return{content:[{type:"text",text:'"folder" is required in payload'}],isError:!0};if(r==="progress"&&!a.player)return{content:[{type:"text",text:'"player" is required in payload for operation "progress"'}],isError:!0};let o;switch(r){case"inside":o=await n.folderInside(a.folder);break;case"progress":o=await n.folderProgress(a.folder,a.player);break;case"breadcrumb":o=await n.folderBreadcrumb(a.folder);break}return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(n){return{content:[{type:"text",text:`Error executing folder ${r}: ${n.message}`}],isError:!0}}})}});var wO=v(iv=>{"use strict";Object.defineProperty(iv,"__esModule",{value:!0});iv.registerIndexTool=zQ;var wp=rr();function zQ(e,t){e.registerTool("funifier_index",{title:"Funifier MongoDB Index Manager",description:"Manage MongoDB indexes on Funifier database collections. Use 'list' to inspect existing indexes before creating new ones \u2014 avoid duplicates. Use 'create' to add a
|
|
112
|
+
${JSON.stringify(h,null,2)}`}]}}return{content:[{type:"text",text:`Unknown action: ${r}`}],isError:!0}}catch(l){return{content:[{type:"text",text:`Error in database ${r} on '${i}': ${l.message}`}],isError:!0}}})}});var _O=v(nv=>{"use strict";Object.defineProperty(nv,"__esModule",{value:!0});nv.registerFolderTool=ZQ;var yO=rr();function ZQ(e,t){e.registerTool("funifier_folder",{title:"Funifier Folder Operations",description:"Execute folder-specific operations that require server-side business logic. Use 'inside' to get the full folder tree. Use 'progress' to get a player's progress across the folder tree (also fires the folder_progress trigger). Use 'breadcrumb' to get the path from root to a specific folder node.",inputSchema:{operation:yO.z.enum(["inside","progress","breadcrumb"]).describe(`'inside': get full tree of subfolders and contents sorted by position. Payload: {"folder": "<id>"}. 'progress': get player progress across the tree; fires folder_progress trigger. Payload: {"folder": "<id>", "player": "<playerId>"}. 'breadcrumb': get path from root to this folder. Payload: {"folder": "<id>"}.`),payload:yO.z.string().describe("JSON string with operation parameters. See operation description for required fields.")},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},async({operation:r,payload:i})=>{try{let n=t.requireClient(),a=JSON.parse(i);if(!a.folder)return{content:[{type:"text",text:'"folder" is required in payload'}],isError:!0};if(r==="progress"&&!a.player)return{content:[{type:"text",text:'"player" is required in payload for operation "progress"'}],isError:!0};let o;switch(r){case"inside":o=await n.folderInside(a.folder);break;case"progress":o=await n.folderProgress(a.folder,a.player);break;case"breadcrumb":o=await n.folderBreadcrumb(a.folder);break}return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}catch(n){return{content:[{type:"text",text:`Error executing folder ${r}: ${n.message}`}],isError:!0}}})}});var wO=v(iv=>{"use strict";Object.defineProperty(iv,"__esModule",{value:!0});iv.registerIndexTool=zQ;var wp=rr();function zQ(e,t){e.registerTool("funifier_index",{title:"Funifier MongoDB Index Manager",description:"Manage MongoDB indexes on Funifier database collections. Use 'list' to inspect existing indexes before creating new ones \u2014 avoid duplicates. Use 'create' to add a SINGLE-FIELD index (one key in 'keys'). The Funifier REST API does NOT support composite/compound indexes \u2014 passing multiple fields is rejected. For a true composite index, create it from a Funifier trigger/scheduler/public endpoint using manager.getJongoConnection() with a BasicDBObject chained .append() spec. Use 'drop' to remove an index by its name (get the name from 'list'). Requires the API connection to have 'database' in its scope.",inputSchema:{action:wp.z.enum(["list","create","drop"]).describe("'list' \u2014 GET /database/{collection}/index, returns all index definitions. 'create' \u2014 POST /database/{collection}/index with the 'keys' field spec; returns updated index list. 'drop' \u2014 DELETE /database/{collection}/index/{name}; requires 'name' (the index name from 'list')."),collection:wp.z.string().describe("Collection name (e.g. 'player', 'action_log', 'videos__c'). Required for all actions."),keys:wp.z.string().optional().describe(`For action='create' only. JSON object with EXACTLY ONE field mapped to sort direction: 1 = ascending, -1 = descending. Example: '{"email": 1}' or '{"time": -1}'. IMPORTANT: this endpoint does NOT support compound (multi-field) indexes \u2014 the Funifier REST API loops over keys and creates one single-field index per key, never a composite. Passing multiple fields is rejected to avoid silently creating N separate indexes. For a true composite index, use a Funifier trigger/scheduler/public endpoint with manager.getJongoConnection().getDatabase()... and a BasicDBObject chained .append() spec.`),name:wp.z.string().optional().describe("For action='drop' only. Exact index name as returned by 'list' (e.g. 'email_1'). The '_id_' index cannot be dropped.")},annotations:{readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!0}},async({action:r,collection:i,keys:n,name:a})=>{try{let o=t.requireClient();if(r==="list"){let s=await o.listIndexes(i);return s.length===0?{content:[{type:"text",text:`No indexes found on '${i}' (or collection does not exist).`}]}:{content:[{type:"text",text:`Indexes on '${i}' (${s.length}):
|
|
113
113
|
|
|
114
|
-
${JSON.stringify(s,null,2)}`}]}}if(r==="create"){if(!n)return{content:[{type:"text",text:`Error: 'keys' is required for action='create'. Example: '{"email": 1}'`}],isError:!0};let s;try{s=JSON.parse(n)}catch{return{content:[{type:"text",text:`Error: 'keys' is not valid JSON: ${n}`}],isError:!0}}let c=Object.keys(s);if(c.length===0)return{content:[{type:"text",text:"Error: 'keys' must contain at least one field."}],isError:!0};
|
|
114
|
+
${JSON.stringify(s,null,2)}`}]}}if(r==="create"){if(!n)return{content:[{type:"text",text:`Error: 'keys' is required for action='create'. Example: '{"email": 1}'`}],isError:!0};let s;try{s=JSON.parse(n)}catch{return{content:[{type:"text",text:`Error: 'keys' is not valid JSON: ${n}`}],isError:!0}}let c=Object.keys(s);if(c.length===0)return{content:[{type:"text",text:"Error: 'keys' must contain at least one field."}],isError:!0};if(c.length>1)return{content:[{type:"text",text:`Error: composite indexes are NOT supported by this endpoint. The Funifier REST API (POST /database/${i}/index) iterates the JSON keys and creates ONE single-field index per key \u2014 it would NOT produce a single composite '${c.map(m=>`${m}_${s[m]}`).join("_")}' index. You passed ${c.length} fields: ${JSON.stringify(s)}.
|
|
115
|
+
|
|
116
|
+
Options:
|
|
117
|
+
1) If you really wanted ${c.length} SEPARATE single-field indexes, call funifier_index once per field, e.g.:
|
|
118
|
+
`+c.map(m=>` funifier_index action=create collection=${i} keys='{"${m}": ${s[m]}}'`).join(`
|
|
119
|
+
`)+`
|
|
120
|
+
2) For a TRUE composite index, the REST endpoint cannot help \u2014 create it from a Funifier trigger/scheduler/public endpoint with manager.getJongoConnection() and BasicDBObject().append("${c[0]}", ${s[c[0]]}).append(...).`}],isError:!0};let u=c.filter(m=>s[m]!==1&&s[m]!==-1);if(u.length>0)return{content:[{type:"text",text:`Error: direction must be 1 (ascending) or -1 (descending). Invalid: ${JSON.stringify(Object.fromEntries(u.map(m=>[m,s[m]])))}`}],isError:!0};let l=await o.createIndex(i,s),p=c.map(m=>`${m}_${s[m]}`).join("_");return{content:[{type:"text",text:`Index created on '${i}' (expected name: '${p}').
|
|
115
121
|
|
|
116
122
|
Current indexes (${l.length}):
|
|
117
123
|
|
|
@@ -200,7 +206,7 @@ Ao refatorar ou criar c\xF3digo:
|
|
|
200
206
|
|
|
201
207
|
`;Ot.appendFileSync(e,`${n}${ny.PERSONA_SECTION}
|
|
202
208
|
`),console.log(` \u2713 Persona section added to ${r}`)}else t&&(Ot.writeFileSync(e,`${ny.PERSONA_SECTION}
|
|
203
|
-
`),console.log(` \u2713 ${r} created with persona section`))}function Fre(e,t){NT(Pt.join(e,"AGENTS.md"),!1),t.some(r=>r.key==="claude-code")&&NT(Pt.join(e,"CLAUDE.md"),!0)}async function Zre(e){let t=Pt.join(e,"datasource-funifier-docs");Ot.existsSync(t)&&(await(0,pf.askRemoveLegacyDocs)()?(Ot.rmSync(t,{recursive:!0,force:!0}),console.log(" \u2717 removed stale datasource-funifier-docs/")):console.log(" \u2013 kept datasource-funifier-docs/ (docs are served from the package; safe to delete)"))}async function zre(e,t,r,i){let n=new Set;for(let a of r)for(let o of a.copies){if(n.has(o.dest))continue;n.add(o.dest);let s=Pt.join(e,o.src),c=Pt.join(t,o.dest);if(!Ot.existsSync(s)){console.log(` \u26A0 ${o.src} not found in package \u2014 skipping`);continue}if(o.isDir)o.src==="skills"&&Ure(c),await(0,AT.copyDir)(s,c,i),console.log(` \u2713 ${o.dest}/`);else{let u=await(0,AT.copyFile)(s,c,i);console.log(` ${u==="written"?"\u2713":"\u2013"} ${o.dest}`)}}}function qre(e,t,r,i){let n=Pt.join(e,"dist","mcp","bundle.js"),a=Pt.join(e,"datasource-funifier-docs","knowledge");for(let o of r){if(!o.configFile)continue;let s=Pt.join(t,o.configFile.dest);Ot.mkdirSync(Pt.dirname(s),{recursive:!0});let c=o.configFile.render({projectDir:t,bundlePath:n,docsPath:a,creds:i});Ot.writeFileSync(s,c),console.log(` \u2713 ${o.configFile.dest}`)}}function Ure(e){if(Ot.existsSync(e))for(let t of Ot.readdirSync(e,{withFileTypes:!0}))t.isDirectory()&&t.name.startsWith("funifier-")&&(Ot.rmSync(Pt.join(e,t.name),{recursive:!0,force:!0}),console.log(` \u2717 removed legacy ${t.name}/`))}function Lre(e){console.log("\u{1F4E5} Installing funifier-mcp locally...");try{(0,FT.execSync)("npm install funifier-mcp --save",{cwd:e,stdio:"inherit"})}catch{console.warn(" \u26A0 npm install failed \u2014 continuing with package cache")}}function Bre(e){let t=Pt.join(e,"node_modules","funifier-mcp");return Ot.existsSync(t)?t:(0,Tre.resolvePackageRoot)()}async function Vre(e,t){console.log(`\u{1F4E6} Funifier MCP Setup
|
|
209
|
+
`),console.log(` \u2713 ${r} created with persona section`))}function Fre(e,t){NT(Pt.join(e,"AGENTS.md"),!1),t.some(r=>r.key==="claude-code")&&NT(Pt.join(e,"CLAUDE.md"),!0)}async function Zre(e){let t=Pt.join(e,"datasource-funifier-docs");Ot.existsSync(t)&&(await(0,pf.askRemoveLegacyDocs)()?(Ot.rmSync(t,{recursive:!0,force:!0}),console.log(" \u2717 removed stale datasource-funifier-docs/")):console.log(" \u2013 kept datasource-funifier-docs/ (docs are served from the package; safe to delete)"))}async function zre(e,t,r,i){let n=new Set;for(let a of r)for(let o of a.copies){if(n.has(o.dest))continue;n.add(o.dest);let s=Pt.join(e,o.src),c=Pt.join(t,o.dest);if(!Ot.existsSync(s)){console.log(` \u26A0 ${o.src} not found in package \u2014 skipping`);continue}if(o.isDir)o.src==="skills"&&Ure(c),await(0,AT.copyDir)(s,c,i),console.log(` \u2713 ${o.dest}/`);else{let u=await(0,AT.copyFile)(s,c,i);console.log(` ${u==="written"?"\u2713":"\u2013"} ${o.dest}`)}}}function qre(e,t,r,i){let n=Pt.join(e,"dist","mcp","bundle.js"),a=Pt.join(e,"datasource-funifier-docs","knowledge");for(let o of r){if(!o.configFile)continue;let s=Pt.join(t,o.configFile.dest);Ot.mkdirSync(Pt.dirname(s),{recursive:!0});let c=o.configFile.render({projectDir:t,bundlePath:n,docsPath:a,creds:i});Ot.writeFileSync(s,c),console.log(` \u2713 ${o.configFile.dest}`)}}function Ure(e){if(Ot.existsSync(e))for(let t of Ot.readdirSync(e,{withFileTypes:!0}))t.isDirectory()&&t.name.startsWith("funifier-")&&(Ot.rmSync(Pt.join(e,t.name),{recursive:!0,force:!0}),console.log(` \u2717 removed legacy ${t.name}/`))}function Lre(e){console.log("\u{1F4E5} Installing funifier-mcp@latest locally...");try{(0,FT.execSync)("npm install funifier-mcp@latest --save",{cwd:e,stdio:"inherit"})}catch{console.warn(" \u26A0 npm install failed \u2014 continuing with package cache")}}function Bre(e){let t=Pt.join(e,"node_modules","funifier-mcp");return Ot.existsSync(t)?t:(0,Tre.resolvePackageRoot)()}async function Vre(e,t){console.log(`\u{1F4E6} Funifier MCP Setup
|
|
204
210
|
`);let r=e?Pt.resolve(e):process.cwd();Cre(),Ire(r);let i;t?(console.log(`\u{1F527} Dev mode \u2014 using local package at ${t}
|
|
205
211
|
`),i=t):(Lre(r),i=Bre(r));let n=await(0,pf.selectPlatforms)(),a=await(0,pf.askCredentials)(r);console.log("");let o=kre();if(await zre(i,r,n,o),await Zre(r),Fre(r,n),Rre(r,a),a&&Are(r),qre(i,r,n,a??ZT),console.log(`
|
|
206
212
|
\u2705 Setup complete.`),n.some(s=>s.key==="claude-code")&&console.log(" Claude Code: type /funifier to start."),n.some(s=>s.key==="antigravity")){let s=process.env.USERPROFILE||process.env.HOME||"~",c=Pt.join(s,".gemini","antigravity","mcp_config.json");console.log(` Antigravity: merge .antigravity/mcp_config.json into ${c}`),console.log(" Or: Antigravity \u2192 Manage MCP Servers \u2192 View raw config \u2192 add the funifier block")}if(n.some(s=>s.key==="kimi")){let s=process.env.USERPROFILE||process.env.HOME||"~",c=Pt.join(s,".kimi","mcp.json");console.log(` Kimi: merge .kimi/mcp.json into ${c}`),console.log(" Or: run `kimi mcp add --transport stdio funifier -- node <path-to-bundle.js>`")}a||console.log(" \u26A0 Fill in funifier.json.example and rename to funifier.json before using the MCP.")}});var UT=v(Fi=>{"use strict";var Hre=Fi&&Fi.__createBinding||(Object.create?function(e,t,r,i){i===void 0&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){i===void 0&&(i=r),e[i]=t[r]}),Gre=Fi&&Fi.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),qT=Fi&&Fi.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var i=[];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(i[i.length]=n);return i},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var i=e(t),n=0;n<i.length;n++)i[n]!=="default"&&Hre(r,t,i[n]);return Gre(r,t),r}}();Object.defineProperty(Fi,"__esModule",{value:!0});Fi.default=Yre;var hu=qT(require("fs")),gu=qT(require("path")),Kre=ov(),Jre=dv();function Wre(e){let t=e.slice(3),r=t.find(n=>!n.startsWith("--"))??"",i=n=>{let a=t.find(s=>s.startsWith(`--${n}=`))?.split("=").slice(1).join("=");if(a!==void 0)return a;let o=t.indexOf(`--${n}`);return o>=0?t[o+1]:void 0};return{query:r,top:i("top")?parseInt(i("top"),10):3,skillId:i("skill"),minScore:i("min-score")?parseFloat(i("min-score")):.3}}function Yre(){let{query:e,top:t,skillId:r,minScore:i}=Wre(process.argv);e||(console.error('Usage: funifier-mcp search "<query>" [--top N] [--skill <id>] [--min-score N]'),process.exit(1));let n=gu.join(process.cwd(),"datasource-funifier-docs"),a=(0,Jre.resolvePackageRoot)(),o=gu.join(a,"datasource-funifier-docs"),s=hu.existsSync(gu.join(n,".search-index.json"))?n:o,c=gu.join(s,".search-index.json"),u=gu.join(s,".skills-map.json");hu.existsSync(c)||(console.error("ERROR: .search-index.json not found. Run `npm run build:skills` first."),process.exit(1));let l=JSON.parse(hu.readFileSync(c,"utf-8")),p=[];r&&hu.existsSync(u)&&(p=JSON.parse(hu.readFileSync(u,"utf-8"))[r]??[]);let m=(0,Kre.scoreFiles)(e,l,{skillDocs:p,minScore:i,top:t}),h="\u2500".repeat(53);console.log(`
|
|
@@ -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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"}
|
package/package.json
CHANGED
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.
|