[project] name = "tracehub-mcp" version = "0.11.0" description = "MCP server for querying OpenTelemetry traces across multiple observability backends (Jaeger, Tempo, Traceloop, Datadog, and more) for LLM application debugging" authors = [ {name = "Doron Kopit", email = "doron@traceloop.com"}, {name = "Gal Klienman", email = "gal@traceloop.com"}, {name = "Nir Gazit", email = "nir@traceloop.com"}, {name = "sairam0424", email = "uggesairam0000@gmail.com"} ] readme = "README.md" license = {text = "Apache-2.0"} requires-python = ">=3.11" keywords = [ "mcp", "opentelemetry", "observability", "tracing", "llm", "model-context-protocol", "debugging", "telemetry", "jaeger", "tempo", "traceloop", "datadog", "aws-xray" ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: System :: Monitoring", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Framework :: FastAPI", ] dependencies = [ "mcp>=2.0,<3", "fastmcp>=4.0.5,<4.1", # Pinned directly (not just transitive via mcp/fastmcp/httpx/starlette) to # close CVE-2026-63374 (TLS cert-validation bypass via IDNA2003 hostname # encoding) and CVE-2026-64847 (process-pool stderr-pipe DoS), both fixed # in 4.14.2 - anyio has no entry in this project's own dependencies, so # pip-audit flagging it was otherwise invisible to Dependabot (which only # tracks direct + lockfile-pinned versions, not "whatever the resolver # happens to pick" for a transitive dep with no floor here). "anyio>=4.14.2", "pydantic>=2.12,<2.14", "httpx~=0.28.0", "python-dotenv~=1.2.2", "click>=8.3,<8.6", "uvicorn>=0.40,<0.54", "opentelemetry-semantic-conventions-ai>=0.4.13", "opentelemetry-semantic-conventions>=0.60b0", "tenacity>=9.1,<10", "opentelemetry-sdk>=1.30,<2", "opentelemetry-exporter-otlp-proto-http>=1.30,<2", "boto3>=1.40,<2", ] [project.urls] Homepage = "https://github.com/mcpsmiths/tracehub-mcp" Documentation = "https://github.com/mcpsmiths/tracehub-mcp#readme" Repository = "https://github.com/mcpsmiths/tracehub-mcp" Issues = "https://github.com/mcpsmiths/tracehub-mcp/issues" Changelog = "https://github.com/mcpsmiths/tracehub-mcp/blob/main/CHANGELOG.md" [project.scripts] tracehub-mcp = "opentelemetry_mcp.server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/opentelemetry_mcp"] [tool.uv] [dependency-groups] dev = [ "pytest>=9.0.3,<9.2.0", "pytest-asyncio>=1.3,<1.5", "pytest-cov>=7.0,<7.2", "pytest-recording~=0.13.0", "mypy>=1.19,<2.4", "ruff>=0.15,<0.17", "types-click~=7.1.8", "types-boto3[xray]>=1.40,<2", "pip-audit>=2.10.1,<3", "hypothesis>=6.160,<7", ] [tool.ruff] line-length = 100 target-version = "py313" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP", "S"] ignore = ["E501"] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["S101", "S105", "S106", "S108", "S110"] "scripts/**/*.py" = ["S311"] [tool.ruff.lint.isort] known-first-party = ["opentelemetry_mcp"] [tool.mypy] python_version = "3.13" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true ignore_missing_imports = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py"] python_functions = ["test_*"] addopts = "--cov=opentelemetry_mcp --cov-report=term-missing" markers = [ "unit: Fast unit tests with mocks", "integration: Integration tests with real backends using VCR recordings", "vcr: Tests using VCR cassette recordings", ]