MCP Run Python
文章介绍了使用 `MCP` 运行 Python 代码的实现,基于 [Pyodide](https://github.com/pydantic/pydantic-ai/tree/main/) 在 [Deno](https://github.com/pydantic/pydantic-ai/tree/main/ ) 环境中执行,实现代码隔离。 提供了运行服务器的命令,包括使用 `stdio` 和 `sse` 两种传输方式。 此外,还给出了一个使用 `@pydantic/mcp-run-python` 和 PydanticAI 的示例代码,展示了如何通过 `Agent` 调用 Python 代码并获取结果。
MCP 运行 Python 代码
文件
main
路径导航
/
mcp-run-python
/ 复制路径
目录操作
更多选项
目录操作
更多选项
最新提交
历史记录
main
路径导航
/
mcp-run-python
/ 顶部
文件夹和文件
名称| 名称| 最新提交信息| 最新提交日期 ---|---|---|---
上级目录
.. src| src stubs| stubs .gitignore| .gitignore README.md| README.md build.ts| build.ts deno.json| deno.json deno.lock| deno.lock pyproject.toml| pyproject.toml test_mcp_servers.py| test_mcp_servers.py 查看所有文件
README.md
MCP Run Python
Model Context Protocol 服务,用于在沙箱中运行 Python 代码。
代码使用 Pyodide 在 Deno 中执行,因此与操作系统的其余部分隔离。
完整的文档请参阅 https://ai.pydantic.dev/mcp/run-python/。
服务器可以通过安装 deno
来运行:
deno run \
-N -R=node_modules -W=node_modules --node-modules-dir=auto \
jsr:@pydantic/mcp-run-python [stdio|sse|warmup]
其中:
-N -R=node_modules -W=node_modules
(等同于--allow-net --allow-read=node_modules --allow-write=node_modules
) 允许网络访问和对./node_modules
的读写访问。这是必需的,以便 pyodide 可以下载和缓存 Python 标准库和包--node-modules-dir=auto
告诉 deno 使用本地node_modules
目录stdio
使用 Stdio MCP transport 运行服务器 — 适合在本地作为子进程运行该进程sse
使用 SSE MCP transport 运行服务器 — 将服务器作为 HTTP 服务器运行,以便在本地或远程连接warmup
将运行一个最小的 Python 脚本来下载和缓存 Python 标准库。 这对于检查服务器是否正确运行也很有用。
以下是使用 @pydantic/mcp-run-python
和 PydanticAI 的一个例子:
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio
import logfire
logfire.configure()
logfire.instrument_mcp()
logfire.instrument_pydantic_ai()
server = MCPServerStdio('deno',
args=[
'run',
'-N',
'-R=node_modules',
'-W=node_modules',
'--node-modules-dir=auto',
'jsr:@pydantic/mcp-run-python',
'stdio',
])
agent = Agent('claude-3-5-haiku-latest', mcp_servers=[server])
async def main():
async with agent.run_mcp_servers():
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.w
if __name__ == '__main__':
import asyncio
asyncio.run(main())