Skip to main content
Glama
VMexicano
by VMexicano

๐Ÿงน token-filter-mcp

Your LLM is wasting 80% of its context window on noise. This fixes that.

npm version license node MCP

An MCP server that sits between your AI coding assistant and its tools, intelligently compressing outputs before they consume your precious context. Longer sessions. Better reasoning. Lower costs.


๐Ÿ’ธ The Problem Nobody Talks About

Every time your AI assistant runs a command, it dumps the entire raw output into its context window:

+ โœ“ src/auth.test.ts (14 tests)          โ† you don't need this
+ โœ“ src/utils.test.ts (8 tests)          โ† or this
+ โœ“ src/payments.test.ts (12 tests)      โ† or this
+ โœ“ src/users.test.ts (10 tests)         โ† or this
- โœ— src/orders.test.ts (3 tests)         โ† THIS is what matters
-   โ— should validate quantity > 0
-     Expected: error
-     Received: success

The vast majority of tool output is noise: tests that pass, git headers, resolution trees, progress bars, whitespace. ~80% of what goes into the context window is information the LLM will never act on.

That noise eats your context window, degrades reasoning quality, and costs you money.

Related MCP server: claw-tsaver

โšก The Solution

โŒ Without token-filter-mcp

  • Context fills up fast

  • LLM loses track of conversation

  • Paying for tokens it ignores

  • Sessions hit context limit early

  • Reads 14 lines to find 1 failure

โœ… With token-filter-mcp

  • Context stays lean

  • LLM maintains coherence longer

  • Only paying for useful tokens

  • Sessions last significantly longer

  • Reads exactly the failure, acts immediately

token-filter-mcp intercepts every tool output and applies intelligent, context-aware filtering โ€” returning only what the LLM actually needs to make decisions.

No configuration needed. No changes to your workflow. Just plug it in.

๐ŸŽฏ Real Results

Average savings across real-world tool outputs: 60-90% fewer tokens consumed

๐Ÿง  How It Works

flowchart LR
    A[๐Ÿค– LLM Agent] -->|tool call| B[๐Ÿงน token-filter-mcp]
    B -->|execute| C[๐Ÿ’ป System]
    C -->|raw output| B
    B -->|filtered output| A

    style B fill:#7c3aed,stroke:#5b21b6,color:#fff
    style A fill:#2563eb,stroke:#1d4ed8,color:#fff
    style C fill:#059669,stroke:#047857,color:#fff

1๏ธโƒฃ Detect โ€” Identifies what command was run (test runner? git? linter?)

2๏ธโƒฃ Execute โ€” Runs the command and captures full output

3๏ธโƒฃ Filter โ€” Applies the optimal strategy for that command type

4๏ธโƒฃ Verify โ€” Ensures no errors or actionable info was removed

5๏ธโƒฃ Return โ€” Sends compressed output to the LLM

๐ŸŽจ Contextual Detection

The server doesn't blindly truncate. It understands what you ran and applies the right strategy:

It detects...

And does this...

๐Ÿงช Test runners (jest, vitest, pytest, cargo test, go test)

Strips passing tests. Shows only failures with location + expected/received

๐Ÿ“Š git status

Converts to M 3 | A 1 | D 0 | ? 2 + file list

๐Ÿ“ git diff

Removes repeated headers, keeps only hunks with ยฑ3 context

๐Ÿ“œ git log

One-liner: abc1234 feat: add auth (2h ago) ร— 15 max

๐Ÿ” Linters (tsc, eslint, biome, ruff)

Groups errors by rule/file, omits clean files

๐Ÿ“ฆ Package installs

Returns ok + 847 packages instead of the resolution tree

โ“ Unknown commands

Conservative: deduplicate + truncate to 100 lines

๐Ÿ›ก๏ธ Zero Information Loss

The #1 design principle: never hide an error.

โœ… Lines matching error patterns (FAIL, Error:, TypeError, panic...) โ†’ NEVER removed
โœ… Non-zero exit codes โ†’ full error output preserved
โœ… Parser can't understand format โ†’ returns raw output
โœ… passthrough mode available for when you need everything

๐Ÿš€ Installation

Add this to your MCP client config โ€” that's it:

