Skip to main content

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")

Child Process stderr

Stdio MCP servers often write banners, telemetry notices and auth chatter to stderr, multiplied by every server you federate. utcp-mcp therefore discards the child's stderr by default. To see it while debugging a server that fails to start, opt back in for the host process:

UTCP_MCP_CHILD_STDERR=inherit python your_app.py

Any other value, or leaving the variable unset, keeps stderr suppressed. When a stdio server fails to connect, the error log reminds you of this switch.

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.

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.3.tar.gz (28.0 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.3-py3-none-any.whl (18.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: utcp_mcp-1.1.3.tar.gz
  • Upload date:
  • Size: 28.0 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.3.tar.gz
Algorithm Hash digest
SHA256 2e5b0512584af71d6b7058f32b5360ee11404d9c80d9670c721f22c3ca13fadb
MD5 db534a30b27e15db74b6eb39a5cf6a27
BLAKE2b-256 973e0673582ee4caf296977040e8277d73567071c1dffccc4ae341633d79fe78

See more details on using hashes here.

File details

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

File metadata

  • Download URL: utcp_mcp-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 18.6 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 2c7512eabec4432f076df8083e16cc0454dfdea3accec2bff4fa6701cf207aa8
MD5 1be10877be475388953c5197235cab90
BLAKE2b-256 902d9908082819d9682ba73e04f429dadfd852b040f840dbdaf4fc62c9db2171

See more details on using hashes here.

Release history Release notifications | RSS feed

1.1.4

2 files

This release

1.1.3 This release

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page