modelcontextprotocol / modelcontextprotocol/python-sdk
support logging to stderr in Jupyter Notebook Environments.
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 24.3k
- Fork
- 4k
- Merge trung bình
- 1 ngày 1 giờ
- Pull request đã merge (30 ngày)
- 31
Mô tả
Is your feature request related to a problem? Please describe.
I want to make mcp python-sdk jupyter notebook compatible. When running in a notebook environment, MCP work but do not output stderr as it does normally.
For instance in jupyter notebook:
import mcp
import os
from mcp.client.stdio import stdio_client
serverparams = mcp.StdioServerParameters(
command="uv",
args=["--quiet", "run", "../src/echo.py"],
env={"UV_PYTHON": "3.12", **os.environ},
)
async with stdio_client(serverparams) as (read, write):
async with mcp.ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print(tools)
Outputs:
meta=None nextCursor=None tools=[Tool(name='echo_tool', description='Echo the input text\n\n Args:\n text (str): The text to echo\n\n Returns:\n str: The echoed text\n ', inputSchema={'properties': {'text': {'title': 'Text', 'type': 'string'}}, 'required': ['text'], 'title': 'echo_toolArguments', 'type': 'object'})]
while running the server without jupyter notebook:
❯ uv run --quiet src/echo.py
starting echo server
stderr is correctly displayed.
This is a big problem mostly because if the server is crashing or the command is wrong you have no way to know what's wrong: nothing is logged and the jupyter notebook cell just hangs.
Describe the solution you'd like
I found the culprit being the use of:
process = await anyio.open_process(
[server.command, *server.args],
env=server.env if server.env is not None else get_default_environment(),
stderr=sys.stderr,
)
In particular sys.stderr here is not working in the jupyter / ipython context. Instead I would suggest a working change as follow:
- remove the stderr params from the process and handle process.stderr in an async function as stdout / stdin is handled.
- to that effect, use a
stderr_readerasync function like the following:
async def stderr_reader():
assert process.stderr, "Opened process is missing stderr"
try:
async for line in process.stderr:
if is_jupyter_notebook():
print(f"\033[91m {line.decode().strip()}")
else:
# redirect to stderr as before
print(line.decode().strip(), file=sys.stderr)
except anyio.ClosedResourceError:
await anyio.lowlevel.checkpoint()
This would result in the same behavior as before while allowing the stderr to be logged in the jupyter notebook context.
Additional context
Jupyter notebook support support is also requested for mcpadapt which bring MCP server tools in any agentic framework, as many agentic framework demonstrate usage in jupyter notebooks.
https://github.com/grll/mcpadapt
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu từ stdio_client và lời gọi anyio.open_process của nó, sau đó so sánh cách hoạt động của việc xử lý stdout và stdin hiện có với process.stderr. Hoàn thành khi các lỗi máy chủ hiển thị trong các notebook Jupyter hoặc IPython, trong khi stderr vẫn giữ hành vi bình thường ở những nơi khác, kể cả khi tiến trình thất bại hoặc lệnh không hợp lệ.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- jupyter-notebook, python
- Lĩnh vực
- backend, cli, developer-experience
- Loại issue
- Tính năng
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Sôi nổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 58/100