mcp-instana 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/.github/workflows/ci.yml +2 -2
  2. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/.gitignore +1 -0
  3. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/PKG-INFO +3 -2
  4. mcp_instana-0.3.0/conftest.py +4 -0
  5. mcp_instana-0.3.0/docs/PRIVACY.md +31 -0
  6. mcp_instana-0.3.0/docs/assets/.gitattributes +1 -0
  7. mcp_instana-0.3.0/docs/assets/instana.svg +15 -0
  8. mcp_instana-0.3.0/mcpb/.mcpbignore +2 -0
  9. mcp_instana-0.3.0/mcpb/assets/instana.svg +15 -0
  10. mcp_instana-0.3.0/mcpb/manifest.json +83 -0
  11. mcp_instana-0.3.0/mcpb/pack.sh +23 -0
  12. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/pyproject-runtime.toml +1 -1
  13. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/pyproject.toml +6 -8
  14. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/pyrightconfig.json +1 -1
  15. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_alert_config.py +45 -12
  16. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_analyze.py +28 -6
  17. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_catalog.py +11 -2
  18. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_global_alert_config.py +60 -21
  19. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_metrics.py +20 -4
  20. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_resources.py +20 -4
  21. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_settings.py +111 -35
  22. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/application_topology.py +22 -14
  23. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/automation/action_catalog.py +165 -188
  24. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/automation/action_history.py +21 -6
  25. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/core/server.py +7 -1
  26. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/core/utils.py +42 -5
  27. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/event/events_tools.py +30 -7
  28. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/infrastructure_analyze.py +18 -4
  29. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/infrastructure_catalog.py +72 -16
  30. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/infrastructure_metrics.py +5 -1
  31. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/infrastructure_resources.py +30 -11
  32. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/infrastructure_topology.py +10 -2
  33. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/log/log_alert_configuration.py +106 -31
  34. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/settings/custom_dashboard_tools.py +30 -7
  35. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/website/website_analyze.py +10 -2
  36. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/website/website_catalog.py +14 -3
  37. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/website/website_configuration.py +54 -13
  38. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/website/website_metrics.py +10 -2
  39. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_analyze.py +8 -8
  40. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_global_alert_config.py +12 -8
  41. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_metrics.py +6 -3
  42. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_resources.py +6 -3
  43. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_settings.py +10 -4
  44. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_topology.py +24 -26
  45. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/automation/test_action_catalog.py +148 -158
  46. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/core/test_utils.py +7 -7
  47. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_settings.py +18 -18
  48. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_topology.py +26 -19
  49. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/conftest.py +0 -1
  50. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/utils/test_base_instana_client.py +1 -1
  51. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/log/test_log_alert_configuration.py +44 -20
  52. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/uv.lock +108 -7
  53. mcp_instana-0.2.0/.bob/mcp.json +0 -3
  54. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/.github/dco.yml +0 -0
  55. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/CONTRIBUTING.md +0 -0
  56. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/Dockerfile +0 -0
  57. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/LICENSE.md +0 -0
  58. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/README.md +0 -0
  59. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/architecture.png +0 -0
  60. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/call_tools.png +0 -0
  61. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/claudeResponse.png +0 -0
  62. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/claudeTools.png +0 -0
  63. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/copilot.png +0 -0
  64. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/copilotResponse.png +0 -0
  65. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/kubernetesEvents.png +0 -0
  66. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/mcpInstanaFlow.png +0 -0
  67. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/images/query_events.png +0 -0
  68. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/run_ruff_check.sh +0 -0
  69. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/__init__.py +0 -0
  70. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/application/__init__.py +0 -0
  71. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/core/__init__.py +0 -0
  72. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/event/__init__.py +0 -0
  73. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/infrastructure/__init__.py +0 -0
  74. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/log/__init__.py +0 -0
  75. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/__init__.py +0 -0
  76. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/__init__.py +0 -0
  77. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_alerts.py +0 -0
  78. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_catalog.py +0 -0
  79. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_metrics.py +0 -0
  80. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_resources.py +0 -0
  81. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_settings.py +0 -0
  82. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/application/application_topology.py +0 -0
  83. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/events/__init__.py +0 -0
  84. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/events/events_tools.py +0 -0
  85. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/infrastructure/infrastructure_analyze.py +0 -0
  86. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/infrastructure/infrastructure_catalog.py +0 -0
  87. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/infrastructure/infrastructure_metrics.py +0 -0
  88. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/infrastructure/infrastructure_resources.py +0 -0
  89. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/infrastructure/infrastructure_topology.py +0 -0
  90. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/settings/__init__.py +0 -0
  91. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/settings/custom_dashboard.py +0 -0
  92. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/website/__init__.py +0 -0
  93. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/website/website_analyze.py +0 -0
  94. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/website/website_catalog.py +0 -0
  95. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/website/website_configuration.py +0 -0
  96. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/prompts/website/website_metrics.py +0 -0
  97. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/settings/__init__.py +0 -0
  98. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/src/website/__init__.py +0 -0
  99. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/README.md +0 -0
  100. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/__init__.py +0 -0
  101. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/__init__.py +0 -0
  102. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_alert_config.py +0 -0
  103. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/application/test_application_catalog.py +0 -0
  104. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/automation/__init__.py +0 -0
  105. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/core/__init__.py +0 -0
  106. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/core/test_server.py +0 -0
  107. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/README.md +0 -0
  108. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/__init__.py +0 -0
  109. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_alert_config.py +0 -0
  110. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_analyze.py +0 -0
  111. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_catalog.py +0 -0
  112. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_metrics.py +0 -0
  113. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/application/test_application_resources.py +0 -0
  114. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/event/test_events_tools.py +0 -0
  115. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/infrastructure/test_infrastructure_analyze.py +0 -0
  116. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/infrastructure/test_infrastructure_catalog.py +0 -0
  117. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/infrastructure/test_infrastructure_metrics.py +0 -0
  118. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/infrastructure/test_infrastructure_resources.py +0 -0
  119. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/infrastructure/test_infrastructure_topology.py +0 -0
  120. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/pytest.ini +0 -0
  121. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/run_e2e_tests.py +0 -0
  122. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/e2e/server/test_server_integration.py +0 -0
  123. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/event/__init__.py +0 -0
  124. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/event/test_events_tools.py +0 -0
  125. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/__init__.py +0 -0
  126. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/test_infrastructure_analyze.py +0 -0
  127. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/test_infrastructure_catalog.py +0 -0
  128. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/test_infrastructure_metrics.py +0 -0
  129. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/test_infrastructure_resources.py +0 -0
  130. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/infrastructure/test_infrastructure_topology.py +0 -0
  131. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/log/__init__.py +0 -0
  132. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/__init__.py +0 -0
  133. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/__init__.py +0 -0
  134. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_alerts.py +0 -0
  135. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_catalog.py +0 -0
  136. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_metrics.py +0 -0
  137. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_resources.py +0 -0
  138. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_settings.py +0 -0
  139. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/application/test_application_topology.py +0 -0
  140. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/events/test_events_tools.py +0 -0
  141. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/__init__.py +0 -0
  142. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/test_infrastructure_analyze.py +0 -0
  143. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/test_infrastructure_catalog.py +0 -0
  144. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/test_infrastructure_metrics.py +0 -0
  145. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/test_infrastructure_resources.py +0 -0
  146. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/prompts/infrastructure/test_infrastructure_topology.py +0 -0
  147. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/run_all_tests.py +0 -0
  148. {mcp_instana-0.2.0 → mcp_instana-0.3.0}/tests/run_all_tests_with_coverage.py +0 -0
