[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "networkx-mcp-server" version = "3.1.0" description = "NetworkX MCP Server - Graph analysis in your AI conversations" readme = "README.md" license = {text = "MIT"} keywords = ["networkx", "graph", "analysis", "mcp", "ai", "claude", "visualization", "network", "centrality", "community", "workflow"] authors = [{name = "Bright Liu", email = "brightliu@college.harvard.edu"}] maintainers = [{name = "Bright Liu", email = "brightliu@college.harvard.edu"}] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Information Analysis", "Topic :: Scientific/Engineering :: Visualization", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Environment :: Console", "Operating System :: OS Independent", ] requires-python = ">=3.11" dependencies = [ "networkx>=3.0", "numpy>=1.21.0", # Required for NetworkX and core algorithms "matplotlib>=3.5.0", # Required for graph visualization "requests>=2.28.0", # For API calls to CrossRef, ORCID, etc. "bibtexparser>=1.4.0,<2.0", # For BibTeX parsing and generation (v2 has incompatible API) "psutil>=5.9.0", # For memory monitoring in graph cache and health checks ] [project.optional-dependencies] # Development dependencies dev = [ "pytest>=7.0.0", "pytest-asyncio>=0.24.0", "pytest-cov>=4.0.0", # For coverage testing "pytest-benchmark>=4.0.0", # For performance benchmarking "coverage>=7.0.0", # For coverage reporting "ruff==0.12.10", # Pinned to match .pre-commit-config.yaml "mypy>=1.13.0", # Type checking "bandit>=1.8.0", # Security scanning "pre-commit>=4.0.0", # Git hooks "uv>=0.5.0", # Fast package manager "pytest-timeout>=2.0.0", # For --timeout in pytest addopts "hypothesis>=6.0.0", # For property-based testing "types-requests>=2.28.0", # Type stubs for requests "scipy>=1.7.0", # Required by NetworkX for pagerank + Kamada-Kawai layout ] [project.urls] Homepage = "https://github.com/Bright-L01/networkx-mcp-server" Repository = "https://github.com/Bright-L01/networkx-mcp-server" Issues = "https://github.com/Bright-L01/networkx-mcp-server/issues" [project.scripts] networkx-mcp = "networkx_mcp.server:main" # NetworkX MCP Server [tool.setuptools.packages.find] where = ["src"] include = ["networkx_mcp*"] [tool.ruff] line-length = 88 target-version = "py311" [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort ] ignore = ["E501", "E402", "I001"] # line too long, module level import not at top, import block sorting (varies by ruff version) [tool.pytest.ini_options] minversion = "7.0" addopts = [ "--strict-markers", "--strict-config", "--tb=short", "-v", "--timeout=300", "--timeout-method=thread", ] testpaths = ["tests/working"] python_files = "test_*.py" python_classes = "Test*" python_functions = "test_*" asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "session" markers = [ "unit: Unit tests", "integration: Integration tests", "performance: Performance tests (may be slow)", ] filterwarnings = [ "ignore::DeprecationWarning:networkx.*", "ignore::PendingDeprecationWarning", "error::UserWarning:networkx_mcp.*", ] log_cli = true log_cli_level = "INFO" log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s" log_cli_date_format = "%Y-%m-%d %H:%M:%S" [tool.mypy] python_version = "3.11" # Temporarily disable strict mode to get CI passing strict = false # Keep basic type checking check_untyped_defs = true warn_return_any = false # Too many false positives warn_unused_configs = true # Relax function annotation requirements disallow_untyped_defs = false disallow_incomplete_defs = false disallow_untyped_decorators = false # Keep some safety checks no_implicit_optional = true warn_redundant_casts = false # Too noisy warn_unused_ignores = false # Will have many temporary ignores warn_no_return = true warn_unreachable = false # Too many false positives strict_equality = false # Causes issues with isinstance checks # Allow missing imports for now ignore_missing_imports = true mypy_path = "src" namespace_packages = true explicit_package_bases = true # Per-module options for gradual typing [[tool.mypy.overrides]] module = [ "networkx.*", "matplotlib.*", "bibtexparser.*", "psutil.*", ] ignore_missing_imports = true