MCP Run Python
Model Context Protocol server to run Python code in a sandbox.
The code is executed using Pyodide in Deno and is therefore isolated from the rest of the operating system.
See <https: ai.pydantic.dev="" mcp="" run-python=""></https:> for complete documentation.
The server can be run with deno
installed using:
deno run \
-N -R=node_modules -W=node_modules --node-modules-dir=auto \
jsr:@pydantic/mcp-run-python [stdio|sse|warmup]
where:
-N -R=node_modules -W=node_modules
(alias of--allow-net --allow-read=node_modules --allow-write=node_modules
) allows network access and read+write access to./node_modules
. These are required so pyodide can download and cache the Python standard library and packages--node-modules-dir=auto
tells deno to use a localnode_modules
directorystdio
runs the server with the Stdio MCP transport โ suitable for running the process as a subprocess locallysse
runs the server with the SSE MCP transport โ running the server as an HTTP server to connect locally or remotelywarmup
will run a minimal Python script to download and cache the Python standard library. This is also useful to check the server is running correctly.
Here's an example of using @pydantic/mcp-run-python
with Pydantic AI:
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', 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.w
if __name__ == '__main__':
import asyncio
asyncio.run(main())