Skip to main content
Glama
ergut

MCP server for LogSeq

by ergut

list_pages

Retrieve all pages from a LogSeq graph, with an option to filter out journal entries for focused content management.

Instructions

Lists all pages in a LogSeq graph.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
include_journalsNoWhether to include journal/daily notes in the list

Implementation Reference

  • ListPagesToolHandler class: implements the core logic for the list_pages tool. Handles arguments, calls LogSeq API to list pages, filters journal pages based on include_journals param, formats and sorts the page list, and returns formatted text output.
    class ListPagesToolHandler(ToolHandler):
        def __init__(self):
            super().__init__("list_pages")
    
        def get_tool_description(self):
            return Tool(
                name=self.name,
                description="Lists all pages in a LogSeq graph.",
                inputSchema={
                    "type": "object",
                    "properties": {
                        "include_journals": {
                            "type": "boolean",
                            "description": "Whether to include journal/daily notes in the list",
                            "default": False
                        }
                    },
                    "required": []
                }
            )
        
        def run_tool(self, args: dict) -> list[TextContent]:
            include_journals = args.get("include_journals", False)
            
            try:
                api = logseq.LogSeq(api_key=api_key)
                result = api.list_pages()
                
                # Format pages for display
                pages_info = []
                for page in result:
                    # Skip if it's a journal page and we don't want to include those
                    is_journal = page.get('journal?', False)
                    if is_journal and not include_journals:
                        continue
                    
                    # Get page information
                    name = page.get('originalName') or page.get('name', '<unknown>')
                    
                    # Build page info string
                    info_parts = [f"- {name}"]
                    if is_journal:
                        info_parts.append("[journal]")
                        
                    pages_info.append(" ".join(info_parts))
                
                # Sort alphabetically by page name
                pages_info.sort()
                
                # Build response
                count_msg = f"\nTotal pages: {len(pages_info)}"
                journal_msg = " (excluding journal pages)" if not include_journals else " (including journal pages)"
                
                response = "LogSeq Pages:\n\n" + "\n".join(pages_info) + count_msg + journal_msg
                
                return [TextContent(type="text", text=response)]
                
            except Exception as e:
                logger.error(f"Failed to list pages: {str(e)}")
                raise
  • Tool schema definition for list_pages: defines optional boolean input 'include_journals' with default False.
    def get_tool_description(self):
        return Tool(
            name=self.name,
            description="Lists all pages in a LogSeq graph.",
            inputSchema={
                "type": "object",
                "properties": {
                    "include_journals": {
                        "type": "boolean",
                        "description": "Whether to include journal/daily notes in the list",
                        "default": False
                    }
                },
                "required": []
            }
        )
  • Registration of the ListPagesToolHandler instance in the MCP server during tool handler setup.
    add_tool_handler(tools.ListPagesToolHandler())
  • Underlying LogSeq API method list_pages(): makes HTTP POST to LogSeq's logseq.Editor.getAllPages RPC to retrieve all pages.
    def list_pages(self) -> Any:
        """List all pages in the LogSeq graph."""
        url = self.get_base_url()
        logger.info("Listing pages")
        
        try:
            response = requests.post(
                url,
                headers=self._get_headers(),
                json={
                    "method": "logseq.Editor.getAllPages",
                    "args": []
                },
                verify=self.verify_ssl,
                timeout=self.timeout
            )
            response.raise_for_status()
            return response.json()
    
        except Exception as e:
            logger.error(f"Error listing pages: {str(e)}")
            raise

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/ergut/mcp-logseq-server'

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