项目简介

该项目是一个基于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文件。

安装步骤

该项目主要为容器化部署设计。如果您想在本地环境中运行,请遵循以下一般步骤:

  1. 克隆仓库: 首先,将项目仓库克隆到您的本地机器:
    git clone https://github.com/Vinuitik/MCP_Server_Notebook.git
    cd MCP_Server_Notebook/mcpContainer
  2. 安装依赖: 进入 '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
  3. 创建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接口。)

基本使用方法

  1. 启动服务器: 在'mcpContainer'目录下,运行主文件以启动MCP服务器和FastAPI文件服务:

    python main.py

    您将看到控制台输出,指示MCP服务器在端口'8002'启动,FastAPI文件服务在端口'8003'启动。

  2. 通过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())
  3. 通过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与计算