Skip to content

Exploring the Future of "Sessions" (Thread IDs / Conversation IDs) #36

Description

@kurtisvg

Background & Current State

Recently, the MCP core maintainers made the decision to remove "Sessions" from the protocol.

Historically, sessions were included in the protocol but suffered from significant ambiguity and implementation complexities. After reviewing the trade-offs between stateful and sessionless architectures, the decision was made to move to a sessionless baseline.

You can read the full context of this decision here:

Pushback

Since the decision, we've received pushback from the community highlighting scenarios where maintaining state across a series of interactions feels necessary. There is an active debate, including alternative proposals to retain or rework this functionality (see PR #2822).

We are opening this issue to formally collect concrete use cases for "sessions", and to discuss what a path forward might look like.

Experimental Extension

Before bringing sessions back into the core protocol, we are considering introducing it as an experimental extension. However, to do this successfully, we need to resolve the core challenges that caused us to remove sessions in the first place.

If we reintroduce this concept, we also need to move away from the term "Sessions." The word is heavily overloaded across different networking and application layers. Moving forward, we are proposing terms like Conversation IDs or Thread IDs to more accurately reflect their purpose: grouping a logical sequence of MCP requests.

Challenges

For any Thread ID / Conversation ID proposal to succeed, we need to clearly define its scope. Previous implementations struggled because the boundaries were too blurry. We need to answer:

  1. Lifecycle Management:
    • When exactly does a Thread ID start and stop?
    • Is the lifecycle explicitly managed by the client (e.g., an initialization call), or implicitly created on the first tool call?
    • How do we handle cleanup and timeouts for abandoned threads?
  2. Scope of Impact:
    • What protocol capabilities should a Thread ID be allowed to mutate?
    • Does a Thread ID only provide context to tools/call execution?
    • Or should a Thread ID be allowed to dynamically alter the results of tools/list, resources/list, and prompts/list based on the conversation's state? (Allowing this previously caused massive caching and synchronization headaches).

Call for Use Cases

To design this right, we need to know exactly how you were using (or planning to use) sessions.

Please reply below with your use cases. When doing so, try to answer:

  • What is the exact workflow you are trying to achieve?
  • Why can't this be solved by passing state/context directly into the tool call parameters?
  • Do you need the Thread ID to change the available tools/resources, or just the execution context of a specific tool?

Looking forward to the community's input.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions