Mcp Run Python

Mcp Run Python

🚀 MCP Run Python

MCP Run Python 是一个用于在沙箱环境中运行 Python 代码的 MCP 服务器。借助 PyodideDeno 中执行代码,实现了与操作系统其他部分的隔离,保障代码运行的安全性。

✨ 主要特性

  • 安全执行:在沙箱化的 WebAssembly 环境中运行 Python 代码,确保代码运行不受外界干扰。
  • 包管理:自动检测并安装所需的依赖项,无需手动繁琐操作。
  • 完整结果:捕获标准输出、标准错误和返回值,全面展示代码运行结果。
  • 异步支持:正确运行异步代码,满足复杂业务场景需求。
  • 错误处理:提供详细的错误报告,方便调试代码。

(此代码之前是 Pydantic AI 的一部分,为便于维护,将其移至单独的仓库。)

🚀 快速开始

要使用此服务器,你需要同时安装 Python 和 Deno

使用已安装的 denouvx 来运行服务器:

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

💻 使用示例

与 Pydantic AI 一起使用

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 服务器在代码中使用

首先安装 mcp-run-python 包:

pip install mcp-run-python
# or
uv add mcp-run-python

安装 mcp-run-python 后,你可以使用 prepare_deno_envasync_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 使用两步流程来安装依赖项,同时避免沙箱代码编辑文件系统的任何风险:

  1. 首先,以对 node_modules 目录的写入权限运行 deno 并安装依赖项,将 wheel 文件写入相应位置。
  2. 然后,以对 node_modules 目录的只读权限运行 deno 来运行不可信代码。

必须在初始化服务器时提供依赖项,以便在第一步中安装它们。

  • 0 关注
  • 0 收藏,22 浏览
  • system 提出于 2025-10-02 04:06

相似服务问题

相关AI产品