# agentfit-mcp **MCP server for [`@mukundakatta/agentfit`](https://www.npmjs.com/package/@mukundakatta/agentfit).** Lets 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. ```bash npx -y @mukundakatta/agentfit-mcp ``` Three tools: - **`count_tokens`** — estimate tokens in a string or chat-message array, with per-model estimator families (openai, anthropic, google, llama, default). - **`fit_messages`** — drop messages from a chat history until under a `maxTokens` budget. Supports drop-oldest, drop-middle, and priority strategies; honors `preserveSystem`, `preserveFirstN`, `preserveLastN`. - **`list_estimators`** — list the built-in estimator families. ## Add to your client ### Claude Desktop Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows): ```json { "mcpServers": { "agentfit": { "command": "npx", "args": ["-y", "@mukundakatta/agentfit-mcp"] } } } ``` ### Cursor `~/.cursor/mcp.json`: ```json { "mcpServers": { "agentfit": { "command": "npx", "args": ["-y", "@mukundakatta/agentfit-mcp"] } } } ``` ### Cline / Windsurf / Zed Same shape as above. The server speaks plain MCP over stdio, so any client that supports stdio MCP servers will work. ## Tool examples **`count_tokens`:** ```json { "input": "hello world", "model": "claude-sonnet-4-6" } ``` Returns: ```json { "tokens": 4, "model": "claude-sonnet-4-6" } ``` **`fit_messages`:** ```json { "messages": [ { "role": "system", "content": "You are precise." }, { "role": "user", "content": "long context..." }, { "role": "assistant", "content": "..." }, { "role": "user", "content": "final question" } ], "maxTokens": 8000, "model": "claude-sonnet-4-6", "preserveSystem": true, "preserveLastN": 2, "strategy": "drop-oldest" } ``` Returns: ```json { "messages": [...], "dropped": [...], "tokens": { "before": 12000, "after": 7800, "budget": 8000 }, "fit": true } ``` `fit_messages` always returns a structured result and never throws across the wire: if the budget is unreachable even after dropping all non-protected messages, you get `fit: false` with the partial result so the caller can decide what to do. ## Why a separate MCP server `@mukundakatta/agentfit` is a zero-dependency JavaScript library. This package wraps it as an MCP server so it's accessible from inside any MCP-aware AI assistant: ask Claude "how many tokens is this transcript?" or "trim this chat to 8k tokens preserving the system prompt and last 2 turns" and the assistant calls these tools directly. ## Sibling MCP servers Part of the agent-stack series, all `@mukundakatta/*-mcp`: - [`@mukundakatta/agentfit-mcp`](https://www.npmjs.com/package/@mukundakatta/agentfit-mcp) — *Fit it.* (this) - [`@mukundakatta/agentguard-mcp`](https://www.npmjs.com/package/@mukundakatta/agentguard-mcp) — *Sandbox it.* - [`@mukundakatta/agentsnap-mcp`](https://www.npmjs.com/package/@mukundakatta/agentsnap-mcp) — *Test it.* - [`@mukundakatta/agentvet-mcp`](https://www.npmjs.com/package/@mukundakatta/agentvet-mcp) — *Vet it.* - [`@mukundakatta/agentcast-mcp`](https://www.npmjs.com/package/@mukundakatta/agentcast-mcp) — *Validate it.* ## License MIT