diff --git a/QUICK_OPENUI_FIX.txt b/QUICK_OPENUI_FIX.txt new file mode 100644 index 0000000..6139dc5 --- /dev/null +++ b/QUICK_OPENUI_FIX.txt @@ -0,0 +1,113 @@ +QUICK IMPLEMENTATION GUIDE +============================ + +ISSUE: OpenUI cannot discover any tools from MCP Gateway + +ROOT CAUSE: +1. Missing /v1/tools endpoint +2. Tool schemas have complex JSON that OpenUI doesn't support +3. Need schema normalization layer + + +STEP 1: Add the Fixed Routes Handler +==================================== +The file openai_routes_fixed.py is ready to use. +It's already in: gateway-proxy/openai_routes_fixed.py + + +STEP 2: Update gateway_proxy.py +================================ + +Find line ~27 (near other imports) and add: + + from .openai_routes_fixed import convert_mcp_tool_to_openai, list_models, tools, chat_completions + + +Then find the routes list (around line 795) and add these routes BEFORE the closing bracket: + + # OpenAI-compatible API endpoints (for Open-UI) + Route("/v1/models", list_models, methods=["GET"]), + Route("/v1/tools", lambda r: tools(r, TOOL_DEFINITIONS), methods=["GET"]), + Route("/v1/chat/completions", lambda r: chat_completions(r, TOOL_DEFINITIONS), methods=["POST"]), + + +STEP 3: Restart Gateway +======================== + +docker-compose restart gateway-proxy + + +STEP 4: Verify +============== + +Check that tools load: +curl http://localhost:8000/v1/tools | jq '.data | length' + +Should return a number like 45 (total number of tools) + + +STEP 5: Test in OpenUI +======================= + +1. Open OpenUI +2. Add new model endpoint: http://mcp.wilddragon.net:8000 +3. Select model "mcp-gateway" +4. Search for tools - they should now appear! + + +KEY CHANGES EXPLAINED: +======================= + +_simplify_schema(): + - Converts type arrays ["string", "null"] → "string" + - Flattens anyOf/oneOf to single schema + - Removes unsupported JSON schema keywords + - Makes schemas OpenAI-compatible + +convert_mcp_tool_to_openai(): + - Takes MCP tool definition + - Converts inputSchema to OpenAI parameters format + - Wraps in function schema structure + +/v1/tools endpoint: + - Returns all tools in OpenAI format + - Called by OpenUI for tool discovery + - Lists all backends' tools (ERPNext, Wave, TrueNAS, Home Assistant) + + +TESTING RESPONSES: +=================== + +Good /v1/tools response looks like: +{ + "object": "list", + "data": [ + { + "type": "function", + "function": { + "name": "erpnext_get_document", + "description": "Retrieve a single document", + "parameters": { + "type": "object", + "properties": { + "doctype": {"type": "string", "description": "..."}, + "name": {"type": "string", "description": "..."} + }, + "required": ["doctype", "name"] + } + } + }, + ...more tools... + ] +} + +If you see truncated tool names or "string not found" errors, +the schema conversion isn't working - check imports and routes. + + +FILES READY TO USE: +==================== + +✅ gateway-proxy/openai_routes_fixed.py (ready - no changes needed) +✅ OPENUI_SCHEMA_FIX.md (detailed explanation) +⏳ gateway-proxy/gateway_proxy.py (needs 2 edits: import + routes)