evdboom256 downloadsTypography formatting and multi-format export for book projects written in Markdown.
Markdown book authoring toolkit: VS Code extension + Obsidian plugin for typography formatting and multi-format export, paired with an MCP server for full-text search and AI assistant integration.
This project started as a personal writing tool, born out of frustration with the copy-paste loop that most AI-assisted writing ends up as.
It started with Word and ChatGPT: writing a chapter, copying it into the browser, getting feedback, pasting it back. Versioning was an issue and keeping the ChatGPT project up to date with recent .docx files was a lot of work. Moving to VS Code and Markdown files seemed like the natural next step: plain text, version control, and the ability to plug in an MCP server so an agent like Codex could read the book directly.
In practice though, I still fell back to copy-pasting for feedback and only really used the tooling for typography formatting. Most VS Code extensions are built for coding: short iterations where the code is the truth, rather than the longer-running, chat-based sessions you get in web tools. That frustration is what pushed the VS Code extension into existence. At minimum, the formatting and exporting should just work without any ceremony.
The bigger shift came with Claude Cowork, which combines the session memory of a long-running agent with direct file access. That made the MCP server genuinely useful: the agent could navigate chapters, search for context, and keep track of the story across a session without being handed everything manually. The extension and MCP server now support both workflows: VS Code agents (Copilot, Codex, Claude for VS Code) and standalone Claude Desktop / Cowork. And a Obsidian plugin with the same functionality as the VS Code extension for users that don't work with a more development minded VS Code.
The Bindery extension provides:
.bindery/translations.json.bindery/settings.json plus Arc, Notes, Characters, SESSION, PREFERENCES, and memory scaffolding.vscode/mcp.json for Claude / CodexInstall from the VS Code Marketplace or:
cd vscode-ext
npm install
npm run compile
npx @vscode/vsce package
See vscode-ext/README.md for full documentation.
A Model Context Protocol server that exposes your book project to AI assistants. Pure Node.js.
BINDERY_OLLAMA_URL for semantic reranking, or enable a full semantic index for precomputed embedding searchbindery_get_review_text returns a structured git diff plus any regions wrapped in <!-- Bindery: Review start --> ... <!-- Bindery: Review stop --> markers (so committed work-in-progress can still be reviewed). bindery_git_snapshot saves progress as a git commit. Git is auto-initialized during workspace setup if available.bindery/translations.json, queryable and updatable by agentsbindery_init_workspace creates SESSION.md, PREFERENCES.md, Arc/index.md, Arc/Overall.md, Arc/Acts/, Notes/Inbox.md, Notes/Characters/index.md, structured note folders, and .bindery/memories/global.mdbindery_get_notes remains compatible with older recursive note layouts.bindery/memories/ files for cross-session decisions, with append, list, and compact operationsbindery_session_focus_* tools maintain the ephemeral working-state file SESSION.md (current focus, next actions, open questions, handoff); durable preferences live in the user-owned PREFERENCES.mdbindery_inbox_process enumerates loose items in Notes/Inbox.md and proposes destinations (read-only); bindery_inbox_resolve clears items after they are routed and confirmed — rough/pasted material goes to the Inbox, not memory--book Name=path CLI args or BINDERY_BOOKS env var; every tool call specifies which book to use by name (agents never see raw paths)bindery_identify_book with their working directory to discover their book name, even when mount paths differ from the configured pathsSee mcpb/README.md for the full tool reference and usage examples.
The Bindery Obsidian plugin provides the same feature set as the VS Code extension for Obsidian vault users:
.bindery/settings.json plus Arc, Notes, Characters, SESSION, PREFERENCES, and memory scaffoldingBuild and install:
cd obsidian-plugin
npm install
npm run compile
npm run bundle
# out/main.js is ready for manual Obsidian installation
Then in Obsidian: Settings → Community plugins (if not restricted) → Install from folder or manual install from out/main.js.
Release assets now include two MCP package formats:
bindery-<version>.mcpb for Claude Desktop / Coworkbindery-mcp-server-<version>.zip as a standalone MCP package for clients that support command + args + env setup (for example ChatGPT Work or LM Studio)Download the latest release from Releases — no build step needed.
Bindery: Initialize Workspace to create .bindery/settings.json, .bindery/translations.json, the generated .bindery/README.md capability reference, and the opinionated Arc / Notes / Characters / SESSION / PREFERENCES / memory scaffoldBindery: Register MCP Server to create .vscode/mcp.json (primarily for Claude/Codex discovery; not needed for GitHub Copilot Chat because the extension registers the tools automatically)bindery-mcp-*.mcpb from the latest releaseName=path pairs:
ScaryBook=C:\Users\My\Projects\ScaryBook;MyNovel=D:\Writing\MyNovelfull_semantic search with rebuild warnings when the embedding index becomes stale.bindery_list_books to discover book namesbindery-mcp-server-*.zip from the latest releasenodeserver/index.js from the unzipped folderBINDERY_BOOKS (required): semicolon-separated Name=path pairsBINDERY_OLLAMA_URL (optional): Ollama endpoint for semantic featuresBINDERY_ENABLE_SEMANTIC_INDEX (optional): true to enable full semantic index buildsBINDERY_DEFAULT_SEARCH_MODE (optional): lexical, semantic_rerank, or full_semanticBINDERY_MCP_LOCATION (optional): stable folder used by bindery_download_latest_mcp to download and unpack the latest standalone MCP ZIP (tool never edits client settings)bindery_health checks the latest GitHub release and reports installed vs latest version in its JSON response.bindery_health also reports can_auto_download_release and mcp_download_location based on BINDERY_MCP_LOCATION.bindery_download_latest_mcp is only for standalone ZIP-based MCP clients (for example ChatGPT Work or LM Studio), and only when BINDERY_MCP_LOCATION is configured..mcpb installer flow, not the ZIP updater tool.The following flow shows how Bindery's writing environments connect to agents, MCP, and skills at a high level.
flowchart TD
U([User])
subgraph IWE[Writing Environment]
VS[VS Code + Bindery Extension]
OB[Obsidian + Bindery Plugin]
AG[In-editor Agent]
end
subgraph AT[Bindery Agent Tools]
MCP[Bindery MCP Server]
SK[Bindery Skills]
end
CL["Claude Desktop (Cowork)"]
WB[Book Workspace Files]
U --> IWE
U --> CL
IWE --> WB
VS --> AG
OB --> AG
AG --> AT
CL --> AT
MCP --> WB
The VS Code extension and Obsidian plugin both work standalone — no server setup needed for typography formatting and export.
├── bindery-core/ Shared templates & types (TS)
│ ├── src/
│ │ └── templates/ AI instruction templates (claude, copilot, cursor, agents, skills)
│ └── package.json
├── bindery-merge/ Shared merge logic (TS)
│ ├── src/
│ │ ├── merge.ts Chapter discovery, merge, export via Pandoc/LibreOffice
│ │ └── tool-locate.ts Cross-platform tool path resolution
│ └── package.json
├── vscode-ext/ VS Code extension (TS)
│ ├── src/
│ ├── package.json
│ └── README.md
├── obsidian-plugin/ Obsidian plugin (TS)
│ ├── src/
│ ├── package.json
│ └── README.md
├── mcp-ts/ MCP server (Node.js / TS)
│ ├── src/
│ └── package.json
├── mcpb/ Claude Desktop extension
│ ├── manifest.json
│ └── server/ (CI-populated)
└── LICENSE
Shared logic in bindery-core and bindery-merge ensures both vscode-ext and obsidian-plugin implement identical functionality.
bindery_get_review_text, and bindery_git_snapshot. Auto-initialized during workspace setup.On all platforms the extension resolves tool paths in this order:
bindery.pandocPath / bindery.libreOfficePath user setting (if set and the file exists)PATH (where.exe on Windows, which elsewhere)%LOCALAPPDATA%\Pandoc\pandoc.exe, %ProgramFiles%\Pandoc\pandoc.exe, %ProgramFiles%\LibreOffice\program\soffice.exe/opt/homebrew/bin/pandoc, /usr/local/bin/pandoc, /Applications/LibreOffice.app/Contents/MacOS/soffice/usr/bin/pandoc, /usr/bin/libreofficeYou usually do not need to configure anything — install Pandoc/LibreOffice normally and exports will work. Use the bindery_health MCP tool to see what was detected and whether a newer Bindery release is available.
PATH (or at a standard install location) for bindery_get_review_text and bindery_git_snapshot. If git isn't found, these tools fail with a clear error; all other tools still work.BINDERY_OLLAMA_URL; optional tuning via BINDERY_OLLAMA_TIMEOUT_MS (default 15000) and BINDERY_OLLAMA_RETRIES (default 1).bindery_get_overview now flags gaps (e.g. chapters 1, 3 with no 2) as a warning.Bindery stays within your workspace, only if the optional Ollama URL is filled for the MCP server will texts be sent to Ollama for embedding / semantic search. The full privacy policy can be viewed at https://evdboom.nl/projects/bindery/privacy
MIT — see LICENSE.
vscode-ext/ and obsidian-plugin/ are two equal implementations of the same Bindery authoring toolkit. Both support:
.bindery/settings.json, .bindery/translations.json, generated .bindery/README.md, and the opinionated Arc / Notes / Characters / SESSION / PREFERENCES / memory scaffold<!-- Bindery: Review start/stop --> for agent feedbackBoth plugins share all core logic via @bindery/merge (chapter discovery, merge execution, tool path resolution) to minimize duplication and ensure consistent behavior. Shared templates in @bindery/core/src/templates/ feed both VS Code and Obsidian workflows.
Unless a change is intentionally host-specific, functional additions to one should be mirrored in the other in the same PR or a clearly linked follow-up PR.
The AI instruction file templates are maintained in one place only:
bindery-core/src/templates/*.ts ← SINGLE SOURCE OF TRUTH (one file per template)
mcp-ts/src/templates.ts is a thin re-export shim to keep existing imports stable. Consumers should continue importing from their local package entrypoint,
but template edits belong in the matching file under bindery-core/src/templates/.
After changing files under bindery-core/src/templates/, rebuild and test the workspace:
npm run build --workspace=bindery-core
npm test --workspace=bindery-core
npm test --workspace=mcp-ts
npm test --workspace=vscode-ext
npm test --workspace=obsidian-plugin
# Shared packages
cd bindery-core && npm test
cd bindery-merge && npm test
# MCP server
cd mcp-ts && npm test
# VS Code extension
cd vscode-ext && npm test
# Obsidian plugin
cd obsidian-plugin && npm test
The CI workflow (.github/workflows/ci.yml) runs on every push and pull request:
bindery-core, mcp-ts, vscode-ext, and obsidian-plugin (Ubuntu, Windows, macOS).scripts/check-tool-parity.mjs) and command parity guard (scripts/check-command-parity.mjs) on the coverage job.