Skip to main content

Universal Tool Calling Protocol (UTCP) integration for Strands Agents SDK

Project description

strands-utcp

PyPI version Python Support License: MIT

Universal Tool Calling Protocol (UTCP) community plugin for Strands Agents SDK

Features

  • Universal Tool Access - Connect to any UTCP-compatible tool source
  • OpenAPI/Swagger Support - Automatic tool discovery from API specifications
  • Multiple Sources - Connect to multiple tool sources simultaneously
  • Async/Await Support - Full async support with context managers
  • Type Safe - Full type hints and validation
  • Easy Integration - Drop-in tool adapter for Strands agents

Key Technical Features:

  • AgentTool Inheritance: Full inheritance from Strands AgentTool base class
  • Tool Name Sanitization: UUID suffixes for names >64 characters (Bedrock requirement)

Requirements

  • Python 3.10+
  • Strands Agents SDK 1.7.0+
  • UTCP core libraries 1.0+

Installation

pip install strands-agents strands-utcp

Quick Start

Basic Usage

from strands import Agent
from strands_utcp import UtcpToolAdapter

# Configure UTCP tool adapter
config = {
    "manual_call_templates": [
        {
            "name": "weather_api",
            "call_template_type": "http",
            "url": "https://api.weather.com/utcp",
            "http_method": "GET"
        }
    ]
}

# Use UTCP tools with Strands agent
async def main():
    async with UtcpToolAdapter(config) as adapter:
        # Get available tools
        tools = adapter.list_tools()
        print(f"Found {len(tools)} UTCP tools")
        
        # Create agent with UTCP tools
        agent = Agent(tools=adapter.to_strands_tools())
        
        # Use the agent
        response = await agent.invoke_async("What's the weather like today?")
        print(response.message)

import asyncio
asyncio.run(main())

Tool Discovery

async with UtcpToolAdapter(config) as adapter:
    # List all available tools
    all_tools = adapter.list_tools()
    
    # Search for specific tools
    weather_tools = await adapter.search_tools("weather")
    
    # Get a specific tool
    weather_tool = adapter.get_tool("get_weather")
    
    if weather_tool:
        result = await weather_tool.call(location="New York")
        print(result)

Multiple Sources

config = {
    "manual_call_templates": [
        {
            "name": "petstore",
            "call_template_type": "http", 
            "url": "https://petstore.swagger.io/v2/swagger.json"
        },
        {
            "name": "openlibrary",
            "call_template_type": "http",
            "url": "https://openlibrary.org/static/openapi.json"
        }
    ]
}

async with UtcpToolAdapter(config) as adapter:
    tools = adapter.list_tools()
    print(f"Total tools from all sources: {len(tools)}")

Configuration

Supported Call Template Types

The plugin supports all UTCP call template types:

HTTP Templates

{
    "name": "api_name",
    "call_template_type": "http",
    "url": "https://api.example.com/utcp",
    "http_method": "GET",  # GET, POST, PUT, DELETE
    "content_type": "application/json"
}

Server-Sent Events (SSE)

{
    "name": "sse_stream",
    "call_template_type": "sse", 
    "url": "https://api.example.com/stream",
    "http_method": "GET"
}

Streamable HTTP

{
    "name": "http_stream",
    "call_template_type": "streamable_http",
    "url": "https://api.example.com/stream",
    "http_method": "POST"
}

Command Line Interface

{
    "name": "cli_tool",
    "call_template_type": "cli",
    "command": "python script.py"
}

GraphQL

{
    "name": "graphql_api",
    "call_template_type": "graphql",
    "url": "https://api.example.com/graphql"
}

Model Context Protocol (MCP)

{
    "name": "mcp_server",
    "call_template_type": "mcp",
    "command": "node mcp-server.js"
}

TCP Socket

{
    "name": "tcp_service",
    "call_template_type": "tcp",
    "host": "localhost",
    "port": 8080
}

UDP Socket

{
    "name": "udp_service", 
    "call_template_type": "udp",
    "host": "localhost",
    "port": 8081
}

Text File

{
    "name": "text_tools",
    "call_template_type": "text",
    "file_path": "/path/to/tools.txt"
}

API Reference

UtcpToolAdapter

Main adapter class for UTCP tool integration.

Methods

  • start() - Initialize the UTCP client
  • stop() - Clean up resources
  • list_tools() - Get all available tools
  • get_tool(name) - Get specific tool by name
  • search_tools(query, max_results) - Search for tools
  • call_tool(name, arguments) - Execute a tool
  • to_strands_tools() - Convert to Strands tool format

UtcpAgentTool

Wrapper for individual UTCP tools.

Properties

  • name - Tool name (sanitized)
  • description - Tool description
  • input_schema - JSON Schema for inputs

Methods

  • call(**kwargs) - Execute the tool

UtcpToolAdapterError

Exception raised for UTCP-specific errors.

Testing

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run with coverage
pytest tests/ --cov=strands_utcp --cov-report=html

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Links


Built for the UTCP and Strands communities 🚀

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strands_utcp-0.1.1.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strands_utcp-0.1.1-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file strands_utcp-0.1.1.tar.gz.

File metadata

  • Download URL: strands_utcp-0.1.1.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for strands_utcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f90ad930968167cb82b3ea17baa4693e8518f264b1eb51f7996da9144aba570a
MD5 99f2911d8c192eb74b0553f9c742a3f6
BLAKE2b-256 de787d28a172bae6d2bdf0a124b9bb876c9f6571a49d0f058d1621bd602bafc6

See more details on using hashes here.

File details

Details for the file strands_utcp-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: strands_utcp-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for strands_utcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1911e9da4a13f1154e3bfa4c8fe0f5335ef65335dcb1e524ab2fd7590913755b
MD5 dd4ade0cca70f2dc467fb93d3040e27d
BLAKE2b-256 e5a0e71e4d3fffd2beccda41076ee55552239086e787decd1597000c8746a54b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page