agent-recall-mcp 1.0.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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,830 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import * as z from "zod/v4";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ import { execFile } from "node:child_process";
9
+ import { promisify } from "node:util";
10
+ const execFileAsync = promisify(execFile);
11
+ // ---------------------------------------------------------------------------
12
+ // Constants
13
+ // ---------------------------------------------------------------------------
14
+ const VERSION = "1.0.0";
15
+ const JOURNAL_ROOT = process.env.AGENT_RECALL_ROOT ||
16
+ path.join(os.homedir(), ".agent-recall");
17
+ const LEGACY_ROOT = path.join(os.homedir(), ".claude", "projects");
18
+ const SECTION_HEADERS = {
19
+ brief: "## Brief",
20
+ qa: "## Q&A Log",
21
+ completed: "## Completed",
22
+ status: "## Status",
23
+ blockers: "## Blockers",
24
+ next: "## Next",
25
+ decisions: "## Decisions",
26
+ reflection: "## Reflection",
27
+ files: "## Files Changed",
28
+ observations: "## Observations",
29
+ };
30
+ // ---------------------------------------------------------------------------
31
+ // CLI flags (handle before MCP starts)
32
+ // ---------------------------------------------------------------------------
33
+ const args = process.argv.slice(2);
34
+ if (args.includes("--help") || args.includes("-h")) {
35
+ process.stdout.write(`agent-recall-mcp v${VERSION}
36
+
37
+ Two-layer AI session memory — read, write, and navigate project journals via MCP.
38
+
39
+ Usage:
40
+ npx agent-recall-mcp Start the MCP server (stdio transport)
41
+ npx agent-recall-mcp --help Show this help
42
+ npx agent-recall-mcp --list-tools List available MCP tools
43
+
44
+ Storage: ${JOURNAL_ROOT}
45
+ Legacy: ${LEGACY_ROOT}
46
+
47
+ All data stays local. No cloud, no telemetry.
48
+ `);
49
+ process.exit(0);
50
+ }
51
+ if (args.includes("--list-tools")) {
52
+ const tools = [
53
+ { name: "journal_read", description: "Read a journal entry (supports date=latest, section filtering)" },
54
+ { name: "journal_write", description: "Append or replace content in journal" },
55
+ { name: "journal_capture", description: "Lightweight Layer 1 Q&A capture" },
56
+ { name: "journal_list", description: "List recent journal entries" },
57
+ { name: "journal_projects", description: "List all tracked projects" },
58
+ { name: "journal_search", description: "Full-text search across journals" },
59
+ ];
60
+ process.stdout.write(JSON.stringify(tools, null, 2) + "\n");
61
+ process.exit(0);
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Utility functions
65
+ // ---------------------------------------------------------------------------
66
+ function ensureDir(dir) {
67
+ if (!fs.existsSync(dir)) {
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ }
70
+ }
71
+ function todayISO() {
72
+ return new Date().toISOString().slice(0, 10);
73
+ }
74
+ /**
75
+ * Auto-detect project slug from environment, git, or cwd.
76
+ * Async to avoid blocking the event loop.
77
+ */
78
+ let _cachedProject = null;
79
+ async function detectProject() {
80
+ if (_cachedProject)
81
+ return _cachedProject;
82
+ // 1. Env var
83
+ if (process.env.AGENT_RECALL_PROJECT) {
84
+ _cachedProject = process.env.AGENT_RECALL_PROJECT;
85
+ return _cachedProject;
86
+ }
87
+ // 2. Git repo name (async)
88
+ try {
89
+ const { stdout } = await execFileAsync("git", ["config", "--get", "remote.origin.url"], { timeout: 3000 });
90
+ const remote = stdout.trim();
91
+ if (remote) {
92
+ const name = path.basename(remote, ".git");
93
+ if (name) {
94
+ _cachedProject = name;
95
+ return name;
96
+ }
97
+ }
98
+ }
99
+ catch {
100
+ try {
101
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { timeout: 3000 });
102
+ const root = stdout.trim();
103
+ if (root) {
104
+ _cachedProject = path.basename(root);
105
+ return _cachedProject;
106
+ }
107
+ }
108
+ catch {
109
+ // fall through
110
+ }
111
+ }
112
+ // 3. package.json name
113
+ const cwd = process.cwd();
114
+ const pkgPath = path.join(cwd, "package.json");
115
+ if (fs.existsSync(pkgPath)) {
116
+ try {
117
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
118
+ if (pkg.name) {
119
+ _cachedProject = pkg.name.replace(/^@[^/]+\//, "");
120
+ return _cachedProject;
121
+ }
122
+ }
123
+ catch {
124
+ // fall through
125
+ }
126
+ }
127
+ // 4. Basename of cwd
128
+ _cachedProject = path.basename(cwd);
129
+ return _cachedProject;
130
+ }
131
+ /**
132
+ * Resolve the journal directory for a project, checking both new and legacy locations.
133
+ * For writes, always use the new location.
134
+ */
135
+ function journalDir(project) {
136
+ return path.join(JOURNAL_ROOT, "projects", project, "journal");
137
+ }
138
+ /**
139
+ * Find all journal directories for a project (new + legacy fallback).
140
+ */
141
+ function journalDirs(project) {
142
+ const dirs = [];
143
+ const primary = journalDir(project);
144
+ if (fs.existsSync(primary))
145
+ dirs.push(primary);
146
+ // Legacy: ~/.claude/projects/*/memory/journal/
147
+ // We try to match project slug in the directory name
148
+ if (fs.existsSync(LEGACY_ROOT)) {
149
+ try {
150
+ const entries = fs.readdirSync(LEGACY_ROOT);
151
+ for (const entry of entries) {
152
+ if (entry.includes(project)) {
153
+ const legacyJournal = path.join(LEGACY_ROOT, entry, "memory", "journal");
154
+ if (fs.existsSync(legacyJournal)) {
155
+ dirs.push(legacyJournal);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // ignore
162
+ }
163
+ }
164
+ return dirs;
165
+ }
166
+ /**
167
+ * List all .md journal files across all directories for a project.
168
+ * Returns sorted array of { date, file, dir } with most recent first.
169
+ */
170
+ function listJournalFiles(project) {
171
+ const dirs = journalDirs(project);
172
+ const entries = [];
173
+ const seen = new Set();
174
+ for (const dir of dirs) {
175
+ if (!fs.existsSync(dir))
176
+ continue;
177
+ const files = fs.readdirSync(dir);
178
+ for (const file of files) {
179
+ // Match YYYY-MM-DD.md (not log files)
180
+ const match = file.match(/^(\d{4}-\d{2}-\d{2})\.md$/);
181
+ if (match && !seen.has(match[1])) {
182
+ seen.add(match[1]);
183
+ entries.push({ date: match[1], file, dir });
184
+ }
185
+ }
186
+ }
187
+ entries.sort((a, b) => b.date.localeCompare(a.date));
188
+ return entries;
189
+ }
190
+ /**
191
+ * Read a journal file. Checks primary dir first, then legacy.
192
+ */
193
+ function readJournalFile(project, date) {
194
+ const filename = `${date}.md`;
195
+ const dirs = journalDirs(project);
196
+ // Also check primary dir even if it wasn't in journalDirs (might not exist yet)
197
+ const primaryDir = journalDir(project);
198
+ const allDirs = [primaryDir, ...dirs.filter((d) => d !== primaryDir)];
199
+ for (const dir of allDirs) {
200
+ const filePath = path.join(dir, filename);
201
+ if (fs.existsSync(filePath)) {
202
+ return fs.readFileSync(filePath, "utf-8");
203
+ }
204
+ }
205
+ return null;
206
+ }
207
+ /**
208
+ * Extract a section from a markdown journal entry.
209
+ */
210
+ function extractSection(content, section) {
211
+ if (section === "all")
212
+ return content;
213
+ if (section === "brief") {
214
+ // Brief = first 3 non-empty lines after the title + momentum line if present
215
+ const lines = content.split("\n");
216
+ const nonEmpty = [];
217
+ let pastTitle = false;
218
+ for (const line of lines) {
219
+ if (line.startsWith("# ")) {
220
+ pastTitle = true;
221
+ continue;
222
+ }
223
+ if (!pastTitle)
224
+ continue;
225
+ const trimmed = line.trim();
226
+ if (trimmed === "")
227
+ continue;
228
+ nonEmpty.push(trimmed);
229
+ if (nonEmpty.length >= 4)
230
+ break; // 3 sentences + momentum
231
+ }
232
+ return nonEmpty.join("\n") || null;
233
+ }
234
+ const header = SECTION_HEADERS[section];
235
+ if (!header)
236
+ return null;
237
+ const idx = content.indexOf(header);
238
+ if (idx === -1)
239
+ return null;
240
+ // Find the next ## header (respecting code fences)
241
+ const afterHeader = content.slice(idx);
242
+ const lines = afterHeader.split("\n");
243
+ const result = [lines[0]];
244
+ let inCodeFence = false;
245
+ for (let i = 1; i < lines.length; i++) {
246
+ if (lines[i].startsWith("```"))
247
+ inCodeFence = !inCodeFence;
248
+ if (!inCodeFence && lines[i].startsWith("## "))
249
+ break;
250
+ result.push(lines[i]);
251
+ }
252
+ return result.join("\n").trimEnd();
253
+ }
254
+ /**
255
+ * Extract title from journal file content.
256
+ */
257
+ function extractTitle(content) {
258
+ const match = content.match(/^# (.+)$/m);
259
+ return match ? match[1].trim() : "(untitled)";
260
+ }
261
+ /**
262
+ * Extract momentum indicator from journal content.
263
+ */
264
+ function extractMomentum(content) {
265
+ // Look for momentum patterns like 🟢 加速, 🟡 稳定, 🔴 减速
266
+ const patterns = [/[🟢🟡🔴⚪]\s*\S+/];
267
+ for (const pattern of patterns) {
268
+ const match = content.match(pattern);
269
+ if (match)
270
+ return match[0];
271
+ }
272
+ return "";
273
+ }
274
+ /**
275
+ * Append content to a specific section in a journal file, or to end of file.
276
+ */
277
+ function appendToSection(existingContent, newContent, section) {
278
+ if (section === "replace_all") {
279
+ return newContent;
280
+ }
281
+ if (!section) {
282
+ // Append to end
283
+ return existingContent.trimEnd() + "\n\n" + newContent + "\n";
284
+ }
285
+ const header = SECTION_HEADERS[section];
286
+ if (!header) {
287
+ // Unknown section — append to end
288
+ return existingContent.trimEnd() + "\n\n" + newContent + "\n";
289
+ }
290
+ const idx = existingContent.indexOf(header);
291
+ if (idx === -1) {
292
+ // Section doesn't exist — append it
293
+ return (existingContent.trimEnd() + "\n\n" + header + "\n\n" + newContent + "\n");
294
+ }
295
+ // Find the end of this section (next ## header or EOF)
296
+ const afterHeader = existingContent.slice(idx);
297
+ const lines = afterHeader.split("\n");
298
+ let insertAt = lines.length;
299
+ for (let i = 1; i < lines.length; i++) {
300
+ if (lines[i].startsWith("## ")) {
301
+ insertAt = i;
302
+ break;
303
+ }
304
+ }
305
+ // Insert before the next section
306
+ const before = existingContent.slice(0, idx + lines.slice(0, insertAt).join("\n").length);
307
+ const after = existingContent.slice(idx + lines.slice(0, insertAt).join("\n").length);
308
+ return before.trimEnd() + "\n\n" + newContent + "\n" + after;
309
+ }
310
+ /**
311
+ * Update the index.md for a project.
312
+ */
313
+ function updateIndex(project) {
314
+ const dir = journalDir(project);
315
+ ensureDir(dir);
316
+ const indexPath = path.join(dir, "index.md");
317
+ const entries = listJournalFiles(project);
318
+ let index = `# ${project} — Journal Index\n\n`;
319
+ index += `> Auto-generated. ${entries.length} entries.\n\n`;
320
+ index += `| Date | Title | Momentum |\n`;
321
+ index += `|------|-------|----------|\n`;
322
+ for (const entry of entries) {
323
+ const content = fs.readFileSync(path.join(entry.dir, entry.file), "utf-8");
324
+ const title = extractTitle(content);
325
+ const momentum = extractMomentum(content);
326
+ index += `| ${entry.date} | ${title} | ${momentum} |\n`;
327
+ }
328
+ fs.writeFileSync(indexPath, index, "utf-8");
329
+ }
330
+ /**
331
+ * Count entries in a log file (for journal_capture entry numbering).
332
+ */
333
+ function countLogEntries(logPath) {
334
+ if (!fs.existsSync(logPath))
335
+ return 0;
336
+ const content = fs.readFileSync(logPath, "utf-8");
337
+ const matches = content.match(/^### Q\d+/gm);
338
+ return matches ? matches.length : 0;
339
+ }
340
+ /**
341
+ * List all projects (from both new and legacy locations).
342
+ */
343
+ function listAllProjects() {
344
+ const projects = new Map();
345
+ // New location
346
+ const projectsDir = path.join(JOURNAL_ROOT, "projects");
347
+ if (fs.existsSync(projectsDir)) {
348
+ const dirs = fs.readdirSync(projectsDir);
349
+ for (const slug of dirs) {
350
+ const jDir = path.join(projectsDir, slug, "journal");
351
+ if (fs.existsSync(jDir)) {
352
+ const files = fs.readdirSync(jDir).filter((f) => /^\d{4}-\d{2}-\d{2}\.md$/.test(f));
353
+ if (files.length > 0) {
354
+ files.sort().reverse();
355
+ projects.set(slug, {
356
+ slug,
357
+ lastEntry: files[0].replace(".md", ""),
358
+ entryCount: files.length,
359
+ });
360
+ }
361
+ }
362
+ }
363
+ }
364
+ // Legacy location
365
+ if (fs.existsSync(LEGACY_ROOT)) {
366
+ try {
367
+ const entries = fs.readdirSync(LEGACY_ROOT);
368
+ for (const entry of entries) {
369
+ const journalPath = path.join(LEGACY_ROOT, entry, "memory", "journal");
370
+ if (fs.existsSync(journalPath)) {
371
+ // Derive slug from directory name (e.g., "-Users-tongwu-some-project" -> "some-project")
372
+ const parts = entry.split("-").filter(Boolean);
373
+ const slug = parts[parts.length - 1] || entry;
374
+ if (!projects.has(slug)) {
375
+ const files = fs.readdirSync(journalPath).filter((f) => /^\d{4}-\d{2}-\d{2}\.md$/.test(f));
376
+ if (files.length > 0) {
377
+ files.sort().reverse();
378
+ projects.set(slug, {
379
+ slug,
380
+ lastEntry: files[0].replace(".md", ""),
381
+ entryCount: files.length,
382
+ });
383
+ }
384
+ }
385
+ }
386
+ }
387
+ }
388
+ catch {
389
+ // ignore
390
+ }
391
+ }
392
+ const result = Array.from(projects.values());
393
+ result.sort((a, b) => b.lastEntry.localeCompare(a.lastEntry));
394
+ return result;
395
+ }
396
+ /**
397
+ * Resolve "auto" project to actual slug.
398
+ */
399
+ async function resolveProject(project) {
400
+ if (!project || project === "auto") {
401
+ return await detectProject();
402
+ }
403
+ return project;
404
+ }
405
+ // ---------------------------------------------------------------------------
406
+ // MCP Server
407
+ // ---------------------------------------------------------------------------
408
+ const server = new McpServer({
409
+ name: "agent-recall",
410
+ version: VERSION,
411
+ });
412
+ // ---------------------------------------------------------------------------
413
+ // Tool: journal_read
414
+ // ---------------------------------------------------------------------------
415
+ server.registerTool("journal_read", {
416
+ title: "Read Journal Entry",
417
+ description: "Read a journal entry. Returns the full file content for agent cold-start. Use date='latest' for the most recent entry.",
418
+ inputSchema: {
419
+ date: z
420
+ .string()
421
+ .default("latest")
422
+ .describe("ISO date string YYYY-MM-DD. Defaults to 'latest'. Use 'latest' for most recent entry."),
423
+ project: z
424
+ .string()
425
+ .default("auto")
426
+ .describe("Project slug (directory name under ~/.agent-recall/projects/). Defaults to current git repo name."),
427
+ section: z
428
+ .enum([
429
+ "all",
430
+ "brief",
431
+ "qa",
432
+ "completed",
433
+ "status",
434
+ "blockers",
435
+ "next",
436
+ "decisions",
437
+ "reflection",
438
+ "files",
439
+ "observations",
440
+ ])
441
+ .default("all")
442
+ .describe("Which section to return. 'brief' returns only the cold-start summary. 'all' returns full file."),
443
+ },
444
+ }, async ({ date, project, section }) => {
445
+ const slug = await resolveProject(project);
446
+ let targetDate = date;
447
+ if (targetDate === "latest") {
448
+ const entries = listJournalFiles(slug);
449
+ if (entries.length === 0) {
450
+ return {
451
+ content: [
452
+ {
453
+ type: "text",
454
+ text: JSON.stringify({
455
+ error: `No journal entries found for project '${slug}'`,
456
+ project: slug,
457
+ }),
458
+ },
459
+ ],
460
+ isError: true,
461
+ };
462
+ }
463
+ targetDate = entries[0].date;
464
+ }
465
+ const fileContent = readJournalFile(slug, targetDate);
466
+ if (!fileContent) {
467
+ return {
468
+ content: [
469
+ {
470
+ type: "text",
471
+ text: JSON.stringify({
472
+ error: `No journal entry found for ${targetDate} in project '${slug}'`,
473
+ project: slug,
474
+ date: targetDate,
475
+ }),
476
+ },
477
+ ],
478
+ isError: true,
479
+ };
480
+ }
481
+ const extracted = extractSection(fileContent, section);
482
+ return {
483
+ content: [
484
+ {
485
+ type: "text",
486
+ text: JSON.stringify({
487
+ content: extracted || "",
488
+ date: targetDate,
489
+ project: slug,
490
+ }),
491
+ },
492
+ ],
493
+ };
494
+ });
495
+ // ---------------------------------------------------------------------------
496
+ // Tool: journal_write
497
+ // ---------------------------------------------------------------------------
498
+ server.registerTool("journal_write", {
499
+ title: "Write Journal Entry",
500
+ description: "Append content to the current journal entry (creates today's file if absent). Use section='replace_all' to overwrite entire file.",
501
+ inputSchema: {
502
+ content: z.string().describe("Markdown content to append or write."),
503
+ section: z
504
+ .enum([
505
+ "qa",
506
+ "completed",
507
+ "blockers",
508
+ "next",
509
+ "decisions",
510
+ "observations",
511
+ "replace_all",
512
+ ])
513
+ .optional()
514
+ .describe("Target section. If omitted, appends to end of file. 'replace_all' overwrites entire file."),
515
+ project: z
516
+ .string()
517
+ .default("auto")
518
+ .describe("Project slug. Defaults to auto-detect."),
519
+ },
520
+ }, async ({ content, section, project }) => {
521
+ const slug = await resolveProject(project);
522
+ const date = todayISO();
523
+ const dir = journalDir(slug);
524
+ ensureDir(dir);
525
+ const filePath = path.join(dir, `${date}.md`);
526
+ let existing = "";
527
+ if (fs.existsSync(filePath)) {
528
+ existing = fs.readFileSync(filePath, "utf-8");
529
+ }
530
+ else if (!section || section !== "replace_all") {
531
+ // Create a new file with a title
532
+ existing = `# ${date} — ${slug}\n`;
533
+ }
534
+ const sectionArg = section ?? null;
535
+ const updated = appendToSection(existing, content, sectionArg);
536
+ fs.writeFileSync(filePath, updated, "utf-8");
537
+ // Update index
538
+ updateIndex(slug);
539
+ return {
540
+ content: [
541
+ {
542
+ type: "text",
543
+ text: JSON.stringify({
544
+ success: true,
545
+ date,
546
+ file: filePath,
547
+ }),
548
+ },
549
+ ],
550
+ };
551
+ });
552
+ // ---------------------------------------------------------------------------
553
+ // Tool: journal_capture
554
+ // ---------------------------------------------------------------------------
555
+ server.registerTool("journal_capture", {
556
+ title: "Capture Q&A",
557
+ description: "Layer 1: lightweight Q&A capture. Appends to today's log file without loading the full journal.",
558
+ inputSchema: {
559
+ question: z
560
+ .string()
561
+ .describe("The human's question or request (summarized, 1 sentence)"),
562
+ answer: z
563
+ .string()
564
+ .describe("The agent's key answer or decision (summarized, 1-2 sentences)"),
565
+ tags: z
566
+ .array(z.string())
567
+ .optional()
568
+ .describe("Optional tags for this entry (e.g. ['decision', 'bug-fix', 'architecture'])"),
569
+ project: z
570
+ .string()
571
+ .default("auto")
572
+ .describe("Project slug. Defaults to auto-detect."),
573
+ },
574
+ }, async ({ question, answer, tags, project }) => {
575
+ const slug = await resolveProject(project);
576
+ const date = todayISO();
577
+ const dir = journalDir(slug);
578
+ ensureDir(dir);
579
+ const logPath = path.join(dir, `${date}-log.md`);
580
+ const entryNum = countLogEntries(logPath) + 1;
581
+ const tagStr = tags && tags.length > 0 ? ` [${tags.join(", ")}]` : "";
582
+ const timestamp = new Date().toISOString().slice(11, 19);
583
+ let entry = `### Q${entryNum} (${timestamp})${tagStr}\n\n`;
584
+ entry += `**Q:** ${question}\n\n`;
585
+ entry += `**A:** ${answer}\n\n`;
586
+ if (!fs.existsSync(logPath)) {
587
+ const header = `# ${date} — ${slug} — Session Log\n\n`;
588
+ fs.writeFileSync(logPath, header + entry, "utf-8");
589
+ }
590
+ else {
591
+ fs.appendFileSync(logPath, entry, "utf-8");
592
+ }
593
+ return {
594
+ content: [
595
+ {
596
+ type: "text",
597
+ text: JSON.stringify({
598
+ success: true,
599
+ entry_number: entryNum,
600
+ }),
601
+ },
602
+ ],
603
+ };
604
+ });
605
+ // ---------------------------------------------------------------------------
606
+ // Tool: journal_list
607
+ // ---------------------------------------------------------------------------
608
+ server.registerTool("journal_list", {
609
+ title: "List Journal Entries",
610
+ description: "List available journal entries for a project.",
611
+ inputSchema: {
612
+ project: z
613
+ .string()
614
+ .default("auto")
615
+ .describe("Project slug. Defaults to auto-detect."),
616
+ limit: z
617
+ .number()
618
+ .int()
619
+ .default(10)
620
+ .describe("Return the N most recent entries. 0 = all."),
621
+ },
622
+ }, async ({ project, limit }) => {
623
+ const slug = await resolveProject(project);
624
+ let entries = listJournalFiles(slug);
625
+ if (limit > 0) {
626
+ entries = entries.slice(0, limit);
627
+ }
628
+ const result = entries.map((e) => {
629
+ const content = fs.readFileSync(path.join(e.dir, e.file), "utf-8");
630
+ return {
631
+ date: e.date,
632
+ title: extractTitle(content),
633
+ momentum: extractMomentum(content),
634
+ };
635
+ });
636
+ return {
637
+ content: [
638
+ {
639
+ type: "text",
640
+ text: JSON.stringify({
641
+ project: slug,
642
+ entries: result,
643
+ }),
644
+ },
645
+ ],
646
+ };
647
+ });
648
+ // ---------------------------------------------------------------------------
649
+ // Tool: journal_projects
650
+ // ---------------------------------------------------------------------------
651
+ server.registerTool("journal_projects", {
652
+ title: "List Projects",
653
+ description: "List all projects tracked by agent-recall on this machine.",
654
+ inputSchema: {},
655
+ }, async () => {
656
+ const projects = listAllProjects();
657
+ return {
658
+ content: [
659
+ {
660
+ type: "text",
661
+ text: JSON.stringify({
662
+ projects: projects.map((p) => ({
663
+ slug: p.slug,
664
+ last_entry: p.lastEntry,
665
+ entry_count: p.entryCount,
666
+ })),
667
+ journal_root: JOURNAL_ROOT,
668
+ }),
669
+ },
670
+ ],
671
+ };
672
+ });
673
+ // ---------------------------------------------------------------------------
674
+ // Tool: journal_search
675
+ // ---------------------------------------------------------------------------
676
+ server.registerTool("journal_search", {
677
+ title: "Search Journals",
678
+ description: "Full-text search across all journal entries for a project.",
679
+ inputSchema: {
680
+ query: z.string().describe("Search term (plain text, case-insensitive)"),
681
+ project: z
682
+ .string()
683
+ .default("auto")
684
+ .describe("Project slug. Defaults to auto-detect."),
685
+ section: z
686
+ .string()
687
+ .optional()
688
+ .describe("Limit search to a specific section type."),
689
+ },
690
+ }, async ({ query, project, section }) => {
691
+ const slug = await resolveProject(project);
692
+ const dirs = journalDirs(slug);
693
+ const queryLower = query.toLowerCase();
694
+ const results = [];
695
+ for (const dir of dirs) {
696
+ if (!fs.existsSync(dir))
697
+ continue;
698
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
699
+ for (const file of files) {
700
+ const filePath = path.join(dir, file);
701
+ const content = fs.readFileSync(filePath, "utf-8");
702
+ const lines = content.split("\n");
703
+ let currentSection = "top";
704
+ for (let i = 0; i < lines.length; i++) {
705
+ const line = lines[i];
706
+ // Track current section
707
+ if (line.startsWith("## ")) {
708
+ currentSection = line
709
+ .slice(3)
710
+ .trim()
711
+ .toLowerCase()
712
+ .replace(/\s+/g, "_");
713
+ }
714
+ // Filter by section if specified
715
+ if (section && currentSection !== section.toLowerCase()) {
716
+ continue;
717
+ }
718
+ if (line.toLowerCase().includes(queryLower)) {
719
+ const dateMatch = file.match(/^(\d{4}-\d{2}-\d{2})/);
720
+ const date = dateMatch ? dateMatch[1] : file;
721
+ // Build excerpt: line with surrounding context
722
+ const start = Math.max(0, line.toLowerCase().indexOf(queryLower) - 40);
723
+ const end = Math.min(line.length, line.toLowerCase().indexOf(queryLower) + query.length + 40);
724
+ let excerpt = line.slice(start, end).trim();
725
+ if (start > 0)
726
+ excerpt = "..." + excerpt;
727
+ if (end < line.length)
728
+ excerpt = excerpt + "...";
729
+ results.push({
730
+ date,
731
+ section: currentSection,
732
+ excerpt,
733
+ line: i + 1,
734
+ });
735
+ }
736
+ }
737
+ }
738
+ }
739
+ // Sort by date descending
740
+ results.sort((a, b) => b.date.localeCompare(a.date));
741
+ return {
742
+ content: [
743
+ {
744
+ type: "text",
745
+ text: JSON.stringify({ results }),
746
+ },
747
+ ],
748
+ };
749
+ });
750
+ // ---------------------------------------------------------------------------
751
+ // Resources
752
+ // ---------------------------------------------------------------------------
753
+ // Resource: project index
754
+ server.registerResource("Journal Index", new ResourceTemplate("agent-recall://{project}/index", {
755
+ list: async () => {
756
+ const projects = listAllProjects();
757
+ return {
758
+ resources: projects.map((p) => ({
759
+ uri: `agent-recall://${p.slug}/index`,
760
+ name: `${p.slug} — Journal Index`,
761
+ mimeType: "text/markdown",
762
+ })),
763
+ };
764
+ },
765
+ }), { description: "Journal index for a project", mimeType: "text/markdown" }, async (uri, { project }) => {
766
+ const slug = Array.isArray(project) ? project[0] : (project || "unknown");
767
+ const indexPath = path.join(journalDir(slug), "index.md");
768
+ let content = "";
769
+ if (fs.existsSync(indexPath)) {
770
+ content = fs.readFileSync(indexPath, "utf-8");
771
+ }
772
+ else {
773
+ content = `# ${slug} — No journal index found\n`;
774
+ }
775
+ return {
776
+ contents: [
777
+ {
778
+ uri: uri.href,
779
+ text: content,
780
+ mimeType: "text/markdown",
781
+ },
782
+ ],
783
+ };
784
+ });
785
+ // Resource: specific date entry
786
+ server.registerResource("Journal Entry", new ResourceTemplate("agent-recall://{project}/{date}", {
787
+ list: async () => {
788
+ const projects = listAllProjects();
789
+ const resources = [];
790
+ for (const p of projects) {
791
+ const entries = listJournalFiles(p.slug).slice(0, 5);
792
+ for (const e of entries) {
793
+ resources.push({
794
+ uri: `agent-recall://${p.slug}/${e.date}`,
795
+ name: `${p.slug} — ${e.date}`,
796
+ mimeType: "text/markdown",
797
+ });
798
+ }
799
+ }
800
+ return { resources };
801
+ },
802
+ }), {
803
+ description: "A specific journal entry by date",
804
+ mimeType: "text/markdown",
805
+ }, async (uri, { project, date }) => {
806
+ const slug = Array.isArray(project) ? project[0] : (project || "unknown");
807
+ const entryDate = Array.isArray(date) ? date[0] : (date || todayISO());
808
+ const content = readJournalFile(slug, entryDate);
809
+ return {
810
+ contents: [
811
+ {
812
+ uri: uri.href,
813
+ text: content || `# No entry for ${entryDate}\n`,
814
+ mimeType: "text/markdown",
815
+ },
816
+ ],
817
+ };
818
+ });
819
+ // ---------------------------------------------------------------------------
820
+ // Start
821
+ // ---------------------------------------------------------------------------
822
+ async function main() {
823
+ const transport = new StdioServerTransport();
824
+ await server.connect(transport);
825
+ }
826
+ main().catch((err) => {
827
+ process.stderr.write(`Fatal: ${err}\n`);
828
+ process.exit(1);
829
+ });
830
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "agent-recall-mcp",
3
+ "version": "1.0.0",
4
+ "description": "AI session memory with Think-Execute-Reflect quality loops — give your agent a brain that survives every session",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "agent-recall-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"",
15
+ "prepare": "npm run build",
16
+ "prepublishOnly": "npm run build",
17
+ "start": "node dist/index.js",
18
+ "dev": "tsc --watch",
19
+ "test": "node --test test/basics.test.mjs"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "mcp-server",
24
+ "model-context-protocol",
25
+ "agent-recall",
26
+ "ai-memory",
27
+ "session-memory",
28
+ "journal",
29
+ "ai-agents",
30
+ "claude-code",
31
+ "cursor",
32
+ "intelligent-distance",
33
+ "quality-loop",
34
+ "think-execute-reflect",
35
+ "agent-memory",
36
+ "cold-start"
37
+ ],
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/Goldentrii/AgentRecall.git",
42
+ "directory": "mcp-server"
43
+ },
44
+ "homepage": "https://github.com/Goldentrii/AgentRecall#mcp-server",
45
+ "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.28.0"
47
+ },
48
+ "devDependencies": {
49
+ "typescript": "^5.7.0",
50
+ "@types/node": "^22.0.0"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ }
55
+ }