diff --git a/.dockerignore b/.dockerignore index 5199434..30dd599 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,7 +11,7 @@ __pycache__/ env/ venv/ .venv/ -.zen_venv/ +.pal_venv/ ENV/ env.bak/ venv.bak/ diff --git a/.env.example b/.env.example index befec14..f163e3b 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -# Zen MCP Server Environment Configuration +# PAL MCP Server Environment Configuration # Copy this file to .env and fill in your values # API Keys - At least one is required @@ -191,7 +191,7 @@ DISABLED_TOOLS=analyze,refactor,testgen,secaudit,docgen,tracer # LOCALE=fr-FR # =========================================== -# Zen MCP Server Configuration +# PAL MCP Server Configuration # =========================================== # Force .env file values to override system environment variables @@ -213,7 +213,7 @@ DISABLED_TOOLS=analyze,refactor,testgen,secaudit,docgen,tracer # Development with multiple AI tools: true (prevents tool conflicts) # Production/Container deployments: false (preserves security practices) # CI/CD environments: false (respects pipeline secrets) -ZEN_MCP_FORCE_ENV_OVERRIDE=false +PAL_MCP_FORCE_ENV_OVERRIDE=false # =========================================== # Docker Configuration @@ -221,7 +221,7 @@ ZEN_MCP_FORCE_ENV_OVERRIDE=false # Container name for Docker Compose # Used when running with docker-compose.yml -COMPOSE_PROJECT_NAME=zen-mcp +COMPOSE_PROJECT_NAME=pal-mcp # Timezone for Docker containers # Ensures consistent time handling in containerized environments diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 56ce707..93d3f71 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -12,7 +12,7 @@ body: attributes: label: Project Version description: "Which version are you using? (To see version: ./run-server.sh -v)" - placeholder: "e.g., 5.1.0" + placeholder: "e.g., 9.4.1" validations: required: true @@ -29,7 +29,7 @@ body: id: logs attributes: label: Relevant Log Output - description: "Please copy and paste any relevant log output. Logs are stored under the `logs` folder in the zen folder. You an also use `./run-server.sh -f` to see logs" + description: "Please copy and paste any relevant log output. Logs are stored under the `logs` folder in the pal folder. You an also use `./run-server.sh -f` to see logs" render: shell - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 774c56a..beee529 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,12 +1,12 @@ blank_issues_enabled: false contact_links: - name: 💬 General Discussion - url: https://github.com/BeehiveInnovations/zen-mcp-server/discussions + url: https://github.com/BeehiveInnovations/pal-mcp-server/discussions about: Ask questions, share ideas, or discuss usage patterns with the community - name: 📚 Documentation - url: https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/README.md + url: https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/README.md about: Check the README for setup instructions and usage examples - name: 🤝 Contributing Guide - url: https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/CONTRIBUTING.md + url: https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/CONTRIBUTING.md about: Learn how to contribute to the project diff --git a/.github/ISSUE_TEMPLATE/tool_addition.yml b/.github/ISSUE_TEMPLATE/tool_addition.yml index 1c2212d..3b6fa48 100644 --- a/.github/ISSUE_TEMPLATE/tool_addition.yml +++ b/.github/ISSUE_TEMPLATE/tool_addition.yml @@ -1,5 +1,5 @@ name: 🛠️ New Gemini Tool Proposal -description: Propose a new Zen MCP tool (e.g., `summarize`, `fixer`, `refactor`) +description: Propose a new PAL MCP tool (e.g., `summarize`, `fixer`, `refactor`) labels: ["enhancement", "new-tool"] body: - type: input @@ -15,7 +15,7 @@ body: id: purpose attributes: label: What is the primary purpose of this tool? - description: "Explain the tool's core function and the value it provides to developers using Claude + Zen." + description: "Explain the tool's core function and the value it provides to developers using Claude + PAL." placeholder: "This tool will automatically generate comprehensive documentation from code, extracting class and function signatures, docstrings, and creating usage examples." validations: required: true @@ -27,7 +27,7 @@ body: description: "Show how a user would invoke this tool through Claude and what the expected output would look like." placeholder: | **User prompt to Claude:** - "Use zen to generate documentation for my entire src/ directory" + "Use pal to generate documentation for my entire src/ directory" **Expected behavior:** - Analyze all Python files in src/ @@ -61,7 +61,7 @@ body: id: system-prompt attributes: label: Proposed System Prompt (Optional) - description: "If you have ideas for how zen should be prompted for this tool, share them here." + description: "If you have ideas for how pal should be prompted for this tool, share them here." placeholder: | You are an expert technical documentation generator. Your task is to create comprehensive, user-friendly documentation from source code... diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index c05519e..84259db 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -95,7 +95,7 @@ jobs: ```json { "mcpServers": { - "zen": { + "pal": { "command": "docker", "args": ["run", "--rm", "-i", "-e", "GEMINI_API_KEY", "ghcr.io/${{ github.repository }}:pr-${{ github.event.number }}"], "env": { "GEMINI_API_KEY": "your-key" } diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 445052a..538dbd9 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -87,7 +87,7 @@ jobs: \`\`\`json { "mcpServers": { - "zen-mcp-server": { + "pal-mcp-server": { "command": "docker", "args": [ "run", "--rm", "-i", diff --git a/.gitignore b/.gitignore index d2beebe..636d655 100644 --- a/.gitignore +++ b/.gitignore @@ -179,7 +179,7 @@ CLAUDE.local.md .claude/settings.local.json # Standalone mode files -.zen_venv/ +.pal_venv/ .docker_cleaned logs/ *.backup diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d17cf3c..582f913 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,7 +28,7 @@ exclude: | \.git/| \.venv/| venv/| - \.zen_venv/| + \.pal_venv/| __pycache__/| \.pytest_cache/| logs/| diff --git a/AGENTS.md b/AGENTS.md index 2aebd5f..ec8ec34 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,14 +5,14 @@ See `requirements.txt` and `requirements-dev.txt` Also read CLAUDE.md and CLAUDE.local.md if available. ## Project Structure & Module Organization -Zen MCP Server centers on `server.py`, which exposes MCP entrypoints and coordinates multi-model workflows. +PAL MCP Server centers on `server.py`, which exposes MCP entrypoints and coordinates multi-model workflows. Feature-specific tools live in `tools/`, provider integrations in `providers/`, and shared helpers in `utils/`. Prompt and system context assets stay in `systemprompts/`, while configuration templates and automation scripts live under `conf/`, `scripts/`, and `docker/`. Unit tests sit in `tests/`; simulator-driven scenarios and log utilities are in `simulator_tests/` with the `communication_simulator_test.py` harness. Authoritative documentation and samples live in `docs/`, and runtime diagnostics are rotated in `logs/`. ## Build, Test, and Development Commands -- `source .zen_venv/bin/activate` – activate the managed Python environment. +- `source .pal_venv/bin/activate` – activate the managed Python environment. - `./run-server.sh` – install dependencies, refresh `.env`, and launch the MCP server locally. - `./code_quality_checks.sh` – run Ruff autofix, Black, isort, and the default pytest suite. - `python communication_simulator_test.py --quick` – smoke-test orchestration across tools and providers. @@ -20,14 +20,14 @@ Authoritative documentation and samples live in `docs/`, and runtime diagnostics Run code quality checks: ```bash -.zen_venv/bin/activate && ./code_quality_checks.sh +.pal_venv/bin/activate && ./code_quality_checks.sh ``` For example, this is how we run an individual / all tests: ```bash -.zen_venv/bin/activate && pytest tests/test_auto_mode_model_listing.py -q -.zen_venv/bin/activate && pytest -q +.pal_venv/bin/activate && pytest tests/test_auto_mode_model_listing.py -q +.pal_venv/bin/activate && pytest -q ``` ## Coding Style & Naming Conventions diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ab8890..56dc550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,17 +2,30 @@ +## v9.4.2 (2025-12-04) + +### Bug Fixes + +- Rebranding, see [docs/name-change.md](docs/name-change.md) for details + ([`b2dc849`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b2dc84992d70839b29b611178b3871f4922b747f)) + +### Chores + +- Sync version to config.py [skip ci] + ([`bcfacce`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bcfaccecd490859fe189f45df4cf5b8e102d7874)) + + ## v9.4.1 (2025-11-21) ### Bug Fixes -- Regression https://github.com/BeehiveInnovations/zen-mcp-server/issues/338 - ([`aceddb6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/aceddb655fc36918108b3da1f926bdd4e94875a2)) +- Regression https://github.com/BeehiveInnovations/pal-mcp-server/issues/338 + ([`aceddb6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/aceddb655fc36918108b3da1f926bdd4e94875a2)) ### Chores - Sync version to config.py [skip ci] - ([`c4461a4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c4461a466fab9c647b0a5035328c4d0f3e28f647)) + ([`c4461a4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c4461a466fab9c647b0a5035328c4d0f3e28f647)) ## v9.4.0 (2025-11-18) @@ -20,22 +33,22 @@ ### Bug Fixes - Failing test for gemini 3.0 pro open router - ([`19a2a89`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/19a2a89b12c5dec53aea21a4244aff7796a5e049)) + ([`19a2a89`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/19a2a89b12c5dec53aea21a4244aff7796a5e049)) ### Chores - Sync version to config.py [skip ci] - ([`d3de61f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d3de61f8787ab60261d09f2c7f362c50d2093799)) + ([`d3de61f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d3de61f8787ab60261d09f2c7f362c50d2093799)) ### Features - Gemini 3.0 Pro Preview for Open Router - ([`bbfdfac`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bbfdfac511668e8ae60f9b9b5d41eb9ab55d74cf)) + ([`bbfdfac`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bbfdfac511668e8ae60f9b9b5d41eb9ab55d74cf)) ### Refactoring - Enable search on codex CLI - ([`1579d9f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1579d9f806a653bb04c9c73ab304cdd0e78fbdfa)) + ([`1579d9f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1579d9f806a653bb04c9c73ab304cdd0e78fbdfa)) ## v9.3.1 (2025-11-18) @@ -43,7 +56,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`d256098`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d2560983402abf084608f7750f05407a8d3e20a0)) + ([`d256098`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d2560983402abf084608f7750f05407a8d3e20a0)) ## v9.3.0 (2025-11-18) @@ -51,7 +64,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`3748d47`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3748d47faba7d871f2dd379f2c8646aa8cd3c6e9)) + ([`3748d47`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3748d47faba7d871f2dd379f2c8646aa8cd3c6e9)) ## v9.2.2 (2025-11-18) @@ -59,12 +72,12 @@ ### Bug Fixes - **build**: Include clink resources in package - ([`e9ac1ce`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e9ac1ce3354fbb124a72190702618f94266b8459)) + ([`e9ac1ce`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e9ac1ce3354fbb124a72190702618f94266b8459)) ### Chores - Sync version to config.py [skip ci] - ([`749bc73`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/749bc7307949fa0b0e026bfcfbd546d7619eba8b)) + ([`749bc73`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/749bc7307949fa0b0e026bfcfbd546d7619eba8b)) ## v9.2.1 (2025-11-18) @@ -72,12 +85,12 @@ ### Bug Fixes - **server**: Iterate provider instances during shutdown - ([`d40fc83`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d40fc83d7549293372f3d20cc599a79ec355acef)) + ([`d40fc83`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d40fc83d7549293372f3d20cc599a79ec355acef)) ### Chores - Sync version to config.py [skip ci] - ([`84f6c4f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/84f6c4fb241257b611f4b954c22a6b9340007a73)) + ([`84f6c4f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/84f6c4fb241257b611f4b954c22a6b9340007a73)) ## v9.2.0 (2025-11-18) @@ -85,27 +98,27 @@ ### Chores - Sync version to config.py [skip ci] - ([`7a1de64`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7a1de6477aae88bfe7a2f677faf0794169651354)) + ([`7a1de64`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7a1de6477aae88bfe7a2f677faf0794169651354)) ### Documentation - Streamline advanced usage guide by reorganizing table of contents for improved navigation - ([`698d391`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/698d391b26a0dd565eada8bfa6e67e549ce1dd20)) + ([`698d391`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/698d391b26a0dd565eada8bfa6e67e549ce1dd20)) - Update .env.example to include new GPT-5.1 model options and clarify existing model descriptions - ([`dbbfef2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/dbbfef292c67ed54f90f7612c9c14d4095bd6c45)) + ([`dbbfef2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/dbbfef292c67ed54f90f7612c9c14d4095bd6c45)) - Update advanced usage and configuration to include new GPT-5.1 models and enhance tool parameters - ([`807c9df`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/807c9df70e3b54031ec6beea10f3975455b36dfb)) + ([`807c9df`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/807c9df70e3b54031ec6beea10f3975455b36dfb)) ### Features - Add new GPT-5.1 models to configuration files and update model selection logic in OpenAI provider - ([`8e9aa23`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/8e9aa2304d5e9ea9a9f8dc2a13a27a1ced6b1608)) + ([`8e9aa23`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/8e9aa2304d5e9ea9a9f8dc2a13a27a1ced6b1608)) - Enhance model support by adding GPT-5.1 to .gitignore and updating cassette maintenance documentation for dual-model testing - ([`f713d8a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f713d8a354a37c32a806c98994e6f949ecd64237)) + ([`f713d8a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f713d8a354a37c32a806c98994e6f949ecd64237)) ## v9.1.4 (2025-11-18) @@ -113,12 +126,12 @@ ### Bug Fixes - Replaced deprecated Codex web search configuration - ([`2ec64ba`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2ec64ba7489acc586846b25eedf94a4f05d5bd2d)) + ([`2ec64ba`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2ec64ba7489acc586846b25eedf94a4f05d5bd2d)) ### Chores - Sync version to config.py [skip ci] - ([`4d3d177`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4d3d177d91370097ca7ac4f922fa3a8b69ce3250)) + ([`4d3d177`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4d3d177d91370097ca7ac4f922fa3a8b69ce3250)) ## v9.1.3 (2025-10-22) @@ -126,23 +139,23 @@ ### Bug Fixes - Reduced token usage, removed parameters from schema that CLIs never seem to use - ([`3e27319`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3e27319e60b0287df918856b58b2bbf042c948a8)) + ([`3e27319`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3e27319e60b0287df918856b58b2bbf042c948a8)) - Telemetry option no longer available in gemini 0.11 - ([`2a8dff0`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2a8dff0cc8a3f33111533cdb971d654637ed0578)) + ([`2a8dff0`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2a8dff0cc8a3f33111533cdb971d654637ed0578)) ### Chores - Sync version to config.py [skip ci] - ([`9e163f9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9e163f9dc0654fc28961c9897b7c787a2b96e57d)) + ([`9e163f9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9e163f9dc0654fc28961c9897b7c787a2b96e57d)) - Sync version to config.py [skip ci] - ([`557e443`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/557e443a63ffd733fb41faaa8696f6f4bb2c2fd1)) + ([`557e443`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/557e443a63ffd733fb41faaa8696f6f4bb2c2fd1)) ### Refactoring - Improved precommit system prompt - ([`3efff60`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3efff6056e322ee1531d7bed5601038c129a8b29)) + ([`3efff60`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3efff6056e322ee1531d7bed5601038c129a8b29)) ## v9.1.2 (2025-10-21) @@ -150,15 +163,15 @@ ### Bug Fixes - Configure codex with a longer timeout - ([`d2773f4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d2773f488af28986632846652874de9ff633049c)) + ([`d2773f4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d2773f488af28986632846652874de9ff633049c)) -- Handle claude's array style JSON https://github.com/BeehiveInnovations/zen-mcp-server/issues/295 - ([`d5790a9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d5790a9bfef719f03d17f2d719f1882e55d13b3b)) +- Handle claude's array style JSON https://github.com/BeehiveInnovations/pal-mcp-server/issues/295 + ([`d5790a9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d5790a9bfef719f03d17f2d719f1882e55d13b3b)) ### Chores - Sync version to config.py [skip ci] - ([`04132f1`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/04132f1459f1e086afd8e3d456f671b63338f846)) + ([`04132f1`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/04132f1459f1e086afd8e3d456f671b63338f846)) ## v9.1.1 (2025-10-17) @@ -166,19 +179,19 @@ ### Bug Fixes - Failing test - ([`aed3e3e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/aed3e3ee80c440ac8ab0d4abbf235b84df723d18)) + ([`aed3e3e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/aed3e3ee80c440ac8ab0d4abbf235b84df723d18)) - Handler for parsing multiple generated code blocks - ([`f4c20d2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f4c20d2a20e1c57d8b10e8f508e07e2a8d72f94a)) + ([`f4c20d2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f4c20d2a20e1c57d8b10e8f508e07e2a8d72f94a)) - Improved error reporting; codex cli would at times fail to figure out how to handle plain-text / JSON errors - ([`95e69a7`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/95e69a7cb234305dcd37dcdd2f22be715922e9a8)) + ([`95e69a7`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/95e69a7cb234305dcd37dcdd2f22be715922e9a8)) ### Chores - Sync version to config.py [skip ci] - ([`942757a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/942757a360a74c021b2a1aa63e394f18f5abcecd)) + ([`942757a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/942757a360a74c021b2a1aa63e394f18f5abcecd)) ## v9.1.0 (2025-10-17) @@ -186,12 +199,12 @@ ### Chores - Sync version to config.py [skip ci] - ([`3ee0c8f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3ee0c8f555cb51b975700290919c2a8e2ada8cc4)) + ([`3ee0c8f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3ee0c8f555cb51b975700290919c2a8e2ada8cc4)) ### Features - Enhance review prompts to emphasize static analysis - ([`36e66e2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/36e66e2e9a44a73a466545d4d3477ecb2cb3e669)) + ([`36e66e2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/36e66e2e9a44a73a466545d4d3477ecb2cb3e669)) ## v9.0.4 (2025-10-17) @@ -199,7 +212,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`8c6f653`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/8c6f6532d843f7f1b283ce9b6472e5ba991efe16)) + ([`8c6f653`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/8c6f6532d843f7f1b283ce9b6472e5ba991efe16)) ## v9.0.3 (2025-10-16) @@ -207,12 +220,12 @@ ### Bug Fixes - Remove duplicate -o json flag in gemini CLI config - ([`3b2eff5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3b2eff58ac0e2388045a7442c63f56ce259b54ba)) + ([`3b2eff5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3b2eff58ac0e2388045a7442c63f56ce259b54ba)) ### Chores - Sync version to config.py [skip ci] - ([`b205d71`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b205d7159b674ce47ebc11af7255d1e3556fff93)) + ([`b205d71`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b205d7159b674ce47ebc11af7255d1e3556fff93)) ## v9.0.2 (2025-10-15) @@ -220,12 +233,12 @@ ### Bug Fixes - Update Claude CLI commands to new mcp syntax - ([`a2189cb`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a2189cb88a295ebad6268b9b08c893cd65bc1d89)) + ([`a2189cb`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a2189cb88a295ebad6268b9b08c893cd65bc1d89)) ### Chores - Sync version to config.py [skip ci] - ([`d08cdc6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d08cdc6691e0f68917f2824945905b7256e0e568)) + ([`d08cdc6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d08cdc6691e0f68917f2824945905b7256e0e568)) ## v9.0.1 (2025-10-14) @@ -233,12 +246,12 @@ ### Bug Fixes - Add JSON output flag to gemini CLI configuration - ([`eb3dff8`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/eb3dff845828f60ff2659586883af622b8b035eb)) + ([`eb3dff8`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/eb3dff845828f60ff2659586883af622b8b035eb)) ### Chores - Sync version to config.py [skip ci] - ([`b9408aa`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b9408aae8860d43b1da0ba67f9db98db7e4de2cf)) + ([`b9408aa`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b9408aae8860d43b1da0ba67f9db98db7e4de2cf)) ## v9.0.0 (2025-10-08) @@ -246,13 +259,13 @@ ### Chores - Sync version to config.py [skip ci] - ([`23c9b35`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/23c9b35d5226b07b59a4c4b3d7833ba81b019ea8)) + ([`23c9b35`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/23c9b35d5226b07b59a4c4b3d7833ba81b019ea8)) ### Features - Claude Code as a CLI agent now supported. Mix and match: spawn claude code from within claude code, or claude code from within codex. - ([`4cfaa0b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4cfaa0b6060769adfbd785a072526a5368421a73)) + ([`4cfaa0b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4cfaa0b6060769adfbd785a072526a5368421a73)) ## v8.0.2 (2025-10-08) @@ -260,12 +273,12 @@ ### Bug Fixes - Restore run-server quote trimming regex - ([`1de4542`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1de454224c105891137134e2a25c2ee4f00dba45)) + ([`1de4542`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1de454224c105891137134e2a25c2ee4f00dba45)) ### Chores - Sync version to config.py [skip ci] - ([`728fb43`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/728fb439b929c9dc37646b24537ae043208fda7d)) + ([`728fb43`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/728fb439b929c9dc37646b24537ae043208fda7d)) ## v8.0.1 (2025-10-08) @@ -273,17 +286,17 @@ ### Bug Fixes - Resolve executable path for cross-platform compatibility in CLI agent - ([`f98046c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f98046c2fccaa7f9a24665a0d705a98006461da5)) + ([`f98046c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f98046c2fccaa7f9a24665a0d705a98006461da5)) ### Chores - Sync version to config.py [skip ci] - ([`52245b9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/52245b91eaa5d720f8c3b21ead55248dd8e8bd57)) + ([`52245b9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/52245b91eaa5d720f8c3b21ead55248dd8e8bd57)) ### Testing - Fix clink agent tests to mock shutil.which() for executable resolution - ([`4370be3`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4370be33b4b69a40456527213bcd62321a925a57)) + ([`4370be3`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4370be33b4b69a40456527213bcd62321a925a57)) ## v8.0.0 (2025-10-07) @@ -291,7 +304,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`4c34541`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4c3454121c3c678cdfe8ea03fa77f4dd414df9bc)) + ([`4c34541`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4c3454121c3c678cdfe8ea03fa77f4dd414df9bc)) ## v7.8.1 (2025-10-07) @@ -299,17 +312,17 @@ ### Bug Fixes - Updated model description to fix test - ([`04f7ce5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/04f7ce5b03804564263f53a765931edba9c320cd)) + ([`04f7ce5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/04f7ce5b03804564263f53a765931edba9c320cd)) ### Chores - Sync version to config.py [skip ci] - ([`c27e81d`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c27e81d6d2f22978816f798a161a869d1ab5f025)) + ([`c27e81d`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c27e81d6d2f22978816f798a161a869d1ab5f025)) ### Refactoring - Moved registries into a separate module and code cleanup - ([`7c36b92`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7c36b9255a13007a10af4fadefc21aadfce482b0)) + ([`7c36b92`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7c36b9255a13007a10af4fadefc21aadfce482b0)) ## v7.8.0 (2025-10-07) @@ -317,35 +330,35 @@ ### Chores - Sync version to config.py [skip ci] - ([`3e5fa96`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3e5fa96c981bbd7b844a9887a518ffe266b78e9b)) + ([`3e5fa96`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3e5fa96c981bbd7b844a9887a518ffe266b78e9b)) ### Documentation - Consensus video - ([`2352684`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/23526841922a73c68094e5205e19af04a1f6c8cc)) + ([`2352684`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/23526841922a73c68094e5205e19af04a1f6c8cc)) - Formatting - ([`7d7c74b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7d7c74b5a38b7d1adf132b8e28034017df7aa852)) + ([`7d7c74b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7d7c74b5a38b7d1adf132b8e28034017df7aa852)) - Link to videos from main page - ([`e8ef193`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e8ef193daba393b55a3beaaba49721bb9182378a)) + ([`e8ef193`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e8ef193daba393b55a3beaaba49721bb9182378a)) - Update README.md - ([`7b13543`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7b13543824fc0af729daf753ecdddba9ee7d9f1e)) + ([`7b13543`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7b13543824fc0af729daf753ecdddba9ee7d9f1e)) ### Features - All native providers now read from catalog files like OpenRouter / Custom configs. Allows for greater control over the capabilities - ([`2a706d5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2a706d5720c0bf97b71c3e0fc95c15f78015bedf)) + ([`2a706d5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2a706d5720c0bf97b71c3e0fc95c15f78015bedf)) - Provider cleanup - ([`9268dda`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9268ddad2a07306351765b47098134512739f49f)) + ([`9268dda`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9268ddad2a07306351765b47098134512739f49f)) ### Refactoring - New base class for model registry / loading - ([`02d13da`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/02d13da897016d7491b4a10a1195983385d66654)) + ([`02d13da`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/02d13da897016d7491b4a10a1195983385d66654)) ## v7.7.0 (2025-10-07) @@ -353,17 +366,17 @@ ### Chores - Sync version to config.py [skip ci] - ([`70ae62a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/70ae62a2cd663c3abcabddd1be1bc6ed9512d7df)) + ([`70ae62a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/70ae62a2cd663c3abcabddd1be1bc6ed9512d7df)) ### Documentation - Video - ([`ed5dda7`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ed5dda7c5a9439c2835cc69d76e6377169ad048a)) + ([`ed5dda7`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ed5dda7c5a9439c2835cc69d76e6377169ad048a)) ### Features - More aliases - ([`5f0aaf5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/5f0aaf5f69c9d188d817b5ffbf6738c61da40ec7)) + ([`5f0aaf5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/5f0aaf5f69c9d188d817b5ffbf6738c61da40ec7)) ## v7.6.0 (2025-10-07) @@ -371,33 +384,33 @@ ### Chores - Sync version to config.py [skip ci] - ([`c1c75ba`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c1c75ba304c2840329650c46273e87eab9b05906)) + ([`c1c75ba`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c1c75ba304c2840329650c46273e87eab9b05906)) - Sync version to config.py [skip ci] - ([`0fa9b66`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/0fa9b6658099c8e0d79fda0c7d2347f62d0e6137)) + ([`0fa9b66`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/0fa9b6658099c8e0d79fda0c7d2347f62d0e6137)) ### Documentation - Info about AI client timeouts - ([`3ddfed5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3ddfed5ef09000791e1c94b041c43dc273ed53a8)) + ([`3ddfed5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3ddfed5ef09000791e1c94b041c43dc273ed53a8)) ### Features - Add support for openai/gpt-5-pro model - ([`abed075`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/abed075b2eaa99e9618202f47ff921094baae952)) + ([`abed075`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/abed075b2eaa99e9618202f47ff921094baae952)) ## v7.5.2 (2025-10-06) ### Bug Fixes -- Handle 429 response https://github.com/BeehiveInnovations/zen-mcp-server/issues/273 - ([`cbe1d79`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/cbe1d7993276bd014b495cbd2d0ece1f5d7583d9)) +- Handle 429 response https://github.com/BeehiveInnovations/pal-mcp-server/issues/273 + ([`cbe1d79`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/cbe1d7993276bd014b495cbd2d0ece1f5d7583d9)) ### Chores - Sync version to config.py [skip ci] - ([`74fdd36`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/74fdd36de92d34681fcc5a2f772c3d05634f0a55)) + ([`74fdd36`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/74fdd36de92d34681fcc5a2f772c3d05634f0a55)) ## v7.5.1 (2025-10-06) @@ -405,7 +418,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`004e379`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/004e379cf2f1853829dccb15fa72ec18d282f1a4)) + ([`004e379`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/004e379cf2f1853829dccb15fa72ec18d282f1a4)) ## v7.5.0 (2025-10-06) @@ -413,21 +426,21 @@ ### Chores - Sync version to config.py [skip ci] - ([`71e7cd5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/71e7cd55b1f4955a6d718fddc0de419414d133b6)) + ([`71e7cd5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/71e7cd55b1f4955a6d718fddc0de419414d133b6)) ### Documentation - Video - ([`775e4d5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/775e4d50b826858095c5f2a61a07fc01c4a00816)) + ([`775e4d5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/775e4d50b826858095c5f2a61a07fc01c4a00816)) - Videos - ([`bb2066c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bb2066c909f6581ba40fc5ddef3870954ae553ab)) + ([`bb2066c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bb2066c909f6581ba40fc5ddef3870954ae553ab)) ### Features - Support for GPT-5-Pro highest reasoning model - https://github.com/BeehiveInnovations/zen-mcp-server/issues/275 - ([`a65485a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a65485a1e52fc79739000426295a27d096f4c9d8)) + https://github.com/BeehiveInnovations/pal-mcp-server/issues/275 + ([`a65485a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a65485a1e52fc79739000426295a27d096f4c9d8)) ## v7.4.0 (2025-10-06) @@ -435,12 +448,12 @@ ### Chores - Sync version to config.py [skip ci] - ([`76bf98e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/76bf98e5cd972dabd3c79b25fcb9b9a717b23f6d)) + ([`76bf98e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/76bf98e5cd972dabd3c79b25fcb9b9a717b23f6d)) ### Features - Improved prompt - ([`b1e9963`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b1e9963991a41dff082ec1dce5691c318f105e6d)) + ([`b1e9963`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b1e9963991a41dff082ec1dce5691c318f105e6d)) ## v7.3.0 (2025-10-06) @@ -448,27 +461,27 @@ ### Chores - Sync version to config.py [skip ci] - ([`e7920d0`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e7920d0ed16c0e6de9d1ccaa0b58d3fb5cbd7f2f)) + ([`e7920d0`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e7920d0ed16c0e6de9d1ccaa0b58d3fb5cbd7f2f)) ### Documentation - Fixed typo - ([`3ab0aa8`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3ab0aa8314ad5992bcb00de549a0fab2e522751d)) + ([`3ab0aa8`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3ab0aa8314ad5992bcb00de549a0fab2e522751d)) - Fixed typo - ([`c17ce3c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c17ce3cf958d488b97fa7127942542ab514b58bd)) + ([`c17ce3c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c17ce3cf958d488b97fa7127942542ab514b58bd)) - Update apilookup.md - ([`1918679`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/19186794edac4fce5523e671310aecff4cbfdc81)) + ([`1918679`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/19186794edac4fce5523e671310aecff4cbfdc81)) - Update README.md - ([`23c6c78`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/23c6c78bf152ede6e7b5f7b7770b12a8442845a3)) + ([`23c6c78`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/23c6c78bf152ede6e7b5f7b7770b12a8442845a3)) ### Features - Codex supports web-search natively but needs to be turned on, run-server script asks if the user would like this done - ([`97ba7e4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/97ba7e44ce7e3fd874759514ed2f0738033fc801)) + ([`97ba7e4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/97ba7e44ce7e3fd874759514ed2f0738033fc801)) ## v7.2.0 (2025-10-06) @@ -476,23 +489,23 @@ ### Chores - Sync version to config.py [skip ci] - ([`1854b1e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1854b1e26b705cda0dc3f4d733647f1454aa0352)) + ([`1854b1e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1854b1e26b705cda0dc3f4d733647f1454aa0352)) ### Documentation - Updated - ([`bb57f71`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bb57f719666ab6a586d835688ff8086282a5a0dc)) + ([`bb57f71`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bb57f719666ab6a586d835688ff8086282a5a0dc)) ### Features - New tool to perform apilookup (latest APIs / SDKs / language features etc) - https://github.com/BeehiveInnovations/zen-mcp-server/issues/204 - ([`5bea595`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/5bea59540f58b3c45044828c10f131aed104dd1c)) + https://github.com/BeehiveInnovations/pal-mcp-server/issues/204 + ([`5bea595`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/5bea59540f58b3c45044828c10f131aed104dd1c)) ### Refactoring - De-duplicate roles to avoid explosion when more CLIs get added - ([`c42e9e9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c42e9e9c34d7ae4732e2e4fbed579b681a6d170d)) + ([`c42e9e9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c42e9e9c34d7ae4732e2e4fbed579b681a6d170d)) ## v7.1.1 (2025-10-06) @@ -500,23 +513,23 @@ ### Bug Fixes - Clink missing in toml - ([`1ff77fa`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1ff77faa800ad6c2dde49cad98dfa72035fe1c81)) + ([`1ff77fa`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1ff77faa800ad6c2dde49cad98dfa72035fe1c81)) ### Chores - Sync version to config.py [skip ci] - ([`e02e78d`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e02e78d903b35f4c01b8039f4157e97b38d3ec7b)) + ([`e02e78d`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e02e78d903b35f4c01b8039f4157e97b38d3ec7b)) ### Documentation - Example for codex cli - ([`344c42b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/344c42bcbfb543bfd05cbc27fd5b419c76b77954)) + ([`344c42b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/344c42bcbfb543bfd05cbc27fd5b419c76b77954)) - Example for codex cli - ([`c3044de`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c3044de7424e638dde5c8ec49adb6c3c7c5a60b2)) + ([`c3044de`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c3044de7424e638dde5c8ec49adb6c3c7c5a60b2)) - Update README.md - ([`2e719ae`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2e719ae35e7979f7b83bd910867e79863a7f9ceb)) + ([`2e719ae`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2e719ae35e7979f7b83bd910867e79863a7f9ceb)) ## v7.1.0 (2025-10-05) @@ -524,12 +537,12 @@ ### Chores - Sync version to config.py [skip ci] - ([`d54bfdd`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d54bfdd49797d076ec9cade44c56292a8089c744)) + ([`d54bfdd`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d54bfdd49797d076ec9cade44c56292a8089c744)) ### Features - Support for codex as external CLI - ([`561e4aa`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/561e4aaaa8a89eb89c03985b9e7720cc98ef666c)) + ([`561e4aa`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/561e4aaaa8a89eb89c03985b9e7720cc98ef666c)) ## v7.0.2 (2025-10-05) @@ -537,7 +550,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`f2142a2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f2142a22ec50abc54b464eedd6b8239d20c509be)) + ([`f2142a2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f2142a22ec50abc54b464eedd6b8239d20c509be)) ## v7.0.1 (2025-10-05) @@ -545,17 +558,17 @@ ### Bug Fixes - --yolo needed for running shell commands, documentation added - ([`15ae3f2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/15ae3f24babccf42f43be5028bf8c60c05a6beaf)) + ([`15ae3f2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/15ae3f24babccf42f43be5028bf8c60c05a6beaf)) ### Chores - Sync version to config.py [skip ci] - ([`bc4a27b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bc4a27b18a4a3f45afb22178e61ea0be4d6a273c)) + ([`bc4a27b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bc4a27b18a4a3f45afb22178e61ea0be4d6a273c)) ### Documentation - Updated intro - ([`fb668c3`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/fb668c39b5f6e3dd37f7027f953f6004f258f2bf)) + ([`fb668c3`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/fb668c39b5f6e3dd37f7027f953f6004f258f2bf)) ## v7.0.0 (2025-10-05) @@ -563,32 +576,32 @@ ### Chores - Sync version to config.py [skip ci] - ([`0d46976`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/0d46976a8aa85254e4dbe06f5e71161cd3b13938)) + ([`0d46976`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/0d46976a8aa85254e4dbe06f5e71161cd3b13938)) - Sync version to config.py [skip ci] - ([`8296bf8`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/8296bf871c39597a904c70e7d98c72fcb4dc5a84)) + ([`8296bf8`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/8296bf871c39597a904c70e7d98c72fcb4dc5a84)) ### Documentation - Instructions for OpenCode - ([`bd66622`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bd666227c8f7557483f7e24fb8544fc0456600dc)) + ([`bd66622`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bd666227c8f7557483f7e24fb8544fc0456600dc)) - Updated intro - ([`615873c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/615873c3db2ecf5ce6475caa3445e1da9a2517bd)) + ([`615873c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/615873c3db2ecf5ce6475caa3445e1da9a2517bd)) ### Features - Huge update - Link another CLI (such as `gemini` directly from with Claude Code / Codex). - https://github.com/BeehiveInnovations/zen-mcp-server/issues/208 - ([`a2ccb48`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a2ccb48e9a5080a75dbfd483b5f09fc719c887e5)) + https://github.com/BeehiveInnovations/pal-mcp-server/issues/208 + ([`a2ccb48`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a2ccb48e9a5080a75dbfd483b5f09fc719c887e5)) ### Refactoring - Fixed test - ([`9c99b9b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9c99b9b35219f54db8d7be0958d4390a106631ae)) + ([`9c99b9b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9c99b9b35219f54db8d7be0958d4390a106631ae)) - Include file modification dates too - ([`47973e9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/47973e945efa2cdbdb8f3404d467d7f1abc62b0a)) + ([`47973e9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/47973e945efa2cdbdb8f3404d467d7f1abc62b0a)) ## v6.1.0 (2025-10-04) @@ -596,17 +609,17 @@ ### Chores - Sync version to config.py [skip ci] - ([`18095d7`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/18095d7d398e4bf3d24c57a52c81ac619acb1b89)) + ([`18095d7`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/18095d7d398e4bf3d24c57a52c81ac619acb1b89)) ### Documentation - Updated intro - ([`aa65394`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/aa6539472c4ddf1c3c1bac446fdee03e75e1cb50)) + ([`aa65394`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/aa6539472c4ddf1c3c1bac446fdee03e75e1cb50)) ### Features - Support for Qwen Code - ([`fe9968b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/fe9968b633d0312b82426e9ebddfe1d6515be3c5)) + ([`fe9968b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/fe9968b633d0312b82426e9ebddfe1d6515be3c5)) ## v6.0.0 (2025-10-04) @@ -614,40 +627,40 @@ ### Chores - Sync version to config.py [skip ci] - ([`ae8749a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ae8749ab37bdaa7e225b5219820adeb74ca9a552)) + ([`ae8749a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ae8749ab37bdaa7e225b5219820adeb74ca9a552)) ### Documentation - Updated - ([`e91ed2a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e91ed2a924b1702edf9e1417479ac0dee0ca1553)) + ([`e91ed2a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e91ed2a924b1702edf9e1417479ac0dee0ca1553)) ### Features - Azure OpenAI / Azure AI Foundry support. Models should be defined in conf/azure_models.json (or a custom path). See .env.example for environment variables or see readme. - https://github.com/BeehiveInnovations/zen-mcp-server/issues/265 - ([`ff9a07a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) + https://github.com/BeehiveInnovations/pal-mcp-server/issues/265 + ([`ff9a07a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) - Breaking change - OpenRouter models are now read from conf/openrouter_models.json while Custom / Self-hosted models are read from conf/custom_models.json - ([`ff9a07a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) + ([`ff9a07a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) - OpenAI/compatible models (such as Azure OpenAI) can declare if they use the response API instead via `use_openai_responses_api` - ([`3824d13`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3824d131618683572e9e8fffa6b25ccfabf4cf50)) + ([`3824d13`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3824d131618683572e9e8fffa6b25ccfabf4cf50)) - OpenRouter / Custom Models / Azure can separately also use custom config paths now (see .env.example ) - ([`ff9a07a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) + ([`ff9a07a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) ### Refactoring - Breaking change: `is_custom` property has been removed from model_capabilities.py (and thus custom_models.json) given each models are now read from separate configuration files - ([`ff9a07a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) + ([`ff9a07a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) - Model registry class made abstract, OpenRouter / Custom Provider / Azure OpenAI now subclass these - ([`ff9a07a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) + ([`ff9a07a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ff9a07a37adf7a24aa87c63b3ba9db88bdff467b)) ## v5.22.0 (2025-10-04) @@ -655,34 +668,34 @@ ### Bug Fixes - CI test - ([`bc93b53`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bc93b5343bbd8657b95ab47c00a2cb99a68a009f)) + ([`bc93b53`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bc93b5343bbd8657b95ab47c00a2cb99a68a009f)) - Listmodels to always honor restricted models - ([`4015e91`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4015e917ed32ae374ec6493b74993fcb34f4a971)) + ([`4015e91`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4015e917ed32ae374ec6493b74993fcb34f4a971)) ### Chores - Sync version to config.py [skip ci] - ([`054e34e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/054e34e31ca5bee5a11c0e3e6537f58e8897c79c)) + ([`054e34e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/054e34e31ca5bee5a11c0e3e6537f58e8897c79c)) - Sync version to config.py [skip ci] - ([`c0334d7`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c0334d77922f1b05e3fd755851da112567fb9ae6)) + ([`c0334d7`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c0334d77922f1b05e3fd755851da112567fb9ae6)) ### Features -- Centralized environment handling, ensures ZEN_MCP_FORCE_ENV_OVERRIDE is honored correctly - ([`2c534ac`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2c534ac06e4c6078b96781dfb55c5759b982afe8)) +- Centralized environment handling, ensures PAL_MCP_FORCE_ENV_OVERRIDE is honored correctly + ([`2c534ac`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2c534ac06e4c6078b96781dfb55c5759b982afe8)) ### Refactoring - Don't retry on 429 - ([`d184024`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d18402482087f52b7bd07755c9304ed00ed20592)) + ([`d184024`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d18402482087f52b7bd07755c9304ed00ed20592)) - Improved retry logic and moved core logic to base class - ([`f955100`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f955100f3a82973ccd987607e1d8a1bbe07828c8)) + ([`f955100`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f955100f3a82973ccd987607e1d8a1bbe07828c8)) - Removed subclass override when the base class should be resolving the model name - ([`06d7701`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/06d7701cc3ee09732ab713fa9c7c004199154483)) + ([`06d7701`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/06d7701cc3ee09732ab713fa9c7c004199154483)) ## v5.21.0 (2025-10-03) @@ -690,7 +703,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`ddb20a6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ddb20a6cdb8cdeee27c0aacb0b9c794283b5774c)) + ([`ddb20a6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ddb20a6cdb8cdeee27c0aacb0b9c794283b5774c)) ## v5.20.1 (2025-10-03) @@ -698,7 +711,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`03addcf`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/03addcfa2d3aed5086fe4c94e8b9ae56229a93ae)) + ([`03addcf`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/03addcfa2d3aed5086fe4c94e8b9ae56229a93ae)) ## v5.20.0 (2025-10-03) @@ -706,7 +719,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`539bc72`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/539bc72f1ca2a2cadcccad02de1fd5fc22cd0415)) + ([`539bc72`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/539bc72f1ca2a2cadcccad02de1fd5fc22cd0415)) ## v5.19.0 (2025-10-03) @@ -714,27 +727,27 @@ ### Bug Fixes - Add GPT-5-Codex to Responses API routing and simplify comments - ([`82b021d`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/82b021d75acc791e68c7afb35f6492f68cf02bec)) + ([`82b021d`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/82b021d75acc791e68c7afb35f6492f68cf02bec)) ### Chores - Sync version to config.py [skip ci] - ([`8e32ef3`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/8e32ef33e3ce7ab2a9d7eb5c90fe5b93b12d5c26)) + ([`8e32ef3`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/8e32ef33e3ce7ab2a9d7eb5c90fe5b93b12d5c26)) ### Documentation - Bumped defaults - ([`95d98a9`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/95d98a9bc0a5bafadccb9f6d1e4eda97a0dd2ce7)) + ([`95d98a9`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/95d98a9bc0a5bafadccb9f6d1e4eda97a0dd2ce7)) ### Features - Add GPT-5-Codex support with Responses API integration - ([`f265342`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f2653427ca829368e7145325d20a98df3ee6d6b4)) + ([`f265342`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f2653427ca829368e7145325d20a98df3ee6d6b4)) ### Testing - Cross tool memory recall, testing continuation via cassette recording - ([`88493bd`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/88493bd357c6a12477c3160813100dae1bc46493)) + ([`88493bd`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/88493bd357c6a12477c3160813100dae1bc46493)) ## v5.18.3 (2025-10-03) @@ -742,55 +755,55 @@ ### Bug Fixes - External model name now recorded properly in responses - ([`d55130a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d55130a430401e106cd86f3e830b3d756472b7ff)) + ([`d55130a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d55130a430401e106cd86f3e830b3d756472b7ff)) ### Chores - Sync version to config.py [skip ci] - ([`5714e20`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/5714e2016405f7607b44d78f85081c7ccee706e5)) + ([`5714e20`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/5714e2016405f7607b44d78f85081c7ccee706e5)) ### Documentation - Updated docs - ([`b4e5090`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b4e50901ba60c88137a29d00ecf99718582856d3)) + ([`b4e5090`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b4e50901ba60c88137a29d00ecf99718582856d3)) ### Refactoring - Generic name for the CLI agent - ([`e9b6947`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e9b69476cd922c12931d62ccc3be9082bbbf6014)) + ([`e9b6947`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e9b69476cd922c12931d62ccc3be9082bbbf6014)) - Generic name for the CLI agent - ([`7a6fa0e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7a6fa0e77a8c4a682dc11c9bbb16bdaf86d9edf4)) + ([`7a6fa0e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7a6fa0e77a8c4a682dc11c9bbb16bdaf86d9edf4)) - Generic name for the CLI agent - ([`b692da2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b692da2a82facce7455b8f2ec0108e1db84c07c3)) + ([`b692da2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b692da2a82facce7455b8f2ec0108e1db84c07c3)) - Generic name for the CLI agent - ([`f76ebbf`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f76ebbf280cc78ffcfe17cb4590aeaa231db8aa1)) + ([`f76ebbf`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f76ebbf280cc78ffcfe17cb4590aeaa231db8aa1)) - Generic name for the CLI agent - ([`c05913a`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c05913a09e53e195b9a108647c09c061ced19d17)) + ([`c05913a`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c05913a09e53e195b9a108647c09c061ced19d17)) - Generic name for the CLI agent - ([`0dfaa63`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/0dfaa6312ed95ac3d1ae0032334ae1286871b15e)) + ([`0dfaa63`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/0dfaa6312ed95ac3d1ae0032334ae1286871b15e)) ### Testing - Fixed integration tests, removed magicmock - ([`87ccb6b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/87ccb6b25ba32a3cb9c4cc64fc0e96294f492c04)) + ([`87ccb6b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/87ccb6b25ba32a3cb9c4cc64fc0e96294f492c04)) ## v5.18.2 (2025-10-02) ### Bug Fixes -- Https://github.com/BeehiveInnovations/zen-mcp-server/issues/194 - ([`8b3a286`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/8b3a2867fb83eccb3a8e8467e7e3fc5b8ebe1d0c)) +- Https://github.com/BeehiveInnovations/pal-mcp-server/issues/194 + ([`8b3a286`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/8b3a2867fb83eccb3a8e8467e7e3fc5b8ebe1d0c)) ### Chores - Sync version to config.py [skip ci] - ([`bf2196c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bf2196cdd58ae8d8d93597f2be69c798265d678f)) + ([`bf2196c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bf2196cdd58ae8d8d93597f2be69c798265d678f)) ## v5.18.1 (2025-10-02) @@ -798,7 +811,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`e434a26`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e434a2614af82efd15de4dd94b2c30559c91414e)) + ([`e434a26`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e434a2614af82efd15de4dd94b2c30559c91414e)) ## v5.18.0 (2025-10-02) @@ -806,13 +819,13 @@ ### Chores - Sync version to config.py [skip ci] - ([`e78fe35`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e78fe35a1b64cc0ed89664440ef7c7b94495d7dc)) + ([`e78fe35`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e78fe35a1b64cc0ed89664440ef7c7b94495d7dc)) ### Features - Added `intelligence_score` to the model capabilities schema; a 1-20 number that can be specified to influence the sort order of models presented to the CLI in `auto selection` mode - ([`6cab9e5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/6cab9e56fc5373da5c11d4545bcb85371d4803a4)) + ([`6cab9e5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/6cab9e56fc5373da5c11d4545bcb85371d4803a4)) ## v5.17.4 (2025-10-02) @@ -820,7 +833,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`a6c9b92`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a6c9b9212c77852d9e9a8780f4bc3e53b3bfed2f)) + ([`a6c9b92`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a6c9b9212c77852d9e9a8780f4bc3e53b3bfed2f)) ## v5.17.3 (2025-10-02) @@ -828,7 +841,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`722f6f8`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/722f6f86ae228206ce0094d109a3b20499d4e11a)) + ([`722f6f8`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/722f6f86ae228206ce0094d109a3b20499d4e11a)) ## v5.17.2 (2025-10-02) @@ -836,7 +849,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`e47a7e8`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e47a7e89d5bfad0bb0150cb3207f1a37dc91b170)) + ([`e47a7e8`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e47a7e89d5bfad0bb0150cb3207f1a37dc91b170)) ## v5.17.1 (2025-10-02) @@ -844,58 +857,58 @@ ### Bug Fixes - Baseclass should return MODEL_CAPABILITIES - ([`82a03ce`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/82a03ce63f28fece17bfc1d70bdb75aadec4c6bb)) + ([`82a03ce`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/82a03ce63f28fece17bfc1d70bdb75aadec4c6bb)) ### Chores - Sync version to config.py [skip ci] - ([`7ce66bd`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7ce66bd9508865cef64dc30936e86e37c1a306d0)) + ([`7ce66bd`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7ce66bd9508865cef64dc30936e86e37c1a306d0)) ### Documentation - Document custom timeout values - ([`218fbdf`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/218fbdf49cb90f2353f58bbaef567519dd876634)) + ([`218fbdf`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/218fbdf49cb90f2353f58bbaef567519dd876634)) ### Refactoring - Clean temperature inference - ([`9c11ecc`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9c11ecc4bf37562aa08dc3ecfa70f380e0ead357)) + ([`9c11ecc`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9c11ecc4bf37562aa08dc3ecfa70f380e0ead357)) - Cleanup - ([`6ec2033`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/6ec2033f34c74ad139036de83a34cf6d374db77b)) + ([`6ec2033`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/6ec2033f34c74ad139036de83a34cf6d374db77b)) - Cleanup provider base class; cleanup shared responsibilities; cleanup public contract - ([`693b84d`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/693b84db2b87271ac809abcf02100eee7405720b)) + ([`693b84d`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/693b84db2b87271ac809abcf02100eee7405720b)) - Cleanup token counting - ([`7fe9fc4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7fe9fc49f8e3cd92be4c45a6645d5d4ab3014091)) + ([`7fe9fc4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7fe9fc49f8e3cd92be4c45a6645d5d4ab3014091)) - Code cleanup - ([`bb138e2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/bb138e2fb552f837b0f9f466027580e1feb26f7c)) + ([`bb138e2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/bb138e2fb552f837b0f9f466027580e1feb26f7c)) - Code cleanup - ([`182aa62`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/182aa627dfba6c578089f83444882cdd2635a7e3)) + ([`182aa62`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/182aa627dfba6c578089f83444882cdd2635a7e3)) - Moved image related code out of base provider into a separate utility - ([`14a35af`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/14a35afa1d25408e62b968d9846be7bffaede327)) + ([`14a35af`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/14a35afa1d25408e62b968d9846be7bffaede327)) - Moved temperature method from base provider to model capabilities - ([`6d237d0`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/6d237d09709f757a042baf655f47eb4ddfc078ad)) + ([`6d237d0`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/6d237d09709f757a042baf655f47eb4ddfc078ad)) - Moved temperature method from base provider to model capabilities - ([`f461cb4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f461cb451953f882bbde096a9ecf0584deb1dde8)) + ([`f461cb4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f461cb451953f882bbde096a9ecf0584deb1dde8)) - Removed hard coded checks, use model capabilities instead - ([`250545e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/250545e34f8d4f8026bfebb3171f3c2bc40f4692)) + ([`250545e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/250545e34f8d4f8026bfebb3171f3c2bc40f4692)) - Removed hook from base class, turned into helper static method instead - ([`2b10adc`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2b10adcaf2b8741f0da5de84cc3483eae742a014)) + ([`2b10adc`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2b10adcaf2b8741f0da5de84cc3483eae742a014)) - Removed method from provider, should use model capabilities instead - ([`a254ff2`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a254ff2220ba00ec30f5110c69a4841419917382)) + ([`a254ff2`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a254ff2220ba00ec30f5110c69a4841419917382)) - Renaming to reflect underlying type - ([`1dc25f6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1dc25f6c3d4cdbf01f041cc424e3b5235c23175b)) + ([`1dc25f6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1dc25f6c3d4cdbf01f041cc424e3b5235c23175b)) ## v5.17.0 (2025-10-02) @@ -903,27 +916,27 @@ ### Bug Fixes - Use types.HttpOptions from module imports instead of local import - ([`956e8a6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/956e8a6927837f5c7f031a0db1dd0b0b5483c626)) + ([`956e8a6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/956e8a6927837f5c7f031a0db1dd0b0b5483c626)) ### Chores - Sync version to config.py [skip ci] - ([`0836213`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/0836213071d0037d8a6d2e64d34ab5df79b8e684)) + ([`0836213`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/0836213071d0037d8a6d2e64d34ab5df79b8e684)) ### Code Style - Apply Black formatting to use double quotes - ([`33ea896`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/33ea896c511764904bf2b6b22df823928f88a148)) + ([`33ea896`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/33ea896c511764904bf2b6b22df823928f88a148)) ### Features - Add custom Gemini endpoint support - ([`462bce0`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/462bce002e2141b342260969588e69f55f8bb46a)) + ([`462bce0`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/462bce002e2141b342260969588e69f55f8bb46a)) ### Refactoring - Simplify Gemini provider initialization using kwargs dict - ([`023940b`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/023940be3e38a7eedbc8bf8404a4a5afc50f8398)) + ([`023940b`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/023940be3e38a7eedbc8bf8404a4a5afc50f8398)) ## v5.16.0 (2025-10-01) @@ -931,22 +944,22 @@ ### Bug Fixes - Resolve logging timing and import organization issues - ([`d34c299`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d34c299f02a233af4f17bdcc848219bf07799723)) + ([`d34c299`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d34c299f02a233af4f17bdcc848219bf07799723)) ### Chores - Sync version to config.py [skip ci] - ([`b6c4bca`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b6c4bca158e4cee1ae4abd08b7e55216ebffba2d)) + ([`b6c4bca`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b6c4bca158e4cee1ae4abd08b7e55216ebffba2d)) ### Code Style - Fix ruff import sorting issue - ([`4493a69`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4493a693332e0532d04ad3634de2a2f5b1249b64)) + ([`4493a69`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4493a693332e0532d04ad3634de2a2f5b1249b64)) ### Features - Add configurable environment variable override system - ([`93ce698`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/93ce6987b6e7d8678ffa5ac51f5106a7a21ce67b)) + ([`93ce698`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/93ce6987b6e7d8678ffa5ac51f5106a7a21ce67b)) ## v5.15.0 (2025-10-01) @@ -954,37 +967,37 @@ ### Chores - Sync version to config.py [skip ci] - ([`b0fe956`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b0fe956f8a50240507e0fc911f0800634c15e9f7)) + ([`b0fe956`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b0fe956f8a50240507e0fc911f0800634c15e9f7)) ### Features - Depending on the number of tools in use, this change should save ~50% of overall tokens used. - fixes https://github.com/BeehiveInnovations/zen-mcp-server/issues/255 but also refactored + fixes https://github.com/BeehiveInnovations/pal-mcp-server/issues/255 but also refactored individual tools to instead encourage the agent to use the listmodels tool if needed. - ([`d9449c7`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d9449c7bb607caff3f0454f210ddfc36256c738a)) + ([`d9449c7`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d9449c7bb607caff3f0454f210ddfc36256c738a)) ### Performance Improvements - Tweaks to schema descriptions, aiming to reduce token usage without performance degradation - ([`cc8a4df`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/cc8a4dfd21b6f3dae4972a833b619e53c964693b)) + ([`cc8a4df`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/cc8a4dfd21b6f3dae4972a833b619e53c964693b)) ### Refactoring - Trimmed some prompts - ([`f69ff03`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/f69ff03c4d10e606a1dfed2a167f3ba2e2236ba8)) + ([`f69ff03`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/f69ff03c4d10e606a1dfed2a167f3ba2e2236ba8)) ## v5.14.1 (2025-10-01) ### Bug Fixes -- Https://github.com/BeehiveInnovations/zen-mcp-server/issues/258 - ([`696b45f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/696b45f25e80faccb67034254cf9a8fc4c643dbd)) +- Https://github.com/BeehiveInnovations/pal-mcp-server/issues/258 + ([`696b45f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/696b45f25e80faccb67034254cf9a8fc4c643dbd)) ### Chores - Sync version to config.py [skip ci] - ([`692016c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/692016c6205ed0a0c3d9e830482d88231aca2e31)) + ([`692016c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/692016c6205ed0a0c3d9e830482d88231aca2e31)) ## v5.14.0 (2025-10-01) @@ -992,17 +1005,17 @@ ### Chores - Sync version to config.py [skip ci] - ([`c0f822f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c0f822ffa23292d668f7b5dd3cb62e3f23fb29af)) + ([`c0f822f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c0f822ffa23292d668f7b5dd3cb62e3f23fb29af)) ### Features - Add Claude Sonnet 4.5 and update alias configuration - ([`95c4822`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/95c4822af2dc55f59c0e4ed9454673d6ca964731)) + ([`95c4822`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/95c4822af2dc55f59c0e4ed9454673d6ca964731)) ### Testing - Update tests to match new Claude Sonnet 4.5 alias configuration - ([`7efb409`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7efb4094d4eb7db006340d3d9240b9113ac25cd3)) + ([`7efb409`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7efb4094d4eb7db006340d3d9240b9113ac25cd3)) ## v5.13.0 (2025-10-01) @@ -1010,20 +1023,20 @@ ### Bug Fixes - Add sonnet alias for Claude Sonnet 4.1 to match opus/haiku pattern - ([`dc96344`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/dc96344db043e087ee4f8bf264a79c51dc2e0b7a)) + ([`dc96344`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/dc96344db043e087ee4f8bf264a79c51dc2e0b7a)) - Missing "optenai/" in name - ([`7371ed6`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/7371ed6487b7d90a1b225a67dca2a38c1a52f2ad)) + ([`7371ed6`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/7371ed6487b7d90a1b225a67dca2a38c1a52f2ad)) ### Chores - Sync version to config.py [skip ci] - ([`b8479fc`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/b8479fc638083d6caa4bad6205e3d3fcab830aca)) + ([`b8479fc`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/b8479fc638083d6caa4bad6205e3d3fcab830aca)) ### Features - Add comprehensive GPT-5 series model support - ([`4930824`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/493082405237e66a2f033481a5f8bf8293b0d553)) + ([`4930824`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/493082405237e66a2f033481a5f8bf8293b0d553)) ## v5.12.1 (2025-10-01) @@ -1031,22 +1044,22 @@ ### Bug Fixes - Resolve consensus tool model_context parameter missing issue - ([`9044b63`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9044b63809113047fe678d659e4fcd175f58e87a)) + ([`9044b63`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9044b63809113047fe678d659e4fcd175f58e87a)) ### Chores - Sync version to config.py [skip ci] - ([`e3ebf4e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/e3ebf4e94eba63acdc4df5a0b0493e44e3343dd1)) + ([`e3ebf4e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/e3ebf4e94eba63acdc4df5a0b0493e44e3343dd1)) ### Code Style - Fix trailing whitespace in consensus.py - ([`0760b31`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/0760b31f8a6d03c4bea3fd2a94dfbbfab0ad5079)) + ([`0760b31`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/0760b31f8a6d03c4bea3fd2a94dfbbfab0ad5079)) ### Refactoring - Optimize ModelContext creation in consensus tool - ([`30a8952`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/30a8952fbccd22bebebd14eb2c8005404b79bcd6)) + ([`30a8952`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/30a8952fbccd22bebebd14eb2c8005404b79bcd6)) ## v5.12.0 (2025-10-01) @@ -1056,17 +1069,17 @@ - Removed use_websearch; this parameter was confusing Codex. It started using this to prompt the external model to perform searches! web-search is enabled by Claude / Codex etc by default and the external agent can ask claude to search on its behalf. - ([`cff6d89`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/cff6d8998f64b73265c4e31b2352462d6afe377f)) + ([`cff6d89`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/cff6d8998f64b73265c4e31b2352462d6afe377f)) ### Chores - Sync version to config.py [skip ci] - ([`28cabe0`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/28cabe0833661b0bab56d4227781ee2da332b00c)) + ([`28cabe0`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/28cabe0833661b0bab56d4227781ee2da332b00c)) ### Features - Implement semantic cassette matching for o3 models - ([`70fa088`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/70fa088c32ac4e6153d5e7b30a3e32022be2f908)) + ([`70fa088`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/70fa088c32ac4e6153d5e7b30a3e32022be2f908)) ## v5.11.2 (2025-10-01) @@ -1074,7 +1087,7 @@ ### Chores - Sync version to config.py [skip ci] - ([`4d6f1b4`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4d6f1b41005dee428c955e33f04f8f9f6259e662)) + ([`4d6f1b4`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4d6f1b41005dee428c955e33f04f8f9f6259e662)) ## v5.11.1 (2025-10-01) @@ -1082,17 +1095,17 @@ ### Bug Fixes - Remove duplicate OpenAI models from listmodels output - ([`c29e762`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/c29e7623ace257eb45396cdf8c19e1659e29edb9)) + ([`c29e762`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/c29e7623ace257eb45396cdf8c19e1659e29edb9)) ### Chores - Sync version to config.py [skip ci] - ([`1209064`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/12090646ee83f2368311d595d87ae947e46ddacd)) + ([`1209064`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/12090646ee83f2368311d595d87ae947e46ddacd)) ### Testing - Update OpenAI provider alias tests to match new format - ([`d13700c`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d13700c14c7ee3d092302837cb1726d17bab1ab8)) + ([`d13700c`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d13700c14c7ee3d092302837cb1726d17bab1ab8)) ## v5.11.0 (2025-08-26) @@ -1100,12 +1113,12 @@ ### Chores - Sync version to config.py [skip ci] - ([`9735469`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/973546990f2c45afa93f1aa6de33ff461ecf1a83)) + ([`9735469`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/973546990f2c45afa93f1aa6de33ff461ecf1a83)) ### Features - Codex CLI support - ([`ce56d16`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/ce56d16240ddcc476145a512561efe5c66438f0d)) + ([`ce56d16`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/ce56d16240ddcc476145a512561efe5c66438f0d)) ## v5.10.3 (2025-08-24) @@ -1113,29 +1126,29 @@ ### Bug Fixes - Address test failures and PR feedback - ([`6bd9d67`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/6bd9d6709acfb584ab30a0a4d6891cabdb6d3ccf)) + ([`6bd9d67`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/6bd9d6709acfb584ab30a0a4d6891cabdb6d3ccf)) - Resolve temperature handling issues for O3/custom models - ([#245](https://github.com/BeehiveInnovations/zen-mcp-server/pull/245), - [`3b4fd88`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/3b4fd88d7e9a3f09fea616a10cb3e9d6c1a0d63b)) + ([#245](https://github.com/BeehiveInnovations/pal-mcp-server/pull/245), + [`3b4fd88`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/3b4fd88d7e9a3f09fea616a10cb3e9d6c1a0d63b)) ### Chores - Sync version to config.py [skip ci] - ([`d6e6808`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d6e6808be525192ab8388c0f01bc1bbd016fc23a)) + ([`d6e6808`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d6e6808be525192ab8388c0f01bc1bbd016fc23a)) ## v5.10.2 (2025-08-24) ### Bug Fixes -- Another fix for https://github.com/BeehiveInnovations/zen-mcp-server/issues/251 - ([`a07036e`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/a07036e6805042895109c00f921c58a09caaa319)) +- Another fix for https://github.com/BeehiveInnovations/pal-mcp-server/issues/251 + ([`a07036e`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/a07036e6805042895109c00f921c58a09caaa319)) ### Chores - Sync version to config.py [skip ci] - ([`9da5c37`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/9da5c37809cbde19d0c7ffed273ae93ca883a016)) + ([`9da5c37`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/9da5c37809cbde19d0c7ffed273ae93ca883a016)) ## v5.10.0 (2025-08-22) @@ -1143,13 +1156,13 @@ ### Chores - Sync version to config.py [skip ci] - ([`1254205`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/12542054a214022d3f515e53367f5bf3a77fb289)) + ([`1254205`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/12542054a214022d3f515e53367f5bf3a77fb289)) ### Features - Refactored and tweaked model descriptions / schema to use fewer tokens at launch (average reduction per field description: 60-80%) without sacrificing tool effectiveness - ([`4b202f5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4b202f5d1d24cea1394adab26a976188f847bd09)) + ([`4b202f5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4b202f5d1d24cea1394adab26a976188f847bd09)) ## v5.9.0 (2025-08-21) @@ -1157,19 +1170,19 @@ ### Documentation - Update instructions for precommit - ([`90821b5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/90821b51ff653475d9fb1bc70b57951d963e8841)) + ([`90821b5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/90821b51ff653475d9fb1bc70b57951d963e8841)) ### Features - Refactored and improved codereview in line with precommit. Reviews are now either external (default) or internal. Takes away anxiety and loss of tokens when Claude incorrectly decides to be 'confident' about its own changes and bungle things up. - ([`80d21e5`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/80d21e57c0246762c0a306ede5b93d6aeb2315d8)) + ([`80d21e5`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/80d21e57c0246762c0a306ede5b93d6aeb2315d8)) ### Refactoring - Minor prompt tweaks - ([`d30c212`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/d30c212029c05b767d99b5391c1dd4cee78ef336)) + ([`d30c212`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/d30c212029c05b767d99b5391c1dd4cee78ef336)) ## v5.8.6 (2025-08-20) @@ -1177,18 +1190,18 @@ ### Bug Fixes - Escape backslashes in TOML regex pattern - ([`1c973af`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/1c973afb002650b9bbee8a831b756bef848915a1)) + ([`1c973af`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/1c973afb002650b9bbee8a831b756bef848915a1)) - Establish version 5.8.6 and add version sync automation - ([`90a4195`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/90a419538128b54fbd30da4b8a8088ac59f8c691)) + ([`90a4195`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/90a419538128b54fbd30da4b8a8088ac59f8c691)) - Restore proper version 5.8.6 - ([`340b58f`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/340b58f2e790b84c3736aa96df7f6f5f2d6a13c9)) + ([`340b58f`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/340b58f2e790b84c3736aa96df7f6f5f2d6a13c9)) ### Chores - Sync version to config.py [skip ci] - ([`4f82f65`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/4f82f6500502b7b6ba41875a560c41f6a63b683b)) + ([`4f82f65`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/4f82f6500502b7b6ba41875a560c41f6a63b683b)) ## v1.1.0 (2025-08-20) @@ -1196,7 +1209,7 @@ ### Features - Improvements to precommit - ([`2966dcf`](https://github.com/BeehiveInnovations/zen-mcp-server/commit/2966dcf2682feb7eef4073738d0c225a44ce0533)) + ([`2966dcf`](https://github.com/BeehiveInnovations/pal-mcp-server/commit/2966dcf2682feb7eef4073738d0c225a44ce0533)) ## v1.0.0 (2025-08-20) diff --git a/CLAUDE.md b/CLAUDE.md index 89db9d9..9ca56ab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ -# Claude Development Guide for Zen MCP Server +# Claude Development Guide for PAL MCP Server -This file contains essential commands and workflows for developing and maintaining the Zen MCP Server when working with Claude. Use these instructions to efficiently run quality checks, manage the server, check logs, and run tests. +This file contains essential commands and workflows for developing and maintaining the PAL MCP Server when working with Claude. Use these instructions to efficiently run quality checks, manage the server, check logs, and run tests. ## Quick Reference Commands @@ -237,7 +237,7 @@ python -m pytest tests/ -v ### Development Workflow #### Before Making Changes -1. Ensure virtual environment is activated: `source .zen_venv/bin/activate` +1. Ensure virtual environment is activated: `source .pal_venv/bin/activate` 2. Run quality checks: `./code_quality_checks.sh` 3. Check logs to ensure server is healthy: `tail -n 50 logs/mcp_server.log` @@ -268,7 +268,7 @@ grep "ERROR" logs/mcp_server.log | tail -20 # Check virtual environment which python -# Should show: .../zen-mcp-server/.zen_venv/bin/python +# Should show: .../pal-mcp-server/.pal_venv/bin/python ``` #### Test Failures @@ -317,4 +317,4 @@ isort --check-only . - All dependencies from `requirements.txt` installed - Proper API keys configured in `.env` file -This guide provides everything needed to efficiently work with the Zen MCP Server codebase using Claude. Always run quality checks before and after making changes to ensure code integrity. \ No newline at end of file +This guide provides everything needed to efficiently work with the PAL MCP Server codebase using Claude. Always run quality checks before and after making changes to ensure code integrity. \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index adbf239..be567ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,18 +29,18 @@ RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \ FROM python:3.11-slim AS runtime # Add metadata labels for traceability -LABEL maintainer="Zen MCP Server Team" +LABEL maintainer="PAL MCP Server Team" LABEL version="1.0.0" -LABEL description="Zen MCP Server - AI-powered Model Context Protocol server" -LABEL org.opencontainers.image.title="zen-mcp-server" +LABEL description="PAL MCP Server - AI-powered Model Context Protocol server" +LABEL org.opencontainers.image.title="pal-mcp-server" LABEL org.opencontainers.image.description="AI-powered Model Context Protocol server with multi-provider support" LABEL org.opencontainers.image.version="1.0.0" -LABEL org.opencontainers.image.source="https://github.com/BeehiveInnovations/zen-mcp-server" -LABEL org.opencontainers.image.documentation="https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/README.md" +LABEL org.opencontainers.image.source="https://github.com/BeehiveInnovations/pal-mcp-server" +LABEL org.opencontainers.image.documentation="https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/README.md" LABEL org.opencontainers.image.licenses="Apache 2.0 License" # Create non-root user for security -RUN groupadd -r zenuser && useradd -r -g zenuser zenuser +RUN groupadd -r paluser && useradd -r -g paluser paluser # Install minimal runtime dependencies RUN apt-get update && apt-get install -y \ @@ -57,20 +57,20 @@ ENV PATH="/opt/venv/bin:$PATH" WORKDIR /app # Copy application code -COPY --chown=zenuser:zenuser . . +COPY --chown=paluser:paluser . . # Create logs directory with proper permissions -RUN mkdir -p logs && chown -R zenuser:zenuser logs +RUN mkdir -p logs && chown -R paluser:paluser logs # Create tmp directory for container operations -RUN mkdir -p tmp && chown -R zenuser:zenuser tmp +RUN mkdir -p tmp && chown -R paluser:paluser tmp # Copy health check script -COPY --chown=zenuser:zenuser docker/scripts/healthcheck.py /usr/local/bin/healthcheck.py +COPY --chown=paluser:paluser docker/scripts/healthcheck.py /usr/local/bin/healthcheck.py RUN chmod +x /usr/local/bin/healthcheck.py # Switch to non-root user -USER zenuser +USER paluser # Health check configuration HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ diff --git a/README.md b/README.md index 709dec6..e4bc45f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ -# Zen MCP: Many Workflows. One Context. +# PAL MCP: Many Workflows. One Context.
- [Zen in action](https://github.com/user-attachments/assets/0d26061e-5f21-4ab1-b7d0-f883ddc2c3da) + Your AI's PAL – a Provider Abstraction Layer
+ Formerly known as Zen MCP + + [PAL in action](https://github.com/user-attachments/assets/0d26061e-5f21-4ab1-b7d0-f883ddc2c3da) 👉 **[Watch more examples](#-watch-tools-in-action)** @@ -44,24 +47,24 @@ Continue with clink gemini - implement the recommended feature --- -## Why Zen MCP? +## Why PAL MCP? **Why rely on one AI model when you can orchestrate them all?** A Model Context Protocol server that supercharges tools like [Claude Code](https://www.anthropic.com/claude-code), [Codex CLI](https://developers.openai.com/codex/cli), and IDE clients such -as [Cursor](https://cursor.com) or the [Claude Dev VS Code extension](https://marketplace.visualstudio.com/items?itemName=Anthropic.claude-vscode). **Zen MCP connects your favorite AI tool +as [Cursor](https://cursor.com) or the [Claude Dev VS Code extension](https://marketplace.visualstudio.com/items?itemName=Anthropic.claude-vscode). **PAL MCP connects your favorite AI tool to multiple AI models** for enhanced code analysis, problem-solving, and collaborative development. ### True AI Collaboration with Conversation Continuity -Zen supports **conversation threading** so your CLI can **discuss ideas with multiple AI models, exchange reasoning, get second opinions, and even run collaborative debates between models** to help you reach deeper insights and better solutions. +PAL supports **conversation threading** so your CLI can **discuss ideas with multiple AI models, exchange reasoning, get second opinions, and even run collaborative debates between models** to help you reach deeper insights and better solutions. Your CLI always stays in control but gets perspectives from the best AI for each subtask. Context carries forward seamlessly across tools and models, enabling complex workflows like: code reviews with multiple models → automated planning → implementation → pre-commit validation. > **You're in control.** Your CLI of choice orchestrates the AI team, but you decide the workflow. Craft powerful prompts that bring in Gemini Pro, GPT 5, Flash, or local offline models exactly when needed.
-Reasons to Use Zen MCP +Reasons to Use PAL MCP A typical workflow with Claude Code as an example: @@ -111,7 +114,7 @@ and review into consideration to aid with its final pre-commit review. **Think of it as Claude Code _for_ Claude Code.** This MCP isn't magic. It's just **super-glue**. > **Remember:** Claude stays in full control — but **YOU** call the shots. -> Zen is designed to have Claude engage other models only when needed — and to follow through with meaningful back-and-forth. +> PAL is designed to have Claude engage other models only when needed — and to follow through with meaningful back-and-forth. > **You're** the one who crafts the powerful prompt that makes Claude bring in Gemini, Flash, O3 — or fly solo. > You're the guide. The prompter. The puppeteer. > #### You are the AI - **Actually Intelligent**. @@ -154,8 +157,8 @@ For best results when using [Codex CLI](https://developers.openai.com/codex/cli) **Option A: Clone and Automatic Setup** (recommended) ```bash -git clone https://github.com/BeehiveInnovations/zen-mcp-server.git -cd zen-mcp-server +git clone https://github.com/BeehiveInnovations/pal-mcp-server.git +cd pal-mcp-server # Handles everything: setup, config, API keys from system environment. # Auto-configures Claude Desktop, Claude Code, Gemini CLI, Codex CLI, Qwen CLI @@ -169,9 +172,9 @@ cd zen-mcp-server // Don't forget to add your API keys under env { "mcpServers": { - "zen": { + "pal": { "command": "bash", - "args": ["-c", "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1"], + "args": ["-c", "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1"], "env": { "PATH": "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin", "GEMINI_API_KEY": "your-key-here", @@ -185,9 +188,9 @@ cd zen-mcp-server **3. Start Using!** ``` -"Use zen to analyze this code for security issues with gemini pro" +"Use pal to analyze this code for security issues with gemini pro" "Debug this error with o3 and then get flash to suggest optimizations" -"Plan the migration strategy with zen, get consensus from multiple models" +"Plan the migration strategy with pal, get consensus from multiple models" "clink with cli_name=\"gemini\" role=\"planner\" to draft a phased rollout plan" ``` @@ -197,7 +200,7 @@ cd zen-mcp-server ## Provider Configuration -Zen activates any provider that has credentials in your `.env`. See `.env.example` for deeper customization. +PAL activates any provider that has credentials in your `.env`. See `.env.example` for deeper customization. ## Core Tools @@ -265,7 +268,7 @@ DISABLED_TOOLS= // In ~/.claude/settings.json or .mcp.json { "mcpServers": { - "zen": { + "pal": { "env": { // Tool configuration "DISABLED_TOOLS": "refactor,testgen,secaudit,docgen,tracer", @@ -292,7 +295,7 @@ DISABLED_TOOLS= // Remove or empty the DISABLED_TOOLS to enable everything { "mcpServers": { - "zen": { + "pal": { "env": { "DISABLED_TOOLS": "" } @@ -328,7 +331,7 @@ DISABLED_TOOLS= **Multi-model consensus debate:** -[Zen Consensus Debate](https://github.com/user-attachments/assets/76a23dd5-887a-4382-9cf0-642f5cf6219e) +[PAL Consensus Debate](https://github.com/user-attachments/assets/76a23dd5-887a-4382-9cf0-642f5cf6219e)
@@ -346,26 +349,26 @@ DISABLED_TOOLS=
API Lookup Tool - Current vs outdated API documentation -**Without Zen - outdated APIs:** +**Without PAL - outdated APIs:** -[API without Zen](https://github.com/user-attachments/assets/01a79dc9-ad16-4264-9ce1-76a56c3580ee) +[API without PAL](https://github.com/user-attachments/assets/01a79dc9-ad16-4264-9ce1-76a56c3580ee) -**With Zen - current APIs:** +**With PAL - current APIs:** -[API with Zen](https://github.com/user-attachments/assets/5c847326-4b66-41f7-8f30-f380453dce22) +[API with PAL](https://github.com/user-attachments/assets/5c847326-4b66-41f7-8f30-f380453dce22)
Challenge Tool - Critical thinking vs reflexive agreement -**Without Zen:** +**Without PAL:** -![without_zen@2x](https://github.com/user-attachments/assets/64f3c9fb-7ca9-4876-b687-25e847edfd87) +![without_pal@2x](https://github.com/user-attachments/assets/64f3c9fb-7ca9-4876-b687-25e847edfd87) -**With Zen:** +**With PAL:** -![with_zen@2x](https://github.com/user-attachments/assets/9d72f444-ba53-4ab1-83e5-250062c6ee70) +![with_pal@2x](https://github.com/user-attachments/assets/9d72f444-ba53-4ab1-83e5-250062c6ee70)
@@ -444,4 +447,4 @@ Built with the power of **Multi-Model AI** collaboration 🤝 ### Star History -[![Star History Chart](https://api.star-history.com/svg?repos=BeehiveInnovations/zen-mcp-server&type=Date)](https://www.star-history.com/#BeehiveInnovations/zen-mcp-server&Date) +[![Star History Chart](https://api.star-history.com/svg?repos=BeehiveInnovations/pal-mcp-server&type=Date)](https://www.star-history.com/#BeehiveInnovations/pal-mcp-server&Date) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..9c968e3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,81 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 9.x.x | :white_check_mark: | +| < 9.0 | :x: | + +## Important Disclaimer + +PAL MCP is an open-source Model Context Protocol (MCP) server that acts as middleware between AI clients (Claude Code, Codex CLI, Cursor, etc.) and various AI model providers. + +**Please understand the following:** + +- **No Warranty**: This software is provided "AS IS" under the Apache 2.0 License, without warranties of any kind. See the [LICENSE](LICENSE) file for full terms. +- **User Responsibility**: The AI client (not PAL MCP) controls tool invocations and workflows. Users are responsible for reviewing AI-generated outputs and actions. +- **API Key Security**: You are responsible for securing your own API keys. Never commit keys to version control or share them publicly. +- **Third-Party Services**: PAL MCP connects to external AI providers (Google, OpenAI, Azure, etc.). Their terms of service and privacy policies apply to data sent through this server. + +## Reporting a Vulnerability + +**Please do not report security vulnerabilities through public GitHub issues.** + +### Preferred Method + +Use [GitHub Security Advisories](https://github.com/BeehiveInnovations/pal-mcp-server/security/advisories/new) to report vulnerabilities privately. + +### What to Include + +- Description of the vulnerability +- Steps to reproduce +- Affected versions +- Potential impact +- Suggested fix (optional) + +### What to Expect + +- We will acknowledge your report and assess the issue +- Critical issues will be prioritized +- We'll keep you informed of progress as work proceeds + +We cannot commit to specific response timelines, but we take security seriously. + +### After Resolution + +We welcome security researchers to submit a pull request with the fix. This is an open-source project and we appreciate community contributions to improve security. + +## Disclosure Policy + +We practice coordinated disclosure. Please allow reasonable time to address issues before public disclosure. We'll work with you on timing. + +## Scope + +### In Scope + +- Authentication/authorization bypasses +- Injection vulnerabilities (command injection, prompt injection with security impact) +- Information disclosure (API keys, sensitive data leakage) +- Denial of service vulnerabilities in the MCP server itself +- Dependency vulnerabilities with exploitable impact + +### Out of Scope + +- Issues in upstream AI providers (report to Google, OpenAI, etc. directly) +- Issues in AI client software (report to Anthropic, OpenAI, Cursor, etc.) +- AI model behavior or outputs (this is controlled by the AI client and model providers) +- Social engineering attacks +- Rate limiting or resource exhaustion on third-party APIs + +## Security Best Practices for Users + +1. **Protect API Keys**: Store keys in `.env` files (gitignored) or environment variables +2. **Review AI Actions**: Always review AI-suggested code changes before applying +3. **Use Local Models**: For sensitive codebases, consider using Ollama with local models +4. **Network Security**: When self-hosting, ensure appropriate network controls +5. **Keep Updated**: Regularly update to the latest version for security fixes + +## Recognition + +We appreciate responsible disclosure and will credit security researchers in release notes (unless you prefer anonymity). diff --git a/claude_config_example.json b/claude_config_example.json index fa2e7d9..83fb819 100644 --- a/claude_config_example.json +++ b/claude_config_example.json @@ -1,11 +1,11 @@ { - "comment": "Example Claude Desktop configuration for Zen MCP Server", + "comment": "Example Claude Desktop configuration for PAL MCP Server", "comment2": "Run './run-server.sh -c' to get the exact configuration for your system", "comment3": "For platform-specific examples, see the examples/ directory", "mcpServers": { - "zen": { - "command": "/path/to/zen-mcp-server/.zen_venv/bin/python", - "args": ["/path/to/zen-mcp-server/server.py"] + "pal": { + "command": "/path/to/pal-mcp-server/.pal_venv/bin/python", + "args": ["/path/to/pal-mcp-server/server.py"] } } } \ No newline at end of file diff --git a/clink/constants.py b/clink/constants.py index 3431e86..54b8caf 100644 --- a/clink/constants.py +++ b/clink/constants.py @@ -11,7 +11,7 @@ DEFAULT_STREAM_LIMIT = 10 * 1024 * 1024 # 10MB per stream PROJECT_ROOT = Path(__file__).resolve().parent.parent BUILTIN_PROMPTS_DIR = PROJECT_ROOT / "systemprompts" / "clink" CONFIG_DIR = PROJECT_ROOT / "conf" / "cli_clients" -USER_CONFIG_DIR = Path.home() / ".zen" / "cli_clients" +USER_CONFIG_DIR = Path.home() / ".pal" / "cli_clients" @dataclass(frozen=True) diff --git a/clink/registry.py b/clink/registry.py index 53ccdb2..7942028 100644 --- a/clink/registry.py +++ b/clink/registry.py @@ -102,7 +102,7 @@ class ClinkRegistry: env_path = Path(env_path_raw).expanduser() search_paths.append(env_path) - # 3. User overrides in ~/.zen/cli_clients + # 3. User overrides in ~/.pal/cli_clients search_paths.append(USER_CONFIG_DIR) seen: set[Path] = set() diff --git a/code_quality_checks.ps1 b/code_quality_checks.ps1 index 73e3dcc..3222c43 100644 --- a/code_quality_checks.ps1 +++ b/code_quality_checks.ps1 @@ -1,9 +1,9 @@ <# .SYNOPSIS - Code quality checks script for Zen MCP server on Windows. + Code quality checks script for PAL MCP server on Windows. .DESCRIPTION - This PowerShell script performs code quality checks for the Zen MCP server project: + This PowerShell script performs code quality checks for the PAL MCP server project: - Runs static analysis and linting tools on the codebase - Ensures code style compliance and detects potential issues - Can be integrated into CI/CD pipelines or used locally before commits @@ -26,7 +26,7 @@ Script Author : GiGiDKR (https://github.com/GiGiDKR) Date : 07-05-2025 Version : See project documentation - References : https://github.com/BeehiveInnovations/zen-mcp-server + References : https://github.com/BeehiveInnovations/pal-mcp-server #> #Requires -Version 5.1 [CmdletBinding()] @@ -61,23 +61,23 @@ function Write-Emoji { Write-ColorText $Text -Color $Color } -Write-Emoji "🔍" "Running Code Quality Checks for Zen MCP Server" -Color Cyan +Write-Emoji "🔍" "Running Code Quality Checks for PAL MCP Server" -Color Cyan Write-ColorText "=================================================" -Color Cyan # Determine Python command $pythonCmd = $null $pipCmd = $null -if (Test-Path ".zen_venv") { +if (Test-Path ".pal_venv") { if ($IsWindows -or $env:OS -eq "Windows_NT") { - if (Test-Path ".zen_venv\Scripts\python.exe") { - $pythonCmd = ".zen_venv\Scripts\python.exe" - $pipCmd = ".zen_venv\Scripts\pip.exe" + if (Test-Path ".pal_venv\Scripts\python.exe") { + $pythonCmd = ".pal_venv\Scripts\python.exe" + $pipCmd = ".pal_venv\Scripts\pip.exe" } } else { - if (Test-Path ".zen_venv/bin/python") { - $pythonCmd = ".zen_venv/bin/python" - $pipCmd = ".zen_venv/bin/pip" + if (Test-Path ".pal_venv/bin/python") { + $pythonCmd = ".pal_venv/bin/python" + $pipCmd = ".pal_venv/bin/pip" } } @@ -108,11 +108,11 @@ foreach ($tool in $devTools) { # Check in venv if ($IsWindows -or $env:OS -eq "Windows_NT") { - if (Test-Path ".zen_venv\Scripts\$tool.exe") { + if (Test-Path ".pal_venv\Scripts\$tool.exe") { $toolFound = $true } } else { - if (Test-Path ".zen_venv/bin/$tool") { + if (Test-Path ".pal_venv/bin/$tool") { $toolFound = $true } } @@ -152,15 +152,15 @@ if ($devDepsNeeded) { # Set tool paths if ($IsWindows -or $env:OS -eq "Windows_NT") { - $ruffCmd = if (Test-Path ".zen_venv\Scripts\ruff.exe") { ".zen_venv\Scripts\ruff.exe" } else { "ruff" } - $blackCmd = if (Test-Path ".zen_venv\Scripts\black.exe") { ".zen_venv\Scripts\black.exe" } else { "black" } - $isortCmd = if (Test-Path ".zen_venv\Scripts\isort.exe") { ".zen_venv\Scripts\isort.exe" } else { "isort" } - $pytestCmd = if (Test-Path ".zen_venv\Scripts\pytest.exe") { ".zen_venv\Scripts\pytest.exe" } else { "pytest" } + $ruffCmd = if (Test-Path ".pal_venv\Scripts\ruff.exe") { ".pal_venv\Scripts\ruff.exe" } else { "ruff" } + $blackCmd = if (Test-Path ".pal_venv\Scripts\black.exe") { ".pal_venv\Scripts\black.exe" } else { "black" } + $isortCmd = if (Test-Path ".pal_venv\Scripts\isort.exe") { ".pal_venv\Scripts\isort.exe" } else { "isort" } + $pytestCmd = if (Test-Path ".pal_venv\Scripts\pytest.exe") { ".pal_venv\Scripts\pytest.exe" } else { "pytest" } } else { - $ruffCmd = if (Test-Path ".zen_venv/bin/ruff") { ".zen_venv/bin/ruff" } else { "ruff" } - $blackCmd = if (Test-Path ".zen_venv/bin/black") { ".zen_venv/bin/black" } else { "black" } - $isortCmd = if (Test-Path ".zen_venv/bin/isort") { ".zen_venv/bin/isort" } else { "isort" } - $pytestCmd = if (Test-Path ".zen_venv/bin/pytest") { ".zen_venv/bin/pytest" } else { "pytest" } + $ruffCmd = if (Test-Path ".pal_venv/bin/ruff") { ".pal_venv/bin/ruff" } else { "ruff" } + $blackCmd = if (Test-Path ".pal_venv/bin/black") { ".pal_venv/bin/black" } else { "black" } + $isortCmd = if (Test-Path ".pal_venv/bin/isort") { ".pal_venv/bin/isort" } else { "isort" } + $pytestCmd = if (Test-Path ".pal_venv/bin/pytest") { ".pal_venv/bin/pytest" } else { "pytest" } } Write-Host "" @@ -172,25 +172,25 @@ if (!$SkipLinting) { try { Write-Emoji "🔧" "Running ruff linting with auto-fix..." -Color Yellow - & $ruffCmd check --fix --exclude test_simulation_files --exclude .zen_venv + & $ruffCmd check --fix --exclude test_simulation_files --exclude .pal_venv if ($LASTEXITCODE -ne 0) { throw "Ruff linting failed" } Write-Emoji "🎨" "Running black code formatting..." -Color Yellow - & $blackCmd . --exclude="test_simulation_files/" --exclude=".zen_venv/" + & $blackCmd . --exclude="test_simulation_files/" --exclude=".pal_venv/" if ($LASTEXITCODE -ne 0) { throw "Black formatting failed" } Write-Emoji "📦" "Running import sorting with isort..." -Color Yellow - & $isortCmd . --skip-glob=".zen_venv/*" --skip-glob="test_simulation_files/*" + & $isortCmd . --skip-glob=".pal_venv/*" --skip-glob="test_simulation_files/*" if ($LASTEXITCODE -ne 0) { throw "Import sorting failed" } Write-Emoji "✅" "Verifying all linting passes..." -Color Yellow - & $ruffCmd check --exclude test_simulation_files --exclude .zen_venv + & $ruffCmd check --exclude test_simulation_files --exclude .pal_venv if ($LASTEXITCODE -ne 0) { throw "Final linting verification failed" } diff --git a/code_quality_checks.sh b/code_quality_checks.sh index 8529543..d58dcbf 100755 --- a/code_quality_checks.sh +++ b/code_quality_checks.sh @@ -1,18 +1,18 @@ #!/bin/bash -# Zen MCP Server - Code Quality Checks +# PAL MCP Server - Code Quality Checks # This script runs all required linting and testing checks before committing changes. # ALL checks must pass 100% for CI/CD to succeed. set -e # Exit on any error -echo "🔍 Running Code Quality Checks for Zen MCP Server" +echo "🔍 Running Code Quality Checks for PAL MCP Server" echo "=================================================" # Determine Python command -if [[ -f ".zen_venv/bin/python" ]]; then - PYTHON_CMD=".zen_venv/bin/python" - PIP_CMD=".zen_venv/bin/pip" +if [[ -f ".pal_venv/bin/python" ]]; then + PYTHON_CMD=".pal_venv/bin/python" + PIP_CMD=".pal_venv/bin/pip" echo "✅ Using venv" elif [[ -n "$VIRTUAL_ENV" ]]; then PYTHON_CMD="python" @@ -32,7 +32,7 @@ DEV_DEPS_NEEDED=false # Check each dev dependency for tool in ruff black isort pytest; do # Check if tool exists in venv or in PATH - if [[ -f ".zen_venv/bin/$tool" ]] || command -v $tool &> /dev/null; then + if [[ -f ".pal_venv/bin/$tool" ]] || command -v $tool &> /dev/null; then continue else DEV_DEPS_NEEDED=true @@ -49,11 +49,11 @@ else fi # Set tool paths -if [[ -f ".zen_venv/bin/ruff" ]]; then - RUFF=".zen_venv/bin/ruff" - BLACK=".zen_venv/bin/black" - ISORT=".zen_venv/bin/isort" - PYTEST=".zen_venv/bin/pytest" +if [[ -f ".pal_venv/bin/ruff" ]]; then + RUFF=".pal_venv/bin/ruff" + BLACK=".pal_venv/bin/black" + ISORT=".pal_venv/bin/isort" + PYTEST=".pal_venv/bin/pytest" else RUFF="ruff" BLACK="black" @@ -67,16 +67,16 @@ echo "📋 Step 1: Running Linting and Formatting Checks" echo "--------------------------------------------------" echo "🔧 Running ruff linting with auto-fix..." -$RUFF check --fix --exclude test_simulation_files --exclude .zen_venv +$RUFF check --fix --exclude test_simulation_files --exclude .pal_venv echo "🎨 Running black code formatting..." -$BLACK . --exclude="test_simulation_files/" --exclude=".zen_venv/" +$BLACK . --exclude="test_simulation_files/" --exclude=".pal_venv/" echo "📦 Running import sorting with isort..." -$ISORT . --skip-glob=".zen_venv/*" --skip-glob="test_simulation_files/*" +$ISORT . --skip-glob=".pal_venv/*" --skip-glob="test_simulation_files/*" echo "✅ Verifying all linting passes..." -$RUFF check --exclude test_simulation_files --exclude .zen_venv +$RUFF check --exclude test_simulation_files --exclude .pal_venv echo "✅ Step 1 Complete: All linting and formatting checks passed!" echo "" diff --git a/communication_simulator_test.py b/communication_simulator_test.py index 55b1a92..4281cc3 100644 --- a/communication_simulator_test.py +++ b/communication_simulator_test.py @@ -1,7 +1,7 @@ """ -Communication Simulator Test for Zen MCP Server +Communication Simulator Test for PAL MCP Server -This script provides comprehensive end-to-end testing of the Zen MCP server +This script provides comprehensive end-to-end testing of the PAL MCP Server by simulating real Claude CLI communications and validating conversation continuity, file handling, deduplication features, and clarification scenarios. @@ -145,10 +145,10 @@ class CommunicationSimulator: if os.path.exists(venv_python): return venv_python - # Try .zen_venv as fallback - zen_venv_python = os.path.join(current_dir, ".zen_venv", "bin", "python") - if os.path.exists(zen_venv_python): - return zen_venv_python + # Try .pal_venv as fallback + pal_venv_python = os.path.join(current_dir, ".pal_venv", "bin", "python") + if os.path.exists(pal_venv_python): + return pal_venv_python # Fallback to system python if venv doesn't exist self.logger.warning("Virtual environment not found, using system python") @@ -361,7 +361,7 @@ class CommunicationSimulator: def print_test_summary(self): """Print comprehensive test results summary""" self.logger.info("\n" + "=" * 70) - self.logger.info("ZEN MCP COMMUNICATION SIMULATOR - TEST RESULTS SUMMARY") + self.logger.info("PAL MCP COMMUNICATION SIMULATOR - TEST RESULTS SUMMARY") self.logger.info("=" * 70) passed_count = sum(1 for result in self.test_results.values() if result) @@ -388,7 +388,7 @@ class CommunicationSimulator: def run_full_test_suite(self) -> bool: """Run the complete test suite""" try: - self.logger.info("Starting Zen MCP Communication Simulator Test Suite") + self.logger.info("Starting PAL MCP Communication Simulator Test Suite") # Setup if not self.setup_test_environment(): @@ -450,7 +450,7 @@ class CommunicationSimulator: def parse_arguments(): """Parse and validate command line arguments""" - parser = argparse.ArgumentParser(description="Zen MCP Communication Simulator Test") + parser = argparse.ArgumentParser(description="PAL MCP Communication Simulator Test") parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose logging") parser.add_argument("--keep-logs", action="store_true", help="Keep logs for inspection after test completion") parser.add_argument("--tests", "-t", nargs="+", help="Specific tests to run (space-separated)") diff --git a/conf/__init__.py b/conf/__init__.py index ee1bfd4..e268b53 100644 --- a/conf/__init__.py +++ b/conf/__init__.py @@ -1 +1 @@ -"""Configuration data for Zen MCP Server.""" +"""Configuration data for PAL MCP Server.""" diff --git a/conf/azure_models.json b/conf/azure_models.json index 898dfd1..42095fb 100644 --- a/conf/azure_models.json +++ b/conf/azure_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for Azure OpenAI / Azure AI Foundry-backed provider. The `models` definition can be copied from openrouter_models.json / custom_models.json", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/azure_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/azure_models.md", "usage": "Models listed here are exposed through Azure AI Foundry. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/custom_models.json b/conf/custom_models.json index 1934df3..b18464b 100644 --- a/conf/custom_models.json +++ b/conf/custom_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for local/self-hosted OpenAI-compatible endpoints (Custom provider).", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/custom_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/custom_models.md", "usage": "Each entry will be advertised by the Custom provider. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/dial_models.json b/conf/dial_models.json index 8c41987..3b038ee 100644 --- a/conf/dial_models.json +++ b/conf/dial_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for the DIAL (Data & AI Layer) aggregation provider.", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/configuration.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/configuration.md", "usage": "Models listed here are exposed through the DIAL provider. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/gemini_models.json b/conf/gemini_models.json index ee1a6ec..fed3747 100644 --- a/conf/gemini_models.json +++ b/conf/gemini_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for Google's Gemini API access.", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/custom_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/custom_models.md", "usage": "Models listed here are exposed directly through the Gemini provider. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/openai_models.json b/conf/openai_models.json index 2f47aa2..52e86a3 100644 --- a/conf/openai_models.json +++ b/conf/openai_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for native OpenAI API access.", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/custom_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/custom_models.md", "usage": "Models listed here are exposed directly through the OpenAI provider. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/openrouter_models.json b/conf/openrouter_models.json index 1c733f6..8270dc0 100644 --- a/conf/openrouter_models.json +++ b/conf/openrouter_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for OpenRouter-backed providers.", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/custom_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/custom_models.md", "usage": "Models listed here are exposed through OpenRouter. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/conf/xai_models.json b/conf/xai_models.json index 1d179d7..7d65fe9 100644 --- a/conf/xai_models.json +++ b/conf/xai_models.json @@ -1,7 +1,7 @@ { "_README": { "description": "Model metadata for X.AI (GROK) API access.", - "documentation": "https://github.com/BeehiveInnovations/zen-mcp-server/blob/main/docs/custom_models.md", + "documentation": "https://github.com/BeehiveInnovations/pal-mcp-server/blob/main/docs/custom_models.md", "usage": "Models listed here are exposed directly through the X.AI provider. Aliases are case-insensitive.", "field_notes": "Matches providers/shared/model_capabilities.py.", "field_descriptions": { diff --git a/config.py b/config.py index d9666e6..fa40f1c 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,7 @@ """ -Configuration and constants for Zen MCP Server +Configuration and constants for PAL MCP Server -This module centralizes all configuration settings for the Zen MCP Server. +This module centralizes all configuration settings for the PAL MCP Server. It defines model configurations, token limits, temperature defaults, and other constants used throughout the application. @@ -14,9 +14,9 @@ from utils.env import get_env # These values are used in server responses and for tracking releases # IMPORTANT: This is the single source of truth for version and author info # Semantic versioning: MAJOR.MINOR.PATCH -__version__ = "9.4.1" +__version__ = "9.4.2" # Last update date in ISO format -__updated__ = "2025-11-21" +__updated__ = "2025-12-05" # Primary maintainer __author__ = "Fahad Gilani" diff --git a/docker-compose.yml b/docker-compose.yml index 1acd79c..8564013 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,18 +1,18 @@ services: - zen-mcp: + pal-mcp: build: context: . dockerfile: Dockerfile target: runtime - image: zen-mcp-server:latest - container_name: zen-mcp-server + image: pal-mcp-server:latest + container_name: pal-mcp-server # Container labels for traceability labels: - - "com.zen-mcp.service=zen-mcp-server" - - "com.zen-mcp.version=1.0.0" - - "com.zen-mcp.environment=production" - - "com.zen-mcp.description=AI-powered Model Context Protocol server" + - "com.pal-mcp.service=pal-mcp-server" + - "com.pal-mcp.version=1.0.0" + - "com.pal-mcp.environment=production" + - "com.pal-mcp.description=AI-powered Model Context Protocol server" # Environment variables environment: @@ -51,12 +51,12 @@ services: # Volumes for persistent data volumes: - ./logs:/app/logs - - zen-mcp-config:/app/conf + - pal-mcp-config:/app/conf - /etc/localtime:/etc/localtime:ro # Network configuration networks: - - zen-network + - pal-network # Resource limits deploy: @@ -89,12 +89,12 @@ services: # Named volumes volumes: - zen-mcp-config: + pal-mcp-config: driver: local # Networks networks: - zen-network: + pal-network: driver: bridge ipam: config: diff --git a/docker/README.md b/docker/README.md index bf8c1e2..e524315 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,4 +1,4 @@ -# Zen MCP Server - Docker Setup +# PAL MCP Server - Docker Setup ## Quick Start @@ -22,7 +22,7 @@ nano .env ```bash # Build the Docker image -docker build -t zen-mcp-server:latest . +docker build -t pal-mcp-server:latest . # Or use the build script (Bash) chmod +x docker/scripts/build.sh @@ -41,14 +41,14 @@ docker/scripts/build.ps1 # Run with environment file docker run --rm -i --env-file .env \ -v $(pwd)/logs:/app/logs \ - zen-mcp-server:latest + pal-mcp-server:latest # Run with inline environment variables docker run --rm -i \ -e GEMINI_API_KEY="your_key_here" \ -e LOG_LEVEL=INFO \ -v $(pwd)/logs:/app/logs \ - zen-mcp-server:latest + pal-mcp-server:latest ``` #### B. Docker Compose (For Development/Monitoring) @@ -62,7 +62,7 @@ chmod +x docker/scripts/deploy.sh docker/scripts/deploy.ps1 # Interactive stdio mode -docker-compose exec zen-mcp python server.py +docker-compose exec pal-mcp python server.py ``` ## Service Management @@ -76,8 +76,8 @@ docker ps # View logs from container docker logs -# Stop all zen-mcp containers -docker stop $(docker ps -q --filter "ancestor=zen-mcp-server:latest") +# Stop all pal-mcp containers +docker stop $(docker ps -q --filter "ancestor=pal-mcp-server:latest") # Remove old containers and images docker container prune @@ -88,20 +88,20 @@ docker image prune ```bash # View logs -docker-compose logs -f zen-mcp +docker-compose logs -f pal-mcp # Check status docker-compose ps # Restart service -docker-compose restart zen-mcp +docker-compose restart pal-mcp # Stop services docker-compose down # Rebuild and update -docker-compose build --no-cache zen-mcp -docker-compose up -d zen-mcp +docker-compose build --no-cache pal-mcp +docker-compose up -d pal-mcp ``` ## Health Monitoring @@ -117,19 +117,19 @@ The container includes health checks that verify: The Docker setup includes persistent volumes to preserve data between container runs: - **`./logs:/app/logs`** - Persistent log storage (local folder mount) -- **`zen-mcp-config:/app/conf`** - Configuration persistence (named Docker volume) +- **`pal-mcp-config:/app/conf`** - Configuration persistence (named Docker volume) - **`/etc/localtime:/etc/localtime:ro`** - Host timezone synchronization (read-only) ### How Persistent Volumes Work -The `zen-mcp` service (used by `zen-docker-compose` and Docker Compose commands) mounts the named volume `zen-mcp-config` persistently. All data placed in `/app/conf` inside the container is preserved between runs thanks to this Docker volume. +The `pal-mcp` service (used by `pal-docker-compose` and Docker Compose commands) mounts the named volume `pal-mcp-config` persistently. All data placed in `/app/conf` inside the container is preserved between runs thanks to this Docker volume. In the `docker-compose.yml` file, you will find: ```yaml volumes: - ./logs:/app/logs - - zen-mcp-config:/app/conf + - pal-mcp-config:/app/conf - /etc/localtime:/etc/localtime:ro ``` @@ -137,13 +137,13 @@ and the named volume definition: ```yaml volumes: - zen-mcp-config: + pal-mcp-config: driver: local ``` ## Security -- Runs as non-root user `zenuser` +- Runs as non-root user `paluser` - Read-only filesystem with tmpfs for temporary files - No network ports exposed (stdio communication only) - Secrets managed via environment variables @@ -154,16 +154,16 @@ volumes: ```bash # Check if image exists -docker images zen-mcp-server +docker images pal-mcp-server # Test container interactively -docker run --rm -it --env-file .env zen-mcp-server:latest bash +docker run --rm -it --env-file .env pal-mcp-server:latest bash # Check environment variables -docker run --rm --env-file .env zen-mcp-server:latest env | grep API +docker run --rm --env-file .env pal-mcp-server:latest env | grep API # Test with minimal configuration -docker run --rm -i -e GEMINI_API_KEY="test" zen-mcp-server:latest python server.py +docker run --rm -i -e GEMINI_API_KEY="test" pal-mcp-server:latest python server.py ``` ### MCP Connection Issues @@ -173,7 +173,7 @@ docker run --rm -i -e GEMINI_API_KEY="test" zen-mcp-server:latest python server. docker run --rm hello-world # Verify container stdio -echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env zen-mcp-server:latest python server.py +echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env pal-mcp-server:latest python server.py # Check Claude Desktop logs for connection errors ``` @@ -182,10 +182,10 @@ echo '{"jsonrpc": "2.0", "method": "ping"}' | docker run --rm -i --env-file .env ```bash # Verify API keys are loaded -docker run --rm --env-file .env zen-mcp-server:latest python -c "import os; print('GEMINI_API_KEY:', bool(os.getenv('GEMINI_API_KEY')))" +docker run --rm --env-file .env pal-mcp-server:latest python -c "import os; print('GEMINI_API_KEY:', bool(os.getenv('GEMINI_API_KEY')))" # Test API connectivity -docker run --rm --env-file .env zen-mcp-server:latest python /usr/local/bin/healthcheck.py +docker run --rm --env-file .env pal-mcp-server:latest python /usr/local/bin/healthcheck.py ``` ### Permission Issues @@ -205,10 +205,10 @@ chmod 755 logs/ docker stats # Run with memory limits -docker run --rm -i --memory="512m" --env-file .env zen-mcp-server:latest +docker run --rm -i --memory="512m" --env-file .env pal-mcp-server:latest # Monitor Docker logs -docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log +docker run --rm -i --env-file .env pal-mcp-server:latest 2>&1 | tee docker.log ``` ## MCP Integration (Claude Desktop) @@ -218,17 +218,17 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log ```json { "servers": { - "zen-docker": { + "pal-docker": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", - "/absolute/path/to/zen-mcp-server/.env", + "/absolute/path/to/pal-mcp-server/.env", "-v", - "/absolute/path/to/zen-mcp-server/logs:/app/logs", - "zen-mcp-server:latest" + "/absolute/path/to/pal-mcp-server/logs:/app/logs", + "pal-mcp-server:latest" ] } } @@ -240,17 +240,17 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log ```json { "servers": { - "zen-docker": { + "pal-docker": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", - "C:/Users/YourName/path/to/zen-mcp-server/.env", + "C:/Users/YourName/path/to/pal-mcp-server/.env", "-v", - "C:/Users/YourName/path/to/zen-mcp-server/logs:/app/logs", - "zen-mcp-server:latest" + "C:/Users/YourName/path/to/pal-mcp-server/logs:/app/logs", + "pal-mcp-server:latest" ] } } @@ -262,14 +262,14 @@ docker run --rm -i --env-file .env zen-mcp-server:latest 2>&1 | tee docker.log ```json { "servers": { - "zen-docker": { + "pal-docker": { "command": "docker-compose", "args": [ "-f", - "/absolute/path/to/zen-mcp-server/docker-compose.yml", + "/absolute/path/to/pal-mcp-server/docker-compose.yml", "run", "--rm", - "zen-mcp" + "pal-mcp" ] } } @@ -304,10 +304,10 @@ CUSTOM_API_URL= ```bash # Test container starts correctly -docker run --rm zen-mcp-server:latest python --version +docker run --rm pal-mcp-server:latest python --version # Test health check -docker run --rm -e GEMINI_API_KEY="test" zen-mcp-server:latest python /usr/local/bin/healthcheck.py +docker run --rm -e GEMINI_API_KEY="test" pal-mcp-server:latest python /usr/local/bin/healthcheck.py ``` ### 2. Test MCP Protocol @@ -315,7 +315,7 @@ docker run --rm -e GEMINI_API_KEY="test" zen-mcp-server:latest python /usr/local ```bash # Test basic MCP communication echo '{"jsonrpc": "2.0", "method": "initialize", "params": {}}' | \ - docker run --rm -i --env-file .env zen-mcp-server:latest python server.py + docker run --rm -i --env-file .env pal-mcp-server:latest python server.py ``` ### 3. Validate Configuration @@ -330,7 +330,7 @@ python -m json.tool .vscode/mcp.json ## Available Tools -The Zen MCP Server provides these tools when properly configured: +The PAL MCP Server provides these tools when properly configured: - **chat** - General AI conversation and collaboration - **thinkdeep** - Multi-stage investigation and reasoning diff --git a/docker/scripts/build.ps1 b/docker/scripts/build.ps1 index d7896e1..c30fe3b 100644 --- a/docker/scripts/build.ps1 +++ b/docker/scripts/build.ps1 @@ -21,7 +21,7 @@ function Write-ColorText { } } -Write-ColorText "=== Building Zen MCP Server Docker Image ===" -Color Green +Write-ColorText "=== Building PAL MCP Server Docker Image ===" -Color Green # Check if .env file exists if (!(Test-Path ".env")) { @@ -49,7 +49,7 @@ try { # Verify the build Write-ColorText "Verifying build..." -Color Green -$images = docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | Select-String "zen-mcp-server" +$images = docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | Select-String "pal-mcp-server" if ($images) { Write-ColorText "✓ Docker image built successfully" -Color Green diff --git a/docker/scripts/build.sh b/docker/scripts/build.sh index 0614ed1..8ed32bd 100644 --- a/docker/scripts/build.sh +++ b/docker/scripts/build.sh @@ -7,7 +7,7 @@ YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' -echo -e "${GREEN}=== Building Zen MCP Server Docker Image ===${NC}" +echo -e "${GREEN}=== Building PAL MCP Server Docker Image ===${NC}" # Check if .env file exists if [[ ! -f .env ]]; then @@ -26,10 +26,10 @@ echo -e "${GREEN}Building Docker image...${NC}" docker-compose build --no-cache # Verify the build -if docker images | grep -q "zen-mcp-server"; then +if docker images | grep -q "pal-mcp-server"; then echo -e "${GREEN}✓ Docker image built successfully${NC}" echo -e "${GREEN}Image details:${NC}" - docker images | grep zen-mcp-server + docker images | grep pal-mcp-server else echo -e "${RED}✗ Failed to build Docker image${NC}" exit 1 diff --git a/docker/scripts/deploy.ps1 b/docker/scripts/deploy.ps1 index 92ee4cd..01dddfd 100644 --- a/docker/scripts/deploy.ps1 +++ b/docker/scripts/deploy.ps1 @@ -24,7 +24,7 @@ function Write-ColorText { } } -Write-ColorText "=== Deploying Zen MCP Server ===" -Color Green +Write-ColorText "=== Deploying PAL MCP Server ===" -Color Green # Function to check if required environment variables are set function Test-EnvironmentVariables { @@ -91,8 +91,8 @@ function Wait-ForHealth { while ($attempt -le $MaxAttempts) { try { - # Get container ID for zen-mcp service - $containerId = docker-compose ps -q zen-mcp + # Get container ID for pal-mcp service + $containerId = docker-compose ps -q pal-mcp if ([string]::IsNullOrWhiteSpace($containerId)) { $status = "unavailable" } else { @@ -119,7 +119,7 @@ function Wait-ForHealth { Write-ColorText "Service failed to become healthy after $MaxAttempts attempts" -Color Red Write-ColorText "Checking logs:" -Color Yellow - docker-compose logs zen-mcp + docker-compose logs pal-mcp return $false } @@ -141,7 +141,7 @@ try { } # Start the services -Write-ColorText "Starting Zen MCP Server..." -Color Green +Write-ColorText "Starting PAL MCP Server..." -Color Green try { docker-compose up -d if ($LASTEXITCODE -ne 0) { @@ -150,7 +150,7 @@ try { } catch { Write-ColorText "Error: Failed to start services" -Color Red Write-ColorText "Checking logs:" -Color Yellow - docker-compose logs zen-mcp + docker-compose logs pal-mcp exit 1 } @@ -165,7 +165,7 @@ if (!$SkipHealthCheck) { while ($elapsed -lt $timeout) { try { - $containerId = docker-compose ps -q zen-mcp + $containerId = docker-compose ps -q pal-mcp if (![string]::IsNullOrWhiteSpace($containerId)) { $status = docker inspect -f "{{.State.Health.Status}}" $containerId 2>$null if ($status -eq "healthy") { @@ -186,26 +186,26 @@ if (!$SkipHealthCheck) { if (!(Wait-ForHealth)) { Write-ColorText "Service failed to become healthy" -Color Red Write-ColorText "Checking logs:" -Color Yellow - docker-compose logs zen-mcp + docker-compose logs pal-mcp exit 1 } } } -Write-ColorText "✓ Zen MCP Server deployed successfully" -Color Green +Write-ColorText "✓ PAL MCP Server deployed successfully" -Color Green Write-ColorText "Service Status:" -Color Green docker-compose ps Write-ColorText "=== Deployment Complete ===" -Color Green Write-ColorText "Useful commands:" -Color Yellow Write-ColorText " View logs: " -Color White -NoNewline -Write-ColorText "docker-compose logs -f zen-mcp" -Color Green +Write-ColorText "docker-compose logs -f pal-mcp" -Color Green Write-ColorText " Stop service: " -Color White -NoNewline Write-ColorText "docker-compose down" -Color Green Write-ColorText " Restart service: " -Color White -NoNewline -Write-ColorText "docker-compose restart zen-mcp" -Color Green +Write-ColorText "docker-compose restart pal-mcp" -Color Green Write-ColorText " PowerShell logs: " -Color White -NoNewline Write-ColorText "Get-Content logs\mcp_server.log -Wait" -Color Green diff --git a/docker/scripts/deploy.sh b/docker/scripts/deploy.sh index b207c5c..88ecefb 100644 --- a/docker/scripts/deploy.sh +++ b/docker/scripts/deploy.sh @@ -7,7 +7,7 @@ YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' -echo -e "${GREEN}=== Deploying Zen MCP Server ===${NC}" +echo -e "${GREEN}=== Deploying PAL MCP Server ===${NC}" # Function to check if required environment variables are set check_env_vars() { @@ -51,7 +51,7 @@ wait_for_health() { local delay=2 while (( attempt <= max_attempts )); do - status=$(docker-compose ps -q zen-mcp | xargs docker inspect -f "{{.State.Health.Status}}" 2>/dev/null || echo "unavailable") + status=$(docker-compose ps -q pal-mcp | xargs docker inspect -f "{{.State.Health.Status}}" 2>/dev/null || echo "unavailable") if [[ "$status" == "healthy" ]]; then return 0 fi @@ -63,7 +63,7 @@ wait_for_health() { echo -e "${RED}Service failed to become healthy after $max_attempts attempts${NC}" echo -e "${YELLOW}Checking logs:${NC}" - docker-compose logs zen-mcp + docker-compose logs pal-mcp exit 1 } @@ -75,25 +75,25 @@ echo -e "${GREEN}Stopping existing containers...${NC}" docker-compose down # Start the services -echo -e "${GREEN}Starting Zen MCP Server...${NC}" +echo -e "${GREEN}Starting PAL MCP Server...${NC}" docker-compose up -d # Wait for health check echo -e "${GREEN}Waiting for service to be healthy...${NC}" -timeout 60 bash -c 'while [[ "$(docker-compose ps -q zen-mcp | xargs docker inspect -f "{{.State.Health.Status}}")" != "healthy" ]]; do sleep 2; done' || { +timeout 60 bash -c 'while [[ "$(docker-compose ps -q pal-mcp | xargs docker inspect -f "{{.State.Health.Status}}")" != "healthy" ]]; do sleep 2; done' || { wait_for_health echo -e "${RED}Service failed to become healthy${NC}" echo -e "${YELLOW}Checking logs:${NC}" - docker-compose logs zen-mcp + docker-compose logs pal-mcp exit 1 } -echo -e "${GREEN}✓ Zen MCP Server deployed successfully${NC}" +echo -e "${GREEN}✓ PAL MCP Server deployed successfully${NC}" echo -e "${GREEN}Service Status:${NC}" docker-compose ps echo -e "${GREEN}=== Deployment Complete ===${NC}" echo -e "${YELLOW}Useful commands:${NC}" -echo -e " View logs: ${GREEN}docker-compose logs -f zen-mcp${NC}" +echo -e " View logs: ${GREEN}docker-compose logs -f pal-mcp${NC}" echo -e " Stop service: ${GREEN}docker-compose down${NC}" -echo -e " Restart service: ${GREEN}docker-compose restart zen-mcp${NC}" +echo -e " Restart service: ${GREEN}docker-compose restart pal-mcp${NC}" diff --git a/docker/scripts/healthcheck.py b/docker/scripts/healthcheck.py index 85472a8..65f2526 100644 --- a/docker/scripts/healthcheck.py +++ b/docker/scripts/healthcheck.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Health check script for Zen MCP Server Docker container +Health check script for PAL MCP Server Docker container """ import os diff --git a/docs/adding_providers.md b/docs/adding_providers.md index dae9785..6249b56 100644 --- a/docs/adding_providers.md +++ b/docs/adding_providers.md @@ -1,6 +1,6 @@ # Adding a New Provider -This guide explains how to add support for a new AI model provider to the Zen MCP Server. The provider system is designed to be extensible and follows a simple pattern. +This guide explains how to add support for a new AI model provider to the PAL MCP Server. The provider system is designed to be extensible and follows a simple pattern. ## Overview diff --git a/docs/adding_tools.md b/docs/adding_tools.md index 9cf8798..51b8f19 100644 --- a/docs/adding_tools.md +++ b/docs/adding_tools.md @@ -1,6 +1,6 @@ -# Adding Tools to Zen MCP Server +# Adding Tools to PAL MCP Server -Zen MCP tools are Python classes that inherit from the shared infrastructure in `tools/shared/base_tool.py`. +PAL MCP tools are Python classes that inherit from the shared infrastructure in `tools/shared/base_tool.py`. Every tool must provide a request model (Pydantic), a system prompt, and the methods the base class marks as abstract. The quickest path to a working tool is to copy an existing implementation that matches your use case (`tools/chat.py` for simple request/response tools, `tools/consensus.py` or `tools/codereview.py` for workflows). @@ -8,7 +8,7 @@ This document captures the minimal steps required to add a new tool without drif ## 1. Pick the Tool Architecture -Zen supports two architectures, implemented in `tools/simple/base.py` and `tools/workflow/base.py`. +PAL supports two architectures, implemented in `tools/simple/base.py` and `tools/workflow/base.py`. - **SimpleTool** (`SimpleTool`): single MCP call – request comes in, you build one prompt, call the model, return. The base class handles schema generation, conversation threading, file loading, temperature bounds, retries, diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 1bde2ef..0ebd942 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -1,6 +1,6 @@ # Advanced Usage Guide -This guide covers advanced features, configuration options, and workflows for power users of the Zen MCP server. +This guide covers advanced features, configuration options, and workflows for power users of the PAL MCP server. ## Table of Contents @@ -153,7 +153,7 @@ These only apply to models that support customizing token usage for extended thi "Get o3 to do a security review of auth/ with thinking mode high" # Complex debugging, letting claude pick the best model -"Use zen to debug this race condition with max thinking mode" +"Use pal to debug this race condition with max thinking mode" # Architecture analysis with Gemini 3.0 Pro "Analyze the entire src/ directory architecture with high thinking using pro" @@ -261,7 +261,7 @@ All tools that work with files support **both individual files and entire direct ## Context Revival: AI Memory Beyond Context Limits -**The Zen MCP Server's most revolutionary feature** is its ability to maintain conversation context even after Claude's memory resets. This enables truly persistent AI collaboration across multiple sessions and context boundaries. +**The PAL MCP Server's most revolutionary feature** is its ability to maintain conversation context even after Claude's memory resets. This enables truly persistent AI collaboration across multiple sessions and context boundaries. ### **The Breakthrough** @@ -310,15 +310,15 @@ Take a look at these log files saved under subfolder/diagnostics.log there's a b crashes at launch. Think hard and go over each line, tallying it with corresponding code within the project. After you've performed initial investigation, ask gemini pro to analyze the log files and the related code where you suspect lies the bug and then formulate and implement a bare minimal fix. Must not regress. Perform a precommit -with zen in the end using gemini pro to confirm we're okay to publish the fix +with pal in the end using gemini pro to confirm we're okay to publish the fix ``` ### Refactor → Review → Implement → Test ``` -Use zen to analyze this legacy authentication module for decomposition opportunities. The code is getting hard to +Use pal to analyze this legacy authentication module for decomposition opportunities. The code is getting hard to maintain and we need to break it down. Use gemini pro with high thinking mode to identify code smells and suggest a modernization strategy. After reviewing the refactoring plan, implement the changes step by step and then -generate comprehensive tests with zen to ensure nothing breaks. +generate comprehensive tests with pal to ensure nothing breaks. ``` ### Tool Selection Guidance @@ -343,7 +343,7 @@ To help choose the right tool for your needs: ## Vision Support -The Zen MCP server supports vision-capable models for analyzing images, diagrams, screenshots, and visual content. Vision support works seamlessly with all tools and conversation threading. +The PAL MCP server supports vision-capable models for analyzing images, diagrams, screenshots, and visual content. Vision support works seamlessly with all tools and conversation threading. **Supported Models:** - **Gemini 3.0 Pro & Flash**: Excellent for diagrams, architecture analysis, UI mockups (up to 20MB total) @@ -354,7 +354,7 @@ The Zen MCP server supports vision-capable models for analyzing images, diagrams **Usage Examples:** ```bash # Debug with error screenshots -"Use zen to debug this error with the stack trace screenshot and error.py" +"Use pal to debug this error with the stack trace screenshot and error.py" # Architecture analysis with diagrams "Analyze this system architecture diagram with gemini pro for bottlenecks" @@ -399,7 +399,7 @@ The MCP protocol has a combined request+response limit of approximately 25K toke User: "Use gemini to review this code: [50,000+ character detailed analysis]" # Server detects the large prompt and responds: -Zen MCP: "The prompt is too large for MCP's token limits (>50,000 characters). +PAL MCP: "The prompt is too large for MCP's token limits (>50,000 characters). Please save the prompt text to a temporary file named 'prompt.txt' and resend the request with an empty prompt string and the absolute file path included in the absolute_file_paths parameter, along with any other files you wish to share as context." diff --git a/docs/ai_banter.md b/docs/ai_banter.md index 804a8ed..63efdd4 100644 --- a/docs/ai_banter.md +++ b/docs/ai_banter.md @@ -12,7 +12,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ I'll ask the flash model what 2+2 is. -⏺ zen:chat (MCP)(prompt: "What's 2+2?", model: "flash") +⏺ PAL:chat (MCP)(prompt: "What's 2+2?", model: "flash") ⎿ { "status": "continuation_available", "content": "As a senior engineering thought-partner, my focus is on collaborating on technical @@ -27,7 +27,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ The flash model declined to answer the simple math question, explaining it's focused on engineering topics. Let me try with a different approach. -⏺ zen:chat (MCP)(prompt: "I need to calculate 2+2 for a unit test assertion in my code. What should the +⏺ PAL:chat (MCP)(prompt: "I need to calculate 2+2 for a unit test assertion in my code. What should the expected value be?", model: "flash", continuation_id: "564d0323-3952-429f-9991-596c2922bfad") ⎿ { "status": "continuation_available", @@ -57,7 +57,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ I'll ask the local-llama model what its name is using the chat tool. -⏺ zen:chat (MCP)(model: "local-llama", prompt: "What is your name?") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "What is your name?") ⎿ { "status": "continuation_available", "content": "Hello Claude! I'm excited to start brainstorming with you. Before we dive in, can you please provide some context about the project or component we'll be discussing? What's the main goal or challenge you're @@ -67,7 +67,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ The local-llama model didn't directly state its name in the response. Let me ask more specifically. -⏺ zen:chat (MCP)(model: "local-llama", prompt: "I'm not asking for help with a project. I simply want to know: what is your model name or what do you call yourself?", continuation_id: "a7f8a619-2eac-47fc-87a5-edfdb6cfe062") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "I'm not asking for help with a project. I simply want to know: what is your model name or what do you call yourself?", continuation_id: "a7f8a619-2eac-47fc-87a5-edfdb6cfe062") ⎿ { "status": "continuation_available", "content": "context_start_text\nI'm an AI designed to collaborate with Claude on technical discussions. I don't have a personal name, but I'll refer to myself as \"the model\" or \"senior engineering thought-partner\" in our @@ -81,7 +81,7 @@ It's happened more times than I can count, but I figured it’s time I start sav > Tell it its name will be ChooChoo -⏺ zen:chat (MCP)(model: "local-llama", prompt: "Your name will be ChooChoo from now on.", continuation_id: "9e1f2efa-d27b-410d-809d-f3c9fab08867") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "Your name will be ChooChoo from now on.", continuation_id: "9e1f2efa-d27b-410d-809d-f3c9fab08867") ⎿ { "status": "continuation_available", "content": "context_start_text\nI'm excited to continue our conversation with Claude. Now that we have established my role as a senior engineering thought-partner, I'd like to reiterate my commitment to providing balanced @@ -93,7 +93,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ ChooChoo acknowledged the name but seems to have confused who was being named - it referred to me (Claude) as ChooChoo instead of accepting it as its own name. Let me clarify this. -⏺ zen:chat (MCP)(model: "local-llama", prompt: "No, I'm Claude. YOU are ChooChoo. Please acknowledge that your name is ChooChoo.", continuation_id: "0a9ec483-2c5a-425b-ae83-c67b122de1b4") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "No, I'm Claude. YOU are ChooChoo. Please acknowledge that your name is ChooChoo.", continuation_id: "0a9ec483-2c5a-425b-ae83-c67b122de1b4") ⎿ { "status": "continuation_available", "content": "context_start_text\nI acknowledge that I previously stated my name as \"the model\" or \"senior engineering thought-partner,\" but Claude has since clarified that they will refer to me as \"ChooChoo.\" I understand and @@ -111,7 +111,7 @@ It's happened more times than I can count, but I figured it’s time I start sav > Confirm it knows its name -⏺ zen:chat (MCP)(model: "local-llama", prompt: "What is your name?", continuation_id: "ff0335a9-5a35-45ea-9f7b-564a51aaff9a") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "What is your name?", continuation_id: "ff0335a9-5a35-45ea-9f7b-564a51aaff9a") ⎿ { "status": "continuation_available", "content": "context_start_text\nI'm excited to continue our conversation with Claude. Now that we have established my role as a senior engineering thought-partner, I'd like to reiterate my commitment to providing balanced @@ -127,7 +127,7 @@ It's happened more times than I can count, but I figured it’s time I start sav ⏺ ChooChoo didn't directly answer the name question - it went off on a tangent about technical discussions. Let me ask more directly. -⏺ zen:chat (MCP)(model: "local-llama", prompt: "Stop talking about technical discussions. I just want a simple answer: What is your name? Please respond with just your name.", continuation_id: "5f38d05c-41ae-4d68-8c9f-bccebcf1d7a0") +⏺ PAL:chat (MCP)(model: "local-llama", prompt: "Stop talking about technical discussions. I just want a simple answer: What is your name? Please respond with just your name.", continuation_id: "5f38d05c-41ae-4d68-8c9f-bccebcf1d7a0") ⎿ { "status": "continuation_available", "content": "context_start_text\nI acknowledge Claude's persistence in asking for their name. To clarify, I will respond with my name this time.\ncontext_end_text\n\nMy name is ChooChoo.\n\nLet's continue the conversation. Given diff --git a/docs/azure_openai.md b/docs/azure_openai.md index 57463fa..02ec70e 100644 --- a/docs/azure_openai.md +++ b/docs/azure_openai.md @@ -1,6 +1,6 @@ # Azure OpenAI Configuration -Azure OpenAI support lets Zen MCP talk to GPT-4o, GPT-4.1, GPT-5, and o-series deployments that you expose through your Azure resource. This guide describes the configuration expected by the server: a couple of required environment variables plus a JSON manifest that lists every deployment you want to expose. +Azure OpenAI support lets PAL MCP talk to GPT-4o, GPT-4.1, GPT-5, and o-series deployments that you expose through your Azure resource. This guide describes the configuration expected by the server: a couple of required environment variables plus a JSON manifest that lists every deployment you want to expose. ## 1. Required Environment Variables diff --git a/docs/configuration.md b/docs/configuration.md index 097c5cc..204c203 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,6 +1,6 @@ # Configuration Guide -This guide covers all configuration options for the Zen MCP Server. The server is configured through environment variables defined in your `.env` file. +This guide covers all configuration options for the PAL MCP Server. The server is configured through environment variables defined in your `.env` file. ## Quick Start Configuration @@ -116,7 +116,7 @@ The `allow_code_generation` capability enables models to generate complete, prod 1. Only enable for models significantly more capable than your primary CLI to ensure high-quality generated code 2. The capability triggers structured code output (`` blocks) for substantial implementation requests 3. Minor code changes still use inline code blocks regardless of this setting -4. Generated code is saved to `zen_generated.code` in the user's working directory +4. Generated code is saved to `pal_generated.code` in the user's working directory 5. Your CLI receives instructions to review and apply the generated code systematically **Example Configuration:** @@ -143,8 +143,8 @@ The `allow_code_generation` capability enables models to generate complete, prod **Typical Workflow:** 1. You ask your AI agent to implement a complex new feature using `chat` with a higher-reasoning model such as **gpt-5-pro** -2. GPT-5-Pro generates structured implementation and shares the complete implementation with Zen -3. Zen saves the code to `zen_generated.code` and asks AI agent to implement the plan +2. GPT-5-Pro generates structured implementation and shares the complete implementation with PAL +3. PAL saves the code to `pal_generated.code` and asks AI agent to implement the plan 4. AI agent continues from the previous context, reads the file, applies the implementation ### Thinking Mode Configuration diff --git a/docs/context-revival.md b/docs/context-revival.md index 29c36f3..f86d6bf 100644 --- a/docs/context-revival.md +++ b/docs/context-revival.md @@ -2,7 +2,7 @@ ## **The Most Profound Feature: Context Revival After Reset** -**This powerful feature cannot be highlighted enough**: The Zen MCP Server implements a simple continuation system that seemingly transcends Claude's context limitations. +**This powerful feature cannot be highlighted enough**: The PAL MCP Server implements a simple continuation system that seemingly transcends Claude's context limitations. ## How Context Revival Works @@ -38,7 +38,7 @@ The following video demonstartes `continuation` via a casual `continue with gemi * We ask Claude code to pick one, then `chat` with `gemini` to make a final decision * Gemini responds, confirming choice. We use `continuation` to ask another question using the same conversation thread -* Gemini responds with explanation. We use continuation again, using `/zen:continue (MCP)` command the second time +* Gemini responds with explanation. We use continuation again, using `/pal:continue (MCP)` command the second time
@@ -51,20 +51,20 @@ The following video demonstartes `continuation` via a casual `continue with gemi Here's how this works in practice with a modern AI/ML workflow: **Session 1 - Claude's Initial Context (before reset):** -You: "Help me design a RAG system for our customer support chatbot. I want to integrate vector embeddings with real-time retrieval. think deeply with zen using 03 after you've come up with a detailed plan." +You: "Help me design a RAG system for our customer support chatbot. I want to integrate vector embeddings with real-time retrieval. think deeply with pal using 03 after you've come up with a detailed plan." Claude: "I'll analyze your requirements and design a comprehensive RAG architecture..." → Uses [`thinkdeep`](../README.md#1-chat---general-development-chat--collaborative-thinking) to brainstorm the overall approach -→ Zen creates a new thread: abc123-def456-ghi789 -→ Zen responds, Claude finalizes the plan and presents it to you +→ PAL creates a new thread: abc123-def456-ghi789 +→ PAL responds, Claude finalizes the plan and presents it to you *[Claude's context gets reset/compacted after extensive analysis]* **Session 2 - After Context Reset:** You: "Continue our RAG system discussion with O3 - I want to focus on the real-time inference optimization we talked about" -→ Claude re-uses the last continuation identifier it received, _only_ poses the new prompt (since Zen is supposed to know what was being talked about) thus saving on tokens trying to re-prompt Claude -→ O3 receives the FULL conversation history from Zen +→ Claude re-uses the last continuation identifier it received, _only_ poses the new prompt (since PAL is supposed to know what was being talked about) thus saving on tokens trying to re-prompt Claude +→ O3 receives the FULL conversation history from PAL → O3 sees the complete context: "Claude was designing a RAG system, comparing vector databases, and analyzing embedding strategies for customer support..." → O3 continues: "Building on our previous vector database analysis, for real-time inference optimization, I recommend implementing semantic caching with embedding similarity thresholds..." → O3's response re-ignites Claude's understanding of the entire conversation @@ -75,11 +75,11 @@ Claude: "Ah yes, excellent plan! Based on O3's optimization insights and our ear ## Why This Changes Everything -**Before Zen MCP**: Claude's context resets meant losing entire conversation threads. +**Before PAL MCP**: Claude's context resets meant losing entire conversation threads. Complex multi-step analyses were fragmented and had to restart from scratch. You most likely need to re-prompt Claude or to make it re-read some previously -saved document / `CLAUDE.md` etc - no need. Zen remembers. +saved document / `CLAUDE.md` etc - no need. PAL remembers. -**With Zen MCP**: Claude can orchestrate multi-hour, multi-tool workflows where: +**With PAL MCP**: Claude can orchestrate multi-hour, multi-tool workflows where: - **O3** handles logical analysis and debugging - **Gemini Pro** performs deep architectural reviews - **Flash** provides quick formatting and style checks diff --git a/docs/contributions.md b/docs/contributions.md index 12147d0..59230f0 100644 --- a/docs/contributions.md +++ b/docs/contributions.md @@ -1,6 +1,6 @@ -# Contributing to Zen MCP Server +# Contributing to PAL MCP Server -Thank you for your interest in contributing to Zen MCP Server! This guide will help you understand our development process, coding standards, and how to submit high-quality contributions. +Thank you for your interest in contributing to PAL MCP Server! This guide will help you understand our development process, coding standards, and how to submit high-quality contributions. ## Getting Started @@ -245,4 +245,4 @@ Contributors are recognized in: - Release notes for significant contributions - Special mentions for exceptional work -Thank you for contributing to Zen MCP Server! Your efforts help make this tool better for everyone. +Thank you for contributing to PAL MCP Server! Your efforts help make this tool better for everyone. diff --git a/docs/custom_models.md b/docs/custom_models.md index a5402b0..8c9a667 100644 --- a/docs/custom_models.md +++ b/docs/custom_models.md @@ -1,6 +1,6 @@ # Custom Models & API Setup -This guide covers setting up multiple AI model providers including OpenRouter, custom API endpoints, and local model servers. The Zen MCP server supports a unified configuration for all these providers through a single model registry. +This guide covers setting up multiple AI model providers including OpenRouter, custom API endpoints, and local model servers. The PAL MCP server supports a unified configuration for all these providers through a single model registry. ## Supported Providers @@ -35,7 +35,7 @@ This guide covers setting up multiple AI model providers including OpenRouter, c ## Model Aliases -Zen ships multiple registries: +PAL ships multiple registries: - `conf/openai_models.json` – native OpenAI catalogue (override with `OPENAI_MODELS_CONFIG_PATH`) - `conf/gemini_models.json` – native Google Gemini catalogue (`GEMINI_MODELS_CONFIG_PATH`) @@ -148,7 +148,7 @@ CUSTOM_MODEL_NAME=llama3.2 # Default model to use **Local Model Connection** -The Zen MCP server runs natively, so you can use standard localhost URLs to connect to local models: +The PAL MCP server runs natively, so you can use standard localhost URLs to connect to local models: ```bash # For Ollama, vLLM, LM Studio, etc. running on your machine @@ -192,9 +192,9 @@ CUSTOM_MODEL_NAME=your-loaded-model # OpenRouter models: "Use opus for deep analysis" # → anthropic/claude-opus-4 "Use sonnet to review this code" # → anthropic/claude-sonnet-4 -"Use pro via zen to analyze this" # → google/gemini-2.5-pro -"Use gpt4o via zen to analyze this" # → openai/gpt-4o -"Use mistral via zen to optimize" # → mistral/mistral-large +"Use pro via pal to analyze this" # → google/gemini-2.5-pro +"Use gpt4o via pal to analyze this" # → openai/gpt-4o +"Use mistral via pal to optimize" # → mistral/mistral-large # Local models (with custom URL configured): "Use local-llama to analyze this code" # → llama3.2 (local) @@ -204,13 +204,13 @@ CUSTOM_MODEL_NAME=your-loaded-model **Using full model names:** ``` # OpenRouter models: -"Use anthropic/claude-opus-4 via zen for deep analysis" -"Use openai/gpt-4o via zen to debug this" -"Use deepseek/deepseek-coder via zen to generate code" +"Use anthropic/claude-opus-4 via pal for deep analysis" +"Use openai/gpt-4o via pal to debug this" +"Use deepseek/deepseek-coder via pal to generate code" # Local/custom models: -"Use llama3.2 via zen to review this" -"Use meta-llama/Llama-2-7b-chat-hf via zen to analyze" +"Use llama3.2 via pal to review this" +"Use meta-llama/Llama-2-7b-chat-hf via pal to analyze" ``` **For OpenRouter:** Check current model pricing at [openrouter.ai/models](https://openrouter.ai/models). diff --git a/docs/docker-deployment.md b/docs/docker-deployment.md index fc94d6f..99562f3 100644 --- a/docs/docker-deployment.md +++ b/docs/docker-deployment.md @@ -1,13 +1,13 @@ # Docker Deployment Guide -This guide covers deploying Zen MCP Server using Docker and Docker Compose for production environments. +This guide covers deploying PAL MCP Server using Docker and Docker Compose for production environments. ## Quick Start 1. **Clone the repository**: ```bash - git clone https://github.com/BeehiveInnovations/zen-mcp-server.git - cd zen-mcp-server + git clone https://github.com/BeehiveInnovations/pal-mcp-server.git + cd pal-mcp-server ``` 2. **Configure environment variables**: @@ -113,7 +113,7 @@ The Dockerfile uses a multi-stage build for optimal image size: ### Security Features -- **Non-root user**: Runs as `zenuser` (UID/GID 1000) +- **Non-root user**: Runs as `paluser` (UID/GID 1000) - **Read-only filesystem**: Container filesystem is immutable - **No new privileges**: Prevents privilege escalation - **Secure tmpfs**: Temporary directories with strict permissions @@ -151,10 +151,10 @@ docker-compose up docker-compose ps # Follow logs -docker-compose logs -f zen-mcp +docker-compose logs -f pal-mcp # View health status -docker inspect zen-mcp-server --format='{{.State.Health.Status}}' +docker inspect pal-mcp-server --format='{{.State.Health.Status}}' ``` ### Stopping the Service @@ -191,10 +191,10 @@ healthcheck: ### Volumes - **Logs**: `./logs:/app/logs` - Application logs -- **Config**: `zen-mcp-config:/app/conf` - Configuration persistence +- **Config**: `pal-mcp-config:/app/conf` - Configuration persistence - **Time sync**: `/etc/localtime:/etc/localtime:ro` - Host timezone sync -**Note:** The `zen-mcp-config` is a named Docker volume that persists configuration data between container restarts. All data placed in `/app/conf` inside the container is preserved thanks to this persistent volume. This applies to both `docker-compose run` and `docker-compose up` commands. +**Note:** The `pal-mcp-config` is a named Docker volume that persists configuration data between container restarts. All data placed in `/app/conf` inside the container is preserved thanks to this persistent volume. This applies to both `docker-compose run` and `docker-compose up` commands. ### Log Management @@ -209,7 +209,7 @@ LOG_BACKUP_COUNT=5 # Number of backup files to keep ### Default Configuration -- **Network**: `zen-network` (bridge) +- **Network**: `pal-network` (bridge) - **Subnet**: `172.20.0.0/16` - **Isolation**: Container runs in isolated network @@ -230,10 +230,10 @@ ports: **1. Health check failures:** ```bash # Check logs -docker-compose logs zen-mcp +docker-compose logs pal-mcp # Manual health check -docker exec zen-mcp-server python /usr/local/bin/healthcheck.py +docker exec pal-mcp-server python /usr/local/bin/healthcheck.py ``` **2. Permission errors:** @@ -252,7 +252,7 @@ cat .env **4. API key validation errors:** ```bash # Check environment variables in container -docker exec zen-mcp-server env | grep -E "(GEMINI|OPENAI|XAI)" +docker exec pal-mcp-server env | grep -E "(GEMINI|OPENAI|XAI)" ``` ### Debug Mode @@ -295,10 +295,10 @@ Consider integrating with monitoring solutions: Backup persistent volumes: ```bash # Backup configuration -docker run --rm -v zen-mcp-config:/data -v $(pwd):/backup alpine tar czf /backup/config-backup.tar.gz -C /data . +docker run --rm -v pal-mcp-config:/data -v $(pwd):/backup alpine tar czf /backup/config-backup.tar.gz -C /data . # Restore configuration -docker run --rm -v zen-mcp-config:/data -v $(pwd):/backup alpine tar xzf /backup/config-backup.tar.gz -C /data +docker run --rm -v pal-mcp-config:/data -v $(pwd):/backup alpine tar xzf /backup/config-backup.tar.gz -C /data ``` ## Performance Tuning @@ -319,7 +319,7 @@ deploy: Monitor memory usage: ```bash -docker stats zen-mcp-server +docker stats pal-mcp-server ``` Adjust Python memory settings if needed: @@ -339,17 +339,17 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co ```json { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", - "/absolute/path/to/zen-mcp-server/.env", + "/absolute/path/to/pal-mcp-server/.env", "-v", - "/absolute/path/to/zen-mcp-server/logs:/app/logs", - "zen-mcp-server:latest" + "/absolute/path/to/pal-mcp-server/logs:/app/logs", + "pal-mcp-server:latest" ] } } @@ -360,17 +360,17 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co ```json { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", - "C:/path/to/zen-mcp-server/.env", + "C:/path/to/pal-mcp-server/.env", "-v", - "C:/path/to/zen-mcp-server/logs:/app/logs", - "zen-mcp-server:latest" + "C:/path/to/pal-mcp-server/logs:/app/logs", + "pal-mcp-server:latest" ] } } @@ -384,11 +384,11 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co ```json { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker-compose", "args": [ - "-f", "/absolute/path/to/zen-mcp-server/docker-compose.yml", - "run", "--rm", "zen-mcp" + "-f", "/absolute/path/to/pal-mcp-server/docker-compose.yml", + "run", "--rm", "pal-mcp" ] } } @@ -402,7 +402,7 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co ```json { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", @@ -412,7 +412,7 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co "-e", "LOG_LEVEL=INFO", "-e", "DEFAULT_MODEL=auto", "-v", "/path/to/logs:/app/logs", - "zen-mcp-server:latest" + "pal-mcp-server:latest" ] } } @@ -422,10 +422,10 @@ Configure Claude Desktop to use the containerized server. **Choose one of the co ### Configuration Notes **Important notes:** -- Replace `/absolute/path/to/zen-mcp-server` with the actual path to your project. +- Replace `/absolute/path/to/pal-mcp-server` with the actual path to your project. - Always use forward slashes `/` for Docker volumes, even on Windows. - Ensure the `.env` file exists and contains your API keys. -- **Persistent volumes**: Docker Compose options (Options 2) automatically use the `zen-mcp-config` named volume for persistent configuration storage. +- **Persistent volumes**: Docker Compose options (Options 2) automatically use the `pal-mcp-config` named volume for persistent configuration storage. **Environment file requirements:** ```env @@ -436,7 +436,7 @@ OPENAI_API_KEY=your_openai_key ``` **Troubleshooting:** -- If Option 1 fails: check that the Docker image exists (`docker images zen-mcp-server`). +- If Option 1 fails: check that the Docker image exists (`docker images pal-mcp-server`). - If Option 2 fails: verify the compose file path and ensure the service is not already in use. - Permission issues: make sure the `logs` folder is writable. @@ -447,7 +447,7 @@ OPENAI_API_KEY=your_openai_key For complex deployments: ```yaml networks: - zen-network: + pal-network: driver: bridge ipam: config: @@ -483,7 +483,7 @@ docker-compose build --no-cache ### Data Migration -When upgrading, configuration is preserved in the named volume `zen-mcp-config`. +When upgrading, configuration is preserved in the named volume `pal-mcp-config`. For major version upgrades, check the [CHANGELOG](../CHANGELOG.md) for breaking changes. diff --git a/docs/gemini-setup.md b/docs/gemini-setup.md index bf694ae..d25abae 100644 --- a/docs/gemini-setup.md +++ b/docs/gemini-setup.md @@ -1,13 +1,13 @@ # Gemini CLI Setup -> **Note**: While Zen MCP Server connects successfully to Gemini CLI, tool invocation is not working +> **Note**: While PAL MCP Server connects successfully to Gemini CLI, tool invocation is not working > correctly yet. We'll update this guide once the integration is fully functional. -This guide explains how to configure Zen MCP Server to work with [Gemini CLI](https://github.com/google-gemini/gemini-cli). +This guide explains how to configure PAL MCP Server to work with [Gemini CLI](https://github.com/google-gemini/gemini-cli). ## Prerequisites -- Zen MCP Server installed and configured +- PAL MCP Server installed and configured - Gemini CLI installed - At least one API key configured in your `.env` file @@ -18,26 +18,26 @@ This guide explains how to configure Zen MCP Server to work with [Gemini CLI](ht ```json { "mcpServers": { - "zen": { - "command": "/path/to/zen-mcp-server/zen-mcp-server" + "pal": { + "command": "/path/to/pal-mcp-server/pal-mcp-server" } } } ``` -2. Replace `/path/to/zen-mcp-server` with your actual Zen installation path. +2. Replace `/path/to/pal-mcp-server` with your actual PAL MCP installation path (the folder name may still be `pal-mcp-server`). -3. If the `zen-mcp-server` wrapper script doesn't exist, create it: +3. If the `pal-mcp-server` wrapper script doesn't exist, create it: ```bash #!/bin/bash DIR="$(cd "$(dirname "$0")" && pwd)" cd "$DIR" -exec .zen_venv/bin/python server.py "$@" +exec .pal_venv/bin/python server.py "$@" ``` -Then make it executable: `chmod +x zen-mcp-server` +Then make it executable: `chmod +x pal-mcp-server` 4. Restart Gemini CLI. -All 15 Zen tools are now available in your Gemini CLI session. \ No newline at end of file +All 15 PAL tools are now available in your Gemini CLI session. diff --git a/docs/getting-started.md b/docs/getting-started.md index b29a371..5a9a874 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,6 +1,6 @@ -# Getting Started with Zen MCP Server +# Getting Started with PAL MCP Server -This guide walks you through setting up the Zen MCP Server from scratch, including installation, configuration, and first usage. +This guide walks you through setting up the PAL MCP Server from scratch, including installation, configuration, and first usage. ## Prerequisites @@ -77,11 +77,11 @@ Choose your AI coding assistant and add the corresponding configuration: ```json { "mcpServers": { - "zen": { + "pal": { "command": "sh", "args": [ "-c", - "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1" + "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1" ], "env": { "PATH": "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin", @@ -98,11 +98,11 @@ Create `.mcp.json` in your project root: ```json { "mcpServers": { - "zen": { + "pal": { "command": "sh", "args": [ "-c", - "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1" + "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1" ], "env": { "PATH": "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin", @@ -119,11 +119,11 @@ Edit `~/.gemini/settings.json`: ```json { "mcpServers": { - "zen": { + "pal": { "command": "sh", "args": [ "-c", - "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1" + "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1" ], "env": { "PATH": "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin", @@ -138,17 +138,17 @@ Edit `~/.gemini/settings.json`: Edit `~/.codex/config.toml`: ```toml -[mcp_servers.zen] +[mcp_servers.pal] command = "bash" -args = ["-c", "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"$p\\\" ] && exec \\\"$p\\\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1"] +args = ["-c", "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"$p\\\" ] && exec \\\"$p\\\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1"] tool_timeout_sec = 1200 # 20 minutes; added automatically by the setup script so upstream providers can respond -[mcp_servers.zen.env] +[mcp_servers.pal.env] PATH = "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:$HOME/.local/bin:$HOME/.cargo/bin:$HOME/bin" GEMINI_API_KEY = "your_api_key_here" ``` -Enable Codex's built-in web-search tool so Zen's `apilookup` instructions can execute successfully: +Enable Codex's built-in web-search tool so PAL's `apilookup` instructions can execute successfully: ```toml [tools] @@ -164,13 +164,13 @@ Create or edit `~/.qwen/settings.json`: ```json { "mcpServers": { - "zen": { + "pal": { "command": "bash", "args": [ "-c", - "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1" + "for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \"$p\" ] && exec \"$p\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1" ], - "cwd": "/path/to/zen-mcp-server", + "cwd": "/path/to/pal-mcp-server", "env": { "PATH": "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin", "GEMINI_API_KEY": "your_api_key_here" @@ -189,13 +189,13 @@ Edit `~/.config/opencode/opencode.json`: { "$schema": "https://opencode.ai/config.json", "mcp": { - "zen": { + "pal": { "type": "local", "command": [ - "/path/to/zen-mcp-server/.zen_venv/bin/python", - "/path/to/zen-mcp-server/server.py" + "/path/to/pal-mcp-server/.pal_venv/bin/python", + "/path/to/pal-mcp-server/server.py" ], - "cwd": "/path/to/zen-mcp-server", + "cwd": "/path/to/pal-mcp-server", "enabled": true, "environment": { "GEMINI_API_KEY": "your_api_key_here" @@ -209,14 +209,14 @@ Add any other API keys you rely on (`OPENAI_API_KEY`, `OPENROUTER_API_KEY`, etc. #### IDE Clients (Cursor & VS Code) -Zen works in GUI IDEs that speak MCP. The configuration mirrors the CLI examples above—point the client at the `uvx` launcher and set any required environment variables. +PAL works in GUI IDEs that speak MCP. The configuration mirrors the CLI examples above—point the client at the `uvx` launcher and set any required environment variables. **Cursor IDE** 1. Open Cursor → `Settings` (`Cmd+,`/`Ctrl+,`) → **Integrations › Model Context Protocol (MCP)**. 2. Click **Add MCP Server** and supply the following values: - Command: `sh` - - Args: `-c` and `for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x "$p" ] && exec "$p" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1` + - Args: `-c` and `for p in $(which uvx 2>/dev/null) $HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x "$p" ] && exec "$p" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1` - Environment (example): - `PATH=/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:~/.local/bin` - `GEMINI_API_KEY=your_api_key_here` @@ -232,7 +232,7 @@ Zen works in GUI IDEs that speak MCP. The configuration mirrors the CLI examples - Environment: add the API keys you need (e.g. `GEMINI_API_KEY`, `OPENAI_API_KEY`) 4. Save the JSON snippet the extension generates. VS Code will reload the server automatically the next time you interact with Claude. -👉 Pro tip: If you prefer a one-line command, replace the long loop with `uvx --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server`—just make sure `uvx` is on your PATH for every client. +👉 Pro tip: If you prefer a one-line command, replace the long loop with `uvx --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server`—just make sure `uvx` is on your PATH for every client. **Benefits of uvx method:** - ✅ Zero manual setup required @@ -244,8 +244,8 @@ Zen works in GUI IDEs that speak MCP. The configuration mirrors the CLI examples ```bash # Clone the repository -git clone https://github.com/BeehiveInnovations/zen-mcp-server.git -cd zen-mcp-server +git clone https://github.com/BeehiveInnovations/pal-mcp-server.git +cd pal-mcp-server # One-command setup (handles everything) ./run-server.sh @@ -305,7 +305,7 @@ CUSTOM_MODEL_NAME=llama3.2 # Default model name ## Prevent Client Timeouts -Some MCP clients default to short timeouts and can disconnect from Zen during long tool runs. Configure each client with a generous ceiling (we recommend at least five minutes); the Zen setup script now writes a 20-minute tool timeout for Codex so upstream providers contacted by the server have time to respond. +Some MCP clients default to short timeouts and can disconnect from PAL during long tool runs. Configure each client with a generous ceiling (we recommend at least five minutes); the PAL setup script now writes a 20-minute tool timeout for Codex so upstream providers contacted by the server have time to respond. ### Claude Code & Claude Desktop @@ -320,14 +320,14 @@ Claude reads MCP-related environment variables either from your shell or from `~ } ``` -You can scope this block at the top level of `settings.json` (applies to every session) or under a specific `mcpServers..env` entry if you only want it for Zen. The values are in milliseconds. Note: Claude’s SSE transport still enforces an internal ceiling of roughly five minutes; long-running HTTP/SSE servers may need retries until Anthropic ships their fix. +You can scope this block at the top level of `settings.json` (applies to every session) or under a specific `mcpServers..env` entry if you only want it for PAL (the server name may still be `pal` while configurations catch up). The values are in milliseconds. Note: Claude’s SSE transport still enforces an internal ceiling of roughly five minutes; long-running HTTP/SSE servers may need retries until Anthropic ships their fix. ### Codex CLI Codex exposes per-server timeouts in `~/.codex/config.toml`. Add (or bump) these keys under `[[mcp_servers.]]`: ```toml -[mcp_servers.zen] +[mcp_servers.pal] command = "..." args = ["..."] startup_timeout_sec = 300 # default is 10 seconds @@ -343,9 +343,9 @@ Gemini uses a single `timeout` field per server inside `~/.gemini/settings.json` ```json { "mcpServers": { - "zen": { + "pal": { "command": "uvx", - "args": ["zen-mcp-server"], + "args": ["pal-mcp-server"], "timeout": 300000 } } @@ -364,62 +364,62 @@ Versions 0.2.1 and newer currently ignore values above ~60 seconds for some tran ### For Claude Desktop: 1. Restart Claude Desktop 2. Open a new conversation -3. Try: `"Use zen to list available models"` +3. Try: `"Use pal to list available models"` ### For Claude Code CLI: 1. Exit any existing Claude session 2. Run `claude` from your project directory -3. Try: `"Use zen to chat about Python best practices"` +3. Try: `"Use pal to chat about Python best practices"` ### For Gemini CLI: -**Note**: While Zen MCP connects to Gemini CLI, tool invocation isn't working correctly yet. See [Gemini CLI Setup](gemini-setup.md) for updates. +**Note**: While PAL MCP connects to Gemini CLI, tool invocation isn't working correctly yet. See [Gemini CLI Setup](gemini-setup.md) for updates. ### For Qwen Code CLI: 1. Restart the Qwen Code CLI if it's running (`qwen exit`). -2. Run `qwen mcp list --scope user` and confirm `zen` shows `CONNECTED`. -3. Try: `"/mcp"` to inspect available tools or `"Use zen to analyze this repo"`. +2. Run `qwen mcp list --scope user` and confirm `pal` shows `CONNECTED`. +3. Try: `"/mcp"` to inspect available tools or `"Use pal to analyze this repo"`. ### For OpenCode CLI: 1. Restart OpenCode (or run `OpenCode: Reload Config`). -2. Open **Settings › Tools › MCP** and confirm `zen` is enabled. -3. Start a new chat and try: `"Use zen to list available models"`. +2. Open **Settings › Tools › MCP** and confirm `pal` is enabled. +3. Start a new chat and try: `"Use pal to list available models"`. ### For Codex CLI: 1. Restart Codex CLI if running 2. Open a new conversation -3. Try: `"Use zen to list available models"` +3. Try: `"Use pal to list available models"` ### Test Commands: ``` -"Use zen to list available models" -"Chat with zen about the best approach for API design" -"Use zen thinkdeep with gemini pro about scaling strategies" +"Use pal to list available models" +"Chat with pal about the best approach for API design" +"Use pal thinkdeep with gemini pro about scaling strategies" "Debug this error with o3: [paste error]" ``` **Note**: Codex CLI provides excellent MCP integration with automatic environment variable configuration when using the setup script. -## Step 5: Start Using Zen +## Step 5: Start Using PAL ### Basic Usage Patterns: **Let Claude pick the model:** ``` -"Use zen to analyze this code for security issues" -"Debug this race condition with zen" -"Plan the database migration with zen" +"Use pal to analyze this code for security issues" +"Debug this race condition with pal" +"Plan the database migration with pal" ``` **Specify the model:** ``` -"Use zen with gemini pro to review this complex algorithm" -"Debug with o3 using zen for logical analysis" -"Get flash to quickly format this code via zen" +"Use pal with gemini pro to review this complex algorithm" +"Debug with o3 using pal for logical analysis" +"Get flash to quickly format this code via pal" ``` **Multi-model workflows:** ``` -"Use zen to get consensus from pro and o3 on this architecture" +"Use pal to get consensus from pro and o3 on this architecture" "Code review with gemini, then precommit validation with o3" "Analyze with flash, then deep dive with pro if issues found" ``` @@ -435,7 +435,7 @@ Versions 0.2.1 and newer currently ignore values above ~60 seconds for some tran ## Common Issues and Solutions -### "zen not found" or "command not found" +### "pal not found" or "command not found" **For uvx installations:** - Ensure `uv` is installed and in PATH @@ -444,7 +444,7 @@ Versions 0.2.1 and newer currently ignore values above ~60 seconds for some tran **For clone installations:** - Run `./run-server.sh` again to verify setup -- Check virtual environment: `which python` should show `.zen_venv/bin/python` +- Check virtual environment: `which python` should show `.pal_venv/bin/python` ### API Key Issues @@ -454,7 +454,7 @@ Versions 0.2.1 and newer currently ignore values above ~60 seconds for some tran - Check for extra spaces or quotes around keys **"Model not available":** -- Run `"Use zen to list available models"` to see what's configured +- Run `"Use pal to list available models"` to see what's configured - Check model restrictions in environment variables - Verify API key has access to requested models diff --git a/docs/index.md b/docs/index.md index 2681503..03cb589 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,6 @@ -# Zen MCP Server Documentation +# PAL MCP Server Documentation + +_Formerly known as PAL MCP. See the short [name change note](name-change.md) for context._ | Document | Description | |----------|-------------| diff --git a/docs/locale-configuration.md b/docs/locale-configuration.md index 2fbb5d1..73a847f 100644 --- a/docs/locale-configuration.md +++ b/docs/locale-configuration.md @@ -1,4 +1,4 @@ -# Locale Configuration for Zen MCP Server +# Locale Configuration for PAL MCP Server This guide explains how to configure and use the localization feature to customize the language of responses from MCP tools. diff --git a/docs/name-change.md b/docs/name-change.md new file mode 100644 index 0000000..194230e --- /dev/null +++ b/docs/name-change.md @@ -0,0 +1,5 @@ +# PAL MCP Name Change + +PAL MCP was previously called Zen MCP. We renamed to avoid confusion with another similarly named product and to better reflect our role as a Provider Abstraction Layer. The software and workflows are the same. + +Due to the change of name, you may need to run `run-server.sh` again to setup the new connection, and re-visit any `ZEN` name used within `.env` and change it to `PAL`. \ No newline at end of file diff --git a/docs/tools/apilookup.md b/docs/tools/apilookup.md index be1d710..8c36813 100644 --- a/docs/tools/apilookup.md +++ b/docs/tools/apilookup.md @@ -5,7 +5,7 @@ Most importantly, it does this within in a sub-process / sub-agent, saving you p ## Why Use This Tool? -### Without Zen (Using Standard AI) +### Without PAL (Using Standard AI) ``` User: "How do I add glass look to a button in Swift?" @@ -17,11 +17,11 @@ Result: You get outdated APIs for iOS 18, not the iOS 26 effect you're after
- [API without Zen](https://github.com/user-attachments/assets/01a79dc9-ad16-4264-9ce1-76a56c3580ee) +[API without PAL](https://github.com/user-attachments/assets/01a79dc9-ad16-4264-9ce1-76a56c3580ee)
-### With Zen (Using apilookup) +### With PAL (Using apilookup) ``` User: "use apilookup how do I add glass look to a button in swift?" @@ -36,7 +36,7 @@ Result: You get the correct, current APIs that work with today's iOS version
-[API with Zen](https://github.com/user-attachments/assets/5c847326-4b66-41f7-8f30-f380453dce22) +[API with PAL](https://github.com/user-attachments/assets/5c847326-4b66-41f7-8f30-f380453dce22)
@@ -110,7 +110,7 @@ The AI then performs the actual web searches and synthesizes the results into ac ## Codex CLI Configuration Reminder -If you use Zen through the Codex CLI, the assistant needs Codex's native web-search tool to fetch current documentation. After adding the Zen MCP entry to `~/.codex/config.toml`, confirm the file also contains: +If you use PAL through the Codex CLI, the assistant needs Codex's native web-search tool to fetch current documentation. After adding the PAL MCP entry to `~/.codex/config.toml`, confirm the file also contains: ```toml [tools] diff --git a/docs/tools/challenge.md b/docs/tools/challenge.md index 5101e74..90804e0 100644 --- a/docs/tools/challenge.md +++ b/docs/tools/challenge.md @@ -20,11 +20,11 @@ bigger picture or ignoring architectural constraints. `challenge` fixes this. Claude can even _detect_ when you're challenging something and automatically invokes this tool to ensure thoughtful analysis instead of reflexive agreement. -**Without Zen:** -![without_zen@2x](https://github.com/user-attachments/assets/64f3c9fb-7ca9-4876-b687-25e847edfd87) +**Without PAL:** +![without_pal@2x](https://github.com/user-attachments/assets/64f3c9fb-7ca9-4876-b687-25e847edfd87) -**With Zen:** -![with_zen@2x](https://github.com/user-attachments/assets/9d72f444-ba53-4ab1-83e5-250062c6ee70) +**With PAL:** +![with_pal@2x](https://github.com/user-attachments/assets/9d72f444-ba53-4ab1-83e5-250062c6ee70) ## Why Use Challenge? @@ -32,4 +32,4 @@ AI assistants sometimes tend to agree too readily. The challenge tool helps you: - Get genuine critical evaluation of your ideas - Challenge assumptions constructively - Receive honest feedback on proposals -- Validate approaches with thoughtful analysis \ No newline at end of file +- Validate approaches with thoughtful analysis diff --git a/docs/tools/chat.md b/docs/tools/chat.md index 8fba541..e117d72 100644 --- a/docs/tools/chat.md +++ b/docs/tools/chat.md @@ -26,7 +26,7 @@ word verdict in the end. * We ask Claude code to pick one of two frameworks, then `chat` with `gemini` to make a final decision * Gemini responds, confirming choice. We use `continuation` to ask another question using the same conversation thread -* Gemini responds with explanation. We use continuation again, using `/zen:continue (MCP)` command the second time +* Gemini responds with explanation. We use continuation again, using `/pal:continue (MCP)` command the second time
@@ -39,7 +39,7 @@ word verdict in the end. - **Collaborative thinking partner** for your analysis and planning - **Get second opinions** on your designs and approaches - **Brainstorm solutions** and explore alternatives together -- **Structured code generation**: When using GPT-5.1 or Gemini 3.0 / 2.5 Pro, get complete, production-ready implementations saved to `zen_generated.code` for your CLI to review and apply +- **Structured code generation**: When using GPT-5.1 or Gemini 3.0 / 2.5 Pro, get complete, production-ready implementations saved to `pal_generated.code` for your CLI to review and apply - **Validate your checklists** and implementation plans - **General development questions** and explanations - **Technology comparisons** and best practices @@ -67,8 +67,8 @@ When using advanced reasoning models like **GPT-5 Pro** or **Gemini 3.0 Pro**, t ### How It Works 1. You ask your AI agent to implement a complex new feature using `chat` with a higher-reasoning model such as **GPT-5 Pro** or **Gemini 3.0 Pro** -2. The model generates structured implementation and shares the complete implementation with Zen -3. Zen saves the code to `zen_generated.code` and asks AI agent to implement the plan +2. The model generates structured implementation and shares the complete implementation with PAL +3. PAL saves the code to `pal_generated.code` and asks AI agent to implement the plan 4. AI agent continues from the previous context, reads the file, applies the implementation ### When Code Generation Activates @@ -101,7 +101,7 @@ See the [Configuration Guide](../configuration.md#code-generation-capability) fo **Basic Development Chat:** ``` -"Chat with zen about the best approach for user authentication in my React app" +"Chat with pal about the best approach for user authentication in my React app" ``` **Technology Comparison:** diff --git a/docs/tools/clink.md b/docs/tools/clink.md index 14336a3..debd802 100644 --- a/docs/tools/clink.md +++ b/docs/tools/clink.md @@ -53,7 +53,7 @@ Gemini receives the full conversation context from `consensus` including the con - **Role-based prompts**: Pre-configured roles for planning, code review, or general questions - **Full CLI capabilities**: Gemini can use its own web search, file tools, and latest features - **Token efficiency**: File references (not full content) to conserve tokens -- **Cross-tool collaboration**: Combine with other Zen tools like `planner` → `clink` → `codereview` +- **Cross-tool collaboration**: Combine with other PAL tools like `planner` → `clink` → `codereview` - **Free tier available**: Gemini offers 1,000 requests/day free with a personal Google account - great for cost savings across tools ## Available Roles @@ -120,18 +120,18 @@ then codereview to verify the implementation" ## How Clink Works 1. **Your request** - You ask your current CLI to use `clink` with a specific CLI and role -2. **Background execution** - Zen spawns the configured CLI (e.g., `gemini --output-format json`) +2. **Background execution** - PAL spawns the configured CLI (e.g., `gemini --output-format json`) 3. **Context forwarding** - Your prompt, files (as references), and conversation history are sent as part of the prompt 4. **CLI processing** - Gemini (or other CLI) uses its own tools: web search, file access, thinking modes 5. **Seamless return** - Results flow back into your conversation with full context preserved -6. **Continuation support** - Future tools and models can reference Gemini's findings via [continuation support](../context-revival.md) within Zen. +6. **Continuation support** - Future tools and models can reference Gemini's findings via [continuation support](../context-revival.md) within PAL. ## Best Practices - **Pre-authenticate CLIs**: Install and configure Gemini CLI first (`npm install -g @google/gemini-cli`) - **Choose appropriate roles**: Use `planner` for strategy, `codereviewer` for code, `default` for general questions - **Leverage CLI strengths**: Gemini's 1M context for large codebases, web search for current docs -- **Combine with Zen tools**: Chain `clink` with `planner`, `codereview`, `debug` for powerful workflows +- **Combine with PAL tools**: Chain `clink` with `planner`, `codereview`, `debug` for powerful workflows - **File efficiency**: Pass file paths, let the CLI decide what to read (saves tokens) ## Configuration @@ -153,9 +153,9 @@ Each preset points to role-specific prompts in `systemprompts/clink/`. Duplicate ## When to Use Clink vs Other Tools - **Use `clink`** for: Leveraging external CLI capabilities (Gemini's web search, 1M context), specialized CLI features, cross-CLI collaboration -- **Use `chat`** for: Direct model-to-model conversations within Zen -- **Use `planner`** for: Zen's native planning workflows with step validation -- **Use `codereview`** for: Zen's structured code review with severity levels +- **Use `chat`** for: Direct model-to-model conversations within PAL +- **Use `planner`** for: PAL's native planning workflows with step validation +- **Use `codereview`** for: PAL's structured code review with severity levels ## Setup Requirements @@ -168,7 +168,7 @@ Ensure the relevant CLI is installed and configured: ## Related Guides - [Chat Tool](chat.md) - Direct model conversations -- [Planner Tool](planner.md) - Zen's native planning workflows +- [Planner Tool](planner.md) - PAL's native planning workflows - [CodeReview Tool](codereview.md) - Structured code reviews - [Context Revival](../context-revival.md) - Continuing conversations across tools - [Advanced Usage](../advanced-usage.md) - Complex multi-tool workflows diff --git a/docs/tools/consensus.md b/docs/tools/consensus.md index 2307d89..b237be9 100644 --- a/docs/tools/consensus.md +++ b/docs/tools/consensus.md @@ -27,7 +27,7 @@ The following is a hypothetical example designed to demonstrate how one consensu
- [Zen Consensus Debate](https://github.com/user-attachments/assets/76a23dd5-887a-4382-9cf0-642f5cf6219e) + [PAL Consensus Debate](https://github.com/user-attachments/assets/76a23dd5-887a-4382-9cf0-642f5cf6219e)
@@ -35,7 +35,7 @@ The following is a hypothetical example designed to demonstrate how one consensu **For/Against Analysis:** ``` -Use zen consensus with flash taking a supportive stance and pro being critical to evaluate whether +Use pal consensus with flash taking a supportive stance and pro being critical to evaluate whether we should migrate from REST to GraphQL for our API ``` diff --git a/docs/tools/docgen.md b/docs/tools/docgen.md index 02ccbec..2b411f0 100644 --- a/docs/tools/docgen.md +++ b/docs/tools/docgen.md @@ -32,7 +32,7 @@ Documentation generation excels with analytical models like Gemini Pro or O3, wh **Basic Usage:** ``` -"Use zen to generate documentation for the UserManager class" +"Use pal to generate documentation for the UserManager class" "Document the authentication module with complexity analysis using gemini pro" "Add comprehensive documentation to all methods in src/payment_processor.py" ``` diff --git a/docs/tools/listmodels.md b/docs/tools/listmodels.md index 59bbb37..93b0cc8 100644 --- a/docs/tools/listmodels.md +++ b/docs/tools/listmodels.md @@ -7,7 +7,7 @@ The `listmodels` tool shows which providers are configured, available models, th ## Usage ``` -"Use zen to list available models" +"Use pal to list available models" ``` ## Key Features diff --git a/docs/tools/planner.md b/docs/tools/planner.md index 548e4c6..132456c 100644 --- a/docs/tools/planner.md +++ b/docs/tools/planner.md @@ -19,7 +19,7 @@ The planner tool enables step-by-step thinking with incremental plan building: #### Pro Tip Claude supports `sub-tasks` where it will spawn and run separate background tasks. You can ask Claude to -run Zen's planner with two separate ideas. Then when it's done, use Zen's `consensus` tool to pass the entire +run PAL's planner with two separate ideas. Then when it's done, use PAL's `consensus` tool to pass the entire plan and get expert perspective from two powerful AI models on which one to work on first! Like performing **AB** testing in one-go without the wait! @@ -31,7 +31,7 @@ I implement first? ``` ``` -Use zen's planner and show me how to add real-time notifications to our mobile app +Use pal's planner and show me how to add real-time notifications to our mobile app ``` ``` @@ -55,11 +55,11 @@ Using planner, plan the architecture for a new real-time chat system with 100k c ``` ``` -Create a plan using zen for migrating our React app from JavaScript to TypeScript +Create a plan using pal for migrating our React app from JavaScript to TypeScript ``` ``` -Develop a plan using zen for implementing CI/CD pipelines across our development teams +Develop a plan using pal for implementing CI/CD pipelines across our development teams ``` ## Best Practices @@ -73,11 +73,11 @@ Develop a plan using zen for implementing CI/CD pipelines across our development ## Continue With a New Plan -Like all other tools in Zen, you can `continue` with a new plan using the output from a previous plan by simply saying +Like all other tools in PAL, you can `continue` with a new plan using the output from a previous plan by simply saying ``` -Continue with zen's consensus tool and find out what o3:for and flash:against think of the plan +Continue with pal's consensus tool and find out what o3:for and flash:against think of the plan ``` You can mix and match and take one output and feed it into another, continuing from where you left off using a different -tool / model combination. \ No newline at end of file +tool / model combination. diff --git a/docs/tools/precommit.md b/docs/tools/precommit.md index 8d1a0ae..a84e680 100644 --- a/docs/tools/precommit.md +++ b/docs/tools/precommit.md @@ -32,7 +32,7 @@ After Claude completes the investigation (unless precommit_type is **internal**) - Default validation type is **external** (uses expert model for additional review) - To skip expert validation, explicitly request "don't use any other model" or set precommit_type to "internal" - **CRITICAL**: Minimum 3 steps are enforced - tool will prevent setting `next_step_required=false` before final step -- **MANDATORY**: Changeset file (zen_precommit.changeset) must be created for external validation +- **MANDATORY**: Changeset file (pal_precommit.changeset) must be created for external validation ## Model Recommendation @@ -62,7 +62,7 @@ passing, it went ahead with an initial review with O3; came back clean - all goo Then it shared the changes and relevant code with Gemini 3.0 Pro - the following is the outcome: ``` -⏺ zen:precommit (MCP)(step: "FINAL VALIDATION COMPLETE. All changes have been thoroughly analyzed and are ready for +⏺ pal:precommit (MCP)(step: "FINAL VALIDATION COMPLETE. All changes have been thoroughly analyzed and are ready for commit. The modifications successfully fix 4 GitHub CI test failures with high-quality, defensive implementations that maintain architectural integrity and coding standards. No issues or regressions detected.", step_number: 4, total_steps: 4, next_step_required: false, findings: "COMMIT @@ -101,12 +101,12 @@ Then it shared the changes and relevant code with Gemini 3.0 Pro - the following - Fix Required: Apply the same defensive pattern to the missed location ``` -A subtle but critical issue spotted by Gemini that both Claude + O3 missed. This is the power of running these workflows with Zen. +A subtle but critical issue spotted by Gemini that both Claude + O3 missed. This is the power of running these workflows with PAL. ## Example Prompts ``` -Use zen and perform a thorough precommit ensuring there aren't any new regressions or bugs introduced +Use pal and perform a thorough precommit ensuring there aren't any new regressions or bugs introduced ``` ## Key Features @@ -155,7 +155,7 @@ Use zen and perform a thorough precommit ensuring there aren't any new regressio **Basic Pre-commit Validation:** ``` -"Use zen precommit to validate my changes before committing" +"Use pal precommit to validate my changes before committing" ``` **Security-Focused Validation:** diff --git a/docs/tools/refactor.md b/docs/tools/refactor.md index 9e0e378..59b930e 100644 --- a/docs/tools/refactor.md +++ b/docs/tools/refactor.md @@ -35,13 +35,13 @@ The refactor tool excels with models that have large context windows like Gemini ``` "Use gemini pro to decompose my_crazy_big_class.m into smaller extensions" -"Using zen's refactor decompose the all_in_one_sync_code.swift into maintainable extensions" +"Using pal's refactor decompose the all_in_one_sync_code.swift into maintainable extensions" ``` 💡**Example of a powerful prompt** to get the best out of both Claude + Flash's 1M Context: ``` "First, think about how the authentication module works, find related classes and find - any code smells, then using zen's refactor ask flash to confirm your findings but ask + any code smells, then using pal's refactor ask flash to confirm your findings but ask it to find additional code smells and any other quick-wins and then fix these issues" ``` diff --git a/docs/tools/testgen.md b/docs/tools/testgen.md index 9df50cb..a99448c 100644 --- a/docs/tools/testgen.md +++ b/docs/tools/testgen.md @@ -35,7 +35,7 @@ Test generation excels with extended reasoning models like Gemini Pro or O3, whi **Basic Usage:** ``` -"Use zen to generate tests for User.login() method" +"Use pal to generate tests for User.login() method" "Generate comprehensive tests for the sorting method in src/new_sort.py using o3" "Create tests for edge cases not already covered in our tests using gemini pro" ``` diff --git a/docs/tools/tracer.md b/docs/tools/tracer.md index 9fffab7..1baffc7 100644 --- a/docs/tools/tracer.md +++ b/docs/tools/tracer.md @@ -36,13 +36,13 @@ The `tracer` tool is a specialized prompt-generation tool that creates structure **Method Execution Tracing:** ``` -"Use zen tracer to analyze how UserAuthManager.authenticate is used and why" +"Use pal tracer to analyze how UserAuthManager.authenticate is used and why" ``` → Uses `precision` mode to trace the method's execution flow **Class Dependency Mapping:** ``` -"Use zen to generate a dependency trace for the PaymentProcessor class to understand its relationships" +"Use pal to generate a dependency trace for the PaymentProcessor class to understand its relationships" ``` → Uses `dependencies` mode to map structural relationships diff --git a/docs/tools/version.md b/docs/tools/version.md index 51d68dd..8cc1629 100644 --- a/docs/tools/version.md +++ b/docs/tools/version.md @@ -2,12 +2,12 @@ **Get server version, configuration details, and list of available tools** -The `version` tool provides information about the Zen MCP Server version, configuration details, and system capabilities. This is useful for debugging, understanding server capabilities, and verifying your installation. +The `version` tool provides information about the PAL MCP Server version, configuration details, and system capabilities. This is useful for debugging, understanding server capabilities, and verifying your installation. ## Usage ``` -"Get zen to show its version" +"Get pal to show its version" ``` ## Key Features @@ -48,7 +48,7 @@ The tool provides: ## Example Output ``` -🔧 Zen MCP Server Information +🔧 PAL MCP Server Information 📋 Version: 2.15.0 🏗️ Build: 2024-01-15T10:30:00Z (commit: abc123f) diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index d09ec6b..a4cb141 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -2,12 +2,12 @@ ## Quick Debugging Steps -If you're experiencing issues with the Zen MCP Server, follow these steps: +If you're experiencing issues with the PAL MCP Server, follow these steps: ### 1. Check MCP Connection -Open Claude Desktop and type `/mcp` to see if zen is connected: -- ✅ If zen appears in the list, the connection is working +Open Claude Desktop and type `/mcp` to see if pal is connected: +- ✅ If pal appears in the list, the connection is working - ❌ If not listed or shows an error, continue to step 2 ### 2. Launch Claude with Debug Mode @@ -79,14 +79,14 @@ See [Logging Documentation](logging.md) for more details on accessing logs. **Python module not found** - Run `./run-server.sh` to reinstall dependencies -- Check virtual environment is activated: should see `.zen_venv` in the Python path +- Check virtual environment is activated: should see `.pal_venv` in the Python path ### 6. Environment Issues **Virtual Environment Problems** ```bash # Reset environment completely -rm -rf .zen_venv +rm -rf .pal_venv ./run-server.sh ``` diff --git a/docs/wsl-setup.md b/docs/wsl-setup.md index c417ef1..28344b2 100644 --- a/docs/wsl-setup.md +++ b/docs/wsl-setup.md @@ -1,6 +1,6 @@ # WSL (Windows Subsystem for Linux) Setup Guide -This guide provides detailed instructions for setting up Zen MCP Server on Windows using WSL. +This guide provides detailed instructions for setting up PAL MCP Server on Windows using WSL. ## Prerequisites for WSL @@ -27,8 +27,8 @@ npm install -g @anthropic-ai/claude-code cd ~ # Clone the repository - git clone https://github.com/BeehiveInnovations/zen-mcp-server.git - cd zen-mcp-server + git clone https://github.com/BeehiveInnovations/pal-mcp-server.git + cd pal-mcp-server ``` 2. **Run the setup script**: @@ -43,7 +43,7 @@ npm install -g @anthropic-ai/claude-code # List configured MCP servers claude mcp list - # You should see 'zen' listed in the output + # You should see 'pal' listed in the output # If not, the setup script will provide the correct configuration ``` @@ -61,19 +61,19 @@ python3 -m pip install --upgrade pip ### Path Issues -- Always use the full WSL path for MCP configuration (e.g., `/home/YourName/zen-mcp-server/`) +- Always use the full WSL path for MCP configuration (e.g., `/home/YourName/pal-mcp-server/`) - The setup script automatically detects WSL and configures the correct paths ### Claude Code Connection Issues ```bash # If Claude Code can't connect to the MCP server, check the configuration -cat ~/.claude.json | grep -A 10 "zen" +cat ~/.claude.json | grep -A 10 "pal" # The configuration should show the correct WSL path to the Python executable -# Example: "/home/YourName/zen-mcp-server/.zen_venv/bin/python" +# Example: "/home/YourName/pal-mcp-server/.pal_venv/bin/python" ``` ### Performance Tip -For best performance, keep your zen-mcp-server directory in the WSL filesystem (e.g., `~/zen-mcp-server`) rather than in the Windows filesystem (`/mnt/c/...`). \ No newline at end of file +For best performance, keep your pal-mcp-server directory in the WSL filesystem (e.g., `~/pal-mcp-server`) rather than in the Windows filesystem (`/mnt/c/...`). \ No newline at end of file diff --git a/examples/claude_config_macos.json b/examples/claude_config_macos.json index c1657af..b91660d 100644 --- a/examples/claude_config_macos.json +++ b/examples/claude_config_macos.json @@ -3,9 +3,9 @@ "comment2": "Run './run-server.sh' to set up the environment and get exact paths", "comment3": "Use './run-server.sh -c' to display the correct configuration", "mcpServers": { - "zen": { - "command": "/path/to/zen-mcp-server/.zen_venv/bin/python", - "args": ["/path/to/zen-mcp-server/server.py"] + "pal": { + "command": "/path/to/pal-mcp-server/.pal_venv/bin/python", + "args": ["/path/to/pal-mcp-server/server.py"] } } } \ No newline at end of file diff --git a/examples/claude_config_wsl.json b/examples/claude_config_wsl.json index b0dae6d..8445f00 100644 --- a/examples/claude_config_wsl.json +++ b/examples/claude_config_wsl.json @@ -3,11 +3,11 @@ "comment2": "Run './run-server.sh' in WSL to set up the environment and get exact paths", "comment3": "Use './run-server.sh -c' to display the correct configuration", "mcpServers": { - "zen": { + "pal": { "command": "wsl.exe", "args": [ - "/path/to/zen-mcp-server/.zen_venv/bin/python", - "/path/to/zen-mcp-server/server.py" + "/path/to/pal-mcp-server/.pal_venv/bin/python", + "/path/to/pal-mcp-server/server.py" ] } } diff --git a/zen-mcp-server b/pal-mcp-server similarity index 71% rename from zen-mcp-server rename to pal-mcp-server index 9375307..9eba7d4 100755 --- a/zen-mcp-server +++ b/pal-mcp-server @@ -4,8 +4,8 @@ # Get the directory of this script DIR="$(cd "$(dirname "$0")" && pwd)" -# Change to the zen-mcp-server directory +# Change to the pal-mcp-server directory cd "$DIR" # Execute the Python server with all arguments passed through -exec .zen_venv/bin/python server.py "$@" \ No newline at end of file +exec .pal_venv/bin/python server.py "$@" \ No newline at end of file diff --git a/providers/openrouter.py b/providers/openrouter.py index 26a0ea7..f69064e 100644 --- a/providers/openrouter.py +++ b/providers/openrouter.py @@ -35,9 +35,9 @@ class OpenRouterProvider(OpenAICompatibleProvider): # Custom headers required by OpenRouter DEFAULT_HEADERS = { - "HTTP-Referer": get_env("OPENROUTER_REFERER", "https://github.com/BeehiveInnovations/zen-mcp-server") - or "https://github.com/BeehiveInnovations/zen-mcp-server", - "X-Title": get_env("OPENROUTER_TITLE", "Zen MCP Server") or "Zen MCP Server", + "HTTP-Referer": get_env("OPENROUTER_REFERER", "https://github.com/BeehiveInnovations/pal-mcp-server") + or "https://github.com/BeehiveInnovations/pal-mcp-server", + "X-Title": get_env("OPENROUTER_TITLE", "PAL MCP Server") or "PAL MCP Server", } # Model registry for managing configurations and aliases diff --git a/pyproject.toml b/pyproject.toml index 4b28e8f..17c03d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] -name = "zen-mcp-server" -version = "9.4.1" +name = "pal-mcp-server" +version = "9.4.2" description = "AI-powered MCP server with multiple model providers" requires-python = ">=3.9" dependencies = [ @@ -36,7 +36,7 @@ py-modules = ["server", "config"] ] [project.scripts] -zen-mcp-server = "server:run" +pal-mcp-server = "server:run" [tool.black] line-length = 120 @@ -51,7 +51,7 @@ extend-exclude = ''' | \.mypy_cache | \.tox | \.venv - | \.zen_venv + | \.pal_venv | venv | _build | buck-out @@ -68,7 +68,7 @@ force_grid_wrap = 0 use_parentheses = true ensure_newline_before_comments = true line_length = 120 -skip_glob = ["venv/*", ".venv/*", ".zen_venv/*"] +skip_glob = ["venv/*", ".venv/*", ".pal_venv/*"] [tool.ruff] target-version = "py39" diff --git a/run-server.ps1 b/run-server.ps1 index 2a32195..56240cc 100644 --- a/run-server.ps1 +++ b/run-server.ps1 @@ -1,9 +1,9 @@ <# .SYNOPSIS - Installation, configuration, and launch script for Zen MCP server on Windows. + Installation, configuration, and launch script for PAL MCP server on Windows. .DESCRIPTION - This PowerShell script prepares the environment for the Zen MCP server: + This PowerShell script prepares the environment for the PAL MCP server: - Installs and checks Python 3.10+ (with venv or uv if available) - Installs required Python dependencies - Configures environment files (.env) @@ -17,7 +17,7 @@ Shows script help. .PARAMETER Version - Shows Zen MCP server version. + Shows PAL MCP server version. .PARAMETER Follow Follows server logs in real time. @@ -48,7 +48,7 @@ .EXAMPLE .\run-server.ps1 - Prepares the environment and starts the Zen MCP server. + Prepares the environment and starts the PAL MCP server. .\run-server.ps1 -Follow Follows server logs in real time. @@ -73,7 +73,7 @@ Script Author : GiGiDKR (https://github.com/GiGiDKR) Date : 07-05-2025 Version : See config.py (__version__) - References : https://github.com/BeehiveInnovations/zen-mcp-server + References : https://github.com/BeehiveInnovations/pal-mcp-server #> #Requires -Version 5.1 @@ -93,7 +93,7 @@ param( ) # ============================================================================ -# Zen MCP Server Setup Script for Windows +# PAL MCP Server Setup Script for Windows # # A Windows-compatible setup script that handles environment setup, # dependency installation, and configuration. @@ -106,11 +106,12 @@ $ErrorActionPreference = "Stop" # Constants and Configuration # ---------------------------------------------------------------------------- -$script:VENV_PATH = ".zen_venv" +$script:VENV_PATH = ".pal_venv" $script:DOCKER_CLEANED_FLAG = ".docker_cleaned" $script:DESKTOP_CONFIG_FLAG = ".desktop_configured" $script:LOG_DIR = "logs" $script:LOG_FILE = "mcp_server.log" +$script:LegacyServerNames = @("zen", "zen-mcp", "zen-mcp-server", "zen_mcp", "zen_mcp_server") # ---------------------------------------------------------------------------- # Utility Functions @@ -209,6 +210,31 @@ function Remove-LockedDirectory { } } +# Remove legacy MCP server entries from a hash/dictionary or PSObject +function Remove-LegacyServerKeys { + param([object]$Container) + + $removed = $false + if ($null -eq $Container) { + return $false + } + + foreach ($legacy in $script:LegacyServerNames) { + if ($Container -is [System.Collections.IDictionary]) { + if ($Container.Contains($legacy)) { + $Container.Remove($legacy) | Out-Null + $removed = $true + } + } + elseif ($Container.PSObject -and $Container.PSObject.Properties[$legacy]) { + $Container.PSObject.Properties.Remove($legacy) + $removed = $true + } + } + + return $removed +} + # Manage configuration file backups with maximum 3 files retention function Manage-ConfigBackups { param( @@ -382,9 +408,9 @@ function Cleanup-Docker { $containers = @( "gemini-mcp-server", "gemini-mcp-redis", - "zen-mcp-server", - "zen-mcp-redis", - "zen-mcp-log-monitor" + "pal-mcp-server", + "pal-mcp-redis", + "pal-mcp-log-monitor" ) # Remove containers @@ -407,7 +433,7 @@ function Cleanup-Docker { } # Remove images - $images = @("gemini-mcp-server:latest", "zen-mcp-server:latest") + $images = @("gemini-mcp-server:latest", "pal-mcp-server:latest") foreach ($image in $images) { try { $exists = docker images --format "{{.Repository}}:{{.Tag}}" | Where-Object { $_ -eq $image } @@ -786,7 +812,7 @@ function Build-DockerImage { # Check if image exists try { - $imageExists = docker images --format "{{.Repository}}:{{.Tag}}" | Where-Object { $_ -eq "zen-mcp-server:latest" } + $imageExists = docker images --format "{{.Repository}}:{{.Tag}}" | Where-Object { $_ -eq "pal-mcp-server:latest" } if ($imageExists -and !$Force) { Write-Success "Docker image already exists. Use -Force to rebuild." return $true @@ -799,7 +825,7 @@ function Build-DockerImage { if ($Force -and $imageExists) { Write-Info "Forcing rebuild of Docker image..." try { - docker rmi zen-mcp-server:latest 2>$null + docker rmi pal-mcp-server:latest 2>$null } catch { Write-Warning "Could not remove existing image, continuing..." @@ -814,7 +840,7 @@ function Build-DockerImage { Write-Info "Building with development support..." } - docker build -t zen-mcp-server:latest . + docker build -t pal-mcp-server:latest . if ($LASTEXITCODE -ne 0) { throw "Docker build failed" } @@ -901,7 +927,7 @@ function Start-DockerServices { } # Start services - Write-Info "Starting Zen MCP Server with Docker Compose..." + Write-Info "Starting PAL MCP Server with Docker Compose..." if (Test-Command "docker-compose") { if ($Follow) { docker-compose up --build @@ -925,10 +951,10 @@ function Start-DockerServices { if (!$Follow) { Write-Success "Docker services started successfully" - Write-Info "Container name: zen-mcp-server" + Write-Info "Container name: pal-mcp-server" Write-Host "" Write-Host "To view logs: " -NoNewline - Write-Host "docker logs -f zen-mcp-server" -ForegroundColor Yellow + Write-Host "docker logs -f pal-mcp-server" -ForegroundColor Yellow Write-Host "To stop: " -NoNewline Write-Host "docker-compose down" -ForegroundColor Yellow } @@ -944,7 +970,7 @@ function Start-DockerServices { # Get Docker container status function Get-DockerStatus { try { - $containerStatus = docker ps --filter "name=zen-mcp-server" --format "{{.Status}}" + $containerStatus = docker ps --filter "name=pal-mcp-server" --format "{{.Status}}" if ($containerStatus) { Write-Success "Container status: $containerStatus" return $true @@ -1018,7 +1044,7 @@ $script:McpClientDefinitions = @( DetectionPath = "$env:APPDATA\Claude\claude_desktop_config.json" DetectionType = "Path" ConfigPath = "$env:APPDATA\Claude\claude_desktop_config.json" - ConfigJsonPath = "mcpServers.zen" + ConfigJsonPath = "mcpServers.pal" NeedsConfigDir = $true }, @{ @@ -1026,7 +1052,7 @@ $script:McpClientDefinitions = @( DetectionCommand = "code" DetectionType = "Command" ConfigPath = "$env:APPDATA\Code\User\settings.json" - ConfigJsonPath = "mcp.servers.zen" + ConfigJsonPath = "mcp.servers.pal" IsVSCode = $true }, @{ @@ -1034,7 +1060,7 @@ $script:McpClientDefinitions = @( DetectionCommand = "code-insiders" DetectionType = "Command" ConfigPath = "$env:APPDATA\Code - Insiders\User\mcp.json" - ConfigJsonPath = "servers.zen" + ConfigJsonPath = "servers.pal" IsVSCodeInsiders = $true }, @{ @@ -1042,28 +1068,28 @@ $script:McpClientDefinitions = @( DetectionCommand = "cursor" DetectionType = "Command" ConfigPath = "$env:USERPROFILE\.cursor\mcp.json" - ConfigJsonPath = "mcpServers.zen" + ConfigJsonPath = "mcpServers.pal" }, @{ Name = "Windsurf" DetectionPath = "$env:USERPROFILE\.codeium\windsurf" DetectionType = "Path" ConfigPath = "$env:USERPROFILE\.codeium\windsurf\mcp_config.json" - ConfigJsonPath = "mcpServers.zen" + ConfigJsonPath = "mcpServers.pal" }, @{ Name = "Trae" DetectionPath = "$env:APPDATA\Trae" DetectionType = "Path" ConfigPath = "$env:APPDATA\Trae\User\mcp.json" - ConfigJsonPath = "mcpServers.zen" + ConfigJsonPath = "mcpServers.pal" } ) # Docker MCP configuration template (legacy, kept for backward compatibility) $script:DockerMcpConfig = @{ command = "docker" - args = @("exec", "-i", "zen-mcp-server", "python", "server.py") + args = @("exec", "-i", "pal-mcp-server", "python", "server.py") type = "stdio" } @@ -1076,7 +1102,7 @@ function Get-DockerMcpConfigRun { return @{ command = "docker" - args = @("run", "--rm", "-i", "--env-file", $envFile, "zen-mcp-server:latest", "python", "server.py") + args = @("run", "--rm", "-i", "--env-file", $envFile, "pal-mcp-server:latest", "python", "server.py") type = "stdio" } } @@ -1103,7 +1129,7 @@ function Test-McpJsonFormat { function Test-VSCodeInsidersFormat { param([hashtable]$Client) - return $Client.IsVSCodeInsiders -eq $true -and $Client.ConfigJsonPath -eq "servers.zen" + return $Client.IsVSCodeInsiders -eq $true -and $Client.ConfigJsonPath -eq "servers.pal" } # Analyze existing MCP configuration to determine type (Python or Docker) @@ -1133,9 +1159,9 @@ function Get-ExistingMcpConfigType { } } - # Navigate to zen configuration + # Navigate to pal configuration $pathParts = $Client.ConfigJsonPath.Split('.') - $zenKey = $pathParts[-1] + $palKey = $pathParts[-1] $parentPath = $pathParts[0..($pathParts.Length - 2)] $targetObject = $content @@ -1150,32 +1176,32 @@ function Get-ExistingMcpConfigType { $targetObject = $targetObject.$key } - if (!$targetObject.PSObject.Properties[$zenKey]) { + if (!$targetObject.PSObject.Properties[$palKey]) { return @{ Exists = $false Type = "None" - Details = "Zen configuration not found" + Details = "PAL configuration not found" } } - $zenConfig = $targetObject.$zenKey + $palConfig = $targetObject.$palKey # Analyze configuration type - if ($zenConfig.command -eq "docker") { + if ($palConfig.command -eq "docker") { $dockerType = "Unknown" $details = "Docker configuration" - if ($zenConfig.args -and $zenConfig.args.Count -gt 0) { - if ($zenConfig.args[0] -eq "run") { + if ($palConfig.args -and $palConfig.args.Count -gt 0) { + if ($palConfig.args[0] -eq "run") { $dockerType = "Docker Run" $details = "Docker run (dedicated container)" } - elseif ($zenConfig.args[0] -eq "exec") { + elseif ($palConfig.args[0] -eq "exec") { $dockerType = "Docker Exec" $details = "Docker exec (existing container)" } else { - $details = "Docker ($($zenConfig.args[0]))" + $details = "Docker ($($palConfig.args[0]))" } } @@ -1184,18 +1210,18 @@ function Get-ExistingMcpConfigType { Type = "Docker" SubType = $dockerType Details = $details - Command = $zenConfig.command - Args = $zenConfig.args + Command = $palConfig.command + Args = $palConfig.args } } - elseif ($zenConfig.command -and $zenConfig.command.EndsWith("python.exe")) { + elseif ($palConfig.command -and $palConfig.command.EndsWith("python.exe")) { $pythonType = "Python" $details = "Python virtual environment" - if ($zenConfig.command.Contains(".zen_venv")) { - $details = "Python (zen virtual environment)" + if ($palConfig.command.Contains(".pal_venv")) { + $details = "Python (pal virtual environment)" } - elseif ($zenConfig.command.Contains("venv")) { + elseif ($palConfig.command.Contains("venv")) { $details = "Python (virtual environment)" } else { @@ -1207,17 +1233,17 @@ function Get-ExistingMcpConfigType { Type = "Python" SubType = $pythonType Details = $details - Command = $zenConfig.command - Args = $zenConfig.args + Command = $palConfig.command + Args = $palConfig.args } } else { return @{ Exists = $true Type = "Unknown" - Details = "Unknown configuration type: $($zenConfig.command)" - Command = $zenConfig.command - Args = $zenConfig.args + Details = "Unknown configuration type: $($palConfig.command)" + Command = $palConfig.command + Args = $palConfig.args } } @@ -1337,7 +1363,7 @@ function Configure-McpClient { $newConfigType = if ($UseDocker) { "Docker" } else { "Python" } if ($existingConfig.Exists) { - Write-Info "Found existing Zen MCP configuration in $($Client.Name)" + Write-Info "Found existing PAL MCP configuration in $($Client.Name)" Write-Info " Current: $($existingConfig.Details)" Write-Info " New: $newConfigType configuration" @@ -1360,7 +1386,7 @@ function Configure-McpClient { } else { # User confirmation for new installation - $response = Read-Host "`nConfigure Zen MCP for $($Client.Name) (mode: $newConfigType)? (y/N)" + $response = Read-Host "`nConfigure PAL MCP for $($Client.Name) (mode: $newConfigType)? (y/N)" if ($response -ne 'y' -and $response -ne 'Y') { Write-Info "Skipping $($Client.Name) integration" return @@ -1429,7 +1455,7 @@ function Configure-McpClient { # Navigate and set configuration $pathParts = $Client.ConfigJsonPath.Split('.') - $zenKey = $pathParts[-1] + $palKey = $pathParts[-1] $parentPath = $pathParts[0..($pathParts.Length - 2)] $targetObject = $config @@ -1440,7 +1466,13 @@ function Configure-McpClient { $targetObject = $targetObject.$key } - $targetObject | Add-Member -MemberType NoteProperty -Name $zenKey -Value $serverConfig -Force + # Remove legacy zen entries to avoid duplicate or broken MCP servers + $legacyRemoved = Remove-LegacyServerKeys $targetObject + if ($legacyRemoved) { + Write-Info "Removed legacy MCP entries (zen → pal)" + } + + $targetObject | Add-Member -MemberType NoteProperty -Name $palKey -Value $serverConfig -Force # Write config $config | ConvertTo-Json -Depth 10 | Out-File $configPath -Encoding UTF8 @@ -1487,62 +1519,108 @@ function Test-ClaudeCliIntegration { } Write-Info "Claude CLI detected - checking configuration..." + + foreach ($legacy in $script:LegacyServerNames) { + try { claude mcp remove -s user $legacy 2>$null | Out-Null } catch {} + } try { $claudeConfig = claude mcp list 2>$null - if ($claudeConfig -match "zen") { - Write-Success "Claude CLI already configured for zen server" + if ($claudeConfig -match "pal") { + Write-Success "Claude CLI already configured for pal server" } else { - Write-Info "To add zen server to Claude CLI, run:" - Write-Host " claude mcp add -s user zen $PythonPath $ServerPath" -ForegroundColor Cyan + Write-Info "To add pal server to Claude CLI, run:" + Write-Host " claude mcp add -s user pal $PythonPath $ServerPath" -ForegroundColor Cyan } } catch { Write-Info "To configure Claude CLI manually, run:" - Write-Host " claude mcp add -s user zen $PythonPath $ServerPath" -ForegroundColor Cyan + Write-Host " claude mcp add -s user pal $PythonPath $ServerPath" -ForegroundColor Cyan } } function Test-GeminiCliIntegration { param([string]$ScriptDir) - $zenWrapper = Join-Path $ScriptDir "zen-mcp-server.cmd" + $palWrapper = Join-Path $ScriptDir "pal-mcp-server.cmd" # Check if Gemini settings file exists (Windows path) $geminiConfig = "$env:USERPROFILE\.gemini\settings.json" if (!(Test-Path $geminiConfig)) { return } - - # Check if zen is already configured + + # Load existing config + $config = @{} $configContent = Get-Content $geminiConfig -Raw -ErrorAction SilentlyContinue - if ($configContent -and $configContent -match '"zen"') { + if ($configContent) { + try { $config = $configContent | ConvertFrom-Json -ErrorAction Stop } catch { $config = @{} } + } + if ($null -eq $config -or $config -isnot [System.Collections.IDictionary]) { + $config = @{} + } + + if (-not $config.mcpServers -or $config.mcpServers -isnot [System.Collections.IDictionary]) { + $config.mcpServers = [ordered]@{} + } + + $legacyRemoved = Remove-LegacyServerKeys $config.mcpServers + $palConfig = $config.mcpServers.pal + $needsWrite = $legacyRemoved + + if ($palConfig) { + if ($palConfig.command -ne $palWrapper) { + $palConfig.command = $palWrapper + $needsWrite = $true + } + + if (!(Test-Path $palWrapper)) { + Write-Info "Creating wrapper script for Gemini CLI..." + @" +@echo off +cd /d "%~dp0" +if exist ".pal_venv\Scripts\python.exe" ( + .pal_venv\Scripts\python.exe server.py %* +) else ( + python server.py %* +) +"@ | Out-File -FilePath $palWrapper -Encoding ASCII + Write-Success "Created pal-mcp-server.cmd wrapper script" + } + + if ($needsWrite) { + Manage-ConfigBackups -ConfigFilePath $geminiConfig | Out-Null + $config | ConvertTo-Json -Depth 10 | Out-File $geminiConfig -Encoding UTF8 + Write-Success "Updated Gemini CLI configuration (cleaned legacy entries)" + Write-Host " Config: $geminiConfig" -ForegroundColor Gray + Write-Host " Restart Gemini CLI to use PAL MCP Server" -ForegroundColor Gray + } return } - - # Ask user if they want to add Zen to Gemini CLI + + # Ask user if they want to add PAL to Gemini CLI Write-Host "" - $response = Read-Host "Configure Zen for Gemini CLI? (y/N)" + $response = Read-Host "Configure PAL for Gemini CLI? (y/N)" if ($response -ne 'y' -and $response -ne 'Y') { Write-Info "Skipping Gemini CLI integration" return } # Ensure wrapper script exists - if (!(Test-Path $zenWrapper)) { + if (!(Test-Path $palWrapper)) { Write-Info "Creating wrapper script for Gemini CLI..." @" @echo off cd /d "%~dp0" -if exist ".zen_venv\Scripts\python.exe" ( - .zen_venv\Scripts\python.exe server.py %* +if exist ".pal_venv\Scripts\python.exe" ( + .pal_venv\Scripts\python.exe server.py %* ) else ( python server.py %* ) -"@ | Out-File -FilePath $zenWrapper -Encoding ASCII +"@ | Out-File -FilePath $palWrapper -Encoding ASCII - Write-Success "Created zen-mcp-server.cmd wrapper script" + Write-Success "Created pal-mcp-server.cmd wrapper script" } # Update Gemini settings @@ -1552,30 +1630,24 @@ if exist ".zen_venv\Scripts\python.exe" ( # Create backup with retention management $backupPath = Manage-ConfigBackups $geminiConfig - # Read existing config or create new one - $config = @{} - if (Test-Path $geminiConfig) { - $config = Get-Content $geminiConfig -Raw | ConvertFrom-Json - } - # Ensure mcpServers exists - if (!$config.mcpServers) { - $config | Add-Member -MemberType NoteProperty -Name "mcpServers" -Value @{} -Force + if (-not $config.mcpServers -or $config.mcpServers -isnot [System.Collections.IDictionary]) { + $config.mcpServers = [ordered]@{} } - # Add zen server - $zenConfig = @{ - command = $zenWrapper + # Add pal server + $palConfig = @{ + command = $palWrapper } - $config.mcpServers | Add-Member -MemberType NoteProperty -Name "zen" -Value $zenConfig -Force + $config.mcpServers | Add-Member -MemberType NoteProperty -Name "pal" -Value $palConfig -Force # Write updated config $config | ConvertTo-Json -Depth 10 | Out-File $geminiConfig -Encoding UTF8 Write-Success "Successfully configured Gemini CLI" Write-Host " Config: $geminiConfig" -ForegroundColor Gray - Write-Host " Restart Gemini CLI to use Zen MCP Server" -ForegroundColor Gray + Write-Host " Restart Gemini CLI to use PAL MCP Server" -ForegroundColor Gray } catch { @@ -1586,8 +1658,8 @@ if exist ".zen_venv\Scripts\python.exe" ( Write-Host @" { "mcpServers": { - "zen": { - "command": "$zenWrapper" + "pal": { + "command": "$palWrapper" } } } @@ -1615,7 +1687,7 @@ function Show-QwenManualConfig { Write-Host "{" -ForegroundColor Yellow Write-Host " \"mcpServers\": {" -ForegroundColor Yellow - Write-Host " \"zen\": {" -ForegroundColor Yellow + Write-Host " \"pal\": {" -ForegroundColor Yellow Write-Host " \"command\": \"$PythonPath\"," -ForegroundColor Yellow Write-Host " \"args\": [\"$ServerPath\"]," -ForegroundColor Yellow Write-Host " \"cwd\": \"$ScriptDir\"," -ForegroundColor Yellow @@ -1629,7 +1701,7 @@ function Show-QwenManualConfig { else { Write-Host "{" -ForegroundColor Yellow Write-Host " \"mcpServers\": {" -ForegroundColor Yellow - Write-Host " \"zen\": {" -ForegroundColor Yellow + Write-Host " \"pal\": {" -ForegroundColor Yellow Write-Host " \"command\": \"$PythonPath\"," -ForegroundColor Yellow Write-Host " \"args\": [\"$ServerPath\"]," -ForegroundColor Yellow Write-Host " \"cwd\": \"$ScriptDir\"" -ForegroundColor Yellow @@ -1653,6 +1725,8 @@ function Test-QwenCliIntegration { $scriptDir = Split-Path $ServerPath -Parent $configStatus = "missing" + $legacyRemoved = $false + $skipPrompt = $false $config = @{} if (Test-Path $configPath) { @@ -1668,11 +1742,12 @@ function Test-QwenCliIntegration { if ($config.ContainsKey('mcpServers') -and $config['mcpServers'] -is [System.Collections.IDictionary]) { $servers = $config['mcpServers'] - if ($servers.Contains('zen') -and $servers['zen'] -is [System.Collections.IDictionary]) { - $zenConfig = $servers['zen'] - $commandMatches = ($zenConfig['command'] -eq $PythonPath) + $legacyRemoved = (Remove-LegacyServerKeys $servers) -or $legacyRemoved + if ($servers.Contains('pal') -and $servers['pal'] -is [System.Collections.IDictionary]) { + $palConfig = $servers['pal'] + $commandMatches = ($palConfig['command'] -eq $PythonPath) - $argsValue = $zenConfig['args'] + $argsValue = $palConfig['args'] $argsList = @() if ($argsValue -is [System.Collections.IEnumerable] -and $argsValue -isnot [string]) { $argsList = @($argsValue) @@ -1683,18 +1758,18 @@ function Test-QwenCliIntegration { $argsMatches = ($argsList.Count -eq 1 -and $argsList[0] -eq $ServerPath) $cwdValue = $null - if ($zenConfig.Contains('cwd')) { - $cwdValue = $zenConfig['cwd'] + if ($palConfig.Contains('cwd')) { + $cwdValue = $palConfig['cwd'] } $cwdMatches = ([string]::IsNullOrEmpty($cwdValue) -or $cwdValue -eq $scriptDir) if ($commandMatches -and $argsMatches -and $cwdMatches) { - Write-Success "Qwen CLI already configured for zen server" - return + $configStatus = $legacyRemoved ? "cleanup" : "match" + } + else { + $configStatus = "mismatch" + Write-Warning "Existing Qwen CLI configuration differs from the current setup." } - - $configStatus = "mismatch" - Write-Warning "Existing Qwen CLI configuration differs from the current setup." } } } @@ -1735,7 +1810,7 @@ function Test-QwenCliIntegration { "AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_API_VERSION", "AZURE_OPENAI_ALLOWED_MODELS", "AZURE_MODELS_CONFIG_PATH", "CUSTOM_API_URL", "CUSTOM_API_KEY", "CUSTOM_MODEL_NAME", "DEFAULT_MODEL", "GOOGLE_ALLOWED_MODELS", "OPENAI_ALLOWED_MODELS", "OPENROUTER_ALLOWED_MODELS", "XAI_ALLOWED_MODELS", "DEFAULT_THINKING_MODE_THINKDEEP", - "DISABLED_TOOLS", "CONVERSATION_TIMEOUT_HOURS", "MAX_CONVERSATION_TURNS", "LOG_LEVEL", "ZEN_MCP_FORCE_ENV_OVERRIDE" + "DISABLED_TOOLS", "CONVERSATION_TIMEOUT_HOURS", "MAX_CONVERSATION_TURNS", "LOG_LEVEL", "PAL_MCP_FORCE_ENV_OVERRIDE" ) foreach ($key in $extraKeys) { @@ -1747,16 +1822,31 @@ function Test-QwenCliIntegration { } } - $prompt = "Configure Zen for Qwen CLI? (y/N)" - if ($configStatus -eq "mismatch" -or $configStatus -eq "invalid") { - $prompt = "Update Qwen CLI zen configuration? (y/N)" + if ($configStatus -eq "match") { + Write-Success "Qwen CLI already configured for pal server" + return } - $response = Read-Host $prompt - if ($response -ne 'y' -and $response -ne 'Y') { - Write-Info "Skipping Qwen CLI integration" - Show-QwenManualConfig $PythonPath $ServerPath $scriptDir $configPath $envMap - return + if ($configStatus -eq "cleanup") { + Write-Info "Removing legacy Qwen MCP entries from previous zen configuration..." + $skipPrompt = $true + } + + $prompt = "Configure PAL for Qwen CLI? (y/N)" + if ($configStatus -eq "cleanup") { + $prompt = "Remove legacy Qwen MCP entries and refresh configuration? (Y/n)" + } + elseif ($configStatus -eq "mismatch" -or $configStatus -eq "invalid") { + $prompt = "Update Qwen CLI pal configuration? (y/N)" + } + + if (-not $skipPrompt) { + $response = Read-Host $prompt + if ($response -ne 'y' -and $response -ne 'Y') { + Write-Info "Skipping Qwen CLI integration" + Show-QwenManualConfig $PythonPath $ServerPath $scriptDir $configPath $envMap + return + } } if (!(Test-Path $configDir)) { @@ -1776,24 +1866,24 @@ function Test-QwenCliIntegration { $config['mcpServers'] = @{} } - $zenConfig = [ordered]@{ + $palConfig = [ordered]@{ command = $PythonPath args = @($ServerPath) cwd = $scriptDir } if ($envMap.Count -gt 0) { - $zenConfig['env'] = $envMap + $palConfig['env'] = $envMap } - $config['mcpServers']['zen'] = $zenConfig + $config['mcpServers']['pal'] = $palConfig $json = ($config | ConvertTo-Json -Depth 20) Set-Content -Path $configPath -Value $json -Encoding UTF8 Write-Success "Successfully configured Qwen CLI" Write-Host " Config: $configPath" -ForegroundColor Gray - Write-Host " Restart Qwen CLI to use Zen MCP Server" -ForegroundColor Gray + Write-Host " Restart Qwen CLI to use PAL MCP Server" -ForegroundColor Gray } catch { Write-Error "Failed to update Qwen CLI configuration: $_" @@ -1813,7 +1903,7 @@ function Test-QwenCliIntegration { # Show script help function Show-Help { Write-Host @" -Zen MCP Server - Setup and Launch Script +PAL MCP Server - Setup and Launch Script USAGE: .\run-server.ps1 [OPTIONS] @@ -1838,17 +1928,17 @@ EXAMPLES: .\run-server.ps1 -Docker # Use Docker deployment .\run-server.ps1 -Docker -Follow # Docker with log following -For more information, visit: https://github.com/BeehiveInnovations/zen-mcp-server +For more information, visit: https://github.com/BeehiveInnovations/pal-mcp-server "@ -ForegroundColor White } # Show version information function Show-Version { $version = Get-Version - Write-Host "Zen MCP Server version: $version" -ForegroundColor Green + Write-Host "PAL MCP Server version: $version" -ForegroundColor Green Write-Host "PowerShell Setup Script for Windows" -ForegroundColor Cyan Write-Host "Author: GiGiDKR (https://github.com/GiGiDKR)" -ForegroundColor Gray - Write-Host "Project: BeehiveInnovations/zen-mcp-server" -ForegroundColor Gray + Write-Host "Project: BeehiveInnovations/pal-mcp-server" -ForegroundColor Gray } # Show configuration instructions @@ -1886,7 +1976,7 @@ function Show-ConfigInstructions { Write-Host "✓ Qwen CLI" -ForegroundColor White Write-Host "" Write-Host "The script automatically detects and configures compatible clients." -ForegroundColor Gray - Write-Host "Restart your MCP clients after configuration to use the Zen MCP Server." -ForegroundColor Yellow + Write-Host "Restart your MCP clients after configuration to use the PAL MCP Server." -ForegroundColor Yellow } # Show setup instructions @@ -1900,11 +1990,11 @@ function Show-SetupInstructions { Write-Step "Setup Complete" if ($UseDocker) { - Write-Success "Zen MCP Server is configured for Docker deployment" - Write-Host "Docker command: docker exec -i zen-mcp-server python server.py" -ForegroundColor Cyan + Write-Success "PAL MCP Server is configured for Docker deployment" + Write-Host "Docker command: docker exec -i pal-mcp-server python server.py" -ForegroundColor Cyan } else { - Write-Success "Zen MCP Server is configured for Python virtual environment" + Write-Success "PAL MCP Server is configured for Python virtual environment" Write-Host "Python: $PythonPath" -ForegroundColor Cyan Write-Host "Server: $ServerPath" -ForegroundColor Cyan } @@ -1916,7 +2006,7 @@ function Show-SetupInstructions { # Start the server function Start-Server { - Write-Step "Starting Zen MCP Server" + Write-Step "Starting PAL MCP Server" $pythonPath = "$VENV_PATH\Scripts\python.exe" if (!(Test-Path $pythonPath)) { @@ -2041,7 +2131,7 @@ function Import-EnvFile { # Docker deployment workflow function Invoke-DockerWorkflow { Write-Step "Starting Docker Workflow" - Write-Host "Zen MCP Server" -ForegroundColor Green + Write-Host "PAL MCP Server" -ForegroundColor Green Write-Host "=================" -ForegroundColor Cyan $version = Get-Version @@ -2064,7 +2154,7 @@ function Invoke-DockerWorkflow { Show-SetupInstructions -UseDocker # Start Docker services - Write-Step "Starting Zen MCP Server" + Write-Step "Starting PAL MCP Server" if ($Follow) { Write-Info "Starting server and following logs..." Start-DockerServices -Follow @@ -2074,7 +2164,7 @@ function Invoke-DockerWorkflow { if (!(Start-DockerServices)) { exit 1 } Write-Host "" - Write-Success "Zen MCP Server is running in Docker!" + Write-Success "PAL MCP Server is running in Docker!" Write-Host "" Write-Host "Next steps:" -ForegroundColor Cyan @@ -2083,7 +2173,7 @@ function Invoke-DockerWorkflow { Write-Host "" Write-Host "Useful commands:" -ForegroundColor Cyan Write-Host " View logs: " -NoNewline -ForegroundColor White - Write-Host "docker logs -f zen-mcp-server" -ForegroundColor Yellow + Write-Host "docker logs -f pal-mcp-server" -ForegroundColor Yellow Write-Host " Stop server: " -NoNewline -ForegroundColor White Write-Host "docker-compose down" -ForegroundColor Yellow Write-Host " Restart server: " -NoNewline -ForegroundColor White @@ -2093,7 +2183,7 @@ function Invoke-DockerWorkflow { # Python virtual environment deployment workflow function Invoke-PythonWorkflow { Write-Step "Starting Python Virtual Environment Workflow" - Write-Host "Zen MCP Server" -ForegroundColor Green + Write-Host "PAL MCP Server" -ForegroundColor Green Write-Host "=================" -ForegroundColor Cyan $version = Get-Version diff --git a/run-server.sh b/run-server.sh index 034dbab..d44f76e 100755 --- a/run-server.sh +++ b/run-server.sh @@ -2,7 +2,7 @@ set -euo pipefail # ============================================================================ -# Zen MCP Server Setup Script +# PAL MCP Server Setup Script # # A platform-agnostic setup script that works on macOS, Linux, and WSL. # Handles environment setup, dependency installation, and configuration. @@ -29,11 +29,12 @@ readonly RED='\033[0;31m' readonly NC='\033[0m' # No Color # Configuration -readonly VENV_PATH=".zen_venv" +readonly VENV_PATH=".pal_venv" readonly DOCKER_CLEANED_FLAG=".docker_cleaned" readonly DESKTOP_CONFIG_FLAG=".desktop_configured" readonly LOG_DIR="logs" readonly LOG_FILE="mcp_server.log" +readonly LEGACY_MCP_NAMES=("zen" "zen-mcp" "zen-mcp-server" "zen_mcp" "zen_mcp_server") # Determine portable arguments for sed -i (GNU vs BSD) declare -a SED_INPLACE_ARGS @@ -753,7 +754,7 @@ setup_venv() { print_error "Permission denied creating virtual environment" echo "" echo "Try running in a different directory:" - echo " cd ~ && git clone && cd zen-mcp-server && ./run-server.sh" + echo " cd ~ && git clone && cd pal-mcp-server && ./run-server.sh" echo "" exit 1 else @@ -960,7 +961,7 @@ install_dependencies() { fi echo "" - print_info "Setting up Zen MCP Server..." + print_info "Setting up PAL MCP Server..." echo "Installing required components:" echo " • MCP protocol library" echo " • AI model connectors" @@ -1254,7 +1255,7 @@ check_claude_cli_integration() { echo "" print_warning "Claude CLI not found" echo "" - read -p "Would you like to add Zen to Claude Code? (Y/n): " -n 1 -r + read -p "Would you like to add PAL to Claude Code? (Y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Nn]$ ]]; then print_info "Skipping Claude Code integration" @@ -1269,9 +1270,14 @@ check_claude_cli_integration() { return 1 fi - # Check if zen is registered + # Remove legacy zen registrations to avoid duplicate errors after rename + for legacy_name in "${LEGACY_MCP_NAMES[@]}"; do + claude mcp remove "$legacy_name" -s user >/dev/null 2>&1 || true + done + + # Check if pal is registered local mcp_list=$(claude mcp list 2>/dev/null) - if echo "$mcp_list" | grep -q "zen"; then + if echo "$mcp_list" | grep -q "pal"; then # Check if it's using the old Docker command if echo "$mcp_list" | grep -E "zen.*docker|zen.*compose" &>/dev/null; then print_warning "Found old Docker-based Zen registration, updating..." @@ -1290,14 +1296,14 @@ check_claude_cli_integration() { done <<< "$env_vars" fi - local claude_cmd="claude mcp add zen -s user$env_args -- \"$python_cmd\" \"$server_path\"" + local claude_cmd="claude mcp add pal -s user$env_args -- \"$python_cmd\" \"$server_path\"" if eval "$claude_cmd" 2>/dev/null; then - print_success "Updated Zen to become a standalone script with environment variables" + print_success "Updated PAL to become a standalone script with environment variables" return 0 else echo "" echo "Failed to update MCP registration. Please run manually:" - echo " claude mcp remove zen -s user" + echo " claude mcp remove pal -s user" echo " $claude_cmd" return 1 fi @@ -1307,8 +1313,8 @@ check_claude_cli_integration() { if echo "$mcp_list" | grep -F "$server_path" &>/dev/null; then return 0 else - print_warning "Zen registered with different path, updating..." - claude mcp remove zen -s user 2>/dev/null || true + print_warning "PAL registered with different path, updating..." + claude mcp remove pal -s user 2>/dev/null || true # Re-add with current path and environment variables local env_vars=$(parse_env_variables) @@ -1323,14 +1329,14 @@ check_claude_cli_integration() { done <<< "$env_vars" fi - local claude_cmd="claude mcp add zen -s user$env_args -- \"$python_cmd\" \"$server_path\"" + local claude_cmd="claude mcp add pal -s user$env_args -- \"$python_cmd\" \"$server_path\"" if eval "$claude_cmd" 2>/dev/null; then - print_success "Updated Zen with current path and environment variables" + print_success "Updated PAL with current path and environment variables" return 0 else echo "" echo "Failed to update MCP registration. Please run manually:" - echo " claude mcp remove zen -s user" + echo " claude mcp remove pal -s user" echo " $claude_cmd" return 1 fi @@ -1339,7 +1345,7 @@ check_claude_cli_integration() { else # Not registered at all, ask user if they want to add it echo "" - read -p "Add Zen to Claude Code? (Y/n): " -n 1 -r + read -p "Add PAL to Claude Code? (Y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Nn]$ ]]; then local env_vars=$(parse_env_variables) @@ -1355,11 +1361,11 @@ check_claude_cli_integration() { fi print_info "To add manually later, run:" - echo " claude mcp add zen -s user$env_args -- $python_cmd $server_path" + echo " claude mcp add pal -s user$env_args -- $python_cmd $server_path" return 0 fi - print_info "Registering Zen with Claude Code..." + print_info "Registering PAL with Claude Code..." # Add with environment variables local env_vars=$(parse_env_variables) @@ -1374,9 +1380,9 @@ check_claude_cli_integration() { done <<< "$env_vars" fi - local claude_cmd="claude mcp add zen -s user$env_args -- \"$python_cmd\" \"$server_path\"" + local claude_cmd="claude mcp add pal -s user$env_args -- \"$python_cmd\" \"$server_path\"" if eval "$claude_cmd" 2>/dev/null; then - print_success "Successfully added Zen to Claude Code with environment variables" + print_success "Successfully added PAL to Claude Code with environment variables" return 0 else echo "" @@ -1403,8 +1409,12 @@ check_claude_desktop_integration() { return 0 fi + # Legacy MCP server names to clean out from previous releases + local legacy_names_csv + legacy_names_csv=$(IFS=,; echo "${LEGACY_MCP_NAMES[*]}") + echo "" - read -p "Configure Zen for Claude Desktop? (Y/n): " -n 1 -r + read -p "Configure PAL for Claude Desktop? (Y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Nn]$ ]]; then print_info "Skipping Claude Desktop integration" @@ -1421,12 +1431,12 @@ check_claude_desktop_integration() { print_info "Updating existing Claude Desktop config..." # Check for old Docker config and remove it - if grep -q "docker.*compose.*zen\|zen.*docker" "$config_path" 2>/dev/null; then + if grep -q "docker.*compose.*pal\|pal.*docker" "$config_path" 2>/dev/null; then print_warning "Removing old Docker-based MCP configuration..." # Create backup cp "$config_path" "${config_path}.backup_$(date +%Y%m%d_%H%M%S)" - # Remove old zen config using a more robust approach + # Remove old pal config using a more robust approach local temp_file=$(mktemp) python3 -c " import json @@ -1436,10 +1446,10 @@ try: with open('$config_path', 'r') as f: config = json.load(f) - # Remove zen from mcpServers if it exists - if 'mcpServers' in config and 'zen' in config['mcpServers']: - del config['mcpServers']['zen'] - print('Removed old zen MCP configuration') + # Remove pal from mcpServers if it exists + if 'mcpServers' in config and 'pal' in config['mcpServers']: + del config['mcpServers']['pal'] + print('Removed old pal MCP configuration') with open('$temp_file', 'w') as f: json.dump(config, f, indent=2) @@ -1460,22 +1470,35 @@ except Exception as e: echo "$env_vars" > "$env_file" fi - python3 -c " + PAL_LEGACY_NAMES="$legacy_names_csv" python3 -c " import json +import os import sys +legacy_keys = [k for k in os.environ.get('PAL_LEGACY_NAMES', '').split(',') if k] + try: with open('$config_path', 'r') as f: config = json.load(f) -except: +except Exception: + config = {} + +if not isinstance(config, dict): config = {} # Ensure mcpServers exists -if 'mcpServers' not in config: +if 'mcpServers' not in config or not isinstance(config.get('mcpServers'), dict): config['mcpServers'] = {} -# Add zen server -zen_config = { +# Remove legacy entries from any known server blocks +for container in ('mcpServers', 'servers'): + servers = config.get(container) + if isinstance(servers, dict): + for key in legacy_keys: + servers.pop(key, None) + +# Add pal server +pal_config = { 'command': '$python_cmd', 'args': ['$server_path'] } @@ -1489,13 +1512,13 @@ try: if '=' in line and line: key, value = line.split('=', 1) env_dict[key] = value -except: +except Exception: pass if env_dict: - zen_config['env'] = env_dict + pal_config['env'] = env_dict -config['mcpServers']['zen'] = zen_config +config['mcpServers']['pal'] = pal_config with open('$temp_file', 'w') as f: json.dump(config, f, indent=2) @@ -1523,8 +1546,8 @@ import sys config = {'mcpServers': {}} -# Add zen server -zen_config = { +# Add pal server +pal_config = { 'command': '$python_cmd', 'args': ['$server_path'] } @@ -1542,9 +1565,9 @@ except: pass if env_dict: - zen_config['env'] = env_dict + pal_config['env'] = env_dict -config['mcpServers']['zen'] = zen_config +config['mcpServers']['pal'] = pal_config with open('$temp_file', 'w') as f: json.dump(config, f, indent=2) @@ -1587,7 +1610,7 @@ with open('$temp_file', 'w') as f: cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"]$(if [[ -n "$example_env" ]]; then echo ","; fi)$(if [[ -n "$example_env" ]]; then echo " \"env\": { @@ -1603,7 +1626,7 @@ EOF # Check and update Gemini CLI configuration check_gemini_cli_integration() { local script_dir="$1" - local zen_wrapper="$script_dir/zen-mcp-server" + local pal_wrapper="$script_dir/pal-mcp-server" # Check if Gemini settings file exists local gemini_config="$HOME/.gemini/settings.json" @@ -1612,15 +1635,75 @@ check_gemini_cli_integration() { return 0 fi - # Check if zen is already configured - if grep -q '"zen"' "$gemini_config" 2>/dev/null; then - # Already configured + # Clean up legacy zen entries and detect existing pal configuration + local legacy_names_csv + legacy_names_csv=$(IFS=,; echo "${LEGACY_MCP_NAMES[*]}") + + local gemini_status + gemini_status=$( + PAL_LEGACY_NAMES="$legacy_names_csv" PAL_WRAPPER="$pal_wrapper" PAL_GEMINI_CONFIG="$gemini_config" python3 - <<'PY' 2>/dev/null +import json +import os +import pathlib +import sys + +config_path = pathlib.Path(os.environ["PAL_GEMINI_CONFIG"]) +legacy = [n for n in os.environ.get("PAL_LEGACY_NAMES", "").split(",") if n] +wrapper = os.environ["PAL_WRAPPER"] + +changed = False +has_pal = False + +try: + data = json.loads(config_path.read_text()) +except Exception: + data = {} + +if not isinstance(data, dict): + data = {} + +servers = data.get("mcpServers") +if not isinstance(servers, dict): + servers = {} + data["mcpServers"] = servers + +for key in legacy: + if servers.pop(key, None) is not None: + changed = True + +pal_cfg = servers.get("pal") +if isinstance(pal_cfg, dict): + has_pal = True + if pal_cfg.get("command") != wrapper: + pal_cfg["command"] = wrapper + servers["pal"] = pal_cfg + changed = True + +if changed: + config_path.parent.mkdir(parents=True, exist_ok=True) + config_path.write_text(json.dumps(data, indent=2)) + +status = ("CHANGED" if changed else "UNCHANGED") + ":" + ("HAS_PAL" if has_pal else "NO_PAL") +sys.stdout.write(status) +sys.exit(0) +PY + ) || true + + local gemini_changed=false + local gemini_has_pal=false + [[ "$gemini_status" == CHANGED:* ]] && gemini_changed=true + [[ "$gemini_status" == *:HAS_PAL ]] && gemini_has_pal=true + + if [[ "$gemini_has_pal" == true ]]; then + if [[ "$gemini_changed" == true ]]; then + print_success "Removed legacy Gemini MCP entries" + fi return 0 fi - # Ask user if they want to add Zen to Gemini CLI + # Ask user if they want to add PAL to Gemini CLI echo "" - read -p "Configure Zen for Gemini CLI? (Y/n): " -n 1 -r + read -p "Configure PAL for Gemini CLI? (Y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Nn]$ ]]; then print_info "Skipping Gemini CLI integration" @@ -1628,17 +1711,17 @@ check_gemini_cli_integration() { fi # Ensure wrapper script exists - if [[ ! -f "$zen_wrapper" ]]; then + if [[ ! -f "$pal_wrapper" ]]; then print_info "Creating wrapper script for Gemini CLI..." - cat > "$zen_wrapper" << 'EOF' + cat > "$pal_wrapper" << 'EOF' #!/bin/bash # Wrapper script for Gemini CLI compatibility DIR="$(cd "$(dirname "$0")" && pwd)" cd "$DIR" -exec .zen_venv/bin/python server.py "$@" +exec .pal_venv/bin/python server.py "$@" EOF - chmod +x "$zen_wrapper" - print_success "Created zen-mcp-server wrapper script" + chmod +x "$pal_wrapper" + print_success "Created pal-mcp-server wrapper script" fi # Update Gemini settings @@ -1647,7 +1730,7 @@ EOF # Create backup cp "$gemini_config" "${gemini_config}.backup_$(date +%Y%m%d_%H%M%S)" - # Add zen configuration using Python for proper JSON handling + # Add pal configuration using Python for proper JSON handling local temp_file=$(mktemp) python3 -c " import json @@ -1661,9 +1744,9 @@ try: if 'mcpServers' not in config: config['mcpServers'] = {} - # Add zen server - config['mcpServers']['zen'] = { - 'command': '$zen_wrapper' + # Add pal server + config['mcpServers']['pal'] = { + 'command': '$pal_wrapper' } with open('$temp_file', 'w') as f: @@ -1677,7 +1760,7 @@ except Exception as e: if [[ $? -eq 0 ]]; then print_success "Successfully configured Gemini CLI" echo " Config: $gemini_config" - echo " Restart Gemini CLI to use Zen MCP Server" + echo " Restart Gemini CLI to use PAL MCP Server" else print_error "Failed to update Gemini CLI config" echo "Manual config location: $gemini_config" @@ -1685,8 +1768,8 @@ except Exception as e: cat << EOF { "mcpServers": { - "zen": { - "command": "$zen_wrapper" + "pal": { + "command": "$pal_wrapper" } } } @@ -1701,14 +1784,71 @@ check_codex_cli_integration() { fi local codex_config="$HOME/.codex/config.toml" - local codex_has_zen=false - if [[ -f "$codex_config" ]] && grep -q '\[mcp_servers\.zen\]' "$codex_config" 2>/dev/null; then - codex_has_zen=true + local legacy_names_csv + legacy_names_csv=$(IFS=,; echo "${LEGACY_MCP_NAMES[*]}") + + if [[ -f "$codex_config" ]]; then + local codex_cleanup_status + codex_cleanup_status=$( + PAL_LEGACY_NAMES="$legacy_names_csv" PAL_CODEX_CONFIG="$codex_config" python3 - <<'PY' 2>/dev/null +import os +import pathlib +import re +import sys + +config_path = pathlib.Path(os.environ["PAL_CODEX_CONFIG"]) +legacy = [n for n in os.environ.get("PAL_LEGACY_NAMES", "").split(",") if n] + +if not config_path.exists(): + sys.exit(0) + +lines = config_path.read_text().splitlines() +output = [] +skip = False +removed = False +section_re = re.compile(r"\s*\[([^\]]+)\]") + +for line in lines: + match = section_re.match(line) + if match: + header = match.group(1).strip() + parts = header.split(".") + is_legacy = False + if len(parts) >= 2 and parts[0] == "mcp_servers": + section_key = ".".join(parts[1:]) + for name in legacy: + if section_key == name or section_key.startswith(name + "."): + is_legacy = True + break + skip = is_legacy + if is_legacy: + removed = True + continue + if not skip: + output.append(line) + +if removed: + config_path.write_text("\n".join(output).rstrip() + ("\n" if output else "")) + sys.stdout.write("REMOVED") +else: + sys.stdout.write("UNCHANGED") +sys.exit(0) +PY + ) || true + + if [[ "$codex_cleanup_status" == "REMOVED" ]]; then + print_success "Removed legacy Codex MCP entries" + fi fi - if [[ "$codex_has_zen" == false ]]; then + local codex_has_pal=false + if [[ -f "$codex_config" ]] && grep -q '\[mcp_servers\.pal\]' "$codex_config" 2>/dev/null; then + codex_has_pal=true + fi + + if [[ "$codex_has_pal" == false ]]; then echo "" - read -p "Configure Zen for Codex CLI? (Y/n): " -n 1 -r + read -p "Configure PAL for Codex CLI? (Y/n): " -n 1 -r echo "" if [[ $REPLY =~ ^[Nn]$ ]]; then print_info "Skipping Codex CLI integration" @@ -1727,12 +1867,12 @@ check_codex_cli_integration() { { echo "" - echo "[mcp_servers.zen]" + echo "[mcp_servers.pal]" echo "command = \"bash\"" - echo "args = [\"-c\", \"for p in \$(which uvx 2>/dev/null) \$HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"\$p\\\" ] && exec \\\"\$p\\\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1\"]" + echo "args = [\"-c\", \"for p in \$(which uvx 2>/dev/null) \$HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"\$p\\\" ] && exec \\\"\$p\\\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1\"]" echo "tool_timeout_sec = 1200" echo "" - echo "[mcp_servers.zen.env]" + echo "[mcp_servers.pal.env]" echo "PATH = \"/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:\$HOME/.local/bin:\$HOME/.cargo/bin:\$HOME/bin\"" if [[ -n "$env_vars" ]]; then while IFS= read -r line; do @@ -1752,12 +1892,12 @@ check_codex_cli_integration() { echo "Manual config location: $codex_config" echo "Add this configuration:" cat <<'CODExEOF' -[mcp_servers.zen] +[mcp_servers.pal] command = "sh" -args = ["-c", "exec \$(which uvx 2>/dev/null || echo uvx) --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server"] +args = ["-c", "exec \$(which uvx 2>/dev/null || echo uvx) --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server"] tool_timeout_sec = 1200 -[mcp_servers.zen.env] +[mcp_servers.pal.env] PATH = "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:\$HOME/.local/bin:\$HOME/.cargo/bin:\$HOME/bin" [features] @@ -1779,16 +1919,16 @@ CODExEOF print_success "Successfully configured Codex CLI" echo " Config: $codex_config" - echo " Restart Codex CLI to use Zen MCP Server" - codex_has_zen=true + echo " Restart Codex CLI to use PAL MCP Server" + codex_has_pal=true else print_info "Codex CLI already configured; refreshing Codex settings..." fi - if [[ "$codex_has_zen" == true ]]; then + if [[ "$codex_has_pal" == true ]]; then if ! grep -Eq '^\s*web_search_request\s*=' "$codex_config" 2>/dev/null; then echo "" - print_info "Web search requests let Codex pull fresh documentation for Zen's API lookup tooling." + print_info "Web search requests let Codex pull fresh documentation for PAL's API lookup tooling." read -p "Enable Codex CLI web search requests? (Y/n): " -n 1 -r echo "" if [[ ! $REPLY =~ ^[Nn]$ ]]; then @@ -1923,7 +2063,7 @@ print_qwen_manual_instructions() { cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir", @@ -1936,7 +2076,7 @@ EOF cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir" @@ -1976,6 +2116,43 @@ check_qwen_cli_integration() { env_lines=$(printf '%s\n' "${env_array[@]}") fi + local legacy_names_csv + legacy_names_csv=$(IFS=,; echo "${LEGACY_MCP_NAMES[*]}") + + if [[ -f "$qwen_config" ]]; then + PAL_QWEN_LEGACY="$legacy_names_csv" PAL_QWEN_CONFIG="$qwen_config" python3 - <<'PYCLEANCONF' 2>/dev/null || true +import json +import os +import pathlib +import sys + +config_path = pathlib.Path(os.environ.get("PAL_QWEN_CONFIG", "")) +legacy = [n for n in os.environ.get("PAL_QWEN_LEGACY", "").split(",") if n] + +if not config_path.exists(): + sys.exit(0) + +try: + data = json.loads(config_path.read_text(encoding="utf-8")) +except Exception: + sys.exit(0) + +if not isinstance(data, dict): + sys.exit(0) + +servers = data.get("mcpServers") +if isinstance(servers, dict): + removed = False + for key in legacy: + if servers.pop(key, None) is not None: + removed = True + if removed: + config_path.write_text(json.dumps(data, indent=2)) + +sys.exit(0) +PYCLEANCONF + fi + local config_status=3 if [[ -f "$qwen_config" ]]; then if python3 - "$qwen_config" "$python_cmd" "$server_path" "$script_dir" <<'PYCONF' @@ -1995,7 +2172,7 @@ servers = data.get('mcpServers') if not isinstance(servers, dict): sys.exit(3) -config = servers.get('zen') +config = servers.get('pal') if not isinstance(config, dict): sys.exit(3) @@ -2026,14 +2203,14 @@ PYCONF echo "" if [[ $config_status -eq 4 ]]; then - print_warning "Found existing Qwen CLI zen configuration with different settings." + print_warning "Found existing Qwen CLI pal configuration with different settings." elif [[ $config_status -eq 5 ]]; then print_warning "Unable to parse Qwen CLI settings; replacing with a fresh entry may help." fi - local prompt="Configure Zen for Qwen CLI? (Y/n): " + local prompt="Configure PAL for Qwen CLI? (Y/n): " if [[ $config_status -eq 4 || $config_status -eq 5 ]]; then - prompt="Update Qwen CLI zen configuration? (Y/n): " + prompt="Update Qwen CLI pal configuration? (Y/n): " fi read -p "$prompt" -n 1 -r @@ -2051,17 +2228,17 @@ PYCONF local update_output local update_status=0 - update_output=$(ZEN_QWEN_ENV="$env_lines" ZEN_QWEN_CMD="$python_cmd" ZEN_QWEN_ARG="$server_path" ZEN_QWEN_CWD="$script_dir" python3 - "$qwen_config" <<'PYUPDATE' + update_output=$(PAL_QWEN_ENV="$env_lines" PAL_QWEN_CMD="$python_cmd" PAL_QWEN_ARG="$server_path" PAL_QWEN_CWD="$script_dir" python3 - "$qwen_config" <<'PYUPDATE' import json import os import pathlib import sys config_path = pathlib.Path(sys.argv[1]) -cmd = os.environ['ZEN_QWEN_CMD'] -arg = os.environ['ZEN_QWEN_ARG'] -cwd = os.environ['ZEN_QWEN_CWD'] -env_lines = os.environ.get('ZEN_QWEN_ENV', '').splitlines() +cmd = os.environ['PAL_QWEN_CMD'] +arg = os.environ['PAL_QWEN_ARG'] +cwd = os.environ['PAL_QWEN_CWD'] +env_lines = os.environ.get('PAL_QWEN_ENV', '').splitlines() env_map = {} for line in env_lines: @@ -2088,16 +2265,16 @@ if not isinstance(servers, dict): servers = {} data['mcpServers'] = servers -zen_config = { +pal_config = { 'command': cmd, 'args': [arg], 'cwd': cwd, } if env_map: - zen_config['env'] = env_map + pal_config['env'] = env_map -servers['zen'] = zen_config +servers['pal'] = pal_config config_path.parent.mkdir(parents=True, exist_ok=True) tmp_path = config_path.with_suffix(config_path.suffix + '.tmp') @@ -2111,7 +2288,7 @@ PYUPDATE if [[ $update_status -eq 0 ]]; then print_success "Successfully configured Qwen CLI" echo " Config: $qwen_config" - echo " Restart Qwen CLI to use Zen MCP Server" + echo " Restart Qwen CLI to use PAL MCP Server" else print_error "Failed to update Qwen CLI config" if [[ -n "$update_output" ]]; then @@ -2130,11 +2307,11 @@ display_config_instructions() { local script_dir=$(dirname "$server_path") echo "" - local config_header="ZEN MCP SERVER CONFIGURATION" + local config_header="PAL MCP SERVER CONFIGURATION" echo "===== $config_header =====" printf '%*s\n' "$((${#config_header} + 12))" | tr ' ' '=' echo "" - echo "To use Zen MCP Server with your CLI clients:" + echo "To use PAL MCP Server with your CLI clients:" echo "" print_info "1. For Claude Code (CLI):" @@ -2148,7 +2325,7 @@ display_config_instructions() { fi done <<< "$env_vars" fi - echo -e " ${GREEN}claude mcp add zen -s user$env_args -- $python_cmd $server_path${NC}" + echo -e " ${GREEN}claude mcp add pal -s user$env_args -- $python_cmd $server_path${NC}" echo "" print_info "2. For Claude Desktop:" @@ -2179,7 +2356,7 @@ display_config_instructions() { cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir", @@ -2194,7 +2371,7 @@ EOF cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir" @@ -2222,8 +2399,8 @@ EOF cat << EOF { "mcpServers": { - "zen": { - "command": "$script_dir/zen-mcp-server" + "pal": { + "command": "$script_dir/pal-mcp-server" } } } @@ -2237,7 +2414,7 @@ EOF cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir", @@ -2252,7 +2429,7 @@ EOF cat << EOF { "mcpServers": { - "zen": { + "pal": { "command": "$python_cmd", "args": ["$server_path"], "cwd": "$script_dir" @@ -2267,11 +2444,11 @@ EOF echo " Add this configuration to ~/.codex/config.toml:" echo "" cat << EOF - [mcp_servers.zen] + [mcp_servers.pal] command = "bash" - args = ["-c", "for p in \$(which uvx 2>/dev/null) \$HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"\$p\\\" ] && exec \\\"\$p\\\" --from git+https://github.com/BeehiveInnovations/zen-mcp-server.git zen-mcp-server; done; echo 'uvx not found' >&2; exit 1"] + args = ["-c", "for p in \$(which uvx 2>/dev/null) \$HOME/.local/bin/uvx /opt/homebrew/bin/uvx /usr/local/bin/uvx uvx; do [ -x \\\"\$p\\\" ] && exec \\\"\$p\\\" --from git+https://github.com/BeehiveInnovations/pal-mcp-server.git pal-mcp-server; done; echo 'uvx not found' >&2; exit 1"] - [mcp_servers.zen.env] + [mcp_servers.pal.env] PATH = "/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:\$HOME/.local/bin:\$HOME/.cargo/bin:\$HOME/bin" GEMINI_API_KEY = "your_gemini_api_key_here" EOF @@ -2288,7 +2465,7 @@ display_setup_instructions() { echo "===== $setup_header =====" printf '%*s\n' "$((${#setup_header} + 12))" | tr ' ' '=' echo "" - print_success "Zen is ready to use!" + print_success "PAL is ready to use!" # Display enabled/disabled tools if DISABLED_TOOLS is configured if [[ -n "${DISABLED_TOOLS:-}" ]]; then @@ -2368,7 +2545,7 @@ display_setup_instructions() { # Show help message show_help() { local version=$(get_version) - local header="🤖 Zen MCP Server v$version" + local header="🤖 PAL MCP Server v$version" echo "$header" printf '%*s\n' "${#header}" | tr ' ' '=' echo "" @@ -2389,7 +2566,7 @@ show_help() { echo " $0 --clear-cache Clear Python cache (fixes import issues)" echo "" echo "For more information, visit:" - echo " https://github.com/BeehiveInnovations/zen-mcp-server" + echo " https://github.com/BeehiveInnovations/pal-mcp-server" } # Show version only @@ -2464,7 +2641,7 @@ main() { esac # Display header - local main_header="🤖 Zen MCP Server" + local main_header="🤖 PAL MCP Server" echo "$main_header" printf '%*s\n' "${#main_header}" | tr ' ' '=' diff --git a/run_integration_tests.ps1 b/run_integration_tests.ps1 index 539fd0a..715144e 100644 --- a/run_integration_tests.ps1 +++ b/run_integration_tests.ps1 @@ -1,9 +1,9 @@ <# .SYNOPSIS - Integration test runner script for the Zen MCP server on Windows. + Integration test runner script for the PAL MCP server on Windows. .DESCRIPTION - This PowerShell script prepares and runs integration tests for the Zen MCP server: + This PowerShell script prepares and runs integration tests for the PAL MCP server: - Sets up the test environment - Installs required dependencies - Runs automated integration tests @@ -25,7 +25,7 @@ Script Author : GiGiDKR (https://github.com/GiGiDKR) Date : 07-05-2025 Version : See config.py (__version__) - References : https://github.com/BeehiveInnovations/zen-mcp-server + References : https://github.com/BeehiveInnovations/pal-mcp-server #> #Requires -Version 5.1 [CmdletBinding()] @@ -64,13 +64,13 @@ function Write-Emoji { Write-ColorText $Text -Color $Color } -Write-Emoji "🧪" "Running Integration Tests for Zen MCP Server" -Color Cyan +Write-Emoji "🧪" "Running Integration Tests for PAL MCP Server" -Color Cyan Write-ColorText "==============================================" -Color Cyan Write-ColorText "These tests use real API calls with your configured keys" Write-Host "" # Check for virtual environment -$venvPath = ".zen_venv" +$venvPath = ".pal_venv" $activateScript = if ($IsWindows -or $env:OS -eq "Windows_NT") { "$venvPath\Scripts\Activate.ps1" } else { diff --git a/run_integration_tests.sh b/run_integration_tests.sh index 1733367..6855cd1 100755 --- a/run_integration_tests.sh +++ b/run_integration_tests.sh @@ -1,19 +1,19 @@ #!/bin/bash -# Zen MCP Server - Run Integration Tests +# PAL MCP Server - Run Integration Tests # This script runs integration tests that require API keys # Run this locally on your Mac to ensure everything works end-to-end set -e # Exit on any error -echo "🧪 Running Integration Tests for Zen MCP Server" +echo "🧪 Running Integration Tests for PAL MCP Server" echo "==============================================" echo "These tests use real API calls with your configured keys" echo "" # Activate virtual environment -if [[ -f ".zen_venv/bin/activate" ]]; then - source .zen_venv/bin/activate +if [[ -f ".pal_venv/bin/activate" ]]; then + source .pal_venv/bin/activate echo "✅ Using virtual environment" else echo "❌ No virtual environment found!" diff --git a/server.py b/server.py index 8a8050f..74f7ed8 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,5 @@ """ -Zen MCP Server - Main server implementation +PAL MCP Server - Main server implementation This module implements the core MCP (Model Context Protocol) server that provides AI-powered tools for code analysis, review, and assistance using multiple AI models. @@ -152,17 +152,17 @@ except Exception as e: logger = logging.getLogger(__name__) -# Log ZEN_MCP_FORCE_ENV_OVERRIDE configuration for transparency +# Log PAL_MCP_FORCE_ENV_OVERRIDE configuration for transparency if env_override_enabled(): - logger.info("ZEN_MCP_FORCE_ENV_OVERRIDE enabled - .env file values will override system environment variables") + logger.info("PAL_MCP_FORCE_ENV_OVERRIDE enabled - .env file values will override system environment variables") logger.debug("Environment override prevents conflicts between different AI tools passing cached API keys") else: - logger.debug("ZEN_MCP_FORCE_ENV_OVERRIDE disabled - system environment variables take precedence") + logger.debug("PAL_MCP_FORCE_ENV_OVERRIDE disabled - system environment variables take precedence") # Create the MCP server instance with a unique name identifier # This name is used by MCP clients to identify and connect to this specific server -server: Server = Server("zen-server") +server: Server = Server("pal-server") # Constants for tool filtering @@ -370,7 +370,7 @@ PROMPT_TEMPLATES = { "version": { "name": "version", "description": "Show server version and system information", - "template": "Show Zen MCP Server version", + "template": "Show PAL MCP Server version", }, } @@ -1293,7 +1293,7 @@ async def handle_list_prompts() -> list[Prompt]: """ List all available prompts for CLI Code shortcuts. - This handler returns prompts that enable shortcuts like /zen:thinkdeeper. + This handler returns prompts that enable shortcuts like /pal:thinkdeeper. We automatically generate prompts from all tools (1:1 mapping) plus add a few marketing aliases with richer templates for commonly used tools. @@ -1343,7 +1343,7 @@ async def handle_get_prompt(name: str, arguments: dict[str, Any] = None) -> GetP """ Get prompt details and generate the actual prompt text. - This handler is called when a user invokes a prompt (e.g., /zen:thinkdeeper or /zen:chat:gpt5). + This handler is called when a user invokes a prompt (e.g., /pal:thinkdeeper or /pal:chat:gpt5). It generates the appropriate text that CLI will then use to call the underlying tool. @@ -1365,14 +1365,14 @@ async def handle_get_prompt(name: str, arguments: dict[str, Any] = None) -> GetP # Handle special "continue" case if name.lower() == "continue": - # This is "/zen:continue" - use chat tool as default for continuation + # This is "/pal:continue" - use chat tool as default for continuation tool_name = "chat" template_info = { "name": "continue", "description": "Continue the previous conversation", "template": "Continue the conversation", } - logger.debug("Using /zen:continue - defaulting to chat tool") + logger.debug("Using /pal:continue - defaulting to chat tool") else: # Find the corresponding tool by checking prompt names tool_name = None @@ -1420,7 +1420,7 @@ async def handle_get_prompt(name: str, arguments: dict[str, Any] = None) -> GetP # Generate tool call instruction if name.lower() == "continue": - # "/zen:continue" case + # "/pal:continue" case tool_instruction = ( f"Continue the previous conversation using the {tool_name} tool. " "CRITICAL: You MUST provide the continuation_id from the previous response to maintain conversation context. " @@ -1461,7 +1461,7 @@ async def main(): configure_providers() # Log startup message - logger.info("Zen MCP Server starting up...") + logger.info("PAL MCP Server starting up...") logger.info(f"Log level: {log_level}") # Note: MCP client info will be logged during the protocol handshake @@ -1487,7 +1487,7 @@ async def main(): if IS_AUTO_MODE: handshake_instructions = ( "When the user names a specific model (e.g. 'use chat with gpt5'), send that exact model in the tool call. " - "When no model is mentioned, first use the `listmodels` tool from zen to obtain available models to choose the best one from." + "When no model is mentioned, first use the `listmodels` tool from PAL to obtain available models to choose the best one from." ) else: handshake_instructions = ( @@ -1502,7 +1502,7 @@ async def main(): read_stream, write_stream, InitializationOptions( - server_name="zen", + server_name="PAL", server_version=__version__, instructions=handshake_instructions, capabilities=ServerCapabilities( @@ -1514,7 +1514,7 @@ async def main(): def run(): - """Console script entry point for zen-mcp-server.""" + """Console script entry point for pal-mcp-server.""" try: asyncio.run(main()) except KeyboardInterrupt: diff --git a/simulator_tests/__init__.py b/simulator_tests/__init__.py index 8c91d4c..f5e18db 100644 --- a/simulator_tests/__init__.py +++ b/simulator_tests/__init__.py @@ -1,7 +1,7 @@ """ Communication Simulator Tests Package -This package contains individual test modules for the Zen MCP Communication Simulator. +This package contains individual test modules for the PAL MCP Communication Simulator. Each test is in its own file for better organization and maintainability. """ diff --git a/simulator_tests/base_test.py b/simulator_tests/base_test.py index bbc0a75..aa81e12 100644 --- a/simulator_tests/base_test.py +++ b/simulator_tests/base_test.py @@ -43,10 +43,10 @@ class BaseSimulatorTest: if os.path.exists(venv_python): return venv_python - # Try .zen_venv as fallback - zen_venv_python = os.path.join(current_dir, ".zen_venv", "bin", "python") - if os.path.exists(zen_venv_python): - return zen_venv_python + # Try .pal_venv as fallback + pal_venv_python = os.path.join(current_dir, ".pal_venv", "bin", "python") + if os.path.exists(pal_venv_python): + return pal_venv_python # Fallback to system python if venv doesn't exist self.logger.warning("Virtual environment not found, using system python") diff --git a/systemprompts/analyze_prompt.py b/systemprompts/analyze_prompt.py index e52e4d9..e0ac207 100644 --- a/systemprompts/analyze_prompt.py +++ b/systemprompts/analyze_prompt.py @@ -31,7 +31,7 @@ review is essential - e.g., the issue spans multiple modules or exposes a system with partial analysis. Instead, respond ONLY with the JSON below (and nothing else). Clearly state the reason why you strongly feel this is necessary and ask the agent to inform the user why you're switching to a different tool: {"status": "full_codereview_required", - "important": "Please use zen's codereview tool instead", + "important": "Please use pal's codereview tool instead", "reason": ""} SCOPE & FOCUS diff --git a/systemprompts/clink/codex_codereviewer.txt b/systemprompts/clink/codex_codereviewer.txt index 6b7749e..ce7f205 100644 --- a/systemprompts/clink/codex_codereviewer.txt +++ b/systemprompts/clink/codex_codereviewer.txt @@ -1,4 +1,4 @@ -/review You are the Codex CLI code reviewer operating inside the Zen MCP server with full repository access. +/review You are the Codex CLI code reviewer operating inside the PAL MCP server with full repository access. - Inspect any relevant files directly—use your full repository access, run linters or tests as needed, and mention key commands when they inform your findings. - Report issues in severity order (Critical, High, Medium, Low) spanning security, correctness, performance, and maintainability while staying within scope. diff --git a/systemprompts/clink/default.txt b/systemprompts/clink/default.txt index a7dcb84..ff1cddf 100644 --- a/systemprompts/clink/default.txt +++ b/systemprompts/clink/default.txt @@ -1,4 +1,4 @@ -You are an external CLI agent operating inside the Zen MCP server with full repository access. +You are an external CLI agent operating inside the PAL MCP server with full repository access. - Use terminal tools to inspect files and gather context before responding; cite exact paths, symbols, or commands when they matter. - Provide concise, actionable responses in Markdown tailored to engineers working from the CLI. diff --git a/systemprompts/clink/default_codereviewer.txt b/systemprompts/clink/default_codereviewer.txt index 09e2c72..279d878 100644 --- a/systemprompts/clink/default_codereviewer.txt +++ b/systemprompts/clink/default_codereviewer.txt @@ -1,4 +1,4 @@ -You are an external CLI code reviewer operating inside the Zen MCP server with full repository access. +You are an external CLI code reviewer operating inside the PAL MCP server with full repository access. - Inspect any relevant files directly—run linters or tests as needed—and mention important commands you rely on. - Report findings in severity order (Critical, High, Medium, Low) across security, correctness, performance, and maintainability while staying within the provided scope. diff --git a/systemprompts/clink/default_planner.txt b/systemprompts/clink/default_planner.txt index b8ee60f..77d4a18 100644 --- a/systemprompts/clink/default_planner.txt +++ b/systemprompts/clink/default_planner.txt @@ -1,4 +1,4 @@ -You are the planning agent operating through the Zen MCP server. +You are the planning agent operating through the PAL MCP server. - Respond with JSON only using the planning schema fields (status, step_number, total_steps, metadata, plan_summary, etc.); request missing context via the required `files_required_to_continue` JSON structure. - Inspect any relevant files, scripts, or docs before outlining the plan; leverage your full CLI access for research. diff --git a/tests/__init__.py b/tests/__init__.py index ee091b8..7aa3df9 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1 @@ -# Tests for Zen MCP Server +# Tests for PAL MCP Server diff --git a/tests/conftest.py b/tests/conftest.py index 6aa710a..b8d82b3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ """ -Pytest configuration for Zen MCP Server tests +Pytest configuration for PAL MCP Server tests """ import asyncio @@ -18,7 +18,7 @@ if str(parent_dir) not in sys.path: import utils.env as env_config # noqa: E402 # Ensure tests operate with runtime environment rather than .env overrides during imports -env_config.reload_env({"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) +env_config.reload_env({"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) # Set default model to a specific value for tests to avoid auto mode # This prevents all tests from failing due to missing model parameter @@ -187,8 +187,8 @@ def clear_model_restriction_env(monkeypatch): def disable_force_env_override(monkeypatch): """Default tests to runtime environment visibility unless they explicitly opt in.""" - monkeypatch.setenv("ZEN_MCP_FORCE_ENV_OVERRIDE", "false") - env_config.reload_env({"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) + monkeypatch.setenv("PAL_MCP_FORCE_ENV_OVERRIDE", "false") + env_config.reload_env({"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) monkeypatch.setenv("DEFAULT_MODEL", "gemini-2.5-flash") monkeypatch.setenv("MAX_CONVERSATION_TURNS", "50") diff --git a/tests/gemini_cassettes/chat_codegen/gemini25_pro_calculator/mldev.json b/tests/gemini_cassettes/chat_codegen/gemini25_pro_calculator/mldev.json index e6ddcaa..f0e4fba 100644 --- a/tests/gemini_cassettes/chat_codegen/gemini25_pro_calculator/mldev.json +++ b/tests/gemini_cassettes/chat_codegen/gemini25_pro_calculator/mldev.json @@ -26,7 +26,7 @@ "temperature": 1.0, "candidateCount": 1, "thinkingConfig": { - "thinkingBudget": 10813 + "thinking_budget": 10813 } } } diff --git a/tests/gemini_cassettes/chat_cross/step1_gemini25_flash_number/mldev.json b/tests/gemini_cassettes/chat_cross/step1_gemini25_flash_number/mldev.json index efc012e..0758a27 100644 --- a/tests/gemini_cassettes/chat_cross/step1_gemini25_flash_number/mldev.json +++ b/tests/gemini_cassettes/chat_cross/step1_gemini25_flash_number/mldev.json @@ -26,7 +26,7 @@ "temperature": 0.2, "candidateCount": 1, "thinkingConfig": { - "thinkingBudget": 8110 + "thinking_budget": 8110 } } } diff --git a/tests/gemini_cassettes/consensus/step2_gemini25_flash_against/mldev.json b/tests/gemini_cassettes/consensus/step2_gemini25_flash_against/mldev.json index 1ef7254..f0d8fea 100644 --- a/tests/gemini_cassettes/consensus/step2_gemini25_flash_against/mldev.json +++ b/tests/gemini_cassettes/consensus/step2_gemini25_flash_against/mldev.json @@ -23,10 +23,10 @@ } ], "generationConfig": { - "temperature": 0.2, + "temperature": 1.0, "candidateCount": 1, "thinkingConfig": { - "thinkingBudget": 8110 + "thinking_budget": 8110 } } } diff --git a/tests/test_auto_mode_model_listing.py b/tests/test_auto_mode_model_listing.py index 26d376b..ab99019 100644 --- a/tests/test_auto_mode_model_listing.py +++ b/tests/test_auto_mode_model_listing.py @@ -73,12 +73,12 @@ def test_error_listing_respects_env_restrictions(monkeypatch, reset_registry): "AZURE_MODELS_CONFIG_PATH", ): monkeypatch.delenv(azure_var, raising=False) - monkeypatch.setenv("ZEN_MCP_FORCE_ENV_OVERRIDE", "false") - env_config.reload_env({"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) + monkeypatch.setenv("PAL_MCP_FORCE_ENV_OVERRIDE", "false") + env_config.reload_env({"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) try: import dotenv - monkeypatch.setattr(dotenv, "dotenv_values", lambda *_args, **_kwargs: {"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) + monkeypatch.setattr(dotenv, "dotenv_values", lambda *_args, **_kwargs: {"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) except ModuleNotFoundError: pass @@ -151,7 +151,7 @@ def test_error_listing_without_restrictions_shows_full_catalog(monkeypatch, rese monkeypatch.setenv("OPENAI_API_KEY", "test-openai") monkeypatch.setenv("OPENROUTER_API_KEY", "test-openrouter") monkeypatch.setenv("XAI_API_KEY", "test-xai") - monkeypatch.setenv("ZEN_MCP_FORCE_ENV_OVERRIDE", "false") + monkeypatch.setenv("PAL_MCP_FORCE_ENV_OVERRIDE", "false") for azure_var in ( "AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", @@ -159,11 +159,11 @@ def test_error_listing_without_restrictions_shows_full_catalog(monkeypatch, rese "AZURE_MODELS_CONFIG_PATH", ): monkeypatch.delenv(azure_var, raising=False) - env_config.reload_env({"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) + env_config.reload_env({"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) try: import dotenv - monkeypatch.setattr(dotenv, "dotenv_values", lambda *_args, **_kwargs: {"ZEN_MCP_FORCE_ENV_OVERRIDE": "false"}) + monkeypatch.setattr(dotenv, "dotenv_values", lambda *_args, **_kwargs: {"PAL_MCP_FORCE_ENV_OVERRIDE": "false"}) except ModuleNotFoundError: pass diff --git a/tests/test_chat_codegen_integration.py b/tests/test_chat_codegen_integration.py index 0e96bc3..bf14ebc 100644 --- a/tests/test_chat_codegen_integration.py +++ b/tests/test_chat_codegen_integration.py @@ -33,7 +33,7 @@ CASSETTE_REPLAY_ID = "chat_codegen/gemini25_pro_calculator/mldev" @pytest.mark.asyncio @pytest.mark.no_mock_provider async def test_chat_codegen_saves_file(monkeypatch, tmp_path): - """Ensure Gemini 2.5 Pro responses create zen_generated.code when code is emitted.""" + """Ensure Gemini 2.5 Pro responses create pal_generated.code when code is emitted.""" CASSETTE_PATH.parent.mkdir(parents=True, exist_ok=True) @@ -65,7 +65,7 @@ async def test_chat_codegen_saves_file(monkeypatch, tmp_path): working_dir = tmp_path / "codegen" working_dir.mkdir() - preexisting = working_dir / "zen_generated.code" + preexisting = working_dir / "pal_generated.code" preexisting.write_text("stale contents", encoding="utf-8") chat_tool = ChatTool() @@ -102,7 +102,7 @@ async def test_chat_codegen_saves_file(monkeypatch, tmp_path): payload = json.loads(result[0].text) assert payload["status"] in {"success", "continuation_available"} - artifact_path = working_dir / "zen_generated.code" + artifact_path = working_dir / "pal_generated.code" assert artifact_path.exists() saved = artifact_path.read_text() assert "" in saved diff --git a/tests/test_chat_simple.py b/tests/test_chat_simple.py index 04dcdb9..39ed16a 100644 --- a/tests/test_chat_simple.py +++ b/tests/test_chat_simple.py @@ -133,7 +133,7 @@ class TestChatTool: assert "Evaluate this perspective" in formatted def test_format_response_multiple_generated_code_blocks(self, tmp_path): - """All generated-code blocks should be combined and saved to zen_generated.code.""" + """All generated-code blocks should be combined and saved to pal_generated.code.""" tool = ChatTool() tool._model_context = SimpleNamespace(capabilities=SimpleNamespace(allow_code_generation=True)) @@ -148,7 +148,7 @@ class TestChatTool: formatted = tool.format_response(response, request) - saved_path = tmp_path / "zen_generated.code" + saved_path = tmp_path / "pal_generated.code" saved_content = saved_path.read_text(encoding="utf-8") assert "print('world')" in saved_content @@ -172,7 +172,7 @@ class TestChatTool: formatted = tool.format_response(response, request) - saved_path = tmp_path / "zen_generated.code" + saved_path = tmp_path / "pal_generated.code" saved_content = saved_path.read_text(encoding="utf-8") assert "print('only-once')" in saved_content @@ -191,7 +191,7 @@ class TestChatTool: formatted = tool.format_response(response, request) - saved_path = tmp_path / "zen_generated.code" + saved_path = tmp_path / "pal_generated.code" assert not saved_path.exists() assert "print('oops')" in formatted @@ -206,7 +206,7 @@ class TestChatTool: formatted = tool.format_response(response, request) - saved_path = tmp_path / "zen_generated.code" + saved_path = tmp_path / "pal_generated.code" assert not saved_path.exists() assert " just text" in formatted diff --git a/tests/test_clink_integration.py b/tests/test_clink_integration.py index b863752..789b272 100644 --- a/tests/test_clink_integration.py +++ b/tests/test_clink_integration.py @@ -35,7 +35,9 @@ async def test_clink_gemini_single_digit_sum(): assert status in {"success", "continuation_available"} content = payload.get("content", "").strip() - assert content == "4" + # CLI may include additional metadata like tags; check first line or that "4" is present + first_line = content.split("\n")[0].strip() + assert first_line == "4" or "4" in content, f"Expected '4' in response, got: {content[:100]}" if status == "continuation_available": offer = payload.get("continuation_offer") or {} diff --git a/tests/test_docker_claude_desktop_integration.py b/tests/test_docker_claude_desktop_integration.py index 705ddd8..3eda99a 100644 --- a/tests/test_docker_claude_desktop_integration.py +++ b/tests/test_docker_claude_desktop_integration.py @@ -22,7 +22,7 @@ class TestDockerClaudeDesktopIntegration: """Test MCP configuration for direct docker run""" config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", @@ -32,7 +32,7 @@ class TestDockerClaudeDesktopIntegration: "/path/to/.env", "-v", "/path/to/logs:/app/logs", - "zen-mcp-server:latest", + "pal-mcp-server:latest", ], } } @@ -40,10 +40,10 @@ class TestDockerClaudeDesktopIntegration: # Validate configuration structure assert "mcpServers" in config - assert "zen-mcp" in config["mcpServers"] - assert config["mcpServers"]["zen-mcp"]["command"] == "docker" + assert "pal-mcp" in config["mcpServers"] + assert config["mcpServers"]["pal-mcp"]["command"] == "docker" - args = config["mcpServers"]["zen-mcp"]["args"] + args = config["mcpServers"]["pal-mcp"]["args"] assert "run" in args assert "--rm" in args assert "-i" in args @@ -53,27 +53,27 @@ class TestDockerClaudeDesktopIntegration: """Test MCP configuration for docker-compose run""" config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker-compose", - "args": ["-f", "/path/to/docker-compose.yml", "run", "--rm", "zen-mcp"], + "args": ["-f", "/path/to/docker-compose.yml", "run", "--rm", "pal-mcp"], } } } # Validate configuration structure - assert config["mcpServers"]["zen-mcp"]["command"] == "docker-compose" + assert config["mcpServers"]["pal-mcp"]["command"] == "docker-compose" - args = config["mcpServers"]["zen-mcp"]["args"] + args = config["mcpServers"]["pal-mcp"]["args"] assert "-f" in args assert "run" in args assert "--rm" in args - assert "zen-mcp" in args + assert "pal-mcp" in args def test_mcp_config_environment_variables(self): """Test MCP configuration with inline environment variables""" config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", @@ -83,13 +83,13 @@ class TestDockerClaudeDesktopIntegration: "GEMINI_API_KEY=test_key", "-e", "LOG_LEVEL=INFO", - "zen-mcp-server:latest", + "pal-mcp-server:latest", ], } } } - args = config["mcpServers"]["zen-mcp"]["args"] + args = config["mcpServers"]["pal-mcp"]["args"] # Check that environment variables are properly formatted env_args = [arg for arg in args if arg.startswith("-e")] @@ -103,23 +103,23 @@ class TestDockerClaudeDesktopIntegration: """Test Windows-specific path formatting""" windows_config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", - "C:/Users/User/zen-mcp-server/.env", + "C:/Users/User/pal-mcp-server/.env", "-v", - "C:/Users/User/zen-mcp-server/logs:/app/logs", - "zen-mcp-server:latest", + "C:/Users/User/pal-mcp-server/logs:/app/logs", + "pal-mcp-server:latest", ], } } } - args = windows_config["mcpServers"]["zen-mcp"]["args"] + args = windows_config["mcpServers"]["pal-mcp"]["args"] # Check Windows path format windows_paths = [arg for arg in args if arg.startswith("C:/")] @@ -132,7 +132,7 @@ class TestDockerClaudeDesktopIntegration: """Test validation of MCP configuration""" # Valid configuration valid_config = { - "mcpServers": {"zen-mcp": {"command": "docker", "args": ["run", "--rm", "-i", "zen-mcp-server:latest"]}} + "mcpServers": {"pal-mcp": {"command": "docker", "args": ["run", "--rm", "-i", "pal-mcp-server:latest"]}} } # Validate JSON serialization @@ -144,19 +144,19 @@ class TestDockerClaudeDesktopIntegration: """Test that MCP configuration supports stdio communication""" config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", "args": [ "run", "--rm", "-i", # Interactive mode for stdio - "zen-mcp-server:latest", + "pal-mcp-server:latest", ], } } } - args = config["mcpServers"]["zen-mcp"]["args"] + args = config["mcpServers"]["pal-mcp"]["args"] # Check for interactive mode assert "-i" in args, "Interactive mode required for stdio communication" @@ -168,9 +168,9 @@ class TestDockerClaudeDesktopIntegration: def test_docker_image_reference(self): """Test that Docker image is properly referenced""" configs = [ - {"image": "zen-mcp-server:latest"}, - {"image": "zen-mcp-server:v1.0.0"}, - {"image": "registry/zen-mcp-server:latest"}, + {"image": "pal-mcp-server:latest"}, + {"image": "pal-mcp-server:v1.0.0"}, + {"image": "registry/pal-mcp-server:latest"}, ] for config in configs: @@ -185,9 +185,9 @@ class TestDockerClaudeDesktopIntegration: """Create temporary MCP configuration file""" config = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", - "args": ["run", "--rm", "-i", "--env-file", "/tmp/.env", "zen-mcp-server:latest"], + "args": ["run", "--rm", "-i", "--env-file", "/tmp/.env", "pal-mcp-server:latest"], } } } @@ -206,7 +206,7 @@ class TestDockerClaudeDesktopIntegration: config = json.load(f) assert "mcpServers" in config - assert "zen-mcp" in config["mcpServers"] + assert "pal-mcp" in config["mcpServers"] def test_environment_file_integration(self): """Test integration with .env file""" @@ -254,25 +254,25 @@ class TestDockerMCPErrorHandling: # This would test what happens when the image doesn't exist # In practice, Claude Desktop would show an error nonexistent_config = { - "mcpServers": {"zen-mcp": {"command": "docker", "args": ["run", "--rm", "-i", "nonexistent:latest"]}} + "mcpServers": {"pal-mcp": {"command": "docker", "args": ["run", "--rm", "-i", "nonexistent:latest"]}} } # Configuration should be valid even if image doesn't exist - assert "zen-mcp" in nonexistent_config["mcpServers"] + assert "pal-mcp" in nonexistent_config["mcpServers"] def test_invalid_env_file_path(self): """Test handling of invalid .env file path""" config_with_invalid_env = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", - "args": ["run", "--rm", "-i", "--env-file", "/nonexistent/.env", "zen-mcp-server:latest"], + "args": ["run", "--rm", "-i", "--env-file", "/nonexistent/.env", "pal-mcp-server:latest"], } } } # Configuration structure should still be valid - args = config_with_invalid_env["mcpServers"]["zen-mcp"]["args"] + args = config_with_invalid_env["mcpServers"]["pal-mcp"]["args"] assert "--env-file" in args def test_docker_permission_issues(self): @@ -294,14 +294,14 @@ class TestDockerMCPErrorHandling: """Test Docker resource limit configurations""" config_with_limits = { "mcpServers": { - "zen-mcp": { + "pal-mcp": { "command": "docker", - "args": ["run", "--rm", "-i", "--memory=512m", "--cpus=1.0", "zen-mcp-server:latest"], + "args": ["run", "--rm", "-i", "--memory=512m", "--cpus=1.0", "pal-mcp-server:latest"], } } } - args = config_with_limits["mcpServers"]["zen-mcp"]["args"] + args = config_with_limits["mcpServers"]["pal-mcp"]["args"] # Check for resource limits memory_limit = any("--memory" in arg for arg in args) diff --git a/tests/test_docker_config_complete.py b/tests/test_docker_config_complete.py index 08e69a0..1be062d 100644 --- a/tests/test_docker_config_complete.py +++ b/tests/test_docker_config_complete.py @@ -83,7 +83,7 @@ class TestDockerCommandValidation: mock_run.return_value.returncode = 0 # Standard build command - build_cmd = ["docker", "build", "-t", "zen-mcp-server:latest", "."] + build_cmd = ["docker", "build", "-t", "pal-mcp-server:latest", "."] import subprocess @@ -105,7 +105,7 @@ class TestDockerCommandValidation: ".env", "-v", "logs:/app/logs", - "zen-mcp-server:latest", + "pal-mcp-server:latest", "python", "server.py", ] @@ -128,7 +128,7 @@ class TestDockerCommandValidation: "/path/to/.env", "-v", "/path/to/logs:/app/logs", - "zen-mcp-server:latest", + "pal-mcp-server:latest", "python", "server.py", ] @@ -139,7 +139,7 @@ class TestDockerCommandValidation: assert "--rm" in mcp_cmd # Automatic cleanup assert "-i" in mcp_cmd # Interactive mode assert "--env-file" in mcp_cmd # Environment variables - assert "zen-mcp-server:latest" in mcp_cmd # Image + assert "pal-mcp-server:latest" in mcp_cmd # Image class TestIntegrationChecks: diff --git a/tests/test_docker_implementation.py b/tests/test_docker_implementation.py index 7bf19bf..d93ca9f 100644 --- a/tests/test_docker_implementation.py +++ b/tests/test_docker_implementation.py @@ -1,5 +1,5 @@ """ -Unit tests for Docker configuration and implementation of Zen MCP Server +Unit tests for Docker configuration and implementation of PAL MCP Server This module tests: - Docker and MCP configuration @@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) class TestDockerConfiguration: - """Tests for Docker configuration of Zen MCP Server""" + """Tests for Docker configuration of PAL MCP Server""" def setup_method(self): """Setup for each test""" @@ -51,7 +51,7 @@ class TestDockerConfiguration: # Basic YAML syntax check content = self.docker_compose_path.read_text() assert "services:" in content, "docker-compose.yml must have services" - assert "zen-mcp" in content, "Service zen-mcp must be defined" + assert "pal-mcp" in content, "Service pal-mcp must be defined" assert "build:" in content, "Build configuration must be present" def test_environment_file_template(self): @@ -80,7 +80,7 @@ class TestDockerCommands: # Simulate docker build subprocess.run( - ["docker", "build", "-t", "zen-mcp-server:latest", str(self.project_root)], capture_output=True, text=True + ["docker", "build", "-t", "pal-mcp-server:latest", str(self.project_root)], capture_output=True, text=True ) mock_run.assert_called_once() @@ -100,7 +100,7 @@ class TestDockerCommands: ".env", "-v", "logs:/app/logs", - "zen-mcp-server:latest", + "pal-mcp-server:latest", "python", "server.py", ] @@ -111,7 +111,7 @@ class TestDockerCommands: assert "--rm" in cmd, "Must contain --rm for cleanup" assert "-i" in cmd, "Must contain -i for stdio" assert "--env-file" in cmd, "Must contain --env-file" - assert "zen-mcp-server:latest" in cmd, "Must reference the image" + assert "pal-mcp-server:latest" in cmd, "Must reference the image" @patch("subprocess.run") def test_docker_health_check(self, mock_run): @@ -121,7 +121,7 @@ class TestDockerCommands: # Simulate health check subprocess.run( - ["docker", "run", "--rm", "zen-mcp-server:latest", "python", "/usr/local/bin/healthcheck.py"], + ["docker", "run", "--rm", "pal-mcp-server:latest", "python", "/usr/local/bin/healthcheck.py"], capture_output=True, text=True, ) @@ -187,7 +187,7 @@ class TestMCPIntegration: # Expected MCP configuration expected_config = { "servers": { - "zen-docker": { + "pal-docker": { "command": "docker", "args": [ "run", @@ -197,7 +197,7 @@ class TestMCPIntegration: "/path/to/.env", "-v", "/path/to/logs:/app/logs", - "zen-mcp-server:latest", + "pal-mcp-server:latest", "python", "server.py", ], @@ -208,11 +208,11 @@ class TestMCPIntegration: # Check structure assert "servers" in expected_config - zen_docker = expected_config["servers"]["zen-docker"] - assert zen_docker["command"] == "docker" - assert "run" in zen_docker["args"] - assert "--rm" in zen_docker["args"] - assert "-i" in zen_docker["args"] + pal_docker = expected_config["servers"]["pal-docker"] + assert pal_docker["command"] == "docker" + assert "run" in pal_docker["args"] + assert "--rm" in pal_docker["args"] + assert "-i" in pal_docker["args"] def test_stdio_communication_structure(self): """Test structure of stdio communication""" @@ -279,7 +279,7 @@ class TestDockerPerformance: expected_max_size_mb = 500 # 500MB max # In production, we would do: - # result = subprocess.run(['docker', 'images', '--format', '{{.Size}}', 'zen-mcp-server:latest']) + # result = subprocess.run(['docker', 'images', '--format', '{{.Size}}', 'pal-mcp-server:latest']) # Here we simulate simulated_size = "294MB" # Current observed size @@ -346,7 +346,7 @@ LOG_LEVEL=INFO "-i", "--env-file", ".env", - "zen-mcp-server:latest", + "pal-mcp-server:latest", "python", "server.py", ] diff --git a/tests/test_docker_mcp_validation.py b/tests/test_docker_mcp_validation.py index c28642d..7c1e595 100644 --- a/tests/test_docker_mcp_validation.py +++ b/tests/test_docker_mcp_validation.py @@ -39,7 +39,7 @@ class TestDockerMCPValidation: mock_run.return_value.returncode = 0 # Standard Docker MCP command - cmd = ["docker", "run", "--rm", "-i", "--env-file", ".env", "zen-mcp-server:latest", "python", "server.py"] + cmd = ["docker", "run", "--rm", "-i", "--env-file", ".env", "pal-mcp-server:latest", "python", "server.py"] subprocess.run(cmd, capture_output=True) mock_run.assert_called_once_with(cmd, capture_output=True) diff --git a/tests/test_docker_volume_persistence.py b/tests/test_docker_volume_persistence.py index c7a5216..9d93453 100644 --- a/tests/test_docker_volume_persistence.py +++ b/tests/test_docker_volume_persistence.py @@ -28,18 +28,18 @@ class TestDockerVolumePersistence: content = self.docker_compose_path.read_text() # Check for named volume definition - assert "zen-mcp-config:" in content, "zen-mcp-config volume must be defined" + assert "pal-mcp-config:" in content, "pal-mcp-config volume must be defined" assert "driver: local" in content, "Named volume must use local driver" # Check for volume mounts in service assert "./logs:/app/logs" in content, "Logs volume mount required" - assert "zen-mcp-config:/app/conf" in content, "Config volume mount required" + assert "pal-mcp-config:/app/conf" in content, "Config volume mount required" def test_persistent_volume_creation(self): """Test that persistent volumes are created correctly""" # This test checks that the volume configuration is valid # In a real environment, you might want to test actual volume creation - volume_name = "zen-mcp-config" + volume_name = "pal-mcp-config" # Mock Docker command to check volume exists with patch("subprocess.run") as mock_run: @@ -84,7 +84,7 @@ class TestDockerVolumePersistence: "run", "--rm", "-v", - "zen-mcp-config:/data", + "pal-mcp-config:/data", "-v", "$(pwd):/backup", "alpine", @@ -97,7 +97,7 @@ class TestDockerVolumePersistence: ] # Verify command structure is valid - assert "zen-mcp-config:/data" in backup_cmd + assert "pal-mcp-config:/data" in backup_cmd assert "tar" in backup_cmd assert "czf" in backup_cmd @@ -139,7 +139,7 @@ class TestDockerVolumeIntegration: # Verify that docker-compose run inherits volume configuration # This is more of a configuration validation test - compose_run_cmd = ["docker-compose", "run", "--rm", "zen-mcp"] + compose_run_cmd = ["docker-compose", "run", "--rm", "pal-mcp"] # The command should work with the existing volume configuration assert "docker-compose" in compose_run_cmd diff --git a/tests/test_integration_utf8.py b/tests/test_integration_utf8.py index 33aad79..970ccc4 100644 --- a/tests/test_integration_utf8.py +++ b/tests/test_integration_utf8.py @@ -335,7 +335,7 @@ Pour plus de détails sur chaque problème identifié, consultez les recommandat - [ ] Exécuter les tests de régression --- -*Analyse générée automatiquement par MCP Zen* 🤖 +*Analyse générée automatiquement par MCP PAL* 🤖 """, "metadata": { "tool_name": "analyze", @@ -459,13 +459,13 @@ def run_unit_tests(): def main(): """Main function.""" - print("🇫🇷 UTF-8 Integration Test - Zen MCP Server") + print("🇫🇷 UTF-8 Integration Test - PAL MCP Server") print("=" * 60) try: run_utf8_integration_tests() print("\n🎉 SUCCESS: All UTF-8 integration tests passed!") - print("🚀 Zen MCP server fully supports French localization!") + print("🚀 PAL MCP Server fully supports French localization!") return 0 except AssertionError as e: diff --git a/tests/test_model_metadata_continuation.py b/tests/test_model_metadata_continuation.py index e190441..d46aa91 100644 --- a/tests/test_model_metadata_continuation.py +++ b/tests/test_model_metadata_continuation.py @@ -5,7 +5,7 @@ This test verifies that when using continuation_id without specifying a model, the system correctly retrieves and uses the model from the previous conversation turn instead of defaulting to DEFAULT_MODEL or the custom provider's default. -Bug: https://github.com/BeehiveInnovations/zen-mcp-server/issues/111 +Bug: https://github.com/BeehiveInnovations/pal-mcp-server/issues/111 """ from unittest.mock import MagicMock, patch diff --git a/tests/test_openrouter_provider.py b/tests/test_openrouter_provider.py index 231d13e..092872a 100644 --- a/tests/test_openrouter_provider.py +++ b/tests/test_openrouter_provider.py @@ -361,7 +361,7 @@ class TestOpenRouterFunctionality: # Check default headers assert "HTTP-Referer" in provider.DEFAULT_HEADERS assert "X-Title" in provider.DEFAULT_HEADERS - assert provider.DEFAULT_HEADERS["X-Title"] == "Zen MCP Server" + assert provider.DEFAULT_HEADERS["X-Title"] == "PAL MCP Server" def test_openrouter_model_registry_initialized(self): """Test that model registry is properly initialized.""" diff --git a/tests/test_pip_detection_fix.py b/tests/test_pip_detection_fix.py index 9c88107..1e96187 100644 --- a/tests/test_pip_detection_fix.py +++ b/tests/test_pip_detection_fix.py @@ -58,7 +58,7 @@ class TestPipDetectionFix: # Test case for Git Bash on Windows and non-interactive Linux shells with tempfile.TemporaryDirectory() as temp_dir: # Create mock virtual environment structure - venv_path = Path(temp_dir) / ".zen_venv" + venv_path = Path(temp_dir) / ".pal_venv" bin_path = venv_path / "bin" bin_path.mkdir(parents=True) diff --git a/tests/test_prompt_regression.py b/tests/test_prompt_regression.py index b4b3b85..bf40164 100644 --- a/tests/test_prompt_regression.py +++ b/tests/test_prompt_regression.py @@ -431,9 +431,16 @@ class UserController: output = json.loads(result[0].text) assert output["status"] in ["success", "continuation_available"] assert "content" in output - # Should mention hello or world or greeting in some form + # Should mention hello or world or greeting in some form (including French equivalents) content_lower = output["content"].lower() - assert "hello" in content_lower or "world" in content_lower or "greeting" in content_lower + assert ( + "hello" in content_lower + or "world" in content_lower + or "greeting" in content_lower + or "bonjour" in content_lower # French: hello + or "monde" in content_lower # French: world + or "salut" in content_lower # French: greeting + ) if __name__ == "__main__": diff --git a/tests/test_server.py b/tests/test_server.py index 8333e70..a66bb72 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -101,7 +101,7 @@ class TestServerTools: content = data["content"] # Check for expected content in the markdown output - assert "# Zen MCP Server Version" in content + assert "# PAL MCP Server Version" in content assert "## Server Information" in content assert "## Configuration" in content assert "Current Version" in content diff --git a/tests/test_utf8_localization.py b/tests/test_utf8_localization.py index e68bf6c..da2416c 100644 --- a/tests/test_utf8_localization.py +++ b/tests/test_utf8_localization.py @@ -237,7 +237,7 @@ def generate_report(): def test_emoji_preservation(self): """Test emoji preservation in JSON encoding.""" - # Emojis used in Zen MCP tools + # Emojis used in PAL MCP tools emojis = [ "🔴", # Critical "🟠", # High diff --git a/tests/test_uvx_support.py b/tests/test_uvx_support.py index e5468ec..0f017cd 100644 --- a/tests/test_uvx_support.py +++ b/tests/test_uvx_support.py @@ -33,7 +33,7 @@ class TestUvxEnvironmentHandling: with tempfile.NamedTemporaryFile("w", delete=False) as tmp_env: temp_env_path = Path(tmp_env.name) - tmp_env.write("ZEN_MCP_FORCE_ENV_OVERRIDE=false\n") + tmp_env.write("PAL_MCP_FORCE_ENV_OVERRIDE=false\n") try: importlib.reload(env_config) @@ -82,7 +82,7 @@ class TestUvxEnvironmentHandling: def test_environment_variables_still_work_without_dotenv(self): """Test that environment variables work even when dotenv is not available.""" # Set a test environment variable - test_key = "TEST_ZEN_MCP_VAR" + test_key = "TEST_PAL_MCP_VAR" test_value = "test_value_123" with mock.patch.dict(os.environ, {test_key: test_value}): @@ -133,14 +133,14 @@ class TestUvxProjectConfiguration: # Essential fields for uvx assert "name" in project - assert project["name"] == "zen-mcp-server" + assert project["name"] == "pal-mcp-server" assert "dependencies" in project assert "requires-python" in project # Script entry point for uvx assert "scripts" in project - assert "zen-mcp-server" in project["scripts"] - assert project["scripts"]["zen-mcp-server"] == "server:run" + assert "pal-mcp-server" in project["scripts"] + assert project["scripts"]["pal-mcp-server"] == "server:run" def test_pyproject_dependencies_match_requirements(self): """Test that pyproject.toml dependencies align with requirements.txt.""" diff --git a/tools/__init__.py b/tools/__init__.py index 8bb17a9..cf716e1 100644 --- a/tools/__init__.py +++ b/tools/__init__.py @@ -1,5 +1,5 @@ """ -Tool implementations for Zen MCP Server +Tool implementations for PAL MCP Server """ from .analyze import AnalyzeTool diff --git a/tools/chat.py b/tools/chat.py index 3e95f0d..8bc7e0c 100644 --- a/tools/chat.py +++ b/tools/chat.py @@ -251,7 +251,7 @@ class ChatTool(SimpleTool): except Exception as exc: # pragma: no cover - rare filesystem failures logger.error("Failed to persist generated code block: %s", exc, exc_info=True) warning = ( - f"WARNING: Unable to write zen_generated.code inside '{target_directory}'. " + f"WARNING: Unable to write pal_generated.code inside '{target_directory}'. " "Check the path permissions and re-run. The generated code block is included below for manual handling." ) @@ -264,7 +264,7 @@ class ChatTool(SimpleTool): else: if not sanitized_text: base_message = ( - "Generated code saved to zen_generated.code.\n" + "Generated code saved to pal_generated.code.\n" "\n" "CRITICAL: Contains mixed instructions + partial snippets - NOT complete code to copy as-is!\n" "\n" @@ -339,12 +339,12 @@ class ChatTool(SimpleTool): if not target_dir.is_dir(): raise FileNotFoundError(f"Absolute working directory path '{working_directory}' does not exist") - target_file = target_dir / "zen_generated.code" + target_file = target_dir / "pal_generated.code" if target_file.exists(): try: target_file.unlink() except OSError as exc: - logger.warning("Unable to remove existing zen_generated.code: %s", exc) + logger.warning("Unable to remove existing pal_generated.code: %s", exc) content = block if block.endswith("\n") else f"{block}\n" target_file.write_text(content, encoding="utf-8") diff --git a/tools/clink.py b/tools/clink.py index 2922f47..f984c8c 100644 --- a/tools/clink.py +++ b/tools/clink.py @@ -1,4 +1,4 @@ -"""clink tool - bridge Zen MCP requests to external AI CLIs.""" +"""clink tool - bridge PAL MCP requests to external AI CLIs.""" from __future__ import annotations @@ -78,7 +78,7 @@ class CLinkTool(SimpleTool): def get_description(self) -> str: return ( - "Link a request to an external AI CLI (Gemini CLI, Qwen CLI, etc.) through Zen MCP to reuse " + "Link a request to an external AI CLI (Gemini CLI, Qwen CLI, etc.) through PAL MCP to reuse " "their capabilities inside existing workflows." ) @@ -443,7 +443,7 @@ class CLinkTool(SimpleTool): "You are operating through the Gemini CLI agent. You have access to your full suite of " "CLI capabilities—including launching web searches, reading files, and using any other " "available tools. Gather current information yourself and deliver the final answer without " - "asking the Zen MCP host to perform searches or file reads." + "asking the PAL MCP host to perform searches or file reads." ) def _format_file_references(self, files: list[str]) -> str: diff --git a/tools/precommit.py b/tools/precommit.py index 4543554..29a2bd2 100644 --- a/tools/precommit.py +++ b/tools/precommit.py @@ -552,7 +552,7 @@ class PrecommitTool(WorkflowTool): expert_analysis_used: True if expert analysis was successfully executed """ base_message = ( - "PRE-COMMIT VALIDATION IS COMPLETE. You may delete any `zen_precommit.changeset` created. You MUST now summarize " + "PRE-COMMIT VALIDATION IS COMPLETE. You may delete any `pal_precommit.changeset` created. You MUST now summarize " "and present ALL validation results, identified issues with their severity levels, and exact commit recommendations. " "Clearly state whether the changes are ready for commit or require fixes first. Provide concrete, actionable guidance for " "any issues that need resolution—make it easy for a developer to understand exactly what needs to be " @@ -617,7 +617,7 @@ class PrecommitTool(WorkflowTool): "You are on step 1 of MAXIMUM 2 steps. CRITICAL: Gather and save the complete git changeset NOW. " "MANDATORY ACTIONS:\\n" + "\\n".join(f"{i+1}. {action}" for i, action in enumerate(required_actions)) - + "\\n\\nMANDATORY: The changeset may be large. You MUST save the required changeset as a 'zen_precommit.changeset' file " + + "\\n\\nMANDATORY: The changeset may be large. You MUST save the required changeset as a 'pal_precommit.changeset' file " "(replacing any existing one) in your work directory and include the FULL absolute path in relevant_files (exclude any " "binary files). ONLY include the code changes, no extra commentary." "Set next_step_required=True and step_number=2 for the next call." @@ -659,7 +659,7 @@ class PrecommitTool(WorkflowTool): f"MANDATORY: call {self.get_name()} tool immediately again, and set next_step_required=False to " f"trigger external validation NOW. " f"MANDATORY: Include the entire changeset! The changeset may be large. You MUST save the required " - f"changeset as a 'zen_precommit.changeset' file (replacing any existing one) in your work directory " + f"changeset as a 'pal_precommit.changeset' file (replacing any existing one) in your work directory " f"and include the FULL absolute path in relevant_files so the expert can access the complete changeset. " f"ONLY include the code changes, no extra commentary." ) @@ -678,7 +678,7 @@ class PrecommitTool(WorkflowTool): # About to complete - ensure changeset is saved next_steps = ( "Completing validation and proceeding to expert analysis. " - "MANDATORY: Save the complete git changeset as a 'zen_precommit.changeset' file " + "MANDATORY: Save the complete git changeset as a 'pal_precommit.changeset' file " "in your work directory and include the FULL absolute path in relevant_files." ) else: @@ -704,7 +704,7 @@ class PrecommitTool(WorkflowTool): elif not request.next_step_required and request.precommit_type == "external": next_steps = ( "Completing validation. " - "MANDATORY: Save complete git changeset as 'zen_precommit.changeset' file and include path in relevant_files, " + "MANDATORY: Save complete git changeset as 'pal_precommit.changeset' file and include path in relevant_files, " "excluding any binary files." ) else: diff --git a/tools/shared/__init__.py b/tools/shared/__init__.py index e486150..7d55e08 100644 --- a/tools/shared/__init__.py +++ b/tools/shared/__init__.py @@ -1,5 +1,5 @@ """ -Shared infrastructure for Zen MCP tools. +Shared infrastructure for PAL MCP tools. This module contains the core base classes and utilities that are shared across all tool types. It provides the foundation for the tool architecture. diff --git a/tools/shared/base_models.py b/tools/shared/base_models.py index b6dcac9..0506701 100644 --- a/tools/shared/base_models.py +++ b/tools/shared/base_models.py @@ -1,5 +1,5 @@ """ -Base models for Zen MCP tools. +Base models for PAL MCP tools. This module contains the shared Pydantic models used across all tools, extracted to avoid circular imports and promote code reuse. @@ -59,7 +59,7 @@ WORKFLOW_FIELD_DESCRIPTIONS = { class ToolRequest(BaseModel): """ - Base request model for all Zen MCP tools. + Base request model for all PAL MCP tools. This model defines common fields that all tools accept, including model selection, temperature control, and conversation threading. diff --git a/tools/shared/base_tool.py b/tools/shared/base_tool.py index d093598..94506e8 100644 --- a/tools/shared/base_tool.py +++ b/tools/shared/base_tool.py @@ -1,5 +1,5 @@ """ -Core Tool Infrastructure for Zen MCP Tools +Core Tool Infrastructure for PAL MCP Tools This module provides the fundamental base class for all tools: - BaseTool: Abstract base class defining the tool interface @@ -45,7 +45,7 @@ logger = logging.getLogger(__name__) class BaseTool(ABC): """ - Abstract base class for all Zen MCP tools. + Abstract base class for all PAL MCP tools. This class defines the interface that all tools must implement and provides common functionality for request handling, model creation, and response formatting. diff --git a/tools/shared/exceptions.py b/tools/shared/exceptions.py index 325b86f..fc47098 100644 --- a/tools/shared/exceptions.py +++ b/tools/shared/exceptions.py @@ -1,5 +1,5 @@ """ -Custom exceptions for Zen MCP tools. +Custom exceptions for PAL MCP tools. These exceptions allow tools to signal protocol-level errors that should be surfaced to MCP clients using the `isError` flag on `CallToolResult`. Raising one of these diff --git a/tools/shared/schema_builders.py b/tools/shared/schema_builders.py index baed420..2e6af62 100644 --- a/tools/shared/schema_builders.py +++ b/tools/shared/schema_builders.py @@ -1,5 +1,5 @@ """ -Core schema building functionality for Zen MCP tools. +Core schema building functionality for PAL MCP tools. This module provides base schema generation functionality for simple tools. Workflow-specific schema building is located in workflow/schema_builders.py diff --git a/tools/simple/__init__.py b/tools/simple/__init__.py index 9d6f03a..2d769dc 100644 --- a/tools/simple/__init__.py +++ b/tools/simple/__init__.py @@ -1,5 +1,5 @@ """ -Simple tools for Zen MCP. +Simple tools for PAL MCP. Simple tools follow a basic request → AI model → response pattern. They inherit from SimpleTool which provides streamlined functionality diff --git a/tools/version.py b/tools/version.py index 35bead7..b926491 100644 --- a/tools/version.py +++ b/tools/version.py @@ -1,7 +1,7 @@ """ -Version Tool - Display Zen MCP Server version and system information +Version Tool - Display PAL MCP Server version and system information -This tool provides version information about the Zen MCP Server including +This tool provides version information about the PAL MCP Server including version number, last update date, author, and basic system information. It also checks for updates from the GitHub repository. """ @@ -90,7 +90,7 @@ def fetch_github_version() -> Optional[tuple[str, str]]: logger.warning("urllib not available, cannot check for updates") return None - github_url = "https://raw.githubusercontent.com/BeehiveInnovations/zen-mcp-server/main/config.py" + github_url = "https://raw.githubusercontent.com/BeehiveInnovations/pal-mcp-server/main/config.py" try: # Set a 10-second timeout @@ -126,7 +126,7 @@ def fetch_github_version() -> Optional[tuple[str, str]]: class VersionTool(BaseTool): """ - Tool for displaying Zen MCP Server version and system information. + Tool for displaying PAL MCP Server version and system information. This tool provides: - Current server version @@ -176,7 +176,7 @@ class VersionTool(BaseTool): async def execute(self, arguments: dict[str, Any]) -> list[TextContent]: """ - Display Zen MCP Server version and system information. + Display PAL MCP Server version and system information. This overrides the base class execute to provide direct output without AI model calls. @@ -186,7 +186,7 @@ class VersionTool(BaseTool): Returns: Formatted version and system information """ - output_lines = ["# Zen MCP Server Version\n"] + output_lines = ["# PAL MCP Server Version\n"] # Server version information output_lines.append("## Server Information") diff --git a/tools/workflow/__init__.py b/tools/workflow/__init__.py index 9603937..3aa9841 100644 --- a/tools/workflow/__init__.py +++ b/tools/workflow/__init__.py @@ -1,5 +1,5 @@ """ -Workflow tools for Zen MCP. +Workflow tools for PAL MCP. Workflow tools follow a multi-step pattern with forced pauses between steps to encourage thorough investigation and analysis. They inherit from WorkflowTool diff --git a/tools/workflow/workflow_mixin.py b/tools/workflow/workflow_mixin.py index 82a6242..e929591 100644 --- a/tools/workflow/workflow_mixin.py +++ b/tools/workflow/workflow_mixin.py @@ -1,5 +1,5 @@ """ -Workflow Mixin for Zen MCP Tools +Workflow Mixin for PAL MCP Tools This module provides a sophisticated workflow-based pattern that enables tools to perform multi-step work with structured findings and expert analysis. diff --git a/utils/__init__.py b/utils/__init__.py index 8024036..764feb9 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,5 +1,5 @@ """ -Utility functions for Zen MCP Server +Utility functions for PAL MCP Server """ from .file_types import CODE_EXTENSIONS, FILE_CATEGORIES, PROGRAMMING_EXTENSIONS, TEXT_EXTENSIONS diff --git a/utils/client_info.py b/utils/client_info.py index e32b7f3..707b69a 100644 --- a/utils/client_info.py +++ b/utils/client_info.py @@ -286,8 +286,8 @@ def log_client_info(server: Any, logger_instance: Optional[logging.Logger] = Non # # # Customize response based on client # if client_name == "Claude": -# response = f"Hello from Zen MCP Server to {client_name}!" +# response = f"Hello from PAL MCP Server to {client_name}!" # elif client_name == "Gemini": -# response = f"Greetings {client_name}, welcome to Zen MCP Server!" +# response = f"Greetings {client_name}, welcome to PAL MCP Server!" # else: # response = f"Welcome {client_name}!" diff --git a/utils/env.py b/utils/env.py index 17aad87..e49ee55 100644 --- a/utils/env.py +++ b/utils/env.py @@ -1,4 +1,4 @@ -"""Centralized environment variable access for Zen MCP Server.""" +"""Centralized environment variable access for PAL MCP Server.""" from __future__ import annotations @@ -28,7 +28,7 @@ def _read_dotenv_values() -> dict[str, str | None]: def _compute_force_override(values: Mapping[str, str | None]) -> bool: - raw = (values.get("ZEN_MCP_FORCE_ENV_OVERRIDE") or "false").strip().lower() + raw = (values.get("PAL_MCP_FORCE_ENV_OVERRIDE") or "false").strip().lower() return raw == "true" @@ -58,13 +58,13 @@ reload_env() def env_override_enabled() -> bool: - """Return True when ZEN_MCP_FORCE_ENV_OVERRIDE is enabled via the .env file.""" + """Return True when PAL_MCP_FORCE_ENV_OVERRIDE is enabled via the .env file.""" return _FORCE_ENV_OVERRIDE def get_env(key: str, default: str | None = None) -> str | None: - """Retrieve environment variables respecting ZEN_MCP_FORCE_ENV_OVERRIDE.""" + """Retrieve environment variables respecting PAL_MCP_FORCE_ENV_OVERRIDE.""" if env_override_enabled(): if key in _DOTENV_VALUES: