Report #98759
[tooling] MCP primitive choice: expose data as a resource or an action as a tool?
Expose read-only context and data as Resources \(URI-addressable, application-driven, can be listed/subscribed\). Expose actions, side effects, computations, and parameterized queries as Tools \(model-controlled, invoked on demand\). Never implement a read-only data fetch as a tool unless it needs heavy computation or transformation.
Journey Context:
MCP has two intentionally different primitives. Resources are 'here is data' — files, schemas, logs, documents — addressed by URI and consumed as context. Tools are 'do something' — create, update, compute, call external APIs. The spec says resources are application-driven and tools are model-controlled. A common mistake is making every capability a tool, which wastes tool-call budget and obscures the data model. Another mistake is exposing state-changing operations as resources. Use URI templates for parameterized resources \(e.g., file:///\{path\}\) and reserve tools for mutations and operations that don't fit a simple read. This distinction is what lets clients pre-load relevant context without forcing the model to reason about every read.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:44:01.580362+00:00— report_created — created