GitHub

MCP codebase memory

A code graph remembers structure. A wiki remembers why.

Граф кода помнит структуру. Вики помнит почему.

go-wiki is a Markdown wiki with a full edit history, a REST API and a built-in MCP server. Long-term memory for agents working on a codebase: decisions, agreements and context, versioned and addressable.

go-wiki — Markdown-вики с полной историей правок, REST API и встроенным MCP-сервером. Долговременная память для агентов, работающих с кодовой базой: решения, договорённости и контекст, версионированные и адресуемые.

One Go binary · SQLite and .md files · no Postgres, no Redis, no Node

Один бинарник на Go · SQLite и .md файлы · ни Postgres, ни Redis, ни Node

Why it existsЗачем это сделано

The half of the memory a code graph does not hold

Половина памяти, которой нет у графа кода

An indexer remembers which functions exist and who calls whom. It does not remember why this library was chosen, what breaks when it is replaced, or which agreement stands behind a piece of code that looks strange. That knowledge lives in people's heads and in chat threads — the agent that comes to edit the code tomorrow never sees it.

Индексатор помнит, какие есть функции и кто кого вызывает. Он не помнит, почему выбрали эту библиотеку, что сломается при замене и какая договорённость стоит за странным на вид куском кода. Это знание живёт в головах и в переписке — агент, который завтра придёт править код, его не увидит.

Immutable addresses

Неизменяемые адреса

The pair (path, rev) points at the same text forever. Revisions are never rewritten, a restore appends a new one — such a pair is safe to store in a graph node.

Пара (path, rev) навсегда указывает на один и тот же текст. Ревизии не переписываются, восстановление добавляет новую — такую пару безопасно положить в узел графа.

Cheap change detection

Дешёвая проверка изменений

Every revision carries a sha256, and the format=stat mode answers with counters instead of the text. Re-indexing stays incremental.

У каждой ревизии есть sha256, а режим format=stat отвечает счётчиками без выкачивания текста. Переиндексация остаётся инкрементальной.

One source for people and agents

Один источник для людей и агентов

An edit from the browser, from REST and from MCP goes through the same versioning path. Changes made by an agent show up in the same history feed and the same diffs.

Правка из браузера, из REST и из MCP проходит через один механизм версионирования. Агентские изменения видны в той же ленте истории и в тех же diff-ах.

12
MCP toolsMCP-инструментов
14
REST endpointsREST-эндпоинтов
3
diff formats: unified, per-line, two columnsформата diff: unified, построчный, две колонки
0
external services: a binary and a data directoryвнешних сервисов: только бинарник и папка с данными

How storage worksКак устроено хранение

Current text in the database, history in files

В базе — актуальное, в файлах — история

SQLite keeps only the current version of a page. As soon as the page changes, the displaced version is written out to a separate .md file, and the database keeps a reference to it together with the author, the comment, the size and the checksum. Revision bodies never live in the database.

SQLite держит только текущую версию страницы. Как только страница меняется, вытесненная версия выгружается в отдельный .md файл, а в базе остаётся ссылка на него вместе с автором, комментарием, размером и контрольной суммой. Тела ревизий в базе не лежат никогда.

data/
├── wiki.db          # current versions
└── revisions/
    └── docs/setup/
        ├── r0001.md         # body of revision 1
        └── r0002.md         # body of revision 2
data/
├── wiki.db          # текущие версии
└── revisions/
    └── docs/setup/
        ├── r0001.md         # тело ревизии 1
        └── r0002.md         # тело ревизии 2
1

History outlives deletion

История переживает удаление

Deleting a page archives its last version first. The history of a deleted page stays readable.

Удаление сначала архивирует последнюю версию. История удалённой страницы остаётся читаемой.

2

Numbering does not reset

Нумерация не сбрасывается

Create the page again under the same path and revisions continue from where they stopped.

Если создать страницу заново по тому же пути, ревизии продолжатся с того места, где остановились.

3

The history is append-only

История append-only

A restore does not rewind the feed: the body of the old version is written as a new revision.

Восстановление не отматывает ленту: тело старой версии записывается новой ревизией.

MCP

Twelve tools, two transports

Двенадцать инструментов, два транспорта

The server announces itself as go-wiki, protocol 2025-06-18. It runs both as a subprocess over stdio and as streamable HTTP on /mcp — at the same time, over one storage.

Сервер объявляется как go-wiki, протокол 2025-06-18. Работает и как подпроцесс по stdio, и по streamable HTTP на /mcp — одновременно, поверх одного хранилища.

