[GH-ISSUE #22190] issue: Cannot add MCPO tools to workspace #35183

Closed
opened 2026-04-25 09:25:18 -05:00 by GiteaMirror · 9 comments
Owner

Originally created by @ayan4m1 on GitHub (Mar 3, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/22190

Check Existing Issues

  • I have searched for any existing and/or related issues.
  • I have searched for any existing and/or related discussions.
  • I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!).
  • I am using the latest version of Open WebUI.

Installation Method

Docker

Open WebUI Version

v0.8.8

Ollama Version (if applicable)

No response

Operating System

CentOS Stream 9

Browser (if applicable)

No response

Confirmation

  • I have read and followed all instructions in README.md.
  • I am using the latest version of both Open WebUI and Ollama.
  • I have included the browser console logs.
  • I have included the Docker container logs.
  • I have provided every relevant configuration, setting, and environment variable used in my setup.
  • I have clearly listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
  • I have documented step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation. My steps:
  • Start with the initial platform/version/OS and dependencies used,
  • Specify exact install/launch/configure commands,
  • List URLs visited, user input (incl. example values/emails/passwords if needed),
  • Describe all options and toggles enabled or changed,
  • Include any files or environmental changes,
  • Identify the expected and actual result at each stage,
  • Ensure any reasonably skilled user can follow and hit the same issue.

Expected Behavior

I go to Workspace > Tools > Import from URL, specify an MCPO-derived URL (http://localhost:8000/playwright/openapi.json), it fetches the JSON, I click save, and it saves.

Actual Behavior

When I click Save, I see an error toast saying "name 'true' is not defined" in the browser.

Steps to Reproduce

  1. Clean CentOS Stream 9 build
  2. Set up docker install of open-webui
  3. Set up mcpo with any tool server(s) defined
  4. Go to Workspace in left nav menu
  5. Go to Tools along top menu
  6. Click New tool
  7. Click Import from URL
  8. Enter http://localhost:8000/tool/openapi.json
  9. Click Save

Logs & Screenshots

Container log

ui-1    | 2026-03-03 18:05:06.005 | INFO     | open_webui.utils.plugin:install_frontmatter_requirements:434 - No requirements found in frontmatter.
ui-1    | 2026-03-03 18:05:06.008 | ERROR    | open_webui.utils.plugin:load_tool_module_by_id:252 - Error loading module: playwright: name 'true' is not defined
ui-1    | 2026-03-03 18:05:06.008 | ERROR    | open_webui.routers.tools:create_new_tools:408 - Failed to load the tool by id playwright: name 'true' is not defined
ui-1    | Traceback (most recent call last):
ui-1    | 
ui-1    |   File "<frozen runpy>", line 198, in _run_module_as_main
ui-1    |   File "<frozen runpy>", line 88, in _run_code
ui-1    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/__main__.py", line 4, in <module>
ui-1    |     uvicorn.main()
ui-1    |     │       └ <Command main>
ui-1    |     └ <module 'uvicorn' from '/usr/local/lib/python3.11/site-packages/uvicorn/__init__.py'>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
ui-1    |     return self.main(*args, **kwargs)
ui-1    |            │    │     │       └ {}
ui-1    |            │    │     └ ()
ui-1    |            │    └ <function Command.main at 0x7fa01f3f7100>
ui-1    |            └ <Command main>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1406, in main
ui-1    |     rv = self.invoke(ctx)
ui-1    |          │    │      └ <click.core.Context object at 0x7fa020128710>
ui-1    |          │    └ <function Command.invoke at 0x7fa01f3f6de0>
ui-1    |          └ <Command main>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1269, in invoke
ui-1    |     return ctx.invoke(self.callback, **ctx.params)
ui-1    |            │   │      │    │           │   └ {'host': '0.0.0.0', 'port': 8085, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
ui-1    |            │   │      │    │           └ <click.core.Context object at 0x7fa020128710>
ui-1    |            │   │      │    └ <function main at 0x7fa01f1fbec0>
ui-1    |            │   │      └ <Command main>
ui-1    |            │   └ <function Context.invoke at 0x7fa01f3f6020>
ui-1    |            └ <click.core.Context object at 0x7fa020128710>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/click/core.py", line 824, in invoke
ui-1    |     return callback(*args, **kwargs)
ui-1    |            │         │       └ {'host': '0.0.0.0', 'port': 8085, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
ui-1    |            │         └ ()
ui-1    |            └ <function main at 0x7fa01f1fbec0>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 424, in main
ui-1    |     run(
ui-1    |     └ <function run at 0x7fa01f2adc60>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 594, in run
ui-1    |     server.run()
ui-1    |     │      └ <function Server.run at 0x7fa01f2ad4e0>
ui-1    |     └ <uvicorn.server.Server object at 0x7fa01f427350>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 67, in run
ui-1    |     return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
ui-1    |            │           │    │             │                      │    │      └ <function Config.get_loop_factory at 0x7fa01f3c4360>
ui-1    |            │           │    │             │                      │    └ <uvicorn.config.Config object at 0x7fa01f2013d0>
ui-1    |            │           │    │             │                      └ <uvicorn.server.Server object at 0x7fa01f427350>
ui-1    |            │           │    │             └ None
ui-1    |            │           │    └ <function Server.serve at 0x7fa01f2ad580>
ui-1    |            │           └ <uvicorn.server.Server object at 0x7fa01f427350>
ui-1    |            └ <function asyncio_run at 0x7fa01f3fe020>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/_compat.py", line 30, in asyncio_run
ui-1    |     return runner.run(main)
ui-1    |            │      │   └ <coroutine object Server.serve at 0x7fa01f1634c0>
ui-1    |            │      └ <function Runner.run at 0x7fa01f64cfe0>
ui-1    |            └ <asyncio.runners.Runner object at 0x7fa01f203310>
ui-1    |   File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
ui-1    |     return self._loop.run_until_complete(task)
ui-1    |            │    │     │                  └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:71> wai...
ui-1    |            │    │     └ <cyfunction Loop.run_until_complete at 0x7fa01ef1a800>
ui-1    |            │    └ <uvloop.Loop running=True closed=False debug=False>
ui-1    |            └ <asyncio.runners.Runner object at 0x7fa01f203310>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
ui-1    |     await self.app(scope, receive_or_disconnect, send_no_error)
ui-1    |           │    │   │      │                      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x7f9f88d6c2c0>
ui-1    |           │    │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │    └ <starlette_compress.CompressMiddleware object at 0x7f9fa0492d90>
ui-1    |           └ <open_webui.main.RedirectMiddleware object at 0x7f9fa0626050>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette_compress/__init__.py", line 104, in __call__
ui-1    |     return await self._zstd(scope, receive, send)
ui-1    |                  │    │     │      │        └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x7f9f88d6c2c0>
ui-1    |                  │    │     │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |                  │    │     └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |                  │    └ <member '_zstd' of 'CompressMiddleware' objects>
ui-1    |                  └ <starlette_compress.CompressMiddleware object at 0x7f9fa0492d90>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette_compress/_zstd_legacy.py", line 107, in __call__
ui-1    |     await self.app(scope, receive, wrapper)
ui-1    |           │    │   │      │        └ <function ZstdResponder.__call__.<locals>.wrapper at 0x7f9f88d6e5c0>
ui-1    |           │    │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │    └ <member 'app' of 'ZstdResponder' objects>
ui-1    |           └ <starlette_compress._zstd_legacy.ZstdResponder object at 0x7f9f96320680>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
ui-1    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
ui-1    |           │                            │    │    │     │      │        └ <function ZstdResponder.__call__.<locals>.wrapper at 0x7f9f88d6e5c0>
ui-1    |           │                            │    │    │     │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │                            │    │    │     └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │                            │    │    └ <starlette.requests.Request object at 0x7f9f8afc04d0>
ui-1    |           │                            │    └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550>
ui-1    |           │                            └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x7f9fa0348d50>
ui-1    |           └ <function wrap_app_handling_exceptions at 0x7fa01c58b420>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
ui-1    |     await app(scope, receive, sender)
ui-1    |           │   │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
ui-1    |     await self.app(scope, receive, send)
ui-1    |           │    │   │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │    │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │    └ <fastapi.routing.APIRouter object at 0x7f9fa066dad0>
ui-1    |           └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 716, in __call__
ui-1    |     await self.middleware_stack(scope, receive, send)
ui-1    |           │    │                │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │    │                │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │    │                └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │    └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x7f9fa066dad0>>
ui-1    |           └ <fastapi.routing.APIRouter object at 0x7f9fa066dad0>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 736, in app
ui-1    |     await route.handle(scope, receive, send)
ui-1    |           │     │      │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │     │      │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │     │      └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │     └ <function Route.handle at 0x7fa01c5e0ae0>
ui-1    |           └ APIRoute(path='/api/v1/tools/create', name='create_new_tools', methods=['POST'])
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 290, in handle
ui-1    |     await self.app(scope, receive, send)
ui-1    |           │    │   │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │    │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │    │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │    └ <function request_response.<locals>.app at 0x7f9f96409ee0>
ui-1    |           └ APIRoute(path='/api/v1/tools/create', name='create_new_tools', methods=['POST'])
ui-1    |   File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 121, in app
ui-1    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
ui-1    |           │                            │    │        │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0>
ui-1    |           │                            │    │        │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │                            │    │        └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           │                            │    └ <starlette.requests.Request object at 0x7f9f8ac87e10>
ui-1    |           │                            └ <function request_response.<locals>.app.<locals>.app at 0x7f9f8abdc180>
ui-1    |           └ <function wrap_app_handling_exceptions at 0x7fa01c58b420>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
ui-1    |     await app(scope, receive, sender)
ui-1    |           │   │      │        └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f8abddc60>
ui-1    |           │   │      └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980>
ui-1    |           │   └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl...
ui-1    |           └ <function request_response.<locals>.app.<locals>.app at 0x7f9f8abdc180>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 107, in app
ui-1    |     response = await f(request)
ui-1    |                      │ └ <starlette.requests.Request object at 0x7f9f8ac87e10>
ui-1    |                      └ <function get_request_handler.<locals>.app at 0x7f9f96409d00>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 426, in app
ui-1    |     raw_response = await run_endpoint_function(
ui-1    |                          └ <function run_endpoint_function at 0x7fa01c5e2f20>
ui-1    |   File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 314, in run_endpoint_function
ui-1    |     return await dependant.call(**values)
ui-1    |                  │         │      └ {'user': UserModel(id='1cc7251a-3260-4126-aa23-f3e41212d3fe', email='ayan4m1@gmail.com', username=None, role='admin', name='A...
ui-1    |                  │         └ <function create_new_tools at 0x7f9fa18c32e0>
ui-1    |                  └ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
ui-1    | 
ui-1    | > File "/app/backend/open_webui/routers/tools.py", line 386, in create_new_tools
ui-1    |     tool_module, frontmatter = load_tool_module_by_id(
ui-1    |                                └ <function load_tool_module_by_id at 0x7f9fa26a0cc0>
ui-1    | 
ui-1    |   File "/app/backend/open_webui/utils/plugin.py", line 254, in load_tool_module_by_id
ui-1    |     raise e
ui-1    | 
ui-1    |   File "/app/backend/open_webui/utils/plugin.py", line 242, in load_tool_module_by_id
ui-1    |     exec(content, module.__dict__)
ui-1    |          │        │      └ <member '__dict__' of 'module' objects>
ui-1    |          │        └ <module 'tool_playwright' from '/tmp/tmp7gfu9cal'>
ui-1    |          └ '{\n    "openapi": "3.1.0",\n    "info": {\n        "title": "Playwright",\n        "description": "Playwright MCP Server",\n...
ui-1    | 
ui-1    |   File "<string>", line 36, in <module>
ui-1    | 
ui-1    | NameError: name 'true' is not defined
ui-1    | 2026-03-03 18:05:06.011 | INFO     | uvicorn.protocols.http.httptools_impl:send:483 - 73.30.54.204:0 - "POST /api/v1/tools/create HTTP/1.1" 400
u

Browser console log

POST https://ai.bulletlogic.com/api/v1/tools/create [HTTP/2 400  131ms]

Additional Information

No response

Originally created by @ayan4m1 on GitHub (Mar 3, 2026). Original GitHub issue: https://github.com/open-webui/open-webui/issues/22190 ### Check Existing Issues - [x] I have searched for any existing and/or related issues. - [x] I have searched for any existing and/or related discussions. - [x] I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!). - [x] I am using the latest version of Open WebUI. ### Installation Method Docker ### Open WebUI Version v0.8.8 ### Ollama Version (if applicable) _No response_ ### Operating System CentOS Stream 9 ### Browser (if applicable) _No response_ ### Confirmation - [x] I have read and followed all instructions in `README.md`. - [x] I am using the latest version of **both** Open WebUI and Ollama. - [x] I have included the browser console logs. - [x] I have included the Docker container logs. - [x] I have **provided every relevant configuration, setting, and environment variable used in my setup.** - [x] I have clearly **listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup** (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc). - [x] I have documented **step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation**. My steps: - Start with the initial platform/version/OS and dependencies used, - Specify exact install/launch/configure commands, - List URLs visited, user input (incl. example values/emails/passwords if needed), - Describe all options and toggles enabled or changed, - Include any files or environmental changes, - Identify the expected and actual result at each stage, - Ensure any reasonably skilled user can follow and hit the same issue. ### Expected Behavior I go to Workspace > Tools > Import from URL, specify an MCPO-derived URL (http://localhost:8000/playwright/openapi.json), it fetches the JSON, I click save, and it saves. ### Actual Behavior When I click Save, I see an error toast saying "name 'true' is not defined" in the browser. ### Steps to Reproduce 1. Clean CentOS Stream 9 build 2. Set up docker install of open-webui 3. Set up mcpo with any tool server(s) defined 4. Go to Workspace in left nav menu 5. Go to Tools along top menu 6. Click New tool 7. Click Import from URL 8. Enter http://localhost:8000/tool/openapi.json 9. Click Save ### Logs & Screenshots Container log ``` ui-1 | 2026-03-03 18:05:06.005 | INFO | open_webui.utils.plugin:install_frontmatter_requirements:434 - No requirements found in frontmatter. ui-1 | 2026-03-03 18:05:06.008 | ERROR | open_webui.utils.plugin:load_tool_module_by_id:252 - Error loading module: playwright: name 'true' is not defined ui-1 | 2026-03-03 18:05:06.008 | ERROR | open_webui.routers.tools:create_new_tools:408 - Failed to load the tool by id playwright: name 'true' is not defined ui-1 | Traceback (most recent call last): ui-1 | ui-1 | File "<frozen runpy>", line 198, in _run_module_as_main ui-1 | File "<frozen runpy>", line 88, in _run_code ui-1 | File "/usr/local/lib/python3.11/site-packages/uvicorn/__main__.py", line 4, in <module> ui-1 | uvicorn.main() ui-1 | │ └ <Command main> ui-1 | └ <module 'uvicorn' from '/usr/local/lib/python3.11/site-packages/uvicorn/__init__.py'> ui-1 | File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1485, in __call__ ui-1 | return self.main(*args, **kwargs) ui-1 | │ │ │ └ {} ui-1 | │ │ └ () ui-1 | │ └ <function Command.main at 0x7fa01f3f7100> ui-1 | └ <Command main> ui-1 | File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1406, in main ui-1 | rv = self.invoke(ctx) ui-1 | │ │ └ <click.core.Context object at 0x7fa020128710> ui-1 | │ └ <function Command.invoke at 0x7fa01f3f6de0> ui-1 | └ <Command main> ui-1 | File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1269, in invoke ui-1 | return ctx.invoke(self.callback, **ctx.params) ui-1 | │ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8085, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ... ui-1 | │ │ │ │ └ <click.core.Context object at 0x7fa020128710> ui-1 | │ │ │ └ <function main at 0x7fa01f1fbec0> ui-1 | │ │ └ <Command main> ui-1 | │ └ <function Context.invoke at 0x7fa01f3f6020> ui-1 | └ <click.core.Context object at 0x7fa020128710> ui-1 | File "/usr/local/lib/python3.11/site-packages/click/core.py", line 824, in invoke ui-1 | return callback(*args, **kwargs) ui-1 | │ │ └ {'host': '0.0.0.0', 'port': 8085, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ... ui-1 | │ └ () ui-1 | └ <function main at 0x7fa01f1fbec0> ui-1 | File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 424, in main ui-1 | run( ui-1 | └ <function run at 0x7fa01f2adc60> ui-1 | File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 594, in run ui-1 | server.run() ui-1 | │ └ <function Server.run at 0x7fa01f2ad4e0> ui-1 | └ <uvicorn.server.Server object at 0x7fa01f427350> ui-1 | File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 67, in run ui-1 | return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory()) ui-1 | │ │ │ │ │ │ └ <function Config.get_loop_factory at 0x7fa01f3c4360> ui-1 | │ │ │ │ │ └ <uvicorn.config.Config object at 0x7fa01f2013d0> ui-1 | │ │ │ │ └ <uvicorn.server.Server object at 0x7fa01f427350> ui-1 | │ │ │ └ None ui-1 | │ │ └ <function Server.serve at 0x7fa01f2ad580> ui-1 | │ └ <uvicorn.server.Server object at 0x7fa01f427350> ui-1 | └ <function asyncio_run at 0x7fa01f3fe020> ui-1 | File "/usr/local/lib/python3.11/site-packages/uvicorn/_compat.py", line 30, in asyncio_run ui-1 | return runner.run(main) ui-1 | │ │ └ <coroutine object Server.serve at 0x7fa01f1634c0> ui-1 | │ └ <function Runner.run at 0x7fa01f64cfe0> ui-1 | └ <asyncio.runners.Runner object at 0x7fa01f203310> ui-1 | File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run ui-1 | return self._loop.run_until_complete(task) ui-1 | │ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:71> wai... ui-1 | │ │ └ <cyfunction Loop.run_until_complete at 0x7fa01ef1a800> ui-1 | │ └ <uvloop.Loop running=True closed=False debug=False> ui-1 | └ <asyncio.runners.Runner object at 0x7fa01f203310> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro ui-1 | await self.app(scope, receive_or_disconnect, send_no_error) ui-1 | │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x7f9f88d6c2c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <starlette_compress.CompressMiddleware object at 0x7f9fa0492d90> ui-1 | └ <open_webui.main.RedirectMiddleware object at 0x7f9fa0626050> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette_compress/__init__.py", line 104, in __call__ ui-1 | return await self._zstd(scope, receive, send) ui-1 | │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x7f9f88d6c2c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <member '_zstd' of 'CompressMiddleware' objects> ui-1 | └ <starlette_compress.CompressMiddleware object at 0x7f9fa0492d90> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette_compress/_zstd_legacy.py", line 107, in __call__ ui-1 | await self.app(scope, receive, wrapper) ui-1 | │ │ │ │ └ <function ZstdResponder.__call__.<locals>.wrapper at 0x7f9f88d6e5c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <member 'app' of 'ZstdResponder' objects> ui-1 | └ <starlette_compress._zstd_legacy.ZstdResponder object at 0x7f9f96320680> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ ui-1 | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) ui-1 | │ │ │ │ │ │ └ <function ZstdResponder.__call__.<locals>.wrapper at 0x7f9f88d6e5c0> ui-1 | │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ │ │ └ <starlette.requests.Request object at 0x7f9f8afc04d0> ui-1 | │ │ └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550> ui-1 | │ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x7f9fa0348d50> ui-1 | └ <function wrap_app_handling_exceptions at 0x7fa01c58b420> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app ui-1 | await app(scope, receive, sender) ui-1 | │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550> ui-1 | File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ ui-1 | await self.app(scope, receive, send) ui-1 | │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <fastapi.routing.APIRouter object at 0x7f9fa066dad0> ui-1 | └ <fastapi.middleware.asyncexitstack.AsyncExitStackMiddleware object at 0x7f9fa0348550> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 716, in __call__ ui-1 | await self.middleware_stack(scope, receive, send) ui-1 | │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x7f9fa066dad0>> ui-1 | └ <fastapi.routing.APIRouter object at 0x7f9fa066dad0> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 736, in app ui-1 | await route.handle(scope, receive, send) ui-1 | │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <function Route.handle at 0x7fa01c5e0ae0> ui-1 | └ APIRoute(path='/api/v1/tools/create', name='create_new_tools', methods=['POST']) ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 290, in handle ui-1 | await self.app(scope, receive, send) ui-1 | │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ └ <function request_response.<locals>.app at 0x7f9f96409ee0> ui-1 | └ APIRoute(path='/api/v1/tools/create', name='create_new_tools', methods=['POST']) ui-1 | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 121, in app ui-1 | await wrap_app_handling_exceptions(app, request)(scope, receive, send) ui-1 | │ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f88d6f4c0> ui-1 | │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | │ │ └ <starlette.requests.Request object at 0x7f9f8ac87e10> ui-1 | │ └ <function request_response.<locals>.app.<locals>.app at 0x7f9f8abdc180> ui-1 | └ <function wrap_app_handling_exceptions at 0x7fa01c58b420> ui-1 | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app ui-1 | await app(scope, receive, sender) ui-1 | │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x7f9f8abddc60> ui-1 | │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x7f9f88d6e980> ui-1 | │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8085), 'cl... ui-1 | └ <function request_response.<locals>.app.<locals>.app at 0x7f9f8abdc180> ui-1 | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 107, in app ui-1 | response = await f(request) ui-1 | │ └ <starlette.requests.Request object at 0x7f9f8ac87e10> ui-1 | └ <function get_request_handler.<locals>.app at 0x7f9f96409d00> ui-1 | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 426, in app ui-1 | raw_response = await run_endpoint_function( ui-1 | └ <function run_endpoint_function at 0x7fa01c5e2f20> ui-1 | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 314, in run_endpoint_function ui-1 | return await dependant.call(**values) ui-1 | │ │ └ {'user': UserModel(id='1cc7251a-3260-4126-aa23-f3e41212d3fe', email='ayan4m1@gmail.com', username=None, role='admin', name='A... ui-1 | │ └ <function create_new_tools at 0x7f9fa18c32e0> ui-1 | └ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant... ui-1 | ui-1 | > File "/app/backend/open_webui/routers/tools.py", line 386, in create_new_tools ui-1 | tool_module, frontmatter = load_tool_module_by_id( ui-1 | └ <function load_tool_module_by_id at 0x7f9fa26a0cc0> ui-1 | ui-1 | File "/app/backend/open_webui/utils/plugin.py", line 254, in load_tool_module_by_id ui-1 | raise e ui-1 | ui-1 | File "/app/backend/open_webui/utils/plugin.py", line 242, in load_tool_module_by_id ui-1 | exec(content, module.__dict__) ui-1 | │ │ └ <member '__dict__' of 'module' objects> ui-1 | │ └ <module 'tool_playwright' from '/tmp/tmp7gfu9cal'> ui-1 | └ '{\n "openapi": "3.1.0",\n "info": {\n "title": "Playwright",\n "description": "Playwright MCP Server",\n... ui-1 | ui-1 | File "<string>", line 36, in <module> ui-1 | ui-1 | NameError: name 'true' is not defined ui-1 | 2026-03-03 18:05:06.011 | INFO | uvicorn.protocols.http.httptools_impl:send:483 - 73.30.54.204:0 - "POST /api/v1/tools/create HTTP/1.1" 400 u ``` Browser console log ``` POST https://ai.bulletlogic.com/api/v1/tools/create [HTTP/2 400 131ms] ``` ### Additional Information _No response_
GiteaMirror added the bug label 2026-04-25 09:25:18 -05:00
Author
Owner

@tjbck commented on GitHub (Mar 7, 2026):

Please read the docs.

<!-- gh-comment-id:4017626921 --> @tjbck commented on GitHub (Mar 7, 2026): Please read the docs.
Author
Owner

@ayan4m1 commented on GitHub (Mar 8, 2026):

That is shockingly unhelpful.

<!-- gh-comment-id:4017952377 --> @ayan4m1 commented on GitHub (Mar 8, 2026): That is shockingly unhelpful.
Author
Owner

@ayan4m1 commented on GitHub (Mar 8, 2026):

WHAT DOCS, WHERE?!

<!-- gh-comment-id:4017952987 --> @ayan4m1 commented on GitHub (Mar 8, 2026): WHAT DOCS, WHERE?!
Author
Owner

@Classic298 commented on GitHub (Mar 8, 2026):

https://docs.openwebui.com/features/extensibility/plugin/tools/

<!-- gh-comment-id:4017966355 --> @Classic298 commented on GitHub (Mar 8, 2026): https://docs.openwebui.com/features/extensibility/plugin/tools/
Author
Owner

@Classic298 commented on GitHub (Mar 8, 2026):

Image

@ayan4m1

<!-- gh-comment-id:4017967051 --> @Classic298 commented on GitHub (Mar 8, 2026): <img width="775" height="646" alt="Image" src="https://github.com/user-attachments/assets/63029695-765f-4116-9475-dd1d2286ad6f" /> @ayan4m1
Author
Owner

@Classic298 commented on GitHub (Mar 8, 2026):

Please read the docs.

<!-- gh-comment-id:4017967486 --> @Classic298 commented on GitHub (Mar 8, 2026): Please read the docs.
Author
Owner

@ayan4m1 commented on GitHub (Mar 9, 2026):

That doesn't work either, I added it there to begin with but it doesn't show up as a checkable box for any of the models I have available. I see one of the two tool servers that I have added under Settings > Connections, the other one is missing

<!-- gh-comment-id:4027652986 --> @ayan4m1 commented on GitHub (Mar 9, 2026): That doesn't work either, I added it there to begin with but it doesn't show up as a checkable box for any of the models I have available. I see one of the two tool servers that I have added under Settings > Connections, the other one is missing
Author
Owner

@ayan4m1 commented on GitHub (Mar 9, 2026):

You guys are toxic as hell.

<!-- gh-comment-id:4027655486 --> @ayan4m1 commented on GitHub (Mar 9, 2026): You guys are toxic as hell.
Author
Owner

@Classic298 commented on GitHub (Mar 10, 2026):

Guiding you to the docs which you refused to read before opening an ISSUE about how there is a BUG in Open WebUI is toxic? Aight got it.

You said you can't add mcpo tools to workspace - which is not intended to begin with.

In that sense I'd like to point you to the Code of Conduct which you violated repeatedly.


If a tool server is missing, your server probably can't connect to it properly.

And if you want to activate a tool server tool for a model you should enable it in the chat

<!-- gh-comment-id:4029507731 --> @Classic298 commented on GitHub (Mar 10, 2026): Guiding you to the docs which you refused to read before opening an **ISSUE** about how there is a **BUG** in Open WebUI is toxic? Aight got it. You said you can't add mcpo tools to workspace - which is not intended to begin with. In that sense I'd like to point you to the [Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md) which you violated repeatedly. --- If a tool server is missing, your server probably can't connect to it properly. And if you want to activate a tool server tool for a model you should enable it in the chat
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/open-webui#35183