omlx-prompt-shrink
OpenLLM by BentoML can serve models through an OpenAI-compatible API; Context Shrink can trim or compact history before forwarding requests to the OpenLLM/BentoML backend.
Cloudflare Workers AI exposes an OpenAI-compatible endpoint; Context Shrink can reduce prompt size before calling Workers AI models to avoid context-length failures.
NVIDIA NIM/TensorRT-LLM endpoints can act as OpenAI-compatible backends; Context Shrink can shrink prompts before sending them to NIM-served models.
Serves as an OpenAI-compatible local model backend; Context Shrink can estimate, trim, or compact chat history before forwarding requests to Ollama so prompts stay within the model's context window.
Uses OpenAI's chat completions API as an OpenAI-compatible endpoint; Context Shrink can shrink or summarize conversation history before sending requests to OpenAI models.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@omlx-prompt-shrink check if this conversation fits 32K and trim the oldest messages"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Context Shrink
๐ English ยท Tรผrkรงe
Context Shrink is a tiny MCP server that keeps requests to any OpenAI-compatible endpoint under the model's context limit. It measures the context before the call, then either drops the oldest messages or compacts them into a summary โ instead of letting the server reject the request. It works with, among others:
oMLX
llama.cpp (
llama-server)LM Studio
vLLM
the OpenAI API
any OpenAI-compatible gateway
See Compatible backends for the full list.
Token counting: uses
tiktokenwhen it is installed (cl100k_baseby default) for a close approximation, and falls back to a tokenizer-free estimate (character count รท 4) otherwise. Either way it is a guard rail, not an exact budget โ setCONTEXT_SHRINK_TOKENIZER(or the legacyOMLX_SHRINK_*/OPENAI_SHRINK_*names) to change the behaviour.
๐ Compatible backends
The server only needs an OpenAI-compatible /v1/chat/completions endpoint โ
local model servers, self-hosted GPU engines and OpenAI gateways all qualify.
Point it at the endpoint with CONTEXT_SHRINK_BASE_URL and CONTEXT_SHRINK_MODEL.
The wire protocol, headers and error shapes are summarised in
docs/reference/OPENAI-API-REFERENCE.md.
Quick config for the most common ones
Backend | Base URL | Model value | Notes |
oMLX |
| (default) | The original target |
Ollama |
| e.g. | No API key needed |
llama.cpp ( |
| your GGUF name | CPU/GPU, lightweight |
LM Studio |
| loaded model id | Works out of the box |
vLLM |
| served model id | Production-grade, PagedAttention |
Text Generation Inference (TGI) |
| served model id | HuggingFace, streaming |
SGLang |
| served model id | High throughput |
LocalAI |
| model name | Drop-in replacement |
OpenAI / gateway |
| e.g. | Set an API key |
Example with Ollama:
export CONTEXT_SHRINK_BASE_URL="http://127.0.0.1:11434/v1"
export CONTEXT_SHRINK_MODEL="qwen2.5-coder"โ๏ธ Remote / cloud OpenAI-compatible providers
Local is not the only option: every major provider exposes an OpenAI-compatible
/v1/chat/completions endpoint, so point the server at it and set
CONTEXT_SHRINK_API_KEY. All of these need a key or token.
OpenAI
Base URL: https://api.openai.com/v1
Model: gpt-4o-mini
Azure OpenAI
Base URL: https://{resource}.openai.azure.com/openai/deployments/{deployment}
Model: your deployment name
Uses the
api-keyheader instead ofAuthorizationโ see below
DeepSeek
Base URL: https://api.deepseek.com/v1
Model: deepseek-chat
Groq
Base URL: https://api.groq.com/openai/v1
Model: llama-3.3-70b-versatile
Very fast
Together AI
Base URL: https://api.together.xyz/v1
Model: meta-llama/Llama-3.3-70B-Instruct-Turbo
Fireworks AI
Base URL: https://api.fireworks.ai/inference/v1
Model: accounts/fireworks/models/llama-v3p3-70b-instruct
Mistral API
Base URL: https://api.mistral.ai/v1
Model: mistral-large-latest
OpenRouter
Base URL: https://openrouter.ai/api/v1
Model: any model slug
Routes to 200+ models
HuggingFace Inference Endpoints
Base URL: https://{your-endpoint}/v1
Model: your model
Private endpoint
Cloudflare Workers AI
Base URL: https://api.cloudflare.com/client/v4/accounts/{account-id}/ai/v1
Model: @cf/meta/llama-3.3-70b-instruct-fp8
Azure OpenAI does not use a bearer Authorization header; pass its secret as a
custom header:
export CONTEXT_SHRINK_BASE_URL="https://myresource.openai.azure.com/openai/deployments/my-deployment"
export CONTEXT_SHRINK_MODEL="my-deployment"
export CONTEXT_SHRINK_EXTRA_HEADERS='{"api-key": "azure-secret"}'Additional static headers for any gateway are accepted through
CONTEXT_SHRINK_EXTRA_HEADERS as a JSON object (for example an org id or a
custom routing header).
Full catalogue
Anything below can serve as the summarisation endpoint; unlisted OpenAI-compatible endpoints work too.
Local model servers:
Ollama
llama.cpp (
llama-server)LM Studio
Jan
GPT4All (Python API)
llamafile (
--server)KoboldCpp
Oobabooga Text Generation WebUI (OpenAI extension)
MLC LLM
Petals (distributed)
GPU / production engines:
vLLM
Aphrodite Engine (vLLM fork)
Text Generation Inference (TGI)
SGLang
NVIDIA NIM / TensorRT-LLM
ExLlamaV2 + TabbyAPI
Xinference
OpenLLM (BentoML)
FastChat (LMSYS)
LocalAI
Proxies & routers:
LiteLLM (100+ providers)
OpenRouter
Portkey Gateway
One API / New API
community Ollama-to-OpenAI proxies
Libraries / custom stacks:
llama-cpp-python(llama_cpp.server)Transformers + FastAPI
AnythingLLM / Msty
Related MCP server: PromptThrift MCP
๐ Overview
oMLX profiles for this class of models run 32K context (max_context_window: 32768). That is a deliberate choice: with a 4-bit KV cache it keeps the runtime footprint at roughly 17โ20 GB per model and keeps prefill short on Apple Silicon. Raising the limit is not free โ every extra token of context is paid for in memory and prefill time.
The cost appears in a long session. Three things keep growing until the total crosses the ceiling:
the system prompt
the conversation history
the tool results
Once it crosses, the server refuses the whole request:
Prompt is too long: 39514 tokens > 32768 maximum context lengthAt that point the agent stops. Nothing was wrong with the question โ the prompt was simply 6.7K tokens too big. The usual workarounds are all unsatisfying:
Workaround | Why it falls short |
Raise | Moves the wall, does not remove it; costs memory and prefill speed on the same machine |
Truncate by hand | Manual, easy to forget, throws away whole sessions |
Start a new session | Loses the context that made the task work in the first place |
So this server takes the cheap path: keep 32K, send a smaller prompt.
Read the full walkthrough (why 32K, the three compaction modes, the environment configuration, and the known limitations):
โ Recommendation
Use it if you run oMLX or another local OpenAI-compatible server with a fixed context window and you have hit Prompt is too long at least once. It is a single Python file and needs no GPU. estimate_context and trim_context are pure arithmetic โ they cost nothing at inference time. compact_context only calls the local model when you ask it to summarise (or you can hand it a summary yourself and it calls nothing at all).
You probably do not need it if your context window is large enough for your sessions, or if your client already compacts history on its own.
๐ ๏ธ Tech Stack & Architecture
Language & Runtime: Python 3.10+, standard library only
Protocol: Model Context Protocol (MCP) over stdio transport
Client: OpenCode (Code Mode groups tools under
tools.Context_Shrink.*)Compaction Engine: Chunked summarisation via the local OpenAI-compatible endpoint
Token Counting: optional
tiktoken(defaultcl100k_base) with a character heuristic fallback โ no hard dependencyDependencies:
mcp(MCP SDK) required;tiktokenoptional โ no GPUTarget Server: any OpenAI-compatible server โ see Compatible backends
Defaults:
max_context_tokens = 32768,keep_last = 8,threshold = 0.8
โจ Features
๐งฎ Accurate-enough estimate โ
estimate_contextreturns the estimated token count, the remaining budget and ashould_trimflagโ๏ธ Drop oldest messages โ
trim_contextreturns the message list with the oldest messages removed, keeping the most recentkeep_last๐ง Compact instead of drop โ
compact_contextreplaces the oldest messages with a summary, keeping leading system messages and the most recentkeep_lastverbatim๐ Three compaction modes โ summary provided, model-generated, or plan-only (
needs_summary: true, no message content echoed back)๐ Optional real tokenizer โ uses
tiktokenwhen installed, otherwise a tokenizer-free estimate (chars รท 4);CONTEXT_SHRINK_TOKENIZERcontrols the choice๐ Plain MCP โ any MCP client can use the server, not just OpenCode
๐งฉ Chunked summarisation โ long histories are summarised in pieces so the local model does not overflow while summarising
๐ No telemetry, no network calls except the optional local summariser request
๐ธ Screenshots
(No UI โ this is a headless MCP server. Tool output is JSON on stdio.)
๐๏ธ Architecture
flowchart LR
classDef client fill:#e3f2fd,stroke:#1976d2,color:#0d47a1
classDef decision fill:#fff3e0,stroke:#ef6c00,color:#e65100
classDef action fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20
classDef model fill:#fce4ec,stroke:#c2185b,color:#880e4f
Client["๐งโ๐ป Your coding agent"]:::client
Client -->|"before every request"| Fits{"Does it fit the<br/>context window?"}:::decision
Fits -->|"yes"| Model
Fits -->|"no"| Choice{"What should happen?"}:::decision
Choice -->|"measure only"| Measure["๐ Report the size<br/>nothing is changed"]:::action
Choice -->|"drop oldest"| Trim["โ๏ธ Shorten the history<br/>newest messages stay"]:::action
Choice -->|"summarise"| Compact["๐๏ธ Summarise the oldest part<br/>recent messages stay word-for-word"]:::action
Trim --> Model
Compact --> Model
Model["๐ค Local model<br/>(oMLX)"]:::modelcompact_context in three modes
Summary provided โ pass
summary="..."and no model call is made. Use this when the agent (or the user) already wrote the summary.Model-generated โ pass
model="..."(and optionallybase_url), or set the environment variables below, and the server summarises the oldest messages for you. Long histories are summarised in chunks so the local model does not overflow while summarising.Plan only โ with neither, the call returns
needs_summary: true, the exactsummary_promptto use, and the token counts. No message content is echoed back, so the result stays small; call again withsummary=<text>. Passmodel=""to force this step even when the environment sets a model.
compact_context returns the assembled messages list only in modes 1 and 2,
and leaves the list untouched (compacted: false) when it is already within
threshold unless you pass force: true.
No model endpoint required: modes 1 and 3 work without any
CONTEXT_SHRINK_*variable. The environment variables only enable mode 2.
๐ Installation & Quick Start
Install (one line)
The package is on PyPI: context-shrink-mcp.
pip install context-shrink-mcp # the package + the `context-shrink` commandOr skip the install and let uvx fetch and run it โ no checkout, no manual copy
(install uv once). Register the server with
OpenCode in one line:
# from PyPI
opencode mcp add context-shrink --global -- uvx --from context-shrink-mcp context-shrink
# or straight from GitHub (no package index needed)
opencode mcp add context-shrink --global -- uvx --from git+https://github.com/mahirfatih/context-shrink-mcp context-shrinkuvx resolves the mcp dependency in an isolated environment and runs the
server over stdio. Pin a version with context-shrink-mcp@1.0.0 (PyPI) or
โฆcontext-shrink-mcp@v1.0.0 (GitHub).
Enable model mode on the same command:
opencode mcp add context-shrink --global \
--env CONTEXT_SHRINK_BASE_URL=http://127.0.0.1:8000/v1 \
--env CONTEXT_SHRINK_MODEL=Qwen3.6-35B-A3B-4bit \
--env CONTEXT_SHRINK_API_KEY=omlx-... \
-- uvx --from context-shrink-mcp context-shrinkWithout
--global,opencode mcp addwrites to the project config (./opencode.jsonc) instead of~/.config/opencode/opencode.jsonc.
The numbered steps below are the repository-checkout path โ use them to run the file directly or from a dedicated virtualenv.
1. Prerequisites
Requirement | Version / Notes |
Python | 3.10+ (tested against |
MCP SDK |
|
Tokenizer (optional) |
|
Client | OpenCode (or any MCP client) |
Model server | oMLX or another local OpenAI-compatible server (optional, for model mode) |
2. Install the SDK
pip install "mcp>=2.0"3. Copy the server
Copy context_shrink.py into a directory of your choice (for example ~/.config/opencode/mcp/). A repository checkout also ships a four-line context-shrink.py shim that runs the same module, kept for existing setups that point at the hyphenated name.
Note: The
python3in thecommandarray may not be the one you expect โ depending on your setup it could be/opt/homebrew/bin/python3,/usr/bin/python3, or somewhere else. Verify the path withwhich python3(orwhich python) and use the absolute path in the config instead of the barepython3if needed.
4. Register with OpenCode
Add the server to your OpenCode config (~/.config/opencode/opencode.jsonc):
{
"mcp": {
"servers": {
"Context Shrink": {
"type": "local",
"command": [
"python3",
"/absolute/path/to/context_shrink.py"
],
"timeout": 180000
}
}
}
}Config changes apply without a restart โ OpenCode watches config files and reloads MCP servers after a save. To force a full reload, run /reload.
5. (Optional) Enable model mode
Set the environment variables under environment in the MCP entry so compact_context can summarise with the local model. The values below are the ones this project was developed with โ a local oMLX server on Apple Silicon, serving Qwen3.6-35B-A3B-4bit:
"environment": {
"CONTEXT_SHRINK_MODEL": "Qwen3.6-35B-A3B-4bit",
"CONTEXT_SHRINK_BASE_URL": "http://127.0.0.1:8000/v1",
"CONTEXT_SHRINK_API_KEY": "omlx-...",
"CONTEXT_SHRINK_TIMEOUT": "180",
"CONTEXT_SHRINK_TOKENIZER": "auto"
}A real setup (this project's development machine)
This server was written for, and is used daily on, an Apple Silicon Mac driving a
local oMLX server โ the 32K context profile it targets is documented in
mahirfatih/omlx-m1-max-benchmark.
The OpenCode entry used there runs the server from a dedicated virtualenv and
points the summariser at the local model:
{
"mcp": {
"servers": {
"Context Shrink": {
"type": "local",
"command": [
"/absolute/path/to/context-shrink-venv/bin/python",
"/absolute/path/to/context_shrink.py"
],
"environment": {
"CONTEXT_SHRINK_MODEL": "Qwen3.6-35B-A3B-4bit",
"CONTEXT_SHRINK_BASE_URL": "http://127.0.0.1:8000/v1",
"CONTEXT_SHRINK_API_KEY": "omlx-...",
"CONTEXT_SHRINK_TOKENIZER": "auto"
},
"timeout": 180000
}
}
}
}The
CONTEXT_SHRINK_API_KEYis the token the local oMLX server expects; it is redacted here. Replace the paths and the key with your own.
Configuration
compact_context reads its endpoint and model from the environment when the
arguments are not given.
The canonical names are CONTEXT_SHRINK_*. The legacy OMLX_SHRINK_* names and
the vendor-neutral OPENAI_SHRINK_* aliases are identical in meaning and are
used only when every higher-precedence name is unset. Precedence:
CONTEXT_SHRINK_* > OMLX_SHRINK_* (legacy) > OPENAI_SHRINK_*Variable | Default | Meaning |
|
| OpenAI-compatible base URL (a trailing |
| (empty) | Model name to summarise with; empty disables the model mode |
| (empty) | Bearer token, if the server needs one |
|
| Summariser request timeout, seconds (invalid values fall back to 180) |
|
| Token counter: |
|
| Default context budget for every tool call |
| (empty) | Extra HTTP headers as a JSON object, for gateways such as Azure OpenAI ( |
|
| stderr log level (use |
Common pitfalls
An empty
CONTEXT_SHRINK_MODELputscompact_contextinto plan-only mode: it returns aneeds_summaryplan instead of calling a model.A too-small
max_context_tokensmakes every call look over-budget; set it to the model's real context window (the default is32768).*_EXTRA_HEADERSmust be a JSON object โ a string, array or malformed JSON is ignored with a warning.A remote/cloud
CONTEXT_SHRINK_BASE_URLforwards your messages to that endpoint; only point it at a server you trust.Out-of-range
max_context_tokensvalues are clamped to1โฆ1000000so a typo cannot exhaust memory.
6. Use it
Call
estimate_contextwith the current message list.If
should_trimistrue, calltrim_contextand send the returned list, orcompact_contextto keep the gist instead of dropping it.An agent can do this automatically before every request when the estimate crosses the limit.
Example estimate_context call:
{
"messages": [
{ "role": "user", "content": "first message" },
{ "role": "assistant", "content": "first answer" },
{ "role": "user", "content": "second message" }
],
"max_context_tokens": 32768
}Example trim_context call:
{
"messages": [ "..." ],
"keep_last": 8,
"max_context_tokens": 32768
}Compaction flow, model mode:
{
"messages": [ "..." ],
"keep_last": 8,
"model": "Qwen3.6-35B-A3B-4bit",
"base_url": "http://127.0.0.1:8000/v1"
}Compaction flow, agent mode (two calls):
compact_context({ "messages": [...], "force": true })โneeds_summary: trueplus thesummary_prompt.The agent writes the summary, then calls again with
{ "messages": [...], "force": true, "summary": "<that text>" }โ the compactedmessageslist.
Tool parameters
Tool | Parameter | Default | Meaning |
(all) |
| (required) | Conversation as |
|
|
| Budget to compare the estimate against |
|
|
| Newest messages always kept |
|
|
| Budget to trim down to |
|
|
| Newest messages kept verbatim |
|
|
| Context budget |
|
|
| Compact only above this fraction of the budget (unless |
|
|
| Compact even when under |
|
| (none) | Pre-written summary (mode 1) |
|
| (env) | Model for a generated summary (mode 2); |
|
| (env) | Endpoint override for the summariser |
|
| (env) | Bearer token override for the summariser |
|
|
| Upper bound for the generated summary |
|
|
| Role of the message that carries the summary |
estimate_context also returns a tokenizer field naming the counter in use
(for example tiktoken:cl100k_base or heuristic(chars/4)).
Minimal clients
examples/python-client.py and
examples/js-client.js are runnable clients: each
starts the server over stdio, lists its tools and calls estimate_context.
python examples/python-client.py # uses ./context_shrink.py
python examples/python-client.py /path/to/context_shrink.py
cd examples && npm install && node js-client.js # same client in NodeRun the Python client with the same interpreter that has mcp installed; the
Node client needs Node 18+ and npm install once.
๐ Project Structure
context-shrink-mcp/
โโโ context_shrink.py # Single-file MCP server (the whole product)
โโโ context-shrink.py # Four-line shim that runs the module above
โโโ pyproject.toml # Packaging + the `context-shrink` console script
โโโ README.md # English quick tour
โโโ README.tr.md # Turkish quick tour
โโโ CONTRIBUTING.md # Setup, tests, commit conventions
โโโ CHANGELOG.md # Keep a Changelog release notes
โโโ docs/ # Documentation tree (see docs/README.md)
โ โโโ README.md # Doc map
โ โโโ guides/MIGRATION.md # Rename / migration notes
โ โโโ guides/RELEASING.md # Version, build and publish steps
โ โโโ reference/OPENAI-API-REFERENCE.md # Endpoint, headers, errors
โ โโโ testing/TESTING.md # Suites, runner, live tests
โโโ requirements.txt # Runtime dependency (mcp)
โโโ requirements-dev.txt # Dev dependencies (mcp, pytest, ruff, tiktoken)
โโโ pytest.ini # pytest config (testpaths, python_files)
โโโ .ruff.toml # Ruff lint configuration
โโโ .pre-commit-config.yaml # Optional local git hooks
โโโ .github/workflows/ci.yml # CI: lint + compile + tests
โโโ test/ # Test runner + suites
โ โโโ test.sh # Single test runner (ruff + pytest)
โ โโโ README.md # Test folder guide
โ โโโ py/ # Python suites
โ โ โโโ context-shrink-tests.py # Helpers, tokenizer, fixtures
โ โ โโโ context-shrink-mcp-tests.py # STDIO end-to-end round-trip
โ โ โโโ context-shrink-live-tests.py # Live oMLX integration (opt-in)
โ โโโ js/ # Node integration tests (MCP JS SDK)
โโโ examples/ # Runnable examples
โ โโโ python-client.py # Minimal MCP client: list tools + call one
โ โโโ js-client.js # The same client in Node (MCP JS SDK)
โโโ LICENSE # MIT
โโโ .gitignore๐งช Testing & CI
./test/test.sh # install dev deps, then ruff + pytest
./test/test.sh --lint # ruff only
./test/test.sh --no-install # skip the pip install step
./test/test.sh --only test/py/context-shrink-tests.py::test_compact_uses_provided_summaryRunner:
test/test.shinstalls the dev dependencies, runs Ruff, then pytest. The interpreter is the project.venvwhen present, otherwisepython3.Suites:
test/py/context-shrink-tests.pycovers the pure helpers (token estimation, trimming, compaction splitting and chunking), the tokenizer resolution logic and the env-var parsing โ no network.test/py/context-shrink-mcp-tests.pyadds an end-to-end round-trip over the real STDIO transport (handshake โtools/listโtools/call).Live tests (opt-in):
test/py/context-shrink-live-tests.pyand the Node suite intest/js/hit a real endpoint. They are skipped unlessCONTEXT_SHRINK_LIVE=1is set and the endpoint answers, so the default run stays offline. The API key is read fromCONTEXT_SHRINK_API_KEY, never stored in the repo.Details:
docs/testing/TESTING.mdhas the full suite map, flags and live-test setup.Node tests:
cd test/js && npm install && npm testruns the protocol tests through the official MCP JS SDK; the model test is gated by the sameCONTEXT_SHRINK_LIVEflag.CI:
.github/workflows/ci.ymlruns Ruff, apy_compilecheck, andpytest. It is manual only โ trigger it withworkflow_dispatch(Actions tab โ CI โ Run workflow).
Run the server by hand to exercise it through a client:
python3 context_shrink.py # starts the stdio server; Ctrl-C to stop๐ Documentation
README.md โ this file.
README.tr.md โ Turkish translation.
context_shrink.py โ source of truth for tool schemas and behaviour.
pyproject.toml โ packaging and the
context-shrinkconsole script.pypi.org/project/context-shrink-mcp โ the published package.
CONTRIBUTING.md โ development setup, tests, and commit conventions.
CHANGELOG.md โ release notes.
docs/README.md โ the documentation map.
docs/reference/OPENAI-API-REFERENCE.md โ the endpoint, headers and error shapes this server relies on.
docs/testing/TESTING.md โ the suites, the runner and the opt-in live tests.
docs/guides/MIGRATION.md โ renaming from oMLX Prompt Shrink.
docs/guides/RELEASING.md โ version, build and publish steps.
examples/python-client.py โ a runnable MCP client that lists the tools and calls one.
examples/js-client.js โ the same client in Node, built on the official MCP JS SDK.
MCP Python SDK โ the transport and
MCPServerAPI this file is built on.
๐ Notes
Default context limit:
32768tokens โ change it to match your profile.Trim policy: oldest messages first; the last
keep_lastmessages are always kept.Compact policy: leading
systemmessages are kept, the oldest of the rest are replaced by onesystemmessage holding the summary, and the lastkeep_lastmessages are kept verbatim.The tool surface is plain MCP, so any MCP client can use the server, not just OpenCode.
๐ Migrating from oMLX Prompt Shrink
The project was renamed from oMLX Prompt Shrink to the vendor-neutral
Context Shrink; the tool names are unchanged and the old repository URL
redirects. The file path, tool namespace, repository and environment-variable
mapping is in docs/guides/MIGRATION.md.
๐ Background
The 32K profile and the Prompt is too long failure this server addresses are documented in mahirfatih/omlx-m1-max-benchmark: docs/reference/PROFILES.md explains why the context window is set to 32K, and the README has the recommendation section for this server.
๐ Permissions & Privacy
Setting / Key | Purpose | Location |
| OpenAI-compatible base URL | environment / argument |
| Model used for summarisation | environment / argument |
| Bearer token for the local server | environment / argument |
| Summariser request timeout (seconds) | environment |
| Token counter selection ( | environment |
Privacy: The server makes no network requests of its own except the optional summariser call to the local OpenAI-compatible endpoint you configure. No telemetry, no analytics, no data leaves the machine. All state is in-memory for the duration of a tool call.
Version: 1.0.0
๐ License
This project is licensed under the MIT License.
Available Tools
3 toolscompact_contextA
Replace the oldest messages with a summary instead of dropping them.
The summary comes from summary when given, otherwise from the local model
via model/base_url (or the CONTEXT_SHRINK_MODEL / CONTEXT_SHRINK_BASE_URL
environment variables). With neither, the tool returns a needs_summary
plan plus the exact prompt, and no message content is echoed back.
Example call::
compact_context({
"messages": [...],
"keep_last": 8,
"threshold": 0.8,
"summary": "โฆ", # omit to summarise with the model
})
Inputs: messages (required), force, model, api_key, +7 more. Returns: result
estimate_contextB
Estimate the current context size in tokens before sending it to the model.
Example call::
estimate_context({
"messages": [{"role": "user", "content": "hello"}],
"max_context_tokens": 32768,
})
Inputs: messages (required), max_context_tokens. Returns: result
trim_contextA
Trim the oldest messages when the estimated context exceeds the model limit.
Example call::
trim_context({
"messages": [...],
"keep_last": 8,
"max_context_tokens": 32768,
})
Inputs: messages (required), keep_last, max_context_tokens. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogโฆ
TDQS
Scored across 3 tools
Each tool maps to a distinct stage of context management: estimate (measure), trim (drop oldest), compact (summarize oldest). Boundaries are mostly clear, though trim_context and compact_context both trigger when context exceeds a limit and differ only in how old messages are handled, which could cause slight hesitation in selection.
All three tools follow a consistent verb_noun convention (estimate_context, trim_context, compact_context) with parallel suffixes. Predictable and easy to scan.
Three tools is a tight, well-scoped set for a focused context-shrinking utility. Each tool corresponds to a necessary step in the workflow (measure, reduce, summarize), with no redundant tools.
The estimate-trim-compact lifecycle covers the core domain well. A minor gap exists: there is no way to inspect or report the resulting message list after trimming/compacting beyond the returned plan, but the surface is largely complete for the stated purpose.
Maintenance
Related MCP Connectors
Count tokens (o200k/cl100k), truncate to a budget, chunk text for RAG and estimate LLM cost.
Same functionality, consuming only 1/20 of the context window tokens.
Token counting, RAG chunking, truncation, HTML to Markdown and JSON repair
Free, stateless agent memory consolidation preview: keep/archive/drop diff with token estimates.
Related MCP Servers
- AlicenseAqualityFmaintenanceProvides AI chat history compression tools through token-based trimming and AI-powered summarization strategies to manage conversation context within token limits.262 npm5MIT
- AlicenseNot gradedqualityDmaintenanceEnables 70-90% LLM API cost reduction by compressing conversation history via local Gemma 4 models or heuristics, featuring token counting, model routing, and pinned facts for preserving critical context.1MIT
- AlicenseAqualityDmaintenanceLets Claude Desktop, Cursor, Cline, Windsurf, Zed, or any other MCP client estimate token counts and fit a chat history into a model's context budget on demand.352 npm1MIT
- AlicenseNot gradedqualityBmaintenanceProvides deterministic context compaction and safety gating for AI agents, preserving original messages verbatim while dropping irrelevant ones and flagging destructive commands.2MIT