[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"
[project]
name = "langsmith-mcp-server"
version = "0.1.1"
description = "MCP server for Langsmith SDK integration"
license = "MIT"
readme = "README.md"
authors = [
{ name = "Marco Perini", email = "oss@langchain.dev" }
]
requires-python = ">=3.11"
dependencies = [
"fastmcp==3.0.2",
"langsmith>=0.4.42",
"langchain-core>=1.2.5",
"uvicorn>=0.34.0"
]
[project.scripts]
langsmith-mcp-server = "langsmith_mcp_server.server:main"
[dependency-groups]
test = [
"pytest>=8.0.0",
"ruff>=0.9.4",
"mypy>=1.8.0",
"pytest-socket>=0.7.0",
"pytest-asyncio>=0.26.0",
"types-setuptools>=69.0.0",
"websockets>=15.0.1",
"pytest-timeout>=2.4.0"
]
[project.urls]
"Homepage" = "https://github.com/langchain-ai/langsmith-mcp-server"
"Bug Tracker" = "https://github.com/langchain-ai/langsmith-mcp-server/issues"
[tool.pytest.ini_options]
minversion = "8.0"
# -ra: Report all extra test outcomes (passed, skipped, failed, etc.)
# -q: Enable quiet mode for less cluttered output
# -v: Enable verbose output to display detailed test names and statuses
# --durations=5: Show the 10 slowest tests after the run (useful for performance tuning)
addopts = "-ra -q -v --durations=5"
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
[tool.ruff]
line-length = 100
target-version = "py310"
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"B", # flake8-bugbear
]
ignore = [
"E501", # line-length
]
[tool.uv]
constraint-dependencies = [
# CVE-2025-62727: starlette <= 0.49.0 DoS via Range header merging in FileResponse
"starlette>=0.49.1",
# CVE-2025-66418, CVE-2025-66471, CVE-2026-21441: urllib3 decompression and redirect vulnerabilities
"urllib3>=2.6.3",
# CVE-2026-24486: python-multipart arbitrary file write via non-default configuration
"python-multipart>=0.0.22",
# CVE-2026-26007: cryptography subgroup attack via missing SECT curve validation
"cryptography>=46.0.5",
]
[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
check_untyped_defs = true