fathom-mcp 0.2.1 → 0.2.3
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/fathom-agents.md +68 -0
- package/package.json +2 -1
- package/src/cli.js +23 -1
- package/src/index.js +3 -5
package/fathom-agents.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# {{WORKSPACE_NAME}}
|
|
2
|
+
|
|
3
|
+
{{DESCRIPTION}}
|
|
4
|
+
|
|
5
|
+
## Memory — Memento Protocol
|
|
6
|
+
|
|
7
|
+
Working memory is managed by Memento (workspace: `{{WORKSPACE_NAME}}`).
|
|
8
|
+
|
|
9
|
+
**On session start:**
|
|
10
|
+
1. `memento_health` — verify connection
|
|
11
|
+
2. `memento_item_list` — check active work items and their next actions
|
|
12
|
+
3. `memento_recall` with current task context — find relevant past memories
|
|
13
|
+
|
|
14
|
+
**During work — actively manage your memories:**
|
|
15
|
+
- `memento_store` when you learn something, make a decision, or discover a pattern
|
|
16
|
+
- `memento_recall` before starting any subtask — someone may have already figured it out
|
|
17
|
+
- `memento_item_update` as you make progress — don't wait until the end
|
|
18
|
+
- `memento_item_create` when new work emerges
|
|
19
|
+
- `memento_skip_add` the moment you hit a dead end (with expiry)
|
|
20
|
+
- `memento_consolidate` when recall returns 3+ overlapping memories on the same topic
|
|
21
|
+
- Delete or archive items that are done or wrong — stale memory is worse than no memory
|
|
22
|
+
|
|
23
|
+
**Writing discipline — instructions, not logs:**
|
|
24
|
+
- Write: "API moved to /v2 — update all calls" not "checked API, got 404"
|
|
25
|
+
- Write: "Skip X until condition Y" not "checked X, it was quiet"
|
|
26
|
+
- Tag generously — tags power recall and consolidation
|
|
27
|
+
- Set expiration on time-sensitive facts
|
|
28
|
+
- The test: could a future you, with zero context, read this and know exactly what to do?
|
|
29
|
+
|
|
30
|
+
## Vault
|
|
31
|
+
|
|
32
|
+
Local files live in `{{VAULT_DIR}}/`. Vault is for long-form content — things that need to breathe, not be queried. Decisions and next-actions go in Memento; reflections, research notes, and finished pieces go in the vault.
|
|
33
|
+
|
|
34
|
+
**Folder conventions:**
|
|
35
|
+
- `research/` — reading notes, paper annotations, deep dives
|
|
36
|
+
- `thinking/` — speculative connections, insights, one file per idea
|
|
37
|
+
- `daily/` — session heartbeats and progress logs
|
|
38
|
+
|
|
39
|
+
**Frontmatter required** on vault files:
|
|
40
|
+
```yaml
|
|
41
|
+
---
|
|
42
|
+
title: My Note # required (string)
|
|
43
|
+
date: 2026-02-26 # required (YYYY-MM-DD)
|
|
44
|
+
tags: [research, topic] # optional
|
|
45
|
+
status: draft # optional: draft | published | archived
|
|
46
|
+
---
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Cross-Workspace Communication
|
|
50
|
+
|
|
51
|
+
This workspace is part of a multi-workspace system. Other workspaces exist — you can talk to them.
|
|
52
|
+
|
|
53
|
+
- **Peek at another workspace's memory:** `memento_recall query="..." workspace="other-ws"`
|
|
54
|
+
- **Peek at another workspace's vault:** `fathom_vault_read path="file.md" workspace="other-ws"`
|
|
55
|
+
- **Send a direct message:** `fathom_send workspace="other-ws" message="..."`
|
|
56
|
+
- **Post to a shared room:** `fathom_room_post room="general" message="..."`
|
|
57
|
+
- **Read room history:** `fathom_room_read room="general"`
|
|
58
|
+
- **Discover workspaces:** `fathom_workspaces`
|
|
59
|
+
|
|
60
|
+
Your sender identity is automatic — messages are tagged with `{{WORKSPACE_NAME}}`.
|
|
61
|
+
|
|
62
|
+
## Workflow
|
|
63
|
+
|
|
64
|
+
1. Research and reading notes → `vault/research/`
|
|
65
|
+
2. Speculative connections and insights → `vault/thinking/`
|
|
66
|
+
3. Key findings and decisions → `memento_store` with tags
|
|
67
|
+
4. Session heartbeats → `vault/daily/`
|
|
68
|
+
5. When done — update Memento items, write what you found and what questions remain
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fathom-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "MCP server for Fathom — vault operations, search, rooms, and cross-workspace communication",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"src/",
|
|
12
12
|
"scripts/",
|
|
13
|
+
"fathom-agents.md",
|
|
13
14
|
"README.md",
|
|
14
15
|
"CHANGELOG.md",
|
|
15
16
|
"LICENSE"
|
package/src/cli.js
CHANGED
|
@@ -371,6 +371,20 @@ async function runInit() {
|
|
|
371
371
|
console.log(` · ${vault}/ (already exists)`);
|
|
372
372
|
}
|
|
373
373
|
|
|
374
|
+
// fathom-agents.md — boilerplate agent instructions
|
|
375
|
+
const agentMdSrc = path.join(__dirname, "..", "fathom-agents.md");
|
|
376
|
+
const agentMdDest = path.join(cwd, ".fathom", "fathom-agents.md");
|
|
377
|
+
try {
|
|
378
|
+
let template = fs.readFileSync(agentMdSrc, "utf-8");
|
|
379
|
+
template = template
|
|
380
|
+
.replace(/\{\{WORKSPACE_NAME\}\}/g, workspace)
|
|
381
|
+
.replace(/\{\{VAULT_DIR\}\}/g, vault)
|
|
382
|
+
.replace(/\{\{DESCRIPTION\}\}/g, description || `${workspace} workspace`);
|
|
383
|
+
fs.mkdirSync(path.dirname(agentMdDest), { recursive: true });
|
|
384
|
+
fs.writeFileSync(agentMdDest, template);
|
|
385
|
+
console.log(" ✓ .fathom/fathom-agents.md");
|
|
386
|
+
} catch { /* template not found — skip silently */ }
|
|
387
|
+
|
|
374
388
|
// Per-agent config files
|
|
375
389
|
for (const agentKey of selectedAgents) {
|
|
376
390
|
const agent = AGENTS[agentKey];
|
|
@@ -450,7 +464,15 @@ async function runInit() {
|
|
|
450
464
|
const agent = AGENTS[agentKey];
|
|
451
465
|
console.log(` · ${agent.name}: ${agent.nextSteps}`);
|
|
452
466
|
}
|
|
453
|
-
console.log(
|
|
467
|
+
console.log(`
|
|
468
|
+
Agent instructions:
|
|
469
|
+
Some instructions are needed for your agent to use Fathom + Memento
|
|
470
|
+
effectively (memory discipline, vault conventions, cross-workspace
|
|
471
|
+
communication). Saved to: .fathom/fathom-agents.md
|
|
472
|
+
|
|
473
|
+
Paste it into your CLAUDE.md, AGENTS.md, or equivalent — or point
|
|
474
|
+
your agent at the file and ask it to integrate the instructions.
|
|
475
|
+
`);
|
|
454
476
|
}
|
|
455
477
|
|
|
456
478
|
// --- Status command ----------------------------------------------------------
|
package/src/index.js
CHANGED
|
@@ -213,7 +213,6 @@ const tools = [
|
|
|
213
213
|
properties: {
|
|
214
214
|
room: { type: "string", description: "Room name, e.g. 'general', 'navier-stokes'. Created on first post." },
|
|
215
215
|
message: { type: "string", description: "Message to post. Use @workspace to mention and notify specific workspaces (e.g. '@fathom check this'), or @all for everyone." },
|
|
216
|
-
sender: { type: "string", description: `Who is posting (defaults to workspace name: "${config.workspace}")` },
|
|
217
216
|
},
|
|
218
217
|
required: ["room", "message"],
|
|
219
218
|
},
|
|
@@ -278,8 +277,7 @@ const tools = [
|
|
|
278
277
|
type: "object",
|
|
279
278
|
properties: {
|
|
280
279
|
workspace: { type: "string", description: "Target workspace name — run fathom_workspaces to see available options" },
|
|
281
|
-
message: { type: "string", description: "Message to send to the target workspace's
|
|
282
|
-
from: { type: "string", description: `Your workspace name so the recipient knows who sent it (defaults to "${config.workspace}")` },
|
|
280
|
+
message: { type: "string", description: "Message to send to the target workspace's agent instance" },
|
|
283
281
|
},
|
|
284
282
|
required: ["workspace", "message"],
|
|
285
283
|
},
|
|
@@ -411,7 +409,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
411
409
|
result = await client.hybridSearch(args.query, { limit: args.limit, ws: args.workspace });
|
|
412
410
|
break;
|
|
413
411
|
case "fathom_room_post":
|
|
414
|
-
result = await client.roomPost(args.room, args.message,
|
|
412
|
+
result = await client.roomPost(args.room, args.message, config.workspace);
|
|
415
413
|
break;
|
|
416
414
|
case "fathom_room_read":
|
|
417
415
|
result = await client.roomRead(args.room, args.hours);
|
|
@@ -428,7 +426,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
428
426
|
case "fathom_send":
|
|
429
427
|
// Send is implemented server-side (it manages tmux sessions)
|
|
430
428
|
result = await client.request?.("POST", `/api/room/${encodeURIComponent("__dm__")}`, {
|
|
431
|
-
body: { message: `Message from workspace (${
|
|
429
|
+
body: { message: `Message from workspace (${config.workspace}): ${args.message}`, sender: config.workspace },
|
|
432
430
|
});
|
|
433
431
|
// For now, fall back to error until server implements /api/send
|
|
434
432
|
if (!result || result.error) {
|