mcpField
L
Logseq API MCP Server

Logseq API MCP Server

Local
github.com/gustavo-meilusMemory & Knowledge31Updated 22w ago

About Logseq API MCP Server

logseq-api-mcp is an MCP server that uses the Logseq HTTP API so AI assistants can read, write, query and search Logseq notes. It targets users who keep their knowledge graph in Logseq and can hide tagged pages from all reads.

Key features

  1. 01Provides 21 read, write and search tools
  2. 02Reads pages, blocks and namespaces
  3. 03Creates, updates and deletes pages and blocks
  4. 04Sets block properties in database mode
  5. 05Filters out pages by excluded tags

Use cases

  1. 01Letting an AI assistant search notes in a Logseq graph
  2. 02Analysing backlinks and page relationships
  3. 03Running raw Datalog queries against the graph

MCP support

This project is an MCP server that exposes 21 tools to MCP clients for reading, writing and searching a Logseq graph.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

No install method listed yet

We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.

Repository

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

logseq-api-mcp

Your AI assistant starts every session blind to your Logseq knowledge graph. logseq-api-mcp fixes that: 21 tools to read, write, query, and search your notes — auto-registered the moment you drop a Python file into src/tools/.

Python License: MIT CI Coverage Tests Stars

Architecture: AI Client → logseq-api-mcp (21 tools, privacy) → Logseq API → Knowledge Graph

Quick Start

Step 1 — Install

git clone https://github.com/gustavo-meilus/logseq-api-mcp.git
cd logseq-api-mcp
uv sync

Step 2 — Configure

cp .env.template .env
# open .env and set LOGSEQ_API_ENDPOINT and LOGSEQ_API_TOKEN

Getting your token: open Logseq, go to Settings → Features → Developer mode, enable HTTP APIs server, and copy the token shown. The default endpoint is http://127.0.0.1:12315/api.

Step 3 — Connect

// ~/.claude/claude_desktop_config.json
{
  "mcpServers": {
    "logseq-api": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/logseq-api-mcp", "python", "src/server.py"],
      "env": {
        "LOGSEQ_API_ENDPOINT": "http://127.0.0.1:12315/api",
        "LOGSEQ_API_TOKEN": "your_token_here"
      }
    }
  }
}

Restart Claude Desktop. All 21 tools are live.


Tools

Read (12 tools)
ToolWhat it does
get_all_pagesEvery page with ID, UUID, journal flag, and namespace
get_page_blocksHierarchical block tree with IDs, UUIDs, and child counts
get_page_linksPages linking to a target page
get_page_backlinksFull backlink analysis including block-level references
get_block_contentBlock detail with properties and immediate children
get_all_page_contentComplete page: properties, blocks, DB refs expanded
get_linked_flashcardsQ&A flashcard pairs from a page and all linked pages
searchFull-text search across blocks, pages, and file names
queryRaw Datalog / DSL queries against the graph
find_pages_by_propertyFilter pages by property key and optional value
get_pages_from_namespaceAll pages under a Logseq namespace
get_pages_tree_from_namespaceNested tree of namespace pages
Write (10 tools)
ToolWhat it does
create_pageCreate a page with optional properties and format
delete_pageRemove a page permanently
rename_pageRename a page and update all references
update_pageAppend or replace content on an existing page
append_block_in_pageAdd blocks at the end of a page
edit_blockReplace a block's content by UUID
update_blockUpdate block content by UUID
insert_nested_blockInsert a child or sibling block relative to another block
delete_blockDelete a block by UUID
set_block_propertiesSet structured properties on a block (DB-mode only)

Configuration

VariableDefaultDescription
LOGSEQ_API_ENDPOINThttp://127.0.0.1:12315/apiLogseq HTTP API base URL
LOGSEQ_API_TOKEN(required)Bearer auth token
LOGSEQ_VERIFY_SSLtrueSet false to skip TLS verification
LOGSEQ_DB_MODEfalseEnable Logseq database-format API paths
LOGSEQ_EXCLUDE_TAGS(empty)Comma-separated tags — pages with any tag are hidden
LOGSEQ_LOG_LEVELWARNINGLog level: DEBUG, INFO, WARNING, ERROR

DB-Mode

Logseq's newer database format stores graph data in SQLite rather than markdown files. Set LOGSEQ_DB_MODE=true to unlock set_block_properties, UUID-reference resolution in get_all_page_content, and Datalog-powered queries in find_pages_by_property. Tools that do not apply in DB-mode return a clear error rather than silently failing.


Privacy

Any page tagged with a tag from LOGSEQ_EXCLUDE_TAGS disappears from every read operation. Enforcement runs at query time, so toggling the variable takes effect immediately.

OperationBehavior when page is excluded
get_all_pagesExcluded pages absent from the listing
searchExcluded pages and their blocks stripped from results
queryResults post-filtered against excluded page names
find_pages_by_propertyResults post-filtered
get_page_backlinksExcluded source pages removed
get_all_page_contentReturns ❌ Access denied for the excluded page

Adding a Tool

Create src/tools/my_tool.py. No imports, no registration, no config changes needed. The discovery system picks it up on the next server start.

from typing import List
from mcp.types import TextContent
from src.client.logseq_client import LogseqClient
from src.client.config import LogseqConfig, load_config
from src.logging_setup import get_logger

_log = get_logger(__name__)

async def _run(
    client: LogseqClient, config: LogseqConfig, param: str
) -> List[TextContent]:
    try:
        _log.debug("%s called", __name__)
        result = await client.some_api_method(param)
        return [TextContent(type="text", text=str(result))]
    except Exception as exc:
        _log.error("exception in %s: %s", __name__, exc, exc_info=True)
        return [TextContent(type="text", text=f"❌ Error: {exc}")]

async def my_tool(param: str) -> List[TextContent]:
    """One-line description — this becomes the MCP tool description."""
    cfg = load_config()
    return await _run(LogseqClient(cfg), cfg, param)

The _run(client, config, ...) pattern keeps the logic testable via FakeLogseqClient in tests/conftest.py. Function names starting with _ are not registered.


Development

uv sync --dev                                                        # all deps
uv run --group test pytest tests/ -v                                 # test suite (345 tests)
uv run --group test pytest tests/ --cov=src --cov-fail-under=85      # coverage gate
uv run ruff check --fix && uv run ruff format                        # lint + format
uv run mypy src/ --ignore-missing-imports                            # type check
uv run bandit -r src/                                                # security scan
uv run mcp dev src/server.py                                         # MCP inspector

Star History

Star History Chart


License

MIT — see LICENSE.


Made for the Logseq and MCP communities.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.