ExMCP.Content.Validation (ex_mcp v1.0.0-rc.8)

Copy Markdown View Source

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

sanitization_op()

@type sanitization_op() ::
  :html_escape
  | :strip_scripts
  | :normalize_unicode
  | :limit_size
  | :remove_metadata
  | :compress_media
  | atom()

Sanitization operation

transformation_op()

@type transformation_op() ::
  :normalize_whitespace
  | :convert_encoding
  | :compress_images
  | :resize_images
  | :extract_text
  | :generate_thumbnails
  | atom()

Transformation operation

validation_error()

@type validation_error() :: %{
  rule: atom(),
  message: String.t(),
  field: String.t() | nil,
  value: any(),
  severity: :error | :warning | :info
}

Validation error with context

validation_opts()

@type validation_opts() :: [
  strict: boolean(),
  max_errors: pos_integer(),
  skip_warnings: boolean(),
  custom_validators: [module()]
]

Validation options

validation_result()

@type validation_result() :: :ok | {:error, [validation_error()]}

Validation result with detailed errors

validation_rule()

@type validation_rule() ::
  atom()
  | {atom(), keyword()}
  | {module(), atom(), keyword()}
  | (ExMCP.Content.Protocol.content() -> :ok | {:error, String.t()})

Validation rule specification

Functions

analyze(content, analysis_types)

@spec analyze(ExMCP.Content.Protocol.content(), [atom()]) :: map()

Analyzes content for various properties and metadata.

custom_rule(validator_fn)

@spec custom_rule((ExMCP.Content.Protocol.content() -> :ok | {:error, String.t()})) ::
  validation_rule()

Creates a validation rule from a custom function.

detect_sensitive_data(content)

@spec detect_sensitive_data(ExMCP.Content.Protocol.content()) ::
  :ok | {:sensitive, [atom()]}

Checks if content contains potentially sensitive information.

extract_metadata(content)

@spec extract_metadata(ExMCP.Content.Protocol.content()) :: map()

Extracts metadata from content.

register_validator(name, validator_fn)

@spec register_validator(atom(), (ExMCP.Content.Protocol.content() ->
                              validation_result())) :: :ok

Registers a custom validator function.

sanitize(content, operations)

Sanitizes content to remove potentially dangerous or unwanted elements.

sanitize_text(text, operations)

@spec sanitize_text(String.t(), [sanitization_op()]) :: String.t()

Sanitizes text content specifically for safe display.

scan_security(content, scan_types)

@spec scan_security(ExMCP.Content.Protocol.content(), [atom()]) ::
  :safe | {:threat, [String.t()]}

Scans content for security threats.

transform(content, operations)

Transforms content through a series of operations.

transform_with_validation(content, 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.

validate(content, rules, opts \\ [])

Validates content against a set of validation rules.

validate_batch(contents, rules, opts \\ [])

@spec validate_batch(
  [ExMCP.Content.Protocol.content()],
  [validation_rule()],
  validation_opts()
) ::
  :ok | {:error, [validation_result()]}

Validates multiple content items efficiently using parallel processing.

validate_schema(content, schema, opts \\ [])

@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.