[project]
name = "mcp-stata"
dynamic = ["version"]
description = " A lightweight Model Context Protocol (MCP) server for Stata. Execute commands, inspect data, retrieve stored results (`r()`/`e()`), and view graphs in your chat interface. Built for economists who want to integrate LLM assistance into their Stata workflow. "
readme = "README.md"
requires-python = ">=3.12"
license = "AGPL-3.0-or-later"
authors = [
{ name = "Thomas Monk", email = "t.d.monk@lse.ac.uk" }
]
keywords = ["mcp", "stata", "statistics", "econometrics", "ai", "llm"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Science/Research",
"Intended Audience :: Developers",
"Topic :: Scientific/Engineering :: Information Analysis",
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14"
]
dependencies = [
"mcp[cli]>=1.0.0",
"pandas>=2.0.0",
"pydantic>=2.0.0",
"pystata>=0.0.1",
"stata_setup>=0.1.0",
"httpx>=0.27.0,<0.28.0", # Pin to 0.27.x for httpx_sse compatibility
"pytest-asyncio>=1.3.0",
"pyarrow>=14.0.0",
"polars>=1.36.1",
]
[project.optional-dependencies]
dev = [
"build>=1.3.0",
"hatch>=1.16.2",
"twine>=6.2.0",
"ruff>=0.4.0",
"pytest>=7.0.0",
"pytest-cov>=4.0.0",
]
[project.urls]
Homepage = "https://github.com/tmonk/mcp-stata"
Repository = "https://github.com/tmonk/mcp-stata"
Issues = "https://github.com/tmonk/mcp-stata/issues"
[project.scripts]
mcp-stata = "mcp_stata.server:main"
[build-system]
requires = ["hatchling", "hatch-vcs"]
build-backend = "hatchling.build"
[tool.hatch.version]
source = "vcs"
[tool.hatch.build.targets.wheel]
packages = ["src/mcp_stata"]
[tool.hatch.build.targets.sdist]
exclude = ["/tests", "/uv.lock"]
[tool.ruff]
line-length = 100
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "I", "W"]
ignore = ["E501"]
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-v --cov=mcp_stata --cov-report=term-missing"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
]