funifier-mcp 0.3.18 → 0.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/funifier.mdc +2 -1
- package/.github/copilot-instructions.md +2 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +78 -0
- package/README.md +1 -1
- package/datasource-funifier-docs/.coverage.json +4 -1
- package/datasource-funifier-docs/.search-index.json +949 -605
- package/datasource-funifier-docs/.skills-map.json +5 -0
- package/datasource-funifier-docs/.validation.json +12 -7
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +13 -6
- package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +6 -6
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +74 -11
- package/datasource-funifier-docs/knowledge/index.md +2 -2
- package/datasource-funifier-docs/knowledge/modules/trigger.md +29 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/api-client.d.ts +2 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +98 -47
- package/dist/core/api-client.js.map +1 -1
- package/dist/core/api-client.test.js +27 -0
- package/dist/core/api-client.test.js.map +1 -1
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +8 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +50 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/mcp/api-holder.test.d.ts +2 -0
- package/dist/mcp/api-holder.test.d.ts.map +1 -0
- package/dist/mcp/api-holder.test.js +45 -0
- package/dist/mcp/api-holder.test.js.map +1 -0
- package/dist/mcp/bundle.js +114 -111
- package/dist/mcp/check-update.d.ts +9 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +35 -9
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.js +36 -6
- package/dist/mcp/check-update.test.js.map +1 -1
- package/dist/mcp/doc-path.d.ts +11 -0
- package/dist/mcp/doc-path.d.ts.map +1 -0
- package/dist/mcp/doc-path.js +66 -0
- package/dist/mcp/doc-path.js.map +1 -0
- package/dist/mcp/doc-path.test.d.ts +2 -0
- package/dist/mcp/doc-path.test.d.ts.map +1 -0
- package/dist/mcp/doc-path.test.js +77 -0
- package/dist/mcp/doc-path.test.js.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +7 -3
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/tools/_backup.d.ts.map +1 -1
- package/dist/mcp/tools/_backup.js +5 -3
- package/dist/mcp/tools/_backup.js.map +1 -1
- package/dist/mcp/tools/_char-guard.d.ts +2 -1
- package/dist/mcp/tools/_char-guard.d.ts.map +1 -1
- package/dist/mcp/tools/_char-guard.js +10 -3
- package/dist/mcp/tools/_char-guard.js.map +1 -1
- package/dist/mcp/tools/_fetch-current.d.ts +2 -1
- package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
- package/dist/mcp/tools/_fetch-current.js +2 -74
- package/dist/mcp/tools/_fetch-current.js.map +1 -1
- package/dist/mcp/tools/_registry.d.ts +183 -0
- package/dist/mcp/tools/_registry.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.js +88 -0
- package/dist/mcp/tools/_registry.js.map +1 -0
- package/dist/mcp/tools/_registry.test.d.ts +2 -0
- package/dist/mcp/tools/_registry.test.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.test.js +103 -0
- package/dist/mcp/tools/_registry.test.js.map +1 -0
- package/dist/mcp/tools/database.d.ts +4 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +23 -4
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +19 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/delete.d.ts.map +1 -1
- package/dist/mcp/tools/delete.js +3 -98
- package/dist/mcp/tools/delete.js.map +1 -1
- package/dist/mcp/tools/execute.d.ts.map +1 -1
- package/dist/mcp/tools/execute.js +36 -4
- package/dist/mcp/tools/execute.js.map +1 -1
- package/dist/mcp/tools/execute.test.d.ts +2 -0
- package/dist/mcp/tools/execute.test.d.ts.map +1 -0
- package/dist/mcp/tools/execute.test.js +87 -0
- package/dist/mcp/tools/execute.test.js.map +1 -0
- package/dist/mcp/tools/get.d.ts.map +1 -1
- package/dist/mcp/tools/get.js +4 -93
- package/dist/mcp/tools/get.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +42 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list.d.ts.map +1 -1
- package/dist/mcp/tools/list.js +3 -91
- package/dist/mcp/tools/list.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +5 -3
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/read-doc.d.ts.map +1 -1
- package/dist/mcp/tools/read-doc.js +10 -28
- package/dist/mcp/tools/read-doc.js.map +1 -1
- package/dist/mcp/tools/save.d.ts.map +1 -1
- package/dist/mcp/tools/save.js +4 -81
- package/dist/mcp/tools/save.js.map +1 -1
- package/package.json +3 -2
- package/skills/funifier/SKILL.md +2 -1
- package/skills/funifier/references/audit-permissions.md +8 -0
- package/skills/funifier/references/configure-security.md +6 -0
- package/skills/funifier/references/create-action.md +7 -0
- package/skills/funifier/references/create-aggregate.md +99 -79
- package/skills/funifier/references/create-audit.md +8 -0
- package/skills/funifier/references/create-challenge.md +7 -0
- package/skills/funifier/references/create-competition.md +7 -0
- package/skills/funifier/references/create-crossword.md +6 -0
- package/skills/funifier/references/create-custom-object.md +6 -0
- package/skills/funifier/references/create-custom-page.md +6 -0
- package/skills/funifier/references/create-folder.md +7 -0
- package/skills/funifier/references/create-lastmile.md +6 -0
- package/skills/funifier/references/create-leaderboard.md +6 -0
- package/skills/funifier/references/create-level.md +7 -0
- package/skills/funifier/references/create-lottery.md +7 -0
- package/skills/funifier/references/create-mystery.md +6 -0
- package/skills/funifier/references/create-notification.md +6 -0
- package/skills/funifier/references/create-point.md +7 -0
- package/skills/funifier/references/create-quiz.md +7 -0
- package/skills/funifier/references/create-scheduler.md +6 -0
- package/skills/funifier/references/create-story.md +6 -0
- package/skills/funifier/references/create-swap.md +6 -0
- package/skills/funifier/references/create-trigger.md +28 -8
- package/skills/funifier/references/create-virtual-good.md +6 -0
- package/skills/funifier/references/create-webhook.md +6 -0
- package/skills/funifier/references/create-websocket.md +6 -0
- package/skills/funifier/references/create-widget.md +6 -0
- package/skills/funifier/references/date-handling.md +6 -0
- package/skills/funifier/references/help.md +6 -0
- package/skills/funifier/references/implement-frontend.md +7 -0
- package/skills/funifier/references/import-csv.md +6 -0
- package/skills/funifier/references/manage-indexes.md +6 -0
- package/skills/funifier/references/manage-player.md +7 -0
- package/skills/funifier/references/manage-team.md +6 -0
- package/skills/funifier/references/query-aggregate.md +111 -0
- package/skills/funifier/references/upload-file.md +6 -0
|
@@ -80,3 +80,10 @@ GET /v3/player/<_id>/status
|
|
|
80
80
|
```
|
|
81
81
|
GET /v3/team/<team_id>/member/add/<player_id>
|
|
82
82
|
```
|
|
83
|
+
|
|
84
|
+
## Verified References
|
|
85
|
+
|
|
86
|
+
| Claim | Status | Evidence |
|
|
87
|
+
|-------|--------|----------|
|
|
88
|
+
| Player is the entity class with _id, name, email, teams, extra fields in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/player/Player.java:Player |
|
|
89
|
+
| PlayerManager handles player CRUD, authentication, and status queries in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/player/PlayerManager.java:PlayerManager |
|
|
@@ -74,3 +74,9 @@ GET /v3/team/sales/status
|
|
|
74
74
|
```
|
|
75
75
|
GET /v3/team/sales/member/remove/tom
|
|
76
76
|
```
|
|
77
|
+
|
|
78
|
+
## Verified References
|
|
79
|
+
|
|
80
|
+
| Claim | Status | Evidence |
|
|
81
|
+
|-------|--------|----------|
|
|
82
|
+
| Team is the entity class for player groups with _id, name, members, owner fields in funifier-service | ✓ verified | Class:src/main/java/com/funifier/engine/team/Team.java:Team |
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# funifier-query-aggregate
|
|
2
|
+
|
|
3
|
+
Run an ad-hoc MongoDB aggregate (one-off query) on a Funifier collection via POST /v3/database/{collection}/aggregate — for reports and exploration, without saving a resource
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Before starting — find relevant docs
|
|
8
|
+
|
|
9
|
+
Use the `funifier_search_docs` MCP tool to load only what you need:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
funifier_search_docs "aggregate mongodb pipeline query report ad-hoc consulta"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Then read the most relevant results with `funifier_read_doc path=<path>`.
|
|
16
|
+
|
|
17
|
+
## Primary docs for this skill
|
|
18
|
+
|
|
19
|
+
If search returns insufficient results, read these directly:
|
|
20
|
+
|
|
21
|
+
- `funifier_read_doc path=guides/aggregates`
|
|
22
|
+
- `funifier_read_doc path=guides/database-access`
|
|
23
|
+
- `funifier_read_doc path=modules/database`
|
|
24
|
+
|
|
25
|
+
## Steps
|
|
26
|
+
|
|
27
|
+
> **Aggregate ad-hoc** = uma consulta **pontual** executada direto numa coleção via `POST /v3/database/{collection}/aggregate`, com o pipeline no corpo. Sem `_id`, sem salvar, sem `$param`, sem `script`. Use para relatórios e exploração. Se você precisa de um pipeline **salvo, parametrizado e reutilizável** (dashboards, `POST /v3/find/<id>`), use a skill `funifier-create-aggregate` (prepared aggregate).
|
|
28
|
+
|
|
29
|
+
### 1. Definir a consulta
|
|
30
|
+
|
|
31
|
+
- Qual coleção tem os dados? (ver tabela abaixo)
|
|
32
|
+
- Qual o filtro (`$match`), agrupamento (`$group`), ordenação (`$sort`) e limite (`$limit`)?
|
|
33
|
+
- Precisa juntar coleções? (`$lookup` — ver relações abaixo)
|
|
34
|
+
|
|
35
|
+
### Coleções principais e relações (para `$lookup`)
|
|
36
|
+
|
|
37
|
+
| Coleção | Relação-chave |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `player` | `_id` é a ponta de `userId`/`player` — `name`, `teams`, `extra` |
|
|
40
|
+
| `action_log` | `userId` → `player._id`; `actionId` → `action._id` — `attributes`, `time` |
|
|
41
|
+
| `achievement` | `player` → `player._id`; `item` → coleção do `type` (0=Point, 1=Challenge, 2=VirtualGood, 3=Level) |
|
|
42
|
+
| `challenge` | `_id` referenciado por `achievement.item` (type 1) |
|
|
43
|
+
| `catalog_item` | `_id` referenciado por `achievement.item` (type 2) |
|
|
44
|
+
| `point_category` | `_id` referenciado por `achievement.item` (type 0) |
|
|
45
|
+
|
|
46
|
+
> Em `achievement`, junte por `$player`/`$item` — **não** por `_id` (senão o `$lookup` volta vazio). Campos completos das coleções: `funifier_read_doc path=guides/java-entities`.
|
|
47
|
+
|
|
48
|
+
### 2. Operadores suportados
|
|
49
|
+
|
|
50
|
+
`$match`, `$group`, `$sort`, `$limit`, `$lookup`, `$project`, `$unwind`, `$addFields`, `$count`.
|
|
51
|
+
|
|
52
|
+
### 3. Filtros por data
|
|
53
|
+
|
|
54
|
+
A gramática de expressões de data Funifier (`{"$date": "-0M-"}` = início do mês, `-0M+` = fim, `-1d-`, ISO-8601, millis) é detalhada em `aggregates.md` §4 (**dono único** das expressões `$date`) — leia com `funifier_read_doc path=guides/aggregates`. Não reescreva a gramática aqui.
|
|
55
|
+
|
|
56
|
+
> ⚠️ **Use `?strict=true`** no endpoint ad-hoc ao filtrar por data: sem ele, `Date` degrada para número e o `$match` por data falha. Exemplo: `{ "$match": { "time": { "$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"} } } }`.
|
|
57
|
+
|
|
58
|
+
### 4. Antes de executar: índices e forma da query
|
|
59
|
+
|
|
60
|
+
1. Liste os campos que dirigem o plano: filtros de `$match`, campos de `$sort`, e `localField`/`foreignField` de cada `$lookup` (atenção ao `foreignField` na coleção `from`).
|
|
61
|
+
2. Cheque/crie índices: `funifier_index action=list collection=<coll>` para cada coleção tocada; crie os single-field faltantes com `funifier_index action=create`. Índice **composto** (ex.: `{player:1,time:-1}`) → o endpoint REST é single-field apenas; use o caminho Groovy `createIndex(...append...)` (ver skill `funifier-manage-indexes`). Não duplique a mecânica de índice aqui.
|
|
62
|
+
3. Boas práticas: `$match` o mais cedo possível · reduza documentos com `$project`/`$match` **antes** do `$lookup` · `$sort` seguido imediatamente de `$limit` · cuidado com explosão de documentos do `$unwind` · garanta o `$lookup.foreignField` indexado.
|
|
63
|
+
4. ⚠️ **Ad-hoc NÃO usa `allowDiskUse`** — um `$match`/`$sort` sem índice em coleção grande tende a ser lento ou falhar. (Prepared aggregate usa `allowDiskUse(true)`; ad-hoc não.)
|
|
64
|
+
|
|
65
|
+
### 5. Executar
|
|
66
|
+
|
|
67
|
+
Via MCP:
|
|
68
|
+
```
|
|
69
|
+
funifier_database action=aggregate collection=<coll> pipeline=<json-array>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Via API REST:
|
|
73
|
+
```
|
|
74
|
+
POST /v3/database/{collection}/aggregate?strict=true
|
|
75
|
+
<json-array do pipeline no corpo>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
> O GET de listagem (`GET /v3/database/{collection}`) **não ordena** — para ordenar, use sempre `$sort` num aggregate.
|
|
79
|
+
|
|
80
|
+
### Exemplos
|
|
81
|
+
|
|
82
|
+
**Top 10 jogadores com mais XP no mês atual** (coleção `achievement`):
|
|
83
|
+
```json
|
|
84
|
+
[
|
|
85
|
+
{"$match": {"type": 0, "item": "xp", "time": {"$gte": {"$date": "-0M-"}, "$lte": {"$date": "-0M+"}}}},
|
|
86
|
+
{"$group": {"_id": "$player", "total": {"$sum": "$total"}}},
|
|
87
|
+
{"$sort": {"total": -1}},
|
|
88
|
+
{"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
|
|
89
|
+
{"$unwind": "$p"},
|
|
90
|
+
{"$project": {"_id": 1, "player": "$p.name", "total": 1}},
|
|
91
|
+
{"$limit": 10}
|
|
92
|
+
]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Jogadores distintos que executaram ações ontem** (coleção `action_log`):
|
|
96
|
+
```json
|
|
97
|
+
[
|
|
98
|
+
{"$match": {"time": {"$gte": {"$date": "-1d-"}, "$lte": {"$date": "-1d+"}}}},
|
|
99
|
+
{"$group": {"_id": "$userId"}},
|
|
100
|
+
{"$lookup": {"from": "player", "localField": "_id", "foreignField": "_id", "as": "p"}},
|
|
101
|
+
{"$project": {"_id": 1, "playerName": {"$first": "$p.name"}}}
|
|
102
|
+
]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Mais exemplos prontos (médias, distintos, top-N por período) em `aggregates.md` §6 — `funifier_read_doc path=guides/aggregates`.
|
|
106
|
+
|
|
107
|
+
## Verified References
|
|
108
|
+
|
|
109
|
+
| Claim | Status | Evidence |
|
|
110
|
+
|-------|--------|----------|
|
|
111
|
+
|