recall-mcp-v3 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +295 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall CLI Module
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for use from shell hooks (e.g., SessionEnd).
|
|
5
|
+
* This allows Claude Code hooks to trigger Recall saves automatically.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Save a transcript with AI summarization.
|
|
9
|
+
* This is the main entry point for SessionEnd hooks.
|
|
10
|
+
*/
|
|
11
|
+
export declare function saveTranscript(options: {
|
|
12
|
+
transcriptPath: string;
|
|
13
|
+
cwd: string;
|
|
14
|
+
quiet?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* CLI entry point - parses arguments and dispatches to commands.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runCli(args: string[]): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgNH;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoHhB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF1D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recall CLI Module
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for use from shell hooks (e.g., SessionEnd).
|
|
5
|
+
* This allows Claude Code hooks to trigger Recall saves automatically.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
import { encrypt } from './crypto.js';
|
|
10
|
+
const API_URL = process.env.RECALL_API_URL || 'https://api-v3.recall.team';
|
|
11
|
+
function getToken() {
|
|
12
|
+
const token = process.env.RECALL_API_TOKEN;
|
|
13
|
+
if (!token) {
|
|
14
|
+
throw new Error('RECALL_API_TOKEN environment variable not set');
|
|
15
|
+
}
|
|
16
|
+
return token;
|
|
17
|
+
}
|
|
18
|
+
async function request(method, path, body) {
|
|
19
|
+
const token = getToken();
|
|
20
|
+
const url = `${API_URL}${path}`;
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
Authorization: `Bearer ${token}`,
|
|
26
|
+
},
|
|
27
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
const errorBody = await response.json().catch(() => ({}));
|
|
31
|
+
throw new Error(`API Error ${response.status}: ${errorBody.error || 'Unknown error'}`);
|
|
32
|
+
}
|
|
33
|
+
return response.json();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Parse Claude Code's JSONL transcript file into a single transcript string.
|
|
37
|
+
*/
|
|
38
|
+
function parseTranscript(transcriptPath) {
|
|
39
|
+
if (!fs.existsSync(transcriptPath)) {
|
|
40
|
+
throw new Error(`Transcript file not found: ${transcriptPath}`);
|
|
41
|
+
}
|
|
42
|
+
const content = fs.readFileSync(transcriptPath, 'utf-8');
|
|
43
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
44
|
+
const messages = [];
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
try {
|
|
47
|
+
const entry = JSON.parse(line);
|
|
48
|
+
// Claude Code JSONL format varies - try to extract messages
|
|
49
|
+
if (entry.type === 'user' || entry.role === 'user') {
|
|
50
|
+
messages.push({
|
|
51
|
+
role: 'user',
|
|
52
|
+
content: entry.content || entry.message || entry.text || '',
|
|
53
|
+
timestamp: entry.timestamp,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else if (entry.type === 'assistant' ||
|
|
57
|
+
entry.role === 'assistant' ||
|
|
58
|
+
entry.type === 'response') {
|
|
59
|
+
messages.push({
|
|
60
|
+
role: 'assistant',
|
|
61
|
+
content: entry.content || entry.message || entry.text || '',
|
|
62
|
+
timestamp: entry.timestamp,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Skip invalid JSON lines
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Build transcript string
|
|
71
|
+
const transcriptLines = [];
|
|
72
|
+
for (const msg of messages) {
|
|
73
|
+
const role = msg.role === 'user' ? 'User' : 'Assistant';
|
|
74
|
+
const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
|
|
75
|
+
transcriptLines.push(`${role}: ${content.substring(0, 5000)}`);
|
|
76
|
+
}
|
|
77
|
+
return transcriptLines.join('\n\n');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get git repo info from a directory.
|
|
81
|
+
*/
|
|
82
|
+
function getRepoInfo(projectPath) {
|
|
83
|
+
try {
|
|
84
|
+
const remoteUrl = execSync('git config --get remote.origin.url', {
|
|
85
|
+
cwd: projectPath,
|
|
86
|
+
encoding: 'utf-8',
|
|
87
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
88
|
+
}).trim();
|
|
89
|
+
let fullName;
|
|
90
|
+
if (remoteUrl.includes('github.com')) {
|
|
91
|
+
const match = remoteUrl.match(/github\.com[:/]([^/]+\/[^/]+?)(?:\.git)?$/);
|
|
92
|
+
if (match) {
|
|
93
|
+
fullName = match[1];
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
let defaultBranch = 'main';
|
|
103
|
+
try {
|
|
104
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
105
|
+
cwd: projectPath,
|
|
106
|
+
encoding: 'utf-8',
|
|
107
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
108
|
+
}).trim();
|
|
109
|
+
if (branch) {
|
|
110
|
+
defaultBranch = branch;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Use default
|
|
115
|
+
}
|
|
116
|
+
return { fullName, defaultBranch };
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Save a transcript with AI summarization.
|
|
124
|
+
* This is the main entry point for SessionEnd hooks.
|
|
125
|
+
*/
|
|
126
|
+
export async function saveTranscript(options) {
|
|
127
|
+
const { transcriptPath, cwd, quiet } = options;
|
|
128
|
+
const log = quiet ? () => { } : console.error;
|
|
129
|
+
try {
|
|
130
|
+
// 1. Parse the transcript
|
|
131
|
+
log('[Recall] Parsing transcript...');
|
|
132
|
+
const transcript = parseTranscript(transcriptPath);
|
|
133
|
+
if (transcript.length < 100) {
|
|
134
|
+
log('[Recall] Transcript too short, skipping save');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// 2. Get repo info
|
|
138
|
+
log('[Recall] Resolving repository...');
|
|
139
|
+
const repoInfo = getRepoInfo(cwd);
|
|
140
|
+
if (!repoInfo) {
|
|
141
|
+
log('[Recall] Not a GitHub repository, skipping save');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// 3. Resolve repo to get repoId
|
|
145
|
+
const { repoId } = await request('POST', '/v1/repos/resolve', {
|
|
146
|
+
fullName: repoInfo.fullName,
|
|
147
|
+
defaultBranch: repoInfo.defaultBranch,
|
|
148
|
+
});
|
|
149
|
+
// 4. Get team key for encryption
|
|
150
|
+
log('[Recall] Fetching team key...');
|
|
151
|
+
const teamKeyResponse = await request('GET', '/v1/keys/team');
|
|
152
|
+
if (!teamKeyResponse.hasAccess) {
|
|
153
|
+
throw new Error('No access to team encryption key');
|
|
154
|
+
}
|
|
155
|
+
// 5. Send transcript to summarize endpoint
|
|
156
|
+
log('[Recall] Generating AI summary...');
|
|
157
|
+
const summarizeResponse = await request('POST', '/v1/summarize', {
|
|
158
|
+
transcript,
|
|
159
|
+
repo_name: repoInfo.fullName,
|
|
160
|
+
tool: 'claude-code',
|
|
161
|
+
started_at: new Date().toISOString(),
|
|
162
|
+
ended_at: new Date().toISOString(),
|
|
163
|
+
});
|
|
164
|
+
// 6. Build content to encrypt
|
|
165
|
+
const contentToEncrypt = JSON.stringify({
|
|
166
|
+
summary: summarizeResponse.summary,
|
|
167
|
+
decisions: summarizeResponse.decisions.map((d) => ({
|
|
168
|
+
what: d.what,
|
|
169
|
+
why: d.title,
|
|
170
|
+
})),
|
|
171
|
+
mistakes: summarizeResponse.tldr.mistakes,
|
|
172
|
+
files_changed: summarizeResponse.tldr.files_changed,
|
|
173
|
+
lessons: summarizeResponse.lessons,
|
|
174
|
+
});
|
|
175
|
+
// 7. Encrypt the content
|
|
176
|
+
log('[Recall] Encrypting session...');
|
|
177
|
+
const encryptedContent = encrypt(contentToEncrypt, teamKeyResponse.encryptionKey);
|
|
178
|
+
// 8. Build TLDR for plaintext metadata
|
|
179
|
+
const tldr = {
|
|
180
|
+
summary: summarizeResponse.tldr.summary.substring(0, 1000),
|
|
181
|
+
status: summarizeResponse.tldr.status,
|
|
182
|
+
decisions: summarizeResponse.tldr.decisions,
|
|
183
|
+
mistakes: summarizeResponse.tldr.mistakes,
|
|
184
|
+
tags: summarizeResponse.tldr.tags,
|
|
185
|
+
files_changed: summarizeResponse.tldr.files_changed,
|
|
186
|
+
blockers: null,
|
|
187
|
+
next_steps: null,
|
|
188
|
+
};
|
|
189
|
+
const now = new Date().toISOString();
|
|
190
|
+
// 9. Save to database
|
|
191
|
+
log('[Recall] Saving session...');
|
|
192
|
+
const saveResponse = await request('POST', `/v1/repos/${repoId}/sessions`, {
|
|
193
|
+
encrypted_content: encryptedContent,
|
|
194
|
+
tldr,
|
|
195
|
+
started_at: now,
|
|
196
|
+
ended_at: now,
|
|
197
|
+
tool: 'claude-code',
|
|
198
|
+
quality_metadata: summarizeResponse.quality_metadata,
|
|
199
|
+
});
|
|
200
|
+
log(`[Recall] Session saved: ${saveResponse.id}`);
|
|
201
|
+
// Output success for hook
|
|
202
|
+
console.log(JSON.stringify({
|
|
203
|
+
success: true,
|
|
204
|
+
session_id: saveResponse.id,
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
209
|
+
log(`[Recall] Error: ${message}`);
|
|
210
|
+
// Output failure for hook
|
|
211
|
+
console.log(JSON.stringify({
|
|
212
|
+
success: false,
|
|
213
|
+
error: message,
|
|
214
|
+
}));
|
|
215
|
+
// Exit with error code but don't throw (hooks shouldn't block)
|
|
216
|
+
process.exitCode = 1;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* CLI entry point - parses arguments and dispatches to commands.
|
|
221
|
+
*/
|
|
222
|
+
export async function runCli(args) {
|
|
223
|
+
const command = args[0];
|
|
224
|
+
switch (command) {
|
|
225
|
+
case 'save-transcript': {
|
|
226
|
+
// Read hook input from stdin
|
|
227
|
+
let input = null;
|
|
228
|
+
// Check if we have stdin data (non-TTY means piped input)
|
|
229
|
+
if (!process.stdin.isTTY) {
|
|
230
|
+
try {
|
|
231
|
+
const stdinData = fs.readFileSync(0, 'utf-8');
|
|
232
|
+
if (stdinData.trim()) {
|
|
233
|
+
input = JSON.parse(stdinData);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// No stdin or invalid JSON
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Parse command-line options as fallback
|
|
241
|
+
const transcriptPath = input?.transcript_path ||
|
|
242
|
+
args.find((a) => a.startsWith('--file='))?.split('=')[1] ||
|
|
243
|
+
args[args.indexOf('--file') + 1];
|
|
244
|
+
const cwd = input?.cwd ||
|
|
245
|
+
args.find((a) => a.startsWith('--cwd='))?.split('=')[1] ||
|
|
246
|
+
args[args.indexOf('--cwd') + 1] ||
|
|
247
|
+
process.cwd();
|
|
248
|
+
const quiet = args.includes('--quiet') || args.includes('-q');
|
|
249
|
+
if (!transcriptPath) {
|
|
250
|
+
console.error('Usage: recall-mcp-v3 save-transcript --file <path> [--cwd <dir>] [--quiet]');
|
|
251
|
+
console.error('Or pipe SessionEnd hook JSON to stdin');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
await saveTranscript({ transcriptPath, cwd, quiet });
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case 'help':
|
|
258
|
+
case '--help':
|
|
259
|
+
case '-h': {
|
|
260
|
+
console.log(`
|
|
261
|
+
Recall MCP v3 CLI
|
|
262
|
+
|
|
263
|
+
Usage:
|
|
264
|
+
recall-mcp-v3 Start MCP server (for Claude Code)
|
|
265
|
+
recall-mcp-v3 save-transcript Save session from transcript file
|
|
266
|
+
recall-mcp-v3 help Show this help
|
|
267
|
+
|
|
268
|
+
Commands:
|
|
269
|
+
save-transcript
|
|
270
|
+
Save a Claude Code session transcript with AI summarization.
|
|
271
|
+
|
|
272
|
+
Options:
|
|
273
|
+
--file <path> Path to transcript JSONL file (required)
|
|
274
|
+
--cwd <dir> Working directory for git repo detection (default: cwd)
|
|
275
|
+
--quiet, -q Suppress progress output
|
|
276
|
+
|
|
277
|
+
Can also read SessionEnd hook JSON from stdin:
|
|
278
|
+
echo '{"transcript_path":"/path/to/file.jsonl","cwd":"/project"}' | recall-mcp-v3 save-transcript
|
|
279
|
+
|
|
280
|
+
Environment:
|
|
281
|
+
RECALL_API_TOKEN API token (required) - get from https://v3.recall.team/app/settings
|
|
282
|
+
RECALL_API_URL API URL (default: https://api-v3.recall.team)
|
|
283
|
+
`);
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
default: {
|
|
287
|
+
// No command or unrecognized - this means start MCP server
|
|
288
|
+
// Return false to indicate CLI didn't handle it
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// CLI handled the command - exit to prevent MCP server from starting
|
|
293
|
+
process.exit(process.exitCode || 0);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A clean, simple MCP server for team memory in AI coding assistants.
|
|
6
6
|
* Reads RECALL_API_TOKEN from environment variable (set by Claude Code).
|
|
7
|
+
*
|
|
8
|
+
* Also supports CLI mode for shell hooks:
|
|
9
|
+
* recall-mcp-v3 save-transcript --file /path/to/transcript.jsonl
|
|
7
10
|
*/
|
|
8
11
|
export {};
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,15 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A clean, simple MCP server for team memory in AI coding assistants.
|
|
6
6
|
* Reads RECALL_API_TOKEN from environment variable (set by Claude Code).
|
|
7
|
+
*
|
|
8
|
+
* Also supports CLI mode for shell hooks:
|
|
9
|
+
* recall-mcp-v3 save-transcript --file /path/to/transcript.jsonl
|
|
7
10
|
*/
|
|
8
11
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
12
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
13
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
11
14
|
import { getContext, getHistory, getTranscripts, saveSession, logDecision, } from './tools.js';
|
|
15
|
+
import { runCli } from './cli.js';
|
|
12
16
|
// Tool definitions
|
|
13
17
|
const TOOLS = [
|
|
14
18
|
{
|
|
@@ -189,7 +193,18 @@ class RecallServer {
|
|
|
189
193
|
console.error('Recall MCP v3 server running');
|
|
190
194
|
}
|
|
191
195
|
}
|
|
192
|
-
//
|
|
193
|
-
const
|
|
194
|
-
|
|
196
|
+
// Check for CLI arguments
|
|
197
|
+
const args = process.argv.slice(2);
|
|
198
|
+
// If CLI arguments provided, run in CLI mode
|
|
199
|
+
if (args.length > 0) {
|
|
200
|
+
runCli(args).catch((error) => {
|
|
201
|
+
console.error('CLI Error:', error.message);
|
|
202
|
+
process.exit(1);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// No args - start MCP server (default mode for Claude Code)
|
|
207
|
+
const server = new RecallServer();
|
|
208
|
+
server.run().catch(console.error);
|
|
209
|
+
}
|
|
195
210
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|