Official python implementation of UTCP. UTCP is an open standard that lets AI agents call any API directly, without extra middleware.
# Add to your Claude Code skills
git clone https://github.com/universal-tool-calling-protocol/python-utcpThe Universal Tool Calling Protocol (UTCP) is a secure, scalable standard for defining and interacting with tools across a wide variety of communication protocols. UTCP 1.0.0 introduces a modular core with a plugin-based architecture, making it more extensible, testable, and easier to package.
In contrast to other protocols, UTCP places a strong emphasis on:
No comments yet. Be the first to share your thoughts!
This repository contains the complete UTCP Python implementation:
core/ - Core utcp package with foundational components (README)plugins/communication_protocols/ - Protocol-specific plugins:
UTCP uses a modular architecture with a core library and protocol plugins:
utcp)The core/ directory contains the foundational components:
Tool, CallTemplate, UtcpManual, and AuthUtcpClient for tool interactionInstall the core library and any required protocol plugins:
# Install core + HTTP plugin (most common)
pip install utcp utcp-http
# Install additional plugins as needed
pip install utcp-cli utcp-mcp utcp-text
from utcp.utcp_client import UtcpClient
# Create client with HTTP API
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "my_api",
"call_template_type": "http",
"url": "https://api.example.com/utcp"
}]
})
# Call a tool
result = await client.call_tool("my_api.get_data", {"id": "123"})
UTCP supports multiple communication protocols through dedicated plugins:
| Plugin | Description | Status | Documentation |
|--------|-------------|--------|---------------|
| utcp-http | HTTP/REST APIs, SSE, streaming | ✅ Stable | HTTP Plugin README |
| utcp-cli | Command-line tools | ✅ Stable | CLI Plugin README |
| utcp-mcp | Model Context Protocol | ✅ Stable | MCP Plugin README |
| utcp-text | Local file-based tools | ✅ Stable | Text Plugin README |
| utcp-websocket | WebSocket real-time bidirectional communication | ✅ Stable | WebSocket Plugin README |
| utcp-socket | TCP/UDP protocols | 🚧 In Progress | Socket Plugin README |
| utcp-gql | GraphQL APIs | 🚧 In Progress | GraphQL Plugin README |
For development, you can install the packages in editable mode from the cloned repository:
# Clone the repository
git clone https://github.com/universal-tool-calling-protocol/python-utcp.git
cd python-utcp
# Install the core package in editable mode with dev dependencies
pip install -e "core[dev]"
# Install a specific protocol plugin in editable mode
pip install -e plugins/communication_protocols/http
Version 1.0.0 introduces several breaking changes. Follow these steps to migrate your project.
utcp core package and the specific protocol plugins you use (e.g., utcp-http, utcp-cli).UtcpClient is initialized with a UtcpClientConfig object, dict or a path to a JSON file containing the configuration.providers_file_path option is removed. Instead of a file path, you now provide a list of manual_call_templates directly within the UtcpClientConfig.provider has been replaced with call_template, and provider_type is now call_template_type.call_template_type http_stream has been renamed to streamable_http.from utcp.client.transport_interfaces.http_transport import HttpProvider becomes from utcp_http.http_call_template import HttpCallTemplate.TagAndDescriptionWordMatchStrategy. This is the new default and requires no changes unless you were implementing a custom strategy.manual_name.tool_name. The client handles this automatically.call_templates, are first namespaced with the name of the manual with the _ duplicated. So a key in a tool call template called API_KEY from the manual manual_1 would be converted to manual__1_API_KEY.config.json (Optional)
You can define a comprehensive client configuration in a JSON file. All of these fields are optional.
{
"variables": {
"openlibrary_URL": "https://openlibrary.org/static/openapi.json"
},
"load_variables_from": [
{
"variable_loader_type": "dotenv",
"env_file_path": ".env"
}
],
"tool_repository": {
"tool_repository_type": "in_memory"
},
"tool_search_strategy": {
"tool_search_strategy_type": "tag_and_description_word_match"
},
"manual_call_templates": [
{
"name": "openlibrary",
"call_template_type": "http",
"http_method": "GET",
"url": "${URL}",
"content_type": "application/json"
},
],
"post_processing": [
{
"tool_post_processor_type": "filter_dict",
"only_include_keys": ["name", "key"],
"only_include_tools": ["openlibrary.read_search_authors_json_search_authors_json_get"]
}
]
}
client.py
import asyncio
from utcp.utcp_client import UtcpClient
from utcp.data.utcp_client_config import UtcpClientConfig
async def main():
# The UtcpClient can be created with a config file path, a dict, or a UtcpClientConfig object.
# Option 1: Initialize from a config file path
# client_from_file = await UtcpClient.create(config="./config.json")
# Option 2: Initialize from a dictionary
client_from_dict = await UtcpClient.create(config={
"variables": {
"openlibrary_URL": "https://openlibrary.org/static/openapi.json"
},
"load_variables_from": [
{
"variable_loader_type": "dotenv",
"env_file_path": ".env"
}
],
"tool_repository": {
"tool_repository_type": "in_memory"
},
"tool_search_strategy": {
"tool_search_strategy_type": "tag_and_description_word_match"
},
"manual_call_templates": [
{
"name": "openlibrary",
"call_template_type": "http",
"http_method": "GET",
"url": "${URL}",
"content_type": "application/json"
}
],
"post_processing": [
{
"tool_post_processor_type": "filter_dict",
"only_include_keys": ["name", "key"],
"only_include_tools": ["openlibrary.read_search_authors_json_search_authors_json_get"]
}
]
})
# Option 3: Initialize with a full-featured UtcpClien