MCP Run Python 是一个用于在沙箱环境中运行 Python 代码的 MCP 服务器。借助 Pyodide 在 Deno 中执行代码,实现了与操作系统其他部分的隔离,保障代码运行的安全性。
(此代码之前是 Pydantic AI 的一部分,为便于维护,将其移至单独的仓库。)
要使用此服务器,你需要同时安装 Python 和 Deno。
使用已安装的 deno 和 uvx 来运行服务器:
uvx mcp-run-python [-h] [--version] [--port PORT] [--deps DEPS] {stdio,streamable-http,example}
参数说明:
stdio:使用 Stdio MCP 传输 运行服务器,适合将该进程作为本地子进程运行。streamable-http:使用 Streamable HTTP MCP 传输 运行服务器,适合将服务器作为 HTTP 服务器运行,可本地或远程连接。支持有状态请求,但不像 SSE 那样要求客户端保持有状态连接。example:使用 numpy 运行一个最小的 Python 脚本,用于检查包是否正常工作。要使代码成功运行,你需要使用 uvx mcp-run-python --deps numpy example 安装 numpy。from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio
from mcp_run_python import deno_args_prepare
import logfire
logfire.configure()
logfire.instrument_mcp()
logfire.instrument_pydantic_ai()
server = MCPServerStdio('uvx', args=['mcp-run-python@latest', 'stdio'], timeout=10)
agent = Agent('claude-3-5-haiku-latest', toolsets=[server])
async def main():
async with agent:
result = await agent.run('How many days between 2000-01-01 and 2025-03-18?')
print(result.output)
#> There are 9,208 days between January 1, 2000, and March 18, 2025.
if __name__ == '__main__':
import asyncio
asyncio.run(main())
首先安装 mcp-run-python 包:
pip install mcp-run-python
# or
uv add mcp-run-python
安装 mcp-run-python 后,你可以使用 prepare_deno_env 或 async_prepare_deno_env 直接运行 deno:
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio
from mcp_run_python import async_prepare_deno_env
import logfire
logfire.configure()
logfire.instrument_mcp()
logfire.instrument_pydantic_ai()
async def main():
async with async_prepare_deno_env('stdio') as deno_env:
server = MCPServerStdio('deno', args=deno_env.args, cwd=deno_env.cwd, timeout=10)
agent = Agent('claude-3-5-haiku-latest', toolsets=[server])
async with agent:
result = await agent.run('How many days between 2000-01-01 and 2025-03-18?')
print(result.output)
#> There are 9,208 days between January 1, 2000, and March 18, 2025.
if __name__ == '__main__':
import asyncio
asyncio.run(main())
注意:prepare_deno_env 可以接受 deps 作为关键字参数来安装依赖项。除了返回运行 mcp_run_python 所需的参数外,prepare_deno_env 还会创建一个新的 deno 环境并安装依赖项,以便服务器使用。
code_sandbox 在代码中运行mcp-run-python 包含一个辅助函数 code_sandbox,可让你轻松在沙箱中运行代码。
from mcp_run_python import code_sandbox
code = """
import numpy
a = numpy.array([1, 2, 3])
print(a)
a
"""
async def main():
async with code_sandbox(dependencies=['numpy']) as sandbox:
result = await sandbox.eval(code)
print(result)
if __name__ == '__main__':
import asyncio
asyncio.run(main())
实际上,code_sandbox 使用 stdio 运行一个 MCP 服务器。你可以使用单个沙箱运行多个代码块。
MCP Run Python 支持将 Python 执行的标准输出和标准错误作为 MCP 日志消息 发出。要发出日志,你必须在连接到服务器时设置日志级别。默认情况下,日志级别设置为最高级别 emergency。
mcp_run_python 使用两步流程来安装依赖项,同时避免沙箱代码编辑文件系统的任何风险:
node_modules 目录的写入权限运行 deno 并安装依赖项,将 wheel 文件写入相应位置。node_modules 目录的只读权限运行 deno 来运行不可信代码。必须在初始化服务器时提供依赖项,以便在第一步中安装它们。