Skip to content

Commit

Permalink
Force stdin/stdout encoding to UTF-8
Browse files Browse the repository at this point in the history
The character encoding of the stdin/stdout streams in Python is platform-
dependent. On Windows it will be something weird, like CP437 or CP1252,
depending on the locale. This change ensures that no matter the platform,
UTF-8 is used.
  • Loading branch information
rnortman authored and dsp-ant committed Feb 18, 2025
1 parent 68fcf92 commit d92ee8f
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions src/mcp/server/stdio.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ async def run_server():

import sys
from contextlib import asynccontextmanager
from io import TextIOWrapper

import anyio
import anyio.lowlevel
Expand All @@ -38,11 +39,13 @@ async def stdio_server(
from the current process' stdin and writing to stdout.
"""
# Purposely not using context managers for these, as we don't want to close
# standard process handles.
# standard process handles. Encoding of stdin/stdout as text streams on
# python is platform-dependent (Windows is particularly problematic), so we
# re-wrap the underlying binary stream to ensure UTF-8.
if not stdin:
stdin = anyio.wrap_file(sys.stdin)
stdin = anyio.wrap_file(TextIOWrapper(sys.stdin.buffer, encoding="utf-8"))
if not stdout:
stdout = anyio.wrap_file(sys.stdout)
stdout = anyio.wrap_file(TextIOWrapper(sys.stdout.buffer, encoding="utf-8"))

read_stream: MemoryObjectReceiveStream[types.JSONRPCMessage | Exception]
read_stream_writer: MemoryObjectSendStream[types.JSONRPCMessage | Exception]
Expand Down

0 comments on commit d92ee8f

Please sign in to comment.