The Problem
A standard MCP server exposes all tools at once. With 30+ tools, the LLM:- Wastes context on irrelevant tool schemas
- Picks the wrong tool more often
- Can call tools in the wrong order (e.g.,
checkoutbeforeadd_to_cart)
Stages as Tool Groups
At their core, stages are tool groups. You don’t need transitions to use them. Even without defining any transitions, stages give you a powerful pattern: the LLM sees only the group names instead of every individual tool. When it selects a group, the tools inside that group are revealed. This means a server with 50 tools doesn’t dump all 50 into the context. Instead, the LLM sees 5 group names, picks the relevant one, and only then gets the 10 tools inside it.Connected Stages with Transitions
When you add transitions, stages become a workflow. The LLM can only move between groups in the order you define, enforcing tool ordering and preventing invalid calls.Defining Stages
A stage is a named group of tools. When a session starts, the LLM only sees the tools in the first stage:The first stage defined is the default. When a session starts, the agent only sees tools from that stage.
How Transitions Work
Transitions define the allowed paths between stages:[] means the stage is terminal:the workflow ends there.
Auto-Generated Tools
When stages are defined, Concierge automatically adds two tools:| Tool | What it does |
|---|---|
proceed_to_next_stage(target_stage) | Moves to a new stage. Only accepts stages listed in the current stage’s transitions. Triggers a tool list refresh. |
terminate_session() | Clears all session state and resets to the initial stage. |
Under the Hood
Here’s what happens when the agent callsproceed_to_next_stage("cart"):
The key insight: the MCP tools/list_changed notification tells the client to re-fetch the tool list. The agent now sees a completely different set of tools.
Non-Linear Transitions
Transitions don’t have to be linear. You can allow going back:Combining with Provider Modes
Stages work on top of any provider mode. With code mode, the agent writes Python but can only call tools available in the current stage:browse stage, tools.pay() would raise an error:it’s not available until the agent transitions to checkout.