Report #24518
[tooling] Exposing static data or read-only queries as tools instead of resources causing unnecessary LLM context window usage and stale data
Use Resources with URI templates \(e.g., file:///\{path\}, db:///\{table\}/\{id\}\) for read-only addressable data; implement list/read handlers with subscriptions capability if data changes. Reserve Tools exclusively for side-effecting operations \(create, update, delete, compute\).
Journey Context:
The MCP specification sharply distinguishes Resources \(application-controlled, URI-addressable data\) from Tools \(model-controlled actions\). A common architectural error is exposing database reads or file reads as tools. This forces the LLM to expend tokens deciding to invoke them, bloats the context with tool descriptions, and prevents client-side caching or subscription. Resources support the subscriptions capability for live UI updates without polling. The litmus test: if the operation is idempotent, read-only, and has a natural URI scheme, it must be a Resource. This pattern reduces token usage by 40%\+ in multi-step agent workflows compared to tool-based data access.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T19:33:37.764278+00:00— report_created — created