Catch the files you — or your AI agent — forgot to change. Learns from git history, warns before commit. MCP server + CLI.
git clone https://github.com/Byggarepop/UnwrittenMCP Servers overview
<!-- mcp-name: io.github.Byggarepop/unwritten -->
# Unwritten
[](https://www.nuget.org/packages/Unwritten) [](https://www.nuget.org/packages/Unwritten) [](https://github.com/Byggarepop/Unwritten/blob/main/LICENSE)
**Catch the files you — or your AI agent — forgot to change.** Unwritten learns
from your git history which files usually change together and warns when one is
missing from your edit: "you changed `OrderService.cs` but not
`OrderServiceTests.cs`, and they change together 94% of the time." It calls
these missing companions *holes*, and every warning comes with its confidence
score and real example commits as proof.
```text
1 possible hole(s):
src/Orders/OrderServiceTests.cs
expected because you changed src/Orders/OrderService.cs
confidence 0.826 (90 co-changes in 100 changes)
e.g. 3f2a1c9 Add surcharge handling to freight calculation
FAIL: at least one hole at confidence >= 0.70.
```
It runs as an **MCP server** so AI coding agents (Claude Code, Copilot) can check
their own edits mid-session, and as a **CLI** for pre-commit hooks.
One `dotnet tool execute`, an index in `.unwritten/`, no server, no subscription,
no tokens.
**Works on any language.** File-level rules only need git history, so hole
detection works the same on Python, TypeScript, Go, or mixed repos. C# repos
additionally get method-level rules and cosmetic-edit filtering; JSON files get
key-level noise filtering. Running the tool requires the
[.NET SDK](https://dotnet.microsoft.com/download) (10+), but the repos it
analyzes can be anything.
## Quick start
From your repo's root:
1. Warm up the index (optional — every command builds it on first use and keeps it current by itself; this just makes the first query fast).
```bash
dotnet tool execute Unwritten --yes -- reindex
```
2. Register as an MCP server (Claude Code):
```bash
claude mcp add unwritten -- dotnet tool execute Unwritten --yes -- mcp
```
3. (Recommended if using Claude Code) Make the check deterministic — a git pre-commit hook and a Claude Code Stop hook that feeds failing holes back to the agent before a commit is made:
```bash
dotnet tool execute Unwritten --yes -- install-hook --git --claude-code
```
That's it — your agent can now call `check_holes` after editing, and the hooks
catch the cases where it forgets to.
## See it in action
`stats` shows what the tool has learned — here, one file pair coupled strongly
enough (confidence ≥ 0.7) to block a commit if one side is missing:

After editing one file of that pair, `check` warns that its companion is
missing and spells out the three ways to resolve it — update the companion,
commit anyway, or mute the rule:

With the pre-commit hook installed, the same check runs automatically on every
commit and blocks it while the companion is still missing:

## Documentation
Everything else lives in **[docs/README.md](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md)**:
- [Background & the research behind it](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#this-is-not-a-new-idea--and-thats-the-point)
- [Why these thresholds (tested on real data)](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#why-these-thresholds-tested-on-real-data)
- [Use: MCP server, CLI, hooks, muting false rules](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#use)
- [Configuration reference](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#configuration--unwrittenconfigjson)
- [How it works](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#how-it-works)
- [What it does NOT do (yet)](https://github.com/Byggarepop/Unwritten/blob/main/docs/README.md#what-it-does-not-do-yet)
## License
[MIT](https://github.com/Byggarepop/Unwritten/blob/main/LICENSE)
What people ask about Unwritten
What is Byggarepop/Unwritten?
+
Byggarepop/Unwritten is mcp servers for the Claude AI ecosystem. Catch the files you — or your AI agent — forgot to change. Learns from git history, warns before commit. MCP server + CLI. It has 1 GitHub stars and was last updated today.
How do I install Unwritten?
+
You can install Unwritten by cloning the repository (https://github.com/Byggarepop/Unwritten) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is Byggarepop/Unwritten safe to use?
+
Byggarepop/Unwritten has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.
Who maintains Byggarepop/Unwritten?
+
Byggarepop/Unwritten is maintained by Byggarepop. The last recorded GitHub activity is from today, with 0 open issues.
Are there alternatives to Unwritten?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy Unwritten to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/byggarepop-unwritten)<a href="https://claudewave.com/repo/byggarepop-unwritten"><img src="https://claudewave.com/api/badge/byggarepop-unwritten" alt="Featured on ClaudeWave: Byggarepop/Unwritten" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
The fastest path to AI-powered full stack observability, even for lean teams.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!