Claude Error Collector
# Claude Error Collector
An MCP server for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) that learns from your corrections. When you tell Claude "that was wrong" or "no, do it like this", it records the lesson as a rule in your `CLAUDE.md` - so the same mistake doesn't happen twice.
## How It Works
1. You correct Claude during a coding session
2. Claude recognizes the correction and calls the `record_error` tool
3. The server derives a rule and writes it to the appropriate `CLAUDE.md`
4. Claude reads that rule in future sessions and avoids repeating the mistake
The server automatically detects whether you're in a project directory (writes to project `CLAUDE.md`) or your home directory (writes to `~/.claude/CLAUDE.md`).
## Tools
### `record_error`
Records a correction and saves it as a learned rule with metadata (date, category).
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `error_description` | string | yes | What was wrong |
| `correction` | string | yes | What is correct |
| `rule` | string | yes | Derived guideline, e.g. "ALWAYS use X instead of Y" |
| `category` | string | no | Rule category (e.g. "n8n", "bash", "google-workspace"). Auto-detected if omitted. |
| `project_dir` | string | no | Current working directory (for finding project CLAUDE.md) |
### `list_errors`
Lists all learned rules from the relevant `CLAUDE.md`. Supports filtering and grouping.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `category` | string | no | Filter rules by category |
| `grouped` | boolean | no | Group rules by category with headings |
| `project_dir` | string | no | Current working directory |
### `delete_rule`
Deletes a learned rule by index or substring match.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `index` | number | no* | 1-based index of the rule to delete |
| `match` | string | no* | Substring to match (must match exactly one rule) |
| `project_dir` | string | no | Current working directory |
*Exactly one of `index` or `match` must be provided.
### `update_rule`
Updates an existing rule's text, date, and optionally category.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `index` | number | no* | 1-based index of the rule to update |
| `match` | string | no* | Substring to match (must match exactly one rule) |
| `new_rule` | string | yes | The new rule text |
| `category` | string | no | New category (keeps existing if omitted) |
| `project_dir` | string | no | Current working directory |
*Exactly one of `index` or `match` must be provided.
### `review_rules`
Reviews all rules with their age for lifecycle management.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `older_than_days` | number | no | Threshold in days to consider "old" (default: 30) |
| `project_dir` | string | no | Current working directory |
## Output Format
Rules are stored in a `## Learned Rules` section in your `CLAUDE.md` with metadata as HTML comments:
```markdown
## Learned Rules
- Legacy rule without metadata (still supported)
### N8n
- Bei n8n IMMER nodeId verwenden <!-- @date:2026-02-15 @category:n8n -->
### Bash
- NEVER embed large JSON inline in Bash commands <!-- @date:2026-02-20 @category:bash -->
```
Metadata fields:
- `@date:YYYY-MM-DD` — when the rule was created/updated
- `@category:name` — rule category for grouping
Rules without metadata (legacy format) remain fully supported and appear at the top of the section without a category heading.
## Installation
```bash
git clone https://github.com/henningziech/claude-error-collector-mcp.git
cd claude-error-collector-mcp
npm install && npm run build
claude mcp add error-collector -s user -- node "$PWD/dist/index.js"
```
Restart Claude Code after installation. No manual `CLAUDE.md` editing needed — the server provides its own instructions to Claude via MCP server metadata.
## CLAUDE.md Resolution
The server finds the right `CLAUDE.md` using this logic:
1. If `project_dir` is provided: walk up the directory tree looking for `CLAUDE.md`
2. If found and not in the home directory: use it (project-level rules)
3. Fallback: `~/.claude/CLAUDE.md` (global rules)
## Duplicate Detection
Duplicate detection works on two levels:
1. **Server-side**: Before writing a rule, the server checks existing rules using case-insensitive substring matching. If the new rule is already covered by an existing one (or vice versa), it skips the write.
2. **Semantic (via instructions)**: The server instructs Claude to review existing learned rules for semantic equivalence *before* calling `record_error` — even if the wording differs. Claude will:
- **Skip silently** if the rule clearly already exists
- **Record it** if the rule is clearly new
- **Ask the user** if a similar rule exists but it's not 100% clear whether it's a duplicate, offering options to add alongside, consolidate, or skip
## License
MIT
TDQS
Scored across 2 tools
The two tools have completely distinct purposes: list_errors retrieves existing rules, while record_error adds new rules. There is no overlap in functionality, making it impossible to confuse them.
Both tools follow a consistent verb_noun pattern (list_errors, record_error) with clear action-object naming. The style is uniform throughout the set.
With only 2 tools, the server feels thin for error collection and learning. While it covers basic listing and recording, typical error management systems would benefit from additional operations like updating rules, deleting outdated ones, or searching/filtering errors.
The tools provide minimal CRUD coverage: create (record_error) and read (list_errors) are present, but update and delete operations are missing. This creates a dead-end where rules cannot be modified or removed once recorded, limiting practical utility.