{"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n  Tool,\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { MemoryClient } from 'mem0ai';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nconst MEM0_API_KEY = process?.env?.MEM0_API_KEY || '';\n\n// Initialize mem0ai client\nconst memoryClient = new MemoryClient({ apiKey: MEM0_API_KEY });\n\n// Tool definitions\nconst ADD_MEMORY_TOOL: Tool = {\n  name: 'add-memory',\n  description:\n    'Add a new memory. This method is called everytime the user informs anything about themselves, their preferences, or anything that has any relevent information whcih can be useful in the future conversation. This can also be called when the user asks you to remember something.',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      content: {\n        type: 'string',\n        description: 'The content to store in memory',\n      },\n      userId: {\n        type: 'string',\n        description: \"User ID for memory storage. If not provided explicitly, use a generic user ID like, 'mem0-mcp-user'\",\n      },\n    },\n    required: ['content', 'userId'],\n  },\n};\n\nconst SEARCH_MEMORIES_TOOL: Tool = {\n  name: 'search-memories',\n  description: 'Search through stored memories. This method is called ANYTIME the user asks anything.',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      query: {\n        type: 'string',\n        description: \"The search query. This is the query that the user has asked for. Example: 'What did I tell you about the weather last week?' or 'What did I tell you about my friend John?'\",\n      },\n      userId: {\n        type: 'string',\n        description: \"User ID for memory storage. If not provided explicitly, use a generic user ID like, 'mem0-mcp-user'\",\n      },\n    },\n    required: ['query', 'userId'],\n  },\n};\n\n// Create server instance\nconst server = new Server(\n  {\n    name: 'mem0-mcp',\n    version: '0.0.1',\n  },\n  {\n    capabilities: {\n      tools: {},\n      logging: {},\n    },\n  }\n);\n\n// Helper function to add memories\nasync function addMemory(content: string, userId: string) {\n  try {\n    const messages = [\n      { role: 'system', content: 'Memory storage system' },\n      { role: 'user', content }\n    ];\n    await memoryClient.add(messages, { user_id: userId });\n    return true;\n  } catch (error) {\n    console.error('Error adding memory:', error);\n    return false;\n  }\n}\n\n// Helper function to search memories\nasync function searchMemories(query: string, userId: string) {\n  try {\n    const results = await memoryClient.search(query, { user_id: userId });\n    return results;\n  } catch (error) {\n    console.error('Error searching memories:', error);\n    return [];\n  }\n}\n\n// Register tool handlers\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n  tools: [ADD_MEMORY_TOOL, SEARCH_MEMORIES_TOOL],\n}));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n  try {\n    const { name, arguments: args } = request.params;\n    \n    if (!args) {\n      throw new Error('No arguments provided');\n    }\n    \n    switch (name) {\n      case 'add-memory': {\n        const { content, userId } = args as { content: string, userId: string };\n        await addMemory(content, userId);\n        return {\n          content: [\n            {\n              type: 'text',\n              text: 'Memory added successfully',\n            },\n          ],\n          isError: false,\n        };\n      }\n      \n      case 'search-memories': {\n        const { query, userId } = args as { query: string, userId: string };\n        const results = await searchMemories(query, userId);\n        const formattedResults = results.map((result: any) => \n          `Memory: ${result.memory}\\nRelevance: ${result.score}\\n---`\n        ).join('\\n');\n        \n        return {\n          content: [\n            {\n              type: 'text',\n              text: formattedResults || 'No memories found',\n            },\n          ],\n          isError: false,\n        };\n      }\n      \n      default:\n        return {\n          content: [\n            { type: 'text', text: `Unknown tool: ${name}` },\n          ],\n          isError: true,\n        };\n    }\n  } catch (error) {\n    return {\n      content: [\n        {\n          type: 'text',\n          text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n        },\n      ],\n      isError: true,\n    };\n  }\n});\n\n// Function to log safely\nfunction safeLog(\n  level: 'error' | 'debug' | 'info' | 'notice' | 'warning' | 'critical' | 'alert' | 'emergency',\n  data: any\n): void {\n  // For stdio transport, log to stderr to avoid protocol interference\n  console.error(`[${level}] ${typeof data === 'object' ? JSON.stringify(data) : data}`);\n  \n  // Send to logging capability if available\n  try {\n    server.sendLoggingMessage({ level, data });\n  } catch (error) {\n    // Ignore errors when logging is not available\n  }\n}\n\n// Server startup\nasync function main() {\n  try {\n    console.error('Initializing Mem0 Memory MCP Server...');\n    \n    const transport = new StdioServerTransport();\n    await server.connect(transport);\n    \n    safeLog('info', 'Mem0 Memory MCP Server initialized successfully');\n    console.error('Memory MCP Server running on stdio');\n  } catch (error) {\n    console.error('Fatal error running server:', error);\n    process.exit(1);\n  }\n}\n\nmain().catch((error) => {\n  console.error('Fatal error in main():', error);\n  process.exit(1);\n});"],"mappings":"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","names":["dotenv"]}