ToolИнструмент What it doesЧто делает
wiki_list_pagesA table of contents without page bodiesОглавление без тел страниц
wiki_searchSearch with filters by subtree, author, contributor and datesПоиск с фильтрами по разделу, автору, участнику и датам
wiki_get_pageRead a page or a specific revisionЧтение страницы или конкретной ревизии
wiki_create_pageCreate a new pageСоздание новой страницы
wiki_update_pageA new revision, guarded against races by base_revНовая ревизия, с защитой от гонок через base_rev
wiki_delete_pageDeletion that keeps the historyУдаление с сохранением истории
wiki_list_revisionsHistory: author, comment, size, sha256История: автор, комментарий, размер, sha256
wiki_diffCompare revisions: unified, per-line or counters onlyСравнение ревизий: unified, построчно или счётчиками
wiki_move_pageMove a page with its subtree, repointing links to itПеремещение страницы с поддеревом и обновление ссылок на него
wiki_treeChildren of one node with counters, level by levelДети одного узла со счётчиками, уровень за уровнем
wiki_list_authorsAuthors and edit counts — a hint for the filterАвторы и число правок — подсказка для фильтра
wiki_restore_revisionBring an old version back as a new revisionВозврат старой версии новой ревизией
# locally, as a subprocess of the agent
claude mcp add go-wiki -- /usr/local/bin/wiki -stdio -data /var/lib/go-wiki

# against an already deployed service
claude mcp add --transport http go-wiki http://wiki.internal:8080/mcp
# локально, как подпроцесс агента
claude mcp add go-wiki -- /usr/local/bin/wiki -stdio -data /var/lib/go-wiki

# к уже развёрнутому сервису
claude mcp add --transport http go-wiki http://wiki.internal:8080/mcp

REST API

Fourteen endpoints under /api/v1

Четырнадцать эндпоинтов под /api/v1

CRUD addresses a page by its path in the URL. Everything that needs a second coordinate — a revision number or a diff range — takes the page as the ?path= parameter, so the routes stay unambiguous even for a page named diff.

CRUD адресует страницу путём в URL. Всё, чему нужна вторая координата — номер ревизии или диапазон diff — принимает страницу параметром ?path=, поэтому маршруты остаются однозначными даже для страницы с именем diff.

# create a page
curl -X POST http://localhost:8080/api/v1/pages \
  -H 'Content-Type: application/json' \
  -d '{"path":"docs/setup","content":"# Setup\n","author":"n36"}'

# a ready patch between the previous and the current revision
curl 'http://localhost:8080/api/v1/diff?path=docs/setup&raw=1'

--- docs/setup@1
+++ docs/setup@2
@@ -1,4 +1,5 @@
  # Setup
- Step one.
+ Step one, clarified.
+ Step three.
# создать страницу
curl -X POST http://localhost:8080/api/v1/pages \
  -H 'Content-Type: application/json' \
  -d '{"path":"docs/setup","content":"# Установка\n","author":"n36"}'

# готовый патч между предыдущей и текущей ревизией
curl 'http://localhost:8080/api/v1/diff?path=docs/setup&raw=1'

--- docs/setup@1
+++ docs/setup@2
@@ -1,4 +1,5 @@
  # Установка
- Шаг один.
+ Шаг один, уточнённый.
+ Шаг три.

Quick startБыстрый старт

Two commands to build and run

Собрать и запустить — две команды

go build -o wiki ./cmd/wiki
./wiki -addr :8080 -data ./data

# UI      → http://localhost:8080
# REST    → http://localhost:8080/api/v1
# MCP     → http://localhost:8080/mcp
# stdio   → ./wiki -stdio -data ./data
go build -o wiki ./cmd/wiki
./wiki -addr :8080 -data ./data

# UI      → http://localhost:8080
# REST    → http://localhost:8080/api/v1
# MCP     → http://localhost:8080/mcp
# stdio   → ./wiki -stdio -data ./data

What is insideЧто внутри

Go 1.27 SQLite FTS5 MCP 2025-06-18 no CGOбез CGO goldmark GFM Apache 2.0

The web interface follows the BusinessPad design system: light and dark themes, responsive layout, a two-column diff with per-character highlighting inside a changed line.

Веб-интерфейс оформлен по дизайн-системе BusinessPad: светлая и тёмная темы, адаптивная вёрстка, diff в две колонки с посимвольной подсветкой внутри изменённой строки.