Skip to content

✨ πŸ› οΈ Similar to Docker Compose - Orchestrate Model Context Protocol (MCP) servers with management capabilities, REST API, and Web UI.

License

Notifications You must be signed in to change notification settings

datalayer/mcp-compose

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Datalayer

Become a Sponsor

✨ MCP Compose

PyPI - Version Github Actions Status Test Coverage Python Version License Docker

A powerful, production-ready framework for composing and orchestrating Model Context Protocol (MCP) servers with advanced management capabilities, REST API, and modern Web UI.

🎯 Overview

MCP Compose is a comprehensive solution for managing multiple MCP servers in a unified environment. It provides automatic discovery, intelligent composition, protocol translation, real-time monitoring, and a beautiful web interface for managing your MCP infrastructure.

Key Capabilities

πŸ”§ Multi-Server Management - Start, stop, and monitor multiple MCP servers from a single interface
🌐 REST API - Complete REST API with 32 endpoints for programmatic control
🎨 Modern Web UI - Beautiful React-based interface with real-time updates
πŸ”„ Protocol Translation - Seamlessly translate between STDIO and SSE protocols
πŸ“Š Real-Time Monitoring - Live metrics, logs, and health checks
πŸ” Security First - Token authentication, CORS support, rate limiting
πŸ“¦ Easy Deployment - Docker support with docker-compose orchestration
πŸ§ͺ Well Tested - 95% test coverage with 265+ tests
πŸ“š Comprehensive Docs - Full API reference, user guide, and deployment guide

πŸš€ Quick Start

Installation

# Install from PyPI
pip install mcp-compose

# Or install from source
git clone https://github.com/datalayer/mcp-compose.git
cd mcp-compose
pip install -e .

Using Docker (Recommended)

# Clone repository
git clone https://github.com/datalayer/mcp-compose.git
cd mcp-compose

# Start with docker-compose (includes Prometheus & Grafana)
docker-compose up -d

# Access the Web UI
open http://localhost:8000

Using CLI

# Start the server with Web UI
mcp-composer serve --config examples/mcp_compose.toml

# Access Web UI at http://localhost:8000
# Access API at http://localhost:8000/api/v1
# Access API docs at http://localhost:8000/docs

# Discover available MCP servers
mcp-composer discover

# Invoke a tool
mcp-composer invoke-tool calculator:add '{"a": 5, "b": 3}'

Using Python API

from mcp_compose import MCPServerComposer

# Create composer and start servers
composer = MCPServerComposer()
composer.load_config("config.toml")

# Start all servers
for server in composer.servers.values():
    await composer.start_server(server.name)

# List available tools
tools = await composer.list_tools()
print(f"Available tools: {[t.name for t in tools]}")

# Invoke a tool
result = await composer.invoke_tool("calculator:add", {"a": 5, "b": 3})
print(f"Result: {result}")

🎨 Web UI Features

The modern web interface provides:

  • πŸ“Š Dashboard - Overview of all servers, tools, and system metrics
  • πŸ–₯️ Server Management - Start, stop, restart servers with real-time status
  • πŸ”§ Tool Browser - Search and invoke tools with interactive forms
  • βš™οΈ Configuration Editor - Edit and validate configuration files
  • πŸ“‹ Log Viewer - Real-time log streaming with filtering
  • πŸ“ˆ Metrics Dashboard - Charts for CPU, memory, and request metrics
  • πŸ”„ Translator Management - Create and manage protocol translators
  • βš™οΈ Settings - Configure theme, API settings, and preferences

πŸ“– Documentation

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Web UI (React)                       β”‚
β”‚  Dashboard β”‚ Servers β”‚ Tools β”‚ Config β”‚ Logs β”‚ Metrics      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ HTTP/WebSocket
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    REST API (FastAPI)                        β”‚
β”‚  /servers β”‚ /tools β”‚ /config β”‚ /translators β”‚ /metrics      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 MCP Compose Core                     β”‚
β”‚  Server Manager β”‚ Tool Broker β”‚ Config Manager              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚          β”‚          β”‚          β”‚
   β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β” β”Œβ”€β”€β”€β”΄β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”΄β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”΄β”€β”€β”€β”€β”
   β”‚ Server β”‚ β”‚ Server β”‚ β”‚ Server β”‚ β”‚ Server β”‚
   β”‚   A    β”‚ β”‚   B    β”‚ β”‚   C    β”‚ β”‚   D    β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜

✨ Core Features

Server Management

✨ Core Features

Server Management

  • Multi-Server Orchestration - Run multiple MCP servers simultaneously
  • Lifecycle Management - Start, stop, restart, and monitor server health
  • Auto-restart - Automatically restart failed servers
  • Environment Isolation - Each server runs in its own isolated environment
  • Configuration Hot-Reload - Update configuration without restarting

