Skip to main content
Glama

axom_mcp_memory

Destructive

Store, retrieve, search, and manage persistent memories in the Axom database for AI agents, supporting long-term context and complex tool chaining.

Instructions

Store, retrieve, search, and manage persistent memories in the Axom database.

Memory Types:

  • long_term: Reusable patterns, architectural decisions, gotchas

  • short_term: Task-specific context, debug notes, current task state

  • reflex: Learned heuristics ("Always check X before Y" patterns)

  • dreams: Experimental ideas, creative explorations

Naming Convention: [type][descriptor][YYYYMMDD] Example: bugfix_auth_timeout_20260203

Content Format (recommended): TASK|APPROACH|OUTCOME|GOTCHAS|RELATED

Actions:

  • write: Store a new memory

  • read: Retrieve a specific memory by name

  • list: List memories with optional filters

  • search: Full-text search across memories

  • delete: Remove a memory by name

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesMemory operation to perform
nameNoMemory identifier (required for read/write/delete)
contentNoMemory content (required for write)
memory_typeNoType of memory storage
importanceNoImportance level
tagsNoTags for categorization
queryNoSearch query (required for search)
limitNoMaximum results to return
expires_in_daysNoOverride default expiration in days (default per type: short_term=30d, long_term=365d, reflex=90d, dreams=180d)

