[build-system] requires = ["setuptools>=77", "wheel"] build-backend = "setuptools.build_meta" [project] name = "reversecore-mcp" version = "3.0.4" description = "A security-first MCP server that empowers AI agents to perform automated reverse engineering, malware analysis, forensics, vulnerability research, and SAST — powered by Radare2, YARA, LIEF, Capstone, and more." readme = {file = "PYPI_README.md", content-type = "text/markdown"} requires-python = ">=3.10" license = "MIT" license-files = ["LICENSE"] authors = [ {name = "Kim Seongju"}, ] keywords = [ "mcp", "model-context-protocol", "reverse-engineering", "malware-analysis", "digital-forensics", "vulnerability-research", "radare2", "yara", ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Security", "Typing :: Typed", ] dependencies = [ # Core MCP server dependencies "mcp[cli]>=1.28.1", "fastmcp==3.4.4", "fastapi>=0.100.0", "uvicorn>=0.30.0", "python-multipart>=0.0.27", "aiofiles>=24.0.0", "aiofile<=3.9.0", "pydantic>=2.13.0", "pydantic-settings>=2.0.0", "loguru>=0.7.0", "orjson>=3.11.9", # Core functionality dependencies "jinja2>=3.1.0", "async-lru>=2.0.0", "aiosqlite>=0.19.0", "aiosmtplib>=5.1.0", "python-dotenv>=1.2.2", "arq>=0.25.0", "redis>=5.0.0", "pillow>=12.3.0,<13", "markdown>=3.6.0", "xhtml2pdf>=0.2.16", "numpy<2.3.0", "contourpy<1.3.3", "pyxbe<=1.0.3", "pyxdia<=0.1.0", # Exploit generation tools "pwntools>=4.12.0", "ROPgadget>=7.3", ] [project.urls] Homepage = "https://github.com/sjkim1127/Reversecore_MCP" Documentation = "https://github.com/sjkim1127/Reversecore_MCP#readme" Repository = "https://github.com/sjkim1127/Reversecore_MCP.git" Issues = "https://github.com/sjkim1127/Reversecore_MCP/issues" Changelog = "https://github.com/sjkim1127/Reversecore_MCP/releases" [project.scripts] reversecore-mcp = "reversecore_mcp.server:main" [project.optional-dependencies] analysis = [ "pefile>=2023.0.0", "lief>=0.17.6", "capstone==5.0.6", # angr 9.2.213 requires this exact ABI-compatible release "keystone-engine>=0.9.2; sys_platform != 'darwin'", "yara-python>=4.5.4", "r2pipe>=1.9.8", # Security floors for transitive dependencies used by angr/vivisect. "gitpython>=3.1.60", "pyasn1>=0.6.4", "angr>=9.2.0,<=9.2.213", "flare-capa>=7.0.0", ] viz = [ "graphviz>=0.20.0", "networkx>=3.4.2,<3.5", "matplotlib>=3.8.0,<3.11", ] cli = [ "psutil>=5.9.0", "requests>=2.31.0", "typer>=0.25.1", "rich>=13.0.0", ] magic = [ "python-magic>=0.4.27", "python-magic-bin; sys_platform == 'win32'", ] http = [ "slowapi>=0.1.9", ] emulation = [ # Qiling 1.4.6 pulls python-fx, which constrains Pillow below 11. # Reversecore generates Qiling/AFL harnesses without importing Qiling at # server runtime; execute generated harnesses in a separate sandbox. "python-afl>=0.7.3", ] forensics = [ "volatility3>=2.4.0", "scapy>=2.5.0", ] full = [ "reversecore-mcp[analysis,viz,cli,magic,http,emulation,forensics]", ] dev = [ "pytest>=9.0.3", "pytest-cov>=7.1.0", "pytest-asyncio>=0.21.0", "hypothesis>=6.90.0", "pytest-timeout>=2.2.0", "pytest-benchmark>=4.0.0", "pytest-html>=4.1.0", "black>=26.3.1", "ruff>=0.1.0", "mypy>=2.1.0", "types-requests>=2.31.0", "mkdocs>=1.5.0", "mkdocs-material>=9.7.7", "mkdocstrings[python]>=1.0.4", "mkdocs-git-revision-date-localized-plugin>=1.5.2", "pip-tools>=7.4.0", ] [tool.setuptools] include-package-data = true [tool.setuptools.packages.find] where = ["."] include = ["reversecore_mcp*"] [tool.setuptools.package-data] reversecore_mcp = ["py.typed"] [tool.ruff] target-version = "py310" line-length = 100 exclude = [ ".git", ".venv", "__pycache__", "htmlcov", ".pytest_cache", ] [tool.ruff.lint] select = [ "E", "W", "F", "I", "B", "C4", "UP", ] ignore = [ "E501", "B008", "B904", ] [tool.ruff.lint.isort] known-first-party = ["reversecore_mcp"] [tool.mypy] python_version = "3.10" warn_return_any = true warn_unused_configs = true warn_unreachable = true warn_redundant_casts = true ignore_missing_imports = true no_implicit_optional = true check_untyped_defs = true disallow_untyped_defs = false [tool.bandit] exclude_dirs = ["tests", "htmlcov", ".venv"] skips = ["B101", "B108", "B110", "B324"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-v --strict-markers --tb=short --timeout=120" markers = [ "unit: Unit tests", "integration: Integration tests", "slow: Slow running tests", ] [tool.coverage.run] source = ["reversecore_mcp"] omit = ["tests/*", "*/__pycache__/*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise NotImplementedError", "if TYPE_CHECKING:", ]