Skip to main content
Glama

edit_memory

Replace content in memory files using literal strings or regex patterns to update stored information.

Instructions

Replaces content matching a regular expression in a memory.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
memory_file_nameYesThe name of the memory.
needleYesThe string or regex pattern to search for. If `mode` is "literal", this string will be matched exactly. If `mode` is "regex", this string will be treated as a regular expression (syntax of Python's `re` module, with flags DOTALL and MULTILINE enabled).
replYesThe replacement string (verbatim).
modeYesEither "literal" or "regex", specifying how the `needle` parameter is to be interpreted.

Implementation Reference

  • The EditMemoryTool class provides the core handler logic for the 'edit_memory' tool. It replaces content in a project memory file using literal string or regex replacement by delegating to ReplaceContentTool.
    class EditMemoryTool(Tool, ToolMarkerCanEdit):
        def apply(
            self,
            memory_file_name: str,
            needle: str,
            repl: str,
            mode: Literal["literal", "regex"],
        ) -> str:
            r"""
            Replaces content matching a regular expression in a memory.
    
            :param memory_file_name: the name of the memory
            :param needle: the string or regex pattern to search for.
                If `mode` is "literal", this string will be matched exactly.
                If `mode` is "regex", this string will be treated as a regular expression (syntax of Python's `re` module,
                with flags DOTALL and MULTILINE enabled).
            :param repl: the replacement string (verbatim).
            :param mode: either "literal" or "regex", specifying how the `needle` parameter is to be interpreted.
            """
            replace_content_tool = self.agent.get_tool(ReplaceContentTool)
            rel_path = self.memories_manager.get_memory_file_path(memory_file_name).relative_to(self.get_project_root())
            return replace_content_tool.replace_content(str(rel_path), needle, repl, mode=mode, require_not_ignored=False)
  • ToolRegistry discovers all Tool subclasses (including EditMemoryTool) via iter_subclasses and registers them by their snake_case name (EditMemoryTool -> 'edit_memory'). This makes the tool available to the agent.
    self._tool_dict: dict[str, RegisteredTool] = {}
    for cls in iter_subclasses(Tool):
        if not any(cls.__module__.startswith(pkg) for pkg in tool_packages):
            continue
        is_optional = issubclass(cls, ToolMarkerOptional)
        name = cls.get_name_from_cls()
        if name in self._tool_dict:
            raise ValueError(f"Duplicate tool name found: {name}. Tool classes must have unique names.")
        self._tool_dict[name] = RegisteredTool(tool_class=cls, is_optional=is_optional, tool_name=name)
  • Defines the tool naming convention used by Tool subclasses and registry: converts 'EditMemoryTool' to 'edit_memory', which is the MCP-exposed name.
    def get_name_from_cls(cls) -> str:
        name = cls.__name__
        if name.endswith("Tool"):
            name = name[:-4]
        # convert to snake_case
        name = "".join(["_" + c.lower() if c.isupper() else c for c in name]).lstrip("_")
        return name
    
    def get_name(self) -> str:
        return self.get_name_from_cls()

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/oraios/serena'

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