An MCP server that lets compatible clients discover, read, organize, revise, favorite, create, edit, and delete content in a LeafWiki instance.
The project is at version 0.1.0 and is under early development. It runs as a synchronous MCP server over stdio. Installation from PyPI is not currently documented or supported; run it from GitHub directly or from a source checkout.
- Python 3.12 or newer
uv
Choose the method that matches how you plan to use the server. All methods run the same
leafwiki-mcp command over stdio.
Use uvx to run the server directly from the GitHub repository without cloning it or installing
it permanently:
uvx --from git+https://github.com/ipapadop/leafwiki-mcp.git leafwiki-mcpuvx creates an isolated environment and caches downloaded dependencies for later runs.
Install the server from GitHub when you want the leafwiki-mcp command to remain available on
your PATH:
uv tool install git+https://github.com/ipapadop/leafwiki-mcp.git
leafwiki-mcpIf uv reports that its tool directory is not on PATH, run uv tool update-shell and restart
your shell.
Clone over HTTPS:
git clone https://github.com/ipapadop/leafwiki-mcp.git
cd leafwiki-mcp
uv syncOr clone over SSH:
git clone git@github.com:ipapadop/leafwiki-mcp.git
cd leafwiki-mcp
uv syncThe server accepts command-line options or equivalent environment variables:
| Option | Environment variable | Default |
|---|---|---|
--url |
LEAFWIKI_URL |
http://localhost:8080 |
--username |
LEAFWIKI_USERNAME |
empty |
--password |
LEAFWIKI_PASSWORD |
empty |
--read-only / --no-read-only |
LEAFWIKI_READ_ONLY |
false |
Credentials are unnecessary when authentication is disabled. Accounts requiring TOTP are not supported; use a dedicated editor account without TOTP.
The password in the MCP client example below is stored directly in that client's configuration.
Protect the configuration as you would any other credential. For an authentication-disabled
LeafWiki instance, omit LEAFWIKI_USERNAME and LEAFWIKI_PASSWORD entirely.
Set LEAFWIKI_READ_ONLY=true or pass --read-only to register only discovery and retrieval
tools. The environment variable accepts true/false, 1/0, yes/no, and on/off
case-insensitively. Either command-line option overrides the environment value, so
--no-read-only explicitly enables read-write mode. Read-only mode provides defense in depth
against accidental changes; it does not replace LeafWiki's server-side authorization or
appropriately scoped credentials.
If you installed leafwiki-mcp as a persistent tool, start it with:
leafwiki-mcpFrom a source checkout, start it with:
uv run leafwiki-mcpIn normal use, an MCP client starts the server for you. Use the configuration that matches your installation method.
{
"mcpServers": {
"leafwiki": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/ipapadop/leafwiki-mcp.git",
"leafwiki-mcp"
],
"env": {
"LEAFWIKI_URL": "https://wiki.example.com",
"LEAFWIKI_USERNAME": "mcp-editor",
"LEAFWIKI_PASSWORD": "replace-me"
}
}
}
}{
"mcpServers": {
"leafwiki": {
"command": "leafwiki-mcp",
"env": {
"LEAFWIKI_URL": "https://wiki.example.com",
"LEAFWIKI_USERNAME": "mcp-editor",
"LEAFWIKI_PASSWORD": "replace-me"
}
}
}
}Replace /absolute/path/to/leafwiki-mcp with the location of your clone:
{
"mcpServers": {
"leafwiki": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/leafwiki-mcp",
"run",
"leafwiki-mcp"
],
"env": {
"LEAFWIKI_URL": "https://wiki.example.com",
"LEAFWIKI_USERNAME": "mcp-editor",
"LEAFWIKI_PASSWORD": "replace-me"
}
}
}
}The server always exposes these discovery and retrieval tools over stdio:
search_pages: search page text and tags with paginationget_page: retrieve Markdown content and metadata by ID or pathbrowse_tree: browse the page hierarchy with an optional depth limitget_page_links: retrieve backlinks, outgoing links, and broken linkslist_tags: discover tags and their usage countsfind_pages_by_property: find pages by structured property metadatalist_page_revisions: list revision history when revisions are enabledget_page_revision: retrieve a historical page snapshot when revisions are enabledcompare_page_revisions: compare two historical snapshotsget_indexing_status: inspect full-text indexing statelist_property_keys,find_page_by_title,lookup_path, andsuggest_slug: discover page metadata and pathslist_favorites: list personal bookmarks
In the default read-write mode, the server also exposes these mutation tools:
move_page,copy_page,ensure_path,convert_page, andpin_page: organize pagesadd_favoriteandremove_favorite: change personal bookmarksappend_to_page,update_page_tags, andupdate_page_properties: make focused page updatessort_pages: set the ordering of children under a pageadd_page,edit_page, anddelete_page: mutate pages using optimistic concurrency
Tools that select a page accept an ID or slash-separated path and prefer a non-empty ID when both are supplied. Revision tools require revisions to be enabled in LeafWiki. Favorites require an authenticated user when authentication is enabled.
Page edits and deletions use LeafWiki versions for optimistic concurrency. A conflict is returned as an error so callers can re-read the page and retry deliberately. Deletion is non-recursive by default; recursive deletion must be requested explicitly. Creating a page with content, tags, or properties performs a create followed by a versioned update, so creation may succeed even if the follow-up update fails.
- Cannot connect: confirm
LEAFWIKI_URLincludeshttp://orhttps://, points to a running LeafWiki instance, and is reachable from the MCP client process. - Authentication required: set both
LEAFWIKI_USERNAMEandLEAFWIKI_PASSWORD, or omit them when LeafWiki reports that authentication is disabled. - TOTP required: TOTP accounts are unsupported. Use a dedicated editor account without TOTP.
- Revision request fails: confirm revisions are enabled in the LeafWiki instance.
- Update or deletion conflicts: re-read the page to obtain its current version, review the intervening change, and retry deliberately.
The tests use mocked HTTP transports and clients. They do not require a live LeafWiki instance, network access, or real credentials.
uv sync
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytestThe Quality GitHub Actions workflow runs Ruff lint, Ruff formatting verification, Pyright, and
Pytest for every pull request, every push to main, and manual dispatches. Run the same commands
locally before pushing.
This project is licensed under the MIT License.