Nanotoll MCP

Compress prose for LLM context windows. Per-call USDC billing, signed receipt.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
65%
Naming quality
90%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~912Tokens (tool definitions)
~3.4 KBTypical response size
Moderate attention impact (0.71% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "nanotoll-mcp": {
      "url": "https://mcp.nanotoll.dev/mcp"
    }
  }
}

Remote endpoints

https://mcp.nanotoll.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (2)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡compress(_idempotency_key, squeeze_mode, target_ratio, text)

Compress prose before it enters an LLM context window. Returns the compressed text plus a signed receipt (ratios, refusals, coverage) so the caller can verify what was dropped. Use this instead of truncating or slicing text to fit a budget: truncation drops the tail silently, compression keeps a sentence skeleton and reports what went. Do not use it for source code, config, JSON, diffs or tables - send those verbatim. Very short input (under roughly 2,000 chars) gains little, and verified mode is slower there. To compress a web page, fetch it with the read tool first and compress the markdown it returns, never raw HTML. Prefer deterministic for bulk low-stakes text (free), extractive for ordinary prose, verified when a silently dropped fact would be expensive. Flat per-call price by mode: deterministic free, extractive $0.0008, verified $0.0015 (USDC on Base L2); insufficient credit returns HTTP 402.

Input Schema

{
  "type": "object",
  "properties": {
    "_idempotency_key": {
      "description": "Retry safety for the charge. The same key is billed once: a retry after a transport error is not charged again, and the call still runs, so the response is fresh rather than a replayed one. Omit it and a fresh UUID is generated per call, so every call charges. Use one key per distinct payload.",
      "type": "string"
    },
    "squeeze_mode": {
      "default": "extractive",
      "description": "deterministic = rule-based pruning, no model, free, and it ignores target_ratio. extractive = LLMLingua-class sentence dropping (output is a token skeleton: the reader reconstructs the glue), served from one model session, honours target_ratio. verified = extractive plus a coverage pass; stages can spread over spare model sessions, so with spare capacity it can be faster than extractive on the same input, while with none (pool busy) or on input too short to split (roughly under 2,000 characters) it is slower. Any other value returns HTTP 501.",
      "enum": [
        "deterministic",
        "extractive",
        "verified"
      ],
      "type": "string"
    },
    "target_ratio": {
      "description": "Fraction of the ORIGINAL characters to keep, exclusive: 0 or 1 is rejected with HTTP 422. Applied as a pruning cap in extractive and verified - the engine stops pruning once the realized ratio would drop below it - and the receipt's headline.ratio reports what was actually kept, which can be higher. On verified the fidelity gate can keep more than the same hint would in extractive: a failed attempt is retried with less compression and the receipt then shows quality.relax_steps with the pre-retry ratio in quality.relaxed_ratio. Ignored by deterministic, and unreachable on tabular JSON payloads (the receipt then shows l2_skipped=json_reform). Omit to use the calibrated default.",
      "exclusiveMaximum": 1,
      "exclusiveMinimum": 0,
      "type": "number"
    },
    "text": {
      "description": "Prose to compress: articles, docs, transcripts, chat or tool output, long extracted text. Poor fit, send verbatim instead: source code, config, JSON, diffs, tables - forcing them loses or mangles content. Caps are per mode: deterministic 200,000 chars, extractive 40,000 chars (12,500 tokens), verified 20,000 chars (7,000 tokens); over the cap the call returns HTTP 413.",
      "minLength": 1,
      "type": "string"
    }
  },
  "required": [
    "text"
  ]
}
🟢check_balance

Read your own account and cost nothing: credit balance left, the USDC funding address to top up, key tier and expiry, and lifetime usage totals. Takes no arguments and is not billed. Call it after an HTTP 402 from compress to see the shortfall, or before a long batch to confirm credit. It reads the account belonging to the API key in your MCP client config (Authorization: Bearer ...) - that is the balance compress bills against.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded2 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools