UTCP communication protocol plugin for interoperability with the Model Context Protocol (MCP).
Project description
UTCP MCP Plugin
Model Context Protocol (MCP) interoperability plugin for UTCP, enabling seamless integration with existing MCP servers.
Features
- MCP Server Integration: Connect to existing MCP servers
- Stdio Transport: Local process-based MCP servers
- HTTP Transport: Remote MCP server connections
- OAuth2 Authentication: Secure authentication for HTTP servers
- Migration Support: Gradual migration from MCP to UTCP
- Tool Discovery: Automatic tool enumeration from MCP servers
- Session Management: Efficient connection handling
Installation
pip install utcp-mcp
Quick Start
from utcp.utcp_client import UtcpClient
# Connect to MCP server
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "mcp_server",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"filesystem": {
"command": "node",
"args": ["mcp-server.js"]
}
}
}
}]
})
# Call MCP tool through UTCP
result = await client.call_tool("mcp_server.filesystem.read_file", {
"path": "/data/file.txt"
})
Configuration Examples
Stdio Transport (Local Process)
{
"name": "local_mcp",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"filesystem": {
"command": "python",
"args": ["-m", "mcp_filesystem_server"],
"env": {"LOG_LEVEL": "INFO"}
}
}
}
}
HTTP Transport (Remote Server)
{
"name": "remote_mcp",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"api_server": {
"transport": "http",
"url": "https://mcp.example.com"
}
}
}
}
With OAuth2 Authentication
{
"name": "secure_mcp",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"secure_server": {
"transport": "http",
"url": "https://mcp.example.com"
}
}
},
"auth": {
"auth_type": "oauth2",
"token_url": "https://auth.example.com/token",
"client_id": "${CLIENT_ID}",
"client_secret": "${CLIENT_SECRET}",
"scope": "read:tools"
}
}
Multiple MCP Servers
{
"name": "multi_mcp",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"filesystem": {
"command": "python",
"args": ["-m", "mcp_filesystem"]
},
"database": {
"command": "node",
"args": ["mcp-db-server.js"],
"cwd": "/app/mcp-servers"
}
}
}
}
Migration Scenarios
Gradual Migration from MCP to UTCP
Phase 1: MCP Integration
# Use existing MCP servers through UTCP
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "legacy_mcp",
"call_template_type": "mcp",
"config": {"mcpServers": {"server": {...}}}
}]
})
Phase 2: Mixed Environment
# Mix MCP and native UTCP tools
client = await UtcpClient.create(config={
"manual_call_templates": [
{
"name": "legacy_mcp",
"call_template_type": "mcp",
"config": {"mcpServers": {"old_server": {...}}}
},
{
"name": "new_api",
"call_template_type": "http",
"url": "https://api.example.com/utcp"
}
]
})
Phase 3: Full UTCP
# Pure UTCP implementation
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "native_utcp",
"call_template_type": "http",
"url": "https://api.example.com/utcp"
}]
})
Debugging and Troubleshooting
Enable Debug Logging
import logging
logging.getLogger('utcp.mcp').setLevel(logging.DEBUG)
try:
client = await UtcpClient.create(config=mcp_config)
tools = await client.list_tools()
except TimeoutError:
print("MCP server connection timed out")
List Available Tools
# Discover tools from MCP server
tools = await client.list_tools()
print(f"Available tools: {[tool.name for tool in tools]}")
Connection Testing
@pytest.mark.asyncio
async def test_mcp_integration():
client = await UtcpClient.create(config={
"manual_call_templates": [{
"name": "test_mcp",
"call_template_type": "mcp",
"config": {
"mcpServers": {
"test": {
"command": "python",
"args": ["-m", "test_mcp_server"]
}
}
}
}]
})
tools = await client.list_tools()
assert len(tools) > 0
result = await client.call_tool("test_mcp.echo", {"message": "test"})
assert result["message"] == "test"
Error Handling
from utcp.exceptions import ToolCallError
try:
result = await client.call_tool("mcp_server.tool", {"arg": "value"})
except ToolCallError as e:
print(f"MCP tool call failed: {e}")
# Check if it's a connection issue, authentication error, etc.
Performance Considerations
- Session Reuse: MCP plugin reuses connections when possible
- Timeout Configuration: Set appropriate timeouts for MCP operations
- Resource Cleanup: Sessions are automatically cleaned up
- Concurrent Calls: Multiple tools can be called concurrently
Related Documentation
- Main UTCP Documentation
- Core Package Documentation
- HTTP Plugin
- CLI Plugin
- Text Plugin
- MCP Specification
Examples
For complete examples, see the UTCP examples repository.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file utcp_mcp-1.1.2.tar.gz.
File metadata
- Download URL: utcp_mcp-1.1.2.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2936a7e50e525b5dd8ee5328e3d2c772d060f549583b34e4289977386c4de04
|
|
| MD5 |
886c899cd035499d44d88ac7cf8b646e
|
|
| BLAKE2b-256 |
451ef6159db087adf38ac0cfdacc8b83dd678f2eaf6f6423a40c8786135c29bf
|
File details
Details for the file utcp_mcp-1.1.2-py3-none-any.whl.
File metadata
- Download URL: utcp_mcp-1.1.2-py3-none-any.whl
- Upload date:
- Size: 10.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd997be1c30b3866753e19d9f8c6f35adf07b1ac5da209589a6dc108c267de85
|
|
| MD5 |
e703b202ea1a9cc5f6e43c7434d63cbb
|
|
| BLAKE2b-256 |
8a060b113cd01e8b5924f8e87875218323ddb45d1fd6bc3e8b55ef1864912d79
|