项目简介
该项目是一个基于Model Context Protocol (MCP) 的服务器实现,专门设计用于托管和管理Jupyter Notebook。它将Jupyter Notebook的核心操作(如创建、编辑、执行代码/Markdown单元格,保存、加载Notebook,以及管理Python执行上下文)封装为一系列可供大型语言模型 (LLM) 调用的工具。通过标准的MCP协议,LLM客户端可以利用这些工具,以编程方式构建、修改和运行Notebook,实现自动化数据分析、代码生成和实验记录等复杂任务。
主要功能点
- Notebook管理: 提供创建、保存、加载、列出和删除Jupyter Notebook文件的功能。
- 单元格操作: 支持创建代码单元格和Markdown单元格,获取指定单元格的内容,以及对单元格进行更新、删除和移动操作。
- 代码执行: 能够执行单个代码单元格或Notebook中的所有代码单元格,捕获执行过程中的标准输出和结果,并处理可能出现的错误。
- 执行上下文管理: 允许LLM客户端获取当前Python执行环境中的变量状态,并支持重启内核以清除所有变量和执行历史。
- 多协议支持: 通过'streamable-http'传输协议提供MCP服务,确保与各种MCP客户端的兼容性。
- 文件服务: 提供独立的HTTP接口,用于客户端直接下载已保存的Jupyter Notebook文件。
安装步骤
该项目主要为容器化部署设计。如果您想在本地环境中运行,请遵循以下一般步骤:
- 克隆仓库:
首先,将项目仓库克隆到您的本地机器:
git clone https://github.com/Vinuitik/MCP_Server_Notebook.git cd MCP_Server_Notebook/mcpContainer - 安装依赖:
进入 'mcpContainer' 目录后,您需要安装项目所需的Python依赖包。这通常包括'fastmcp'(MCP服务器框架)、'fastapi'(用于文件服务)、'uvicorn'(ASGI服务器)、'jupyter_client'和'ipykernel'(用于Jupyter Notebook核心功能)。
pip install fastmcp "fastapi>=0.100.0" uvicorn jupyter_client ipykernel typing_extensions - 创建Notebook存储目录:
为了保存和加载Notebook文件,服务器需要一个指定的目录。请创建'/app/notebooks'目录(在生产环境中,这通常通过Docker卷挂载实现)。
mkdir -p /app/notebooks
服务器配置 (供MCP客户端使用)
MCP客户端(如基于'langchain-mcp-adapters'的LLM应用)需要知道如何连接到此MCP服务器。以下是一个典型的JSON格式配置示例及其参数注释:
{ "notebook_server": { "transport": "streamable_http", "url": "http://localhost:8002/noteBooks/" } }
参数注释:
- 'notebook_server': 这是您为MCP服务定义的一个逻辑名称,客户端将使用此名称来引用和连接到该服务器。
- 'transport': 指定与MCP服务器通信所使用的传输协议类型。本服务器支持'streamable_http'。
- 'url': MCP服务器的完整访问地址,包括协议('http')、主机名('localhost'在本地测试时使用,部署时需替换为实际IP或域名)、端口号(默认'8002')以及MCP服务的具体路径('/noteBooks/')。
(请注意,除了MCP服务外,该仓库还在端口'8003'上提供了一个独立的FastAPI文件服务,用于直接下载Notebook文件。这个文件服务不是MCP协议的一部分,而是提供额外便利的HTTP接口。)
基本使用方法
-
启动服务器: 在'mcpContainer'目录下,运行主文件以启动MCP服务器和FastAPI文件服务:
python main.py您将看到控制台输出,指示MCP服务器在端口'8002'启动,FastAPI文件服务在端口'8003'启动。
-
通过MCP客户端连接和调用工具: 使用支持MCP协议的客户端库(例如'langchain-mcp-adapters')连接到MCP服务器,并调用其暴露的工具。 以下是一个Python客户端示例,展示如何连接并调用'createCodeCell'和'executeCodeCell'工具:
from langchain_mcp_adapters.client import MultiServerMCPClient import asyncio async def interact_with_mcp_server(): server_config = { "notebook_server": { "transport": "streamable_http", "url": "http://localhost:8002/noteBooks/" } } # 实例化MCP客户端 client = MultiServerMCPClient(server_config) # 获取所有可用的MCP工具 tools = await client.get_tools() print(f"Available tools: {[tool.name for tool in tools]}") # 示例: 创建一个代码单元格 create_code_cell_tool = next((t for t in tools if t.name == "createCodeCell"), None) if create_code_cell_tool: result = await create_code_cell_tool.arun({"content": "import pandas as pd\ndf = pd.DataFrame({'A': [1,2], 'B': [3,4]})\nprint(df.head())"}) print(f"Create code cell result: {result}") # 示例: 执行刚刚创建的代码单元格 (假设它在索引 0) execute_code_cell_tool = next((t for t in tools if t.name == "executeCodeCell"), None) if execute_code_cell_tool: result = await execute_code_cell_tool.arun({"index": 0}) print(f"Execute code cell result: {result}") print(f"Execution stdout: {result.get('stdout')}") print(f"Execution result: {result.get('result')}") # 运行异步客户端交互 asyncio.run(interact_with_mcp_server()) -
通过HTTP接口下载Notebook: 一旦您通过MCP工具保存了一个Notebook(例如,使用'saveNotebook'工具保存为'my_analysis.ipynb'),您可以通过浏览器或'curl'等HTTP客户端直接从'8003'端口的文件服务下载它:
# 下载特定的Notebook文件 http://localhost:8003/notebooks/my_analysis.ipynb # 列出所有已保存的Notebook文件名 http://localhost:8003/notebooks/list/all
信息
分类
AI与计算