Skip to content

Published 8h ago Build 7 min read

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.

Send a correction

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.

Independently confirmed3 publishersFor you

Written for builders.

Artwork accompanying Notion and Block push MCP tools toward workflows as the protocol drops its session
Generated illustration
First tool calls lose the initialize step Requests needed for a first tool call in the MCP spec examples, version 2025-11-25 against version 2026-07-28.

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.

First tool calls lose the initialize step
MeasureValueAs ofClaim
First tool call, 2025-11-252 requests36
First tool call, 2026-07-281 requests36

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. [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.

    Reported Source: Notion engineering blogView cited source
  2. [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.

    Reported Source: Notion engineering blogView cited source
  3. [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.

    Reported Source: Notion engineering blogView cited source
  4. [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".

    Reported Source: Notion engineering blogView cited source
  5. [5]

    In Notion's hosted MCP server, each user goes through a one-click OAuth authorization flow to connect to the same public integration.

    Reported Source: Notion engineering blogView cited source
  6. [6]

    Notion says that hosting its own MCP server lets it ship improvements without requiring users to download updated packages.

    Reported Source: Notion engineering blogView cited source
  7. [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.

    Reported Source: Notion engineering blogView cited source
  8. [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.

    Reported Source: Notion engineering blogView cited source
  9. [9]

    Notion says it does not see MCP as the winner over specification tools like OpenAPI; it sees the technologies working together.

    Reported Source: Notion engineering blogView cited source
  10. [10]

    Block has developed more than 60 MCP servers, and its playbook reflects patterns and learnings observed across that ecosystem.

    Reported Source: Block engineering blogView cited source
  11. [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.

    Reported Source: Block engineering blogView cited source
  12. [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.

    Reported Source: Block engineering blogView cited source
  13. [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.

    Reported Source: Block engineering blogView cited source
  14. [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.

    Reported Source: Block engineering blogView cited source
  15. [15]

    Block's playbook says tool names, descriptions and parameters are treated as prompts for the LLM.

    Reported Source: Block engineering blogView cited source
  16. [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.

    Reported Source: Block engineering blogView cited source
  17. [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.

    Reported Source: Block engineering blogView cited source
  18. [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.

    Reported Source: Block engineering blogView cited source
  19. [19]

    Block prefers actionable error messages that enable recovery by the agent over vague prompt instructions such as "Don't return large files!".

    Reported Source: Block engineering blogView cited source
  20. [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.

    Reported Source: MCP project blogView cited source
  21. [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.

    Reported Source: MCP project blogView cited source
  22. [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.

    Reported Source: MCP project blogView cited source
  23. [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.

    Reported Source: MCP project blogView cited source
  24. [24]

    The Mcp-Session-Id header and the protocol-level session that came with it are removed (SEP-2567).

    Reported Source: MCP project blogView cited source
  25. [25]

    Six Specification Enhancement Proposals (SEPs) work together to make MCP stateless at the protocol layer.

    Reported Source: MCP project blogView cited source
  26. [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.

    Reported Source: MCP project blogView cited source
  27. [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.

    Reported Source: MCP project blogView cited source
  28. [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".

    Reported Source: MCP project blogView cited source
  29. [29]

    The MCP team wrote that the explicit-handle pattern "makes the state visible to the model" rather than hidden away.

    Reported Source: MCP project blogView cited source
  30. [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.

    Reported Source: MCP project blogView cited source
  31. [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."

    Reported Source: MCP blog, "The 2026-07-28 Specification", July 28, 2026
  32. [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".

    Reported Source: MCP blog, "The 2026-07-28 Specification", July 28, 2026
  33. [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.

    Reported Source: MCP blog, "The 2026-07-28 Specification", July 28, 2026
  34. [34]

    "Roots, Sampling, and Logging are deprecated (SEP-2577). They still work, and they'll keep working for at least twelve months"

    Reported Source: MCP blog, "The 2026-07-28 Specification", July 28, 2026
  35. [35]

    "The legacy HTTP+SSE transport is also considered to be officially deprecated, with a year-long offramp."

    Reported Source: MCP blog, "The 2026-07-28 Specification", July 28, 2026
  36. [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.

    Derived
  37. [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.

    Derived

Sources & coverage · 3 publishers

The reporting this story was synthesized from, earliest first. Every link goes to the original.

  1. blog.modelcontextprotocol.ioyesterday
    2026-07-28 revision
  2. engineering.block.xyzyesterday
    MCP playbook

Additional citations

  • Notion engineering blog
  • Block engineering blog
  • MCP project blog
  • MCP blog, "The 2026-07-28 Specification", July 28, 2026