[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "odoo-mcp-gateway" version = "0.3.3" description = "Security-first, version-agnostic MCP gateway for Odoo 17/18/19 — works with stock and custom modules via YAML configuration" readme = "README.md" requires-python = ">=3.10" license = "MIT" authors = [ { name = "parth-unjiya", email = "parthunjia@gmail.com" }, ] keywords = ["odoo", "mcp", "gateway", "erp", "ai"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries", ] dependencies = [ "mcp>=1.9.4", "httpx>=0.25.0", "pydantic>=2.0", "pydantic-settings>=2.0", "python-dotenv>=1.0", "pyyaml>=6.0", "defusedxml>=0.7.1", "packaging>=23.0", ] [project.urls] Homepage = "https://github.com/parth-unjiya/odoo-mcp-gateway" Repository = "https://github.com/parth-unjiya/odoo-mcp-gateway" Issues = "https://github.com/parth-unjiya/odoo-mcp-gateway/issues" [project.scripts] odoo-mcp-gateway = "odoo_mcp_gateway.__main__:main" odoo-mcp-tools = "odoo_mcp_gateway.cli.tools:main" [project.optional-dependencies] dev = [ "pytest>=7.0", "pytest-asyncio>=0.23", "pytest-cov>=4.0", "ruff>=0.4", "mypy>=1.0", "types-pyyaml>=6.0", "types-defusedxml>=0.7", ] # Observability stack — optional. Install with # ``pip install odoo-mcp-gateway[observability]`` to enable # Prometheus /metrics, structured JSON logs via structlog, and the # baseline OpenTelemetry API (full tracing exporter wiring lands in # Sprint 5). Without this extra the gateway logs via stdlib logging # and the /metrics route is omitted. # v0.3.3 LOW-1: extras carry upper-bound version caps so a major # release of an upstream library (e.g. structlog 26) cannot silently # break a deployment that pinned only ``odoo-mcp-gateway``. Runtime # dependencies (mcp, httpx, pydantic) remain open-ended because we # rely on them for wire-protocol compatibility and capping them would # risk locking out fixes; we revisit each cap as upstreams ship. observability = [ "prometheus-client>=0.20,<1", "structlog>=24.1,<27", "opentelemetry-api>=1.25,<2", "opentelemetry-sdk>=1.25,<2", "opentelemetry-instrumentation-httpx>=0.46b0,<1", ] # OAuth 2.1 JWT bearer auth (ADR-005). Install with # ``pip install odoo-mcp-gateway[oauth]`` to enable IdP-issued JWT # validation against a real OAuth issuer (Keycloak, Auth0, Entra, # etc.). Without this extra the gateway falls back to its built-in # opaque-token verifier from Sprint 1. oauth = [ "authlib>=1.6,<2", ] [project.entry-points."odoo_mcp_gateway.plugins"] hr = "odoo_mcp_gateway.plugins.core.hr:HRPlugin" sales = "odoo_mcp_gateway.plugins.core.sales:SalesPlugin" project = "odoo_mcp_gateway.plugins.core.project:ProjectPlugin" helpdesk = "odoo_mcp_gateway.plugins.core.helpdesk:HelpdeskPlugin" [tool.hatch.build.targets.wheel] packages = ["src/odoo_mcp_gateway"] [tool.ruff] target-version = "py310" src = ["src"] [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "S", "B", "UP"] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["S101", "S105", "S106"] [tool.mypy] python_version = "3.10" strict = true [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto"