@justmpm/memory 0.2.1 → 0.3.0
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/AGENTS.md +45 -640
- package/CHANGELOG.md +42 -0
- package/CLAUDE.md +76 -182
- package/README.md +31 -46
- package/dist/index.js +173 -284
- package/package.json +6 -5
- package/TEST_REPORT.md +0 -226
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/mcp-config.example.json +0 -10
- package/src/index.ts +0 -645
- package/tsconfig.json +0 -20
package/dist/index.js
CHANGED
|
@@ -10,9 +10,41 @@
|
|
|
10
10
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
12
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
13
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync,
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, } from "fs";
|
|
14
14
|
import { join, dirname } from "path";
|
|
15
15
|
import { fileURLToPath } from "url";
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
// SCHEMAS DE VALIDAÇÃO (Zod)
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
20
|
+
/**
|
|
21
|
+
* Schema para tool memory_read
|
|
22
|
+
*/
|
|
23
|
+
const MemoryReadSchema = z.object({
|
|
24
|
+
agent: z.string().min(1).describe('Seu nome de agent (ex: "sentinel", "fix-worker", "nexus"). OBRIGATÓRIO.'),
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Schema para tool memory_append
|
|
28
|
+
*/
|
|
29
|
+
const MemoryAppendSchema = z.object({
|
|
30
|
+
agent: z.string().min(1).describe('Seu nome de agent (ex: "sentinel", "fix-worker", "nexus"). OBRIGATÓRIO.'),
|
|
31
|
+
entry: z.string().min(1).describe('Texto da informação a salvar. Ex: "Padrão: sempre use try/catch em funções async" ou "Bug: erro quando usuário clica 2x". Será adicionado com timestamp automaticamente.'),
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Schema para tool memory_search
|
|
35
|
+
*/
|
|
36
|
+
const MemorySearchSchema = z.object({
|
|
37
|
+
agent: z.string().min(1).describe('Seu nome de agent (ex: "sentinel", "fix-worker", "nexus"). OBRIGATÓRIO.'),
|
|
38
|
+
query: z.string().min(1).describe('Palavra-chave para buscar na sua memória. Ex: "Zod", "bug", "Firebase". Retorna até 20 resultados com número da linha.'),
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Schema para tool memory_write
|
|
42
|
+
*/
|
|
43
|
+
const MemoryWriteSchema = z.object({
|
|
44
|
+
agent: z.string().min(1).describe('Seu nome de agent (ex: "sentinel", "fix-worker", "nexus"). OBRIGATÓRIO.'),
|
|
45
|
+
content: z.string().min(1).describe('Conteúdo completo em markdown para substituir a memória existente. Use para reorganizar, limpar ou reconstruir memória do zero.'),
|
|
46
|
+
backup: z.boolean().optional().default(false).describe('Se true, cria um backup do conteúdo atual antes de sobrescrever. O backup é salvo como MEMORY.md.backup no mesmo diretório.'),
|
|
47
|
+
});
|
|
16
48
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
17
49
|
// VERSÃO DO PROJETO
|
|
18
50
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -89,23 +121,6 @@ function limitMemoryLines(content, maxLines = 200) {
|
|
|
89
121
|
|
|
90
122
|
${lines.slice(-keepCount).join("\n")}`;
|
|
91
123
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Lista todos os agents que têm memória
|
|
94
|
-
*/
|
|
95
|
-
function listAgentsWithMemory() {
|
|
96
|
-
const memoryRoot = join(process.cwd(), ".claude", "agent-memory");
|
|
97
|
-
if (!existsSync(memoryRoot))
|
|
98
|
-
return [];
|
|
99
|
-
try {
|
|
100
|
-
return readdirSync(memoryRoot).filter((name) => {
|
|
101
|
-
const memoryPath = join(memoryRoot, name, "MEMORY.md");
|
|
102
|
-
return existsSync(memoryPath);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
124
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
110
125
|
// HANDLERS DAS OPERAÇÕES
|
|
111
126
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -217,33 +232,6 @@ ${results}${more}`;
|
|
|
217
232
|
return `❌ Erro ao buscar: ${error.message}`;
|
|
218
233
|
}
|
|
219
234
|
}
|
|
220
|
-
/**
|
|
221
|
-
* Handler: list - Lista todos os agents com memória
|
|
222
|
-
*/
|
|
223
|
-
async function handleList() {
|
|
224
|
-
const agents = listAgentsWithMemory();
|
|
225
|
-
if (agents.length === 0) {
|
|
226
|
-
return `📝 Nenhum agent com memória neste projeto.
|
|
227
|
-
|
|
228
|
-
Diretório: .claude/agent-memory/`;
|
|
229
|
-
}
|
|
230
|
-
const agentList = agents
|
|
231
|
-
.map((name) => {
|
|
232
|
-
const path = join(".claude", "agent-memory", name, "MEMORY.md");
|
|
233
|
-
let lines = 0;
|
|
234
|
-
try {
|
|
235
|
-
lines = readFileSync(join(process.cwd(), path), "utf-8").split("\n").length;
|
|
236
|
-
}
|
|
237
|
-
catch { }
|
|
238
|
-
return ` • ${name} (${lines} linhas)`;
|
|
239
|
-
})
|
|
240
|
-
.join("\n");
|
|
241
|
-
return `📝 Agents com memória neste projeto (${agents.length}):
|
|
242
|
-
|
|
243
|
-
${agentList}
|
|
244
|
-
|
|
245
|
-
Use o comando "read" de cada agent para ver o conteúdo.`;
|
|
246
|
-
}
|
|
247
235
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
248
236
|
// SERVIDOR MCP
|
|
249
237
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -262,136 +250,94 @@ const server = new Server({
|
|
|
262
250
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
263
251
|
return {
|
|
264
252
|
tools: [
|
|
253
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
254
|
+
// TOOL: memory_read
|
|
255
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
265
256
|
{
|
|
266
|
-
name: "
|
|
267
|
-
description: `
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
## Bugs - Problemas e workarounds
|
|
351
|
-
## Decisões - Escolhas arquiteturais
|
|
352
|
-
|
|
353
|
-
❌ **Não salve:** Coisas triviais, informações temporárias, logs de conversa, coisas óbvias.
|
|
354
|
-
|
|
355
|
-
═══════════════════════════════════════════════════════════════
|
|
356
|
-
DICAS IMPORTANTES:
|
|
357
|
-
═══════════════════════════════════════════════════════════════
|
|
358
|
-
|
|
359
|
-
• Seu nome é normalizado: "Meu Agent" → "meu-agent"
|
|
360
|
-
• Use search antes de salvar para evitar duplicatas
|
|
361
|
-
• Memória é por projeto (pasta .claude/agent-memory/)
|
|
362
|
-
• Ao atingir 200 linhas, as mais antigas são removidas automaticamente
|
|
363
|
-
`.trim(),
|
|
364
|
-
inputSchema: {
|
|
365
|
-
type: "object",
|
|
366
|
-
properties: {
|
|
367
|
-
command: {
|
|
368
|
-
type: "string",
|
|
369
|
-
enum: ["read", "append", "search", "write"],
|
|
370
|
-
description: "Comando a executar: 'read' carrega sua memória, 'append' adiciona nova informação, 'search' procura algo específico, 'write' reescreve reorganizando tudo.",
|
|
371
|
-
},
|
|
372
|
-
agent: {
|
|
373
|
-
type: "string",
|
|
374
|
-
description: 'Seu nome de agent (ex: "sentinel", "fix-worker"). Opcional - usa "unknown" se não informado. Será normalizado para minúsculas.',
|
|
375
|
-
},
|
|
376
|
-
content: {
|
|
377
|
-
type: "string",
|
|
378
|
-
description: 'Conteúdo completo em markdown para substituir a memória existente (OBRIGATÓRIO para "write"). Use para reorganizar, limpar ou reconstruir memória do zero.',
|
|
379
|
-
},
|
|
380
|
-
backup: {
|
|
381
|
-
type: "boolean",
|
|
382
|
-
description: 'Se true, cria um backup do conteúdo atual antes de sobrescrever. O backup é salvo como MEMORY.md.backup no mesmo diretório. Padrão: false.',
|
|
383
|
-
},
|
|
384
|
-
entry: {
|
|
385
|
-
type: "string",
|
|
386
|
-
description: 'Texto da informação a salvar (OBRIGATÓRIO para append). Ex: "Padrão: sempre use try/catch em funções async" ou "Bug: erro quando usuário clica 2x". Será adicionado com timestamp automaticamente.',
|
|
387
|
-
},
|
|
388
|
-
query: {
|
|
389
|
-
type: "string",
|
|
390
|
-
description: 'Palavra-chave para buscar na sua memória (OBRIGATÓRIO para search). Ex: "Zod", "bug", "Firebase". Retorna até 20 resultados com número da linha.',
|
|
391
|
-
},
|
|
392
|
-
},
|
|
393
|
-
required: ["command"],
|
|
394
|
-
},
|
|
257
|
+
name: "memory_read",
|
|
258
|
+
description: `Lê todo o conteúdo da sua memória persistente. Use sempre ao iniciar uma sessão para recuperar contexto anterior.
|
|
259
|
+
|
|
260
|
+
RETORNA: Conteúdo completo do MEMORY.md localizado em .claude/agent-memory/<agent-name>/MEMORY.md.
|
|
261
|
+
|
|
262
|
+
Se a memória não existir, retorna mensagem de memória vazia com sugestão para usar memory_append.
|
|
263
|
+
|
|
264
|
+
Limite: Máximo 200 linhas. Ao atingir, mantém apenas as últimas 160 entradas.
|
|
265
|
+
|
|
266
|
+
Parâmetro "agent": Seu nome de agent (OBRIGATÓRIO).`,
|
|
267
|
+
inputSchema: MemoryReadSchema,
|
|
268
|
+
},
|
|
269
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
270
|
+
// TOOL: memory_append
|
|
271
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
272
|
+
{
|
|
273
|
+
name: "memory_append",
|
|
274
|
+
description: `Adiciona uma entrada no final da sua memória com timestamp automático "## [YYYY-MM-DD HH:MM:SS]".
|
|
275
|
+
|
|
276
|
+
USE QUANDO APRENDER algo importante: padrões de código, bugs recorrentes, decisões arquiteturais, preferências do usuário, configurações importantes.
|
|
277
|
+
|
|
278
|
+
EXEMPLOS DE ENTRADAS VÁLIDAS:
|
|
279
|
+
- "Padrão: Este projeto usa App Router com estrutura /features/[domain]/"
|
|
280
|
+
- "Decisão: Escolhemos Zustand em vez de Redux porque é mais leve"
|
|
281
|
+
- "Bug: Firestore update falha silenciosamente quando array está vazio"
|
|
282
|
+
|
|
283
|
+
NÃO salve: Coisas triviais, informações temporárias, logs de conversa.
|
|
284
|
+
|
|
285
|
+
Parâmetro "agent": Seu nome de agent (OBRIGATÓRIO).
|
|
286
|
+
Parâmetro "entry": OBRIGATÓRIO - Texto da informação a salvar.`,
|
|
287
|
+
inputSchema: MemoryAppendSchema,
|
|
288
|
+
},
|
|
289
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
290
|
+
// TOOL: memory_search
|
|
291
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
292
|
+
{
|
|
293
|
+
name: "memory_search",
|
|
294
|
+
description: `Busca um termo na sua memória sem precisar ler todo o conteúdo.
|
|
295
|
+
|
|
296
|
+
RETORNA: Até 20 ocorrências encontradas com número da linha. Busca case-insensitive.
|
|
297
|
+
|
|
298
|
+
EXEMPLOS DE BUSCA ÚTEIS:
|
|
299
|
+
- "Zod" → encontrar tudo sobre validação
|
|
300
|
+
- "bug" → encontrar bugs documentados
|
|
301
|
+
- "Firebase" → encontrar configurações
|
|
302
|
+
- "TypeScript" → encontrar padrões de tipagem
|
|
303
|
+
|
|
304
|
+
Se não encontrar, retorna mensagem de que nenhuma ocorrência foi encontrada.
|
|
305
|
+
|
|
306
|
+
Parâmetro "agent": Seu nome de agent (OBRIGATÓRIO).
|
|
307
|
+
Parâmetro "query": OBRIGATÓRIO - Termo ou palavra-chave a buscar.`,
|
|
308
|
+
inputSchema: MemorySearchSchema,
|
|
309
|
+
},
|
|
310
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
311
|
+
// TOOL: memory_write
|
|
312
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
313
|
+
{
|
|
314
|
+
name: "memory_write",
|
|
315
|
+
description: `SUBSTITUI TODO o conteúdo da sua memória. APAGA tudo que estava antes - use com cautela.
|
|
316
|
+
|
|
317
|
+
USE QUANDO: Memória está grande (~150+ linhas) e precisa reorganizar, ou quer remover entradas obsoletas.
|
|
318
|
+
|
|
319
|
+
DICAS:
|
|
320
|
+
- Use "backup: true" para criar MEMORY.md.backup antes de sobrescrever
|
|
321
|
+
- Leia primeiro com memory_read para não perder conteúdo importante
|
|
322
|
+
- Organize em seções: ## Padrões, ## Bugs, ## Decisões, ## Configurações
|
|
323
|
+
|
|
324
|
+
EXEMPLO DE ESTRUTURA:
|
|
325
|
+
# Memória do Agent
|
|
326
|
+
|
|
327
|
+
## Padrões de Código
|
|
328
|
+
- Sempre use TypeScript estrito
|
|
329
|
+
|
|
330
|
+
## Bugs Conhecidos
|
|
331
|
+
- Bug XYZ: ocorre quando array vazio
|
|
332
|
+
Workaround: verificar length antes de usar
|
|
333
|
+
|
|
334
|
+
## Decisões
|
|
335
|
+
- Zustand em vez de Redux (mais leve)
|
|
336
|
+
|
|
337
|
+
Parâmetro "agent": Seu nome de agent (OBRIGATÓRIO).
|
|
338
|
+
Parâmetro "content": OBRIGATÓRIO - Novo conteúdo completo em markdown.
|
|
339
|
+
Parâmetro "backup": Opcional (padrão: false) - Se true, cria backup antes de sobrescrever.`,
|
|
340
|
+
inputSchema: MemoryWriteSchema,
|
|
395
341
|
},
|
|
396
342
|
],
|
|
397
343
|
};
|
|
@@ -401,123 +347,67 @@ DICAS IMPORTANTES:
|
|
|
401
347
|
*/
|
|
402
348
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
403
349
|
const { name, arguments: args } = request.params;
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
const command = args?.command;
|
|
408
|
-
const agentName = args?.agent || "unknown";
|
|
409
|
-
// Valida comando
|
|
410
|
-
const validCommands = ["read", "append", "search", "write"];
|
|
411
|
-
if (!validCommands.includes(command)) {
|
|
350
|
+
const agentName = args?.agent;
|
|
351
|
+
// Valida parâmetro agent obrigatório
|
|
352
|
+
if (!agentName || typeof agentName !== "string" || agentName.trim().length === 0) {
|
|
412
353
|
return {
|
|
413
354
|
content: [
|
|
414
355
|
{
|
|
415
356
|
type: "text",
|
|
416
|
-
text: `❌
|
|
417
|
-
|
|
418
|
-
COMANDOS DISPONÍVEIS:
|
|
419
|
-
|
|
420
|
-
1. read - Carrega sua memória (use ao iniciar)
|
|
421
|
-
2. append - Adiciona nova informação (mais usado)
|
|
422
|
-
3. search - Procura algo na sua memória
|
|
423
|
-
4. write - Reescreve reorganizando tudo (cuidado!)
|
|
424
|
-
|
|
425
|
-
PARA MAIS DETALHES, CONSULTE A DESCRIÇÃO DA TOOL "memory"
|
|
426
|
-
`,
|
|
357
|
+
text: `❌ Erro: Parâmetro "agent" é obrigatório em todas as operações de memória. Informe o nome do agent (ex: "sentinel", "nexus", "fix-worker").`,
|
|
427
358
|
},
|
|
428
359
|
],
|
|
429
360
|
};
|
|
430
361
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
if (!content) {
|
|
441
|
-
result = `❌ ERRO: O parâmetro "content" é OBRIGATÓRIO para o comando "write".
|
|
442
|
-
|
|
443
|
-
EXEMPLO DE USO CORRETO:
|
|
444
|
-
{
|
|
445
|
-
"command": "write",
|
|
446
|
-
"agent": "sentinel",
|
|
447
|
-
"content": "# Memória do Sentinel\\n\\n## Padrões\\n- Sempre use Zod para validação\\n\\n## Bugs\\n- Bug XYZ ocorre quando..."
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
DICA: Use "backup": true para criar uma cópia de segurança antes de sobrescrever:
|
|
451
|
-
{
|
|
452
|
-
"command": "write",
|
|
453
|
-
"agent": "sentinel",
|
|
454
|
-
"content": "# Nova memória...",
|
|
455
|
-
"backup": true
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
Use "write" para reorganizar memória grande ou reconstruir do zero.
|
|
459
|
-
Para adicionar uma entrada preservando o histórico, use "append".
|
|
460
|
-
`;
|
|
461
|
-
break;
|
|
362
|
+
try {
|
|
363
|
+
switch (name) {
|
|
364
|
+
case "memory_read": {
|
|
365
|
+
const parsed = MemoryReadSchema.safeParse(args);
|
|
366
|
+
if (!parsed.success) {
|
|
367
|
+
throw new Error(`Parâmetros inválidos: ${parsed.error.issues.map((e) => e.message).join(", ")}`);
|
|
368
|
+
}
|
|
369
|
+
const result = await handleRead(agentName);
|
|
370
|
+
return { content: [{ type: "text", text: result }] };
|
|
462
371
|
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
result = `❌ ERRO: O parâmetro "entry" é OBRIGATÓRIO para o comando "append".
|
|
471
|
-
|
|
472
|
-
EXEMPLO DE USO CORRETO:
|
|
473
|
-
{
|
|
474
|
-
"command": "append",
|
|
475
|
-
"agent": "sentinel",
|
|
476
|
-
"entry": "Padrão descoberto: Sempre use Zod para validar inputs do usuário em todos os componentes de formulário"
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
DICA: Use "append" para salvar aprendizados incrementais. O timestamp é adicionado automaticamente no formato:
|
|
480
|
-
## [2026-02-09 12:34:56]
|
|
481
|
-
Sua entrada aqui
|
|
482
|
-
|
|
483
|
-
Para salvar informações mais longas ou estruturadas, considere usar "write".
|
|
484
|
-
`;
|
|
485
|
-
break;
|
|
372
|
+
case "memory_append": {
|
|
373
|
+
const parsed = MemoryAppendSchema.safeParse(args);
|
|
374
|
+
if (!parsed.success) {
|
|
375
|
+
throw new Error(`Parâmetros inválidos: ${parsed.error.issues.map((e) => e.message).join(", ")}`);
|
|
376
|
+
}
|
|
377
|
+
const result = await handleAppend(agentName, parsed.data.entry);
|
|
378
|
+
return { content: [{ type: "text", text: result }] };
|
|
486
379
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
DICA: A busca é case-insensitive e retorna até 20 ocorrências com o número da linha.
|
|
503
|
-
Exemplos de busca úteis: "padrão", "bug", "TypeScript", "Firebase", "erro"
|
|
504
|
-
`;
|
|
505
|
-
break;
|
|
380
|
+
case "memory_search": {
|
|
381
|
+
const parsed = MemorySearchSchema.safeParse(args);
|
|
382
|
+
if (!parsed.success) {
|
|
383
|
+
throw new Error(`Parâmetros inválidos: ${parsed.error.issues.map((e) => e.message).join(", ")}`);
|
|
384
|
+
}
|
|
385
|
+
const result = await handleSearch(agentName, parsed.data.query);
|
|
386
|
+
return { content: [{ type: "text", text: result }] };
|
|
387
|
+
}
|
|
388
|
+
case "memory_write": {
|
|
389
|
+
const parsed = MemoryWriteSchema.safeParse(args);
|
|
390
|
+
if (!parsed.success) {
|
|
391
|
+
throw new Error(`Parâmetros inválidos: ${parsed.error.issues.map((e) => e.message).join(", ")}`);
|
|
392
|
+
}
|
|
393
|
+
const result = await handleWrite(agentName, parsed.data.content, parsed.data.backup);
|
|
394
|
+
return { content: [{ type: "text", text: result }] };
|
|
506
395
|
}
|
|
507
|
-
|
|
508
|
-
|
|
396
|
+
default:
|
|
397
|
+
throw new Error(`Tool desconhecida: ${name}`);
|
|
509
398
|
}
|
|
510
|
-
default:
|
|
511
|
-
result = `❌ Comando desconhecido: ${command}`;
|
|
512
399
|
}
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
400
|
+
catch (error) {
|
|
401
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
402
|
+
return {
|
|
403
|
+
content: [
|
|
404
|
+
{
|
|
405
|
+
type: "text",
|
|
406
|
+
text: `❌ Erro ao executar tool "${name}": ${errorMessage}`,
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
};
|
|
410
|
+
}
|
|
521
411
|
});
|
|
522
412
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
523
413
|
// INICIALIZAÇÃO
|
|
@@ -542,12 +432,11 @@ USO:
|
|
|
542
432
|
memory --version Mostra a versão do pacote
|
|
543
433
|
memory --help Mostra esta mensagem de ajuda
|
|
544
434
|
|
|
545
|
-
|
|
546
|
-
-
|
|
547
|
-
-
|
|
548
|
-
-
|
|
549
|
-
-
|
|
550
|
-
- list Lista todos os agents com memória
|
|
435
|
+
TOOLS MCP:
|
|
436
|
+
- memory_read Lê a memória de um agent
|
|
437
|
+
- memory_write Substitui toda a memória
|
|
438
|
+
- memory_append Adiciona uma entrada ao final
|
|
439
|
+
- memory_search Busca texto na memória
|
|
551
440
|
|
|
552
441
|
DOCUMENTAÇÃO:
|
|
553
442
|
Para mais detalhes, consulte:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@justmpm/memory",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MCP Server para gerenciar memória persistente de subagents",
|
|
1
|
+
{
|
|
2
|
+
"name": "@justmpm/memory",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "MCP Server para gerenciar memória persistente de subagents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@modelcontextprotocol/sdk": "^1.0.4"
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
34
|
+
"zod": "^4.3.5"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"@types/node": "^22.10.2",
|