[project] name = "mq-sentinel" version = "0.3.0" description = "MQ-Sentinel — production-grade, read-only IBM MQ diagnostic MCP server for AI agents. Zero hallucinations. Built for trust in enterprise environments." readme = "README.md" requires-python = ">=3.12" license = { text = "Proprietary" } authors = [{ name = "Pramod Boddu" }] keywords = ["ibm-mq", "mcp", "diagnostics", "observability", "enterprise"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: System Administrators", "Programming Language :: Python :: 3.12", "Topic :: System :: Monitoring", "License :: Other/Proprietary License", ] dependencies = [ "mcp>=1.2.0", "pydantic>=2.8", "pydantic-settings>=2.4", "authlib>=1.3", "httpx>=0.27", "starlette>=0.38", "uvicorn>=0.30", "structlog>=24.4", "opentelemetry-api>=1.27", "opentelemetry-sdk>=1.27", "opentelemetry-exporter-otlp>=1.27", "prometheus-client>=0.20", "orjson>=3.10", "typer>=0.12", ] [project.optional-dependencies] mq = [ # pymqi requires IBM MQ client libs installed on the host. # Kept optional so the skeleton builds in environments without MQ. "pymqi>=1.12", ] dev = [ "pytest>=8.3", "pytest-cov>=5.0", "pytest-asyncio>=0.24", "hypothesis>=6.112", "ruff>=0.6", "mypy>=1.11", "pip-audit>=2.7", "cyclonedx-bom>=4.5", ] [project.scripts] mq-sentinel = "mq_sentinel.cli.main:app" [build-system] requires = ["hatchling>=1.25"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mq_sentinel"] [tool.ruff] line-length = 100 target-version = "py312" src = ["src", "tests"] [tool.ruff.lint] select = [ "E", "F", "W", "I", "N", "UP", "B", "A", "C4", "SIM", "TID", "S", # bandit-style security "BLE", # blind-except "DTZ", # datetime tz "RET", "RUF", ] ignore = ["S101"] # assert allowed in tests [tool.ruff.lint.per-file-ignores] "tests/**" = ["S", "D"] [tool.mypy] python_version = "3.12" strict = true warn_unreachable = true disallow_untyped_defs = true disallow_any_unimported = true no_implicit_optional = true show_error_codes = true files = ["src"] [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] addopts = "-ra --strict-markers --strict-config --cov=mq_sentinel --cov-report=term-missing" asyncio_mode = "auto" markers = [ "security: security-focused tests (injection, allowlist, sanitizer)", "integration: tests that require fixtures or external systems", ] [tool.coverage.run] branch = true source = ["mq_sentinel"] [tool.coverage.report] fail_under = 60 show_missing = true skip_covered = false