Back to Fastmcp

elicitation

docs/python-sdk/fastmcp-server-elicitation.mdx

3.2.45.7 KB
Original Source

fastmcp.server.elicitation

Functions

parse_elicit_response_type <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L132" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
parse_elicit_response_type(response_type: Any, response_title: str | None = None, response_description: str | None = None) -> ElicitConfig

Parse response_type into schema and handling configuration.

Supports multiple syntaxes:

  • None: Empty object schema, expect empty response
  • dict: {"low": {"title": "..."}} -> single-select titled enum
  • list patterns:
    • [["a", "b"]] -> multi-select untitled
    • [{"low": {...}}] -> multi-select titled
    • ["a", "b"] -> single-select untitled
  • list[X] type annotation: multi-select with type
  • Scalar types (bool, int, float, str, Literal, Enum): single value
  • Other types (dataclass, BaseModel): use directly

The response_title and response_description arguments customize the label and description of the wrapped value property for the scalar/dict/list shorthand forms. They are only valid when FastMCP is wrapping the response type; passing them with a full BaseModel/dataclass (or None) raises TypeError, because in those cases the user already controls field metadata via Field(title=..., description=...).

handle_elicit_accept <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L309" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
handle_elicit_accept(config: ElicitConfig, content: Any) -> AcceptedElicitation[Any]

Handle an accepted elicitation response.

Args:

  • config: The elicitation configuration from parse_elicit_response_type
  • content: The response content from the client

Returns:

  • AcceptedElicitation with the extracted/validated data

get_elicitation_schema <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L368" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
get_elicitation_schema(response_type: type[T]) -> dict[str, Any]

Get the schema for an elicitation response.

Args:

  • response_type: The type of the response

validate_elicitation_json_schema <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L387" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
validate_elicitation_json_schema(schema: dict[str, Any]) -> None

Validate that a JSON schema follows MCP elicitation requirements.

This ensures the schema is compatible with MCP elicitation requirements:

  • Must be an object schema
  • Must only contain primitive field types (string, number, integer, boolean)
  • Must be flat (no nested objects or arrays of objects)
  • Allows const fields (for Literal types) and enum fields (for Enum types)
  • Only primitive types and their nullable variants are allowed

Args:

  • schema: The JSON schema to validate

Raises:

  • TypeError: If the schema doesn't meet MCP elicitation requirements

Classes

ElicitationJsonSchema <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L36" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

Custom JSON schema generator for MCP elicitation that always inlines enums.

MCP elicitation requires inline enum schemas without $ref/$defs references. This generator ensures enums are always generated inline for compatibility. Optionally adds enumNames for better UI display when available.

Methods:

generate_inner <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L44" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
generate_inner(self, schema: core_schema.CoreSchema) -> JsonSchemaValue

Override to prevent ref generation for enums and handle list schemas.

list_schema <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L57" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
list_schema(self, schema: core_schema.ListSchema) -> JsonSchemaValue

Generate schema for list types, detecting enum items for multi-select.

enum_schema <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L94" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

python
enum_schema(self, schema: core_schema.EnumSchema) -> JsonSchemaValue

Generate inline enum schema.

Always generates enum pattern: {"enum": [value, ...]} Titled enums are handled separately via dict-based syntax in ctx.elicit().

AcceptedElicitation <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L105" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

Result when user accepts the elicitation.

ScalarElicitationType <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L113" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

ElicitConfig <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/server/elicitation.py#L118" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>

Configuration for an elicitation request.

Attributes:

  • schema: The JSON schema to send to the client
  • response_type: The type to validate responses with (None for raw schemas)
  • is_raw: True if schema was built directly (extract "value" from response)