drupal-mcp-server 0.3.0__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/PKG-INFO +2 -2
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/README.md +1 -1
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/CHANGELOG.md +15 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/agents.md +4 -4
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/pyproject.toml +4 -1
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/live-migration-d7d11.sh +2 -5
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/__init__.py +1 -1
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/installer.py +9 -4
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_installer.py +1 -1
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.codecov.yml +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.env.example +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/workflows/ci.yml +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/workflows/docs.yml +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/workflows/release.yml +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.gitignore +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/LICENSE +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/MAINTAINERS.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/CODE_OF_CONDUCT.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/CONTRIBUTING.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/SECURITY.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/adr/0001-use-fastmcp.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/adr/0002-pydantic-settings.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/adr/0003-subprocess-drush.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/adr/0004-http-transport.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/architecture.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/configuration.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/docstring_standard.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/index.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/installation.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/migration.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/quickstart.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/tools/content.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/tools/devops.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/tools/index.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/docs/tools/users.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/.env.example +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/README.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/basic_usage.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/content_workflow.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/custom_tool.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/examples/migration_workflow.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/mkdocs.yml +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/lint.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/live-migration-d9d11-run.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/live-migration-d9d11.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/live-migration-smoke-run.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/live-migration-smoke.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/run.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/setup.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/scripts/test.sh +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/auth/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/auth/basic.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/auth/mcp_oauth.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/auth/session.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/auth/token.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/cli.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/base.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/drush.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/graphql.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/jsonapi.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/indexer.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/parsers.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/search.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/config.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/errors.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/exceptions.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/logging_config.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/schemas.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/server.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/ai_service.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/migration_service.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/site_manager.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/_utils.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/accessibility.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/ai.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/analysis.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/code_audit.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/codebase.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/comments.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/commerce.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/config.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/contact.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/content.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/database.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/devops.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/drupal_org.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/exports.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/feeds.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/fields.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/headless.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/layout_builder.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/media_enhanced.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/menus.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/metatag.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/migration.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/moderation.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/module_dev.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/multilingual.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/paragraphs.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/pathauto.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/performance.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/redirects.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/revisions.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/scheduler.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/search_api.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/security_audit.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/status.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/taxonomy.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/testing.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/theme_analysis.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/theme_dev.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/users.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/views.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/webform.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/validation.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/integration/test_server.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/README.md +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/bootstrap.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/filter_check.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/install_modules.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/layout_builder_test.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/mcp_call.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/queue_test.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/resource_check.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/seed.php +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/smoke_test.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/live/sweep.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/__init__.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_auth.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_clients.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_codebase.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_content_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_drupal_org.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_errors.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_exports.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_handler_and_translation_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_insight_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_logging_config.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_migration_service.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_moderation_transitions.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_resource_names.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_revisions.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_scheduler_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_schemas.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_security_scanners.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_status_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_sweep_harness.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_theme_analysis.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_tool_utils.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_tools.py +0 -0
- {drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: drupal-mcp-server
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: MCP server for Drupal operations - JSON:API, GraphQL, Drush, AI-powered migration
|
|
5
5
|
Author: Loganathane V
|
|
6
6
|
License: MIT
|
|
@@ -147,7 +147,7 @@ config (preferring the client's own `mcp add` command when it has one).
|
|
|
147
147
|
|
|
148
148
|
```bash
|
|
149
149
|
drupal-mcp install --client claude-code --print # preview without writing
|
|
150
|
-
drupal-mcp install --command 'uvx drupal-mcp-server' # run from PyPI, no install
|
|
150
|
+
drupal-mcp install --command 'uvx --from drupal-mcp-server drupal-mcp' # run from PyPI, no install
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
See the [AI Coding Agents guide](docs/agents.md) for per-client copy-paste
|
|
@@ -104,7 +104,7 @@ config (preferring the client's own `mcp add` command when it has one).
|
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
106
|
drupal-mcp install --client claude-code --print # preview without writing
|
|
107
|
-
drupal-mcp install --command 'uvx drupal-mcp-server' # run from PyPI, no install
|
|
107
|
+
drupal-mcp install --command 'uvx --from drupal-mcp-server drupal-mcp' # run from PyPI, no install
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
See the [AI Coding Agents guide](docs/agents.md) for per-client copy-paste
|
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.1] - 2026-10-17
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Make `uvx drupal-mcp-server` actually run the server. The package
|
|
15
|
+
shipped only a `drupal-mcp` executable, and current uv refuses to
|
|
16
|
+
guess when the tool name differs from the package name ("Use `uvx
|
|
17
|
+
--from drupal-mcp-server drupal-mcp` instead"), so the documented
|
|
18
|
+
no-install command — including the PATH fallback the installer
|
|
19
|
+
writes into client configs — failed to start. A `drupal-mcp-server`
|
|
20
|
+
console-script alias now runs the same entry point, and the
|
|
21
|
+
installer's fallback, help text, README and AI-agents guide name the
|
|
22
|
+
unambiguous `uvx --from drupal-mcp-server drupal-mcp` form, which
|
|
23
|
+
works on every uv version.
|
|
24
|
+
|
|
10
25
|
## [0.3.0] - 2026-10-17
|
|
11
26
|
|
|
12
27
|
### Added
|
|
@@ -38,7 +38,7 @@ With no arguments it:
|
|
|
38
38
|
| `--env KEY=VALUE` | Extra environment variable (repeatable) |
|
|
39
39
|
| `--dotenv PATH` | Env file to read (default `./.env` if present) |
|
|
40
40
|
| `--name NAME` | Server name inside the client config (default `drupal`) |
|
|
41
|
-
| `--command CMD` | Launch command override, e.g. `--command 'uvx drupal-mcp-server'` |
|
|
41
|
+
| `--command CMD` | Launch command override, e.g. `--command 'uvx --from drupal-mcp-server drupal-mcp'` |
|
|
42
42
|
| `--scope local\|user\|project` | Claude Code configuration scope |
|
|
43
43
|
| `--global` | OpenCode: write the global config instead of the project one |
|
|
44
44
|
|
|
@@ -58,8 +58,8 @@ With no arguments it:
|
|
|
58
58
|
|
|
59
59
|
The launch command is the absolute path to the `drupal-mcp` script when it is
|
|
60
60
|
on `PATH` (GUI clients like Claude Desktop launch servers with a sanitized
|
|
61
|
-
environment, so a bare name can fail there); otherwise
|
|
62
|
-
runs it straight from PyPI.
|
|
61
|
+
environment, so a bare name can fail there); otherwise
|
|
62
|
+
`uvx --from drupal-mcp-server drupal-mcp` runs it straight from PyPI.
|
|
63
63
|
|
|
64
64
|
Existing configs are merged, never clobbered: other servers in the same file
|
|
65
65
|
survive, a server of the same name is replaced (so re-running is idempotent),
|
|
@@ -197,7 +197,7 @@ against the client's current CLI or docs:
|
|
|
197
197
|
Point any client at PyPI directly:
|
|
198
198
|
|
|
199
199
|
```bash
|
|
200
|
-
drupal-mcp install --command 'uvx drupal-mcp-server'
|
|
200
|
+
drupal-mcp install --command 'uvx --from drupal-mcp-server drupal-mcp'
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
## Verify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "drupal-mcp-server"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.1"
|
|
4
4
|
description = "MCP server for Drupal operations - JSON:API, GraphQL, Drush, AI-powered migration"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "MIT"}
|
|
@@ -50,6 +50,9 @@ all = [
|
|
|
50
50
|
|
|
51
51
|
[project.scripts]
|
|
52
52
|
drupal-mcp = "drupal_mcp_server.cli:main"
|
|
53
|
+
# Alias so `uvx drupal-mcp-server` works: uvx runs the executable named
|
|
54
|
+
# after the package, and current uv refuses to guess when it differs.
|
|
55
|
+
drupal-mcp-server = "drupal_mcp_server.cli:main"
|
|
53
56
|
|
|
54
57
|
[build-system]
|
|
55
58
|
requires = ["hatchling"]
|
|
@@ -85,18 +85,15 @@ create_target() {
|
|
|
85
85
|
rm -rf "$TARGET_DIR"
|
|
86
86
|
mkdir -p "$TARGET_DIR"
|
|
87
87
|
cd "$TARGET_DIR"
|
|
88
|
+
composer create-project drupal/recommended-project . --prefer-dist --no-interaction
|
|
88
89
|
ddev config --project-type=drupal11 --project-name="$TARGET_NAME" --php-version=8.3 --docroot=web --auto
|
|
89
90
|
ddev start
|
|
90
|
-
ddev composer
|
|
91
|
-
ddev composer require drush/drush --no-interaction
|
|
92
|
-
ddev config --docroot=web --project-name="$TARGET_NAME"
|
|
93
|
-
ddev restart
|
|
91
|
+
ddev composer require drush/drush drupal/migrate_tools drupal/migrate_plus --no-interaction
|
|
94
92
|
ddev drush site:install standard \
|
|
95
93
|
--site-name="$TARGET_NAME" \
|
|
96
94
|
--account-name=admin \
|
|
97
95
|
--account-pass=admin \
|
|
98
96
|
-y
|
|
99
|
-
ddev composer require drupal/migrate_tools drupal/migrate_plus --no-interaction
|
|
100
97
|
ddev drush en migrate migrate_drupal migrate_plus migrate_tools -y
|
|
101
98
|
ddev drush cr
|
|
102
99
|
cd "$REPO_ROOT"
|
|
@@ -152,7 +152,8 @@ def resolve_command(
|
|
|
152
152
|
An absolute path wins when the console script is on PATH, because GUI
|
|
153
153
|
clients (Claude Desktop, Cursor) launch servers with a sanitized
|
|
154
154
|
environment that does not include the shell's PATH. Without the script,
|
|
155
|
-
`uvx drupal-mcp-server` runs straight from PyPI.
|
|
155
|
+
`uvx --from drupal-mcp-server drupal-mcp` runs straight from PyPI.
|
|
156
|
+
Returns (argv, warnings).
|
|
156
157
|
"""
|
|
157
158
|
environ = os.environ if environ is None else environ
|
|
158
159
|
if override:
|
|
@@ -166,8 +167,9 @@ def resolve_command(
|
|
|
166
167
|
if script:
|
|
167
168
|
return [script], []
|
|
168
169
|
if shutil.which("uvx", path=path):
|
|
169
|
-
return ["uvx", "drupal-mcp-server"], [
|
|
170
|
-
"drupal-mcp is not on PATH; the config will run
|
|
170
|
+
return ["uvx", "--from", "drupal-mcp-server", "drupal-mcp"], [
|
|
171
|
+
"drupal-mcp is not on PATH; the config will run "
|
|
172
|
+
"`uvx --from drupal-mcp-server drupal-mcp` instead"
|
|
171
173
|
]
|
|
172
174
|
return ["drupal-mcp"], [
|
|
173
175
|
"drupal-mcp is not on PATH; the config points at the bare command and will "
|
|
@@ -685,7 +687,10 @@ def _print_list() -> None:
|
|
|
685
687
|
"--command",
|
|
686
688
|
"command_override",
|
|
687
689
|
default=None,
|
|
688
|
-
help=
|
|
690
|
+
help=(
|
|
691
|
+
"Launch command (shlex-split), e.g. "
|
|
692
|
+
"--command 'uvx --from drupal-mcp-server drupal-mcp'."
|
|
693
|
+
),
|
|
689
694
|
)
|
|
690
695
|
@click.option(
|
|
691
696
|
"--env",
|
|
@@ -114,7 +114,7 @@ class TestCommandResolution:
|
|
|
114
114
|
def test_uvx_fallback_when_script_missing(self, tmp_path):
|
|
115
115
|
stub_cli(tmp_path, "uvx")
|
|
116
116
|
argv, warnings = resolve_command(None, environ={"PATH": str(tmp_path / "bin")})
|
|
117
|
-
assert argv == ["uvx", "drupal-mcp-server"]
|
|
117
|
+
assert argv == ["uvx", "--from", "drupal-mcp-server", "drupal-mcp"]
|
|
118
118
|
assert warnings and "uvx" in warnings[0]
|
|
119
119
|
|
|
120
120
|
def test_bare_name_and_warning_when_nothing_found(self, tmp_path):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/.github/ISSUE_TEMPLATE/feature_request.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/graphql.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/clients/jsonapi.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/__init__.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/indexer.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/parsers.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/codebase/search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/__init__.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/ai_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/services/site_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/accessibility.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/code_audit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/drupal_org.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/layout_builder.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/media_enhanced.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/migration.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/moderation.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/module_dev.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/multilingual.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/paragraphs.py
RENAMED
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/performance.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/redirects.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/revisions.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/scheduler.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/search_api.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/security_audit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/theme_analysis.py
RENAMED
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/src/drupal_mcp_server/tools/theme_dev.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_handler_and_translation_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drupal_mcp_server-0.3.0 → drupal_mcp_server-0.3.1}/tests/unit/test_moderation_transitions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|