narrow-mcp
An MCP server that narrows large, low-density non-source files (logs, test output, CSV, JSON, HTML) down to the verbatim spans relevant to a stated intent -- verified against the original file, never a summary.
Why
Coding agents burn context reading large low-density files. A 40k-token log might hold a few hundred tokens of signal. This tool:
- Runs deterministic narrowing first (grep-style search, structural parsing per file type, sampling) -- free, fast, zero LLM cost.
- If that alone resolves the query with confidence (e.g. an exact CSV "null column" query), returns it directly. No LLM call at all.
- Otherwise passes only the narrowed candidates (never the raw file) to a cheap, fast selector model that returns line ranges and a one-line reason -- never prose.
- Re-reads the chosen line ranges from the original file on disk and returns that verbatim text. The selector's own words are never trusted or returned -- only its line-number coordinates, which get verified.
- If the selector fails, times out, or returns something invalid, falls back to the deterministic candidate set rather than failing outright.
Non-goals: source code retrieval (use LSP/tree-sitter/ast-grep), prose summarization, local/self-hosted models.
Status
v1, single file per call. Four file types: log/build-output, CSV, JSON (single document or JSONL), HTML.
Development
pip install -e ".[dev]"
pytest
python eval/run_eval.py # mocked selector, free
python eval/run_eval.py --live # real selector call, needs an API key (see Configuration)
Configuration
You only need to set one API key. The provider is auto-detected from whichever key is present -- no separate provider/model config required:
| If you set... | Provider used | Default model |
|---|---|---|
ANTHROPIC_API_KEY |
anthropic |
claude-haiku-4-5 |
OPENAI_API_KEY |
openai |
gpt-5-nano |
OPENROUTER_API_KEY |
openrouter |
openrouter/free (see below) |
| (none) | anthropic |
claude-haiku-4-5 (calls just always fall back to the deterministic path) |
If more than one key is set, priority is Anthropic > OpenAI > OpenRouter. Override anything explicitly with the env vars below.
Using OpenRouter's free models
OpenRouter still requires its own API key even for $0-cost models -- set
OPENROUTER_API_KEY and you're done, no other config needed. It defaults to
openrouter/free, a meta-router that auto-picks among whichever
tool-calling-capable models are currently free, so it never goes stale the
way hardcoding one specific :free model name would.
To see the current free-model roster live (it rotates) and pick a specific one instead of the meta-router:
narrow-mcp-list-free-models
Then set NARROW_MCP_SELECTOR_MODEL=<id> to whichever one you want.
OpenRouter's free tier is rate-limited (20 req/min; 50 req/day, or 1000/day once the account has $10+ lifetime spend) -- fine for interactive use, worth knowing about for batch runs.
All environment variables
NARROW_MCP_SELECTOR_PROVIDER--anthropic|openai|openrouter. Overrides auto-detection.NARROW_MCP_SELECTOR_MODEL-- overrides the provider's default model.NARROW_MCP_SELECTOR_API_KEY_ENV-- overrides which env var holds the key.NARROW_MCP_SELECTOR_TIMEOUT_S(default3.0)NARROW_MCP_MAX_CANDIDATE_CHARS,NARROW_MCP_MAX_CANDIDATES,NARROW_MCP_CONTEXT_LINES,NARROW_MCP_RIPGREP_PATH,NARROW_MCP_MAX_JSON_BYTES
Registering with Claude Code
claude mcp add narrow-mcp -- uvx narrow-mcp
Verify current claude mcp add flag syntax against claude mcp add --help
before relying on the above -- CLI flags change across releases.
Metadata
Release files for narrow-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| narrow_mcp-0.1.0.tar.gz | 26.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| narrow_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.4 kB
Release files / narrow_mcp-0.1.0.tar.gz
| Download URL | narrow_mcp-0.1.0.tar.gz |
|---|---|
| Size | 26.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
65b2a287810425af912394dda4dfe59c8a7e140937d7059797f32b990394b589
|
|
BLAKE2b-256 checksum How to use checksums |
a8a27e1bb7afb05cdde0785eccb0b1402e02c37e0802d601697571f423dace93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / narrow_mcp-0.1.0-py3-none-any.whl
| Download URL | narrow_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 31.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ed7c2d7e0cd47694a9fa073f4e5e73d3388e2e21614e947e3a412f6fe31315e5
|
|
BLAKE2b-256 checksum How to use checksums |
9db789ca8de452dc2cb52b888a8e4f8e2a67f195aae7b1f6ac3a77d58f547709
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logSecurity for narrow-mcp 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for narrow_mcp-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.