@nish_ntr/chat-memory-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.
package/README.md ADDED
@@ -0,0 +1,205 @@
1
+ # Chat Memory MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that enables AI agents in VS Code to search and retrieve content from past Copilot Chat sessions across all workspaces.
4
+
5
+ ## Features
6
+
7
+ - **Search Chat History**: Search through all past VS Code Copilot Chat sessions using natural language queries
8
+ - **AI-Generated Summaries**: Uses LLM sampling to generate concise summaries of chat sessions
9
+ - **Clean Prompt Chains**: Full transcripts are sent to the LLM for summarization but removed from the response
10
+ - **Cross-Workspace**: Access chat history from all workspaces, not just the current one
11
+ - **Platform Support**: Works on macOS, Windows, and Linux
12
+
13
+ ## Requirements
14
+
15
+ - **MCP Client with Sampling Support**: The MCP client (Cline, Roo Code, etc.) must support the `sampling` capability to enable AI-generated summaries
16
+ - **Node.js**: Version 18.0.0 or higher
17
+
18
+ ## Tools Provided
19
+
20
+ ### 1. `search_vs_code_chats`
21
+
22
+ Search through past VS Code Copilot Chat sessions.
23
+
24
+ **Input:**
25
+ - `query` (string): Search query to find in chat titles and messages
26
+
27
+ **Output:**
28
+ - Array of matching sessions with metadata (sessionId, title, workspaceName, lastModified)
29
+
30
+ ### 2. `get_vs_code_chat_content`
31
+
32
+ Retrieve an AI-generated summary of a specific chat session.
33
+
34
+ **Input:**
35
+ - `sessionId` (string): Absolute file path to the chat session JSON file (obtained from search results)
36
+
37
+ **Output:**
38
+ - AI-generated concise summary of the conversation (3-5 sentences)
39
+ - Chat title and message count
40
+ - Note: The full transcript is sent to the LLM for summarization but is NOT included in the response, keeping the prompt chain clean
41
+
42
+ ## Installation
43
+
44
+ ```bash
45
+ cd /home/compro/nishant-compro/chat-memory
46
+ npm install
47
+ npm run build
48
+ ```
49
+
50
+ ## Configuration
51
+
52
+ ### For Cline
53
+
54
+ Add to your Cline MCP settings file (usually `~/.cline/mcp_settings.json` or in VS Code settings):
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "chat-memory": {
60
+ "command": "node",
61
+ "args": ["/home/compro/nishant-compro/chat-memory/dist/index.js"],
62
+ "env": {}
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ Or in VS Code settings (`settings.json`):
69
+
70
+ ```json
71
+ {
72
+ "cline.mcpServers": {
73
+ "chat-memory": {
74
+ "command": "node",
75
+ "args": ["/home/compro/nishant-compro/chat-memory/dist/index.js"],
76
+ "env": {}
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ ### For Roo Code
83
+
84
+ Add to `.roo/mcp.json` in your workspace or in VS Code settings:
85
+
86
+ ```json
87
+ {
88
+ "mcpServers": {
89
+ "chat-memory": {
90
+ "command": "node",
91
+ "args": ["/home/compro/nishant-compro/chat-memory/dist/index.js"]
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ Or in VS Code settings (`settings.json`):
98
+
99
+ ```json
100
+ {
101
+ "roo-cline.mcpServers": {
102
+ "chat-memory": {
103
+ "command": "node",
104
+ "args": ["/home/compro/nishant-compro/chat-memory/dist/index.js"]
105
+ }
106
+ }
107
+ }
108
+ ```
109
+
110
+ ### For VS Code Copilot MCP
111
+
112
+ Add to VS Code `settings.json`:
113
+
114
+ ```json
115
+ {
116
+ "github.copilot.chat.mcp.servers": {
117
+ "chat-memory": {
118
+ "command": "node",
119
+ "args": ["/home/compro/nishant-compro/chat-memory/dist/index.js"]
120
+ }
121
+ }
122
+ }
123
+ ```
124
+
125
+ ## Usage Examples
126
+
127
+ Once configured, agents can use these tools automatically. Here are example requests:
128
+
129
+ ### Searching Chat History
130
+
131
+ ```
132
+ "Search my past chats for discussions about React hooks"
133
+ ```
134
+
135
+ The agent will use `search_vs_code_chats` with query "React hooks" and return matching sessions.
136
+
137
+ ### Retrieving Chat Summaries
138
+
139
+ ```
140
+ "Give me a summary of that chat about authentication"
141
+ ```
142
+
143
+ The agent will:
144
+ 1. Search for chats about "authentication"
145
+ 2. Use `get_vs_code_chat_content` with the sessionId to retrieve a concise summary
146
+
147
+ ## Data Location
148
+
149
+ The server reads VS Code chat sessions from:
150
+
151
+ - **macOS**: `~/Library/Application Support/Code/User/workspaceStorage/*/chatSessions/*.json`
152
+ - **Windows**: `%APPDATA%\Code\User\workspaceStorage\*/chatSessions\*.json`
153
+ - **Linux**: `~/.config/Code/User/workspaceStorage/*/chatSessions/*.json`
154
+
155
+ ## Development
156
+
157
+ ```bash
158
+ # Install dependencies
159
+ npm install
160
+
161
+ # Run in development mode (with hot reload)
162
+ npm run dev
163
+
164
+ # Build for production
165
+ npm run build
166
+
167
+ # Run built version
168
+ npm start
169
+ ```
170
+
171
+ ## Troubleshooting
172
+
173
+ ### Server not appearing in agent tools
174
+
175
+ 1. Ensure you've run `npm run build` after installation
176
+ 2. Check that the path in your configuration matches the actual installation location
177
+ 3. Restart VS Code after adding the configuration
178
+ 4. Check the agent's MCP connection logs for errors
179
+
180
+ ### "Sampling not supported" error
181
+
182
+ If you get an error about sampling not being supported:
183
+ 1. Ensure your MCP client (Cline, Roo Code, etc.) supports the `sampling` capability
184
+ 2. Update to the latest version of your MCP client
185
+ 3. Check the client's documentation for sampling support
186
+
187
+ ### No chat sessions found
188
+
189
+ 1. Verify that you have past Copilot Chat conversations in VS Code
190
+ 2. Check that the workspace storage path exists on your system
191
+ 3. Ensure the server has read permissions for the workspace storage directory
192
+
193
+ ### Permission errors
194
+
195
+ On macOS/Linux, ensure the workspace storage directory is readable:
196
+
197
+ ```bash
198
+ # Check permissions
199
+ ls -la ~/.config/Code/User/workspaceStorage # Linux
200
+ ls -la ~/Library/Application\ Support/Code/User/workspaceStorage # macOS
201
+ ```
202
+
203
+ ## License
204
+
205
+ MIT
package/bin/start.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from "../dist/index.js";
3
+
4
+ startServer().catch((error) => {
5
+ console.error("Fatal error:", error);
6
+ process.exit(1);
7
+ });
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmdA,wBAAsB,WAAW,kBAKhC"}
package/dist/index.js ADDED
@@ -0,0 +1,411 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import * as z from 'zod';
4
+ import { readdir, readFile, stat } from 'fs/promises';
5
+ import { join, basename } from 'path';
6
+ import { homedir, platform } from 'os';
7
+ import Fuse from 'fuse.js';
8
+ // ============================================================================
9
+ // Utility Functions
10
+ // ============================================================================
11
+ /**
12
+ * Get the VS Code workspace storage path based on the current OS
13
+ */
14
+ function getWorkspaceStoragePath() {
15
+ const home = homedir();
16
+ const os = platform();
17
+ switch (os) {
18
+ case 'darwin': // macOS
19
+ return join(home, 'Library/Application Support/Code/User/workspaceStorage');
20
+ case 'win32': // Windows
21
+ return join(process.env.APPDATA || join(home, 'AppData/Roaming'), 'Code/User/workspaceStorage');
22
+ case 'linux': // Linux
23
+ return join(home, '.config/Code/User/workspaceStorage');
24
+ default:
25
+ return join(home, '.config/Code/User/workspaceStorage'); // Default to Linux path
26
+ }
27
+ }
28
+ /**
29
+ * Parse workspace.json to extract human-readable workspace name
30
+ */
31
+ async function getWorkspaceName(workspaceHashFolder) {
32
+ try {
33
+ const workspaceJsonPath = join(workspaceHashFolder, 'workspace.json');
34
+ const content = await readFile(workspaceJsonPath, 'utf-8');
35
+ const data = JSON.parse(content);
36
+ // Try to extract folder path or workspace name
37
+ if (data.folder) {
38
+ // folder is typically a URI like "file:///path/to/workspace"
39
+ const folderUri = data.folder;
40
+ const folderPath = folderUri.replace(/^file:\/\//, '');
41
+ return basename(folderPath) || basename(workspaceHashFolder);
42
+ }
43
+ if (data.workspace) {
44
+ const workspaceUri = data.workspace;
45
+ const workspacePath = workspaceUri.replace(/^file:\/\//, '');
46
+ return basename(workspacePath) || basename(workspaceHashFolder);
47
+ }
48
+ // Fallback to hash folder name
49
+ return basename(workspaceHashFolder);
50
+ }
51
+ catch (error) {
52
+ // If we can't read workspace.json, use the hash folder name
53
+ return basename(workspaceHashFolder);
54
+ }
55
+ }
56
+ /**
57
+ * Find all chat session JSON files in the workspace storage directory
58
+ */
59
+ async function findChatSessionFiles() {
60
+ const results = [];
61
+ const storagePath = getWorkspaceStoragePath();
62
+ try {
63
+ const workspaceFolders = await readdir(storagePath);
64
+ for (const folder of workspaceFolders) {
65
+ const workspaceFolder = join(storagePath, folder);
66
+ try {
67
+ const chatSessionsDir = join(workspaceFolder, 'chatSessions');
68
+ const stats = await stat(chatSessionsDir);
69
+ if (stats.isDirectory()) {
70
+ const files = await readdir(chatSessionsDir);
71
+ for (const file of files) {
72
+ if (file.endsWith('.json')) {
73
+ results.push({
74
+ filePath: join(chatSessionsDir, file),
75
+ workspaceFolder: workspaceFolder,
76
+ });
77
+ }
78
+ }
79
+ }
80
+ }
81
+ catch (error) {
82
+ // Skip folders without chatSessions directory or with permission errors
83
+ continue;
84
+ }
85
+ }
86
+ }
87
+ catch (error) {
88
+ // If workspace storage path doesn't exist, return empty array
89
+ console.error('Error accessing workspace storage:', error);
90
+ }
91
+ return results;
92
+ }
93
+ /**
94
+ * Extract messages from VS Code chat session JSON (handles multiple schemas)
95
+ */
96
+ function extractMessages(jsonData) {
97
+ const messages = [];
98
+ try {
99
+ // Try different JSON schema variants
100
+ // Schema 1: { requests: [...] }
101
+ if (jsonData.requests && Array.isArray(jsonData.requests)) {
102
+ for (const request of jsonData.requests) {
103
+ if (request.message) {
104
+ let userContent = '';
105
+ if (typeof request.message === 'string') {
106
+ userContent = request.message;
107
+ }
108
+ else if (request.message.text) {
109
+ userContent = request.message.text;
110
+ }
111
+ else {
112
+ userContent = JSON.stringify(request.message);
113
+ }
114
+ messages.push({
115
+ role: 'user',
116
+ content: userContent,
117
+ });
118
+ }
119
+ if (request.response) {
120
+ let assistantContent = '';
121
+ if (Array.isArray(request.response)) {
122
+ assistantContent = request.response.map((r) => r.value || r.text || (typeof r === 'string' ? r : JSON.stringify(r))).join('\n');
123
+ }
124
+ else if (typeof request.response === 'string') {
125
+ assistantContent = request.response;
126
+ }
127
+ else if (request.response.text) {
128
+ assistantContent = request.response.text;
129
+ }
130
+ else if (request.response.value) {
131
+ assistantContent = request.response.value;
132
+ }
133
+ else {
134
+ assistantContent = JSON.stringify(request.response);
135
+ }
136
+ messages.push({
137
+ role: 'assistant',
138
+ content: assistantContent,
139
+ });
140
+ }
141
+ }
142
+ }
143
+ // Schema 2: { turns: [...] }
144
+ if (jsonData.turns && Array.isArray(jsonData.turns)) {
145
+ for (const turn of jsonData.turns) {
146
+ if (turn.request || turn.prompt) {
147
+ const userMessage = turn.request || turn.prompt;
148
+ messages.push({
149
+ role: 'user',
150
+ content: typeof userMessage === 'string' ? userMessage : JSON.stringify(userMessage),
151
+ });
152
+ }
153
+ if (turn.response || turn.completion) {
154
+ const assistantMessage = turn.response || turn.completion;
155
+ messages.push({
156
+ role: 'assistant',
157
+ content: typeof assistantMessage === 'string' ? assistantMessage : JSON.stringify(assistantMessage),
158
+ });
159
+ }
160
+ }
161
+ }
162
+ // Schema 3: { messages: [...] }
163
+ if (jsonData.messages && Array.isArray(jsonData.messages)) {
164
+ for (const msg of jsonData.messages) {
165
+ if (msg.role === 'user' || msg.role === 'assistant') {
166
+ messages.push({
167
+ role: msg.role,
168
+ content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
169
+ });
170
+ }
171
+ }
172
+ }
173
+ // Schema 4: { entries: [...] } (some versions use entries)
174
+ if (jsonData.entries && Array.isArray(jsonData.entries)) {
175
+ for (const entry of jsonData.entries) {
176
+ if (entry.type === 'user' || entry.author === 'user') {
177
+ messages.push({
178
+ role: 'user',
179
+ content: typeof entry.text === 'string' ? entry.text : JSON.stringify(entry),
180
+ });
181
+ }
182
+ else if (entry.type === 'assistant' || entry.author === 'assistant') {
183
+ messages.push({
184
+ role: 'assistant',
185
+ content: typeof entry.text === 'string' ? entry.text : JSON.stringify(entry),
186
+ });
187
+ }
188
+ }
189
+ }
190
+ }
191
+ catch (error) {
192
+ console.error('Error extracting messages:', error);
193
+ }
194
+ return messages;
195
+ }
196
+ /**
197
+ * Get the title of a chat session from JSON data
198
+ */
199
+ function getChatTitle(jsonData) {
200
+ let title = jsonData.title || jsonData.name || jsonData.label;
201
+ // Handle complex title objects/JSON strings often found in newer VS Code versions
202
+ if (title && typeof title === 'string' && title.trim().startsWith('{')) {
203
+ try {
204
+ const parsed = JSON.parse(title);
205
+ if (parsed.parts && Array.isArray(parsed.parts)) {
206
+ title = parsed.parts
207
+ .map((p) => (typeof p === 'string' ? p : p.value || p.text || ''))
208
+ .join('')
209
+ .trim();
210
+ }
211
+ }
212
+ catch (error) {
213
+ // If parsing fails, use the original title string
214
+ }
215
+ }
216
+ if (title && typeof title === 'string' && title.trim().length > 0) {
217
+ return title;
218
+ }
219
+ // Try to extract from first message if no title found
220
+ const messages = extractMessages(jsonData);
221
+ if (messages.length > 0 && messages[0].role === 'user') {
222
+ const firstMessage = messages[0].content;
223
+ return firstMessage.substring(0, 100).replace(/\n/g, ' ') + (firstMessage.length > 100 ? '...' : '');
224
+ }
225
+ return 'Untitled Chat';
226
+ }
227
+ // ============================================================================
228
+ // MCP Server Setup
229
+ // ============================================================================
230
+ const server = new McpServer({
231
+ name: 'chat-memory',
232
+ version: '1.0.0',
233
+ });
234
+ // ============================================================================
235
+ // Tool 1: search_vs_code_chats
236
+ // ============================================================================
237
+ server.registerTool('search_vs_code_chats', {
238
+ title: 'Search VS Code Chat History',
239
+ description: 'Search through past VS Code Copilot Chat sessions across all workspaces',
240
+ inputSchema: {
241
+ query: z.string().describe('Search query to find in chat titles and messages'),
242
+ },
243
+ }, async ({ query }, extra) => {
244
+ const chatFiles = await findChatSessionFiles();
245
+ const allSessions = [];
246
+ // Get current session ID from MCP transport context
247
+ const currentSessionId = extra?.sessionId;
248
+ for (const { filePath, workspaceFolder } of chatFiles) {
249
+ try {
250
+ const content = await readFile(filePath, 'utf-8');
251
+ const jsonData = JSON.parse(content);
252
+ // DEFINITIVE EXCLUSION: Compare VS Code chat session ID with MCP session ID
253
+ if (currentSessionId && jsonData.sessionId === currentSessionId) {
254
+ continue; // Skip current session
255
+ }
256
+ // Extract title and messages
257
+ const title = getChatTitle(jsonData);
258
+ const messages = extractMessages(jsonData);
259
+ const fileStats = await stat(filePath);
260
+ const workspaceName = await getWorkspaceName(workspaceFolder);
261
+ // Limit indexed message content to first 10k chars for performance
262
+ const messageText = messages.map(m => m.content).join(' ').substring(0, 10000);
263
+ allSessions.push({
264
+ sessionId: filePath,
265
+ title,
266
+ messageText,
267
+ workspaceName,
268
+ workspacePath: workspaceFolder,
269
+ lastModified: fileStats.mtime.toISOString(),
270
+ });
271
+ }
272
+ catch (error) {
273
+ // Skip files that can't be parsed
274
+ continue;
275
+ }
276
+ }
277
+ // Meaningful comparison using Fuse.js (fuzzy search)
278
+ const fuse = new Fuse(allSessions, {
279
+ keys: [
280
+ { name: 'title', weight: 0.7 },
281
+ { name: 'messageText', weight: 0.3 }
282
+ ],
283
+ threshold: 0.4, // 0.0 = perfect match, 1.0 = match anything
284
+ ignoreLocation: true,
285
+ includeScore: true,
286
+ distance: 100, // Search radius
287
+ minMatchCharLength: 2,
288
+ useExtendedSearch: true // Allows for operators like | (OR) and ! (NOT)
289
+ });
290
+ const searchResults = fuse.search(query);
291
+ // Convert Fuse results back to ChatSessionResult
292
+ const results = searchResults.slice(0, 2).map(result => ({
293
+ sessionId: result.item.sessionId,
294
+ title: result.item.title,
295
+ workspaceName: result.item.workspaceName,
296
+ workspacePath: result.item.workspacePath,
297
+ lastModified: result.item.lastModified
298
+ }));
299
+ // If no results from fuzzy search, fall back to literal substring check (wider net)
300
+ if (results.length === 0) {
301
+ const queryLower = query.toLowerCase();
302
+ const literalResults = allSessions
303
+ .filter(s => s.title.toLowerCase().includes(queryLower) || s.messageText.toLowerCase().includes(queryLower))
304
+ .slice(0, 2)
305
+ .map(s => ({
306
+ sessionId: s.sessionId,
307
+ title: s.title,
308
+ workspaceName: s.workspaceName,
309
+ workspacePath: s.workspacePath,
310
+ lastModified: s.lastModified
311
+ }));
312
+ results.push(...literalResults);
313
+ }
314
+ const output = { sessions: results };
315
+ return {
316
+ content: [
317
+ {
318
+ type: 'text',
319
+ text: JSON.stringify(output, null, 2),
320
+ },
321
+ ],
322
+ };
323
+ });
324
+ // ============================================================================
325
+ // Tool 2: get_vs_code_chat_content
326
+ // ============================================================================
327
+ server.registerTool('get_vs_code_chat_content', {
328
+ title: 'Get VS Code Chat Summary',
329
+ description: 'Retrieve an AI-generated summary of a specific chat session (not full transcript to avoid polluting prompt chain)',
330
+ inputSchema: {
331
+ sessionId: z.string().describe('Absolute file path to the chat session JSON file'),
332
+ },
333
+ }, async ({ sessionId }) => {
334
+ try {
335
+ const content = await readFile(sessionId, 'utf-8');
336
+ const jsonData = JSON.parse(content);
337
+ const title = getChatTitle(jsonData);
338
+ const messages = extractMessages(jsonData);
339
+ // Format full transcript for LLM summarization
340
+ const transcriptLines = [];
341
+ const MAX_TRANSCRIPT_LENGTH = 15000; // Character limit to avoid context window issues
342
+ for (const msg of messages) {
343
+ const speaker = msg.role === 'user' ? 'USER' : 'ASSISTANT';
344
+ transcriptLines.push(`[${speaker}]: ${msg.content}`);
345
+ }
346
+ let fullTranscript = transcriptLines.join('\n\n');
347
+ if (fullTranscript.length > MAX_TRANSCRIPT_LENGTH) {
348
+ fullTranscript = fullTranscript.substring(0, MAX_TRANSCRIPT_LENGTH) + '\n\n... (transcript truncated for brevity) ...';
349
+ }
350
+ // Request LLM to generate summary using MCP sampling
351
+ // This sends the full transcript to the LLM, which then gets removed from the prompt chain
352
+ const response = await server.server.createMessage({
353
+ messages: [
354
+ {
355
+ role: 'user',
356
+ content: {
357
+ type: 'text',
358
+ text: `Please provide a concise summary of the following VS Code Copilot chat conversation. Focus on:\n1. The main topics discussed\n2. Key problems or questions raised\n3. Important solutions or approaches suggested\n4. Any action items or decisions\n\nKeep the summary to 5-8 sentences maximum.\n\nChat Title: ${title}\n\nConversation:\n${fullTranscript}`,
359
+ },
360
+ },
361
+ ],
362
+ maxTokens: 500,
363
+ });
364
+ // Extract summary from LLM response
365
+ const aiSummary = response.content.type === 'text'
366
+ ? response.content.text
367
+ : JSON.stringify(response.content);
368
+ // Note: The full transcript was sent to the LLM for summarization
369
+ // but is NOT included in the output, keeping the prompt chain clean
370
+ const output = {
371
+ summary: aiSummary,
372
+ title,
373
+ messageCount: messages.length,
374
+ };
375
+ return {
376
+ content: [
377
+ {
378
+ type: 'text',
379
+ text: JSON.stringify(output, null, 2),
380
+ },
381
+ ],
382
+ };
383
+ }
384
+ catch (error) {
385
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
386
+ return {
387
+ content: [
388
+ {
389
+ type: 'text',
390
+ text: `Error: ${errorMessage}`,
391
+ },
392
+ ],
393
+ };
394
+ }
395
+ });
396
+ // ============================================================================
397
+ // Server Initialization
398
+ // ============================================================================
399
+ export async function startServer() {
400
+ const transport = new StdioServerTransport();
401
+ await server.connect(transport);
402
+ console.error('Chat Memory MCP Server running on stdio');
403
+ }
404
+ const isMain = process.argv[1]?.endsWith('index.ts') || process.argv[1]?.endsWith('index.js');
405
+ if (isMain) {
406
+ startServer().catch((error) => {
407
+ console.error('Fatal error:', error);
408
+ process.exit(1);
409
+ });
410
+ }
411
+ //# 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,45 @@
1
+ {
2
+ "name": "@nish_ntr/chat-memory-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server to search and retrieve VS Code Copilot Chat history",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "chat-memory-mcp": "./bin/start.js"
9
+ },
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "bin"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "start": "node dist/index.js",
20
+ "dev": "tsx src/index.ts",
21
+ "prepare": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "vscode",
27
+ "copilot",
28
+ "chat-memory"
29
+ ],
30
+ "author": "nishntr",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.0.4",
34
+ "fuse.js": "^7.1.0",
35
+ "zod": "^3.24.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.10.5",
39
+ "tsx": "^4.19.2",
40
+ "typescript": "^5.7.2"
41
+ },
42
+ "engines": {
43
+ "node": ">=18.0.0"
44
+ }
45
+ }