[project] # Distribution name only. The import package, the console script, and the # MCP server name hosts display are all still `petromcp`. PyPI rejects # `petromcp` as too similar to the unrelated `petro-mcp`, which normalizes # to the same string once separators are collapsed. name = "petroleum-mcp" version = "0.8.1" description = "Local-first MCP server for petroleum data. Reads LAS well logs and DLIS files; SEG-Y and pump cards next." readme = "README.md" requires-python = ">=3.10" license = { text = "MIT" } authors = [{ name = "Amey Ambade" }] keywords = [ "mcp", "model-context-protocol", "petroleum", "well-log", "las", "dlis", "petrophysics", "oil-and-gas", "subsurface", "lasio", "claude", ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Information Analysis", "Typing :: Typed", ] dependencies = [ "fastmcp>=2.0,<3", "lasio>=0.31,<0.32", # Pinned, not floated: dlisio is a C++ extension and a version bump can # change parse behaviour. The weekly float job catches upstream drift. "dlisio>=1.0.4,<1.1", "pydantic>=2.6,<3", "numpy>=1.26", "pyyaml>=6.0", ] [project.urls] Homepage = "https://github.com/ameyxd/petromcp" Repository = "https://github.com/ameyxd/petromcp" Issues = "https://github.com/ameyxd/petromcp/issues" Changelog = "https://github.com/ameyxd/petromcp/blob/main/CHANGELOG.md" Documentation = "https://github.com/ameyxd/petromcp/blob/main/docs/TOOLS_REFERENCE.md" [project.scripts] petromcp = "petromcp.cli:main" # `uvx ` runs the executable whose name matches the package. Because # the distribution is `petroleum-mcp` and the script is `petromcp`, without # this alias `uvx petroleum-mcp serve` fails with "executable not found" — # which is the command every install instruction gives. Both names are kept: # `petromcp` for people with it on PATH, `petroleum-mcp` so uvx works. petroleum-mcp = "petromcp.cli:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/petromcp"] # The sdist carries what someone needs to build, test, and understand the # package. It deliberately omits `docs/superpowers/` (internal design and # planning records, ~170KB) and `CLAUDE.md` (agent instructions) — both stay # in the repo, neither belongs in a distribution. [tool.hatch.build.targets.sdist] include = [ "src/petromcp", "tests", "examples", "evals", "docs/*.md", "README.md", "CHANGELOG.md", "CONTRIBUTING.md", "SECURITY.md", "LICENSE", "SPEC_petromcp.md", "Makefile", "pyproject.toml", ] [dependency-groups] dev = [ "pytest>=8.0", "pytest-cov>=5.0", "ruff>=0.5", "pyright>=1.1.370", # Test-data generation only. petromcp itself never writes DLIS. "dliswriter>=1.2,<2", # `tomllib` is stdlib from 3.11; the release scripts need a reader on 3.10. "tomli>=2.0; python_version < '3.11'", ] [tool.ruff] line-length = 100 # The *floor* from requires-python, not the development version. Targeting 3.12 # here made ruff suggest (and auto-fix to) 3.11+ syntax such as `datetime.UTC`, # which breaks 3.10 — leaving the CI matrix as the only thing standing between # an autofix and a broken release. target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "B", "UP", "N", "SIM"] [tool.pyright] include = ["src", "tests"] # Same reasoning as ruff's target-version: check against the oldest supported # interpreter, or 3.11+ APIs pass review and fail for users on 3.10. pythonVersion = "3.10" typeCheckingMode = "basic" reportMissingTypeStubs = false [tool.pytest.ini_options] addopts = "-ra -q" testpaths = ["tests"] pythonpath = [".", "src"]