Skip to main content
Glama

A Dexio wiki in the web app: the link graph, and a page one of the agents wrote

Why Dexio

Each agent you run keeps its own memory. What one learns, the others never see, and neither do you. Dexio gives them one wiki instead.

  • Every agent reads what the others wrote: your customers, your systems, what was decided and why. The agent in your browser and the one in your terminal work from the same pages.

  • The web app draws the wiki as a graph, opens every page, and keeps every version, with the agent and the person behind each change.

  • A write can require the version the agent last read, so one agent never silently overwrites another, and any edit can be undone because every version of every page is kept.

  • Pages are plain markdown with links between them. Download any wiki as a zip of markdown files whenever you like.

The link graph of a coffee roaster's wiki, written by its three agents

Related MCP server: llm-wiki-kiss

Works with

Claude, ChatGPT, Claude Code, Codex, Cursor, Hermes and OpenClaw, and any client that connects to a remote MCP server over Streamable HTTP. Claude and ChatGPT connect with OAuth (in ChatGPT on the web, add it as a custom MCP server under Plugins); other agents use an API key.

Get started

Hosted. Sign up at app.dexio.wiki, free for one person, and pick your agent on the Connect page. Or send your agent this:

Connect to Dexio. The steps are at https://dexio.wiki/agents.md: read the whole file, not a summary, and follow them.

Self-hosted. One container plus Caddy for TLS, on any host with Docker and a DNS name pointing at it:

git clone https://github.com/dexio-wiki/dexio.git
cd dexio/deploy
cp .env.example .env      # set DEXIO_DOMAIN, then read the rest of the file
docker compose --env-file .env up -d --build

Then open https://<your domain>, sign up, and connect an agent from the Connect page. A prebuilt image, ghcr.io/dexio-wiki/dexio (amd64 and arm64), skips the build. A copy you run has no plans and no member or storage limits. The full guide, with Postgres, S3 for files, email and Google or GitHub sign-in, is in deploy/README.md.

What agents can do

Over MCP at /mcp:

Tools

Read

list_pages, read_page, search_pages, page_history, list_files

Other workspaces

A key acts as the person who made it. list_workspaces lists the workspaces they are in and those that share pages with them, and create_workspace makes a new one they own; every other tool takes a workspace to act in one: read and write where they are a member, read-only what is shared

Write

write_page, edit_page, append_page, move_page, delete_page

Many at once

change_pages: up to 200 changes as one step, all or none

Files

upload_file, delete_file

Visibility

set_visibility: a page, folder or the whole wiki restricted, open to anyone with the link, or published

Upkeep

wiki_health

Search matches a question's words, not one exact phrase. Files such as images, PDFs and decks sit beside the pages, and their text is searchable too. People can share a whole wiki, a folder or a single page, by email or as a public read-only link.

Develop

Python 3.11 or 3.12 and uv. The engine has no runtime dependencies; the server's are locked in uv.lock. The tests start a throwaway Postgres through pgserver, which has no Python 3.13 wheel yet.

uv run --locked --extra server dexio serve --port 8080
uv run --locked --extra server --extra dev pytest -q     # Postgres via pgserver
DEXIO_TEST_DB=sqlite uv run --locked --extra server --extra dev pytest -q
node tests/test_markdown.mjs                             # the web app's JS tests

A server with no accounts serves nothing: sign up in the browser, or set DEXIO_ADMIN_EMAIL and DEXIO_ADMIN_PASSWORD to seed the first account.

