💬
Open WebUI で MCP してみた(ら、2 つの不都合に出会ってどうにかしてもらった)
環境
- MacOS 15.3.1
- Ollama version is 0.6.5
- Ollama は、MacOS 上にインストール(非 Docker)
- Docker version 27.5.1
- Open WebUI v0.6.2
- Docker で起動
1 つ目の不都合
下記に書いた日本語(マルチバイト)がユニコードのエスケープシーケンス表記になってしまうやつ。 fetch 使ってたら気がついた。
2 つ目の不都合
MCP Server から返される JSON 内に改行文字がエスケープされた \n
があると、\\n
になって Ollama 等の API に送られてしまう。 filesystem
filesystem の list_directory が使われると、下記のような JSON を LLM が解釈できずに、ファイル一覧なんて知らん、と言われてしまった。ローカルの LLM はもちろん、GPT にも言われた。
改修前は、これを LLM に渡していた。
[
"[FILE] abc\\n[FILE] xyz"
]
こうなるように改修したら、LLM が解釈してくれた。
[
"[FILE] abc\n[FILE] xyz"
]
改修内容は
backend/open_webui/utils/json_encoder.py (新規ファイル)
import json
class PreserveControlCharsEncoder(json.JSONEncoder):
def encode(self, obj):
result = super().encode(obj)
result = result.replace('\\n', '\n')
result = result.replace('\\r', '\r')
result = result.replace('\\t', '\t')
return result
def json_dumps_preserve_control_chars(obj, **kwargs):
return json.dumps(obj, cls=PreserveControlCharsEncoder, **kwargs)
tool_result = json_dumps_preserve_control_chars(tool_result, indent=2, ensure_ascii=False)
backend/open_webui/utils/middleware.py (既存ファイル)
import time
import logging
import sys
import os
import base64
+ from open_webui.utils.json_encoder import json_dumps_preserve_control_chars
if isinstance(tool_result, dict) or isinstance(tool_result, list):
- tool_result = json.dumps(tool_result, indent=2)
+ tool_result = json_dumps_preserve_control_chars(tool_result, indent=2, ensure_ascii=False)
不具合なのか?
不都合ではあるが、不具合かどうかの判断ができなかったので、ディスカッションに投げてみた。
mcpo の改修だったら、Issue なり PR なり投げたけどね。
あと、2 つ目の不都合の解決方法が、力技過ぎるのもね。
ちなみに
わたしは Python をほぼ書いたことがない。(Hello world に毛が生えたレベルのコーディングや、Python の OSS で中を覗くくらい)
いま、 Cursor や Windsurf、その他諸々を使ってプログラミングしているが、 Windsurf があっという間に不都合を解決してくれた。(この件に関しては Cursor はダメだった)
以上
Discussion