Skip to main content

python-session-mcp

Licence Python

Run Python in a session that stays alive, and expose it to LLM clients over the Model Context Protocol.

Author: Dr Merwan Roudane

What makes it different

The session persists. A DataFrame loaded in one call is still there in the next, so an analysis is built up in steps rather than resent whole each time.

Your interpreter, not the server's. The server may well be installed under a bare Python with no pandas in it. The interpreter that runs your code is chosen separately: a conda or Anaconda installation is preferred when one is present, and PYTHON_MCP_INTERPRETER overrides that.

A crash costs one process. Code runs in a worker, not in the server. Exhaust memory, call sys.exit, crash a C extension — the worker is replaced and the server carries on. It also keeps user code away from the server's stdin, which under MCP is the JSON-RPC stream itself.

Install

pip install python-session-mcp

Library use

from python_mcp import PythonRunner

with PythonRunner() as py:
    py.run("import pandas as pd, statsmodels.api as sm")
    py.run("df = pd.read_csv('macro.csv')")
    print(py.run("df.describe()"))

    py.run("m = sm.OLS(df['y'], sm.add_constant(df[['x','z']])).fit()")
    print(py.run("m.summary()"))
    print(py.value("m.params.to_dict()"))    # a real Python dict

A final expression is shown the way a REPL would, so df.head() on its own displays the frame without print().

MCP server use

{
  "mcpServers": {
    "python": {
      "command": "python-session-mcp",
      "env": { "PYTHON_MCP_INTERPRETER": "C:\\Users\\you\\anaconda3\\python.exe" }
    }
  }
}

Tools

Session

Tool Purpose
python_status Which interpreter, and which packages it actually has
reset_namespace Forget everything, optionally restarting the interpreter

Running code

Tool Purpose
run_python Main tool. Run code in the persistent session
list_names What is currently defined
describe_object Type, shape, dtypes and a peek at one object
get_value Bring a JSON-representable value back

Data

Tool Purpose
load_data Read .csv, .xlsx, .dta, .parquet, .sav or .json
save_data Write a DataFrame out, creating missing folders
preview_data Shape, dtypes, missing counts and the first rows
summary_statistics Descriptives with skew and kurtosis
correlation Pearson, Spearman or Kendall

Estimation

Tool Purpose
regression OLS, optionally with HC or HAC standard errors
regression_diagnostics Breusch-Godfrey, White and Jarque-Bera in one call
unit_root ADF or KPSS, differencing until stationary

Charts

Tool Purpose
plot line, scatter, hist, box or bar — optionally straight to a file
save_figure Write the open matplotlib figure to a file

Errors

Failures name the exception and the line of your code, and leave the session intact:

Python error: NameError on line 2: name 'undefined_name' is not defined

Anything printed before the failure is reported with it, since that output is often what explains the failure.

Figures

A plot cannot come back as text. Draw it, then save it:

py.run("import matplotlib; matplotlib.use('Agg')")
py.run("import matplotlib.pyplot as plt; plt.plot(df['x'], df['y'], 'o')")
py.save_figure("figures/scatter.png")     # missing folders are created

Worth knowing

  • The interpreter is separate from the server's. Check python_status before relying on a package being there.
  • State is a convenience and a hazard. Names persist, so a stale variable from an earlier step can quietly feed a later one. reset_namespace when starting something new.
  • run_python executes whatever it is given, in your environment, with your file access. That is the point of it, and worth being deliberate about.
  • The final expression is echoed. A long DataFrame will print in full unless you slice it.

Tests

python tests/test_live.py     # 41 tests

They cover persistence, error reporting with line numbers, JSON round trips, figure writing, recovery after user code kills the worker outright, and every data and estimation tool against generated data with known coefficients.

Checked against EViews on the same data, the regression agrees to every printed digit -- coefficients, R-squared, Durbin-Watson, and the Breusch-Godfrey and Jarque-Bera statistics alike.

Licence

MIT. Copyright (c) 2026 Merwan Roudane.

Metadata

Release files for python-session-mcp 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for python-session-mcp 0.1.0
File Size Uploaded
python_session_mcp-0.1.0.tar.gz 18.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for python-session-mcp 0.1.0
File Interpreter ABI Platform
python_session_mcp-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 39.2 kB

Release files / python_session_mcp-0.1.0.tar.gz

Download URL python_session_mcp-0.1.0.tar.gz
Size 18.6 kB
Tags Source
SHA-256 checksum
How to use checksums
759e9be50c590405a551d2cebd14769abff7b13863e336b0fa41dfb1d28c7690
BLAKE2b-256 checksum
How to use checksums
0f3e109a50b97691bbab8c07f8ab39bab53edc54e51f0b62b52ae3d1926a5096
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.0

Release files / python_session_mcp-0.1.0-py3-none-any.whl

Download URL python_session_mcp-0.1.0-py3-none-any.whl
Size 20.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
11a1681986384d07b767ba2b3ba372656ce5248f30f5fe87aac2bf37b43b3d26
BLAKE2b-256 checksum
How to use checksums
cc00c4e3eb9572988ecd11f5cde5a21141ff3e0781038a53a78489b45547030e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.0

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page