💬

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 はダメだった)

以上

GitHubで編集を提案

Discussion