wavexis-mcp 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. wavexis_mcp-1.0.0/.github/ISSUE_TEMPLATE/bug_report.md +49 -0
  2. wavexis_mcp-1.0.0/.github/ISSUE_TEMPLATE/feature_request.md +48 -0
  3. wavexis_mcp-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
  4. wavexis_mcp-1.0.0/.github/workflows/ci.yml +54 -0
  5. wavexis_mcp-1.0.0/.github/workflows/docker.yml +51 -0
  6. wavexis_mcp-1.0.0/.github/workflows/release.yml +37 -0
  7. wavexis_mcp-1.0.0/.gitignore +39 -0
  8. wavexis_mcp-1.0.0/CHANGELOG.md +58 -0
  9. wavexis_mcp-1.0.0/CODE_OF_CONDUCT.md +131 -0
  10. wavexis_mcp-1.0.0/CONTRIBUTING.md +77 -0
  11. wavexis_mcp-1.0.0/Dockerfile +17 -0
  12. wavexis_mcp-1.0.0/LICENSE +21 -0
  13. wavexis_mcp-1.0.0/PKG-INFO +285 -0
  14. wavexis_mcp-1.0.0/README.md +243 -0
  15. wavexis_mcp-1.0.0/SECURITY.md +31 -0
  16. wavexis_mcp-1.0.0/docker-compose.yml +7 -0
  17. wavexis_mcp-1.0.0/docs/configuration.md +97 -0
  18. wavexis_mcp-1.0.0/docs/docker.md +68 -0
  19. wavexis_mcp-1.0.0/docs/examples/multi-action.md +56 -0
  20. wavexis_mcp-1.0.0/docs/examples/scrape.md +43 -0
  21. wavexis_mcp-1.0.0/docs/examples/screenshot.md +38 -0
  22. wavexis_mcp-1.0.0/docs/examples/testing.md +48 -0
  23. wavexis_mcp-1.0.0/docs/http-transport.md +72 -0
  24. wavexis_mcp-1.0.0/docs/index.md +35 -0
  25. wavexis_mcp-1.0.0/docs/quickstart.md +79 -0
  26. wavexis_mcp-1.0.0/docs/rate-limiting.md +75 -0
  27. wavexis_mcp-1.0.0/docs/resources-prompts.md +86 -0
  28. wavexis_mcp-1.0.0/docs/tools/a11y.md +9 -0
  29. wavexis_mcp-1.0.0/docs/tools/core.md +94 -0
  30. wavexis_mcp-1.0.0/docs/tools/data.md +12 -0
  31. wavexis_mcp-1.0.0/docs/tools/devtools.md +65 -0
  32. wavexis_mcp-1.0.0/docs/tools/emulation.md +15 -0
  33. wavexis_mcp-1.0.0/docs/tools/experimental.md +58 -0
  34. wavexis_mcp-1.0.0/docs/tools/interactions.md +11 -0
  35. wavexis_mcp-1.0.0/docs/tools/network.md +15 -0
  36. wavexis_mcp-1.0.0/docs/tools/storage.md +20 -0
  37. wavexis_mcp-1.0.0/docs/tools/testing.md +10 -0
  38. wavexis_mcp-1.0.0/docs/tools/video.md +10 -0
  39. wavexis_mcp-1.0.0/docs/tools/vision.md +13 -0
  40. wavexis_mcp-1.0.0/docs/tools/workflows.md +11 -0
  41. wavexis_mcp-1.0.0/mkdocs.yml +64 -0
  42. wavexis_mcp-1.0.0/pyproject.toml +83 -0
  43. wavexis_mcp-1.0.0/src/wavexis_mcp/__init__.py +3 -0
  44. wavexis_mcp-1.0.0/src/wavexis_mcp/act.py +316 -0
  45. wavexis_mcp-1.0.0/src/wavexis_mcp/caps.py +108 -0
  46. wavexis_mcp-1.0.0/src/wavexis_mcp/convenience.py +32 -0
  47. wavexis_mcp-1.0.0/src/wavexis_mcp/errors.py +111 -0
  48. wavexis_mcp-1.0.0/src/wavexis_mcp/formatter.py +79 -0
  49. wavexis_mcp-1.0.0/src/wavexis_mcp/models.py +1363 -0
  50. wavexis_mcp-1.0.0/src/wavexis_mcp/prompts.py +106 -0
  51. wavexis_mcp-1.0.0/src/wavexis_mcp/rate_limiter.py +150 -0
  52. wavexis_mcp-1.0.0/src/wavexis_mcp/resources.py +62 -0
  53. wavexis_mcp-1.0.0/src/wavexis_mcp/server.py +401 -0
  54. wavexis_mcp-1.0.0/src/wavexis_mcp/session.py +282 -0
  55. wavexis_mcp-1.0.0/src/wavexis_mcp/streaming.py +130 -0
  56. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/__init__.py +6 -0
  57. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/a11y.py +225 -0
  58. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/capture.py +270 -0
  59. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/cookies.py +155 -0
  60. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/data.py +411 -0
  61. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/devtools.py +766 -0
  62. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/dom.py +265 -0
  63. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/emulation.py +261 -0
  64. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/experimental.py +558 -0
  65. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/input.py +397 -0
  66. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/interactions.py +164 -0
  67. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/javascript.py +60 -0
  68. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/navigation.py +178 -0
  69. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/network.py +405 -0
  70. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/session.py +101 -0
  71. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/storage.py +577 -0
  72. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/tabs.py +116 -0
  73. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/testing.py +203 -0
  74. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/utility.py +77 -0
  75. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/video.py +203 -0
  76. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/vision.py +237 -0
  77. wavexis_mcp-1.0.0/src/wavexis_mcp/tools/workflows.py +235 -0
  78. wavexis_mcp-1.0.0/tests/__init__.py +1 -0
  79. wavexis_mcp-1.0.0/tests/conftest.py +222 -0
  80. wavexis_mcp-1.0.0/tests/integration/__init__.py +1 -0
  81. wavexis_mcp-1.0.0/tests/integration/test_a11y_interactions_devtools.py +87 -0
  82. wavexis_mcp-1.0.0/tests/integration/test_act_workflow.py +130 -0
  83. wavexis_mcp-1.0.0/tests/integration/test_all_tiers.py +88 -0
  84. wavexis_mcp-1.0.0/tests/integration/test_caps_filtering.py +124 -0
  85. wavexis_mcp-1.0.0/tests/integration/test_core_workflow.py +84 -0
  86. wavexis_mcp-1.0.0/tests/integration/test_http_transport.py +67 -0
  87. wavexis_mcp-1.0.0/tests/integration/test_network_storage_emulation.py +104 -0
  88. wavexis_mcp-1.0.0/tests/integration/test_session_lifecycle.py +93 -0
  89. wavexis_mcp-1.0.0/tests/integration/test_stateless_mode.py +60 -0
  90. wavexis_mcp-1.0.0/tests/integration/test_vision_video_testing.py +130 -0
  91. wavexis_mcp-1.0.0/tests/integration/test_workflows_data_experimental.py +116 -0
  92. wavexis_mcp-1.0.0/tests/unit/__init__.py +1 -0
  93. wavexis_mcp-1.0.0/tests/unit/test_a11y.py +89 -0
  94. wavexis_mcp-1.0.0/tests/unit/test_act.py +201 -0
  95. wavexis_mcp-1.0.0/tests/unit/test_caps.py +37 -0
  96. wavexis_mcp-1.0.0/tests/unit/test_capture.py +103 -0
  97. wavexis_mcp-1.0.0/tests/unit/test_cookies.py +89 -0
  98. wavexis_mcp-1.0.0/tests/unit/test_data.py +158 -0
  99. wavexis_mcp-1.0.0/tests/unit/test_devtools.py +530 -0
  100. wavexis_mcp-1.0.0/tests/unit/test_dom.py +188 -0
  101. wavexis_mcp-1.0.0/tests/unit/test_emulation.py +209 -0
  102. wavexis_mcp-1.0.0/tests/unit/test_experimental.py +422 -0
  103. wavexis_mcp-1.0.0/tests/unit/test_formatter.py +42 -0
  104. wavexis_mcp-1.0.0/tests/unit/test_input.py +242 -0
  105. wavexis_mcp-1.0.0/tests/unit/test_interactions.py +135 -0
  106. wavexis_mcp-1.0.0/tests/unit/test_models.py +65 -0
  107. wavexis_mcp-1.0.0/tests/unit/test_navigation.py +127 -0
  108. wavexis_mcp-1.0.0/tests/unit/test_network.py +233 -0
  109. wavexis_mcp-1.0.0/tests/unit/test_prompts.py +121 -0
  110. wavexis_mcp-1.0.0/tests/unit/test_rate_limiter.py +106 -0
  111. wavexis_mcp-1.0.0/tests/unit/test_resources.py +150 -0
  112. wavexis_mcp-1.0.0/tests/unit/test_session.py +66 -0
  113. wavexis_mcp-1.0.0/tests/unit/test_storage.py +419 -0
  114. wavexis_mcp-1.0.0/tests/unit/test_tabs.py +83 -0
  115. wavexis_mcp-1.0.0/tests/unit/test_testing.py +172 -0
  116. wavexis_mcp-1.0.0/tests/unit/test_utility.py +46 -0
  117. wavexis_mcp-1.0.0/tests/unit/test_video.py +112 -0
  118. wavexis_mcp-1.0.0/tests/unit/test_vision.py +143 -0
  119. wavexis_mcp-1.0.0/tests/unit/test_workflows.py +128 -0
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report a bug in WaveXisMCP
4
+ title: "[BUG] "
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Describe the bug
10
+
11
+ A clear and concise description of what the bug is.
12
+
13
+ ## To reproduce
14
+
15
+ Steps to reproduce the behavior:
16
+
17
+ 1. Start the server with `wavexis-mcp --caps ...`
18
+ 2. Call tool `wavexis_...` with input `...`
19
+ 3. See error
20
+
21
+ ## Expected behavior
22
+
23
+ What you expected to happen.
24
+
25
+ ## Actual behavior
26
+
27
+ What actually happened (include error output, stack trace, or screenshot).
28
+
29
+ ## Environment
30
+
31
+ - OS: [e.g. Windows 11, macOS 14, Ubuntu 22.04]
32
+ - Python: [e.g. 3.12.1]
33
+ - wavexis-mcp: [e.g. 0.1.0]
34
+ - wavexis: [e.g. 2.3.0]
35
+ - Backend: [cdp / bidi]
36
+ - MCP client: [e.g. Claude Desktop, Cursor, Windsurf]
37
+
38
+ ## MCP client config
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "wavexis-mcp": {
44
+ "command": "wavexis-mcp",
45
+ "args": ["--caps", "core"]
46
+ }
47
+ }
48
+ }
49
+ ```
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: Feature request
3
+ about: Request a new tool or feature for WaveXisMCP
4
+ title: "[FEATURE] "
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Feature description
10
+
11
+ A clear and concise description of the feature or tool you'd like.
12
+
13
+ ## Use case
14
+
15
+ Why is this feature useful? What problem does it solve for LLM-driven browser automation?
16
+
17
+ ## Proposed API
18
+
19
+ ```python
20
+ class SomeInput(BaseModel):
21
+ field: str = Field(..., description="...")
22
+ ```
23
+
24
+ **Annotations**: `readOnlyHint: ...`, `destructiveHint: ...`, `idempotentHint: ...`, `openWorldHint: ...`
25
+
26
+ **Returns**: `{"status": "ok", ...}`
27
+
28
+ ## Tier
29
+
30
+ Which capability tier does this belong to?
31
+
32
+ - [ ] Core
33
+ - [ ] Network
34
+ - [ ] Storage
35
+ - [ ] Emulation
36
+ - [ ] A11y
37
+ - [ ] Interactions
38
+ - [ ] DevTools
39
+ - [ ] Vision
40
+ - [ ] Video
41
+ - [ ] Testing
42
+ - [ ] Workflows
43
+ - [ ] Data
44
+ - [ ] Experimental
45
+
46
+ ## Additional context
47
+
48
+ Any other context, references, or examples.
@@ -0,0 +1,29 @@
1
+ ## Summary
2
+
3
+ Brief description of the changes.
4
+
5
+ ## Type of change
6
+
7
+ - [ ] Bug fix
8
+ - [ ] New tool(s)
9
+ - [ ] New feature
10
+ - [ ] Breaking change
11
+ - [ ] Documentation
12
+ - [ ] Refactor / cleanup
13
+
14
+ ## Changes
15
+
16
+ - Added `wavexis_...` tool to `tools/...py`
17
+ - Updated `models.py` with `...Input` model
18
+ - Added tests in `tests/unit/test_...py`
19
+
20
+ ## Verification
21
+
22
+ - [ ] `ruff check .` passes
23
+ - [ ] `mypy src/wavexis_mcp/` passes
24
+ - [ ] `pytest tests/unit/ -v` passes
25
+ - [ ] Integration test passes (if applicable)
26
+
27
+ ## Related issues
28
+
29
+ Closes #...
@@ -0,0 +1,54 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint-and-test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.11", "3.12", "3.13"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install Chrome
25
+ run: |
26
+ wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg
27
+ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
28
+ sudo apt-get update
29
+ sudo apt-get install -y google-chrome-stable
30
+
31
+ - name: Install dependencies
32
+ run: |
33
+ python -m pip install --upgrade pip
34
+ pip install -e ".[dev]"
35
+
36
+ - name: Ruff check
37
+ run: ruff check .
38
+
39
+ - name: Mypy
40
+ run: mypy src/wavexis_mcp/
41
+
42
+ - name: Unit tests
43
+ run: pytest tests/unit/ -v --cov=wavexis_mcp --cov-report=xml
44
+
45
+ - name: Integration tests
46
+ run: pytest tests/integration/ -v -m integration
47
+ continue-on-error: true
48
+
49
+ - name: Upload coverage
50
+ uses: codecov/codecov-action@v4
51
+ if: matrix.python-version == '3.12'
52
+ with:
53
+ files: ./coverage.xml
54
+ fail_ci_if_error: false
@@ -0,0 +1,51 @@
1
+ name: Docker Build and Push
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+ packages: write
11
+
12
+ jobs:
13
+ docker:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install build tools
25
+ run: pip install build
26
+
27
+ - name: Build wheel
28
+ run: python -m build --wheel
29
+
30
+ - name: Set up Docker Buildx
31
+ uses: docker/setup-buildx-action@v3
32
+
33
+ - name: Log in to GHCR
34
+ uses: docker/login-action@v3
35
+ with:
36
+ registry: ghcr.io
37
+ username: ${{ github.actor }}
38
+ password: ${{ secrets.GITHUB_TOKEN }}
39
+
40
+ - name: Extract version from tag
41
+ id: version
42
+ run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
43
+
44
+ - name: Build and push
45
+ uses: docker/build-push-action@v5
46
+ with:
47
+ context: .
48
+ push: true
49
+ tags: |
50
+ ghcr.io/mathiaspaulenko/wavexis-mcp:latest
51
+ ghcr.io/mathiaspaulenko/wavexis-mcp:${{ steps.version.outputs.version }}
@@ -0,0 +1,37 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ id-token: write
9
+
10
+ jobs:
11
+ build-and-publish:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Set up Python
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install build tools
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ pip install build
26
+
27
+ - name: Build package
28
+ run: python -m build
29
+
30
+ - name: Publish to PyPI
31
+ uses: pypa/gh-action-pypi-publish@release/v1
32
+
33
+ - name: Create GitHub Release
34
+ uses: softprops/action-gh-release@v2
35
+ with:
36
+ generate_release_notes: true
37
+ files: dist/*
@@ -0,0 +1,39 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ dist/
8
+ build/
9
+ .eggs/
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ env/
15
+
16
+ # IDE
17
+ .idea/
18
+ .vscode/
19
+ *.swp
20
+ *.swo
21
+ *~
22
+
23
+ # Testing
24
+ .pytest_cache/
25
+ .coverage
26
+ htmlcov/
27
+ .mypy_cache/
28
+ .ruff_cache/
29
+
30
+ # Build
31
+ *.whl
32
+ *.tar.gz
33
+
34
+ # OS
35
+ .DS_Store
36
+ Thumbs.db
37
+
38
+ # Spike artifacts
39
+ spike.png
@@ -0,0 +1,58 @@
1
+ # Changelog
2
+
3
+ All notable changes to WaveXisMCP will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2025-07-07
9
+
10
+ ### Added
11
+
12
+ - **149 tools** across **13 capability tiers**:
13
+ - Core (42): session, navigation, capture, eval, DOM, input, cookies, tabs, utility
14
+ - Network (9): headers, UA, block, throttle, cache, HAR, intercept, mock, request list
15
+ - Storage (13): localStorage, sessionStorage, cache storage, IndexedDB, state save/restore
16
+ - Emulation (9): device, viewport, geolocation, timezone, dark mode, locale, CPU, touch, sensors
17
+ - A11y (3): accessibility tree snapshot, node by ID, ancestors
18
+ - Interactions (5): dialogs, downloads, permissions
19
+ - DevTools (23): performance, CSS, debugging, overlay, console, security, window management
20
+ - Vision (6): coordinate-based mouse operations
21
+ - Video (4): recording, chapters, action overlay
22
+ - Testing (4): assertions, locator generation
23
+ - Workflows (5): multi-action YAML, raw CDP/BiDi, browser contexts
24
+ - Data (6): codegen, lighthouse audit, extract, websocket intercept, crawl, visual diff
25
+ - Experimental (20): service workers, animations, WebAuthn, WebAudio, media, cast, bluetooth
26
+ - **M1: `wavexis_act` tool** — natural language interaction with accessibility snapshot matching and action execution (click, type, fill, hover) via heuristic keyword scoring
27
+ - **M2: WebSocket event streaming** — live browser event streaming for HTTP transport with polling fallback (`streaming.py`)
28
+ - **M3: MCP resources** — read-only browser state exposed via `wavexis://session/{id}/url`, `/cookies`, `/console`, `/tabs`
29
+ - **M3: MCP prompts** — workflow templates: `scrape_page`, `audit_page`, `fill_form`, `debug_page`
30
+ - **M4: Per-session rate limiting** — token bucket algorithm with `--rate-limit` and `--rate-burst` CLI flags
31
+ - **HTTP transport** — `--transport http` mode with `--host`, `--port`, and `--allow-remote` flags
32
+ - **Docker deployment** — Dockerfile, docker-compose.yml, and GitHub Actions workflow for GHCR image publishing
33
+ - **W3: `wavexis_get_request_body`, `wavexis_get_response_body`** — request/response body capture
34
+ - **W6: `wavexis_modify_request`** — request modification (headers, method, body)
35
+ - **W7: `wavexis_replay_har`** — HAR file replay
36
+ - **W8: `wavexis_start_combined_trace`, `wavexis_stop_combined_trace`** — combined trace + performance
37
+ - **W9: `wavexis_axe_audit`** — axe-core accessibility audit
38
+ - **W12: `wavexis_visual_diff`** — visual regression diffing
39
+ - Dual backend support: CDP (cdpwave, Chromium-native) + BiDi (bidiwave, W3C cross-browser)
40
+ - Dual mode: stateless (one-shot) + session-based (persistent browser)
41
+ - Capability tier filtering via `--caps` flag
42
+ - Structured error responses with actionable suggestions
43
+ - Session cleanup via lifespan handler and atexit
44
+ - `--help` CLI support with argparse
45
+ - Pydantic v2 input validation for all tools
46
+ - Base64 and file output for binary data (screenshots, PDFs, video)
47
+ - Comprehensive unit + integration test suite (261 tests)
48
+ - MIT license
49
+ - Documentation: HTTP transport, Docker, resources/prompts, rate limiting
50
+
51
+ ### Security
52
+
53
+ - HTTP transport binds to `127.0.0.1` by default (not `0.0.0.0`)
54
+ - `--allow-remote` flag required for `0.0.0.0` binding (prints warning)
55
+ - No authentication in HTTP transport for v1.0.0 (planned for v1.1.0)
56
+ - Rate limiting protects browser from excessive tool calls per session
57
+ - Capability gating for destructive/experimental tools
58
+ - No arbitrary command execution (raw CDP/BiDi sends protocol commands, not shell)
@@ -0,0 +1,131 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, religion, or sexual identity
10
+ and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best for the overall community, not just us as individuals
26
+
27
+ Examples of unacceptable behavior include:
28
+
29
+ * The use of sexualized language or imagery, and sexual attention or
30
+ advances of any kind
31
+ * Trolling, insulting or derogatory comments, and personal or political attacks
32
+ * Public or private harassment
33
+ * Publishing others' private information, such as a physical or email
34
+ address, without their explicit permission
35
+ * Other conduct which could reasonably be considered inappropriate in a
36
+ professional setting
37
+
38
+ ## Enforcement Responsibilities
39
+
40
+ Community leaders are responsible for clarifying and enforcing our standards of
41
+ acceptable behavior and will take appropriate and fair corrective action in
42
+ response to any behavior that they deem inappropriate, threatening, offensive,
43
+ or harmful.
44
+
45
+ Community leaders have the right and responsibility to remove, edit, or reject
46
+ comments, commits, code, wiki edits, issues, and other contributions that are
47
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
48
+ decisions when appropriate.
49
+
50
+ ## Scope
51
+
52
+ This Code of Conduct applies within all community spaces, and also applies when
53
+ an individual is officially representing the community in public spaces.
54
+ Examples of representing our community include using an official e-mail address,
55
+ posting via an official social media account, or acting as an appointed
56
+ representative at an online or offline event.
57
+
58
+ ## Enforcement
59
+
60
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
61
+ reported to the community leaders responsible for enforcement at
62
+ mathias.paulenko@outlook.com.
63
+ All complaints will be reviewed and investigated promptly and fairly.
64
+
65
+ All community leaders are obligated to respect the privacy and security of the
66
+ reporter of any incident.
67
+
68
+ ## Enforcement Guidelines
69
+
70
+ Community leaders will follow these Community Impact Guidelines in determining
71
+ the consequences for any action they deem in violation of this Code of Conduct:
72
+
73
+ ### 1. Correction
74
+
75
+ **Community Impact**: Use of inappropriate language or other behavior deemed
76
+ unprofessional or unwelcome in the community.
77
+
78
+ **Consequence**: A private, written warning from community leaders, providing
79
+ clarity around the nature of the violation and an explanation of why the
80
+ behavior was inappropriate. A public apology may be requested.
81
+
82
+ ### 2. Warning
83
+
84
+ **Community Impact**: A violation through a single incident or series
85
+ of actions.
86
+
87
+ **Consequence**: A warning with consequences for continued behavior. No
88
+ interaction with the people involved, including unsolicited interaction with
89
+ those enforcing the Code of Conduct, for a specified period of time. This
90
+ includes avoiding interactions in community spaces as well as external channels
91
+ like social media. Violating these terms may lead to a temporary or
92
+ permanent ban.
93
+
94
+ ### 3. Temporary Ban
95
+
96
+ **Community Impact**: A serious violation of community standards, including
97
+ sustained inappropriate behavior.
98
+
99
+ **Consequence**: A temporary ban from any sort of interaction or public
100
+ communication with the community for a specified period of time. No public or
101
+ private interaction with the people involved, including unsolicited
102
+ interaction with those enforcing the Code of Conduct, is allowed during this
103
+ period. Violating these terms may lead to a permanent ban.
104
+
105
+ ### 4. Permanent Ban
106
+
107
+ **Community Impact**: Demonstrating a pattern of violation of community
108
+ standards, including sustained inappropriate behavior, harassment of an
109
+ individual, or aggression toward or disparagement of classes of individuals.
110
+
111
+ **Consequence**: A permanent ban from any sort of public interaction within
112
+ the community.
113
+
114
+ ## Attribution
115
+
116
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
117
+ version 2.1, available at
118
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
119
+
120
+ Community Impact Guidelines were inspired by
121
+ [Mozilla's code of conduct enforcement ladder][mozilla coc].
122
+
123
+ For answers to common questions about this code of conduct, see the FAQ at
124
+ [https://www.contributor-covenant.org/faq][faq]. Translations are available
125
+ at [https://www.contributor-covenant.org/translations][translations].
126
+
127
+ [homepage]: https://www.contributor-covenant.org
128
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
129
+ [mozilla coc]: https://github.com/mozilla/diversity
130
+ [faq]: https://www.contributor-covenant.org/faq
131
+ [translations]: https://www.contributor-covenant.org/translations
@@ -0,0 +1,77 @@
1
+ # Contributing to WaveXisMCP
2
+
3
+ Thank you for your interest in contributing! This document covers setup, testing, and the PR process.
4
+
5
+ ## Development Setup
6
+
7
+ ```bash
8
+ git clone https://github.com/MathiasPaulenko/wavexis-mcp.git
9
+ cd wavexis-mcp
10
+ pip install -e ".[dev]"
11
+ ```
12
+
13
+ This installs WaveXisMCP with dev dependencies and the CDP backend (cdpwave).
14
+
15
+ ## Running Tests
16
+
17
+ ```bash
18
+ # Unit tests (no browser needed)
19
+ pytest tests/unit/ -v
20
+
21
+ # Integration tests (requires Chrome)
22
+ pytest tests/integration/ -v -m integration
23
+
24
+ # Linting
25
+ ruff check .
26
+
27
+ # Type checking
28
+ mypy src/wavexis_mcp/
29
+ ```
30
+
31
+ ## Project Structure
32
+
33
+ ```
34
+ src/wavexis_mcp/
35
+ ├── __init__.py
36
+ ├── server.py # FastMCP server, tool registration, main()
37
+ ├── session.py # SessionManager, BrowserSession
38
+ ├── caps.py # CapsManager, TIER_MAP
39
+ ├── models.py # Pydantic input models
40
+ ├── formatter.py # Response formatting helpers
41
+ ├── errors.py # Exception classes
42
+ ├── convenience.py # Composite tools (fill_form, check/uncheck)
43
+ └── tools/ # Tool implementations by category
44
+ ├── session.py
45
+ ├── navigation.py
46
+ ├── capture.py
47
+ ├── javascript.py
48
+ ├── dom.py
49
+ ├── input.py
50
+ ├── cookies.py
51
+ ├── tabs.py
52
+ └── utility.py
53
+ ```
54
+
55
+ ## Adding a New Tool
56
+
57
+ 1. Add the Pydantic input model to `models.py`
58
+ 2. Implement the tool in the appropriate `tools/` module
59
+ 3. Set tool annotations per the API design
60
+ 4. Add unit tests with a mock backend
61
+ 5. Update the tool count in README if needed
62
+
63
+ ## Pull Request Process
64
+
65
+ 1. Fork the repo and create a feature branch
66
+ 2. Run `ruff check .` and `mypy src/wavexis_mcp/` — both must pass
67
+ 3. Run `pytest tests/unit/ -v` — all tests must pass
68
+ 4. Write a clear PR description referencing any related issues
69
+ 5. Ensure your commits follow [conventional commits](https://www.conventionalcommits.org/)
70
+
71
+ ## Code Style
72
+
73
+ - Python 3.11+ with type hints on all parameters and return types
74
+ - Line length: 100 characters (enforced by ruff)
75
+ - Ruff rules: E, F, I, N, UP, B, SIM, ASYNC
76
+ - No redundant comments
77
+ - English for all code, variable names, and technical docs
@@ -0,0 +1,17 @@
1
+ FROM python:3.12-slim
2
+
3
+ # Install Chromium
4
+ RUN apt-get update && \
5
+ apt-get install -y --no-install-recommends chromium && \
6
+ rm -rf /var/lib/apt/lists/*
7
+
8
+ # Install wavexis-mcp
9
+ COPY dist/wavexis_mcp-*.whl /tmp/
10
+ RUN pip install --no-cache-dir /tmp/wavexis_mcp-*.whl
11
+
12
+ # Configure
13
+ ENV WAVEXIS_BROWSER_PATH=/usr/bin/chromium
14
+ EXPOSE 8765
15
+
16
+ # Run in HTTP mode with all capability tiers
17
+ ENTRYPOINT ["wavexis-mcp", "--transport=http", "--host=0.0.0.0", "--port=8765", "--caps=all"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Mathias Paulenko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.