182 lines
3.9 KiB
Markdown
182 lines
3.9 KiB
Markdown
|
|
# HTTP Transport Configuration Example
|
||
|
|
|
||
|
|
This example shows how to configure MCP-Forge to connect to external HTTP-based MCP servers.
|
||
|
|
|
||
|
|
## Configuration File
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# config.yaml
|
||
|
|
server:
|
||
|
|
host: localhost
|
||
|
|
port: 3000
|
||
|
|
podman_socket: /run/user/1000/podman/podman.sock
|
||
|
|
|
||
|
|
security:
|
||
|
|
audit_log: ./logs/audit.log
|
||
|
|
enforce_resource_limits: true
|
||
|
|
allow_network: false
|
||
|
|
|
||
|
|
execution:
|
||
|
|
default_backend: simple
|
||
|
|
default_timeout: 300
|
||
|
|
max_timeout: 1800
|
||
|
|
default_memory: 512m
|
||
|
|
max_memory: 2g
|
||
|
|
base_image: docker.io/library/python:3.13-slim
|
||
|
|
|
||
|
|
environment_builder:
|
||
|
|
enabled: true
|
||
|
|
uv_cache_path: ./cache/uv
|
||
|
|
max_packages_per_build: 50
|
||
|
|
max_build_time: 600
|
||
|
|
max_image_size: 2147483648
|
||
|
|
max_concurrent_builds: 3
|
||
|
|
build_rate_limit:
|
||
|
|
requests: 10
|
||
|
|
period: 60
|
||
|
|
package_validation:
|
||
|
|
use_allowlist: true
|
||
|
|
allowlist_path: ./config/allowlist.txt
|
||
|
|
blocklist_path: ./config/blocklist.txt
|
||
|
|
require_approval_patterns: []
|
||
|
|
|
||
|
|
# Connect to external MCP servers
|
||
|
|
mcp_tools:
|
||
|
|
# HTTP-based MCP server
|
||
|
|
remote_api:
|
||
|
|
transport: http
|
||
|
|
url: http://localhost:8006/mcp
|
||
|
|
headers:
|
||
|
|
Authorization: "Bearer your-token-here"
|
||
|
|
X-Custom-Header: "value"
|
||
|
|
|
||
|
|
# SSE-based MCP server
|
||
|
|
sse_service:
|
||
|
|
transport: sse
|
||
|
|
url: http://localhost:9000/events
|
||
|
|
headers:
|
||
|
|
Authorization: "Bearer your-token-here"
|
||
|
|
|
||
|
|
# Traditional stdio-based MCP server (still supported)
|
||
|
|
filesystem:
|
||
|
|
transport: stdio # default, can be omitted
|
||
|
|
command: uvx
|
||
|
|
args: [mcp-server-filesystem, /path/to/workspace]
|
||
|
|
env:
|
||
|
|
SOME_VAR: value
|
||
|
|
```
|
||
|
|
|
||
|
|
## Transport Types
|
||
|
|
|
||
|
|
### 1. HTTP Transport
|
||
|
|
|
||
|
|
Used for HTTP-based MCP servers that communicate via HTTP requests.
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
remote_api:
|
||
|
|
transport: http
|
||
|
|
url: http://localhost:8006/mcp
|
||
|
|
headers:
|
||
|
|
Authorization: "Bearer token123"
|
||
|
|
Content-Type: "application/json"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Required:**
|
||
|
|
- `url`: HTTP endpoint URL
|
||
|
|
|
||
|
|
**Optional:**
|
||
|
|
- `headers`: HTTP headers (dict)
|
||
|
|
|
||
|
|
### 2. SSE Transport
|
||
|
|
|
||
|
|
Used for Server-Sent Events (SSE) based MCP servers.
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
sse_service:
|
||
|
|
transport: sse
|
||
|
|
url: http://localhost:9000/events
|
||
|
|
headers:
|
||
|
|
Authorization: "Bearer token123"
|
||
|
|
```
|
||
|
|
|
||
|
|
**Required:**
|
||
|
|
- `url`: SSE endpoint URL
|
||
|
|
|
||
|
|
**Optional:**
|
||
|
|
- `headers`: HTTP headers (dict)
|
||
|
|
|
||
|
|
### 3. Stdio Transport (Default)
|
||
|
|
|
||
|
|
Traditional command-based MCP servers.
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
filesystem:
|
||
|
|
transport: stdio # default, can be omitted
|
||
|
|
command: uvx
|
||
|
|
args: [mcp-server-filesystem, /workspace]
|
||
|
|
env:
|
||
|
|
PATH: /usr/bin
|
||
|
|
```
|
||
|
|
|
||
|
|
**Required:**
|
||
|
|
- `command`: Executable command
|
||
|
|
|
||
|
|
**Optional:**
|
||
|
|
- `args`: Command arguments (list)
|
||
|
|
- `env`: Environment variables (dict)
|
||
|
|
|
||
|
|
## Running the Server
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Start with HTTP transport configuration
|
||
|
|
uv run mcp-forge --config config.yaml
|
||
|
|
|
||
|
|
# Or with SSE transport
|
||
|
|
uv run mcp-forge --config config.yaml --transport sse --host 0.0.0.0 --port 8080
|
||
|
|
```
|
||
|
|
|
||
|
|
## Client Connection
|
||
|
|
|
||
|
|
Once the server is running, MCP clients can connect using the configured transport:
|
||
|
|
|
||
|
|
```python
|
||
|
|
from fastmcp import Client
|
||
|
|
from fastmcp.client.transports import StreamableHttpTransport
|
||
|
|
|
||
|
|
# Connect to MCP-Forge server via HTTP
|
||
|
|
transport = StreamableHttpTransport(url="http://localhost:3000/mcp")
|
||
|
|
client = Client(transport)
|
||
|
|
|
||
|
|
async with client:
|
||
|
|
# List available tools (from all configured MCP servers)
|
||
|
|
tools = await client.list_tools()
|
||
|
|
print(tools)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Testing the Connection
|
||
|
|
|
||
|
|
You can test your HTTP transport configuration using curl:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Test HTTP endpoint
|
||
|
|
curl -X POST http://localhost:8006/mcp \
|
||
|
|
-H "Authorization: Bearer your-token-here" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"jsonrpc": "2.0", "method": "tools/list", "id": 1}'
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Connection Refused
|
||
|
|
- Verify the external MCP server is running
|
||
|
|
- Check the URL and port are correct
|
||
|
|
- Ensure firewall rules allow the connection
|
||
|
|
|
||
|
|
### Authentication Errors
|
||
|
|
- Verify the authorization header is correct
|
||
|
|
- Check if the external server requires specific headers
|
||
|
|
|
||
|
|
### Tool Not Found
|
||
|
|
- Ensure the external MCP server exposes the expected tools
|
||
|
|
- Check the server logs for any errors
|