@clauderecallhq/cli 0.12.5 → 0.61.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.
Files changed (218) hide show
  1. package/LICENSE +37 -17
  2. package/README.md +110 -22
  3. package/dist/cli.js +1641 -353
  4. package/dist/daemon/entrypoint.js +1872 -54
  5. package/dist/mcp-server.js +930 -0
  6. package/dist/share/fonts/Inter-Bold.woff +0 -0
  7. package/dist/share/fonts/Inter-Regular.woff +0 -0
  8. package/dist/share/fonts/JetBrainsMono-Regular.woff +0 -0
  9. package/dist/web/assets/_brand-Bw9uSB4O.js +1 -0
  10. package/dist/web/assets/captureNode-9CVj9vYC.js +2 -0
  11. package/dist/web/assets/card-a-minimal-ujNERzX7.js +1 -0
  12. package/dist/web/assets/card-b-terminal-DpJ_tVpg.js +1 -0
  13. package/dist/web/assets/card-c-gradient-CZXVGuNd.js +1 -0
  14. package/dist/web/assets/card-d-dashboard-CHKD-PnB.js +1 -0
  15. package/dist/web/assets/dist-CWaokT35.js +56 -0
  16. package/dist/web/assets/index-B-HrjaDy.css +1 -0
  17. package/dist/web/assets/index-BZYcD76T.js +633 -0
  18. package/dist/web/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
  19. package/dist/web/assets/patterns-BPeZb9N0.js +1 -0
  20. package/dist/web/assets/stats-BSwqSiFU.js +1 -0
  21. package/dist/web/assets/thread-D2AXyhOx.js +1 -0
  22. package/dist/web/index.html +8 -2
  23. package/package.json +58 -18
  24. package/scripts/postinstall.mjs +38 -0
  25. package/dist/cli.js.map +0 -1
  26. package/dist/commands/activate.js +0 -69
  27. package/dist/commands/activate.js.map +0 -1
  28. package/dist/commands/audit-secrets.js +0 -103
  29. package/dist/commands/audit-secrets.js.map +0 -1
  30. package/dist/commands/blame.js +0 -35
  31. package/dist/commands/blame.js.map +0 -1
  32. package/dist/commands/config-verification.js +0 -18
  33. package/dist/commands/config-verification.js.map +0 -1
  34. package/dist/commands/context.js +0 -144
  35. package/dist/commands/context.js.map +0 -1
  36. package/dist/commands/correlate.js +0 -70
  37. package/dist/commands/correlate.js.map +0 -1
  38. package/dist/commands/digest.js +0 -78
  39. package/dist/commands/digest.js.map +0 -1
  40. package/dist/commands/health.js +0 -62
  41. package/dist/commands/health.js.map +0 -1
  42. package/dist/commands/index.js +0 -247
  43. package/dist/commands/index.js.map +0 -1
  44. package/dist/commands/install-extension.js +0 -138
  45. package/dist/commands/install-extension.js.map +0 -1
  46. package/dist/commands/license.js +0 -39
  47. package/dist/commands/license.js.map +0 -1
  48. package/dist/commands/list.js +0 -47
  49. package/dist/commands/list.js.map +0 -1
  50. package/dist/commands/mcp.js +0 -29
  51. package/dist/commands/mcp.js.map +0 -1
  52. package/dist/commands/open.js +0 -28
  53. package/dist/commands/open.js.map +0 -1
  54. package/dist/commands/paste.js +0 -154
  55. package/dist/commands/paste.js.map +0 -1
  56. package/dist/commands/projects.js +0 -36
  57. package/dist/commands/projects.js.map +0 -1
  58. package/dist/commands/search.js +0 -67
  59. package/dist/commands/search.js.map +0 -1
  60. package/dist/commands/semantic.js +0 -173
  61. package/dist/commands/semantic.js.map +0 -1
  62. package/dist/commands/show.js +0 -121
  63. package/dist/commands/show.js.map +0 -1
  64. package/dist/commands/start.js +0 -47
  65. package/dist/commands/start.js.map +0 -1
  66. package/dist/commands/stats.js +0 -133
  67. package/dist/commands/stats.js.map +0 -1
  68. package/dist/commands/status.js +0 -45
  69. package/dist/commands/status.js.map +0 -1
  70. package/dist/commands/stop.js +0 -29
  71. package/dist/commands/stop.js.map +0 -1
  72. package/dist/commands/thread.js +0 -396
  73. package/dist/commands/thread.js.map +0 -1
  74. package/dist/context/formatter.js +0 -103
  75. package/dist/context/formatter.js.map +0 -1
  76. package/dist/daemon/auto-tag-config.js +0 -103
  77. package/dist/daemon/auto-tag-config.js.map +0 -1
  78. package/dist/daemon/auto-tag-config.test.js +0 -72
  79. package/dist/daemon/auto-tag-config.test.js.map +0 -1
  80. package/dist/daemon/auto-title-config.js +0 -70
  81. package/dist/daemon/auto-title-config.js.map +0 -1
  82. package/dist/daemon/bulk-title-jobs.js +0 -170
  83. package/dist/daemon/bulk-title-jobs.js.map +0 -1
  84. package/dist/daemon/correlator.js +0 -320
  85. package/dist/daemon/correlator.js.map +0 -1
  86. package/dist/daemon/discover.js +0 -316
  87. package/dist/daemon/discover.js.map +0 -1
  88. package/dist/daemon/editor-detection.js +0 -186
  89. package/dist/daemon/editor-detection.js.map +0 -1
  90. package/dist/daemon/entrypoint.js.map +0 -1
  91. package/dist/daemon/git-correlator.js +0 -256
  92. package/dist/daemon/git-correlator.js.map +0 -1
  93. package/dist/daemon/mcp-installer.js +0 -108
  94. package/dist/daemon/mcp-installer.js.map +0 -1
  95. package/dist/daemon/onboarding-state.js +0 -140
  96. package/dist/daemon/onboarding-state.js.map +0 -1
  97. package/dist/daemon/pidfile.js +0 -57
  98. package/dist/daemon/pidfile.js.map +0 -1
  99. package/dist/daemon/ports.js +0 -48
  100. package/dist/daemon/ports.js.map +0 -1
  101. package/dist/daemon/scanProgressRegistry.js +0 -62
  102. package/dist/daemon/scanProgressRegistry.js.map +0 -1
  103. package/dist/daemon/server.js +0 -2010
  104. package/dist/daemon/server.js.map +0 -1
  105. package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
  106. package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
  107. package/dist/daemon/tag-scanner/autopilot.js +0 -131
  108. package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
  109. package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
  110. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
  111. package/dist/daemon/tag-scanner/orchestrator.js +0 -88
  112. package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
  113. package/dist/daemon/tag-scanner/prompt.js +0 -46
  114. package/dist/daemon/tag-scanner/prompt.js.map +0 -1
  115. package/dist/daemon/tag-scanner/prompt.test.js +0 -48
  116. package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
  117. package/dist/daemon/tag-scanner/scan-state.js +0 -49
  118. package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
  119. package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
  120. package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
  121. package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
  122. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
  123. package/dist/daemon/tag-scanner/validator.js +0 -50
  124. package/dist/daemon/tag-scanner/validator.js.map +0 -1
  125. package/dist/daemon/tag-scanner/validator.test.js +0 -41
  126. package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
  127. package/dist/daemon/terminal-registry.js +0 -443
  128. package/dist/daemon/terminal-registry.js.map +0 -1
  129. package/dist/daemon/ui.js +0 -64
  130. package/dist/daemon/ui.js.map +0 -1
  131. package/dist/daemon/watcher.js +0 -256
  132. package/dist/daemon/watcher.js.map +0 -1
  133. package/dist/db/client.js +0 -22
  134. package/dist/db/client.js.map +0 -1
  135. package/dist/db/schema.js +0 -496
  136. package/dist/db/schema.js.map +0 -1
  137. package/dist/license/api-base.js +0 -13
  138. package/dist/license/api-base.js.map +0 -1
  139. package/dist/license/manager.js +0 -43
  140. package/dist/license/manager.js.map +0 -1
  141. package/dist/license/public-key.js +0 -19
  142. package/dist/license/public-key.js.map +0 -1
  143. package/dist/license/storage.js +0 -27
  144. package/dist/license/storage.js.map +0 -1
  145. package/dist/license/verify.js +0 -23
  146. package/dist/license/verify.js.map +0 -1
  147. package/dist/mcp/audit.js +0 -126
  148. package/dist/mcp/audit.js.map +0 -1
  149. package/dist/mcp/prompts.js +0 -180
  150. package/dist/mcp/prompts.js.map +0 -1
  151. package/dist/mcp/server.js +0 -502
  152. package/dist/mcp/server.js.map +0 -1
  153. package/dist/mcp/thread-tools.js +0 -363
  154. package/dist/mcp/thread-tools.js.map +0 -1
  155. package/dist/mcp/write-tools.js +0 -239
  156. package/dist/mcp/write-tools.js.map +0 -1
  157. package/dist/parser/jsonl.js +0 -150
  158. package/dist/parser/jsonl.js.map +0 -1
  159. package/dist/semantic/chunker.js +0 -47
  160. package/dist/semantic/chunker.js.map +0 -1
  161. package/dist/semantic/config.js +0 -74
  162. package/dist/semantic/config.js.map +0 -1
  163. package/dist/semantic/embedder.js +0 -54
  164. package/dist/semantic/embedder.js.map +0 -1
  165. package/dist/semantic/fusion.js +0 -38
  166. package/dist/semantic/fusion.js.map +0 -1
  167. package/dist/semantic/model-download.js +0 -69
  168. package/dist/semantic/model-download.js.map +0 -1
  169. package/dist/semantic/pipeline.js +0 -375
  170. package/dist/semantic/pipeline.js.map +0 -1
  171. package/dist/semantic/query.js +0 -42
  172. package/dist/semantic/query.js.map +0 -1
  173. package/dist/semantic/worker.js +0 -78
  174. package/dist/semantic/worker.js.map +0 -1
  175. package/dist/stats/backfill.js +0 -151
  176. package/dist/stats/backfill.js.map +0 -1
  177. package/dist/stats/health.js +0 -102
  178. package/dist/stats/health.js.map +0 -1
  179. package/dist/stats/query.js +0 -385
  180. package/dist/stats/query.js.map +0 -1
  181. package/dist/utils/aliases.js +0 -107
  182. package/dist/utils/aliases.js.map +0 -1
  183. package/dist/utils/autoCollections.js +0 -635
  184. package/dist/utils/autoCollections.js.map +0 -1
  185. package/dist/utils/autoTitle.js +0 -348
  186. package/dist/utils/autoTitle.js.map +0 -1
  187. package/dist/utils/collections.js +0 -446
  188. package/dist/utils/collections.js.map +0 -1
  189. package/dist/utils/format.js +0 -46
  190. package/dist/utils/format.js.map +0 -1
  191. package/dist/utils/notes.js +0 -270
  192. package/dist/utils/notes.js.map +0 -1
  193. package/dist/utils/paths.js +0 -50
  194. package/dist/utils/paths.js.map +0 -1
  195. package/dist/utils/pricing.js +0 -257
  196. package/dist/utils/pricing.js.map +0 -1
  197. package/dist/utils/secret-scanner.js +0 -166
  198. package/dist/utils/secret-scanner.js.map +0 -1
  199. package/dist/utils/sessionLabel.js +0 -64
  200. package/dist/utils/sessionLabel.js.map +0 -1
  201. package/dist/utils/tags.js +0 -97
  202. package/dist/utils/tags.js.map +0 -1
  203. package/dist/utils/thread-context.js +0 -129
  204. package/dist/utils/thread-context.js.map +0 -1
  205. package/dist/utils/threadFilter.js +0 -18
  206. package/dist/utils/threadFilter.js.map +0 -1
  207. package/dist/utils/threads-titler.js +0 -298
  208. package/dist/utils/threads-titler.js.map +0 -1
  209. package/dist/utils/threads.js +0 -383
  210. package/dist/utils/threads.js.map +0 -1
  211. package/dist/utils/usage.js +0 -76
  212. package/dist/utils/usage.js.map +0 -1
  213. package/dist/verification/compute.js +0 -88
  214. package/dist/verification/compute.js.map +0 -1
  215. package/dist/verification/config.js +0 -34
  216. package/dist/verification/config.js.map +0 -1
  217. package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
  218. package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
