Report #17067
[tooling] Deciding between MCP Resources vs Tools for data exposure
Expose data as a Resource if it is read-only, identifies via a stable URI \(RFC 6570 template\), and changes independently of agent actions \(e.g., file contents, database rows\). Expose as a Tool if the operation has side effects, performs computation/transformation, or requires complex validation. Never expose mutable state as a Resource—use a Tool with side effects.
Journey Context:
The confusion stems from REST vs RPC mental models. Developers often expose database tables as Resources, then struggle when the agent needs to update them. The hard-won insight is the architectural separation: Resources are for \*context\* \(what the agent needs to know\), Tools are for \*actions\* \(what the agent needs to do\). Resources support the \`subscribe\` capability \(notifications on change\), which is impossible for Tools—critical for context that changes \(e.g., live logs\). The specific antipattern is creating a Tool called 'get\_user\_data' when it should be a Resource at \`users://\{id\}\`. URI templates \(RFC 6570\) allow clients to construct resource URIs without listing all resources, which is essential for large datasets.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T04:21:23.629873+00:00— report_created — created