ExUtcp

Hex.pm Hex.pm Hex.pm HexDocs.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 Not Implemented 0%
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

Phase 3: Extended Protocols

Phase 4: Enterprise Features

Supported Transports

Implemented

Planned

Examples

See examples/ directory:

Testing

# All tests
mix test
# Unit tests only
mix test --exclude integration
# Integration tests only
mix test --only integration

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.