---
schema: rendered-html/v1
title: "Choice - FastMCP"
source_url: https://gofastmcp.com/apps/providers/choice
generated_at: 2026-06-11T19:40:30.755148+00:00
---




[FastMCP home page![light logo](images/gofastmcp__com__apps__providers__choice__wordmark.avif)![dark logo](images/gofastmcp__com__apps__providers__choice__wordmark-white.avif)](gofastmcp__com.md)


- [PrefectHQ/fastmcp](https://github.com/PrefectHQ/fastmcp "PrefectHQ/fastmcp")
- [PrefectHQ/fastmcp](https://github.com/PrefectHQ/fastmcp "PrefectHQ/fastmcp")



Prefab Providers

Choice















  - Prefab Providers

    - [Approval

      NEW](gofastmcp__com__apps__providers__approval.md)
    - [Choice

      NEW](/apps/providers/choice)
    - [File Upload

      NEW](gofastmcp__com__apps__providers__file-upload.md)
    - [Form Input

      NEW](gofastmcp__com__apps__providers__form.md)
  - [Development](gofastmcp__com__apps__development.md)
  - [Examples](gofastmcp__com__apps__examples.md)
  - [Architecture](gofastmcp__com__apps__architecture.md)








- [Configuration](#configuration)
- [How it works](#how-it-works)

Prefab Providers

# Choice


Present clickable options instead of free-text responses


New in version `3.2.0`
`Choice` lets the LLM present a set of options as clickable buttons instead of asking the user to type a response. The selection flows back into the conversation as a message, giving the LLM clean structured input.

![The Choice provider shown in Goose, with four lunch options as clickable buttons](https://mintcdn.com/fastmcp/qxtzRAUiJsjdoWFw/apps/images/app-choice.png?fit=max&auto=format&n=qxtzRAUiJsjdoWFw&q=85&s=254e3d7ebaca6ec7b24cdccb5caa9999)

from fastmcp.apps.choice import Choice

mcp = FastMCP("My Server")
mcp.add_provider(Choice())

This registers a single tool:

| Tool | Visibility | Purpose |
| --- | --- | --- |
| `choose` | Model | Shows a card with clickable options, sends the selection back as a message |

The LLM calls `choose` with a prompt and a list of options. The user sees a card with one button per option. Clicking one sends a message back into the conversation:

"Which deployment strategy?" — I selected: Blue-green

This is an advisory interaction, not an enforcement mechanism. The conversation isn’t blocked while the card is open — the user can keep typing, and the LLM could proceed without waiting. The tool description instructs the LLM to stop and wait for the “I selected:” response, but for hard enforcement, implement selection logic server-side.

## [​](#configuration) Configuration

The constructor sets defaults; the LLM can override `title` per-call.

Choice(
    name="Choice",             # App name
    title="Choose an Option",  # Default card heading
    variant="outline",         # Button style for all options

The LLM provides the options per-call:

choose(
    prompt="What should we have for lunch?",
    options=["Pizza", "Tacos", "Ramen", "Salad"],
    title="The Important Questions",

## [​](#how-it-works) How it works

Each option renders as a full-width button in a vertical stack. When the user clicks one:

1. `SendMessage` pushes the selection into the conversation as a user message
2. `SetState("decided", True)` replaces the buttons with “Response sent.”

The tool description instructs the LLM to stop and wait for the “I selected:” message before proceeding with whatever the user chose.

[Approval

Previous](gofastmcp__com__apps__providers__approval.md)[File Upload

Next](gofastmcp__com__apps__providers__file-upload.md)