@@ -1,502 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * claude-recall-mcp — v0.8 Model Context Protocol server.
4
- *
5
- * Exposes the read-only slice of Recall (search, list, export) to any MCP
6
- * client over stdio. Zero network I/O. Zero writes to the indexed data.
7
- * Shares the same SQLite file and the same `formatSessionAsContext` used by
8
- * the CLI and HTTP daemon — so whatever the web UI or `recall context` emits,
9
- * an MCP client sees the same thing.
10
- *
11
- * NEVER write to stdout outside of the transport — stdio MCP multiplexes
12
- * JSON-RPC on stdout. All diagnostics go to stderr.
13
- */
14
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
15
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
- import { z } from 'zod';
17
- import { closeDb, getDb } from '../db/client.js';
18
- import { formatSessionAsContext, } from '../context/formatter.js';
19
- import { addTag, allTagsWithCounts, normalizeTag, tagsForSession } from '../utils/tags.js';
20
- import { listSessionsForScan } from '../daemon/tag-scanner/session-fetcher.js';
21
- import { readAutoTagConfig } from '../daemon/auto-tag-config.js';
22
- import { RECALL_PROMPTS } from './prompts.js';
23
- import { registerWriteTools } from './write-tools.js';
24
- import { registerThreadReadTools, registerThreadWriteTools } from './thread-tools.js';
25
- import { DEFAULT_RATE_LIMIT_PER_MIN, RateLimiter } from './audit.js';
26
- import { getEmbedderStatus } from '../semantic/embedder.js';
27
- import { vectorSearch, findSimilarSessions } from '../semantic/query.js';
28
- import { fuseResults } from '../semantic/fusion.js';
29
- import { getWorkerStatus } from '../semantic/worker.js';
30
- import { isModelInstalled } from '../semantic/model-download.js';
31
- const VERSION = '0.9.0';
32
- /**
33
- * Writes are off by default. Enabled via the CLI flag `recall mcp --allow-writes`,
34
- * which sets RECALL_MCP_ALLOW_WRITES=1 in the spawned child's env. We avoid a
35
- * positional argv parser here so the binary stays trivially launchable from
36
- * any MCP client config.
37
- */
38
- function writesEnabled() {
39
- const flag = process.env.RECALL_MCP_ALLOW_WRITES;
40
- return flag === '1' || flag === 'true';
41
- }
42
- function json(data) {
43
- return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
44
- }
45
- function text(str) {
46
- return { content: [{ type: 'text', text: str }] };
47
- }
48
- function error(message) {
49
- return { content: [{ type: 'text', text: message }], isError: true };
50
- }
51
- /**
52
- * Resolve a user-supplied id or short prefix to a canonical session UUID.
53
- * Returns null if no match OR if the prefix is ambiguous — callers should
54
- * surface that as a tool error rather than guessing.
55
- */
56
- function resolveSessionId(raw) {
57
- const trimmed = raw.trim();
58
- if (trimmed.length < 4)
59
- return null;
60
- const db = getDb();
61
- if (trimmed.length >= 32) {
62
- const row = db.prepare('SELECT id FROM sessions WHERE id = ?').get(trimmed);
63
- return row?.id ?? null;
64
- }
65
- const matches = db
66
- .prepare('SELECT id FROM sessions WHERE id LIKE ? LIMIT 2')
67
- .all(`${trimmed}%`);
68
- if (matches.length === 1)
69
- return matches[0].id;
70
- return null;
71
- }
72
- export function buildServer() {
73
- const server = new McpServer({ name: 'claude-recall', version: VERSION });
74
- const allowWrites = writesEnabled();
75
- server.registerTool('list_projects', {
76
- title: 'List projects',
77
- description: 'Every Claude Code project currently indexed by Recall, with session and message counts and the most recent activity timestamp.',
78
- inputSchema: {},
79
- }, async () => {
80
- const db = getDb();
81
- const rows = db
82
- .prepare(`SELECT p.name, p.decoded_path,
83
- COUNT(s.id) AS session_count,
84
- COALESCE(SUM(s.message_count), 0) AS message_count,
85
- MAX(s.started_at) AS latest
86
- FROM projects p
87
- LEFT JOIN sessions s ON s.project_id = p.id
88
- GROUP BY p.id
89
- ORDER BY MAX(COALESCE(s.started_at, '')) DESC`)
90
- .all();
91
- return json(rows);
92
- });
93
- server.registerTool('list_sessions', {
94
- title: 'List sessions',
95
- description: 'Recent sessions with alias, tags, and message counts. Optional filters for project, tag, and date range.',
96
- inputSchema: {
97
- project: z
98
- .string()
99
- .optional()
100
- .describe('Substring match against project name or decoded filesystem path.'),
101
- tag: z.string().optional().describe('Only sessions carrying this tag (leading # optional).'),
102
- since: z
103
- .string()
104
- .optional()
105
- .describe('Only sessions started at or after this ISO timestamp or YYYY-MM-DD date.'),
106
- until: z
107
- .string()
108
- .optional()
109
- .describe('Only sessions started at or before this ISO timestamp or YYYY-MM-DD date.'),
110
- limit: z.number().int().min(1).max(500).optional(),
111
- },
112
- }, async ({ project, tag, since, until, limit }) => {
113
- const db = getDb();
114
- const params = { limit: limit ?? 100 };
115
- let where = 's.message_count > 2';
116
- if (project) {
117
- where += ' AND (p.name LIKE @proj OR p.decoded_path LIKE @proj)';
118
- params.proj = `%${project}%`;
119
- }
120
- if (since) {
121
- where += ' AND s.started_at >= @since';
122
- params.since = since;
123
- }
124
- if (until) {
125
- where += ' AND s.started_at <= @until';
126
- params.until = /^\d{4}-\d{2}-\d{2}$/.test(until) ? `${until}T23:59:59.999Z` : until;
127
- }
128
- if (tag) {
129
- const normalized = normalizeTag(tag);
130
- if (normalized) {
131
- where += ' AND s.id IN (SELECT session_id FROM session_tags WHERE tag = @tag)';
132
- params.tag = normalized;
133
- }
134
- }
135
- const rows = db
136
- .prepare(`SELECT s.id, p.name AS project, s.started_at, s.ended_at,
137
- s.message_count, s.first_user_message, s.git_branch,
138
- NULLIF(sa.alias, '') AS alias,
139
- CASE WHEN sn.content IS NOT NULL AND sn.content != '' THEN 1 ELSE 0 END AS has_notes,
140
- COALESCE(
141
- (SELECT GROUP_CONCAT(tag, ',')
142
- FROM (SELECT tag FROM session_tags WHERE session_id = s.id ORDER BY tag)),
143
- ''
144
- ) AS tags_csv
145
- FROM sessions s
146
- JOIN projects p ON p.id = s.project_id
147
- LEFT JOIN session_aliases sa ON sa.session_id = s.id
148
- LEFT JOIN session_notes sn ON sn.session_id = s.id
149
- WHERE ${where}
150
- ORDER BY COALESCE(s.started_at, '') DESC
151
- LIMIT @limit`)
152
- .all(params);
153
- const expanded = rows.map(({ tags_csv, ...rest }) => ({
154
- ...rest,
155
- tags: tags_csv ? tags_csv.split(',') : [],
156
- }));
157
- return json(expanded);
158
- });
159
- server.registerTool('list_tags', {
160
- title: 'List tags',
161
- description: 'Every tag currently applied to a session, with its count, most popular first.',
162
- inputSchema: {},
163
- }, async () => json(allTagsWithCounts()));
164
- server.registerTool('list_sessions_to_tag', {
165
- title: 'List sessions to tag',
166
- description: 'Return session summaries and sampled messages formatted for an agent to propose tags. Respects the same scope filters used by the Recall UI scan. Only returns data if auto-tagging is enabled in config.',
167
- inputSchema: {
168
- untaggedOnly: z
169
- .boolean()
170
- .optional()
171
- .describe('Only sessions with zero tags (default false).'),
172
- project: z.string().optional().describe('Exact project name match.'),
173
- collectionId: z.string().optional().describe('Only sessions in this collection.'),
174
- limit: z.number().int().min(1).max(200).optional(),
175
- },
176
- }, async (args) => {
177
- const cfg = readAutoTagConfig();
178
- if (!cfg.enabled) {
179
- return error('auto-tagging is disabled; enable it in Recall settings before scanning');
180
- }
181
- const sessions = listSessionsForScan({
182
- untaggedOnly: args.untaggedOnly,
183
- project: args.project,
184
- collectionId: args.collectionId,
185
- limit: args.limit ?? 50,
186
- });
187
- return json({
188
- count: sessions.length,
189
- sessions,
190
- guidance: `Produce ${cfg.minTagsPerSession}-${cfg.maxTagsPerSession} tags per session. Prefer existing tags from list_tags for consistency. Use apply_tags to write results.`,
191
- });
192
- });
193
- server.registerTool('apply_tags', {
194
- title: 'Apply tags to a session',
195
- description: 'Add one or more tags to a session (merge-mode, never removes existing). Only works when auto-tagging is enabled. Accepts full UUID or 8+-character id prefix.',
196
- inputSchema: {
197
- sessionId: z.string().describe('Full session UUID or 8+-character prefix.'),
198
- tags: z
199
- .array(z.string())
200
- .min(1)
201
- .max(10)
202
- .describe('Tags to add. Normalized server-side (lowercase, hyphens, strip #).'),
203
- },
204
- }, async ({ sessionId, tags }) => {
205
- const cfg = readAutoTagConfig();
206
- if (!cfg.enabled) {
207
- return error('auto-tagging is disabled; enable it in Recall settings before writing tags');
208
- }
209
- const resolved = resolveSessionId(sessionId);
210
- if (!resolved)
211
- return error(`session not found or prefix ambiguous: ${sessionId}`);
212
- const applied = [];
213
- const skipped = [];
214
- for (const raw of tags) {
215
- try {
216
- const { tag, added } = addTag(resolved, raw);
217
- if (added)
218
- applied.push(tag);
219
- else
220
- skipped.push({ tag, reason: 'already present' });
221
- }
222
- catch (err) {
223
- skipped.push({ tag: raw, reason: err instanceof Error ? err.message : String(err) });
224
- }
225
- }
226
- return json({ sessionId: resolved, applied, skipped });
227
- });
228
- server.registerTool('search', {
229
- title: 'Search messages',
230
- description: 'Full-text search over every message in every indexed session. Use `#tag-name` tokens inside the query string to also filter by tag; plain terms are ANDed together.',
231
- inputSchema: {
232
- query: z
233
- .string()
234
- .describe('Text to find. Supports inline `#tag-name` tokens to narrow to sessions with the tag.'),
235
- project: z
236
- .string()
237
- .optional()
238
- .describe('Substring match against project name or path.'),
239
- limit: z.number().int().min(1).max(200).optional(),
240
- },
241
- }, async ({ query, project, limit }) => {
242
- const db = getDb();
243
- const q = query.trim();
244
- if (!q)
245
- return json({ query: '', hits: [], tags: [] });
246
- const tokens = q.split(/\s+/).filter(Boolean);
247
- const tagTokens = tokens
248
- .filter((t) => t.startsWith('#'))
249
- .map(normalizeTag)
250
- .filter((t) => Boolean(t));
251
- const textTokens = tokens.filter((t) => !t.startsWith('#'));
252
- const fts = textTokens.map((t) => `"${t.replace(/"/g, '')}"`).join(' ');
253
- const lim = Math.max(1, Math.min(200, limit ?? 30));
254
- // Tag-only query — no FTS, just list matching sessions.
255
- if (!fts && tagTokens.length > 0) {
256
- let sql = `
257
- SELECT s.id AS session_id,
258
- s.id AS message_uuid,
259
- p.name AS project,
260
- s.started_at,
261
- COALESCE(s.first_user_message, '') AS snippet,
262
- CAST(NULL AS TEXT) AS role,
263
- CAST(NULL AS TEXT) AS timestamp,
264
- NULLIF(sa.alias, '') AS alias
265
- FROM sessions s
266
- JOIN projects p ON p.id = s.project_id
267
- LEFT JOIN session_aliases sa ON sa.session_id = s.id
268
- WHERE 1=1
269
- `;
270
- const params = { limit: lim };
271
- if (project) {
272
- sql += ' AND (p.name LIKE @proj OR p.decoded_path LIKE @proj)';
273
- params.proj = `%${project}%`;
274
- }
275
- tagTokens.forEach((tag, i) => {
276
- sql += ` AND s.id IN (SELECT session_id FROM session_tags WHERE tag = @tag_${i})`;
277
- params[`tag_${i}`] = tag;
278
- });
279
- sql += " ORDER BY COALESCE(s.started_at, '') DESC LIMIT @limit";
280
- return json({ query: q, hits: db.prepare(sql).all(params), tags: tagTokens });
281
- }
282
- if (!fts)
283
- return json({ query: q, hits: [], tags: tagTokens });
284
- let sql = `
285
- SELECT m.session_id AS session_id,
286
- m.uuid AS message_uuid,
287
- p.name AS project,
288
- s.started_at,
289
- snippet(messages_fts, 0, '<<', '>>', '…', 20) AS snippet,
290
- m.role,
291
- m.timestamp,
292
- NULLIF(sa.alias, '') AS alias
293
- FROM messages_fts
294
- JOIN messages m ON m.rowid = messages_fts.rowid
295
- JOIN sessions s ON s.id = m.session_id
296
- JOIN projects p ON p.id = s.project_id
297
- LEFT JOIN session_aliases sa ON sa.session_id = s.id
298
- WHERE messages_fts MATCH @fts
299
- `;
300
- const params = { fts, limit: lim };
301
- if (project) {
302
- sql += ' AND (p.name LIKE @proj OR p.decoded_path LIKE @proj)';
303
- params.proj = `%${project}%`;
304
- }
305
- tagTokens.forEach((tag, i) => {
306
- sql += ` AND s.id IN (SELECT session_id FROM session_tags WHERE tag = @tag_${i})`;
307
- params[`tag_${i}`] = tag;
308
- });
309
- sql += ' ORDER BY bm25(messages_fts) LIMIT @limit';
310
- const bm25Hits = db.prepare(sql).all(params);
311
- // v0.7 — fuse with vector lane when embedder is loaded.
312
- if (getEmbedderStatus().loaded) {
313
- try {
314
- const vectorHits = await vectorSearch(q, lim);
315
- const bm25Lane = bm25Hits.map((h) => ({
316
- id: String(h.session_id),
317
- data: h,
318
- lane: 'bm25',
319
- }));
320
- const vectorLane = vectorHits.map((vh) => ({
321
- id: vh.sessionId,
322
- data: { session_id: vh.sessionId, snippet: vh.text, matched_via: 'vector' },
323
- lane: 'vector',
324
- }));
325
- const fused = fuseResults([bm25Lane, vectorLane]).slice(0, lim);
326
- const hits = fused.map((f) => ({ ...f.data, session_id: f.id, rrf_score: f.score, lanes: f.lanes }));
327
- return json({ query: q, hits, tags: tagTokens, fusion: 'rrf' });
328
- }
329
- catch {
330
- // vector lane failed — fall through to BM25-only
331
- }
332
- }
333
- return json({ query: q, hits: bm25Hits, tags: tagTokens });
334
- });
335
- server.registerTool('find_similar_sessions', {
336
- title: 'Find similar sessions',
337
- description: 'Find sessions semantically similar to a given session using vector embeddings (Pro-only). Returns related sessions ranked by cosine similarity.',
338
- inputSchema: {
339
- session_id: z.string().describe('Session ID to find similar sessions for.'),
340
- limit: z.number().int().min(1).max(50).optional().describe('Max results (default 10).'),
341
- min_cosine: z.number().min(0).max(1).optional().describe('Minimum cosine similarity threshold (default 0.65).'),
342
- },
343
- }, async ({ session_id, limit, min_cosine }) => {
344
- if (!getEmbedderStatus().loaded) {
345
- return json({
346
- upgrade_required: true,
347
- reason: 'Semantic vector search requires Pro with the embedding model installed.',
348
- buy_url: 'https://clauderecall.com/pro',
349
- });
350
- }
351
- try {
352
- const results = await findSimilarSessions(session_id, limit ?? 10, min_cosine ?? 0.65);
353
- return json({ session_id, similar: results });
354
- }
355
- catch (err) {
356
- return error(err instanceof Error ? err.message : 'vector search failed');
357
- }
358
- });
359
- server.registerTool('semantic_status', {
360
- title: 'Semantic search status',
361
- description: 'Health snapshot of the semantic vector search tier: model status, worker status, queue depth.',
362
- inputSchema: {},
363
- }, async () => {
364
- const embedder = getEmbedderStatus();
365
- const worker = getWorkerStatus();
366
- const modelInstalled = isModelInstalled();
367
- return json({ embedder, worker, modelInstalled });
368
- });
369
- server.registerTool('get_session', {
370
- title: 'Get session transcript',
371
- description: 'Return the full metadata and ordered messages for a session. Accepts a full UUID or an 8+-character id prefix.',
372
- inputSchema: {
373
- id: z.string().describe('Session id (full UUID or 8+-character prefix).'),
374
- },
375
- }, async ({ id }) => {
376
- const resolved = resolveSessionId(id);
377
- if (!resolved)
378
- return error(`session not found or prefix ambiguous: ${id}`);
379
- const db = getDb();
380
- const session = db
381
- .prepare(`SELECT s.*, p.name AS project_name, p.decoded_path,
382
- NULLIF(sa.alias, '') AS alias
383
- FROM sessions s
384
- JOIN projects p ON p.id = s.project_id
385
- LEFT JOIN session_aliases sa ON sa.session_id = s.id
386
- WHERE s.id = ?`)
387
- .get(resolved);
388
- if (!session)
389
- return error(`session metadata missing for ${resolved}`);
390
- const tags = tagsForSession(resolved);
391
- const messages = db
392
- .prepare(`SELECT uuid, type, role, timestamp, is_sidechain, content_text, tool_names
393
- FROM messages WHERE session_id = ?
394
- ORDER BY COALESCE(timestamp, ''), rowid`)
395
- .all(resolved);
396
- return json({ session: { ...session, tags }, messages });
397
- });
398
- server.registerTool('context_for_session', {
399
- title: 'Export session as context',
400
- description: 'Render a past session as markdown ready to paste into a fresh Claude conversation. This is the flagship Recall operation: pipe any previous session back into a new chat as memory.',
401
- inputSchema: {
402
- id: z.string().describe('Session id (full UUID or 8+-character prefix).'),
403
- mode: z
404
- .enum(['condensed', 'full'])
405
- .optional()
406
- .describe('`condensed` (default) strips tool-call JSON; `full` keeps everything.'),
407
- includeSidechain: z
408
- .boolean()
409
- .optional()
410
- .describe('Include subagent / sidechain messages (default false).'),
411
- prelude: z
412
- .string()
413
- .optional()
414
- .describe('Optional header prepended above the transcript.'),
415
- since: z
416
- .string()
417
- .optional()
418
- .describe('Only messages at or after this ISO timestamp.'),
419
- },
420
- }, async ({ id, mode, includeSidechain, prelude, since }) => {
421
- const resolved = resolveSessionId(id);
422
- if (!resolved)
423
- return error(`session not found or prefix ambiguous: ${id}`);
424
- const db = getDb();
425
- const session = db
426
- .prepare(`SELECT s.id, p.name AS project_name, p.decoded_path,
427
- s.started_at, s.ended_at, s.message_count, s.git_branch
428
- FROM sessions s JOIN projects p ON p.id = s.project_id
429
- WHERE s.id = ?`)
430
- .get(resolved);
431
- if (!session)
432
- return error(`session metadata missing for ${resolved}`);
433
- const messages = db
434
- .prepare(`SELECT uuid, type, role, timestamp, is_sidechain, content_text, tool_names
435
- FROM messages WHERE session_id = ?
436
- ORDER BY COALESCE(timestamp, ''), rowid`)
437
- .all(resolved);
438
- const markdown = formatSessionAsContext(session, messages, {
439
- mode: (mode ?? 'condensed'),
440
- includeSidechain: includeSidechain ?? false,
441
- prelude: prelude ?? null,
442
- since: since ?? null,
443
- });
444
- return text(markdown);
445
- });
446
- // ---- MCP prompts ------------------------------------------------------
447
- //
448
- // Expose Recall's canonical prompts as first-class MCP primitives so any
449
- // connected client (Claude Code slash commands, Cursor's prompt picker,
450
- // etc.) can surface and invoke them without copy-paste. Our own
451
- // claude-cli driver and these prompt handlers both go through the same
452
- // builders in ./prompts.ts — one source of truth.
453
- // Thread read tools are always available; write counterparts are gated below.
454
- registerThreadReadTools(server);
455
- if (allowWrites) {
456
- const limit = Number(process.env.RECALL_MCP_RATE_LIMIT);
457
- const capacity = Number.isFinite(limit) && limit > 0 ? limit : DEFAULT_RATE_LIMIT_PER_MIN;
458
- const limiter = new RateLimiter(capacity);
459
- registerWriteTools(server, { limiter });
460
- registerThreadWriteTools(server, { limiter });
461
- console.error(`[claude-recall-mcp] MCP writes ENABLED — 7 write tools registered (rate limit ${capacity}/min)`);
462
- console.error('[claude-recall-mcp] MCP thread writes ENABLED');
463
- }
464
- else {
465
- console.error('[claude-recall-mcp] MCP writes DISABLED (read-only) — pass --allow-writes to enable');
466
- console.error('[claude-recall-mcp] MCP thread writes DISABLED (read-only)');
467
- }
468
- for (const p of RECALL_PROMPTS) {
469
- server.registerPrompt(p.name, { title: p.title, description: p.description, argsSchema: p.argsSchema }, async (args) => ({
470
- messages: [
471
- {
472
- role: 'user',
473
- content: { type: 'text', text: p.build(args) },
474
- },
475
- ],
476
- }));
477
- }
478
- return server;
479
- }
480
- async function run() {
481
- const server = buildServer();
482
- const transport = new StdioServerTransport();
483
- await server.connect(transport);
484
- const shutdown = async () => {
485
- try {
486
- await server.close();
487
- }
488
- catch {
489
- // Nothing useful to do if close itself errors.
490
- }
491
- closeDb();
492
- process.exit(0);
493
- };
494
- process.on('SIGINT', shutdown);
495
- process.on('SIGTERM', shutdown);
496
- }
497
- run().catch((err) => {
498
- // stderr only — stdout is reserved for JSON-RPC framing.
499
- console.error('[claude-recall-mcp] fatal:', err);
500
- process.exit(1);
501
- });
502
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}