Implementation Reference

  • Main handler function for axom_mcp_memory tool. Validates input using MemoryInput schema and routes to appropriate action handlers (write, read, list, search, delete, associate).
    async def handle_memory(arguments: Dict[str, Any]) -> str:
        """Handle axom_mcp_memory tool calls.
    
        Args:
            arguments: Tool arguments containing action and parameters
    
        Returns:
            JSON string with operation result
        """
        # Validate input
        input_data = MemoryInput(**arguments)
        action = input_data.action
    
        db = await get_db_manager()
    
        if action == "write":
            return await _handle_write(input_data, db)
        elif action == "read":
            return await _handle_read(input_data, db)
        elif action == "list":
            return await _handle_list(input_data, db)
        elif action == "search":
            return await _handle_search(input_data, db)
        elif action == "delete":
            return await _handle_delete(input_data, db)
        elif action == "associate":
            return await _handle_associate(input_data, db)
        else:
            return json.dumps({"error": f"Unknown action: {action}"})
  • Helper function that handles the 'write' action - creates a new memory in the database with name, content, type, importance, tags, and expiration.
    async def _handle_write(input_data: MemoryInput, db) -> str:
        """Write a new memory."""
        if not input_data.name:
            return json.dumps({"error": "name is required for write action"})
        if not input_data.content:
            return json.dumps({"error": "content is required for write action"})
    
        memory_type = input_data.memory_type or MemoryType.LONG_TERM
        importance = input_data.importance or ImportanceLevel.NORMAL
    
        try:
            memory_id = await db.create_memory(
                name=input_data.name,
                content=input_data.content,
                memory_type=memory_type.value
                if isinstance(memory_type, MemoryType)
                else memory_type,
                importance=importance.value
                if isinstance(importance, ImportanceLevel)
                else importance,
                tags=input_data.tags,
                source_agent=input_data.source_agent,
                expires_in_days=input_data.expires_in_days,
            )
            return json.dumps(
                {
                    "success": True,
                    "id": str(memory_id),
                    "name": input_data.name,
                    "message": f"Memory '{input_data.name}' stored successfully",
                }
            )
        except Exception as e:
            logger.error(f"Failed to write memory: {e}")
            return json.dumps({"error": str(e)})
  • Helper function that handles the 'read' action - retrieves a memory by name including its associated memories with 1-level extension.
    async def _handle_read(input_data: MemoryInput, db) -> str:
        """Read a memory by name including associated memories."""
        if not input_data.name:
            return json.dumps({"error": "name is required for read action"})
    
        try:
            memory = await db.get_memory_by_name(input_data.name)
            if memory is None:
                return json.dumps({"error": f"Memory not found: {input_data.name}"})
    
            # Get associated memories with 1-level extension
            associated_memories = await db.get_associated_memories(str(memory["id"]))
    
            # Format associated memories
            formatted_associations = []
            for assoc in associated_memories:
                formatted_associations.append(
                    {
                        "id": str(assoc["id"]),
                        "name": assoc["name"],
                        "memory_type": assoc["memory_type"],
                        "importance": assoc["importance"],
                        "tags": assoc.get("tags", []),
                        "created_at": assoc["created_at"].isoformat()
                        if assoc.get("created_at")
                        else None,
                    }
                )
    
            return json.dumps(
                {
                    "success": True,
                    "memory": {
                        "id": str(memory["id"]),
                        "name": memory["name"],
                        "content": memory["content"],
                        "memory_type": memory["memory_type"],
                        "importance": memory["importance"],
                        "tags": memory.get("tags", []),
                        "source_agent": memory.get("source_agent"),
                        "parent_memory_id": memory.get("parent_memory_id"),
                        "created_at": memory["created_at"].isoformat()
                        if memory.get("created_at")
                        else None,
                        "updated_at": memory["updated_at"].isoformat()
                        if memory.get("updated_at")
                        else None,
                        "associated_memories": formatted_associations,
                    },
                }
            )
        except Exception as e:
            logger.error(f"Failed to read memory: {e}")
            return json.dumps({"error": str(e)})
  • Helper function that handles the 'list' action - lists memories with optional filters for type, importance, and limit.
    async def _handle_list(input_data: MemoryInput, db) -> str:
        """List memories with optional filters."""
        limit = input_data.limit or 50
    
        try:
            memory_type = None
            if input_data.memory_type:
                memory_type = (
                    input_data.memory_type.value
                    if isinstance(input_data.memory_type, MemoryType)
                    else input_data.memory_type
                )
    
            importance = None
            if input_data.importance:
                importance = (
                    input_data.importance.value
                    if isinstance(input_data.importance, ImportanceLevel)
                    else input_data.importance
                )
    
            memories = await db.list_memories(
                memory_type=memory_type,
                importance=importance,
                limit=limit,
            )
    
            return json.dumps(
                {
                    "success": True,
                    "count": len(memories),
                    "memories": [
                        {
                            "name": m["name"],
                            "memory_type": m["memory_type"],
                            "importance": m["importance"],
                            "tags": m.get("tags", []),
                            "created_at": m["created_at"].isoformat()
                            if m.get("created_at")
                            else None,
                        }
                        for m in memories
                    ],
                }
            )
        except Exception as e:
            logger.error(f"Failed to list memories: {e}")
            return json.dumps({"error": str(e)})
  • Helper function that handles the 'search' action - performs full-text search across memories with query, type, importance, and tag filters.
    async def _handle_search(input_data: MemoryInput, db) -> str:
        """Search memories by query."""
        if not input_data.query:
            return json.dumps({"error": "query is required for search action"})
    
        limit = input_data.limit or 10
    
        try:
            memory_type = None
            if input_data.memory_type:
                memory_type = (
                    input_data.memory_type.value
                    if isinstance(input_data.memory_type, MemoryType)
                    else input_data.memory_type
                )
    
            importance = None
            if input_data.importance:
                importance = (
                    input_data.importance.value
                    if isinstance(input_data.importance, ImportanceLevel)
                    else input_data.importance
                )
    
            memories = await db.search_memories(
                query=input_data.query,
                memory_type=memory_type,
                importance=importance,
                tags=input_data.tags,
                limit=limit,
            )
    
            return json.dumps(
                {
                    "success": True,
                    "query": input_data.query,
                    "count": len(memories),
                    "results": [
                        {
                            "name": m["name"],
                            "content": m["content"][:500] + "..."
                            if len(m["content"]) > 500
                            else m["content"],
                            "memory_type": m["memory_type"],
                            "importance": m["importance"],
                            "relevance": m.get("rank", 0),
                        }
                        for m in memories
                    ],
                }
            )
        except Exception as e:
            logger.error(f"Failed to search memories: {e}")
            return json.dumps({"error": str(e)})

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PugzUI/axom-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server