[project]
name = "playwright-proxy-mcp"
version = "0.1.0"
description = "A proxy MCP server for Microsoft's playwright-mcp with efficient binary blob storage"
readme = "README.md"
requires-python = ">=3.10"
license = { text = "MIT" }
authors = [
{ name = "Your Name", email = "your.email@example.com" }
]
keywords = ["mcp", "model-context-protocol", "claude", "ai", "server", "playwright", "browser-automation", "proxy"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
]
dependencies = [
"fastmcp>=2.10.3",
"python-dotenv>=1.0.0",
"mcp-mapped-resource-lib>=0.1.0",
"jmespath>=1.0.0",
"pyyaml>=6.0.0",
"aria-snapshot-parser",
"mistune>=3.2.0",
"leasedkeyq>=0.0.7",
]
[tool.uv.sources]
aria-snapshot-parser = { path = "src/aria_snapshot_parser", editable = true }
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"pytest-asyncio>=0.21.0",
"pytest-httpserver>=1.0.0",
"responses>=0.23.0",
"ruff>=0.1.0",
"playwright>=1.40.0",
]
[project.scripts]
playwright-proxy-mcp = "playwright_proxy_mcp.server:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[dependency-groups]
dev = [
"pytest-asyncio>=1.3.0",
]
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["src/playwright_proxy_mcp"]
[tool.hatch.build.targets.wheel.force-include]
"src/playwright_proxy_mcp/playwright/stealth.js" = "playwright_proxy_mcp/playwright/stealth.js"
[tool.ruff]
line-length = 100
target-version = "py310"
exclude = [
"*/generated/*",
"**/generated/**",
"src/aria_snapshot_parser/src/aria_snapshot_parser/generated/**",
]
[tool.ruff.lint]
select = ["E", "F", "I", "W", "N"]
ignore = ["E501"]
[tool.ruff.lint.per-file-ignores]
"**/aria_snapshot_parser/parser.py" = ["N802", "N803"]
"**/server.py" = ["N803"]
[tool.pyright]
pythonVersion = "3.10"
include = ["src/playwright_proxy_mcp"]
exclude = [
"**/generated/**",
"**/__pycache__",
"**/node_modules",
"**/.venv",
]
typeCheckingMode = "standard"
reportMissingImports = true
reportMissingTypeStubs = false
reportReturnType = "error"
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
markers = [
"integration: marks tests as integration tests (requires running browser)",
"slow: marks tests as slow running (deselect with '-m \"not slow\"')",
]
filterwarnings = [
# Suppress benign asyncio subprocess cleanup warning
# This occurs when event loop closes before subprocess transport cleanup completes
# See: https://github.com/pytest-dev/pytest/issues/11706
"ignore::pytest.PytestUnraisableExceptionWarning",
]