Skip to main content
Glama
Draco-Cheng

ai-readme-manager

by Draco-Cheng
README.md
# AI_README MCP Server

> Project memory for AI assistants β€” the conventions, traps, and hard-won lessons your code cannot tell them

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue)](https://www.typescriptlang.org/)
[![Node](https://img.shields.io/badge/Node.js-18+-green)](https://nodejs.org/)

## πŸ“‘ Quick Navigation


- [AI_README vs. CLAUDE.md](#-ai_readme-vs-claudemd)
- [Installation & Setup](#-installation--setup)
  - [For Claude Code](#for-claude-code-vscode-extension)
  - [For Cursor](#for-cursor)
  - [For GitHub Copilot](#for-github-copilot-vscode-1102)
  - [For Claude Desktop](#for-claude-desktop-application)
  - [For OpenClaw](#for-openclaw)
  - [Alternative Installation Methods](#alternative-installation-methods)
- [Quick Start](#-quick-start)
- [Manual Creation & Editing](#️-manual-creation--editing)
- [Configuration (`.aireadme.config.json`)](#️-configuration-aireadmeconfigjson)
- [Validate & Compress AI_README Files](#️-validate--compress-ai_readme-files)
- [Multi-Level AI_README](#multi-level-ai_readme-not-just-for-monorepos)
- [Available MCP Tools](#️-available-mcp-tools)


---

## πŸ“‹ Overview

**AI_README MCP Server** is a Model Context Protocol (MCP) server that gives AI assistants a persistent, per-directory memory of your project β€” not just its coding conventions, but the silent-failure traps and post-mortem lessons that are invisible in the source. It discovers, routes, and manages `AI_README.md` files so that knowledge earned once is not lost, and the same bug is not reintroduced six months later.

**Works with:** GitHub Copilot (VSCode 1.102+), Claude Code, Cursor, OpenClaw, and other MCP-compatible AI tools.

---

## 🎯 The Problem

**Your AI assistant starts every session with no memory of the last one.**

It re-reads the code, re-derives what it can, and re-makes the same wrong call β€” because the reasoning that would have stopped it was never written anywhere it can see. You correct it. The session ends. The correction is gone.

Every project accumulates knowledge that **is not visible in the code**:

- πŸ’£ **Hard-won lessons** - The code shows which library you use. It does not show the three you tried first, or why they failed.
- πŸ•³οΈ **Silent-failure traps** - Some mistakes throw no error. They just quietly stop working, and nobody notices for a week.
- ⚰️ **Deliberate oddities** - That duplicated-looking field, that extra `await`, that retry that seems unnecessary. Each one is load-bearing, and none of them look it.
- πŸ” **Mistakes that repeat** - The AI "cleans up" the workaround, reintroducing the exact bug it was working around.
- 🧠 **Knowledge that lives in one person's head** - and leaves with them.

An AI reading your code sees **what it does today**. It cannot see what you already tried, what broke, or why the obvious approach was rejected. So it confidently suggests the thing you learned not to do.

## πŸ’‘ The Solution

**AI_README.md** - a per-directory memory file holding what the code cannot say: conventions, plus the traps and post-mortem lessons that stop the same bug being reintroduced.

You have probably had this conversation:

> **You:** This retry loop looks redundant, clean it up.
> **AI:** Done, simplified.
> *(three days later, the flaky upload bug is back)*

The loop was working around a provider that returns `200` before the file is durable. That lived in a Slack thread and one engineer's memory β€” invisible to the AI, so it removed it. Next month a different session removes it again.

| The situation | The line that prevents it |
|---|---|
| AI "simplifies" a workaround back into the bug it was avoiding | `Retry loop is required β€” provider returns 200 before the file is durable` |
| AI picks the library you already migrated off | `Use date-fns, NOT moment β€” moment mutates in place and caused the timezone bug` |
| AI adds a field the API silently ignores | `PATCH ignores unknown fields, returns 200 β€” always verify with a follow-up GET` |
| AI "fixes" an odd-looking sort | `NULLs sort last via a boolean key, never NULLS LAST β€” unsupported on SQLite` |
| AI removes a "pointless" `await` | `Must await β€” the handler commits, and the caller reads in the same transaction` |

The pattern is always the same: **something looks wrong but is deliberate**, and the reason lives outside the code.

<details>
<summary><b>Real entries from a production monorepo</b> (20 AI_README files, 5 directory levels)</summary>

Terse by design β€” written for an AI to load, not a human to browse.

| Entry | Why it exists |
|---|---|
| `Manifest name CANNOT be localized - browser fetches it once at install with no Accept-Language, and the installed home-screen name is frozen` | Ship it wrong and every existing install keeps the wrong name. No deploy fixes it. |
| `Order.items needs a NEW list assigned - an in-place mutation is invisible to the ORM and silently dropped at flush` | The natural way to write it throws no error and saves nothing. |
| `Column stays nullable, never backfilled - stamping the current time at deploy invalidates every existing session` | Looks like harmless data hygiene. Is a site-wide forced logout. |
| `search_products returns the SKU list, not a count - given a bare count the model invents plausible SKUs` | Found the way these things usually are: in an incident review. |

The code shows the fix, never the failure that motivated it.

</details>

### How It Works

1. **Create** `AI_README.md` files in your project (root or specific directories)
2. **Record** conventions and hard-won lessons - especially anything that fails silently
3. **Commit to git** - the knowledge outlives the person who earned it
4. **AI pulls the relevant ones** before planning or editing - including before a file is opened
5. **AI writes back** - lessons get recorded on the spot, through a validated channel

### What This MCP Server Does

- πŸ” **Auto-discovers** all AI_README.md files in your project
- 🎯 **Routes context** - the relevant parent chain for the code being edited
- πŸš€ **Guided initialization** - `init_ai_readme` scans for empty files and guides population
- ✏️ **Captures lessons in-flow** - the moment a trap is found, `update_ai_readme` records it
- βœ… **Reviews every write** - validation, conflict detection, quality scoring
- πŸ—œοΈ **Keeps it dense** - token budget enforcement with compression and splitting

**Result:** the same bug does not get reintroduced six months later by an AI that never saw the post-mortem.

---

## πŸ†š AI_README vs. CLAUDE.md

> **"Can't I just write a CLAUDE.md?"** β€” For conventions, often yes. The difference is **where the knowledge comes from**.

CLAUDE.md is written by a human, up front. That fits rules you already know: which tools to call, how to run the tests.

But the knowledge worth most in a mature codebase isn't knowable up front. Nobody writes *"kube-proxy rewrites the source address before Traefik fills XFF, so `externalTrafficPolicy` must be `Local`"* on day one. That's learned at 2am β€” and the one who learned it alongside you was the AI. AI_README captures it in that moment, through a channel that reviews the write.

| | CLAUDE.md | AI_README |
|---|---|---|
| **Typical content** | Instructions you know in advance | Lessons learned by breaking things |
| **Authored by** | Humans, up front | AI, at the moment of discovery |
| **Write path** | Free-form text editing | `update_ai_readme` only |
| **Review on write** | None | Validation + conflict detection + quality score |
| **Token budget** | Unmanaged β€” grows until it crowds out code | `tokenBudget`, with compress / split / rewrite |
| **Nesting** | Yes | Yes |
| **Subdirectory rules** | Not in context until you work in that directory | Retrieved on demand, for any path |

**The reviewed write path** is what keeps the file from rotting. Most important is conflict detection: if a request contradicts a recorded lesson, the AI **stops and asks** instead of quietly rewriting the rule β€” which is exactly what stops it "fixing" a workaround back into the bug it was avoiding.

**On-demand retrieval** closes a planning-time gap. Both formats nest, but a subdirectory's rules only reach the AI once it works in that directory. `get_context_for_file` returns the full parent chain for any path, before a file is opened β€” so conflicts surface while changing course is still cheap.

<details>
<summary>The experiment behind that claim</summary>

A root `CLAUDE.md` plus `apps/frontend/CLAUDE.md` holding one rule, "use CSS Modules only":

- **At session start, nothing opened:** the AI listed only the root file's contents. The frontend rule was not in context.
- **Asked to plan a refactor in that directory without reading files:** it could not name a styling approach β€” picking one "would be an invention", in its own words β€” and listed *"whether `apps/frontend/` has its own CLAUDE.md"* among what it would need to check. It inferred the file might exist but could not see inside it.

</details>

**Why this compounds:** conventions are roughly fixed, but lessons accumulate for as long as the project lives β€” each one a bug that cannot return the same way twice. As AI drafts more of the work, stability depends less on any single model's reasoning and more on whether hard-won knowledge is reachable when it's needed β€” by an assistant that never saw this codebase, won't remember today tomorrow, and can't read the Slack thread where the decision was made.

Conventions make AI output *consistent*. Recorded lessons make it *not regress*.

**Use both.** This project ships both: the rule that makes this server work β€” *"call `get_context_for_file` before any code-related task"* β€” lives in CLAUDE.md, because it must apply before any MCP tool runs. **CLAUDE.md drives the workflow; AI_README holds what the project taught you.**

---

## ✨ Features

- πŸ” **Automatic Discovery** - Scan and index all AI_README.md files in your project
- 🎯 **Smart Context Routing** - Find relevant README content based on file paths
- 🀝 **Team Consistency** - Every team member's AI assistant reads the same conventions from git, ensuring uniform code quality
- πŸš€ **Guided Initialization** - `init_ai_readme` tool scans for empty files and guides AI through population
- πŸ’£ **Captures Hard-Won Lessons** - records the trap the moment you hit it, so the fix is never quietly undone
- πŸ›‘ **Conflict Detection** - if a request contradicts a recorded lesson, the AI stops and asks instead of overwriting it
- πŸ”„ **Update & Sync** - AI can both read and update AI_README files
- βœ… **Validation & Quality** - Ensure README consistency with token limits and structure checks
- πŸ—œοΈ **Auto-Compression** - `compress_ai_readme` removes filler language and verbose phrases automatically, reducing token footprint without losing information
- πŸ—οΈ **Monorepo Support** - Place AI_README.md files at different folder levels; the tool automatically finds and uses the most relevant one
- πŸ“¦ **Easy Integration** - Works seamlessly with Cursor, Claude Code, and other MCP clients

---

## πŸš€ Installation & Setup

### For Claude Code (VSCode Extension)

> **πŸ’‘ Model Recommendation:** For the best experience, use larger models (Sonnet or Opus) which have stronger instruction-following capabilities and more reliably trigger MCP tools. Smaller models like Haiku may not consistently call the tools when appropriate.

**Step 1: Add MCP Server**

In your project directory, run:

```bash
claude mcp add --scope project ai-readme-manager npx -- ai-readme-mcp@latest
```

This creates a `.mcp.json` file that uses `npx` to run the package - no installation or path configuration needed!

**Step 2: Enable Project MCP Servers**

Create or edit `.claude/settings.local.json` in your project:

```json
{
  "enableAllProjectMcpServers": true
}
```

**Step 3: Auto-approve MCP Tools (Optional but Recommended)**

To avoid "Yes/No" prompts every time and enable "Yes, Do not ask again" option, add the tools to your allow list.

In `.claude/settings.local.json`, add:

```json
{
  "permissions": {
    "allow": [
      "mcp__ai-readme-manager__discover_ai_readmes",
      "mcp__ai-readme-manager__get_context_for_file",
      "mcp__ai-readme-manager__update_ai_readme",
      "mcp__ai-readme-manager__validate_ai_readmes",
      "mcp__ai-readme-manager__init_ai_readme",
      "mcp__ai-readme-manager__compress_ai_readme"
    ]
  },
  "enableAllProjectMcpServers": true
}
```

> **Note:** Without this configuration, you'll be prompted for approval every time Claude uses these tools, and the "Do not ask again" option won't appear.

**Step 4: Verify Installation**

```bash
claude mcp get ai-readme-manager
```

You should see `Status: βœ“ Connected`

**Step 5: Add `CLAUDE.md` Instructions**

Add the following to your project's `CLAUDE.md` to ensure Claude consistently calls the MCP tools before every code task:

```markdown
## MCP: ai-readme-manager
Before any code-related task, ALWAYS call `mcp__ai-readme-manager__get_context_for_file(projectRoot, path)` first.
If `get_context_for_file` reports empty or missing AI_README files, call `mcp__ai-readme-manager__init_ai_readme(projectRoot)` to initialize them.
If the user's request or your plan conflicts with AI_README conventions (including during planning), STOP and call `mcp__ai-readme-manager__update_ai_readme` to resolve the conflict before proceeding.
When establishing new conventions or making architectural decisions, call `mcp__ai-readme-manager__update_ai_readme` to record them.
Convention used in 2+ files AND non-obvious (AI'd get it wrong from code alone) β†’ call `mcp__ai-readme-manager__update_ai_readme` to record it. Bulleted keywords, not prose; 1 "- " bullet = 1 fact (+why only if it stops reversion); fragments. Record only the fact AI can't see in code β€” not where it lives, what toggles it, or how it works (those β†’ "See <file>."). A run-on chaining facts with ";"/"then" is a wall β€” break it into bullets, don't grow it.
NEVER edit AI_README.md files directly with Write/Edit/other file-editing tools β€” always use `mcp__ai-readme-manager__update_ai_readme`. Direct edits bypass validation, conflict detection, and quality scoring.
```

> **Why this matters:** Without `CLAUDE.md`, Claude may skip calling the MCP tools, causing it to generate code that ignores your project's conventions. This step is essential for reliable tool triggering.

### For Cursor

Add to Cursor's MCP configuration file:
- **Windows:** `%APPDATA%\Cursor\User\mcp.json`
- **macOS/Linux:** `~/.cursor/mcp.json`

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "command": "npx",
      "args": ["ai-readme-mcp@latest"]
    }
  }
}
```

After configuring, restart Cursor completely.

**Add `AGENTS.md` Instructions**

Add the following to your project's `AGENTS.md` to ensure Cursor consistently uses the MCP tools before every code task:

```markdown
## MCP: ai-readme-manager
Before any code-related task, ALWAYS call `get_context_for_file(projectRoot, path)` first.
If `get_context_for_file` reports empty or missing AI_README files, call `init_ai_readme(projectRoot)` to initialize them.
If the user's request or your plan conflicts with AI_README conventions (including during planning), STOP and call `update_ai_readme` to resolve the conflict before proceeding.
When establishing new conventions or making architectural decisions, call `update_ai_readme` to record them.
Convention used in 2+ files AND non-obvious (AI'd get it wrong from code alone) β†’ call `update_ai_readme` to record it. Bulleted keywords, not prose; 1 "- " bullet = 1 fact (+why only if it stops reversion); fragments. Record only the fact AI can't see in code β€” not where it lives, what toggles it, or how it works (those β†’ "See <file>."). A run-on chaining facts with ";"/"then" is a wall β€” break it into bullets, don't grow it.
NEVER edit AI_README.md files directly with Write/Edit/other file-editing tools β€” always use `update_ai_readme`. Direct edits bypass validation, conflict detection, and quality scoring.
```

### For GitHub Copilot (VSCode 1.102+)

**Requirements:**
- VSCode 1.102 or later
- GitHub Copilot & Copilot Chat extensions installed

**Option 1: Using VSCode Settings UI**

1. Open VSCode Settings (Ctrl+,)
2. Search for "MCP"
3. Click "Edit in settings.json"
4. Add the MCP server configuration

**Option 2: Manual Configuration**

Add to your VSCode `settings.json`:

```json
{
  "github.copilot.chat.mcp.servers": {
    "ai-readme-manager": {
      "command": "npx",
      "args": ["ai-readme-mcp@latest"]
    }
  }
}
```

After configuring, restart VSCode and you'll see the MCP tools available in GitHub Copilot Chat!

**Add `.github/copilot-instructions.md` Instructions**

Create `.github/copilot-instructions.md` in your project to ensure Copilot consistently uses the MCP tools before every code task:

```markdown
## MCP: ai-readme-manager
Before any code-related task, ALWAYS call `get_context_for_file(projectRoot, path)` first.
If `get_context_for_file` reports empty or missing AI_README files, call `init_ai_readme(projectRoot)` to initialize them.
If the user's request or your plan conflicts with AI_README conventions (including during planning), STOP and call `update_ai_readme` to resolve the conflict before proceeding.
When establishing new conventions or making architectural decisions, call `update_ai_readme` to record them.
Convention used in 2+ files AND non-obvious (AI'd get it wrong from code alone) β†’ call `update_ai_readme` to record it. Bulleted keywords, not prose; 1 "- " bullet = 1 fact (+why only if it stops reversion); fragments. Record only the fact AI can't see in code β€” not where it lives, what toggles it, or how it works (those β†’ "See <file>."). A run-on chaining facts with ";"/"then" is a wall β€” break it into bullets, don't grow it.
NEVER edit AI_README.md files directly with Write/Edit/other file-editing tools β€” always use `update_ai_readme`. Direct edits bypass validation, conflict detection, and quality scoring.
```

### For Claude Desktop Application

Add to `claude_desktop_config.json`:
- **Windows:** `%APPDATA%\claude\claude_desktop_config.json`
- **macOS:** `~/Library/Application Support/Claude/config.json`
- **Linux:** `~/.config/claude/config.json`

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "command": "npx",
      "args": ["ai-readme-mcp@latest"]
    }
  }
}
```

**Add `CLAUDE.md` Instructions**

Add the following to your project's `CLAUDE.md` to ensure Claude Desktop consistently uses the MCP tools before every code task:

```markdown
## MCP: ai-readme-manager
Before any code-related task, ALWAYS call `get_context_for_file(projectRoot, path)` first.
If `get_context_for_file` reports empty or missing AI_README files, call `init_ai_readme(projectRoot)` to initialize them.
If the user's request or your plan conflicts with AI_README conventions (including during planning), STOP and call `update_ai_readme` to resolve the conflict before proceeding.
When establishing new conventions or making architectural decisions, call `update_ai_readme` to record them.
Convention used in 2+ files AND non-obvious (AI'd get it wrong from code alone) β†’ call `update_ai_readme` to record it. Bulleted keywords, not prose; 1 "- " bullet = 1 fact (+why only if it stops reversion); fragments. Record only the fact AI can't see in code β€” not where it lives, what toggles it, or how it works (those β†’ "See <file>."). A run-on chaining facts with ";"/"then" is a wall β€” break it into bullets, don't grow it.
NEVER edit AI_README.md files directly with Write/Edit/other file-editing tools β€” always use `update_ai_readme`. Direct edits bypass validation, conflict detection, and quality scoring.
```

### For OpenClaw

> **Perfect for vibe coding / iterative AI development** β€” OpenClaw users often run AI agents in tight loops to build or refactor code. Without persistent context, each iteration risks breaking conventions set in previous rounds. `ai-readme-mcp` gives your agent a stable memory of project rules across every loop.

**Option 1: CLI (Recommended)**

```bash
openclaw mcp set ai-readme-manager '{"command":"npx","args":["ai-readme-mcp@latest"]}'
```

**Option 2: Edit config file directly**

Add to `~/.openclaw/openclaw.json`:

```json
{
  "mcp": {
    "servers": {
      "ai-readme-manager": {
        "command": "npx",
        "args": ["ai-readme-mcp@latest"]
      }
    }
  }
}
```

After configuring, restart OpenClaw to load the new MCP server. Verify with:

```bash
openclaw mcp list
```

**Add skill instructions**

To ensure OpenClaw's agent consistently reads project conventions before each code change, add the following to your skill or system prompt:

```markdown
## MCP: ai-readme-manager
Before any code-related task, ALWAYS call `get_context_for_file(projectRoot, path)` first.
If `get_context_for_file` reports empty or missing AI_README files, call `init_ai_readme(projectRoot)` to initialize them.
If the user's request or your plan conflicts with AI_README conventions (including during planning), STOP and call `update_ai_readme` to resolve the conflict before proceeding.
When establishing new conventions or making architectural decisions, call `update_ai_readme` to record them.
Convention used in 2+ files AND non-obvious (AI'd get it wrong from code alone) β†’ call `update_ai_readme` to record it. Bulleted keywords, not prose; 1 "- " bullet = 1 fact (+why only if it stops reversion); fragments. Record only the fact AI can't see in code β€” not where it lives, what toggles it, or how it works (those β†’ "See <file>."). A run-on chaining facts with ";"/"then" is a wall β€” break it into bullets, don't grow it.
NEVER edit AI_README.md files directly with Write/Edit/other file-editing tools β€” always use `update_ai_readme`. Direct edits bypass validation, conflict detection, and quality scoring.
```

> **Why this matters for iterative agents:** In agentic loops, each iteration is a fresh context. Without `AI_README.md`, the agent has no memory of decisions made in previous rounds β€” leading to style drift, conflicting patterns, and regressions. `ai-readme-mcp` acts as the persistent memory layer that keeps every loop grounded in the same conventions.

### Alternative Installation Methods

The above methods use `npx` (recommended). If you prefer other approaches, you can use these configurations in your MCP config file:
- **Claude Code:** `.mcp.json` (project root)
- **Cursor:** `%APPDATA%\Cursor\User\mcp.json` (Windows) or `~/.cursor/mcp.json` (macOS/Linux)
- **Claude Desktop:** `claude_desktop_config.json` (see paths above)

**Option 1: Using npx (Recommended)**

No installation needed! Just configure and use via npx:

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "command": "npx",
      "args": ["ai-readme-mcp@latest"]
    }
  }
}
```

> The `-y` flag automatically accepts the npx prompt. The `@latest` ensures you always get the newest version.

**Option 2: Global Installation**

Install once globally, use everywhere:

```bash
npm install -g ai-readme-mcp@latest
```

Then configure:

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "command": "ai-readme-mcp"
    }
  }
}
```

> **Pros:** Faster startup (no npx download). **Cons:** Need to manually update when new versions release.

> **Don't forget:** After configuring the MCP server, add the instructions file for your AI tool β€” see the setup section for your specific client above (`CLAUDE.md`, `AGENTS.md`, or `.github/copilot-instructions.md`).

---

## πŸš€ Quick Start

Use the `init_ai_readme` tool to automatically scan and populate empty AI_README files:

**Step 1:** Create empty AI_README.md files where needed

```bash
# Example: Create empty AI_READMEs in different directories
touch AI_README.md
touch apps/backend/AI_README.md
touch apps/frontend/AI_README.md
```

**Step 2:** Trigger the initialization

In your AI assistant (Claude Code, Cursor, etc.), simply say:

> "Please use the init_ai_readme MCP tool for this project"

**What happens:**
- πŸ” Scans your project for empty AI_README files
- πŸ“ Creates root-level AI_README if none exist
- πŸ“‹ Provides detailed step-by-step instructions for each file
- πŸ€– AI assistant will then:
  - Explore relevant directories
  - Analyze your codebase (tech stack, patterns, conventions)
  - Populate each AI_README with relevant documentation

**When to use `init_ai_readme`:**
- First time setting up AI_README in your project
- After creating new empty AI_README.md files in subdirectories
- When `get_context_for_file` detects empty AI_README files
- To batch-process multiple empty AI_README files

---

## ✏️ Manual Creation & Editing

You can always create and edit AI_README.md files yourself - **no tools required**. There's no required format; AI treats it as plain text, so even a single line works!

This is your project's documentation. Feel free to edit it anytime - whether you're setting up for the first time, adding new conventions, or correcting something the AI wrote.

**Simple examples that work perfectly:**

```markdown
Never use emoji in code or comments.
```

```markdown
Use Tailwind CSS, not inline styles.
Always use TypeScript strict mode.
```

```markdown
This is a Next.js 14 app with App Router.
Use server components by default.
Database: Prisma + PostgreSQL.
```

**Key point:** Write whatever helps AI understand your preferences. A few clear sentences are often better than lengthy documentation.

**Best Practices:**
- Keep it concise (< 400 tokens is ideal)
- Focus on conventions, not documentation
- Update as your project evolves - add new rules whenever you notice AI doing something wrong
- Review AI-made updates with `git diff AI_README.md` and edit freely
- Use AI to help maintain it, but you're always the final editor

---

## βš™οΈ Configuration (`.aireadme.config.json`)

Most projects need no config β€” the defaults target tight, AI-optimized files (< 400 tokens). But large monorepos often have directories whose conventions genuinely don't compress that far. Drop a `.aireadme.config.json` at your project root to raise the budget:

```json
{
  "tokenBudget": 800
}
```

**`tokenBudget` is the single knob.** Set it and *everything* scales with it β€” the quality-score thresholds, the "drifting / needs-rewrite" nudges, and the numbers printed in the over-budget prompts. You don't set five numbers; you set one.

> **It's a target, not a hard cap.** A file is never rejected or truncated for going over `tokenBudget` β€” crossing it earns a light "tighten this up" nudge, and validation only flags an *error* at double the budget. So a 420-token file under an 800 budget is perfectly fine.

| Tier | Formula | @ 400 (default) | @ 800 |
|---|---|---|---|
| Excellent | Β½ Γ— tokenBudget | 200 | 400 |
| Good (the target) | 1 Γ— tokenBudget | 400 | 800 |
| Warning | 1.5 Γ— tokenBudget | 600 | 1200 |
| Error | 2 Γ— tokenBudget | 800 | 1600 |

Omitting the file is identical to `{ "tokenBudget": 400 }` β€” existing projects see no change. Advanced overrides (`tokenLimits`, `rules`, `sectionSplitThreshold`) are still accepted and win over the derived values when set explicitly.

> Tip: prefer raising `tokenBudget` only when content is genuinely irreducible. If a single section dominates an over-budget file, the tool will suggest *splitting* it into a child-directory `AI_README.md` instead β€” that keeps each file tight without inflating the budget.

### Excluding directories

By default the scanner skips `node_modules`, `.git`, `dist`, `build`, `.next`, and `coverage`. To always ignore extra directories (e.g. generated code, a `legacy/` tree, or a `docs/` folder you don't want the agent to consult conventions for), add `excludePatterns`:

```json
{
  "excludePatterns": ["**/legacy/**", "**/docs/**"]
}
```

`excludePatterns` is a single "I don't care about this path" knob, applied two ways:

1. The scanner skips these directories (no AI_README inside them gets indexed).
2. `get_context_for_file` short-circuits when the file you're editing matches β€” no AI_README context (not even root) is injected. The tool returns a one-line note instead. This avoids forcing a heavy root AI_README on agents editing `docs/` or other non-code paths.

Built-in ignores (`node_modules` etc.) stay excluded on top of yours β€” you can't accidentally start scanning them. (Passing `excludePatterns` directly to a tool call still overrides the config for that one call.)

### Validation rules (optional)

Two rules are worth overriding for some teams:

```json
{
  "rules": {
    "allowCodeBlocks": true,
    "requireSections": ["## Conventions", "## Cross-directory dependencies"]
  }
}
```

- **`allowCodeBlocks`** (default `false`) β€” code fences are flagged by default because they burn tokens. Set `true` if a snippet genuinely belongs in your AI_README.
- **`requireSections`** (default none) β€” warn when a listed section heading is missing, e.g. to enforce a house template across every AI_README.

### Guidance level

The tool descriptions and the guidance appended to `get_context_for_file` are sent to the model **every turn**. If this server dominates your context budget, switch to `medium` β€” it trims the descriptions ~80% and drops the AI_README-writing guide from every read (that guidance still lives on `update_ai_readme`, where it's actually needed):

```json
{
  "guidanceLevel": "medium"
}
```

- **`high`** (default) β€” the full "call this every time" prompting. Best for smaller / less compliant models that need a push to call the tools.
- **`medium`** β€” much smaller footprint. Best for capable models (Opus/Sonnet) where the extra tokens are pure cost.

> **Read once at startup** from the `.aireadme.config.json` at the server's working directory, so a change needs a server restart to take effect. (Tool descriptions ship before any tool call, so this is the one setting read from cwd rather than a per-call `projectRoot`.) It only controls the server's prompt overhead β€” not what your AI_README files say or how validation behaves.

---

## πŸ—œοΈ Validate & Compress AI_README Files

Keep your AI_README files concise and token-efficient with a single prompt to your AI assistant:

> Validate and compress all AI_README files using `validate_ai_readmes` and `compress_ai_readme`.

The AI will automatically run the full cycle: `validate_ai_readmes` β†’ `compress_ai_readme` (dry-run preview) β†’ apply β†’ re-validate.

---

## Multi-Level AI_README (Not Just for Monorepos!)

**The power of this tool is multi-level documentation** - not just for monorepos, but for **any project** that wants to organize conventions by module or feature.

**Why multi-level?**
- 🎯 **Avoid bloated root README** - Keep each README focused and concise
- πŸ“ **Precise context** - AI gets only the relevant conventions for the code it's working on
- πŸ”§ **Flexible organization** - Organize by feature, module, or any structure that makes sense

Simply place `AI_README.md` files at different folder levels:

```
my-monorepo/
β”œβ”€β”€ AI_README.md                    # Root-level conventions (applies to all)
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ frontend/
β”‚   β”‚   β”œβ”€β”€ AI_README.md           # Frontend-specific conventions
β”‚   β”‚   └── src/components/Button.tsx
β”‚   └── backend/
β”‚       β”œβ”€β”€ AI_README.md           # Backend-specific conventions
β”‚       └── src/api/users.ts
└── packages/
    └── shared/
        β”œβ”€β”€ AI_README.md           # Shared library conventions
        └── src/utils.ts
```

**Smart Empty README Handling:**
- πŸ“ Create empty `AI_README.md` files in subdirectories where you need specific conventions
- πŸš€ Run `init_ai_readme` tool (just tell your AI: "Please initialize AI_README files")
- πŸ€– AI automatically analyzes each directory and populates conventions
- πŸ”— For subdirectories with parent READMEs, generates differential content (only module-specific conventions)
- πŸ“‹ For root directories, generates full project analysis

When AI works on a file, it automatically gets:
- The **most relevant** AI_README (closest parent directory)
- Plus the **root-level** AI_README (for project-wide standards)

For example, when editing `apps/frontend/src/components/Button.tsx`:
- βœ… Gets `apps/frontend/AI_README.md` (React component standards)
- βœ… Gets root `AI_README.md` (project-wide Git, testing conventions)

### Test the Integration

Restart your IDE, then ask your AI assistant:

> "I'm about to create a new component. What conventions should I follow?"

The AI will automatically retrieve your AI_README context!

For detailed setup instructions, see [Quick Start Guide](./docs/QUICK_START.md).

---

## πŸ—οΈ Project Structure

```
ai-readme-mcp/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts           # MCP Server entry point
β”‚   β”œβ”€β”€ tools/             # MCP Tools implementation
β”‚   β”œβ”€β”€ core/              # Core logic (scanner, router, updater)
β”‚   β”œβ”€β”€ types/             # TypeScript type definitions
β”‚   └── utils/             # Utility functions
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ unit/              # Unit tests
β”‚   β”œβ”€β”€ integration/       # Integration tests
β”‚   └── fixtures/          # Test fixtures
└── docs/                  # Documentation
```

## πŸ› οΈ Development

### Prerequisites

- Node.js 18+
- npm/pnpm/yarn
- TypeScript 5+

### Setup

```bash
# Clone the repository
git clone https://github.com/Draco-Cheng/ai-readme-mcp.git
cd ai-readme-mcp

# Install dependencies
npm install

# Run type checking
npm run typecheck

# Run tests
npm test

# Build the project
npm run build

# Development mode with watch
npm run dev
```

### Local Development Configuration

If you're developing or modifying the source code, configure your MCP client to use your local build:

**For Claude Code - Add with CLI:**

```bash
# Linux/macOS:
claude mcp add --transport stdio ai-readme-manager --scope project -- node ~/ai-readme-mcp/dist/index.js

# Windows:
claude mcp add --transport stdio ai-readme-manager --scope project -- node C:\Users\YourName\ai-readme-mcp\dist\index.js
```

**For Claude Code - Manual `.mcp.json`:**

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/ai-readme-mcp/dist/index.js"]
    }
  }
}
```

**For Cursor or Claude Desktop:**

```json
{
  "mcpServers": {
    "ai-readme-manager": {
      "command": "node",
      "args": ["/absolute/path/to/ai-readme-mcp/dist/index.js"]
    }
  }
}
```

**Path examples:**
- **Windows:** `"C:\\Users\\YourName\\ai-readme-mcp\\dist\\index.js"` (use `\\` for escaping)
- **macOS/Linux:** `"/home/username/ai-readme-mcp/dist/index.js"`

---

## πŸ“š Documentation

- **[Quick Start Guide](./docs/QUICK_START.md)** - Get started in 10 minutes
- **[Contributing Guide](./CONTRIBUTING.md)** - How to contribute
- [Project Specification](./docs/SPEC.md) - Complete technical specification

---

## πŸ› οΈ Available MCP Tools

### `discover_ai_readmes`

Scans your project and discovers all AI_README.md files.

```typescript
// Parameters
{
  projectRoot: string;           // Required: Project root directory
  excludePatterns?: string[];    // Optional: Glob patterns to exclude
}

// Returns
{
  projectRoot: string;
  totalFound: number;
  readmeFiles: Array<{
    path: string;
    scope: string;
    level: number;
    patterns: string[];
  }>;
  lastUpdated: string;
}
```

### `get_context_for_file`

Gets relevant AI_README context for a specific file path.

```typescript
// Parameters
{
  projectRoot: string;           // Required: Project root directory
  filePath: string;              // Required: File path relative to root
  includeRoot?: boolean;         // Optional: Include root README (default: true)
  excludePatterns?: string[];    // Optional: Glob patterns to exclude
}

// Returns
{
  filePath: string;
  totalContexts: number;
  contexts: Array<{
    path: string;
    relevance: 'root' | 'direct' | 'parent';
    distance: number;
    content: string;
  }>;
  formattedPrompt: string;       // Ready-to-use formatted context
}
```

### `update_ai_readme`

Update an AI_README.md file with specified operations.

```typescript
// Parameters
{
  readmePath: string;            // Required: Path to AI_README.md file
  projectRoot: string;           // Required: Project root (config is read from here)
  operations: Array<{            // Required: Update operations to perform
    type: 'append' | 'prepend' | 'replace' | 'insert-after' | 'insert-before';
    content: string;             // Content to add or replace
    section?: string;            // Section heading (for insert operations)
    searchText?: string;         // Text to search for (for replace)
  }>;
}

// Returns
{
  success: boolean;
  readmePath: string;
  changes: Array<{
    operation: string;
    section?: string;
    linesAdded: number;
    linesRemoved: number;
  }>;
  summary: string;               // Includes reminder to use git diff
  error?: string;                // Error message if failed
}
```

**Note:** Changes are written directly to the file. Use Git for version control:
- Review changes: `git diff AI_README.md`
- Undo changes: `git checkout AI_README.md`
- Commit changes: `git add AI_README.md && git commit -m "Update AI_README"`

**Example Usage:**

```typescript
// Append new section
{
  readmePath: "apps/frontend/AI_README.md",
  operations: [{
    type: "append",
    content: "## Performance\n- Use React.memo for expensive components"
  }]
}

// Insert after specific section
{
  readmePath: "AI_README.md",
  operations: [{
    type: "insert-after",
    section: "## Coding Conventions",
    content: "### Code Style\n- Use TypeScript strict mode\n- Prefer const over let"
  }]
}

// Replace specific text
{
  readmePath: "AI_README.md",
  operations: [{
    type: "replace",
    searchText: "Run tests with npm test",
    content: "Run tests with: `npm test` or `npm run test:watch`"
  }]
}
```

### `init_ai_readme`

Initialize and populate empty AI_README files in your project.

```typescript
// Parameters
{
  projectRoot: string;             // Required: Project root directory
  excludePatterns?: string[];      // Optional: Glob patterns to exclude
  targetPath?: string;             // Optional: Specific directory to initialize
}

// Returns
{
  success: boolean;
  message: string;
  readmesToInitialize: string[];   // Paths to empty AI_README files
  instructions: string;            // Detailed step-by-step guide for populating
}
```

**Features:**
- πŸ” Scans project for empty or missing AI_README files
- πŸ“ Creates root-level AI_README if none exist
- πŸ“‹ Generates detailed step-by-step instructions for each file
- 🎯 Can target specific directories with `targetPath` parameter
- πŸ€– Guides AI through analysis: tech stack, patterns, conventions

**Example Usage:**

```typescript
// Initialize all empty AI_READMEs in project
{
  projectRoot: "/path/to/project"
}

// Initialize only in specific directory
{
  projectRoot: "/path/to/project",
  targetPath: "apps/backend"
}
```

**Typical Workflow:**
1. AI assistant runs `init_ai_readme`
2. Receives detailed instructions for each empty file
3. Follows instructions:
   - Uses `Glob` to scan directory
   - Reads 2-5 key source files
   - Analyzes tech stack, patterns, conventions
4. Uses `update_ai_readme` to populate each file
5. Verifies with `get_context_for_file` or `validate_ai_readmes`

### `validate_ai_readmes`

Validate all AI_README.md files in your project for quality and token efficiency.

```typescript
// Parameters
{
  projectRoot: string;             // Required: Project root directory
  excludePatterns?: string[];      // Optional: Glob patterns to exclude
  config?: {                       // Optional: Custom validation config
    tokenBudget?: number;          // Single knob; derives the tiers below (default: 400)
    rules?: {
      requireH1?: boolean;
      requireSections?: string[];
      allowCodeBlocks?: boolean;
      maxLineLength?: number;
    };
    tokenLimits?: {
      excellent?: number;          // Default: 200
      good?: number;              // Default: 400
      warning?: number;           // Default: 600
      error?: number;             // Default: 800
    };
  };
}

// Returns
{
  valid: boolean;
  totalFiles: number;
  results: Array<{
    path: string;
    valid: boolean;
    tokens: number;
    rating: 'excellent' | 'good' | 'needs-improvement' | 'too-long';
    issues: string[];
    suggestions: string[];
  }>;
  summary: string;
}
```

**Validation Features**:
- Token counting for AI consumption optimization
- Structure validation (H1 heading, sections)
- Line length checks (default: 100 chars)
- Code block detection (disabled by default for strict mode)
- Quality ratings based on token count

**Default Token Limits (Strict Mode)**:
- 🌟 Excellent: < 200 tokens
- βœ… Good: < 400 tokens
- ⚠️ Needs improvement: < 600 tokens
- ❌ Too long: > 800 tokens

### `compress_ai_readme`

Compress an AI_README.md file using deterministic filler-language removal. No LLM call β€” pure regex transforms.

```typescript
// Parameters
{
  readmePath: string;    // Required: Absolute path to AI_README.md file
  projectRoot: string;   // Required: Project root (config is read from here)
  dryRun?: boolean;      // Optional: Preview changes without writing (default: false)
}

// Returns
{
  success: boolean;
  readmePath: string;
  summary: string;                  // Human-readable summary with token diff
  tokensBefore: number;
  tokensAfter: number;
  reductionPercent: number;
  changes: Array<{
    line: number;
    original: string;
    compressed: string;
    patterns: string[];             // Filler patterns that were removed
  }>;
  written: boolean;                 // false if dryRun or no changes found
}
```

**What it removes (prose only β€” code blocks are never touched):**
- Filler words: `just`, `really`, `basically`, `actually`, `simply`, `essentially`
- Verbose phrases: `in order to` β†’ `to`, `utilize` β†’ `use`, `make sure to` β†’ `ensure`
- Hedging: `you should`, `remember to`, `it might be worth`, `please note that`
- Fluff connectives: `furthermore`, `additionally`, `in addition`, `moreover`

**Output may contain sentence fragments β€” this is intentional.** Token-efficient format is valid for AI_README files.

**Typical Workflow:**
1. Run `validate_ai_readmes` β€” note any `filler-language` warnings
2. Run `compress_ai_readme` with `dryRun: true` to preview
3. Run again without `dryRun` to apply
4. Re-run `validate_ai_readmes` to confirm improvement

---

## 🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## πŸ“„ License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## πŸ”— Related Resources

- [Model Context Protocol Specification](https://spec.modelcontextprotocol.io/)
- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)
- [Claude Code MCP Documentation](https://docs.claude.com/en/docs/claude-code/mcp)

## πŸ“§ Contact

- GitHub Issues: https://github.com/Draco-Cheng/ai-readme-mcp/issues
- Project Link: https://github.com/Draco-Cheng/ai-readme-mcp

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct phase of the AI_README lifecycle: discover, initialize, read, update, validate, and compress. However, the get_context_for_file description embeds update_ai_readme instructions and workflow, which blurs the boundary between reading and writing context.

Naming Consistency4/5

Tool names generally follow a verb_noun pattern and are predictable. Minor inconsistencies exist: singular vs. plural forms (ai_readme vs. ai_readmes) and get_context_for_file does not mention ai_readme like the others do.

Tool Count5/5

Six tools is well-scoped for an AI_README manager. Each tool covers a necessary functionβ€”discovery, initialization, context retrieval, updates, validation, and compressionβ€”without redundant or extraneous additions.

Completeness5/5

The tool surface covers the full AI_README lifecycle: discover existing files, initialize missing ones, read context, update conventions, validate quality, and compress content. There are no major dead ends; even maintenance tasks are supported.

Maintenance

ActivityActive
ResponsivenessNo issues