mcp-instana 0.2.1__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.
- mcp_instana-0.3.1/.github/workflows/build-multiplatform.yml +37 -0
- mcp_instana-0.3.1/.github/workflows/build-windows-container.yml +52 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/.gitignore +1 -0
- mcp_instana-0.3.1/Dockerfile +119 -0
- mcp_instana-0.2.1/README.md → mcp_instana-0.3.1/PKG-INFO +90 -38
- mcp_instana-0.2.1/PKG-INFO → mcp_instana-0.3.1/README.md +66 -61
- mcp_instana-0.3.1/build_multiplatform.sh +117 -0
- mcp_instana-0.3.1/conftest.py +4 -0
- mcp_instana-0.3.1/docs/PRIVACY.md +31 -0
- mcp_instana-0.3.1/docs/assets/.gitattributes +1 -0
- mcp_instana-0.3.1/docs/assets/instana.png +0 -0
- mcp_instana-0.3.1/mcpb/.mcpbignore +2 -0
- mcp_instana-0.3.1/mcpb/manifest.json +83 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/mcpb/pack.sh +7 -6
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/pyproject-runtime.toml +1 -1
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/pyproject.toml +5 -7
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/application/application_alert_config.py +45 -12
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/application_analyze.py +28 -6
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/application/application_catalog.py +11 -2
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/application_global_alert_config.py +60 -21
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/application_metrics.py +20 -4
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/application_resources.py +20 -4
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/application_settings.py +111 -35
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/application/application_topology.py +22 -14
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/automation/action_catalog.py +165 -188
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/automation/action_history.py +21 -6
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/core/server.py +7 -1
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/core/utils.py +42 -5
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/event/events_tools.py +30 -7
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/infrastructure/infrastructure_analyze.py +18 -4
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/infrastructure/infrastructure_catalog.py +72 -16
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/infrastructure/infrastructure_metrics.py +5 -1
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/infrastructure/infrastructure_resources.py +30 -11
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/infrastructure/infrastructure_topology.py +10 -2
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/log/log_alert_configuration.py +106 -31
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/settings/custom_dashboard_tools.py +30 -7
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/website/website_analyze.py +10 -2
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/website/website_catalog.py +14 -3
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/src/website/website_configuration.py +54 -13
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/website/website_metrics.py +10 -2
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_analyze.py +8 -8
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_global_alert_config.py +12 -8
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_metrics.py +6 -3
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_resources.py +6 -3
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_settings.py +10 -4
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_topology.py +24 -26
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/automation/test_action_catalog.py +148 -158
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/core/test_utils.py +7 -7
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_settings.py +18 -18
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_topology.py +26 -19
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/conftest.py +0 -1
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/utils/test_base_instana_client.py +1 -1
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/log/test_log_alert_configuration.py +44 -20
- mcp_instana-0.3.1/uv.lock +1332 -0
- mcp_instana-0.2.1/.bob/mcp.json +0 -3
- mcp_instana-0.2.1/.github/workflows/mcpb.yml +0 -43
- mcp_instana-0.2.1/Dockerfile +0 -60
- mcp_instana-0.2.1/mcp-instana-fixed.mcpb +0 -0
- mcp_instana-0.2.1/mcpb/.mcpbignore +0 -179
- mcp_instana-0.2.1/mcpb/README.md +0 -1206
- mcp_instana-0.2.1/mcpb/manifest.json +0 -62
- mcp_instana-0.2.1/mcpb/mcpb.mcpb +0 -0
- mcp_instana-0.2.1/mcpb/pyproject.toml +0 -140
- mcp_instana-0.2.1/mcpb/src/application/application_alert_config.py +0 -658
- mcp_instana-0.2.1/mcpb/src/application/application_catalog.py +0 -155
- mcp_instana-0.2.1/mcpb/src/application/application_topology.py +0 -111
- mcp_instana-0.2.1/mcpb/src/automation/action_history.py +0 -338
- mcp_instana-0.2.1/mcpb/src/core/server.py +0 -668
- mcp_instana-0.2.1/mcpb/src/event/events_tools.py +0 -850
- mcp_instana-0.2.1/mcpb/src/infrastructure/infrastructure_catalog.py +0 -556
- mcp_instana-0.2.1/mcpb/src/infrastructure/infrastructure_topology.py +0 -320
- mcp_instana-0.2.1/mcpb/src/settings/custom_dashboard_tools.py +0 -417
- mcp_instana-0.2.1/mcpb/src/website/website_analyze.py +0 -433
- mcp_instana-0.2.1/mcpb/src/website/website_catalog.py +0 -171
- mcp_instana-0.2.1/mcpb/src/website/website_configuration.py +0 -770
- mcp_instana-0.2.1/src/__init__.py +0 -0
- mcp_instana-0.2.1/src/application/__init__.py +0 -1
- mcp_instana-0.2.1/src/application/application_analyze.py +0 -628
- mcp_instana-0.2.1/src/application/application_global_alert_config.py +0 -653
- mcp_instana-0.2.1/src/application/application_metrics.py +0 -359
- mcp_instana-0.2.1/src/application/application_resources.py +0 -371
- mcp_instana-0.2.1/src/application/application_settings.py +0 -1731
- mcp_instana-0.2.1/src/automation/action_catalog.py +0 -416
- mcp_instana-0.2.1/src/core/__init__.py +0 -1
- mcp_instana-0.2.1/src/core/utils.py +0 -213
- mcp_instana-0.2.1/src/event/__init__.py +0 -1
- mcp_instana-0.2.1/src/infrastructure/__init__.py +0 -1
- mcp_instana-0.2.1/src/infrastructure/infrastructure_analyze.py +0 -635
- mcp_instana-0.2.1/src/infrastructure/infrastructure_metrics.py +0 -171
- mcp_instana-0.2.1/src/infrastructure/infrastructure_resources.py +0 -624
- mcp_instana-0.2.1/src/log/__init__.py +0 -1
- mcp_instana-0.2.1/src/log/log_alert_configuration.py +0 -331
- mcp_instana-0.2.1/src/prompts/__init__.py +0 -16
- mcp_instana-0.2.1/src/prompts/application/__init__.py +0 -1
- mcp_instana-0.2.1/src/prompts/application/application_alerts.py +0 -54
- mcp_instana-0.2.1/src/prompts/application/application_catalog.py +0 -26
- mcp_instana-0.2.1/src/prompts/application/application_metrics.py +0 -57
- mcp_instana-0.2.1/src/prompts/application/application_resources.py +0 -26
- mcp_instana-0.2.1/src/prompts/application/application_settings.py +0 -75
- mcp_instana-0.2.1/src/prompts/application/application_topology.py +0 -30
- mcp_instana-0.2.1/src/prompts/events/__init__.py +0 -1
- mcp_instana-0.2.1/src/prompts/events/events_tools.py +0 -161
- mcp_instana-0.2.1/src/prompts/infrastructure/infrastructure_analyze.py +0 -72
- mcp_instana-0.2.1/src/prompts/infrastructure/infrastructure_catalog.py +0 -53
- mcp_instana-0.2.1/src/prompts/infrastructure/infrastructure_metrics.py +0 -45
- mcp_instana-0.2.1/src/prompts/infrastructure/infrastructure_resources.py +0 -74
- mcp_instana-0.2.1/src/prompts/infrastructure/infrastructure_topology.py +0 -38
- mcp_instana-0.2.1/src/prompts/settings/__init__.py +0 -0
- mcp_instana-0.2.1/src/prompts/settings/custom_dashboard.py +0 -157
- mcp_instana-0.2.1/src/prompts/website/__init__.py +0 -1
- mcp_instana-0.2.1/src/prompts/website/website_analyze.py +0 -35
- mcp_instana-0.2.1/src/prompts/website/website_catalog.py +0 -40
- mcp_instana-0.2.1/src/prompts/website/website_configuration.py +0 -105
- mcp_instana-0.2.1/src/prompts/website/website_metrics.py +0 -34
- mcp_instana-0.2.1/src/settings/__init__.py +0 -1
- mcp_instana-0.2.1/src/website/__init__.py +0 -0
- mcp_instana-0.2.1/src/website/website_metrics.py +0 -241
- mcp_instana-0.2.1/uv.lock +0 -1211
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/.github/dco.yml +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/.github/workflows/ci.yml +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/CONTRIBUTING.md +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/LICENSE.md +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/architecture.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/call_tools.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/claudeResponse.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/claudeTools.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/copilot.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/copilotResponse.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/kubernetesEvents.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/mcpInstanaFlow.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/images/query_events.png +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/pyrightconfig.json +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/run_ruff_check.sh +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/application/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/core/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/event/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/infrastructure/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/log/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_alerts.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_catalog.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_metrics.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_resources.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_settings.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/application/application_topology.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/events/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/events/events_tools.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/infrastructure/infrastructure_analyze.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/infrastructure/infrastructure_catalog.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/infrastructure/infrastructure_metrics.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/infrastructure/infrastructure_resources.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/infrastructure/infrastructure_topology.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/settings/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/settings/custom_dashboard.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/website/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/website/website_analyze.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/website/website_catalog.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/website/website_configuration.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/prompts/website/website_metrics.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/settings/__init__.py +0 -0
- {mcp_instana-0.2.1/mcpb → mcp_instana-0.3.1}/src/website/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/README.md +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_alert_config.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/application/test_application_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/automation/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/core/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/core/test_server.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/README.md +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_alert_config.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_analyze.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_metrics.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/application/test_application_resources.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/event/test_events_tools.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/infrastructure/test_infrastructure_analyze.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/infrastructure/test_infrastructure_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/infrastructure/test_infrastructure_metrics.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/infrastructure/test_infrastructure_resources.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/infrastructure/test_infrastructure_topology.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/pytest.ini +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/run_e2e_tests.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/e2e/server/test_server_integration.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/event/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/event/test_events_tools.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/test_infrastructure_analyze.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/test_infrastructure_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/test_infrastructure_metrics.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/test_infrastructure_resources.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/infrastructure/test_infrastructure_topology.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/log/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_alerts.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_metrics.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_resources.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_settings.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/application/test_application_topology.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/events/test_events_tools.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/__init__.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/test_infrastructure_analyze.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/test_infrastructure_catalog.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/test_infrastructure_metrics.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/test_infrastructure_resources.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/prompts/infrastructure/test_infrastructure_topology.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/run_all_tests.py +0 -0
- {mcp_instana-0.2.1 → mcp_instana-0.3.1}/tests/run_all_tests_with_coverage.py +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Build Multi-Platform Linux Container
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
tag:
|
|
7
|
+
description: 'Image tag'
|
|
8
|
+
required: true
|
|
9
|
+
default: 'latest'
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build-linux:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout code
|
|
16
|
+
uses: actions/checkout@v3
|
|
17
|
+
|
|
18
|
+
- name: Set up QEMU
|
|
19
|
+
uses: docker/setup-qemu-action@v2
|
|
20
|
+
|
|
21
|
+
- name: Set up Docker Buildx
|
|
22
|
+
uses: docker/setup-buildx-action@v2
|
|
23
|
+
|
|
24
|
+
- name: Login to DockerHub
|
|
25
|
+
uses: docker/login-action@v2
|
|
26
|
+
with:
|
|
27
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
28
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
29
|
+
|
|
30
|
+
- name: Build and push Linux images
|
|
31
|
+
uses: docker/build-push-action@v4
|
|
32
|
+
with:
|
|
33
|
+
context: .
|
|
34
|
+
file: ./Dockerfile
|
|
35
|
+
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/ppc64le,linux/s390x
|
|
36
|
+
push: true
|
|
37
|
+
tags: jaysharma3/mcp-instana:${{ github.event.inputs.tag }}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Build Multi-Platform Container
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
tag:
|
|
7
|
+
description: 'Image tag'
|
|
8
|
+
required: true
|
|
9
|
+
default: 'latest'
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: windows-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout code
|
|
16
|
+
uses: actions/checkout@v3
|
|
17
|
+
|
|
18
|
+
- name: Set up Docker Buildx
|
|
19
|
+
uses: docker/setup-buildx-action@v2
|
|
20
|
+
|
|
21
|
+
- name: Login to DockerHub
|
|
22
|
+
uses: docker/login-action@v2
|
|
23
|
+
with:
|
|
24
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
25
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
26
|
+
|
|
27
|
+
- name: Build and push Windows image
|
|
28
|
+
uses: docker/build-push-action@v4
|
|
29
|
+
with:
|
|
30
|
+
context: .
|
|
31
|
+
file: ./Dockerfile.windows
|
|
32
|
+
platforms: windows/amd64
|
|
33
|
+
push: true
|
|
34
|
+
tags: jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-windows
|
|
35
|
+
|
|
36
|
+
- name: Create and push manifest
|
|
37
|
+
if: success()
|
|
38
|
+
shell: bash
|
|
39
|
+
run: |
|
|
40
|
+
# Pull the Linux image to check if it exists
|
|
41
|
+
if docker manifest inspect jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-linux > /dev/null 2>&1; then
|
|
42
|
+
echo "Creating manifest with both Linux and Windows images"
|
|
43
|
+
docker manifest create jaysharma3/mcp-instana:${{ github.event.inputs.tag }} \
|
|
44
|
+
jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-linux \
|
|
45
|
+
jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-windows
|
|
46
|
+
docker manifest push jaysharma3/mcp-instana:${{ github.event.inputs.tag }}
|
|
47
|
+
else
|
|
48
|
+
echo "Linux image not found. Creating manifest with Windows image only"
|
|
49
|
+
docker manifest create jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-windows-only \
|
|
50
|
+
jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-windows
|
|
51
|
+
docker manifest push jaysharma3/mcp-instana:${{ github.event.inputs.tag }}-windows-only
|
|
52
|
+
fi
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Multi-platform Linux Dockerfile
|
|
2
|
+
#
|
|
3
|
+
# This Dockerfile supports multiple Linux platforms:
|
|
4
|
+
# - Linux AMD64 (x86_64): Standard Intel/AMD processors on Linux
|
|
5
|
+
# - Linux ARM64 (aarch64): Apple Silicon, AWS Graviton, Raspberry Pi 4
|
|
6
|
+
# - Linux ARM/v7: Older ARM devices like Raspberry Pi 2/3
|
|
7
|
+
# - Linux 386: 32-bit x86 systems
|
|
8
|
+
# - Linux PPC64LE: PowerPC 64-bit Little Endian
|
|
9
|
+
# - Linux s390x: IBM Z mainframes
|
|
10
|
+
#
|
|
11
|
+
# To create a multi-architecture image that works on any platform:
|
|
12
|
+
#
|
|
13
|
+
# 1. Set up Docker BuildKit builder if you haven't already:
|
|
14
|
+
# docker buildx create --name multiarch --driver docker-container --use
|
|
15
|
+
#
|
|
16
|
+
# 2. Build and push a multi-architecture image to a registry:
|
|
17
|
+
# docker buildx build --platform linux/amd64,linux/arm64 -t username/mcp-instana:latest --push .
|
|
18
|
+
#
|
|
19
|
+
# 3. Pull and run the image on any platform:
|
|
20
|
+
# docker pull username/mcp-instana:latest
|
|
21
|
+
# docker run -p 8080:8080 username/mcp-instana:latest
|
|
22
|
+
#
|
|
23
|
+
# The image will automatically use the correct architecture version for the host system.
|
|
24
|
+
#
|
|
25
|
+
# Note: The --push flag is required for multi-architecture builds as Docker needs to
|
|
26
|
+
# create a manifest list in a registry. If you want to load the image locally for testing,
|
|
27
|
+
# you can only build for your current architecture:
|
|
28
|
+
# docker buildx build --platform linux/amd64 -t mcp-instana:latest --load .
|
|
29
|
+
#
|
|
30
|
+
# For CI/CD pipelines (e.g., GitHub Actions):
|
|
31
|
+
# ```yaml
|
|
32
|
+
# jobs:
|
|
33
|
+
# build-push:
|
|
34
|
+
# runs-on: ubuntu-latest
|
|
35
|
+
# steps:
|
|
36
|
+
# - name: Checkout code
|
|
37
|
+
# uses: actions/checkout@v3
|
|
38
|
+
#
|
|
39
|
+
# - name: Set up QEMU
|
|
40
|
+
# uses: docker/setup-qemu-action@v2
|
|
41
|
+
#
|
|
42
|
+
# - name: Set up Docker Buildx
|
|
43
|
+
# uses: docker/setup-buildx-action@v2
|
|
44
|
+
#
|
|
45
|
+
# - name: Login to DockerHub
|
|
46
|
+
# uses: docker/login-action@v2
|
|
47
|
+
# with:
|
|
48
|
+
# username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
49
|
+
# password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
50
|
+
#
|
|
51
|
+
# - name: Build and push
|
|
52
|
+
# uses: docker/build-push-action@v4
|
|
53
|
+
# with:
|
|
54
|
+
# context: .
|
|
55
|
+
# platforms: linux/amd64,linux/arm64
|
|
56
|
+
# push: true
|
|
57
|
+
# tags: username/mcp-instana:latest
|
|
58
|
+
# ```
|
|
59
|
+
#
|
|
60
|
+
# Stage 1: Build stage with minimal runtime dependencies
|
|
61
|
+
FROM --platform=${BUILDPLATFORM:-linux/arm64} docker.io/library/python:3.11-slim AS builder
|
|
62
|
+
|
|
63
|
+
# Install system dependencies needed for building
|
|
64
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
65
|
+
gcc \
|
|
66
|
+
g++ \
|
|
67
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
68
|
+
|
|
69
|
+
# Set working directory
|
|
70
|
+
WORKDIR /app
|
|
71
|
+
|
|
72
|
+
# Copy only the runtime dependency file and source code needed for the build
|
|
73
|
+
COPY pyproject-runtime.toml pyproject.toml
|
|
74
|
+
COPY src ./src
|
|
75
|
+
COPY README.md ./
|
|
76
|
+
|
|
77
|
+
# Install uv for dependency management
|
|
78
|
+
RUN pip install --no-cache-dir uv
|
|
79
|
+
|
|
80
|
+
# Install only runtime dependencies using the minimal pyproject-runtime.toml
|
|
81
|
+
RUN uv pip install --no-cache-dir --system .
|
|
82
|
+
|
|
83
|
+
# Stage 2: Runtime stage
|
|
84
|
+
FROM python:3.11-slim AS runtime
|
|
85
|
+
|
|
86
|
+
# Set working directory
|
|
87
|
+
WORKDIR /app
|
|
88
|
+
|
|
89
|
+
# Create a non-root user for security
|
|
90
|
+
RUN groupadd -r mcpuser && useradd -r -g mcpuser mcpuser
|
|
91
|
+
|
|
92
|
+
# Copy only the Python packages from builder (no source code needed)
|
|
93
|
+
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
|
94
|
+
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
95
|
+
|
|
96
|
+
# Copy only the source code needed for runtime
|
|
97
|
+
COPY src ./src
|
|
98
|
+
|
|
99
|
+
# Set ownership to non-root user
|
|
100
|
+
RUN chown -R mcpuser:mcpuser /app
|
|
101
|
+
|
|
102
|
+
# Switch to non-root user
|
|
103
|
+
USER mcpuser
|
|
104
|
+
|
|
105
|
+
# Expose the default port (configurable via PORT env var)
|
|
106
|
+
EXPOSE 8080
|
|
107
|
+
|
|
108
|
+
# Set environment variables (no hardcoded secrets)
|
|
109
|
+
ENV PYTHONPATH=/app
|
|
110
|
+
ENV PYTHONUNBUFFERED=1
|
|
111
|
+
ENV PORT=8080
|
|
112
|
+
|
|
113
|
+
# Health check using container's internal network
|
|
114
|
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
|
115
|
+
CMD python -c "import requests; requests.get('http://127.0.0.1:8080/health', timeout=5)" || exit 1
|
|
116
|
+
|
|
117
|
+
# Run the server
|
|
118
|
+
ENTRYPOINT ["python", "-m", "src.core.server"]
|
|
119
|
+
CMD ["--transport", "streamable-http"]
|
|
@@ -1,5 +1,30 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcp-instana
|
|
3
|
+
Version: 0.3.1
|
|
4
|
+
Summary: MCP server for Instana
|
|
5
|
+
Author-email: Elina Priyadarshinee <Elina.priyadarshinee1@ibm.com>, Guangya Liu <gyliu@ibm.com>, Isabell Sippli <ischwert@de.ibm.com>, Jay Sharma <Jay.Sharma3@ibm.com>, Madhu Tadiparthi <madhu.tadiparthi@ibm.com>, Riya Kumari <Riya.Kumari3@ibm.com>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
License-File: LICENSE.md
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Requires-Dist: fastmcp==2.10.3
|
|
10
|
+
Requires-Dist: instana-client==1.0.1
|
|
11
|
+
Requires-Dist: mcp
|
|
12
|
+
Requires-Dist: pydantic==2.11.7
|
|
13
|
+
Requires-Dist: python-dotenv==1.1.0
|
|
14
|
+
Requires-Dist: requests==2.32.4
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: coverage>=7.10.1; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest-asyncio>=1.1.0; extra == 'dev'
|
|
18
|
+
Requires-Dist: pytest-cov>=6.2.1; extra == 'dev'
|
|
19
|
+
Requires-Dist: pytest-mock>=3.14.1; extra == 'dev'
|
|
20
|
+
Requires-Dist: pytest>=8.4.1; extra == 'dev'
|
|
21
|
+
Requires-Dist: ruff==0.5.0; extra == 'dev'
|
|
22
|
+
Requires-Dist: uv==0.8.6; extra == 'dev'
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
1
25
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
2
26
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|
27
|
+
<!-- mcp-name: io.github.instana/mcp-instana -->
|
|
3
28
|
**Table of Contents**
|
|
4
29
|
|
|
5
30
|
- [MCP Server for IBM Instana](#mcp-server-for-ibm-instana)
|
|
@@ -54,6 +79,10 @@
|
|
|
54
79
|
- [**Basic Usage**](#basic-usage)
|
|
55
80
|
- [**Environment Variables**](#environment-variables)
|
|
56
81
|
- [**Docker Compose Example**](#docker-compose-example)
|
|
82
|
+
- [Multi-Architecture Support](#multi-architecture-support)
|
|
83
|
+
- [**Supported Architectures**](#supported-architectures)
|
|
84
|
+
- [**Benefits of Multi-Architecture Images**](#benefits-of-multi-architecture-images)
|
|
85
|
+
- [**How It Works**](#how-it-works)
|
|
57
86
|
- [Docker Security Features](#docker-security-features)
|
|
58
87
|
- [**Security Best Practices Implemented**](#security-best-practices-implemented)
|
|
59
88
|
- [**Image Size Optimization**](#image-size-optimization)
|
|
@@ -1000,16 +1029,40 @@ The project uses a **two-file dependency management strategy**:
|
|
|
1000
1029
|
#### **Prerequisites**
|
|
1001
1030
|
- Docker installed and running
|
|
1002
1031
|
- Access to the project source code
|
|
1032
|
+
- Docker BuildKit for multi-architecture builds (enabled by default in recent Docker versions)
|
|
1003
1033
|
|
|
1004
1034
|
#### **Build Command**
|
|
1035
|
+
|
|
1036
|
+
**Single Architecture Build (Default):**
|
|
1005
1037
|
```bash
|
|
1006
|
-
# Build
|
|
1007
|
-
docker build -t mcp-instana .
|
|
1038
|
+
# Build for your local architecture (automatic detection)
|
|
1039
|
+
docker build -t mcp-instana:latest .
|
|
1008
1040
|
|
|
1009
1041
|
# Build with a specific tag
|
|
1010
1042
|
docker build -t mcp-instana:v1.0.0 .
|
|
1011
1043
|
```
|
|
1012
1044
|
|
|
1045
|
+
**Multi-Architecture Build:**
|
|
1046
|
+
```bash
|
|
1047
|
+
# Set up Docker BuildKit builder if you haven't already
|
|
1048
|
+
docker buildx create --name multiarch --driver docker-container --use
|
|
1049
|
+
|
|
1050
|
+
# Build and push a multi-architecture image to a registry
|
|
1051
|
+
docker buildx build --platform linux/amd64,linux/arm64 -t username/mcp-instana:latest --push .
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
**Using the Helper Script:**
|
|
1055
|
+
```bash
|
|
1056
|
+
# Make the script executable
|
|
1057
|
+
chmod +x build_multiarch.sh
|
|
1058
|
+
|
|
1059
|
+
# Build for local architecture
|
|
1060
|
+
./build_multiarch.sh
|
|
1061
|
+
|
|
1062
|
+
# Build and push multi-architecture image
|
|
1063
|
+
./build_multiarch.sh --registry username/ --push
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1013
1066
|
#### **What the Build Does**
|
|
1014
1067
|
1. **Multi-stage build** for optimal size and security
|
|
1015
1068
|
2. **Builder stage**: Installs only runtime dependencies from `pyproject-runtime.toml`
|
|
@@ -1021,27 +1074,14 @@ docker build -t mcp-instana:v1.0.0 .
|
|
|
1021
1074
|
|
|
1022
1075
|
#### **Basic Usage**
|
|
1023
1076
|
```bash
|
|
1024
|
-
# Run
|
|
1025
|
-
docker run -p 8080:8080
|
|
1026
|
-
-e INSTANA_API_TOKEN=your_instana_token \
|
|
1027
|
-
-e INSTANA_BASE_URL=https://your-instana-instance.instana.io \
|
|
1028
|
-
mcp-instana
|
|
1077
|
+
# Run the container (no credentials needed in the container)
|
|
1078
|
+
docker run -p 8080:8080 mcp-instana
|
|
1029
1079
|
|
|
1030
1080
|
# Run with custom port
|
|
1031
|
-
docker run -p 8081:8080
|
|
1032
|
-
-e INSTANA_API_TOKEN=your_instana_token \
|
|
1033
|
-
-e INSTANA_BASE_URL=https://your-instana-instance.instana.io \
|
|
1034
|
-
mcp-instana
|
|
1081
|
+
docker run -p 8081:8080 mcp-instana
|
|
1035
1082
|
```
|
|
1036
1083
|
|
|
1037
|
-
#### **Environment Variables**
|
|
1038
|
-
The container requires the following environment variables:
|
|
1039
1084
|
|
|
1040
|
-
| Variable | Description | Example |
|
|
1041
|
-
|----------|-------------|---------|
|
|
1042
|
-
| `INSTANA_API_TOKEN` | Your Instana API token | `your_instana_token` |
|
|
1043
|
-
| `INSTANA_BASE_URL` | Your Instana instance URL | `https://your-instana-instance.instana.io` |
|
|
1044
|
-
| `PORT` | Server port (optional, defaults to 8080) | `8080` |
|
|
1045
1085
|
|
|
1046
1086
|
#### **Docker Compose Example**
|
|
1047
1087
|
```yaml
|
|
@@ -1051,9 +1091,6 @@ services:
|
|
|
1051
1091
|
build: .
|
|
1052
1092
|
ports:
|
|
1053
1093
|
- "8080:8080"
|
|
1054
|
-
environment:
|
|
1055
|
-
- INSTANA_API_TOKEN=${INSTANA_API_TOKEN}
|
|
1056
|
-
- INSTANA_BASE_URL=${INSTANA_BASE_URL}
|
|
1057
1094
|
restart: unless-stopped
|
|
1058
1095
|
healthcheck:
|
|
1059
1096
|
test: ["CMD", "python", "-c", "import requests; requests.get('http://127.0.0.1:8080/health', timeout=5)"]
|
|
@@ -1063,15 +1100,35 @@ services:
|
|
|
1063
1100
|
start_period: 40s
|
|
1064
1101
|
```
|
|
1065
1102
|
|
|
1103
|
+
### Multi-Architecture Support
|
|
1104
|
+
|
|
1105
|
+
The Docker image supports multiple processor architectures, making it portable across different environments:
|
|
1106
|
+
|
|
1107
|
+
#### **Supported Architectures**
|
|
1108
|
+
- ✅ **amd64/x86_64**: Standard Intel/AMD processors (Windows, Linux, most cloud VMs)
|
|
1109
|
+
- ✅ **arm64/aarch64**: Apple Silicon (M1/M2/M3), AWS Graviton, Raspberry Pi 4, etc.
|
|
1110
|
+
|
|
1111
|
+
#### **Benefits of Multi-Architecture Images**
|
|
1112
|
+
- **Cross-Platform Compatibility**: Run the same image on any supported architecture
|
|
1113
|
+
- **Seamless Deployment**: No need to build different images for different environments
|
|
1114
|
+
- **CI/CD Simplification**: Build once, deploy anywhere
|
|
1115
|
+
- **Cloud Flexibility**: Switch between cloud providers and instance types without rebuilding images
|
|
1116
|
+
|
|
1117
|
+
#### **How It Works**
|
|
1118
|
+
1. The multi-architecture image is a "manifest list" containing images for each architecture
|
|
1119
|
+
2. When you pull the image, Docker automatically selects the correct architecture for your system
|
|
1120
|
+
3. The image runs natively on your architecture without emulation, ensuring optimal performance
|
|
1121
|
+
|
|
1066
1122
|
### Docker Security Features
|
|
1067
1123
|
|
|
1068
1124
|
#### **Security Best Practices Implemented**
|
|
1069
1125
|
- ✅ **Non-root user**: Container runs as `mcpuser` (not root)
|
|
1070
|
-
- ✅ **No
|
|
1126
|
+
- ✅ **No secrets in container**: Credentials are passed via HTTP headers from clients, not stored in the container
|
|
1071
1127
|
- ✅ **Minimal dependencies**: Only 20 essential runtime dependencies
|
|
1072
1128
|
- ✅ **Multi-stage build**: Build tools don't make it to final image
|
|
1073
1129
|
- ✅ **Health checks**: Built-in container health monitoring
|
|
1074
1130
|
- ✅ **Optimized base image**: Uses `python:3.11-slim`
|
|
1131
|
+
- ✅ **Multi-architecture support**: Run natively on any supported platform
|
|
1075
1132
|
|
|
1076
1133
|
#### **Image Size Optimization**
|
|
1077
1134
|
- **Original approach**: 95+ dependencies → ~1-2GB+ image
|
|
@@ -1111,11 +1168,12 @@ docker exec -it <container_id> /bin/bash
|
|
|
1111
1168
|
### Production Deployment
|
|
1112
1169
|
|
|
1113
1170
|
#### **Recommended Production Setup**
|
|
1114
|
-
1. **
|
|
1115
|
-
2. **
|
|
1116
|
-
3. **
|
|
1117
|
-
4. **
|
|
1118
|
-
5. **
|
|
1171
|
+
1. **Run container without credentials** - The container runs in Streamable HTTP mode, so no Instana credentials are needed in the container
|
|
1172
|
+
2. **Configure clients with credentials** - Pass Instana credentials via HTTP headers from MCP clients (Claude Desktop, GitHub Copilot, etc.)
|
|
1173
|
+
3. **Set up proper logging** and monitoring
|
|
1174
|
+
4. **Configure health checks** for container orchestration
|
|
1175
|
+
5. **Use container orchestration** (Kubernetes, Docker Swarm, etc.)
|
|
1176
|
+
6. **Implement proper backup** and disaster recovery
|
|
1119
1177
|
|
|
1120
1178
|
#### **Kubernetes Example**
|
|
1121
1179
|
```yaml
|
|
@@ -1138,14 +1196,6 @@ spec:
|
|
|
1138
1196
|
image: mcp-instana:latest
|
|
1139
1197
|
ports:
|
|
1140
1198
|
- containerPort: 8080
|
|
1141
|
-
env:
|
|
1142
|
-
- name: INSTANA_API_TOKEN
|
|
1143
|
-
valueFrom:
|
|
1144
|
-
secretKeyRef:
|
|
1145
|
-
name: instana-secrets
|
|
1146
|
-
key: api-token
|
|
1147
|
-
- name: INSTANA_BASE_URL
|
|
1148
|
-
value: "https://your-instana-instance.instana.io"
|
|
1149
1199
|
livenessProbe:
|
|
1150
1200
|
httpGet:
|
|
1151
1201
|
path: /health
|
|
@@ -1170,9 +1220,11 @@ spec:
|
|
|
1170
1220
|
docker logs <container_id>
|
|
1171
1221
|
|
|
1172
1222
|
# Common issues:
|
|
1173
|
-
# 1.
|
|
1174
|
-
# 2.
|
|
1175
|
-
# 3.
|
|
1223
|
+
# 1. Port already in use
|
|
1224
|
+
# 2. Invalid container image
|
|
1225
|
+
# 3. Missing dependencies
|
|
1226
|
+
|
|
1227
|
+
# Credentials are passed via HTTP headers from the MCP client
|
|
1176
1228
|
```
|
|
1177
1229
|
|
|
1178
1230
|
#### **Connection Issues**
|
|
@@ -1,28 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: mcp-instana
|
|
3
|
-
Version: 0.2.1
|
|
4
|
-
Summary: MCP server for Instana
|
|
5
|
-
Author-email: Elina Priyadarshinee <Elina.priyadarshinee1@ibm.com>, Guangya Liu <gyliu@ibm.com>, Isabell Sippli <ischwert@de.ibm.com>, Jay Sharma <Jay.Sharma3@ibm.com>, Madhu Tadiparthi <madhu.tadiparthi@ibm.com>, Riya Kumari <Riya.Kumari3@ibm.com>
|
|
6
|
-
License: Apache-2.0
|
|
7
|
-
License-File: LICENSE.md
|
|
8
|
-
Requires-Python: >=3.10
|
|
9
|
-
Requires-Dist: fastmcp==2.10.3
|
|
10
|
-
Requires-Dist: instana-client==1.0.0
|
|
11
|
-
Requires-Dist: pydantic==2.11.7
|
|
12
|
-
Requires-Dist: python-dotenv==1.1.0
|
|
13
|
-
Requires-Dist: requests==2.32.4
|
|
14
|
-
Provides-Extra: dev
|
|
15
|
-
Requires-Dist: coverage>=7.10.1; extra == 'dev'
|
|
16
|
-
Requires-Dist: pytest-asyncio>=1.1.0; extra == 'dev'
|
|
17
|
-
Requires-Dist: pytest-cov>=6.2.1; extra == 'dev'
|
|
18
|
-
Requires-Dist: pytest-mock>=3.14.1; extra == 'dev'
|
|
19
|
-
Requires-Dist: pytest>=8.4.1; extra == 'dev'
|
|
20
|
-
Requires-Dist: ruff==0.5.0; extra == 'dev'
|
|
21
|
-
Requires-Dist: uv==0.8.6; extra == 'dev'
|
|
22
|
-
Description-Content-Type: text/markdown
|
|
23
|
-
|
|
24
1
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
25
2
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|
3
|
+
<!-- mcp-name: io.github.instana/mcp-instana -->
|
|
26
4
|
**Table of Contents**
|
|
27
5
|
|
|
28
6
|
- [MCP Server for IBM Instana](#mcp-server-for-ibm-instana)
|
|
@@ -77,6 +55,10 @@ Description-Content-Type: text/markdown
|
|
|
77
55
|
- [**Basic Usage**](#basic-usage)
|
|
78
56
|
- [**Environment Variables**](#environment-variables)
|
|
79
57
|
- [**Docker Compose Example**](#docker-compose-example)
|
|
58
|
+
- [Multi-Architecture Support](#multi-architecture-support)
|
|
59
|
+
- [**Supported Architectures**](#supported-architectures)
|
|
60
|
+
- [**Benefits of Multi-Architecture Images**](#benefits-of-multi-architecture-images)
|
|
61
|
+
- [**How It Works**](#how-it-works)
|
|
80
62
|
- [Docker Security Features](#docker-security-features)
|
|
81
63
|
- [**Security Best Practices Implemented**](#security-best-practices-implemented)
|
|
82
64
|
- [**Image Size Optimization**](#image-size-optimization)
|
|
@@ -1023,16 +1005,40 @@ The project uses a **two-file dependency management strategy**:
|
|
|
1023
1005
|
#### **Prerequisites**
|
|
1024
1006
|
- Docker installed and running
|
|
1025
1007
|
- Access to the project source code
|
|
1008
|
+
- Docker BuildKit for multi-architecture builds (enabled by default in recent Docker versions)
|
|
1026
1009
|
|
|
1027
1010
|
#### **Build Command**
|
|
1011
|
+
|
|
1012
|
+
**Single Architecture Build (Default):**
|
|
1028
1013
|
```bash
|
|
1029
|
-
# Build
|
|
1030
|
-
docker build -t mcp-instana .
|
|
1014
|
+
# Build for your local architecture (automatic detection)
|
|
1015
|
+
docker build -t mcp-instana:latest .
|
|
1031
1016
|
|
|
1032
1017
|
# Build with a specific tag
|
|
1033
1018
|
docker build -t mcp-instana:v1.0.0 .
|
|
1034
1019
|
```
|
|
1035
1020
|
|
|
1021
|
+
**Multi-Architecture Build:**
|
|
1022
|
+
```bash
|
|
1023
|
+
# Set up Docker BuildKit builder if you haven't already
|
|
1024
|
+
docker buildx create --name multiarch --driver docker-container --use
|
|
1025
|
+
|
|
1026
|
+
# Build and push a multi-architecture image to a registry
|
|
1027
|
+
docker buildx build --platform linux/amd64,linux/arm64 -t username/mcp-instana:latest --push .
|
|
1028
|
+
```
|
|
1029
|
+
|
|
1030
|
+
**Using the Helper Script:**
|
|
1031
|
+
```bash
|
|
1032
|
+
# Make the script executable
|
|
1033
|
+
chmod +x build_multiarch.sh
|
|
1034
|
+
|
|
1035
|
+
# Build for local architecture
|
|
1036
|
+
./build_multiarch.sh
|
|
1037
|
+
|
|
1038
|
+
# Build and push multi-architecture image
|
|
1039
|
+
./build_multiarch.sh --registry username/ --push
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1036
1042
|
#### **What the Build Does**
|
|
1037
1043
|
1. **Multi-stage build** for optimal size and security
|
|
1038
1044
|
2. **Builder stage**: Installs only runtime dependencies from `pyproject-runtime.toml`
|
|
@@ -1044,27 +1050,14 @@ docker build -t mcp-instana:v1.0.0 .
|
|
|
1044
1050
|
|
|
1045
1051
|
#### **Basic Usage**
|
|
1046
1052
|
```bash
|
|
1047
|
-
# Run
|
|
1048
|
-
docker run -p 8080:8080
|
|
1049
|
-
-e INSTANA_API_TOKEN=your_instana_token \
|
|
1050
|
-
-e INSTANA_BASE_URL=https://your-instana-instance.instana.io \
|
|
1051
|
-
mcp-instana
|
|
1053
|
+
# Run the container (no credentials needed in the container)
|
|
1054
|
+
docker run -p 8080:8080 mcp-instana
|
|
1052
1055
|
|
|
1053
1056
|
# Run with custom port
|
|
1054
|
-
docker run -p 8081:8080
|
|
1055
|
-
-e INSTANA_API_TOKEN=your_instana_token \
|
|
1056
|
-
-e INSTANA_BASE_URL=https://your-instana-instance.instana.io \
|
|
1057
|
-
mcp-instana
|
|
1057
|
+
docker run -p 8081:8080 mcp-instana
|
|
1058
1058
|
```
|
|
1059
1059
|
|
|
1060
|
-
#### **Environment Variables**
|
|
1061
|
-
The container requires the following environment variables:
|
|
1062
1060
|
|
|
1063
|
-
| Variable | Description | Example |
|
|
1064
|
-
|----------|-------------|---------|
|
|
1065
|
-
| `INSTANA_API_TOKEN` | Your Instana API token | `your_instana_token` |
|
|
1066
|
-
| `INSTANA_BASE_URL` | Your Instana instance URL | `https://your-instana-instance.instana.io` |
|
|
1067
|
-
| `PORT` | Server port (optional, defaults to 8080) | `8080` |
|
|
1068
1061
|
|
|
1069
1062
|
#### **Docker Compose Example**
|
|
1070
1063
|
```yaml
|
|
@@ -1074,9 +1067,6 @@ services:
|
|
|
1074
1067
|
build: .
|
|
1075
1068
|
ports:
|
|
1076
1069
|
- "8080:8080"
|
|
1077
|
-
environment:
|
|
1078
|
-
- INSTANA_API_TOKEN=${INSTANA_API_TOKEN}
|
|
1079
|
-
- INSTANA_BASE_URL=${INSTANA_BASE_URL}
|
|
1080
1070
|
restart: unless-stopped
|
|
1081
1071
|
healthcheck:
|
|
1082
1072
|
test: ["CMD", "python", "-c", "import requests; requests.get('http://127.0.0.1:8080/health', timeout=5)"]
|
|
@@ -1086,15 +1076,35 @@ services:
|
|
|
1086
1076
|
start_period: 40s
|
|
1087
1077
|
```
|
|
1088
1078
|
|
|
1079
|
+
### Multi-Architecture Support
|
|
1080
|
+
|
|
1081
|
+
The Docker image supports multiple processor architectures, making it portable across different environments:
|
|
1082
|
+
|
|
1083
|
+
#### **Supported Architectures**
|
|
1084
|
+
- ✅ **amd64/x86_64**: Standard Intel/AMD processors (Windows, Linux, most cloud VMs)
|
|
1085
|
+
- ✅ **arm64/aarch64**: Apple Silicon (M1/M2/M3), AWS Graviton, Raspberry Pi 4, etc.
|
|
1086
|
+
|
|
1087
|
+
#### **Benefits of Multi-Architecture Images**
|
|
1088
|
+
- **Cross-Platform Compatibility**: Run the same image on any supported architecture
|
|
1089
|
+
- **Seamless Deployment**: No need to build different images for different environments
|
|
1090
|
+
- **CI/CD Simplification**: Build once, deploy anywhere
|
|
1091
|
+
- **Cloud Flexibility**: Switch between cloud providers and instance types without rebuilding images
|
|
1092
|
+
|
|
1093
|
+
#### **How It Works**
|
|
1094
|
+
1. The multi-architecture image is a "manifest list" containing images for each architecture
|
|
1095
|
+
2. When you pull the image, Docker automatically selects the correct architecture for your system
|
|
1096
|
+
3. The image runs natively on your architecture without emulation, ensuring optimal performance
|
|
1097
|
+
|
|
1089
1098
|
### Docker Security Features
|
|
1090
1099
|
|
|
1091
1100
|
#### **Security Best Practices Implemented**
|
|
1092
1101
|
- ✅ **Non-root user**: Container runs as `mcpuser` (not root)
|
|
1093
|
-
- ✅ **No
|
|
1102
|
+
- ✅ **No secrets in container**: Credentials are passed via HTTP headers from clients, not stored in the container
|
|
1094
1103
|
- ✅ **Minimal dependencies**: Only 20 essential runtime dependencies
|
|
1095
1104
|
- ✅ **Multi-stage build**: Build tools don't make it to final image
|
|
1096
1105
|
- ✅ **Health checks**: Built-in container health monitoring
|
|
1097
1106
|
- ✅ **Optimized base image**: Uses `python:3.11-slim`
|
|
1107
|
+
- ✅ **Multi-architecture support**: Run natively on any supported platform
|
|
1098
1108
|
|
|
1099
1109
|
#### **Image Size Optimization**
|
|
1100
1110
|
- **Original approach**: 95+ dependencies → ~1-2GB+ image
|
|
@@ -1134,11 +1144,12 @@ docker exec -it <container_id> /bin/bash
|
|
|
1134
1144
|
### Production Deployment
|
|
1135
1145
|
|
|
1136
1146
|
#### **Recommended Production Setup**
|
|
1137
|
-
1. **
|
|
1138
|
-
2. **
|
|
1139
|
-
3. **
|
|
1140
|
-
4. **
|
|
1141
|
-
5. **
|
|
1147
|
+
1. **Run container without credentials** - The container runs in Streamable HTTP mode, so no Instana credentials are needed in the container
|
|
1148
|
+
2. **Configure clients with credentials** - Pass Instana credentials via HTTP headers from MCP clients (Claude Desktop, GitHub Copilot, etc.)
|
|
1149
|
+
3. **Set up proper logging** and monitoring
|
|
1150
|
+
4. **Configure health checks** for container orchestration
|
|
1151
|
+
5. **Use container orchestration** (Kubernetes, Docker Swarm, etc.)
|
|
1152
|
+
6. **Implement proper backup** and disaster recovery
|
|
1142
1153
|
|
|
1143
1154
|
#### **Kubernetes Example**
|
|
1144
1155
|
```yaml
|
|
@@ -1161,14 +1172,6 @@ spec:
|
|
|
1161
1172
|
image: mcp-instana:latest
|
|
1162
1173
|
ports:
|
|
1163
1174
|
- containerPort: 8080
|
|
1164
|
-
env:
|
|
1165
|
-
- name: INSTANA_API_TOKEN
|
|
1166
|
-
valueFrom:
|
|
1167
|
-
secretKeyRef:
|
|
1168
|
-
name: instana-secrets
|
|
1169
|
-
key: api-token
|
|
1170
|
-
- name: INSTANA_BASE_URL
|
|
1171
|
-
value: "https://your-instana-instance.instana.io"
|
|
1172
1175
|
livenessProbe:
|
|
1173
1176
|
httpGet:
|
|
1174
1177
|
path: /health
|
|
@@ -1193,9 +1196,11 @@ spec:
|
|
|
1193
1196
|
docker logs <container_id>
|
|
1194
1197
|
|
|
1195
1198
|
# Common issues:
|
|
1196
|
-
# 1.
|
|
1197
|
-
# 2.
|
|
1198
|
-
# 3.
|
|
1199
|
+
# 1. Port already in use
|
|
1200
|
+
# 2. Invalid container image
|
|
1201
|
+
# 3. Missing dependencies
|
|
1202
|
+
|
|
1203
|
+
# Credentials are passed via HTTP headers from the MCP client
|
|
1199
1204
|
```
|
|
1200
1205
|
|
|
1201
1206
|
#### **Connection Issues**
|