Content validation and transformation utilities for ExMCP.
Experimental
Outside the core Handler/DSL path. Useful helpers for apps that process untrusted content; not required to speak MCP/ACP.
Features
- Schema Validation: bounded JSON Schema via
ExJsonSchema(validate_schema/3) - Content Sanitization: HTML escape, script stripping, Unicode NFC
- Size / MIME checks: structural validation helpers
- Security scanning: best-effort pattern checks
Image processing (compress/resize/thumbnail/face detection) is not part
of MCP/ACP and is deprecated for removal in 2.0.0. Use ExMCP.Content.image/2
to build protocol image blocks only.
Usage
alias ExMCP.Content.Validation
case Validation.validate(content, rules) do
:ok -> process_content(content)
{:error, reasons} -> handle_validation_errors(reasons)
end
safe_content = Validation.sanitize(content, [:html_escape, :strip_scripts, :normalize_unicode])
Summary
Types
Sanitization operation
Transformation operation
Validation error with context
Validation options
Validation result with detailed errors
Validation rule specification
Functions
Analyzes content for various properties and metadata.
Creates a validation rule from a custom function.
Checks if content contains potentially sensitive information.
Extracts metadata from content.
Registers a custom validator function.
Sanitizes content to remove potentially dangerous or unwanted elements.
Sanitizes text content specifically for safe display.
Scans content for security threats.
Transforms content through a series of operations.
Transforms content with validation at each step.
Validates content against a set of validation rules.
Validates multiple content items efficiently using parallel processing.
Validates content against a JSON schema using ExJsonSchema.
Types
@type sanitization_op() :: :html_escape | :strip_scripts | :normalize_unicode | :limit_size | :remove_metadata | :compress_media | atom()
Sanitization operation
@type transformation_op() :: :normalize_whitespace | :convert_encoding | :compress_images | :resize_images | :extract_text | :generate_thumbnails | atom()
Transformation operation
@type validation_error() :: %{ rule: atom(), message: String.t(), field: String.t() | nil, value: any(), severity: :error | :warning | :info }
Validation error with context
@type validation_opts() :: [ strict: boolean(), max_errors: pos_integer(), skip_warnings: boolean(), custom_validators: [module()] ]
Validation options
@type validation_result() :: :ok | {:error, [validation_error()]}
Validation result with detailed errors
@type validation_rule() :: atom() | {atom(), keyword()} | {module(), atom(), keyword()} | (ExMCP.Content.Protocol.content() -> :ok | {:error, String.t()})
Validation rule specification
Functions
@spec analyze(ExMCP.Content.Protocol.content(), [atom()]) :: map()
Analyzes content for various properties and metadata.
@spec custom_rule((ExMCP.Content.Protocol.content() -> :ok | {:error, String.t()})) :: validation_rule()
Creates a validation rule from a custom function.
@spec detect_sensitive_data(ExMCP.Content.Protocol.content()) :: :ok | {:sensitive, [atom()]}
Checks if content contains potentially sensitive information.
@spec extract_metadata(ExMCP.Content.Protocol.content()) :: map()
Extracts metadata from content.
@spec register_validator(atom(), (ExMCP.Content.Protocol.content() -> validation_result())) :: :ok
Registers a custom validator function.
@spec sanitize(ExMCP.Content.Protocol.content(), [sanitization_op()]) :: ExMCP.Content.Protocol.content()
Sanitizes content to remove potentially dangerous or unwanted elements.
@spec sanitize_text(String.t(), [sanitization_op()]) :: String.t()
Sanitizes text content specifically for safe display.
@spec scan_security(ExMCP.Content.Protocol.content(), [atom()]) :: :safe | {:threat, [String.t()]}
Scans content for security threats.
@spec transform(ExMCP.Content.Protocol.content(), [transformation_op()]) :: {:ok, ExMCP.Content.Protocol.content() | [ExMCP.Content.Protocol.content()]} | {:error, String.t()}
Transforms content through a series of operations.
@spec transform_with_validation(ExMCP.Content.Protocol.content(), [ transformation_op() | validation_rule() ]) :: {:ok, ExMCP.Content.Protocol.content()} | {:error, String.t()}
Transforms content with validation at each step.
@spec validate( ExMCP.Content.Protocol.content(), [validation_rule()], validation_opts() ) :: validation_result()
Validates content against a set of validation rules.
@spec validate_batch( [ExMCP.Content.Protocol.content()], [validation_rule()], validation_opts() ) :: :ok | {:error, [validation_result()]}
Validates multiple content items efficiently using parallel processing.
@spec validate_schema(ExMCP.Content.Protocol.content(), map() | boolean(), keyword()) :: :ok | {:error, [String.t()]}
Validates content against a JSON schema using ExJsonSchema.
Content is converted to a JSON-compatible map before validation.