mcp-whaileys 1.0.1

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/README.md ADDED
@@ -0,0 +1,383 @@
1
+ # MCP Whaileys Context
2
+
3
+ Servidor MCP (Model Context Protocol) para fornecer contexto completo da biblioteca [Whaileys](https://github.com/canove/whaileys) (WhatsApp) ao assistente de IA.
4
+
5
+ > O repositório whaileys é baixado automaticamente na primeira execução.
6
+
7
+ ## Funcionalidades
8
+
9
+ Este servidor implementa análise de AST usando **ts-morph** para extrair declarações exportadas, incluindo:
10
+
11
+ - **Interfaces** - com propriedades, métodos, call signatures e index signatures
12
+ - **Type Aliases** - com type parameters e definições completas
13
+ - **Enumerations** - com todos os valores
14
+ - **Functions** - com parâmetros, tipos de retorno e documentação
15
+ - **Classes** - com métodos públicos, propriedades e herança
16
+ - **Variables/Constants** - configurações e defaults exportados
17
+ - **Namespaces** - estrutura de namespaces exportados
18
+ - **Re-exports** - análise de re-exportações entre módulos
19
+
20
+ ## Ferramentas Disponíveis
21
+
22
+ ### Ferramentas Básicas
23
+
24
+ | Ferramenta | Descrição |
25
+ |------------|-----------|
26
+ | `whaileys_estrutura` | Lista a estrutura de arquivos do projeto |
27
+ | `whaileys_ler_arquivo` | Lê conteúdo de arquivo específico |
28
+ | `whaileys_extrair_tipos` | Extrai todas as declarações via AST |
29
+ | `whaileys_buscar_tipo` | Busca definição de tipo por nome exato |
30
+ | `whaileys_buscar_fuzzy` | Busca com correspondência aproximada |
31
+ | `whaileys_listar_exports` | Lista todos os exports agrupados |
32
+
33
+ ### Ferramentas por Categoria
34
+
35
+ | Ferramenta | Descrição |
36
+ |------------|-----------|
37
+ | `whaileys_categorias` | Lista declarações de categoria específica |
38
+ | `whaileys_interfaces` | Lista todas as interfaces |
39
+ | `whaileys_funcoes` | Lista todas as funções |
40
+ | `whaileys_enums` | Lista todas as enumerações |
41
+ | `whaileys_constantes` | Lista constantes e variáveis |
42
+
43
+ ### Ferramentas de Análise
44
+
45
+ | Ferramenta | Descrição |
46
+ |------------|-----------|
47
+ | `whaileys_estatisticas` | Estatísticas detalhadas da biblioteca |
48
+ | `whaileys_hierarquia` | Mostra herança (extends/implements) |
49
+ | `whaileys_dependencias` | Analisa dependências entre módulos |
50
+
51
+ ### Ferramentas de Auto-Update
52
+
53
+ | Ferramenta | Descrição |
54
+ |------------|-----------|
55
+ | `whaileys_check_updates` | Verifica se há atualizações disponíveis no GitHub |
56
+ | `whaileys_update` | Atualiza o repositório local para a versão mais recente |
57
+ | `whaileys_status` | Mostra status atual do repositório (commits, sincronização) |
58
+
59
+ ## Categorias Suportadas
60
+
61
+ ```
62
+ interface - Interfaces TypeScript
63
+ type - Type Aliases
64
+ enum - Enumerations
65
+ function - Funções exportadas
66
+ class - Classes exportadas
67
+ variable - Constantes e variáveis
68
+ namespace - Namespaces
69
+ re-export - Re-exportações
70
+ ```
71
+
72
+ ## Instalação
73
+
74
+ ### Opção 1: Via npx (recomendado)
75
+
76
+ Sem instalação prévia, use diretamente no VSCode:
77
+
78
+ ```json
79
+ {
80
+ "servers": {
81
+ "whaileys-context": {
82
+ "type": "stdio",
83
+ "command": "npx",
84
+ "args": ["-y", "mcp-whaileys"]
85
+ }
86
+ }
87
+ }
88
+ ```
89
+
90
+ ### Opção 2: Instalação global
91
+
92
+ ```bash
93
+ npm install -g mcp-whaileys
94
+ ```
95
+
96
+ ```json
97
+ {
98
+ "servers": {
99
+ "whaileys-context": {
100
+ "type": "stdio",
101
+ "command": "mcp-whaileys"
102
+ }
103
+ }
104
+ }
105
+ ```
106
+
107
+ ### Opção 3: Repositório local
108
+
109
+ ```bash
110
+ git clone https://github.com/SEU_USUARIO/mcp-whaileys.git
111
+ cd mcp-whaileys
112
+ npm install
113
+ npm run build
114
+ ```
115
+
116
+ ```json
117
+ {
118
+ "servers": {
119
+ "whaileys-context": {
120
+ "type": "stdio",
121
+ "command": "node",
122
+ "args": ["d:/caminho/para/mcp-whaileys/dist/index.js"]
123
+ }
124
+ }
125
+ }
126
+ ```
127
+
128
+ ## Onde fica o repositório Whaileys?
129
+
130
+ Na primeira execução, o MCP baixa automaticamente o repositório para:
131
+
132
+ - **Windows:** `C:\Users\SEU_USUARIO\.mcp-whaileys\whaileys`
133
+ - **Linux/Mac:** `~/.mcp-whaileys/whaileys`
134
+
135
+ Para usar um caminho personalizado, defina `WHAILEYS_PATH`:
136
+
137
+ ```json
138
+ {
139
+ "servers": {
140
+ "whaileys-context": {
141
+ "type": "stdio",
142
+ "command": "npx",
143
+ "args": ["-y", "mcp-whaileys"],
144
+ "env": {
145
+ "WHAILEYS_PATH": "d:/meu/caminho/whaileys/src"
146
+ }
147
+ }
148
+ }
149
+ }
150
+ ```
151
+
152
+ ## Variáveis de Ambiente
153
+
154
+ | Variável | Descrição | Default |
155
+ |----------|-----------|---------|
156
+ | `WHAILEYS_PATH` | Caminho para o diretório `src/` do Whaileys | Auto-download em `~/.mcp-whaileys/` |
157
+ | `AUTO_UPDATE_ENABLED` | Habilita verificação automática de atualizações | `true` |
158
+ | `AUTO_UPDATE_INTERVAL` | Intervalo de verificação em ms | `3600000` (1 hora) |
159
+ | `GITHUB_TOKEN` | Token do GitHub para evitar rate limiting | - |
160
+
161
+ ## Exemplos de Configuração
162
+
163
+ ### Configuração mínima (usa auto-download)
164
+
165
+ ```json
166
+ {
167
+ "whaileys-context": {
168
+ "type": "stdio",
169
+ "command": "npx",
170
+ "args": ["-y", "mcp-whaileys"]
171
+ }
172
+ }
173
+ ```
174
+
175
+ ### Configuração com path local existente
176
+
177
+ ```json
178
+ {
179
+ "whaileys-context": {
180
+ "type": "stdio",
181
+ "command": "node",
182
+ "args": ["/caminho/para/mcp-whaileys/dist/index.js"],
183
+ "env": {
184
+ "WHAILEYS_PATH": "/caminho/para/whaileys/src"
185
+ }
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### Configuração completa
191
+
192
+ ```json
193
+ {
194
+ "whaileys-context": {
195
+ "type": "stdio",
196
+ "command": "npx",
197
+ "args": ["-y", "mcp-whaileys"],
198
+ "env": {
199
+ "AUTO_UPDATE_ENABLED": "true",
200
+ "AUTO_UPDATE_INTERVAL": "3600000"
201
+ }
202
+ }
203
+ }
204
+ }
205
+ ```
206
+
207
+ ## Exemplos de Uso
208
+
209
+ ### Extrair todos os tipos do módulo Types
210
+
211
+ ```javascript
212
+ whaileys_extrair_tipos({ modulo: "Types" })
213
+ ```
214
+
215
+ ### Filtrar apenas interfaces do módulo Types
216
+
217
+ ```javascript
218
+ whaileys_extrair_tipos({ modulo: "Types", apenas_kind: "interface" })
219
+ ```
220
+
221
+ ### Buscar tipo específico
222
+
223
+ ```javascript
224
+ whaileys_buscar_tipo({ nome: "WAMessage" })
225
+ ```
226
+
227
+ ### Busca fuzzy quando não sabe o nome exato
228
+
229
+ ```javascript
230
+ whaileys_buscar_fuzzy({ query: "message send auth" })
231
+ ```
232
+
233
+ ### Ver todas as funções do módulo Utils
234
+
235
+ ```javascript
236
+ whaileys_funcoes({ modulo: "Utils" })
237
+ ```
238
+
239
+ ### Listar constantes de configuração
240
+
241
+ ```javascript
242
+ whaileys_constantes({ modulo: "Defaults" })
243
+ ```
244
+
245
+ ### Ver hierarquia de um tipo
246
+
247
+ ```javascript
248
+ whaileys_hierarquia({ nome: "BaileysEventEmitter" })
249
+ ```
250
+
251
+ ### Estatísticas completas da biblioteca
252
+
253
+ ```javascript
254
+ whaileys_estatisticas()
255
+ ```
256
+
257
+ ### Análise de dependências
258
+
259
+ ```javascript
260
+ whaileys_dependencias()
261
+ ```
262
+
263
+ ## Estrutura de Dados
264
+
265
+ ### ExtractedType
266
+
267
+ ```typescript
268
+ interface ExtractedType {
269
+ name: string // Nome da declaração
270
+ kind: ExtractedKind // Tipo (interface, type, enum, etc.)
271
+ exported: boolean // Se é exportado
272
+ file: string // Arquivo fonte
273
+ module: string // Módulo (Types, Socket, Utils, etc.)
274
+ signature: string // Assinatura TypeScript
275
+ fullSignature?: string // Assinatura completa (para types)
276
+ properties?: PropertyInfo[] // Propriedades (interfaces/classes)
277
+ methods?: PropertyInfo[] // Métodos (interfaces/classes)
278
+ members?: string[] // Membros (enums/namespaces)
279
+ typeParameters?: TypeParameter[] // Generics
280
+ extends?: string[] // Herança
281
+ implements?: string[] // Implementações
282
+ docs?: string // Documentação JSDoc
283
+ value?: string // Valor (variáveis)
284
+ lineNumber?: number // Linha no arquivo
285
+ }
286
+ ```
287
+
288
+ ### PropertyInfo
289
+
290
+ ```typescript
291
+ interface PropertyInfo {
292
+ name: string
293
+ type: string
294
+ optional: boolean
295
+ readonly: boolean
296
+ docs?: string
297
+ isMethod: boolean
298
+ isCallSignature: boolean
299
+ isIndexSignature: boolean
300
+ parameters?: string[]
301
+ returnType?: string
302
+ }
303
+ ```
304
+
305
+ ## Estatísticas da Biblioteca
306
+
307
+ O servidor pode gerar estatísticas detalhadas incluindo:
308
+
309
+ - **Total de declarações** por categoria
310
+ - **Contagem por módulo** (Types, Socket, Utils, etc.)
311
+ - **Top interfaces, types e funções**
312
+ - **Percentuais de distribuição**
313
+
314
+ ## Recursos Disponíveis
315
+
316
+ O servidor também expõe recursos via MCP Resources:
317
+
318
+ | URI | Descrição |
319
+ |-----|-----------|
320
+ | `whaileys://readme` | README da biblioteca |
321
+ | `whaileys://types-index` | Index de tipos exportados |
322
+ | `whaileys://statistics` | Estatísticas da biblioteca |
323
+
324
+ ## Tecnologias
325
+
326
+ - **@modelcontextprotocol/sdk** v1.24.3 - SDK oficial do MCP
327
+ - **ts-morph** v27.0.2 - Parser de AST para TypeScript
328
+ - **zod** v4.1.13 - Validação de schemas
329
+
330
+ ## Sistema de Auto-Update
331
+
332
+ O MCP Whaileys possui um sistema integrado de auto-atualização que monitora o repositório oficial `canove/whaileys` no GitHub.
333
+
334
+ ### Como funciona
335
+
336
+ 1. **Na inicialização**: O servidor verifica se há atualizações disponíveis
337
+ 2. **Periodicamente**: A cada intervalo configurado (default: 1 hora), verifica novos commits
338
+ 3. **Automaticamente**: Quando detecta uma atualização, executa `git pull` automaticamente
339
+ 4. **Cache de SHA**: Mantém um registro do último commit verificado para otimizar chamadas à API
340
+
341
+ ### Fluxo de atualização
342
+
343
+ ```mermaid
344
+ flowchart TD
345
+ A[GitHub API<br>/repos/canove/whaileys/commits] --> B[Compara SHA<br>Local vs Remoto]
346
+ B --> C{SHA diferente?}
347
+ C -->|Sim| D[git pull]
348
+ C -->|Não| E[OK - Sem alterações]
349
+ D --> F[Atualiza contexto]
350
+ F --> G[Salva novo SHA no cache]
351
+ ```
352
+
353
+ ### Comandos manuais
354
+
355
+ ```javascript
356
+ // Verificar se há atualizações (sem aplicar)
357
+ whaileys_check_updates()
358
+
359
+ // Aplicar atualizações disponíveis
360
+ whaileys_update()
361
+
362
+ // Ver status atual do repositório
363
+ whaileys_status()
364
+ ```
365
+
366
+ ### Logs
367
+
368
+ O servidor emite logs durante o processo de atualização:
369
+
370
+ ```
371
+ [INFO] Auto-update habilitado (intervalo: 60 min)
372
+ [INFO] Verificando atualizações...
373
+ [OK] Atualizado para: ea7f714
374
+ Commit: Merge pull request #56 from canove/develop
375
+ ```
376
+
377
+ ### Rate Limiting do GitHub
378
+
379
+ A API do GitHub possui limites de requisições:
380
+ - **Sem token**: 60 requests/hora
381
+ - **Com token**: 5000 requests/hora
382
+
383
+ Para ambientes de produção, configure `GITHUB_TOKEN` para evitar rate limiting.
@@ -0,0 +1,106 @@
1
+ export type ExtractedKind = 'interface' | 'type' | 'enum' | 'function' | 'class' | 'variable' | 'namespace' | 're-export';
2
+ export interface PropertyInfo {
3
+ name: string;
4
+ type: string;
5
+ optional: boolean;
6
+ readonly: boolean;
7
+ docs?: string;
8
+ isMethod: boolean;
9
+ isCallSignature: boolean;
10
+ isIndexSignature: boolean;
11
+ parameters?: string[];
12
+ returnType?: string;
13
+ }
14
+ export interface TypeParameter {
15
+ name: string;
16
+ constraint?: string;
17
+ default?: string;
18
+ }
19
+ export interface ExtractedType {
20
+ name: string;
21
+ kind: ExtractedKind;
22
+ exported: boolean;
23
+ file: string;
24
+ module: string;
25
+ signature: string;
26
+ fullSignature?: string;
27
+ properties?: PropertyInfo[];
28
+ methods?: PropertyInfo[];
29
+ members?: string[];
30
+ typeParameters?: TypeParameter[];
31
+ extends?: string[];
32
+ implements?: string[];
33
+ docs?: string;
34
+ value?: string;
35
+ reExportSource?: string;
36
+ lineNumber?: number;
37
+ }
38
+ export interface ModuleStatistics {
39
+ module: string;
40
+ interfaces: number;
41
+ types: number;
42
+ enums: number;
43
+ functions: number;
44
+ classes: number;
45
+ variables: number;
46
+ namespaces: number;
47
+ reExports: number;
48
+ total: number;
49
+ }
50
+ export interface LibraryStatistics {
51
+ totalDeclarations: number;
52
+ byKind: Record<ExtractedKind, number>;
53
+ byModule: ModuleStatistics[];
54
+ topInterfaces: string[];
55
+ topTypes: string[];
56
+ topFunctions: string[];
57
+ }
58
+ export interface DependencyInfo {
59
+ module: string;
60
+ imports: string[];
61
+ exports: string[];
62
+ reExportsFrom: string[];
63
+ }
64
+ export declare class AstParser {
65
+ private project;
66
+ private whaileysSrcPath;
67
+ private cachedTypes;
68
+ constructor(whaileysSrcPath: string);
69
+ private getModuleName;
70
+ private getRelativePath;
71
+ addSourceFiles(patterns: string[]): void;
72
+ extractFromFile(filePath: string): ExtractedType[];
73
+ extractAllTypes(): ExtractedType[];
74
+ private extractTypes;
75
+ private extractTypeParameters;
76
+ private extractInterface;
77
+ private extractTypeAlias;
78
+ private extractEnum;
79
+ private extractFunction;
80
+ private extractClass;
81
+ private extractVariable;
82
+ private extractNamespace;
83
+ private extractReExport;
84
+ private simplifyType;
85
+ private getJsDocs;
86
+ searchType(typeName: string): ExtractedType | undefined;
87
+ fuzzySearch(query: string, maxResults?: number): ExtractedType[];
88
+ getTypesFromModule(moduleName: string): ExtractedType[];
89
+ getTypesByKind(kind: ExtractedKind): ExtractedType[];
90
+ getStatistics(): LibraryStatistics;
91
+ getTypeHierarchy(typeName: string): {
92
+ type: ExtractedType;
93
+ parents: string[];
94
+ children: string[];
95
+ } | null;
96
+ analyzeDependencies(): DependencyInfo[];
97
+ getVariables(): ExtractedType[];
98
+ getConstants(): ExtractedType[];
99
+ getNamespaces(): ExtractedType[];
100
+ getInterfaces(): ExtractedType[];
101
+ getEnums(): ExtractedType[];
102
+ getFunctions(): ExtractedType[];
103
+ getClasses(): ExtractedType[];
104
+ getTypes(): ExtractedType[];
105
+ }
106
+ //# sourceMappingURL=ast-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../src/ast-parser.ts"],"names":[],"mappings":"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"}