ExMCP.ClientConfigEnhanced (ex_mcp v0.10.0)
View SourceEnhanced configuration builder for ExMCP clients with reduced code duplication.
This module provides the same comprehensive functionality as ClientConfig but with:
- Macro-generated configuration setters to eliminate duplication
- Environment-based configuration loading
- Enhanced validation with custom rules
- Configuration composition and templates
- Performance optimizations
Usage
# Same API as original ClientConfig
config = ExMCP.ClientConfigEnhanced.new()
|> ExMCP.ClientConfigEnhanced.put_transport(:http)
|> ExMCP.ClientConfigEnhanced.put_url("https://api.example.com")
# New environment loading capability
config = ExMCP.ClientConfigEnhanced.from_env(:my_app, :mcp_config)
# Quick configuration helpers
config = ExMCP.ClientConfigEnhanced.quick_http("https://api.example.com")
config = ExMCP.ClientConfigEnhanced.quick_stdio(["python", "server.py"])Environment Variables
The enhanced module supports loading configuration from environment variables:
EXMCP_TIMEOUT_CONNECT=5000
EXMCP_RETRY_MAX_ATTEMPTS=3
EXMCP_AUTH_TOKEN=secret-token
EXMCP_TRANSPORT_URL=https://api.example.com
Summary
Functions
Adds a custom validation rule for a specific field.
Shows differences between two configurations.
Creates a configuration from Application environment settings.
Creates a configuration from system environment variables.
Creates configuration from a template with customizations.
Pretty-prints configuration for debugging.
Merges two configurations with specified strategy.
Merges environment overrides into an existing configuration.
Configures client information with automatic user_agent generation.
Configures observability settings with enhanced deep merging.
Sets the pool configuration using enhanced macro-generated setter.
Configures retry policy with validation.
Quick HTTP configuration for common scenarios.
Quick stdio configuration for common scenarios.
Validates configuration with enhanced error reporting and custom rules.
Types
@type auth_config() :: ExMCP.ClientConfig.auth_config()
@type auth_type() :: ExMCP.ClientConfig.auth_type()
@type log_level() :: ExMCP.ClientConfig.log_level()
@type merge_strategy() :: :shallow | :deep | :override | :preserve_existing
@type observability_config() :: ExMCP.ClientConfig.observability_config()
@type pool_config() :: ExMCP.ClientConfig.pool_config()
@type profile() :: ExMCP.ClientConfig.profile()
@type retry_policy() :: ExMCP.ClientConfig.retry_policy()
@type t() :: ExMCP.ClientConfig.t()
@type template_name() :: :production_api | :development_local | :test_fast | :custom
@type timeout_config() :: ExMCP.ClientConfig.timeout_config()
@type transport_config() :: ExMCP.ClientConfig.transport_config()
@type transport_type() :: ExMCP.ClientConfig.transport_type()
Functions
@spec add_validation_rule(t(), atom(), validation_rule(), String.t()) :: t()
Adds a custom validation rule for a specific field.
Examples
config = ExMCP.ClientConfigEnhanced.new()
|> ExMCP.ClientConfigEnhanced.add_validation_rule(
:timeout,
&validate_timeout_range/1,
"Timeout must be between 1000 and 300000 ms"
)
Shows differences between two configurations.
Examples
diff = ExMCP.ClientConfigEnhanced.diff_configs(old_config, new_config)
IO.puts(diff)
Creates a configuration from Application environment settings.
Examples
# Load from config/config.exs: config :my_app, mcp_config: [...]
config = ExMCP.ClientConfigEnhanced.from_env(:my_app, :mcp_config)
# With fallback to default profile
config = ExMCP.ClientConfigEnhanced.from_env(:my_app, :mcp_config, default: :production)
@spec from_env_vars(env_mapping() | nil) :: t()
Creates a configuration from system environment variables.
Examples
# Use default variable mapping
config = ExMCP.ClientConfigEnhanced.from_env_vars()
# Use custom mapping
mapping = %{
"API_URL" => :url,
"API_TIMEOUT" => {:timeouts, :request},
"RETRY_COUNT" => {:retry_policy, :max_attempts}
}
config = ExMCP.ClientConfigEnhanced.from_env_vars(mapping)
@spec from_template( template_name(), keyword() ) :: t()
Creates configuration from a template with customizations.
Examples
# Production API template
config = ExMCP.ClientConfigEnhanced.from_template(:production_api,
url: "https://api.production.com",
auth: [type: :bearer, token: "secret"]
)
# Development local template
config = ExMCP.ClientConfigEnhanced.from_template(:development_local,
command: ["python", "dev_server.py"]
)
Pretty-prints configuration for debugging.
Examples
ExMCP.ClientConfigEnhanced.inspect_config(config)
ExMCP.ClientConfigEnhanced.inspect_config(config, sections: [:transport, :auth])
@spec merge_configs(t(), t(), merge_strategy()) :: t()
Merges two configurations with specified strategy.
Examples
# Deep merge (default)
merged = ExMCP.ClientConfigEnhanced.merge_configs(base, override)
# Override strategy
merged = ExMCP.ClientConfigEnhanced.merge_configs(base, override, :override)
@spec merge_env_overrides(t(), env_mapping()) :: t()
Merges environment overrides into an existing configuration.
Examples
base_config = ExMCP.ClientConfigEnhanced.new(:production)
config = ExMCP.ClientConfigEnhanced.merge_env_overrides(base_config, %{
"OVERRIDE_URL" => :url,
"OVERRIDE_TIMEOUT" => {:timeouts, :request}
})
Configures client information with automatic user_agent generation.
Configures observability settings with enhanced deep merging.
Sets the pool configuration using enhanced macro-generated setter.
Automatically handles merging and validation based on field requirements.
@spec put_retry_policy(t(), keyword() | map()) :: t()
@spec put_retry_policy( t(), keyword() ) :: t()
Configures retry policy with validation.
Quick HTTP configuration for common scenarios.
Examples
config = ExMCP.ClientConfigEnhanced.quick_http("https://api.example.com")
config = ExMCP.ClientConfigEnhanced.quick_http("https://api.example.com",
auth: [type: :bearer, token: "secret"],
timeout: 30_000
)
Quick stdio configuration for common scenarios.
Examples
config = ExMCP.ClientConfigEnhanced.quick_stdio(["python", "server.py"])
config = ExMCP.ClientConfigEnhanced.quick_stdio("mcp-server",
env: [{"DEBUG", "1"}],
timeout: 15_000
)
Validates configuration with enhanced error reporting and custom rules.
Examples
case ExMCP.ClientConfigEnhanced.validate_with_rules(config) do
:ok -> {:ok, client} = ExMCP.connect(config)
{:error, detailed_errors} -> handle_validation_errors(detailed_errors)
end