Back to articles

Tag archive

#tooldesign

W
Aug 22, 2026

What an MCP server actually is, and the tool-design mistakes that break it

MCP gives you a standard wire format for connecting an agent to tools — it doesn't make the tools on the other end safe to call. Most MCP servers are thin wrappers around an existing REST API, which quietly imports every assumption that API made about having a human developer as its client. Here's what MCP actually is, how it differs from the API you already know, and the specific tool-design mistakes that turn a working MCP server into a flaky agent.

Aug 22, 20269 min read1 reactions1 comments
T
Aug 20, 2026

Tool output is untrusted input: prompt injection is a data-flow bug

Prompt injection isn't a prompting problem, so you can't prompt your way out of it. It's the same class as SQL injection: data from an untrusted source crosses into a control channel and gets executed as instructions. The web page your agent just fetched, the ticket it just read, the email in its inbox — all of it is attacker-controllable input flowing straight into the one component that can't tell data from commands. Here's the data-flow framing, why 'ignore injected instructions' can't work, and the boundary that actually helps.

Aug 20, 20266 min read0 reactions1 comments
S
Aug 19, 2026

Streaming tool calls without losing your mind

Streaming a text response is easy: print tokens as they arrive, order doesn't matter to the reader. Streaming a tool call is not, because the payload is JSON, and partial JSON is not valid JSON. The three ways people handle that mismatch, why two of them break in production, and the pattern that lets you show progress without ever executing on a half-formed argument.

Aug 19, 20265 min read1 reactions0 comments
Y
Aug 11, 2026

Your retry just sent the email twice: idempotency keys for agents

Retrying a read is free. Retrying a write can charge a card twice, send two emails, or book two rooms — and the model has no idea it happened. Retry safety is a property you build into the tool, not a flag you set on the loop. Here's why at-least-once delivery is the default you're actually running, how to derive a stable idempotency key from an agent's intent, and a dedup wrapper that makes any write safe to retry.

Aug 11, 20267 min read0 reactions0 comments