Tool & Prompt Composition

  • Automatic Discovery - Find tools and prompts from all running servers
  • Intelligent Composition - Combine capabilities from multiple sources
  • Conflict Resolution - Handle naming conflicts with prefix/suffix/override strategies
  • Dynamic Loading - Tools appear as servers start
  • Unified Interface - Single API to access all tools

Protocol Translation

  • STDIO ↔ SSE - Translate between different transport protocols
  • Transparent Bridging - No changes needed to existing servers
  • Bidirectional - Full request/response support
  • Multiple Translators - Run many translators simultaneously

Monitoring & Observability

  • Real-Time Metrics - CPU, memory, request rates, and latency
  • Structured Logging - JSON logs with correlation IDs
  • Health Checks - Continuous monitoring of server health
  • Prometheus Integration - Export metrics for Prometheus
  • WebSocket Streaming - Live log and metric updates

Security

  • Token Authentication - Secure API access
  • CORS Support - Configurable origin policies
  • Rate Limiting - Prevent abuse
  • Input Validation - Comprehensive request validation
  • Non-root Containers - Run as unprivileged user

πŸ› οΈ Configuration

Create mcp_compose.toml:

[composer]
name = "my-composer"
conflict_resolution = "prefix"

[[servers]]
name = "filesystem"
command = "python"
args = ["-m", "mcp_server_filesystem", "/data"]
transport = "stdio"
auto_start = true

[[servers]]
name = "calculator"
command = "python"
args = ["-m", "mcp_server_calculator"]
transport = "stdio"
auto_start = true

[logging]
level = "INFO"
format = "json"

[security]
auth_enabled = true
cors_origins = ["http://localhost:3000"]

See User Guide for complete configuration options.

πŸ”Œ REST API

Key Endpoints

# Health & Status
GET  /api/v1/health
GET  /api/v1/version
GET  /api/v1/status
GET  /api/v1/status/composition

# Server Management
GET  /api/v1/servers
POST /api/v1/servers/{id}/start
POST /api/v1/servers/{id}/stop
POST /api/v1/servers/{id}/restart

# Tool Management
GET  /api/v1/tools
POST /api/v1/tools/{name}/invoke

# Configuration
GET  /api/v1/config
PUT  /api/v1/config
POST /api/v1/config/validate
POST /api/v1/config/reload

# Translators
GET    /api/v1/translators
POST   /api/v1/translators
DELETE /api/v1/translators/{id}

# WebSocket
WS   /ws/logs
WS   /ws/metrics

See API Reference for complete documentation.

πŸ§ͺ Testing

# Run all tests
make test

# Run with coverage
make test-coverage

# Run specific test
pytest tests/test_composer.py -v

# Type checking
make type-check

# Linting
make lint

πŸ“¦ Development

# Clone repository
git clone https://github.com/datalayer/mcp-compose.git
cd mcp-compose

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

# Install UI dependencies
cd ui
npm install
npm run dev

# Run tests
make test

# Build UI
make build-ui

# Run server
mcp-composer serve

🐳 Docker Deployment

Quick Start

# Build and run
docker-compose up -d

# View logs
docker-compose logs -f

# Stop
docker-compose down

Production Deployment

# Build with production settings
docker build -t mcp-composer:prod .

# Run with environment variables
docker run -d \
  -p 8000:8000 \
  -v $(pwd)/config.toml:/app/config.toml:ro \
  -e MCP_COMPOSER_AUTH_TOKEN=secret \
  --name mcp-composer \
  mcp-composer:prod

See Deployment Guide for Kubernetes and production setup.

πŸ“š Examples

Git + File MCP Servers

A complete example demonstrating how to orchestrate Git and Filesystem MCP servers with anonymous access.

Location: examples/git-file/

Features:

  • Git operations (status, log, diff, commit)
  • Filesystem operations (read, write, list)
  • Unified API with tool prefixing
  • No authentication required
  • Full Makefile for easy management

Quick Start:

cd examples/git-file
make install
make start
make open-ui

See the Git-File Example README for complete documentation.

OAuth Authentication Example

Production-ready example with GitHub OAuth2 authentication.

Location: examples/mcp-auth/

Features:

  • OAuth2 authentication flow
  • JWT tokens
  • Protected MCP server endpoints
  • Pydantic AI agent integration

See the MCP Auth Example README for details.

πŸ—‚οΈ Resources

Configuration files and infrastructure resources are located in the resources/ directory:

  • nginx.conf - Nginx reverse proxy configuration
  • prometheus.yml - Prometheus metrics collection
  • grafana/ - Grafana dashboards and datasources

πŸ“Š Project Status

Phase 4: Complete βœ…

