Skip to main content
A backend (also called a provider mode) controls how your tools are presented to the LLM. It sits between the agent and your tools, deciding what the LLM sees and how it invokes them.

Why Backends Matter

When an LLM connects to your MCP server, it calls list_tools() to discover what’s available. The backend determines what comes back: The choice of backend directly affects:
FactorImpact
Token costMore tools in context = more tokens per request
AccuracyFewer choices = LLM picks the right tool more often
DeterminismStructured execution = more predictable outcomes
ComposabilityCode/Plan modes let the LLM chain tools in a single turn

Available Backends

Configuring a Backend

from concierge import Concierge, Config, ProviderType

# Default:Plain
app = Concierge("my-server")

# Explicit
app = Concierge(
    "my-server",
    config=Config(provider_type=ProviderType.SEARCH),
)
The default is Plain. Change it by passing ProviderType.SEARCH, ProviderType.PLAN, or ProviderType.CODE.

Comparison

BackendLLM seesContext costBest for
PlainAll tools directlyHighUnder 20 tools
Searchsearch_tools + call_toolMedium100+ tools
Planexecute_planLowMulti-step workflows
Codeexecute_codeMinimalComplex logic, iteration

Backends + Stages

Backends work on top of stages. If you define stages, the backend only operates on the tools visible in the current stage:not all tools:
app = Concierge(
    "my-server",
    config=Config(provider_type=ProviderType.CODE),
)

app.stages = {"browse": ["search"], "checkout": ["pay"]}
app.transitions = {"browse": ["checkout"], "checkout": []}
In the browse stage with Code mode, tools.pay() raises an error:it’s only available after transitioning to checkout.