@@ -4,14 +4,14 @@ on:
4
4
  push:
5
5
  branches: [ main ]
6
6
  pull_request:
7
- branches: [ main, test-ci ]
7
+ branches: [ main, p310 ]
8
8
 
9
9
  jobs:
10
10
  lint-and-test:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
13
  matrix:
14
- python-version: ['3.11']
14
+ python-version: ['3.10']
15
15
 
16
16
  steps:
17
17
  - uses: actions/checkout@v4
@@ -178,3 +178,4 @@ cython_debug/
178
178
  # Ignore tooling dirs
179
179
  .Bob/
180
180
  .vscode/
181
+ mcp-instana.mcpb
@@ -1,13 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-instana
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: MCP server for Instana
5
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
6
  License: Apache-2.0
7
7
  License-File: LICENSE.md
8
- Requires-Python: >=3.11
8
+ Requires-Python: >=3.10
9
9
  Requires-Dist: fastmcp==2.10.3
10
10
  Requires-Dist: instana-client==1.0.0
11
+ Requires-Dist: mcp
11
12
  Requires-Dist: pydantic==2.11.7
12
13
  Requires-Dist: python-dotenv==1.1.0
13
14
  Requires-Dist: requests==2.32.4
@@ -0,0 +1,4 @@
1
+ """
2
+ Top-level pytest configuration
3
+ """
4
+ pytest_plugins = ["pytest_asyncio"]
@@ -0,0 +1,31 @@
1
+ # Privacy Policy
2
+
3
+ Last updated: 2025-09-26
4
+
5
+ ## Overview
6
+
7
+ This application is designed with privacy in mind. We do not collect, transmit, or store any personal information outside your device. All functionality is executed locally.
8
+
9
+ ## Data Handling
10
+
11
+ - **Data Collection**: We do not collect any personal or usage data.
12
+
13
+ - **Data Storage**: No data is stored outside of your local environment.
14
+
15
+ - **Data Transmission**: No information is sent to external servers or third parties.
16
+
17
+ ## Local Execution
18
+
19
+ All execution happens **entirely on your device**. The application operates without relying on remote services or external APIs.
20
+
21
+ ## Third Parties
22
+
23
+ We do not share any information with third parties, as no data ever leaves your system.
24
+
25
+ ## Changes to This Policy
26
+
27
+ We may update this privacy policy from time to time. Any changes will be clearly indicated in the version linked from the manifest.
28
+
29
+ ## Contact
30
+
31
+ If you have any questions about this Privacy Policy, please contact the MCP Instana Team via mcp-instana@ibm.com.
@@ -0,0 +1 @@
1
+ *.png filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1,15 @@
1
+ <svg id="Ibm-Instana--Streamline-Carbon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="16" width="16">
2
+ <desc>
3
+ Ibm Instana Streamline Icon: https://streamlinehq.com
4
+ </desc>
5
+ <defs></defs>
6
+ <path d="M4.5 6.5h1v3H4.5Z" fill="#000000" stroke-width="0.5"></path>
7
+ <path d="M10.5 6.5h1v3h-1Z" fill="#000000" stroke-width="0.5"></path>
8
+ <path d="M6.5 5.5h1v6.5h-1Z" fill="#000000" stroke-width="0.5"></path>
9
+ <path d="M8.5 4.5h1v6.5h-1Z" fill="#000000" stroke-width="0.5"></path>
10
+ <path d="M10 2.5a1 1 0 1 0 2 0 1 1 0 1 0 -2 0" fill="#000000" stroke-width="0.5"></path>
11
+ <path d="M4 13.5a1 1 0 1 0 2 0 1 1 0 1 0 -2 0" fill="#000000" stroke-width="0.5"></path>
12
+ <path d="M11.0458 14H7v-1h4.0458l2.9541 -5 -1.3496 -2.28395 0.86135 -0.5088 1.3496 2.28395c0.18505 0.3137 0.18505 0.70385 0 1.0176l-2.9546 5c-0.1787 0.30275 -0.5088 0.4912 -0.86085 0.4912Z" fill="#000000" stroke-width="0.5"></path>
13
+ <path d="m2.4884 10.79295 -1.3496 -2.2842c-0.18505 -0.3137 -0.18505 -0.70385 0 -1.0176l2.9546 -5c0.1792 -0.303 0.5088 -0.4912 0.86085 -0.4912h4.0458v1H4.95425l-2.9541 5 1.3496 2.2842 -0.86135 0.5088Z" fill="#000000" stroke-width="0.5"></path>
14
+ <path id="_Transparent_Rectangle_" d="M0 0h16v16H0Z" fill="none" stroke-width="0.5"></path>
15
+ </svg>
@@ -0,0 +1,2 @@
1
+ pack.sh
2
+ **.DS_Store
@@ -0,0 +1,15 @@
1
+ <svg id="Ibm-Instana--Streamline-Carbon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="16" width="16">
2
+ <desc>
3
+ Ibm Instana Streamline Icon: https://streamlinehq.com
4
+ </desc>
5
+ <defs></defs>
6
+ <path d="M4.5 6.5h1v3H4.5Z" fill="#000000" stroke-width="0.5"></path>
7
+ <path d="M10.5 6.5h1v3h-1Z" fill="#000000" stroke-width="0.5"></path>
8
+ <path d="M6.5 5.5h1v6.5h-1Z" fill="#000000" stroke-width="0.5"></path>
9
+ <path d="M8.5 4.5h1v6.5h-1Z" fill="#000000" stroke-width="0.5"></path>
10
+ <path d="M10 2.5a1 1 0 1 0 2 0 1 1 0 1 0 -2 0" fill="#000000" stroke-width="0.5"></path>
11
+ <path d="M4 13.5a1 1 0 1 0 2 0 1 1 0 1 0 -2 0" fill="#000000" stroke-width="0.5"></path>
12
+ <path d="M11.0458 14H7v-1h4.0458l2.9541 -5 -1.3496 -2.28395 0.86135 -0.5088 1.3496 2.28395c0.18505 0.3137 0.18505 0.70385 0 1.0176l-2.9546 5c-0.1787 0.30275 -0.5088 0.4912 -0.86085 0.4912Z" fill="#000000" stroke-width="0.5"></path>
13
+ <path d="m2.4884 10.79295 -1.3496 -2.2842c-0.18505 -0.3137 -0.18505 -0.70385 0 -1.0176l2.9546 -5c0.1792 -0.303 0.5088 -0.4912 0.86085 -0.4912h4.0458v1H4.95425l-2.9541 5 1.3496 2.2842 -0.86135 0.5088Z" fill="#000000" stroke-width="0.5"></path>
14
+ <path id="_Transparent_Rectangle_" d="M0 0h16v16H0Z" fill="none" stroke-width="0.5"></path>
15
+ </svg>
@@ -0,0 +1,83 @@
1
+ {
2
+ "manifest_version": "0.2",
3
+ "name": "mcp-instana",
4
+ "display_name": "MCP Instana Server",
5
+ "version": "0.3.0",
6
+ "description": "MCP Instana Server for Observability",
7
+ "author": {
8
+ "name": "MCP Instana Team",
9
+ "email": "mcp-instana@ibm.com"
10
+ },
11
+ "homepage": "https://www.ibm.com/docs/en/instana-observability",
12
+ "support": "https://github.com/instana/mcp-instana/issues",
13
+ "icon": "assets/instana.svg",
14
+ "server": {
15
+ "type": "python",
16
+ "entry_point": "mcp-instana",
17
+ "mcp_config": {
18
+ "command": "python3",
19
+ "args": [
20
+ "-m",
21
+ "pipx",
22
+ "run",
23
+ "--spec",
24
+ "mcp-instana==${user_config.version}",
25
+ "mcp-instana",
26
+ "--transport",
27
+ "stdio"
28
+ ],
29
+ "env": {
30
+ "PYTHONPATH": "${__dirname}/lib",
31
+ "INSTANA_BASE_URL": "${user_config.instana_base_url}",
32
+ "INSTANA_API_TOKEN": "${user_config.instana_api_token}"
33
+ }
34
+ }
35
+ },
36
+ "user_config": {
37
+ "instana_base_url": {
38
+ "type": "string",
39
+ "title": "Instana Base URL",
40
+ "description": "Instana instance URL",
41
+ "default": "https://your-instana-url",
42
+ "required": true
43
+ },
44
+ "instana_api_token": {
45
+ "type": "string",
46
+ "title": "Instana API Token",
47
+ "description": "Your Instana API token",
48
+ "default": "",
49
+ "required": true,
50
+ "sensitive": true
51
+ },
52
+ "version": {
53
+ "type": "string",
54
+ "title": "Version",
55
+ "description": "Version of the mcp-instana package which is being installed.",
56
+ "default": "0.3.0",
57
+ "required": false
58
+ }
59
+ },
60
+ "keywords": [
61
+ "instana",
62
+ "obserability"
63
+ ],
64
+ "license": "Apache 2.0",
65
+ "privacy_policies": [
66
+ "https://github.com/instana/mcp-instana/blob/main/docs/PRIVACY.md"
67
+ ],
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "https://github.com/instana/mcp-instana"
71
+ },
72
+ "compatibility": {
73
+ "claude_desktop": ">=0.13.0",
74
+ "platforms": [
75
+ "darwin",
76
+ "win32",
77
+ "linux"
78
+ ],
79
+ "runtimes": {
80
+ "python": ">=3.10"
81
+ }
82
+ }
83
+ }
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Read version from ../pyproject.toml
5
+ VERSION=$(grep -E '^[[:space:]]*version[[:space:]]*=' ../pyproject.toml \
6
+ | head -n1 \
7
+ | sed -E 's/[[:space:]]*version[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/')
8
+ echo "Using version: $VERSION"
9
+
10
+ # Update manifest.json
11
+ jq --arg ver "$VERSION" \
12
+ '.version = $ver | .user_config.version.default = $ver' \
13
+ manifest.json > manifest.tmp.json && mv manifest.tmp.json manifest.json
14
+
15
+ # Python lib
16
+ python -m pip install -U pipx tomli --target ./lib
17
+
18
+ # Assets (logo, screenshots, etc)
19
+ mkdir -p assets/
20
+ cp ../docs/assets/* assets/
21
+
22
+ # Pack
23
+ npx -y @anthropic-ai/mcpb pack . mcp-instana.mcpb
@@ -15,7 +15,7 @@ authors = [
15
15
  {name = "Riya Kumari", email = "Riya.Kumari3@ibm.com"}
16
16
  ]
17
17
  readme = "README.md"
18
- requires-python = ">=3.11"
18
+ requires-python = ">=3.10"
19
19
  license = {text = "Apache-2.0"}
20
20
 
21
21
  # Minimal runtime dependencies only
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mcp-instana"
7
- version = "0.2.0"
7
+ version = "0.3.0"
8
8
  description = "MCP server for Instana"
9
9
  authors = [
10
10
  {name = "Elina Priyadarshinee", email = "Elina.priyadarshinee1@ibm.com"},
@@ -15,25 +15,23 @@ authors = [
15
15
  {name = "Riya Kumari", email = "Riya.Kumari3@ibm.com"}
16
16
  ]
17
17
  readme = "README.md"
18
- requires-python = ">=3.11"
18
+ requires-python = ">=3.10"
19
19
  license = {text = "Apache-2.0"}
20
20
 
21
21
  # ONLY dependencies that are actually imported/used in the code
22
22
  dependencies = [
23
23
  # Core MCP framework - imported in src/prompts/__init__.py and src/core/server.py
24
24
  "fastmcp==2.10.3",
25
-
25
+ # MCP SDK for types and annotations
26
+ "mcp",
26
27
  # Instana API client - imported in src/event/events_tools.py
27
28
  "instana_client==1.0.0",
28
-
29
29
  # HTTP client - imported in src/core/utils.py
30
30
  "requests==2.32.4",
31
-
32
31
  # Environment loading - imported in src/core/server.py
33
32
  "python-dotenv==1.1.0",
34
-
35
33
  # Data validation - imported in src/infrastructure/infrastructure_metrics.py
36
- "pydantic==2.11.7",
34
+ "pydantic==2.11.7"
37
35
  ]
38
36
 
39
37
  # Development dependencies for testing, linting, and development
@@ -65,7 +63,7 @@ packages = ["src"]
65
63
 
66
64
  [tool.ruff]
67
65
  # Target Python 3.11
68
- target-version = "py311"
66
+ target-version = "py310"
69
67
 
70
68
  # Same as Black
71
69
  line-length = 88
@@ -8,7 +8,7 @@
8
8
  "**/__pycache__"
