Notion and Block push MCP tools toward workflows as the protocol drops its session
MCP's final 2026-07-28 specification, released July 28, 2026, removes the protocol-level session and the initialize handshake. Servers that need state now mint a handle for the model to pass back, and Notion and Block both favor workflow-shaped tools.
Correction, : An earlier version described MCP's 2026-07-28 specification as a release candidate due to be finalised on July 28, 2026. The final specification shipped on that date; the story now says so.
Written for builders.See today for builders

Before and after: the 2025-11-25 example needs two requests for a first tool call, initialize then tools/call; the 2026-07-28 example needs one.
| Measure | Value | As of | Claim |
|---|---|---|---|
| First tool call, 2025-11-25 | 2 requests | 36 | |
| First tool call, 2026-07-28 | 1 requests | 36 |
What happened
- Notion started by releasing a downloadable open-source MCP server in early April. It could be installed in Cursor or Claude Desktop, though it required technical knowledge.
- Setup of Notion's first server involved creating a new Notion API integration and either copying the API key into MCP headers or building a Docker image.
- The library parsed a formal description of available API endpoints and their interfaces, converting MCP tool calls into HTTP API calls to Notion's public API using the user's configured API key. Each API endpoint mapped 1:1 to an MCP tool in the server.
- Notion wrote that feedback from early adopters revealed two critical insights: the technical barrier was too high for widespread adoption, and "the 1:1 API mapping created suboptimal experiences for AI agents, like high-context token consumption from working with hierarchical block data in JSON".
- In Notion's hosted MCP server, each user goes through a one-click OAuth authorization flow to connect to the same public integration.
Why it matters
The session leaves the protocol
Under MCP 2025-11-25, a tool call over Streamable HTTP starts with an initialize request. The server answers with an Mcp-Session-Id that every later request must carry, and that header pins the client to the instance that issued it [21]. Under 2026-07-28 the same call is one self-contained request that any server instance can handle [22]. In the project's own examples, that is one request fewer for a first tool call [36].
The handshake is removed (SEP-2575). Protocol version, client info and client capabilities now ride in _meta on every request, and a new server/discover method lets a client fetch server capabilities when it wants them up front [23]. The Mcp-Session-Id header and the protocol-level session go too (SEP-2567) [24]. Six SEPs work together to get there [25].
The payoff is in operations. A remote server that needed sticky sessions, a shared session store and deep packet inspection at the gateway can now run behind a plain round-robin load balancer. It can route on an Mcp-Method header, and clients can cache tools/list responses for as long as the server's ttlMs permits [26]. That removes three pieces of infrastructure from the requirements [37]. In its release-candidate post, the project called 2026-07-28 the largest revision of the protocol since launch and said it contains breaking changes [20].
The final specification shipped on July 28, 2026, with SDKs released the same day [31]. Both removals are in the final text, which carries method and tool names in the Mcp-Method and Mcp-Name headers and puts ttlMs and cacheScope on list responses [33]. The TypeScript, Python, Go and C# SDKs are updated to match, and the Rust SDK supports the new spec in beta [32]. Roots, Sampling and Logging are deprecated under SEP-2577, and the project said they will keep working for at least twelve months [34]. The legacy HTTP+SSE transport is deprecated as well, with what the post calls "a year-long offramp" [35].
State moves into the tool contract
The revision does not forbid state. The MCP team wrote that removing the protocol-level session "does not mean your application has to be stateless" [27]. A server that needs state across calls mints a handle from a tool, such as a basket_id or a browser_id, and the model passes it back as an ordinary argument on later calls [27]. The team wrote that it has found the pattern to be "more than just a workable substitute for session state" [28], and that the pattern "makes the state visible to the model" [29].
So the cost lands on servers that used the session as a store. In our view, the migration job for a stateful server is to write the handle into the tool contract. Block's playbook says tool names, descriptions and parameters are treated as prompts for the LLM [15]. A handle is a parameter, so the model reads its name and description the same way.
Block also prefers actionable error messages that let the agent recover over vague instructions [19]. We'd expect that to apply to a stale handle. An error that names the tool which mints a new one gives the model a next step.
The revision also changes who can speak first. Server-initiated requests may now be issued only while the server is actively processing a client request (SEP-2260). Earlier spec versions recommended that; it is now required. The stated effect is that every elicitation traces back to something the user or their agent started [30]. A server that prompts a user on its own schedule is out of line with that rule.
What Notion took apart
Notion's first release was a downloadable server, shipped in early April, that could be installed in Cursor or Claude Desktop [1]. Setup meant creating a Notion API integration and either copying its API key into MCP headers or building a Docker image [2]. Behind it, the library parsed a formal description of the API's endpoints and converted each MCP tool call into an HTTP call to Notion's public API using the configured key. Each endpoint mapped 1:1 to a tool [3].
Notion wrote that early-adopter feedback gave two insights. The technical barrier was too high for widespread adoption. And "the 1:1 API mapping created suboptimal experiences for AI agents, like high-context token consumption from working with hierarchical block data in JSON" [4].
Those are two causes, and only one concerns tool shape. The hosted server answers the install problem: each user goes through a one-click OAuth flow to connect the same public integration [5], and Notion can ship improvements without users downloading updated packages [6]. The shape problem gets its own fix. Notion says the hosted integration exposes "a tailored suite of tools optimized for AI agents", not HTTP calls to the API, and can ship functionality slices with "LLM-friendly descriptions" that are reachable only through the MCP server [7].
Notion did not discard its schemas. It built a code-generation pipeline that converts its generated OpenAPI schemas to Zod and plumbs those into the hosted server's tools [8]. It also says it sees MCP and specification tools like OpenAPI as working together [9]. In our view the endpoint inventory still feeds the server, with a curated tool list on top of it.
What Block adds
Block has built more than 60 MCP servers, and its playbook reflects patterns across them [10]. The first best practice is headed "Design top-down from workflows, not bottom-up from API endpoints" [11]. The playbook says to start from the workflow that needs automating and work backwards "in as few steps as possible" [11]. It says raw endpoints such as GET /user or GET /file usually produce verbose, poorly scoped outputs [12].
Its example has two tools, get_user and upload_file. The get_user call returns a giant JSON blob when the caller needs only a username. Block's recommended version is one upload_file(path, owner) tool that gets the user, uploads the file with the owner and returns a success or error message [13].
Block ties shape to context budget. It notes that Claude 3.7 can process at most 200K input tokens, and says performance drops for large contexts even on models with larger windows [16]. For tools that may return a lot, it lists three responses: raise an error, reduce the output with a note that it was truncated, or paginate. Pagination trades fewer tool calls against the token budget [17]. In the Goose file reader, files over 400kB raise a tool execution error. Block says LLMs work around that with shell commands such as sed -n [18].
Only Notion's account describes replacing a server. Block's playbook is guidance drawn from its 60-plus servers [10]. The passages available do not include token counts from Notion, a rebuilt Block server, or any mention of the 2026-07-28 revision by either company.
Where tool shape and state meet
Both companies name the same cost. Notion points to high-context token consumption from hierarchical block data in JSON [4]. Block points to a giant JSON blob returned when only a username is needed [13].
In our view, tool shape and state are one decision. A workflow tool that does the lookup and the upload in one call needs no handle between those steps [13]. Where a chain stays, Block says to spell out the steps and dependencies in the tool's instructions and keep earlier outputs concise [14]. Under the new protocol, what links the steps is an argument the model passes [27]. Pagination is the plain case. Block says some outputs must be fetched page by page through tool calls [17], and we'd expect the page position to travel as an argument too.
How far Notion's result transfers depends on the API behind the server. Its problem was hierarchical block data returned as JSON [4]. A server whose endpoints already return small, flat answers has less to gain from remapping. Block hedges its own advice: it says it is "usually better to start top-down" from the workflow [11].
What to watch
- How many MCP servers move off Roots, Sampling, Logging and the legacy HTTP+SSE transport before the twelve-month deprecation window closes.
- Published call counts or token figures from Notion, Block or others comparing workflow-shaped tools with endpoint-per-tool servers.
- How MCP clients and servers apply the SEP-2260 rule that server-initiated requests come only during an active client request.
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Notion started by releasing a downloadable open-source MCP server in early April. It could be installed in Cursor or Claude Desktop, though it required technical knowledge.
- [2]
Setup of Notion's first server involved creating a new Notion API integration and either copying the API key into MCP headers or building a Docker image.
- [3]
The library parsed a formal description of available API endpoints and their interfaces, converting MCP tool calls into HTTP API calls to Notion's public API using the user's configured API key. Each API endpoint mapped 1:1 to an MCP tool in the server.
- [4]
Notion wrote that feedback from early adopters revealed two critical insights: the technical barrier was too high for widespread adoption, and "the 1:1 API mapping created suboptimal experiences for AI agents, like high-context token consumption from working with hierarchical block data in JSON".
- [5]
In Notion's hosted MCP server, each user goes through a one-click OAuth authorization flow to connect to the same public integration.
- [6]
Notion says that hosting its own MCP server lets it ship improvements without requiring users to download updated packages.
- [7]
Notion says its hosted integration exposes "a tailored suite of tools optimized for AI agents", not HTTP calls to the API, and can ship functionality slices with "LLM-friendly descriptions" accessible only through the MCP server.
- [8]
Notion built a code-generation pipeline for its hosted MCP server that converts its generated OpenAPI schemas to Zod and plumbs those into the hosted server's tools.
- [9]
Notion says it does not see MCP as the winner over specification tools like OpenAPI; it sees the technologies working together.
- [10]
Block has developed more than 60 MCP servers, and its playbook reflects patterns and learnings observed across that ecosystem.
- [11]
Block's first best practice is headed "Design top-down from workflows, not bottom-up from API endpoints". The playbook says it is usually better to start top-down from the workflow that needs to be automated and work backwards (in as few steps as possible) to define tools that support that flow.
- [12]
Block's playbook says not to expose raw, granular API endpoints like GET /user or GET /file, because these usually produce verbose, poorly scoped outputs.
- [13]
Block's example: two tools, get_user(user_id) and upload_file(path, owner), where get_user returns a giant JSON blob although only the username is needed; the recommended alternative is one upload_file(path, owner) tool that gets the user, uploads the file with the owner and returns a success/error message.
- [14]
Block says that if tool calls must be chained, the steps and dependencies should be clearly outlined in the tool's instructions and the output of previous steps should be concise.
- [15]
Block's playbook says tool names, descriptions and parameters are treated as prompts for the LLM.
- [16]
Block notes that Claude 3.7 can process a maximum of 200K input tokens, and says that even for models with larger windows, performance drops for large contexts.
- [17]
For tools that may return large outputs, Block lists three options: throw an error, reduce the output with a clear note that it was truncated, or paginate so the model gets pages via tool calls. Block notes a trade-off between reducing the number of tool calls and maintaining the token budget.
- [18]
In Goose's file reading tool, files over 400kB raise a tool execution error; Block says LLMs are smart enough to work around this using shell commands like sed -n '500,1000p' file.txt.
- [19]
Block prefers actionable error messages that enable recovery by the agent over vague prompt instructions such as "Don't return large files!".
- [20]
In its May 21, 2026 release-candidate post, the MCP project called 2026-07-28 the largest revision of the protocol since launch, said the final specification would ship on July 28, 2026, and said the release contains breaking changes.
- [21]
In MCP 2025-11-25, calling a tool over Streamable HTTP means establishing a session first: an initialize POST, then the server responds with an Mcp-Session-Id that every subsequent request must carry, pinning the client to whichever instance issued it. The tools/call is a second POST.
- [22]
In 2026-07-28, the same tool call is a single self-contained request, carrying MCP-Protocol-Version, Mcp-Method and Mcp-Name headers, that any server instance can handle.
- [23]
The initialize/initialized handshake is removed (SEP-2575). Protocol version, client info and client capabilities now travel in _meta on every request, and a new server/discover method lets clients fetch server capabilities when they need them up front.
- [24]
The Mcp-Session-Id header and the protocol-level session that came with it are removed (SEP-2567).
- [25]
Six Specification Enhancement Proposals (SEPs) work together to make MCP stateless at the protocol layer.
- [26]
A remote MCP server that previously needed sticky sessions, a shared session store, and deep packet inspection at the gateway can now run behind a plain round-robin load balancer, route traffic on an Mcp-Method header, and let clients cache tools/list responses for as long as the server's ttlMs permits.
- [27]
The MCP team wrote that removing the protocol-level session "does not mean your application has to be stateless". Servers that need to carry state across calls can mint an explicit handle (a basket_id, a browser_id) from a tool and have the model pass it back as an ordinary argument on later calls.
- [28]
The MCP team wrote that it has found the pattern of the model threading an identifier from one tool call to the next to be "more than just a workable substitute for session state".
- [29]
The MCP team wrote that the explicit-handle pattern "makes the state visible to the model" rather than hidden away.
- [30]
Server-initiated requests may now only be issued while the server is actively processing a client request (SEP-2260). Earlier spec versions recommended this; it is now required. The stated effect is that every elicitation traces back to something the user or their agent started.
- [31]
The MCP blog post "The 2026-07-28 Specification", dated July 28, 2026, says: "Today, we're officially pushing the release button on the next version of the MCP specification, 2026-07-28, along with the SDKs that will allow you to start building clients and servers right away."
- [32]
The MCP blog post on the final 2026-07-28 specification says "The TypeScript, Python, Go, and C# SDKs are updated to match" and "the Rust SDK supports the new spec in beta".
- [33]
The final 2026-07-28 specification retires the initialize/initialized exchange and the Mcp-Session-Id header; method and tool names travel in the Mcp-Method and Mcp-Name headers, and list responses carry ttlMs and cacheScope.
- [34]
"Roots, Sampling, and Logging are deprecated (SEP-2577). They still work, and they'll keep working for at least twelve months"
- [35]
"The legacy HTTP+SSE transport is also considered to be officially deprecated, with a year-long offramp."
- [36]
For a first tool call, the 2025-11-25 example needs two requests (initialize, then tools/call) and the 2026-07-28 example needs one, a difference of one request.
- [37]
The infrastructure the source lists as no longer required of a remote server (sticky sessions, a shared session store, deep packet inspection at the gateway) is three items.
Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.
Sources & coverage · 3 publishers
The reporting this story was synthesized from, earliest first. Every link goes to the original.
- blog.modelcontextprotocol.ioyesterday2026-07-28 revision
- notion.comyesterdaymapped each endpoint 1:1 to a tool
- engineering.block.xyzyesterdayMCP playbook