Expand description
Conversational elicitation of strongly-typed Rust values via MCP.
The elicitation library provides a trait-based system for eliciting
strongly-typed values from users through conversational interaction via
the Model Context Protocol (MCP). It transforms LLM conversations into
type-safe Rust values with compile-time guarantees.
§MCP Setup Required
This library runs as an MCP server and requires an MCP client (like Claude Desktop or Claude CLI) to provide the elicitation tools. Your application won’t work standalone - it must be invoked by an MCP client.
See the README for setup instructions.
§Core Concepts
§Traits
§Interaction Paradigms
Select- Choose from finite options (enum pattern)Affirm- Yes/no confirmation (bool pattern)Survey- Multi-field elicitation (struct pattern)Authorize- Permission policies (planned for v0.2.0)
§Example
use elicitation::{Elicitation, ElicitResult};
use rmcp::service::{Peer, RoleClient};
async fn example(client: &Peer<RoleClient>) -> ElicitResult<()> {
// Elicit a simple integer
let age: i32 = i32::elicit(communicator).await?;
// Elicit an optional value
let nickname: Option<String> = Option::<String>::elicit(communicator).await?;
// Elicit a collection
let scores: Vec<i32> = Vec::<i32>::elicit(communicator).await?;
Ok(())
}§Derive Macros
The library provides derive macros for automatic implementation:
use elicitation::Elicit;
// Enums automatically use the Select paradigm
#[derive(Elicit)]
enum Color {
Red,
Green,
Blue,
}
// Structs automatically use the Survey paradigm
#[derive(Elicit)]
struct Person {
#[prompt("What is your name?")]
name: String,
#[prompt("What is your age?")]
age: u8,
}§MCP Integration
The library uses the rmcp crate - the official Rust MCP SDK - for MCP client integration. All elicitation happens through asynchronous MCP tool calls.
Re-exports§
pub use prompt_tree::AssembledPrompt;pub use prompt_tree::ElicitPromptTree;pub use prompt_tree::PromptKind;pub use prompt_tree::PromptTree;pub use prompt_tree::collect_assembled_prompts;pub use plugin::DescriptorPlugin;pub use plugin::ElicitPlugin;pub use plugin::NoContext;pub use plugin::PluginContext;pub use plugin::PluginToolRegistration;pub use plugin::StatefulPlugin;pub use plugin::ToolDescriptor;pub use plugin::make_descriptor;pub use plugin::make_descriptor_ctx;pub use dynamic::AnyToolFactory;pub use dynamic::AnyToolSlot;pub use dynamic::DynamicToolDescriptor;pub use dynamic::DynamicToolRegistry;pub use dynamic::ToolFactoryRegistration;pub use dynamic::TypedSlot;pub use verification::types::ValidationError;pub use type_graph::DotRenderer;pub use type_graph::GraphEdge;pub use type_graph::GraphNode;pub use type_graph::GraphRenderer;pub use type_graph::MermaidDirection;pub use type_graph::MermaidRenderer;pub use type_graph::NodeKind;pub use type_graph::TypeGraph;pub use type_graph::TypeGraphError;pub use type_graph::TypeGraphPlugin;pub use type_graph::TypeGraphKey;pub use type_graph::all_graphable_types;pub use type_graph::lookup_type_graph;pub use type_spec::ElicitSpec;pub use type_spec::SpecCategory;pub use type_spec::SpecCategoryBuilder;pub use type_spec::SpecEntry;pub use type_spec::SpecEntryBuilder;pub use type_spec::TypeSpec;pub use type_spec::TypeSpecBuilder;pub use type_spec::TypeSpecInventoryKey;pub use type_spec::lookup_type_spec;pub use type_spec::lookup_type_spec_by_id;pub use type_spec::type_spec_plugin::TypeSpecPlugin;pub use contracts::And;pub use contracts::Established;pub use contracts::Implies;pub use contracts::InVariant;pub use contracts::Is;pub use contracts::Prop;pub use contracts::Refines;pub use contracts::both;pub use contracts::downcast;pub use contracts::fst;pub use contracts::snd;pub use tool::Tool;pub use tool::True;pub use tool::both_tools;pub use tool::then;pub use verification::Contract;pub use verification::types::ArcNonNull;pub use verification::types::ArcSatisfies;pub use verification::types::ArrayAllSatisfy;pub use verification::types::BTreeMapNonEmpty;pub use verification::types::BTreeSetNonEmpty;pub use verification::types::BoolFalse;pub use verification::types::BoolTrue;pub use verification::types::BoxNonNull;pub use verification::types::BoxSatisfies;pub use verification::types::CharAlphabetic;pub use verification::types::CharAlphanumeric;pub use verification::types::CharNumeric;pub use verification::types::DurationNonZero;pub use verification::types::DurationPositive;pub use verification::types::F32Finite;pub use verification::types::F32NonNegative;pub use verification::types::F32Positive;pub use verification::types::F64Finite;pub use verification::types::F64NonNegative;pub use verification::types::F64Positive;pub use verification::types::HashMapNonEmpty;pub use verification::types::HashSetNonEmpty;pub use verification::types::I8NonNegative;pub use verification::types::I8NonZero;pub use verification::types::I8NonZeroStyle;pub use verification::types::I8Positive;pub use verification::types::I8Range;pub use verification::types::I8RangeStyle;pub use verification::types::I16NonNegative;pub use verification::types::I16NonZero;pub use verification::types::I16NonZeroStyle;pub use verification::types::I16Positive;pub use verification::types::I16Range;pub use verification::types::I16RangeStyle;pub use verification::types::I32NonNegative;pub use verification::types::I32NonZero;pub use verification::types::I32Positive;pub use verification::types::I32Range;pub use verification::types::I32RangeStyle;pub use verification::types::I64NonNegative;pub use verification::types::I64NonZero;pub use verification::types::I64Positive;pub use verification::types::I64Range;pub use verification::types::I64RangeStyle;pub use verification::types::I128NonNegative;pub use verification::types::I128NonZero;pub use verification::types::I128Positive;pub use verification::types::I128Range;pub use verification::types::I128RangeStyle;pub use verification::types::IpPrivate;pub use verification::types::IpPublic;pub use verification::types::IpV4;pub use verification::types::IpV6;pub use verification::types::Ipv4Loopback;pub use verification::types::Ipv6Loopback;pub use verification::types::IsizeNonNegative;pub use verification::types::IsizeNonZero;pub use verification::types::IsizePositive;pub use verification::types::IsizeRange;pub use verification::types::IsizeRangeStyle;pub use verification::types::LinkedListNonEmpty;pub use verification::types::OptionSome;pub use verification::types::PathBufExists;pub use verification::types::PathBufIsDir;pub use verification::types::PathBufIsFile;pub use verification::types::PathBufReadable;pub use verification::types::RcNonNull;pub use verification::types::RcSatisfies;pub use verification::types::ResultOk;pub use verification::types::StringNonEmpty;pub use verification::types::Tuple2;pub use verification::types::Tuple3;pub use verification::types::Tuple4;pub use verification::types::U8NonZero;pub use verification::types::U8Positive;pub use verification::types::U8Range;pub use verification::types::U8RangeStyle;pub use verification::types::U16NonZero;pub use verification::types::U16Positive;pub use verification::types::U16Range;pub use verification::types::U16RangeStyle;pub use verification::types::U32NonZero;pub use verification::types::U32Positive;pub use verification::types::U32Range;pub use verification::types::U32RangeStyle;pub use verification::types::U64NonZero;pub use verification::types::U64Positive;pub use verification::types::U64Range;pub use verification::types::U64RangeStyle;pub use verification::types::U128NonZero;pub use verification::types::U128Positive;pub use verification::types::U128Range;pub use verification::types::U128RangeStyle;pub use verification::types::UsizeNonZero;pub use verification::types::UsizePositive;pub use verification::types::UsizeRange;pub use verification::types::UsizeRangeStyle;pub use verification::types::VecAllSatisfy;pub use verification::types::VecDequeNonEmpty;pub use verification::types::VecNonEmpty;pub use verification::types::UuidNonNil;pub use verification::types::UuidV4;pub use datetime_chrono::DateTimeUtcGenerationMode;pub use datetime_chrono::DateTimeUtcGenerator;pub use datetime_chrono::NaiveDateTimeGenerationMode;pub use datetime_chrono::NaiveDateTimeGenerator;pub use datetime_time::InstantGenerationMode;pub use datetime_time::InstantGenerator;pub use datetime_time::OffsetDateTimeGenerationMode;pub use datetime_time::OffsetDateTimeGenerator;pub use datetime_jiff::TimestampGenerationMode;pub use datetime_jiff::TimestampGenerator;pub use verification::types::DateTimeUtcAfter;pub use verification::types::DateTimeUtcBefore;pub use verification::types::NaiveDateTimeAfter;pub use verification::types::OffsetDateTimeAfter;pub use verification::types::OffsetDateTimeBefore;pub use verification::types::TimestampAfter;pub use verification::types::TimestampBefore;pub use verification::types::UrlCanBeBase;pub use verification::types::UrlHttp;pub use verification::types::UrlHttps;pub use verification::types::UrlValid;pub use verification::types::UrlWithHost;pub use verification::types::RegexCaseInsensitive;pub use verification::types::RegexMultiline;pub use verification::types::RegexSetNonEmpty;pub use verification::types::RegexSetValid;pub use verification::types::RegexValid;pub use verification::mechanisms::AffirmReturnsBoolean;pub use verification::mechanisms::InputNonEmpty;pub use verification::mechanisms::MechanismWithType;pub use verification::mechanisms::NumericReturnsValid;pub use verification::mechanisms::SurveyReturnsValidVariant;pub use verification::mechanisms::TextReturnsNonEmpty;pub use verification::mechanisms::TextReturnsString;pub use verification::types::StatusCodeValid;pub use rmcp;
Modules§
- contracts
- Proof-carrying composition primitives.
- datetime_
chrono - chrono datetime library elicitation implementations.
- datetime_
jiff - jiff datetime library elicitation implementations.
- datetime_
time - time datetime library elicitation implementations.
- dynamic
DynamicToolRegistry— runtime middleware between inventory and the MCP server.- emit_
code - Code recovery — emit verified workflows as Rust source.
- mcp
- MCP (Model Context Protocol) integration.
- plugin
- Type-erased plugin interface for the elicitation tool registry.
- prompt_
tree - Static prompt tree for
Elicitationtypes. - rand_
rng - Random number generator elicitation.
- style
- Elicitation style system - separates UX from behavior.
- tool
- Contract-based tool system for MCP.
- type_
graph - Type graph visualization for elicitation workflows.
- type_
spec - Type specification layer for agent-accessible type exploration.
- verification
- Formal verification framework for tool chains.
Macros§
- default_
style - Generate a default-only style enum for a type.
- elicit_
newtype - Generates a transparent newtype wrapper around a third-party type.
- elicit_
newtype_ methods - Generates both newtype and method wrappers with MCP tools.
- elicit_
newtype_ traits - Forwards standard library traits from the inner type to an
elicit_newtype!wrapper. - elicit_
newtypes - Generates multiple newtype wrappers in bulk.
- elicit_
router - Creates an aggregator struct that registers elicit_checked tools from multiple types.
- elicit_
tools - Generates elicitation tool methods inside an existing
#[tool_router]impl block. - register_
emit - Register a params type with the global emit registry under a tool name.
- select_
trenchcoat - Generates a Select-aware newtype wrapper for a foreign enum.
- select_
trenchcoat_ traits - Forwards standard library traits from the inner type to a
select_trenchcoat!wrapper.
Structs§
- Alignment
Select - Select-trenchcoat wrapper around
ratatui::layout::Alignment. - Border
Type Select - Select-trenchcoat wrapper around
ratatui::widgets::BorderType. - Borders
Select - Select wrapper for
ratatui::widgets::Borders. - Choice
Set - A set of choices for elicitation.
- Color
Select - Select-trenchcoat wrapper around
ratatui::style::Color. - Column
Descriptor - Serializable SQL column metadata.
- Column
Entry - A single named column value within a SQL row.
- Duration
Generator - Generator for creating Duration values with a specified strategy.
- Elicit
Builder - Builder for one-off style overrides.
- Elicit
Client - Client wrapper that carries style context.
- Elicit
Error - Elicitation error with location tracking.
- Elicit
Server - Server wrapper that carries style context.
- Elicit
Tool Descriptor - Describes an elicit tool that can be registered with MCP.
- Elicit
Tool Output - Wrapper that ensures MCP-compliant object schemas for any type.
- Elicitation
Context - Storage for current elicitation context (for observability).
- Field
Info - Metadata for a single survey field.
- Formatter
- Formatting helper - unit struct with formatting methods.
- IoError
Generator - Generator for creating std::io::Error instances for testing.
- Json
Error - JSON parsing error wrapper.
- Parser
- Parser helper - unit struct with parsing methods.
- Plugin
Registry - Aggregates multiple
ElicitPlugininstances into one MCP server. - Ratatui
Direction Select - Select-trenchcoat wrapper around
ratatui::layout::Direction. - Ratatui
Margin - Elicitable representation of
ratatui::layout::Margin. - Ratatui
Padding - Elicitable representation of
ratatui::widgets::Padding. - Ratatui
Style - Elicitable representation of
ratatui::style::Style. - Rmcp
Error - RMCP error wrapper.
- RowData
- Serializable SQL row data.
- Scrollbar
Orientation Select - Select-trenchcoat wrapper around
ratatui::widgets::ScrollbarOrientation. - Service
Error - RMCP ServiceError wrapper for error conversion.
- Style
Context - Storage for type-specific styles.
- System
Time Generator - Generator for creating SystemTime values with a specified strategy.
- Toolchain
- A curated subset of a
PluginRegistry, visible to agents. - Type
Metadata - Complete metadata describing a type’s elicitation structure.
- Uuid
Generator - Generator for creating UUIDs with a specified strategy.
- Validator
- Validation helper - unit struct with validation methods.
- Variant
Metadata - Metadata for one variant of a Select-pattern enum.
Enums§
- Alignment
Style - Default-only style enum.
- AnyQuery
Result Style - Default-only style enum.
- AnyType
Info Kind Style - Default-only style enum.
- AnyType
Info Style - Default-only style enum.
- ArgAction
Style - Default-only style enum.
- ArgGroup
Style - Default-only style enum.
- ArgStyle
- Default-only style enum.
- Border
Type Style - Default-only style enum.
- Client
Style - Default-only style enum.
- Color
Choice Style - Default-only style enum.
- Color
Style - Default-only style enum.
- Column
Descriptor Style - Default-only style enum.
- Column
Entry Style - Default-only style enum.
- Column
Value - Serializable SQL column value.
- Column
Value Style - Default-only style enum.
- Command
Style - Default-only style enum.
- Driver
Kind - SQL database driver category.
- Driver
Kind Style - Default-only style enum.
- Duration
Generation Mode - Generation mode for Duration.
- Elicit
Error Kind - Specific error conditions during elicitation.
- Elicitation
Pattern - The elicitation pattern used by a type.
- Error
Kind Style - Default-only style enum.
- Header
MapStyle - Default-only style enum.
- IdStyle
- Default-only style enum.
- IoError
Generation Mode - Generation mode for std::io::Error.
- Method
Style - Default-only style enum.
- Pattern
Details - Pattern-specific structural details.
- Possible
Value Style - Default-only style enum.
- Ratatui
Direction Style - Default-only style enum.
- Ratatui
Margin Style - Default-only style enum.
- Ratatui
Padding Style - Default-only style enum.
- Ratatui
Style Style - Default-only style enum.
- Request
Builder Style - Default-only style enum.
- Response
Style - Default-only style enum.
- RowData
Style - Default-only style enum.
- SqlType
Kind - Serializable SQL column type category.
- SqlType
Kind Style - Default-only style enum.
- Sqlx
Error Kind Style - Default-only style enum.
- Status
Code Style - Default-only style enum.
- String
Style - Elicitation style variants for String.
- System
Time Generation Mode - Generation mode for SystemTime.
- Uuid
Generation Mode - Generation mode for UUID.
- Value
Hint Style - Default-only style enum.
- Value
Range Style - Default-only style enum.
- Value
Source Style - Default-only style enum.
- Version
Style - Default-only style enum.
Traits§
- Affirm
- Binary confirmation (yes/no, true/false pattern).
- Authorize
- Permission-granting interaction with policy choices.
- Elicit
Communicator - Abstraction for elicitation communication.
- Elicit
Complete - Compiler-enforced supertrait for fully-implemented elicitation support.
- Elicit
Introspect - Static introspection into a type’s elicitation structure.
- Elicit
Json - Single-shot JSON elicitation for types with a known schema.
- Elicit
Proxy - Bridge a type to its serializable elicit proxy.
- Elicitation
- Main elicitation trait - entry point for value elicitation.
- Filter
- Collection-level filtering for selection options.
- Generator
- Trait for generating values of a type.
- Prompt
- Shared metadata for prompts across all elicitation patterns.
- Select
- Select one value from a finite set (dropdown/radio button pattern).
- Style
Marker - Marker trait for elicitation style types.
- Survey
- Multi-field structured elicitation (form/wizard pattern).
- Verified
Workflow - Compiler-enforced supertrait for fully-proven workflow propositions.
Functions§
- collect_
all_ elicit_ tools - Collect all elicit tools registered via
#[derive(Elicit)].
Type Aliases§
- Elicit
Result - Convenience alias for elicitation results.
Attribute Macros§
Derive Macros§
- Elicit
- Derive the Elicit trait for enums (→ Select) or structs (→ Survey).
- Elicit
Plugin - Generate a
ToolDescriptorcompanion function from an async tool handler. - Prop
- Derive the
Proptrait for a zero-cost typestate marker. - ToCode
Literal - Derive
ToCodeLiteralfor structs and enums.