Week 13-16 Deliverables:

  • βœ… Modern React-based Web UI with 8 pages
  • βœ… Real-time monitoring dashboard
  • βœ… Log viewer with streaming
  • βœ… Metrics visualization with Recharts
  • βœ… Protocol translator management
  • βœ… Settings and preferences
  • βœ… Comprehensive documentation
  • βœ… Docker deployment setup
  • βœ… Production-ready configuration

Test Coverage: 95% (265+ tests)
Code Quality: Type-checked with mypy
Lines of Code: ~15,000 (including UI)

πŸ—ΊοΈ Roadmap

Completed

  • βœ… Core composition engine
  • βœ… CLI interface
  • βœ… REST API (32 endpoints)
  • βœ… Web UI (8 pages)
  • βœ… Real-time monitoring
  • βœ… Protocol translation
  • βœ… Docker deployment
  • βœ… Comprehensive documentation

Future Enhancements

  • πŸ”„ Plugin system for custom extensions
  • πŸ”„ GraphQL API support
  • πŸ”„ Advanced caching strategies
  • πŸ”„ Distributed deployment support
  • πŸ”„ Enhanced analytics
  • πŸ”„ CLI auto-completion

🀝 Contributing

Contributions are welcome! Please see our Contributing Guide for details.

# Fork and clone
git clone https://github.com/YOUR_USERNAME/mcp-compose.git

# Create feature branch
git checkout -b feature/amazing-feature

# Make changes and test
make test

# Commit and push
git commit -m "Add amazing feature"
git push origin feature/amazing-feature

# Create Pull Request

πŸ“„ License

BSD 3-Clause License - see LICENSE for details.

πŸ™ Acknowledgments

  • Built on FastMCP framework
  • Inspired by the Model Context Protocol specification
  • UI built with React, TypeScript, and Recharts
  • Special thanks to all contributors

πŸ“§ Support


Made with ❀️ by Datalayer composer = MCPServerComposer( composed_server_name="unified-data-server", conflict_resolution=ConflictResolution.PREFIX )

Compose from current directory's pyproject.toml

unified_server = composer.compose_from_pyproject()

Get detailed composition information

summary = composer.get_composition_summary() print(f"Created server with {summary['total_tools']} tools")


#### Advanced Configuration

