ExUtcp

Hex.pmHex.pmHex.pmHexDocs.pm

Elixir implementation of the Universal Tool Calling Protocol (UTCP).

ex_utcp

Introduction

The Universal Tool Calling Protocol (UTCP) is a standard for defining and interacting with tools across communication protocols. UTCP emphasizes scalability, interoperability, and ease of use.

Key characteristics:

Features

Installation

Add ex_utcp to your list of dependencies in mix.exs:

def deps do
  [
    {:ex_utcp, "~> 0.2.0"}
  ]
end

Getting Started

Basic Usage

alias ExUtcp.{Client, Config}

# Create a client configuration
config = Config.new(providers_file_path: "providers.json")

# Start a UTCP client
{:ok, client} = Client.start_link(config)

# Search for tools
{:ok, tools} = Client.search_tools(client, "", 10)

# Call a tool
{:ok, result} = Client.call_tool(client, "provider.tool_name", %{"arg" => "value"})

Programmatic Provider Registration

alias ExUtcp.{Client, Config, Providers}

# Create a client
config = Config.new()
{:ok, client} = Client.start_link(config)

# Create an HTTP provider
provider = Providers.new_http_provider([
  name: "my_api",
  url: "https://api.example.com/tools",
  http_method: "POST"
])

# Register the provider
{:ok, tools} = Client.register_tool_provider(client, provider)

# Call a discovered tool
{:ok, result} = Client.call_tool(client, "my_api.echo", %{"message" => "Hello!"})

CLI Provider Example

alias ExUtcp.{Client, Config, Providers}

# Create a client
config = Config.new()
{:ok, client} = Client.start_link(config)

# Create a CLI provider
provider = Providers.new_cli_provider([
  name: "my_script",
  command_name: "python my_script.py",
  working_dir: "/path/to/script"
])

# Register the provider
{:ok, tools} = Client.register_tool_provider(client, provider)

# Call a tool
{:ok, result} = Client.call_tool(client, "my_script.greet", %{"name" => "World"})

Configuration

Provider Configuration File

Create a providers.json file to define your providers:

{
  "providers": [
    {
      "name": "http_api",
      "type": "http",
      "http_method": "POST",
      "url": "https://api.example.com/tools",
      "content_type": "application/json",
      "headers": {
        "User-Agent": "ExUtcp/0.2.0"
      },
      "auth": {
        "type": "api_key",
        "api_key": "${API_KEY}",
        "location": "header",
        "var_name": "Authorization"
      }
    },
    {
      "name": "cli_tool",
      "type": "cli",
      "command_name": "python my_tool.py",
      "working_dir": "/opt/tools",
      "env_vars": {
        "PYTHONPATH": "/opt/tools"
      }
    }
  ]
}

Variable Substitution

UTCP supports variable substitution using ${VAR} or $VAR syntax:

# Load variables from .env file
{:ok, env_vars} = Config.load_from_env_file(".env")

config = Config.new(
  variables: env_vars,
  providers_file_path: "providers.json"
)

OpenAPI Converter

The OpenAPI Converter automatically discovers and converts OpenAPI specifications into UTCP tools.

Basic Usage

alias ExUtcp.{Client, Config}

# Create a client
{:ok, client} = Client.start_link(%{providers_file_path: nil, variables: %{}})

# Convert OpenAPI spec from URL
{:ok, tools} = Client.convert_openapi(client, "https://api.example.com/openapi.json")

# Convert OpenAPI spec from file
{:ok, tools} = Client.convert_openapi(client, "path/to/spec.yaml")

# Convert with options
{:ok, tools} = Client.convert_openapi(client, spec, %{
  prefix: "my_api",
  auth: %{type: "api_key", api_key: "Bearer ${API_KEY}"}
})

Supported Formats

Authentication Mapping

The converter automatically maps OpenAPI security schemes to UTCP authentication:

Architecture

The library is organized into several main components:

Implementation Status

Gap Analysis: UTCP Implementations Comparison

Feature Category Python UTCP Go UTCP Elixir UTCP Elixir Coverage
Core Architecture
Core Client Complete Complete Complete 100%
Configuration Complete Complete Enhanced 100%
Variable Substitution Complete Complete Complete 100%
Transports
HTTP/HTTPS Complete Complete Complete 100%
CLI Complete Complete Complete 100%
WebSocket Complete Complete Complete 100%
gRPC Complete Complete Complete 100%
GraphQL Complete Complete Complete 100%
MCP Complete Complete Complete 100%
SSE Complete Complete Complete 100%
Streamable HTTP Complete Complete Complete 100%
TCP/UDP Complete Complete Complete 100%
WebRTC Complete Complete Not Implemented 0%
Authentication
API Key Complete Complete Complete 100%
Basic Auth Complete Complete Complete 100%
OAuth2 Complete Complete Complete 100%
Advanced Features
Streaming Complete Complete Complete 100%
Connection Pooling Complete Complete Complete 100%
Error Recovery Complete Complete Complete 100%
OpenAPI Converter Complete Complete Complete 100%
Tool Discovery Complete Complete Complete 100%
Search Advanced Advanced Basic 60%
Testing
Unit Tests Complete Complete Complete 100%
Integration Tests Complete Complete Complete 100%
Mock Testing Complete Complete Complete 100%
Test Coverage High High High 100%
Performance
Connection Management Optimized Optimized Optimized 100%
Memory Usage Optimized Optimized Optimized 100%
Throughput High High High 100%
Documentation
API Docs Complete Complete Complete 100%
Examples Complete Complete Complete 100%
Guides Complete Complete Complete 100%

Priority Recommendations

High Priority

Medium Priority

Low Priority

Implementation Status

Completed Features

Missing Features

Roadmap

Phase 1: Core Transports (Completed)

Phase 2: Enhanced Features (Completed)

Phase 3: Extended Protocols

Phase 4: Enterprise Features

Supported Transports

Implemented

Planned

Examples

See examples/ directory:

Testing

# Unit tests only (default - excludes integration tests)
mix test

# All tests including integration tests
mix test --include integration

# Integration tests only
mix test --only integration

The test suite is configured to exclude integration tests by default for faster development cycles. Integration tests require external services and are run separately.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Run the test suite
  6. Submit a pull request

License

MIT License - see LICENSE file for details.

Links