160 lines
5.1 KiB
Markdown
160 lines
5.1 KiB
Markdown
|
|
# OpenAI-Compatible Integration for MCP Gateway
|
||
|
|
|
||
|
|
This guide shows how to add OpenAI-compatible endpoints to your MCP Gateway so Open-UI and other OpenAI clients can use your MCP tools.
|
||
|
|
|
||
|
|
## Quick Setup (2 steps)
|
||
|
|
|
||
|
|
### Step 1: Import the OpenAI routes in `gateway-proxy/gateway_proxy.py`
|
||
|
|
|
||
|
|
At the top of the file, add:
|
||
|
|
|
||
|
|
```python
|
||
|
|
from openai_routes import chat_completions, list_models
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 2: Add the routes to your Starlette app
|
||
|
|
|
||
|
|
In the `app = Starlette(routes=[...])` section, add these routes before the closing bracket:
|
||
|
|
|
||
|
|
```python
|
||
|
|
# OpenAI-compatible endpoints
|
||
|
|
Route("/v1/models", list_models, methods=["GET"]),
|
||
|
|
Route("/v1/chat/completions", chat_completions, methods=["POST"]),
|
||
|
|
```
|
||
|
|
|
||
|
|
So your routes section should look like:
|
||
|
|
|
||
|
|
```python
|
||
|
|
app = Starlette(
|
||
|
|
routes=[
|
||
|
|
# Well-known discovery (Claude tries both with and without /mcp suffix)
|
||
|
|
Route("/.well-known/oauth-protected-resource", well_known_protected_resource, methods=["GET"]),
|
||
|
|
Route("/.well-known/oauth-protected-resource/mcp", well_known_protected_resource, methods=["GET"]),
|
||
|
|
Route("/.well-known/oauth-authorization-server", well_known_oauth_authorization_server, methods=["GET"]),
|
||
|
|
Route("/.well-known/oauth-authorization-server/mcp", well_known_oauth_authorization_server, methods=["GET"]),
|
||
|
|
Route("/.well-known/openid-configuration", well_known_oauth_authorization_server, methods=["GET"]),
|
||
|
|
|
||
|
|
# OAuth endpoints at /oauth/* (spec-standard)
|
||
|
|
Route("/oauth/register", oauth_register, methods=["POST"]),
|
||
|
|
Route("/oauth/authorize", oauth_authorize, methods=["GET", "POST"]),
|
||
|
|
Route("/oauth/token", oauth_token, methods=["POST"]),
|
||
|
|
|
||
|
|
# OAuth endpoints at root (Claude may construct these from base URL)
|
||
|
|
Route("/register", oauth_register, methods=["POST"]),
|
||
|
|
Route("/authorize", oauth_authorize, methods=["GET", "POST"]),
|
||
|
|
Route("/token", oauth_token, methods=["POST"]),
|
||
|
|
|
||
|
|
# MCP endpoint (OAuth-protected)
|
||
|
|
Route("/mcp", handle_mcp, methods=["GET", "HEAD", "POST", "DELETE"]),
|
||
|
|
|
||
|
|
# OpenAI-compatible endpoints
|
||
|
|
Route("/v1/models", list_models, methods=["GET"]),
|
||
|
|
Route("/v1/chat/completions", chat_completions, methods=["POST"]),
|
||
|
|
|
||
|
|
# Monitoring
|
||
|
|
Route("/health", health, methods=["GET"]),
|
||
|
|
Route("/status", status, methods=["GET"]),
|
||
|
|
],
|
||
|
|
lifespan=lifespan,
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
Update the route handler to pass required parameters. In `gateway_proxy.py`, modify the route definitions:
|
||
|
|
|
||
|
|
```python
|
||
|
|
from functools import partial
|
||
|
|
|
||
|
|
# Near the top where other routes are defined:
|
||
|
|
chat_completions_handler = partial(
|
||
|
|
chat_completions,
|
||
|
|
mcp_gateway_url="http://localhost:4444/mcp",
|
||
|
|
access_tokens=ACCESS_TOKENS
|
||
|
|
)
|
||
|
|
|
||
|
|
list_models_handler = partial(
|
||
|
|
list_models,
|
||
|
|
gateway_config={"backends": BACKENDS}
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
Then update the routes:
|
||
|
|
|
||
|
|
```python
|
||
|
|
Route("/v1/models", list_models_handler, methods=["GET"]),
|
||
|
|
Route("/v1/chat/completions", chat_completions_handler, methods=["POST"]),
|
||
|
|
```
|
||
|
|
|
||
|
|
## Using with Open-UI
|
||
|
|
|
||
|
|
Once integrated and running:
|
||
|
|
|
||
|
|
1. **Gateway URL**: `https://mcp.wilddragon.net` (or your gateway URL)
|
||
|
|
2. **API Base URL in Open-UI**: `https://mcp.wilddragon.net/v1`
|
||
|
|
3. **Model**: `mcp-gateway`
|
||
|
|
4. **Bearer Token**: Use your generated token
|
||
|
|
|
||
|
|
### In Open-UI Admin Panel:
|
||
|
|
|
||
|
|
1. Go to Admin → Settings → Connections
|
||
|
|
2. Scroll to "Direct Connections"
|
||
|
|
3. Add new direct connection:
|
||
|
|
- **API Base URL**: `https://mcp.wilddragon.net/v1`
|
||
|
|
- **API Key**: Your bearer token
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
### `GET /v1/models`
|
||
|
|
List available models. Returns the MCP Gateway as a model option.
|
||
|
|
|
||
|
|
**Example:**
|
||
|
|
```bash
|
||
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
||
|
|
https://mcp.wilddragon.net/v1/models
|
||
|
|
```
|
||
|
|
|
||
|
|
### `POST /v1/chat/completions`
|
||
|
|
OpenAI-compatible chat completions endpoint.
|
||
|
|
|
||
|
|
**Example:**
|
||
|
|
```bash
|
||
|
|
curl -X POST \
|
||
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"model": "mcp-gateway",
|
||
|
|
"messages": [
|
||
|
|
{"role": "user", "content": "What tools are available?"}
|
||
|
|
]
|
||
|
|
}' \
|
||
|
|
https://mcp.wilddragon.net/v1/chat/completions
|
||
|
|
```
|
||
|
|
|
||
|
|
## What's Currently Supported
|
||
|
|
|
||
|
|
✅ **Available tools listing** - Shows all available MCP tools
|
||
|
|
✅ **Bearer token authentication** - Uses your existing OAuth tokens
|
||
|
|
✅ **Streaming responses** - OpenAI-compatible streaming format
|
||
|
|
✅ **Standard OpenAI request/response format**
|
||
|
|
|
||
|
|
## Next Steps (Optional Enhancements)
|
||
|
|
|
||
|
|
1. **Tool Calling**: Implement actual tool execution via MCP
|
||
|
|
2. **System Prompts**: Add custom system prompts for tool use
|
||
|
|
3. **Session Management**: Preserve MCP session state across requests
|
||
|
|
4. **Error Handling**: More detailed error messages for tool failures
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
**"Unauthorized" error**: Make sure your bearer token is valid. Check that it's in `ACCESS_TOKENS` on the gateway.
|
||
|
|
|
||
|
|
**"No user message found"**: Ensure the request includes at least one message with role `"user"`.
|
||
|
|
|
||
|
|
**Tools not showing**: Check that your MCP backends are initialized and responding to `tools/list` requests.
|
||
|
|
|
||
|
|
## Files
|
||
|
|
|
||
|
|
- `gateway-proxy/openai_routes.py` - OpenAI-compatible route handlers
|
||
|
|
- `openai_adapter.py` - Adapter class (optional, for more advanced usage)
|