Build1 distinct publisher3 min readPublished
MCP calls resources application-controlled because the mental model is a human attaching a file. Wrapping them as synthetic client-side tools fixes the context bloat and quietly relocates the gate that designation implied.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Start with the bytes. The naive dump in the write-up pastes roughly 11,000 characters of markdown for a single resource, the SUM ABAP test matrix at `sap-btp://sum-abap-v1` [6]. The usual bloat guard is a slice, `content[:2000]` [7]. That keeps 2,000 characters and discards about 9,000, roughly 82 percent of the document [17], which in this case took the product list and the output-format section with it [7]. The catalog entry that replaces the dump runs three lines and about 148 characters as printed [12], so the same resource costs something near a seventy-fourth of the prompt bytes [18]. Nothing gets amputated, because nothing gets pasted [11].
Then the enforcement question. `read_resource` is registered as a StructuredTool whose `func` is a no-op lambda, and the real fetch is intercepted inside the graph [13]. That is the right place for it, since the graph is what holds the MCP session [15]. It also means the interesting code is not in the excerpt we were given, which stops at `tools =` [19]. Two things have to live at that interception point. One is URI validation: the model is told that "Only resources listed under 'Available Resources' can be read" [14], and a tool description is advice, not a check. The other is an error path, because a call that falls through to the placeholder returns the empty string [13], and an empty string reads to a model as a document that exists and happens to be blank.
The trade is prompt bytes for turns. Under the dump, everything is present before the first token of the answer [4]. Under the loop, each resource costs a full round trip: the model emits a tool_use block, the client executes it, the result goes back into the conversation [2]. Three resources needed for one answer means three of those before the answer starts, and once the content is in the message history it sits in context for every later turn anyway. What the pattern actually saves is the resources the model never asks for, plus the truncation and the binary decode failures you no longer need to handle in the prompt path [5][8].
That saving is a function of description quality. The model picks from names, URIs and one-line descriptions [11], so retrieval recall moves out of your client and into whatever text the MCP server author wrote. "SUM (Software Update Manager) test matrix specification for ABAP products" [12] is specific enough to be found; ten resources all described as API documentation are not. Before adopting this I would want the resource count, the median resource size, and a look at those descriptions, because two 800-character resources do not justify the machinery. I would also split the approval for `invoke_prompt` from `read_resource`: one returns a document, the other injects a named prompt template into the conversation [10], and auto-approving the second [9] is a decision about who gets to write the instructions.
Ranked by verification strength, evidence, and original report placement.
MCP gives a server three ways to expose capability: tools, resources, and prompts.
Tool calling in MCP is model-controlled by design: the LLM emits a tool_use block, the client executes it, and the result is fed back.
Resources and prompts are application-controlled; the spec's mental model is a human clicking "attach this file" or "/use this prompt template", and there is no obvious place for them inside an autonomous agent's reasoning loop.
The path of least resistance in most integrations is to fetch every resource at startup and paste its content into the system prompt.
The write-up lists four problems with the system-prompt dump: context bloat, truncation, binary breaks, and no agency for the model.
The example dump shows one resource, "SUM ABAP Test Matrix" at URI sap-btp://sum-abap-v1, as roughly 11,000 characters of markdown.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Foundry IQ knowledge bases ship as MCP servers, and four behaviours break naive clients1 distinct publisher
build
LoreKit puts agent memory in Markdown files you can grep, not a vendor's database1 distinct publisher
build
The only way to prove a contract test can fail is to ship a server that lies1 distinct publisher
build
A gate that warns and a fan that queues: test the executor, not the card1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Printed code, single witness
What dev.to prints is unusually concrete for a pattern post — the tool definition, the description string, the URI-normalisation fix and the interception branch are quoted rather than summarised, and the failure being diagnosed is named down to the exception. What is missing is anyone else. Every figure is the author's own count, no before-and-after token measurement is offered, and the copy runs out mid-snippet before the full step-3 wiring, so the one piece the whole pattern rests on is the piece shown least completely.
One agent, one author
The only deployment on record is the author's own DARA agent. There is no second team using the pattern, no library or package to install, no issue thread or spec discussion cited — the portability claim is an assertion made from a single LangGraph implementation. A useful shape, not yet a practice.
Small fix, big adjective
The engineering is described honestly; the framing overreaches twice. 'Changes everything about context hygiene' arrives without a single measured token or dollar, and the post presents auto-approval as removing an unnecessary click rather than as relocating the gate that MCP's application-controlled designation implied. The gap is the unexamined consequence, not exaggeration about the mechanism itself.
Showing off his own agent
This is a builder writing up his own system on a self-publishing platform: DARA is named as the thing the fix lives in, the tools are 'DARA-internal', and dev.to applies no editorial check. That is ordinary developer-marketing pressure rather than a hidden interest — no vendor, funding or competitive product is at stake — but it does explain why the post reads as a solution rather than an evaluation, and why no downside gets a paragraph.
Coherent, uncorroborated
We are fairly sure the mechanism works as described — it is internally consistent, the code matches the prose, and the control-model reading is a plausible account of the protocol. We are much less sure of anything about magnitude or generality, because a single self-reported implementation with a truncated final snippet is all the ground there is.