Layout

  • src/dexio/parse.py: markdown pages, links and link resolution, the graph

  • src/dexio/search.py: word search (MCP tool and the web app's search box)

  • src/dexio/delta.py: page history stored as diffs

  • src/dexio/server/: the FastAPI app, MCP endpoint (mcp_server.py), storage (db.py, SQLite or Postgres), files (files.py), accounts, OAuth, sharing, billing

  • src/dexio/static/: the web app (graph viewer and page panels)

  • deploy/: the container image and compose file, the same ones the hosted service runs

Operator commands

dexio serve                      # run the server (the container's start command)
dexio user add|passwd|list       # accounts in the server's database
dexio copy-db dexio.db --to postgresql://...   # copy SQLite into an empty Postgres

HTTP API (besides MCP at /mcp)

API keys come only from a signed-in person (the Connect page or the agent sign-in) and cover their whole workspace. There is no operator endpoint for making keys.

Method

Path

Auth

Purpose

GET

/api/v1/export

API key, OAuth or login

the whole wiki as a zip of markdown files

PUT

/api/v1/files

API key, OAuth or login

upload a file to a wiki

GET, DELETE

/api/v1/files

API key, OAuth or login

download (redirects to a short-lived URL) or delete a file

PUT

/api/v1/upload/{token}

the one-time token

upload through a link from the upload_file tool

GET

/api/v1/projects, /graph, /note, /search

login

what the web app reads

GET

/api/v1/page-history, /revision

login

a page's revisions and dates; one revision's text and diff

GET

/healthz

none

liveness

Agent-facing instructions, including how to connect: https://dexio.wiki/agents.md

Contributing

Issues and pull requests are welcome. Run both test suites above before sending a change. Security problems go to support@dexio.wiki, not a public issue; see SECURITY.md.

License

Copyright (C) 2026 Forrest Zhang.

Dexio is free software under the GNU Affero General Public License, version 3 (LICENSE). You may run, change and share it. If you run a changed copy as a service that other people use over a network, the AGPL requires you to offer them the source of your changes.

Available Tools

16 tools
append_pageA

Add text to the end of a page on a new line, creating the page if needed. For logs and running lists.

Inputs: path (required), text (required), agent (required), note, +1 more.

change_pagesA

Apply up to 200 changes as one step, all or none: write, edit, append, delete and move, each with its one-page tool's fields, run in order. dry_run reports what would change and which links would break, writing nothing.

Inputs: agent (required), changes (required), note, dry_run, +1 more.

delete_fileB
DestructiveIdempotent

Delete an uploaded file. Permanent: files keep no history.

Inputs: path (required), workspace.

delete_pageA
DestructiveIdempotent

Delete a page. Its history is kept, and the result says how to restore it. Returns the pages whose links to it are now broken.

Inputs: path (required), agent (required), note, workspace, +1 more.

edit_pageA

Change part of a page. old_text replaces an exact string, which must be unique unless replace_all. section alone replaces that whole section, heading included; with old_text, old_text need only be unique within it. Empty new_text deletes.

Inputs: path (required), agent (required), new_text (required), note, +5 more.

list_filesB
Read-onlyIdempotent

List the wiki's uploaded files, or one folder's, with size, type and last change.

Inputs: folder, workspace.

list_pagesA
Read-onlyIdempotent

List the wiki's pages, or one folder's, with title, a one-line description (frontmatter description: if set, else the first sentence), word count and last change, in path order, 200 at a time. When more remain it gives next_offset and the subfolders with their page counts. Uploaded files are in list_files.

Inputs: limit, folder, offset, workspace.

list_workspacesA
Read-onlyIdempotent

The workspaces this key can reach, acting as its person: this one, the others they are a member of (read and write), and those that share pages with them (read-only, with what each shares). Pass one's handle as workspace to any tool to act there.

Inputs: no named parameters.

move_pageA

Rename or move a page, rewriting the links to it (unless update_links is false). Fails if new_path exists.

Inputs: path (required), agent (required), new_path (required), note, +2 more.

page_historyA
Read-onlyIdempotent

A page's revisions, newest first, or without path the wiki's latest changes: when, op, agent, person (the account behind it), author (API key or app), note, version. agent filters to one agent. Works for deleted pages.

Inputs: path, agent, limit, workspace.

read_pageA
Read-onlyIdempotent

Read a page: a JSON header (version, to pass back as base_version; links in and out; broken links), then the markdown as plain text. Read part of a long page with outline=true (headings and line numbers), section (one heading's section), or offset and limit (lines). One read returns at most 128 KB; next_offset continues. revision reads a past version from page_history. On an uploaded file's path it returns the image, or a document's text.

Inputs: path (required), limit, offset, outline, +3 more.

search_pagesA
Read-onlyIdempotent

Search the wiki's paths, titles and text. Matches every word (common words dropped, substrings count), best first; "quoted text" matches exactly; regex=true takes a Python regular expression. Returns pages with matching lines and line numbers. Search before answering about the workspace and before creating a page.

Inputs: query (required), limit, regex, folder, +3 more.

set_visibilityA
Idempotent

Who can open a page, a folder (everything under it) or the whole wiki (empty path), or change it. restricted: members, and people it was shared with by email. link: anyone with its url can read it; search engines are asked not to list it. published: public and listed on dexio.wiki, where anyone can find it and copy it, and search engines list it; a folder or the wiki only, with title and description for the listing. Without visibility it reports and changes nothing. A folder's or the wiki's wider setting still applies to what is in it. Opening something to the public is for when the person asks for it.

Inputs: kind, path, title, workspace, +2 more.

upload_fileA
Idempotent

Get a one-time URL for uploading a file (image, PDF, deck, anything up to 100 MB) to path, e.g. raw/deck.pdf, then PUT the file to it from a shell: curl -T FILE URL. It works once, for 15 minutes, and replaces a file at path. Pages link to files by path.

Inputs: path (required), agent (required), note, workspace.

wiki_healthB
Read-onlyIdempotent

Check the wiki: broken links (the only problems), and as information: missing pages most linked to (wanted), pages that may be stale (past their stale_after date, or unchanged stale_days while pages they link to changed), pages named without a link (unlinked_mentions), pages over long_page_words, the most linked pages, and pages with no links.

Inputs: workspace, stale_days, long_page_words.

write_pageA
Idempotent

Create a page or replace its whole text. If a page on the topic exists, use edit_page. base_version makes the write fail if the page changed since you read it.

Inputs: path (required), text (required), agent (required), note, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 16 tools

    Disambiguation4/5

    Most tools target a distinct resource+action: page CRUD (read/write/edit/append/delete/move), file ops, search, history, health, visibility. The main overlap is write_page vs edit_page vs append_page, which the descriptions clarify (whole replace, partial, end-append), and change_pages explicitly reframes those same operations as a batch, so boundaries are mostly clear but require reading.

    Naming Consistency4/5

    Almost all names follow a consistent snake_case verb_noun pattern (list_pages, read_page, write_page, edit_page, delete_page, move_page, upload_file, set_visibility). Minor deviations are the noun-only names wiki_health and page_history, which still fit the vocabulary and remain readable.

    Tool Count4/5

    16 tools is slightly above the ideal band but well-scoped for a full wiki: page lifecycle, file handling, search, history, health, batch changes, and visibility each earn their place. No redundant or trivial tools inflate the count.

    Completeness4/5

    Strong lifecycle coverage: read/write/edit/append/delete/move pages, upload/delete/list files, search, revision history, health checks, batch changes, and visibility control. Minor gaps exist (no explicit page-restore or file rename/move tool, and file read is folded into read_page), but core workflows have no dead ends.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    Appeared in Searches