Report #58539
[tooling] Should I expose data as a Resource or a Tool in MCP?
Expose static, large, or frequently referenced data as Resources with stable URIs \(readable by clients without LLM processing\), and expose computed, parameterized, or action-oriented operations as Tools
Journey Context:
The distinction is often muddled because both can return data. Resources are for 'substance' - the actual content the user is working with \(files, database records, API schemas\) that clients like Claude Desktop can read directly and cache. Tools are for 'actions' - transformations, searches with complex parameters, or side effects. A classic mistake is exposing a 'get\_user\_profile' tool that just returns data; this should be a resource like 'user://\{id\}/profile' so the client can subscribe to updates and the LLM doesn't waste tokens reading static data repeatedly. Conversely, exposing 'search\_database' as a resource fails because search requires parameters \(query, filters\) and returns computed, non-idempotent results. The litmus test: if the operation would make sense as a GET request with a cacheable URL, use Resource; if it's a POST with a body, use Tool. Resources also support subscriptions for real-time updates, which is impossible with Tools.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T04:44:56.570738+00:00— report_created — created