```python
from pathlib import Path
from mcp_compose import MCPServerComposer, ConflictResolution

# Specify custom pyproject.toml location
composer = MCPServerComposer(
    composed_server_name="my-server",
    conflict_resolution=ConflictResolution.SUFFIX
)

# Compose with filtering
unified_server = composer.compose_from_pyproject(
    pyproject_path=Path("custom/pyproject.toml"),
    include_servers=["jupyter-mcp-server", "earthdata-mcp-server"],
    exclude_servers=["deprecated-server"]
)

# Access composed tools and prompts
tools = composer.list_tools()
prompts = composer.list_prompts()
source_info = composer.get_source_info()

print(f"Tools: {', '.join(tools)}")
print(f"Sources: {', '.join(source_info.keys())}")

Discovery Only

from mcp_compose import MCPServerDiscovery

# Discover MCP servers without composing
discovery = MCPServerDiscovery()
servers = discovery.discover_from_pyproject("pyproject.toml")

for name, info in servers.items():
    print(f"{name}: {len(info.tools)} tools, {len(info.prompts)} prompts")

Configuration

Conflict Resolution Strategies

When multiple servers provide tools or prompts with the same name, you can choose how to resolve conflicts:

  • PREFIX (default): Add server name as prefix (server1_tool_name)
  • SUFFIX: Add server name as suffix (tool_name_server1)
  • OVERRIDE: Last server wins (overwrites previous)
  • IGNORE: Skip conflicting items
  • ERROR: Raise an error on conflicts

Example Conflict Resolution

# If two servers both have a "search" tool:
# PREFIX: jupyter_mcp_server_search, earthdata_mcp_server_search
# SUFFIX: search_jupyter_mcp_server, search_earthdata_mcp_server
# OVERRIDE: Only the last server's "search" tool is kept

Real-World Examples

Data Science Workflow

Create a unified MCP server combining Jupyter notebook capabilities with Earth science data access:

# pyproject.toml
[project]
dependencies = [
    "jupyter-mcp-server>=1.0.0",
    "earthdata-mcp-server>=0.1.0",
    "weather-mcp-server>=2.0.0"
]
# Discover available tools
python -m mcp_compose discover

# Create unified server for data science workflow
python -m mcp_compose compose \
  --name "data-science-server" \
  --conflict-resolution prefix \
  --output unified_server.py

This creates a server with tools like:

  • jupyter_create_notebook - Create analysis notebooks
  • earthdata_search_datasets - Find Earth science data
  • weather_get_forecast - Access weather data
  • Combined prompts for data analysis workflows

Development Environment

Combine development tools and documentation servers:

from mcp_compose import MCPServerComposer, ConflictResolution

composer = MCPServerComposer(
    composed_server_name="dev-environment",
    conflict_resolution=ConflictResolution.PREFIX
)

# Compose development-focused servers
dev_server = composer.compose_from_pyproject(
    include_servers=[
        "code-review-mcp-server",
        "documentation-mcp-server", 
        "testing-mcp-server"
    ]
)

# Access all development tools in one place
print("Available tools:", composer.list_tools())

Custom Integration

from mcp_compose import MCPServerComposer
from my_custom_server import MyMCPServer

# Create composer
composer = MCPServerComposer()

# Compose discovered servers
unified_server = composer.compose_from_pyproject()

# Add your custom server manually if needed
composer.add_server("custom", MyMCPServer())

# Get final composition summary
summary = composer.get_composition_summary()
print(f"Final server has {summary['total_tools']} tools from {summary['source_servers']} sources")

Project Structure

When using MCP Compose, structure your project like this:

my-project/
β”œβ”€β”€ pyproject.toml          # Define MCP server dependencies
β”œβ”€β”€ src/
β”‚   └── my_project/
β”‚       β”œβ”€β”€ __init__.py
β”‚       └── main.py         # Use composed server
β”œβ”€β”€ composed_server.py      # Generated unified server (optional)
└── README.md

Sample pyproject.toml

[project]
name = "my-data-project"
dependencies = [
    "jupyter-mcp-server>=1.0.0",
    "earthdata-mcp-server>=0.1.0",
    "fastmcp>=1.2.0"
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0.0",
    "mcp-compose>=1.0.0"
]

Error Handling

The library provides comprehensive error handling:

from mcp_compose import MCPServerComposer, MCPComposerError, MCPDiscoveryError

try:
    composer = MCPServerComposer()
    server = composer.compose_from_pyproject()
except MCPDiscoveryError as e:
    print(f"Discovery failed: {e}")
    print(f"Search paths: {e.search_paths}")
except MCPComposerError as e:
    print(f"Composition failed: {e}")
    print(f"Server count: {e.server_count}")

Troubleshooting

Common Issues

  1. No MCP servers found: Ensure your dependencies include packages with "mcp" in the name
  2. Import errors: Check that MCP server packages are properly installed
  3. Naming conflicts: Use appropriate conflict resolution strategy
  4. Missing tools: Verify that server packages export an app variable

Debug Mode

# Enable verbose logging
python -m mcp_compose discover --verbose

# Check specific package
python -c "
from mcp_compose import MCPServerDiscovery
discovery = MCPServerDiscovery()
result = discovery._analyze_mcp_server('your-package-name')
print(result)
"

## API Reference

### MCPServerComposer

Main class for composing MCP servers:

```python
MCPServerComposer(
    composed_server_name: str = "composed-mcp-server",
    conflict_resolution: ConflictResolution = ConflictResolution.PREFIX
)

Methods:

  • compose_from_pyproject(pyproject_path, include_servers, exclude_servers) - Compose servers from dependencies
  • get_composition_summary() - Get summary of composition results
  • list_tools() - List all available tools
  • list_prompts() - List all available prompts
  • get_source_info() - Get mapping of tools/prompts to source servers

MCPServerDiscovery

Class for discovering MCP servers:

MCPServerDiscovery(mcp_server_patterns: List[str] = None)

Methods:

  • discover_from_pyproject(pyproject_path) - Discover servers from pyproject.toml
  • get_package_version(dependency_spec) - Extract version from dependency string

ConflictResolution

Enum for conflict resolution strategies:

  • PREFIX - Add server name as prefix
  • SUFFIX - Add server name as suffix
  • OVERRIDE - Last server wins
  • IGNORE - Skip conflicting items
  • ERROR - Raise error on conflicts

Requirements

  • Python 3.8+
  • FastMCP >= 1.2.0
  • TOML parsing support

Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes and add tests
  4. Ensure all tests pass (pytest)
  5. Commit your changes (git commit -m 'Add amazing feature')
  6. Push to the branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

License

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

Changelog

See CHANGELOG.md for version history and changes.

Support

  • πŸ“– Documentation: Full API documentation and examples in this README
  • πŸ› Issues: Report bugs and request features on GitHub Issues
  • πŸ’¬ Discussions: Join the conversation in GitHub Discussions

Related Projects


Made with ❀️ by the Datalayer team

Changelog

See CHANGELOG.md for a detailed history of changes.

Support

About

✨ πŸ› οΈ Similar to Docker Compose - Orchestrate Model Context Protocol (MCP) servers with management capabilities, REST API, and Web UI.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project