The local inference ledger: a zero-dependency OpenAI-compatible proxy that prices every request your home GPU serves - tokens, TTFT, tok/s, kWh, $, and the cloud-equivalent.
TokLedger provides 4 read-only tools with clear, domain-specific descriptions (avg 156 chars). All tools have proper JSON schemas with typed parameters. However, parameter descriptions are sparse or missing entirely (e.g., 'limit' in tokledger_recent lacks guidance on valid range or typical use). No tool annotations (readOnlyHint, idempotentHint) despite all being read-only. Error handling is minimal, no recovery guidance or actionable error messages visible in the MCP layer. Tool naming is verb-noun compliant but generic ('stats', 'recent', 'breakdown', 'savings'), could be more specific to the domain (e.g., 'get_inference_stats', 'list_recent_inferences'). Output schemas are not documented in the tool definitions.
Local vs cloud cost comparison: total local $, total cloud-equivalent $, savings $ and %.
Per-model rollup: requests, tokens, avg TTFT, local and cloud-equivalent cost.
The most recent N ledger records (newest first).
Aggregate totals from the local LLM inference ledger: request count, prompt/completion tokens, average TTFT, energy (kWh), local cost ($), cloud-equivalent cost ($), and percent saved vs cloud.
Parameter descriptions missing or incomplete. 'limit' in tokledger_recent has no guidance on valid range (1-200 is in schema but not described). LLMs cannot infer constraints from JSON Schema alone.
No tool annotations despite all tools being read-only and idempotent. Missing readOnlyHint and idempotentHint metadata that would help agents reason about safety and retry behavior.
Output schemas not documented in tool definitions. LLMs cannot plan downstream operations or extract required fields without knowing what each tool returns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Generic tool names ('stats', 'recent', 'breakdown', 'savings') lack domain specificity. Names like 'get_inference_stats' or 'list_recent_inferences' would better signal intent to LLMs.
No error handling or recovery guidance visible in MCP layer. If a query fails or returns empty results, LLMs have no actionable next steps.