Stateless MCP has recaptured my curiosity (and impressed mcp-explorer and datasette-mcp)
thirty first July 2026
Tuesday was Stateless MCP day—the rollout of MCP 2.0, or the 2026-07-28 Mannequin Context Protocol specification to make use of the extra formal however much less memorable identify. That is probably the most vital change to the MCP spec because it first launched, and has additionally served to reignite my private curiosity within the protocol.
For background: MCP is the Mannequin Context Protocol, which describes a regular strategy to expose new instruments to LLM-powered agent frameworks. It was launched by Anthropic again in November 2024, had an enormous spike of curiosity by means of a lot of 2025, after which turned considerably eclipsed by Expertise (one other Anthropic invention) when it turned obvious that an agent harness with entry to a terminal and curl might do most of what MCP did in a extra versatile method. I wrote about that in my overview of 2025.
I’m coming again round to MCP now. Giving an agent a shell setting with the flexibility to entry the web is fraught with threat, and requires a powerful mannequin that’s able to successfully driving such an setting. MCP instruments are simpler to audit and management, and easy sufficient that smaller fashions that run on a laptop computer can nonetheless drive them fairly effectively.
The brand new stateless MCP specification additionally drastically decreases the complexity of implementing each shoppers and servers for the protocol. I constructed three of these this week!
What’s simpler with stateless MCP
The perfect demonstration of the distinction between stateful and stateless MCP is on this Could twenty first weblog put up that launched the RC for the brand new specification. It included a transparent before-and-after instance.
The older stateful MCP (I’m going to name it “legacy MCP”) required two HTTP requests—the primary to initialize a session and acquire a Mcp-Session-Id, and the second to really name the device:
POST /mcp HTTP/1.1
Content material-Kind: utility/json
{
“jsonrpc”: “2.0”,
“id”: 1,
“methodology”: “initialize”,
“params”: {
“protocolVersion”: “2025-11-25”,
“capabilities”: {
},
“clientInfo”: {
“identify”: “my-app”,
“model”: “1.0”
}
}
}
POST /mcp HTTP/1.1
Mcp-Session-Id: 1868a90c-3a3f-4f5b
Content material-Kind: utility/json
{
“jsonrpc”: “2.0”,
“id”: 2,
“methodology”: “instruments/name”,
“params”: {
“identify”: “search”,
“arguments”: {
“q”: “otters”
}
}
}
The brand new stateless method makes use of a single HTTP request which seems to be like this:
POST /mcp HTTP/1.1
MCP-Protocol-Model: 2026-07-28
Mcp-Methodology: instruments/name
Mcp-Identify: search
Content material-Kind: utility/json
{
“jsonrpc”: “2.0”,
“id”: 1,
“methodology”: “instruments/name”,
“params”: {
“identify”: “search”,
“arguments”: {
“q”: “otters”
},
“_meta”: {
“io.modelcontextprotocol/clientInfo”: {
“identify”: “my-app”,
“model”: “1.0”
}
}
}
}
That is a lot cleaner from each a client- and server-side implementation perspective. It’s additionally a greater match for constructing scalable net functions, since now you don’t want to keep up server-side state to maintain observe of these session IDs, or fear about routing the identical session to the identical backend machine.
mcp-explorer
I couldn’t discover an amazing CLI device for interactively probing an MCP server, so I had Codex assist construct my very own.
mcp-explorer is the consequence. It’s a stateless Python CLI device, so that you don’t even want to put in it to attempt it out—it really works with uvx like this:
This queries Ade Oshineye’s agentic-mermaid.dev demo MCP. The above command returns the next checklist of instruments:
execute(code: string, timeoutMs?: integer) – Execute Mermaid SDK code
Run JavaScript in an remoted sandbox; return a price.
describe_sdk(household: string, element?: string) – Describe Mermaid SDK operations
Return version-matched mutation operations for one diagram household.
render_svg(supply: string, choices?: object) – Render Mermaid as SVG
Render a Mermaid supply string to themeable SVG. Returns { okay, svg }.
render_ascii(supply: string, useAscii?: boolean, targetWidth?: integer, choices?: object) – Render Mermaid as textual content
Render a Mermaid supply string to textual content. Returns { okay, textual content }.
render_png(supply: string, scale?: quantity, background?: string, fitTo?: object, choices?: object) – Render Mermaid as PNG
Rasterize a Mermaid supply string to PNG. Returns { okay, png_base64 }.
…
Then to examine a device:
This outputs an entire bunch of data, together with the JSON schema of the inputs and outputs.
To name that device and go arguments to it:
https://agentic-mermaid.dev/mcp
render_svg
-a supply ‘graph TD; A–>B‘
-a choices ‘{“padding”:24}‘
Which returns:
{“okay”:true,”svg”:”
To get simply the uncooked SVG attempt including | jq .svg -r to that command. I acquired again this picture:
There are a couple of extra instructions within the README, however you get the overall thought. I discover constructing CLI instruments like this to be a very productive strategy to get acquainted with a specification, even when an agent writes many of the precise code.
datasette-mcp
The second mission is datasette-mcp, a Datasette plugin which provides a /-/mcp endpoint to any Datasette occasion.
That is in all probability the fourth time I’ve tried constructing this plugin, however due to the brand new stateless MCP specification I lastly have a model that feels good to launch.
It gives simply three instruments: list_databases(), get_database_schema(database_name), and execute_sql(database_name, sql). They do precisely what you’d anticipate them to do—although execute_sql() is read-only for the second.
Wire these into an agent, or a chat device like ChatGPT or Claude, they usually’ll acquire the flexibility to run SQL queries towards your hosted Datasette occasion.
To date I’m operating it on the Datasette mirror of my weblog, at datasette.simonwillison.internet/-/mcp. It took a little bit of fiddling to determine how you can connect that to ChatGPT and Claude, however I acquired there in the long run. Right here’s a brand new TIL displaying precisely how to do this.
Right here’s a shared Claude session the place I requested it:
checklist tables in simonwillison.internet
After which:
what has Simon mentioned just lately about MCP?
It ran 7 separate SQL queries to determine the reply.
llm-mcp-client
My LLM device is lengthy overdue for an official MCP integration. The brand new alpha llm-mcp-client plugin is my try at precisely that:
llm -T ‘MCP(“https://datasette.simonwillison.internet/-/mcp”)‘ ‘depend the notes‘
Right here’s the output (together with reasoning hint, I’m utilizing LLM 0.32rc2):
Contemplating observe depend
I see the query “depend the notes” might be asking me to tally up weblog notes. It might additionally imply revealed notes or drafts, so there’s some ambiguity there. I’ll want to determine the overall variety of notes, possible by querying the depend for each revealed notes and drafts to get a transparent reply. Let’s execute that depend!
There are 151 notes.
And the output of llm logs for that immediate.
As soon as that is totally baked, I’m contemplating bringing it immediately into LLM core. I’m excited to experiment with MCP in Datasette Agent and llm-coding-agent as effectively.
MCP is a safer strategy to construct with brokers
A number of months after MCP was first launched, I wrote Mannequin Context Protocol has immediate injection safety issues, the place I famous that the sample of getting finish customers combine and match instruments pushed duty for avoiding knowledge exfiltration assaults out to the customers themselves. I hadn’t coined the Deadly Trifecta but, however that was completely what I had in thoughts.
Then common brokers with arbitrary shell and curl entry got here alongside, and that’s a lot tougher to maintain safe!
One thing I’ve come to understand about MCP is that it’s a lot simpler to purpose about agent capabilities and what would possibly go mistaken than with arbitrary command execution in an open community setting—the default for many of immediately’s common and coding agent instruments.
I plan to lean into MCP an entire lot extra once I’m constructing delicate functions on prime of LLMs.

