Skip to main content

UTCP communication protocol plugin for interoperability with the Model Context Protocol (MCP).

Project description

UTCP MCP Plugin

PyPI Downloads

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

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

utcp_mcp-1.1.1.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

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

utcp_mcp-1.1.1-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

Details for the file utcp_mcp-1.1.1.tar.gz.

File metadata

  • Download URL: utcp_mcp-1.1.1.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for utcp_mcp-1.1.1.tar.gz
Algorithm Hash digest
SHA256 072a128a4a5e304d7a5f12f8026bb3dff3b6b496306d455fb79518c5bd592e0c
MD5 4be1d4600be8c4e09a5125a0c1ea6dda
BLAKE2b-256 f88096926e6a4e4a1d08aac27cdabd4dca7a335b8088cfa7412a01df00d22beb

See more details on using hashes here.

File details

Details for the file utcp_mcp-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: utcp_mcp-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for utcp_mcp-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ccdaa4af12b28e9ee5fbe6ce060cfe74dda1f5bc9a33135042b4f8e654009a04
MD5 6e6b5d86670b6d66cc88f8053ef488d5
BLAKE2b-256 f32ce9e03b268d0ae1b0ab17b6fb2b26df59321098c5b54a7ac41511d55387e7

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