pyproject.toml7.25 kB
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "mcp_server"
description = "MCP Server"
readme = "README.md"
authors = [
{ name = "ag2ai", email = "support@ag2.ai" },
]
keywords = ["ag2", "mcp", "multi-agent", "LLM", "AI", "autonomous agents"]
requires-python = ">=3.9"
classifiers = [
"Development Status :: 4 - Beta",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Operating System :: OS Independent",
"Topic :: Internet",
"Topic :: Software Development :: Libraries :: Application Frameworks",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Software Development :: Libraries",
"Topic :: Software Development",
"Typing :: Typed",
"Intended Audience :: Developers",
"Intended Audience :: Information Technology",
"Intended Audience :: System Administrators",
"Environment :: Web Environment",
"Framework :: AsyncIO",
"Framework :: Pydantic",
"Framework :: Pydantic :: 2",
]
dynamic = ["version"]
dependencies = [
"ag2[openai,mcp,mcp-proxy-gen]>=0.9.4",
"pydantic[email]",
# TODO: Check if this is needed
"fastapi",
]
[project.optional-dependencies]
# public distributions
server = [
"uvicorn>=0.31.0",
"gunicorn>=23.0.0 ; platform_system != 'Windows'",
"waitress>=3.0.0 ; platform_system == 'Windows'",
]
submodules = [
"mcp-server[server]"
]
# dev dependencies
lint = [
"types-PyYAML",
"types-setuptools",
"types-ujson",
"types-Pygments",
"types-docutils",
"mypy==1.15.0",
"ruff==0.11.6",
# "pyupgrade-directories==0.3.0",
"bandit==1.8.3",
# Semgrep is downgraded to 1.79.0 to avoid dependency conflicts
"semgrep>=1.79.0",
"codespell==2.4.1",
"pytest-mypy-plugins==3.2.0",
]
test-core = [
"coverage[toml]==7.8.0",
"pytest==8.3.5",
"pytest-asyncio==0.26.0",
"pytest-rerunfailures==15.0",
"httpx",
]
testing = [
"mcp-server[submodules]",
"mcp-server[test-core]",
"mcp-server[server]", # Uvicorn is needed for testing
]
dev = [
"mcp-server[submodules,lint,testing]",
"pre-commit==4.2.0",
"detect-secrets==1.5.0",
]
[project.urls]
Homepage = "https://mcp.ag2.ai/"
Documentation = "https://mcp.ag2.ai/"
Tracker = "https://mcp.ag2.ai/"
Source = "https://github.com/ag2-mcp-servers"
[tool.hatch.version]
path = "mcp_server/__about__.py"
[tool.hatch.build]
skip-excluded-dirs = true
exclude = [
"/tests",
"/docs",
]
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
only-include = ["mcp_server"]
[tool.hatch.build.targets.wheel.sources]
# "src" = ""
# "scripts" = "mcp_server/scripts"
[tool.mypy]
files = ["mcp_server", "tests"]
strict = true
python_version = "3.12"
ignore_missing_imports = true
install_types = true
non_interactive = true
plugins = [
"pydantic.mypy",
]
# from https://blog.wolt.com/engineering/2021/09/30/professional-grade-mypy-configuration/
disallow_untyped_defs = true
no_implicit_optional = true
check_untyped_defs = true
warn_return_any = true
show_error_codes = true
warn_unused_ignores = false
disallow_incomplete_defs = true
disallow_untyped_decorators = true
disallow_any_unimported = false
[tool.ruff]
fix = true
line-length = 88
# target-version = 'py39'
include = ["mcp_server/**/*.py", "mcp_server/**/*.pyi", "tests/**/*.py", "pyproject.toml"]
exclude = ["docs/docs_src", "tests/openapi/security/expected_*.py"]
[tool.ruff.lint]
select = [
"E", # pycodestyle errors https://docs.astral.sh/ruff/rules/#error-e
"W", # pycodestyle warnings https://docs.astral.sh/ruff/rules/#warning-w
"C90", # mccabe https://docs.astral.sh/ruff/rules/#mccabe-c90
"N", # pep8-naming https://docs.astral.sh/ruff/rules/#pep8-naming-n
"D", # pydocstyle https://docs.astral.sh/ruff/rules/#pydocstyle-d
"I", # isort https://docs.astral.sh/ruff/rules/#isort-i
"F", # pyflakes https://docs.astral.sh/ruff/rules/#pyflakes-f
"ASYNC", # flake8-async https://docs.astral.sh/ruff/rules/#flake8-async-async
"C4", # flake8-comprehensions https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4
"B", # flake8-bugbear https://docs.astral.sh/ruff/rules/#flake8-bugbear-b
"Q", # flake8-quotes https://docs.astral.sh/ruff/rules/#flake8-quotes-q
"T20", # flake8-print https://docs.astral.sh/ruff/rules/#flake8-print-t20
"SIM", # flake8-simplify https://docs.astral.sh/ruff/rules/#flake8-simplify-sim
"PT", # flake8-pytest-style https://docs.astral.sh/ruff/rules/#flake8-pytest-style-pt
"PTH", # flake8-use-pathlib https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth
"TCH", # flake8-type-checking https://docs.astral.sh/ruff/rules/#flake8-type-checking-tch
"RUF", # Ruff-specific rules https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf
"PERF", # Perflint https://docs.astral.sh/ruff/rules/#perflint-perf
]
ignore = [
"E501", # line too long, handled by formatter later
"D100", "D101", "D102", "D103", "D104", "D415",
"F403", "TC003",
]
[tool.ruff.lint.isort]
case-sensitive = true
[tool.ruff.format]
docstring-code-format = true
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.lint.flake8-bugbear]
[tool.pytest.ini_options]
minversion = "7.0"
addopts = "-q -m 'not slow'"
testpaths = [
"tests",
]
markers = [
"slow",
"all",
"anthropic",
"azure_oai",
"openai",
"togetherai",
"llm: mark test for use with LLMs",
"flaky: mark test as flaky",
]
# Add filterwarnings to suppress the specific UserWarning
filterwarnings = "ignore:.*custom validator is returning a value other than `self`.*:UserWarning"
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
[tool.coverage.run]
parallel = true
branch = true
concurrency = [
"multiprocessing",
"thread"
]
source = [
"ag2_backend",
# "tests",
]
context = '${CONTEXT}'
omit = [
"**/__init__.py",
]
[tool.coverage.report]
show_missing = true
skip_empty = true
sort = "miss"
exclude_also = [
"if __name__ == .__main__.:",
"self.logger",
"def __repr__",
"lambda: None",
"from .*",
"import .*",
'@(abc\.)?abstractmethod',
"raise NotImplementedError",
'raise AssertionError',
'logger\..*',
"pass",
'\.\.\.',
]
omit = [
'*/__about__.py',
'*/__main__.py',
'*/__init__.py',
]
[tool.bandit]
[tool.black]
line-length = 88
extend-exclude = """
/(
docs/docs_src
| some_other_dir
)/
"""
[tool.codespell]
skip = "./venv*,./docs/site/*,./htmlcov,./examples/openapi/whatsapp_openapi_complete.json"
ignore-words = ".codespell-whitelist.txt"