9
9
  ],
10
10
  "typeCheckingMode": "basic",
11
- "pythonVersion": "3.9",
11
+ "pythonVersion": "3.10",
12
12
 
13
13
  // These settings help with mock-related issues
14
14
  "reportUnknownMemberType": "none",
@@ -7,6 +7,11 @@ This module provides application alert configuration tools for Instana monitorin
7
7
  import logging
8
8
  from typing import Any, Dict, List, Optional, Union
9
9
 
10
+ from mcp.types import ToolAnnotations
11
+
12
+ from src.core.utils import BaseInstanaClient, register_as_tool, with_header_auth
13
+ from src.prompts import mcp
14
+
10
15
  # Import the necessary classes from the SDK
11
16
  try:
12
17
  from instana_client.api.application_alert_configuration_api import (
@@ -18,8 +23,6 @@ except ImportError:
18
23
  logger.error("Failed to import application alert configuration API", exc_info=True)
19
24
  raise
20
25
 
21
- from src.core.utils import BaseInstanaClient, register_as_tool, with_header_auth
22
-
23
26
  # Configure logger for this module
24
27
  logger = logging.getLogger(__name__)
25
28
 
@@ -30,7 +33,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
30
33
  """Initialize the Application Alert MCP tools client."""
31
34
  super().__init__(read_token=read_token, base_url=base_url)
32
35
 
33
- @register_as_tool
36
+ @register_as_tool(
37
+ title="Find Application Alert Config",
38
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
39
+ )
34
40
  @with_header_auth(ApplicationAlertConfigurationApi)
35
41
  async def find_application_alert_config(self,
36
42
  id: str,
@@ -78,7 +84,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
78
84
  return {"error": f"Failed to get application alert config: {e!s}"}
79
85
 
80
86
 
81
- @register_as_tool
87
+ @register_as_tool(
88
+ title="Find Application Alert Config Versions",
89
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
90
+ )
82
91
  @with_header_auth(ApplicationAlertConfigurationApi)
83
92
  async def find_application_alert_config_versions(self,
84
93
  id: str,
@@ -126,7 +135,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
126
135
  logger.error(f"Error in find_application_alert_config_versions: {e}", exc_info=True)
127
136
  return {"error": f"Failed to get application alert config versions: {e!s}"}
128
137
 
129
- @register_as_tool
138
+ @register_as_tool(
139
+ title="Get Application Alert Configs",
140
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
141
+ )
130
142
  @with_header_auth(ApplicationAlertConfigurationApi)
131
143
  async def get_application_alert_configs(self,
132
144
  application_id: Optional[str] = None,
@@ -173,7 +185,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
173
185
  logger.error(f"Error in get_application_alert_configs: {e}", exc_info=True)
174
186
  return {"error": f"Failed to get application alert configs: {e!s}"}
175
187
 
176
- @register_as_tool
188
+ @register_as_tool(
189
+ title="Delete Application Alert Config",
190
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=True)
191
+ )
177
192
  @with_header_auth(ApplicationAlertConfigurationApi)
178
193
  async def delete_application_alert_config(self,
179
194
  id: str,
@@ -214,7 +229,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
214
229
  logger.error(f"Error in delete_application_alert_config: {e}", exc_info=True)
215
230
  return {"error": f"Failed to delete application alert config: {e!s}"}
216
231
 
217
- @register_as_tool
232
+ @register_as_tool(
233
+ title="Enable Application Alert Config",
234
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
235
+ )
218
236
  @with_header_auth(ApplicationAlertConfigurationApi)
219
237
  async def enable_application_alert_config(self,
220
238
  id: str,
@@ -259,7 +277,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
259
277
  logger.error(f"Error in enable_application_alert_config: {e}", exc_info=True)
260
278
  return {"error": f"Failed to enable application alert config: {e!s}"}
261
279
 
262
- @register_as_tool
280
+ @register_as_tool(
281
+ title="Disable Application Alert Config",
282
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
283
+ )
263
284
  @with_header_auth(ApplicationAlertConfigurationApi)
264
285
  async def disable_application_alert_config(self,
265
286
  id: str,
@@ -304,7 +325,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
304
325
  logger.error(f"Error in disable_application_alert_config: {e}", exc_info=True)
305
326
  return {"error": f"Failed to disable application alert config: {e!s}"}
306
327
 
307
- @register_as_tool
328
+ @register_as_tool(
329
+ title="Restore Application Alert Config",
330
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
331
+ )
308
332
  @with_header_auth(ApplicationAlertConfigurationApi)
309
333
  async def restore_application_alert_config(self,
310
334
  id: str,
@@ -354,7 +378,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
354
378
  logger.error(f"Error in restore_application_alert_config: {e}", exc_info=True)
355
379
  return {"error": f"Failed to restore application alert config: {e!s}"}
356
380
 
357
- @register_as_tool
381
+ @register_as_tool(
382
+ title="Update Application Alert Config Baseline",
383
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
384
+ )
358
385
  @with_header_auth(ApplicationAlertConfigurationApi)
359
386
  async def update_application_alert_config_baseline(self,
360
387
  id: str,
@@ -399,7 +426,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
399
426
  logger.error(f"Error in update_application_alert_config_baseline: {e}", exc_info=True)
400
427
  return {"error": f"Failed to update application alert config baseline: {e!s}"}
401
428
 
402
- @register_as_tool
429
+ @register_as_tool(
430
+ title="Create Application Alert Config",
431
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
432
+ )
403
433
  @with_header_auth(ApplicationAlertConfigurationApi)
404
434
  async def create_application_alert_config(self,
405
435
  payload: Union[Dict[str, Any], str],
@@ -521,7 +551,10 @@ class ApplicationAlertMCPTools(BaseInstanaClient):
521
551
  logger.error(f"Error in create_application_alert_config: {e}", exc_info=True)
522
552
  return {"error": f"Failed to create application alert config: {e!s}"}
523
553
 
524
- @register_as_tool
554
+ @register_as_tool(
555
+ title="Update Application Alert Config",
556
+ annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False)
557
+ )
525
558
  @with_header_auth(ApplicationAlertConfigurationApi)
526
559
  async def update_application_alert_config(self,
527
560
  id: str,
@@ -7,6 +7,10 @@ This module provides application analyze tool functionality for Instana monitori
7
7
  import logging
8
8
  from typing import Any, Dict, List, Optional, Union
9
9
 
10
+ from mcp.types import ToolAnnotations
11
+
12
+ from src.prompts import mcp
13
+
10
14
  # Import the necessary classes from the SDK
11
15
  try:
12
16
  from instana_client.api.application_analyze_api import ApplicationAnalyzeApi
@@ -50,7 +54,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
50
54
  logger.error(f"Error initializing ApplicationAnalyzeApi: {e}", exc_info=True)
51
55
  raise
52
56
 
53
- @register_as_tool
57
+ @register_as_tool(
58
+ title="Get Call Details",
59
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
60
+ )
54
61
  @with_header_auth(ApplicationAnalyzeApi)
55
62
  async def get_call_details(
56
63
  self,
@@ -97,7 +104,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
97
104
  logger.error(f"Error getting call details: {e}", exc_info=True)
98
105
  return {"error": f"Failed to get call details: {e!s}"}
99
106
 
100
- @register_as_tool
107
+ @register_as_tool(
108
+ title="Get Trace Details",
109
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
110
+ )
101
111
  @with_header_auth(ApplicationAnalyzeApi)
102
112
  async def get_trace_details(
103
113
  self,
@@ -159,7 +169,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
159
169
  return {"error": f"Failed to get trace details: {e!s}"}
160
170
 
161
171
 
162
- @register_as_tool
172
+ @register_as_tool(
173
+ title="Get All Traces",
174
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
175
+ )
163
176
  @with_header_auth(ApplicationAnalyzeApi)
164
177
  async def get_all_traces(
165
178
  self,
@@ -287,7 +300,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
287
300
  logger.error(f"Error in get_traces: {e}")
288
301
  return {"error": f"Failed to get traces: {e!s}"}
289
302
 
290
- @register_as_tool
303
+ @register_as_tool(
304
+ title="Get Grouped Trace Metrics",
305
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
306
+ )
291
307
  @with_header_auth(ApplicationAnalyzeApi)
292
308
  async def get_grouped_trace_metrics(
293
309
  self,
@@ -431,7 +447,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
431
447
  logger.error(f"Error in get_grouped_trace_metrics: {e}")
432
448
  return {"error": f"Failed to get grouped trace metrics: {e!s}"}
433
449
 
434
- @register_as_tool
450
+ @register_as_tool(
451
+ title="Get Grouped Calls Metrics",
452
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
453
+ )
435
454
  @with_header_auth(ApplicationAnalyzeApi)
436
455
  async def get_grouped_calls_metrics(
437
456
  self,
@@ -585,7 +604,10 @@ class ApplicationAnalyzeMCPTools(BaseInstanaClient):
585
604
  return {"error": f"Failed to get grouped call: {e!s}"}
586
605
 
587
606
 
588
- @register_as_tool
607
+ @register_as_tool(
608
+ title="Get Correlated Traces",
609
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
610
+ )
589
611
  @with_header_auth(ApplicationAnalyzeApi)
590
612
  async def get_correlated_traces(
591
613
  self,
@@ -11,11 +11,14 @@ import traceback
11
11
  from datetime import datetime, timedelta
12
12
  from typing import Any, Dict, Optional
13
13
 
14
+ from mcp.types import ToolAnnotations
15
+
14
16
  from src.core.utils import (
15
17
  BaseInstanaClient,
16
18
  register_as_tool,
17
19
  with_header_auth,
18
20
  )
21
+ from src.prompts import mcp
19
22
 
20
23
  try:
21
24
  from instana_client.api.application_catalog_api import (
@@ -38,7 +41,10 @@ class ApplicationCatalogMCPTools(BaseInstanaClient):
38
41
  """Initialize the Application Catalog MCP tools client."""
39
42
  super().__init__(read_token=read_token, base_url=base_url)
40
43
 
41
- @register_as_tool
44
+ @register_as_tool(
45
+ title="Get Application Tag Catalog",
46
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
47
+ )
42
48
  @with_header_auth(ApplicationCatalogApi)
43
49
  async def get_application_tag_catalog(self,
44
50
  use_case: Optional[str] = None,
@@ -106,7 +112,10 @@ class ApplicationCatalogMCPTools(BaseInstanaClient):
106
112
  return {"error": f"Failed to get application catalog: {e!s}"}
107
113
 
108
114
 
109
- @register_as_tool
115
+ @register_as_tool(
116
+ title="Get Application Metric Catalog",
117
+ annotations=ToolAnnotations(readOnlyHint=True, destructiveHint=False)
118
+ )
110
119
  @with_header_auth(ApplicationCatalogApi)
111
120
  async def get_application_metric_catalog(self, ctx=None, api_client=None) -> Dict[str, Any]:
112
121
  """