I Stopped Loading MCP Tool Schemas Into My Agents. declick Compiles the Server Into a CLI Instead Developer ucsandman built declick, a tool that compiles MCP servers and other API sources into CLIs, reducing the context-window cost of tool schemas from 236,818 bytes to 58,309 bytes (4.1x smaller) across nine MCP servers with 258 tools. The tool, available on GitHub and npm, generates named-verb CLIs with trimmed JSON output and includes a daemon mode that cuts call latency from 703 ms to 59 ms on slow-booting servers. Every MCP server my agents used was paying twice. The first payment is the tool list. When an agent connects to an MCP server, every tool's name, description and JSON schema goes into the context window. It sits there on every turn, whether the model calls the tool or not. The second payment is the result. A tool call returns the whole response, and the whole response lands in context. Nobody trims it. On the nine MCP servers I run day to day, the raw tool listing is 236,818 bytes. That is before the agent has done anything. So I built declick https://github.com/ucsandman/declick . It reads a source once and writes a CLI with named verbs. The agent runs one line from the shell and gets trimmed JSON back. What it actually does Point it at something and give it a name: npm i -g declick declick add https://petstore3.swagger.io/api/v3/openapi.json --name petstore declick run petstore get-user-by-name user1 --fields username,email That is an OpenAPI spec. The same command takes an MCP server stdio or streamable HTTP , a GraphQL schema, a Postman or Insomnia collection, a HAR capture, a SQLite database, another CLI's own help text, a web page, or a Windows app. Ten engines, and every one of them writes the same shape of CLI. Every generated CLI honors one contract. Output is a JSON envelope with ok , data and meta . --fields and --limit cut the result before it reaches the model. --dry-run works on anything that mutates. Five exit codes: 0 ok, 1 error, 2 not found, 3 blocked by policy, 4 auth needed. The fourth line above hits a live server. Try get-pet-by-id instead and you get exit 4, because the spec declares an API key and you have not set one. That is the contract doing its job, not a bug in the demo. The part the agent cares about is declick describe