{
  "mcpServers": {
    "token-filter": {
      "command": "npx",
      "args": ["-y", "token-filter-mcp"]
    }
  }
}
npm install -g token-filter-mcp
{
  "mcpServers": {
    "token-filter": {
      "command": "token-filter-mcp"
    }
  }
}

๐Ÿ“ Where does the config go?

Client

Config file

Kiro

.kiro/settings/mcp.json or ~/.kiro/settings/mcp.json

Claude Desktop

claude_desktop_config.json

Cursor

.cursor/mcp.json

Any MCP client

Wherever it reads mcpServers config

๐Ÿ”ง 5 Tools, One Purpose

{ "command": "npm test", "filter_level": "normal" }

Level

Behavior

normal

Smart filtering with sensible defaults

aggressive

50% additional reduction for tight context budgets

passthrough

Raw output when you need everything (capped at 200KB)

{ "path": "src/app.ts", "mode": "signatures" }

Mode

What it returns

full

Content minus blank blocks, license headers, grouped imports

signatures

Only declarations โ€” no implementation bodies

relevant

Only sections matching focus pattern with ยฑ10 lines context

Supports: TypeScript, JavaScript, Python, Rust, Go

{ "pattern": "useState", "path": "src", "group_by": "file", "max_results": 20 }

Results grouped by file, deduplicated, with context lines. Uses ripgrep when available.

{ "command": "npm test" }

All pass:

[PASS] 47/47 tests passed (3.2s)

Failures:

[PASS] 44/47 tests passed
[FAIL] 3 failures:

1. src/auth.test.ts:42 โ€” "should refresh token"
   Expected: 200
   Received: 401

2. src/payments.test.ts:89 โ€” "should validate 3DS"
   TypeError: Cannot read property 'status' of undefined
   at processPayment (src/payments.ts:156)

Auto-detects: Jest, Vitest, pytest, cargo test, go test

{ "operation": "status" }

Operation

What you get

status

M 3 | A 1 | D 0 | ? 2 + file list

diff

Only hunks with changes, no header spam

log

abc1234 feat: add auth (2h ago) ร— 15

commit

ok abc1234

push

ok main โ†’ origin/main

pull

ok +3 files, 47 insertions

โš™๏ธ Configuration (Optional)

Works great out of the box. Customize only if you want to.

{
  "defaults": {
    "max_output_lines": 100,
    "test_show_passes": false,
    "git_log_max": 15,
    "diff_context_lines": 3,
    "dedup_threshold": 3
  },
  "commands": {
    "my-custom-script.sh": { "filter_level": "passthrough" }
  },
  "metrics": { "enabled": true }
}

Same schema. Project config overrides global. Global overrides built-in defaults.

๐Ÿ“Š Built-in Observability

When enabled, every invocation is logged to ~/.config/token-filter-mcp/metrics.jsonl:

{
  "tool": "smart_test",
  "command": "npm test",
  "rawChars": 5200,
  "filteredChars": 480,
  "savingsPercent": 90.7,
  "strategy": "test_result_filter",
  "filterDurationMs": 3,
  "timestamp": "2026-06-30T15:30:00Z"
}

Auto-rotated at 5MB, max 5 history files.

What it tracks:

  • Real savings per tool and command type

  • Which filters are most effective

  • Passthrough re-invocations (signal that a filter might be too aggressive)

๐Ÿ›ก๏ธ Guarantees

Guarantee

Detail

๐Ÿ”’ Zero loss

Errors, test failures, and changes are never filtered out

โšก < 50ms overhead

Filtering adds negligible latency vs raw execution

๐Ÿช‚ Safe fallback

Unknown commands get conservative treatment, not silence

๐Ÿ”Œ No lock-in

Standard MCP protocol โ€” works with any compliant client

๐Ÿ  No network

Everything runs locally over stdio. Your code never leaves your machine

๐Ÿ› ๏ธ Development

git clone https://github.com/VMexicano/token-filter-mcp
cd token-filter-mcp
npm install
npm run build
npm test        # 57 tests, all passing

The best token is the one you never spend.

Made with ๐Ÿ’– by Victor Mexicano

Install Server
F
license - not found
A
quality
C
maintenance

Maintenance

โ€“Maintainers
โ€“Response time
โ€“Release cycle
โ€“Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/VMexicano/token-filter-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server