[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "relace-mcp"
version = "0.2.5a2"
description = "Unofficial Relace MCP Server - Fast code merging via Relace API"
readme = "README.md"
license = { text = "MIT" }
authors = [{ name = "possible055" }]
requires-python = ">=3.11"
keywords = ["relace", "instant-apply", "model-context-protocol", "mcp-server"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries :: Python Modules",
"Framework :: FastAPI",
"Environment :: Plugins",
]
dependencies = [
"charset-normalizer>=3.0.0",
"fastmcp>=2.0.0,<3",
"httpx>=0.28.0",
"openai>=1.0.0",
"pathspec>=0.12.0",
"pydantic>=2.0.0,<3",
"platformdirs>=4.0.0",
"psutil>=5.9.0",
"python-dotenv>=1.0.0",
"PyYAML>=6.0.0",
"tenacity>=8.0.0",
]
[project.urls]
Repository = "https://github.com/possible055/relace-mcp"
Documentation = "https://github.com/possible055/relace-mcp#readme"
Issues = "https://github.com/possible055/relace-mcp/issues"
[project.optional-dependencies]
pyright = ["basedpyright>=1.20.0"]
dev = [
"ty>=0.0.17",
"pytest>=8.4.1",
"pytest-asyncio>=1.3.0",
"pytest-cov>=6.0.0",
"pre-commit>=4.5.1",
"mypy>=1.19.1",
"interrogate>=1.7.0",
"dead>=1.5.2",
"ruff>=0.1.0",
"build>=1.0.0",
"types-PyYAML>=6.0.0",
"bandit[toml]>=1.9.0",
]
tools = ["textual>=0.50.0"]
benchmark = [
"click>=8.0.0",
"rich>=13.0.0",
"tree-sitter>=0.24.0",
"tree-sitter-python>=0.24.0",
]
[project.scripts]
relace-mcp = "relace_mcp.server:main"
relogs = "relace_dashboard:main"
[tool.setuptools]
include-package-data = true
[tool.setuptools.package-data]
relace_mcp = ["**/*.yaml"]
relace_dashboard = ["*.tcss"]
[tool.setuptools.packages.find]
where = ["src"]
include = ["relace_mcp*", "relace_dashboard*"]
exclude = ["tests*"]
[tool.bandit]
exclude_dirs = ["tests"]
[tool.mypy]
python_version = "3.11"
strict = true
disallow_untyped_calls = false
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = ["psutil"]
follow_untyped_imports = true
[[tool.mypy.overrides]]
module = ["textual.*"]
ignore_missing_imports = true
follow_untyped_imports = true
[[tool.mypy.overrides]]
module = ["relace_dashboard.*"]
disable_error_code = ["misc"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
[tool.interrogate]
ignore-init-method = true
ignore-init-module = true
ignore-module = true
ignore-private = true
ignore-nested-functions = true
fail-under = 80
exclude = ["tests", "build"]
verbose = 1
[tool.ty]
[tool.ty.environment]
python-version = "3.11"
root = ["src"]
[tool.ty.rules]
# Let mypy own general type soundness; ty only checks unresolved imports
unresolved-import = "warn"
[tool.ty.src]
exclude = ["src/relace_dashboard/**", "benchmark/**"]
[[tool.ty.overrides]]
include = ["src/relace_dashboard/**"]
[tool.ty.overrides.analysis]
# textual is an optional dependency, not installed in main venv
allowed-unresolved-imports = ["textual.**"]
[[tool.ty.overrides]]
include = ["tests/**"]
[tool.ty.overrides.rules]
# Tests legitimately monkeypatch module attrs and use type: ignore for mypy
invalid-assignment = "ignore"
unused-type-ignore-comment = "ignore"
invalid-argument-type = "ignore"