Windows 11でmcp-discordが日本語チャンネル名だと固まる問題の原因と解決法
TL;DR
Windows 11 上で mcp-discord を使ってると、日本語のチャンネル名を渡したときだけ固まっちゃうことがあります。
原因は MCP サーバー(Python)が標準入出力を UTF-8 で扱っていないせい。解決策は PYTHONUTF8=1
と PYTHONIOENCODING=utf-8
をサーバー設定に追加して、Python の stdio を UTF-8 に強制するだけです。
と、書いてみたものの特にほかで不具合打ちあがっていないので、私の環境だけの問題はあまり切り分けられておらず、、、メモとして投稿。。。
環境
- OS: Windows 11 (PowerShell / Windows Terminal)
- サーバー: @hanweg/mcp-discord (Python 実装、JSON-RPC over stdio)
- クライアント: MCP 対応クライアント (例: Claude Desktop / RooCode など)
- 今回の件で動作確認に利用させていただいたリポmcp-discord
症状(ログの特徴)
- 英語のチャンネル名
create_text_channel(name="community-events")
は即成功。 - 日本語のチャンネル名
create_text_channel(name="テスト日本語チャンネル")
を送ると、サーバーログに「Processing request ...」が出ないまま60秒くらい無応答→クライアント側がタイムアウト。
ポイント: Discord API のバリデーションで失敗するならすぐエラーが返るはず。なのに「沈黙→タイムアウト」になるのは、stdio のエンコーディングが怪しいサインです。
原因は?
- MCP の Python 実装は stdin/stdout で JSON をやり取りする仕組み。
- Windows の既定コードページは UTF-8 じゃない (例: CP932)。
- その状態で日本語入りの JSON を読むと UnicodeDecodeError/EncodeError が発生して処理が止まっちゃう。
- 英語 (ASCII) だけなら問題ないけど、日本語が入ると途端にフリーズする…というわけ。
解決策(これで直る)
MCP クライアントのサーバー設定 JSON に環境変数を追加して、Python の stdio を無理やり UTF-8 にします。
{
"servers": {
"discord": {
"command": "uv",
"args": ["--directory", "D:\\path\\to\\mcp-discord", "run", "mcp-discord"],
"env": {
"DISCORD_TOKEN": "xxxxxxxxxxxxxxxx",
"PYTHONUTF8": "1",
"PYTHONIOENCODING": "utf-8"
}
}
}
}
-
PYTHONUTF8=1
… Python 3.7+ の UTF-8 モードを有効化 -
PYTHONIOENCODING=utf-8
… 標準入出力エンコーディングを明示
これだけで日本語チャンネル名でも普通に動きます。ソースを書き換えたり sys.stdout.reconfigure
したりは不要です。
おまけの動作確認
PowerShell のコードページが 65001 (UTF-8) じゃなくても、この2つの変数を入れておけば大丈夫。念のため chcp 65001
で UTF-8 にしておくのもあり。py -c "import sys; print(sys.stdout.encoding)"
が utf-8
になっていればOKです。
他のアプローチ
- PowerShell を UTF-8 に寄せる例:
chcp 65001 | Out-Null $OutputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding $false
- OS 全体を UTF-8 モードにする手もありますが、副作用があるのであまりオススメしません。
- どうしてもダメなら WSL (Ubuntu) でサーバーを動かすのも手。
よくある疑問
Q. なんでスタックトレースが出ないの?
A. stdio の読み書きで例外が出ると、ロガーに到達する前に処理が止まっちゃうか握り潰されるので、結果として沈黙→タイムアウトになりがちです。
Q. 英語名は動くのに日本語名だけ失敗するのは?
A. ASCII はどのコードページでも壊れにくいけど、日本語はエンコーディングが合ってないと即アウト。UTF-8 に統一すれば解消します。
まとめ
- 原因: Windows のコードページと Python の stdio エンコーディングが UTF-8 じゃない → JSON-RPC/stdio が日本語を処理できずタイムアウト。
- 対処: MCP サーバー設定に
PYTHONUTF8=1
とPYTHONIOENCODING=utf-8
を追加。 - 結果: 日本語チャンネル名も日本語メッセージも問題なく動作。
「英語は動くけど日本語で固まる」って現象に遭遇したら、まずは Python の stdio を UTF-8 にしてみましょう。たいていそれで勝てます。🧩