Skip to main content
Glama

search_memos

Search for memos using text queries and filters for creator, tags, and visibility to find specific notes in your knowledge base.

Instructions

Search for memos with optional filters.

Args: query: Text to search for in memo content creator_id: Filter by creator user ID tag: Filter by tag name visibility: Filter by visibility (PUBLIC, PROTECTED, PRIVATE) limit: Maximum number of results to return (default: 10) offset: Number of results to skip (default: 0)

Returns: JSON string containing the list of matching memos

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryNo
creator_idNo
tagNo
visibilityNo
limitNo
offsetNo

Implementation Reference

  • The main handler function for the 'search_memos' tool. It constructs filters from input parameters, makes an HTTP GET request to the Memos API, processes the response, and returns a formatted JSON string of matching memos. Includes error handling.
    @mcp.tool()
    async def search_memos(
        query: Optional[str] = None,
        creator_id: Optional[int] = None,
        tag: Optional[str] = None,
        visibility: Optional[str] = None,
        limit: int = 10,
        offset: int = 0
    ) -> str:
        """
        Search for memos with optional filters.
        
        Args:
            query: Text to search for in memo content
            creator_id: Filter by creator user ID
            tag: Filter by tag name
            visibility: Filter by visibility (PUBLIC, PROTECTED, PRIVATE)
            limit: Maximum number of results to return (default: 10)
            offset: Number of results to skip (default: 0)
        
        Returns:
            JSON string containing the list of matching memos
        """
        # Build filter expression
        filters = []
        
        if creator_id is not None:
            filters.append(f"creator_id == {creator_id}")
        
        if query:
            # Escape quotes in query
            escaped_query = query.replace('"', '\\"')
            filters.append(f'content.contains("{escaped_query}")')
        
        if tag:
            escaped_tag = tag.replace('"', '\\"')
            filters.append(f'tag in ["{escaped_tag}"]')
        
        if visibility:
            filters.append(f'visibility == "{visibility.upper()}"')
        
        # Combine filters with AND operator
        filter_str = " && ".join(filters) if filters else ""
        
        # Build request parameters
        params = {
            "pageSize": limit,
        }
        
        if filter_str:
            params["filter"] = filter_str
        
        # Calculate page token for pagination
        if offset > 0:
            # For simplicity, we'll use offset/limit approach
            # In production, you'd want to use proper page tokens
            page = offset // limit
            if page > 0:
                params["pageToken"] = f"offset={offset}"
        
        try:
            async with httpx.AsyncClient() as client:
                response = await client.get(
                    f"{MEMOS_BASE_URL}/api/v1/memos",
                    params=params,
                    headers=get_headers(),
                    timeout=30.0
                )
                response.raise_for_status()
                data = response.json()
                
                # Format the response nicely
                memos = data.get("memos", [])
                result = {
                    "count": len(memos),
                    "memos": [
                        {
                            "name": memo.get("name"),
                            "uid": memo.get("uid"),
                            "creator": memo.get("creator"),
                            "content": memo.get("content"),
                            "visibility": memo.get("visibility"),
                            "pinned": memo.get("pinned", False),
                            "createTime": memo.get("createTime"),
                            "updateTime": memo.get("updateTime"),
                            "displayTime": memo.get("displayTime"),
                        }
                        for memo in memos
                    ],
                    "nextPageToken": data.get("nextPageToken", "")
                }
                
                return str(result)
                
        except httpx.HTTPError as e:
            return f"Error searching memos: {str(e)}"
        except Exception as e:
            return f"Unexpected error: {str(e)}"
  • Helper utility function used by search_memos (and other tools) to generate HTTP headers for authenticated API requests to the Memos server.
    def get_headers() -> dict:
        """Get headers for API requests including authentication"""
        headers = {
            "Content-Type": "application/json",
        }
        if MEMOS_API_TOKEN:
            headers["Authorization"] = f"Bearer {MEMOS_API_TOKEN}"
        return headers
  • server.py:31-31 (registration)
    The @mcp.tool() decorator registers the search_memos function as an MCP tool.
    @mcp.tool()
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/Red5d/memos_mcp'

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