mcp-proxy-adapter 4.0.0__tar.gz → 4.1.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 (283) hide show
  1. {mcp_proxy_adapter-4.0.0/mcp_proxy_adapter.egg-info → mcp_proxy_adapter-4.1.0}/PKG-INFO +3 -3
  2. mcp_proxy_adapter-4.1.0/docs/EN/development/command_auto_discovery.md +277 -0
  3. mcp_proxy_adapter-4.1.0/docs/RU/development/command_auto_discovery.md +277 -0
  4. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/command_registry.py +11 -2
  5. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/version.py +1 -1
  6. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0/mcp_proxy_adapter.egg-info}/PKG-INFO +3 -3
  7. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter.egg-info/SOURCES.txt +2 -0
  8. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/pyproject.toml +1 -1
  9. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/setup.py +4 -4
  10. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_app.py +308 -4
  11. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_handlers_extended.py +63 -1
  12. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_hooks.py +98 -1
  13. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_commands_server.py +11 -5
  14. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/LICENSE +0 -0
  15. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/MANIFEST.in +0 -0
  16. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/README.md +0 -0
  17. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/API_SCHEMA.md +0 -0
  18. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/AUTOMATED_PUBLISHING.md +0 -0
  19. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/BASIC_ARCHITECTURE.md +0 -0
  20. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/COMMAND_CHECKLIST.md +0 -0
  21. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/COMMAND_RESULTS.md +0 -0
  22. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/COMMAND_TEMPLATE.md +0 -0
  23. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/CONFIGURATION_PRINCIPLES.md +0 -0
  24. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/DOCUMENTATION_MAP.md +0 -0
  25. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/DOCUMENTATION_STANDARDS.md +0 -0
  26. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/ERROR_HANDLING.md +0 -0
  27. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/EXAMPLES_COMMAND_CLASSES.md +0 -0
  28. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/GLOSSARY.md +0 -0
  29. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/LOGGING_SYSTEM.md +0 -0
  30. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/NAMING_STANDARDS.md +0 -0
  31. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/OPENAPI_SCHEMA.md +0 -0
  32. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/PROJECT_EXTENSION_GUIDE.md +0 -0
  33. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/PROJECT_IDEOLOGY.md +0 -0
  34. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/PROJECT_RULES.md +0 -0
  35. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/PROJECT_STRUCTURE.md +0 -0
  36. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/PUBLISHING_TO_PYPI.md +0 -0
  37. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/README.md +0 -0
  38. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/api/cmd_endpoint.md +0 -0
  39. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/api/errors.md +0 -0
  40. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/api/intro.md +0 -0
  41. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/api/requests.md +0 -0
  42. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/api/responses.md +0 -0
  43. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/get_date_command.md +0 -0
  44. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/help_command.md +0 -0
  45. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/index.md +0 -0
  46. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/new_uuid4_command.md +0 -0
  47. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/reload_settings_command.md +0 -0
  48. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/commands/settings_command.md +0 -0
  49. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/COMMAND_METADATA_ENHANCEMENT.md +0 -0
  50. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/DEPENDENCY_INJECTION.md +0 -0
  51. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/HOOK_SYSTEM.md +0 -0
  52. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/METADATA_COMMANDS.md +0 -0
  53. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/OPENAPI_CUSTOMIZATION.md +0 -0
  54. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/REMOVE_COMMAND_GUIDE.md +0 -0
  55. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/TOOL_INTEGRATION.md +0 -0
  56. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/architecture.md +0 -0
  57. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/development/settings_management.md +0 -0
  58. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/examples/README.md +0 -0
  59. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/examples/anti_patterns.md +0 -0
  60. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/examples/basic_example.md +0 -0
  61. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/examples/complete_example.md +0 -0
  62. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/examples/minimal_example.md +0 -0
  63. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/testing/README.md +0 -0
  64. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/user/basic_usage.md +0 -0
  65. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/user/configuration.md +0 -0
  66. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/user/deployment.md +0 -0
  67. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/user/examples.md +0 -0
  68. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/EN/user/installation.md +0 -0
  69. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/API_SCHEMA.md +0 -0
  70. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/AUTOMATED_PUBLISHING.md +0 -0
  71. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/BASIC_ARCHITECTURE.md +0 -0
  72. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/COMMAND_CHECKLIST.md +0 -0
  73. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/COMMAND_RESULTS.md +0 -0
  74. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/COMMAND_TEMPLATE.md +0 -0
  75. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/CONFIGURATION_PRINCIPLES.md +0 -0
  76. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/DOCUMENTATION_MAP.md +0 -0
  77. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/DOCUMENTATION_STANDARDS.md +0 -0
  78. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/ERROR_HANDLING.md +0 -0
  79. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/EXAMPLES_COMMAND_CLASSES.md +0 -0
  80. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/GLOSSARY.md +0 -0
  81. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/LOGGING_SYSTEM.md +0 -0
  82. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/NAMING_STANDARDS.md +0 -0
  83. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/OPENAPI_SCHEMA.md +0 -0
  84. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/PROJECT_EXTENSION_GUIDE.md +0 -0
  85. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/PROJECT_IDEOLOGY.md +0 -0
  86. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/PROJECT_RULES.md +0 -0
  87. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/PROJECT_STRUCTURE.md +0 -0
  88. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/PUBLISHING_TO_PYPI.md +0 -0
  89. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/README.md +0 -0
  90. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/api/cmd_endpoint.md +0 -0
  91. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/api/errors.md +0 -0
  92. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/api/intro.md +0 -0
  93. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/api/requests.md +0 -0
  94. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/api/responses.md +0 -0
  95. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/get_date_command.md +0 -0
  96. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/help_command.md +0 -0
  97. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/index.md +0 -0
  98. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/new_uuid4_command.md +0 -0
  99. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/reload_settings_command.md +0 -0
  100. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/commands/settings_command.md +0 -0
  101. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/COMMAND_METADATA_ENHANCEMENT.md +0 -0
  102. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/DEPENDENCY_INJECTION.md +0 -0
  103. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/HOOK_SYSTEM.md +0 -0
  104. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/METADATA_COMMANDS.md +0 -0
  105. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/OPENAPI_CUSTOMIZATION.md +0 -0
  106. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/PLAN_REALIZACII_METADATA.md +0 -0
  107. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/REMOVE_COMMAND_GUIDE.md +0 -0
  108. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/TOOL_INTEGRATION.md +0 -0
  109. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/architecture.md +0 -0
  110. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/development/settings_management.md +0 -0
  111. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/examples/README.md +0 -0
  112. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/examples/anti_patterns.md +0 -0
  113. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/examples/basic_example.md +0 -0
  114. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/examples/complete_example.md +0 -0
  115. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/examples/minimal_example.md +0 -0
  116. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/testing/README.md +0 -0
  117. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/user/basic_usage.md +0 -0
  118. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/user/configuration.md +0 -0
  119. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/user/deployment.md +0 -0
  120. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/user/examples.md +0 -0
  121. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/docs/RU/user/installation.md +0 -0
  122. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/__init__.py +0 -0
  123. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/__init__.py +0 -0
  124. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/app.py +0 -0
  125. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/handlers.py +0 -0
  126. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
  127. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/auth.py +0 -0
  128. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/base.py +0 -0
  129. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
  130. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
  131. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
  132. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/middleware/rate_limit.py +0 -0
  133. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/schemas.py +0 -0
  134. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/tool_integration.py +0 -0
  135. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/api/tools.py +0 -0
  136. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/__init__.py +0 -0
  137. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/base.py +0 -0
  138. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/config_command.py +0 -0
  139. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
  140. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/health_command.py +0 -0
  141. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/help_command.py +0 -0
  142. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/hooks.py +0 -0
  143. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/reload_command.py +0 -0
  144. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/reload_settings_command.py +0 -0
  145. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/result.py +0 -0
  146. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/commands/settings_command.py +0 -0
  147. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/config.py +0 -0
  148. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/core/__init__.py +0 -0
  149. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/core/errors.py +0 -0
  150. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/core/logging.py +0 -0
  151. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/core/settings.py +0 -0
  152. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/core/utils.py +0 -0
  153. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/custom_openapi.py +0 -0
  154. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/README.md +0 -0
  155. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/__init__.py +0 -0
  156. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/README.md +0 -0
  157. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/__init__.py +0 -0
  158. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -0
  159. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/config.json +0 -0
  160. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -0
  161. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/basic_server/server.py +0 -0
  162. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/README.md +0 -0
  163. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -0
  164. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -0
  165. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -0
  166. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -0
  167. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -0
  168. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/config.json +0 -0
  169. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -0
  170. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -0
  171. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -0
  172. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -0
  173. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -0
  174. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -0
  175. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -0
  176. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -0
  177. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -0
  178. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -0
  179. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/server.py +0 -0
  180. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -0
  181. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/README.md +0 -0
  182. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/__init__.py +0 -0
  183. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/config.development.json +0 -0
  184. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/config.json +0 -0
  185. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/config.production.json +0 -0
  186. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/config.staging.json +0 -0
  187. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -0
  188. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/run.sh +0 -0
  189. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -0
  190. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/openapi.py +0 -0
  191. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/schemas/base_schema.json +0 -0
  192. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/schemas/openapi_schema.json +0 -0
  193. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/__init__.py +0 -0
  194. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/__init__.py +0 -0
  195. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -0
  196. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -0
  197. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_handlers.py +0 -0
  198. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_middleware.py +0 -0
  199. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_schemas.py +0 -0
  200. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -0
  201. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/commands/__init__.py +0 -0
  202. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/commands/test_config_command.py +0 -0
  203. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -0
  204. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/commands/test_help_command.py +0 -0
  205. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/conftest.py +0 -0
  206. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/functional/__init__.py +0 -0
  207. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/functional/test_api.py +0 -0
  208. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/integration/__init__.py +0 -0
  209. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -0
  210. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/integration/test_integration.py +0 -0
  211. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/performance/__init__.py +0 -0
  212. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/performance/test_performance.py +0 -0
  213. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/stubs/__init__.py +0 -0
  214. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/stubs/echo_command.py +0 -0
  215. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_api_endpoints.py +0 -0
  216. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_api_handlers.py +0 -0
  217. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_base_command.py +0 -0
  218. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_batch_requests.py +0 -0
  219. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_command_registry.py +0 -0
  220. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_config.py +0 -0
  221. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/test_utils.py +0 -0
  222. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/unit/__init__.py +0 -0
  223. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/unit/test_base_command.py +0 -0
  224. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter/tests/unit/test_config.py +0 -0
  225. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
  226. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
  227. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
  228. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/requirements.txt +0 -0
  229. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/setup.cfg +0 -0
  230. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/__init__.py +0 -0
  231. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/__init__.py +0 -0
  232. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_app_extended.py +0 -0
  233. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_auth.py +0 -0
  234. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_error_handling.py +0 -0
  235. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_handler_dependency_injection.py +0 -0
  236. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_middleware_base.py +0 -0
  237. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_middleware_logging.py +0 -0
  238. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_middleware_performance.py +0 -0
  239. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_openapi.py +0 -0
  240. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_rate_limit.py +0 -0
  241. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_schemas_extended.py +0 -0
  242. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_schemas_final.py +0 -0
  243. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_tool_description.py +0 -0
  244. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_tool_integration.py +0 -0
  245. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/api/test_tools.py +0 -0
  246. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/__init__.py +0 -0
  247. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_base_command_extended.py +0 -0
  248. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_base_command_final.py +0 -0
  249. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_command_di.py +0 -0
  250. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_command_metadata.py +0 -0
  251. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_command_registry_extended.py +0 -0
  252. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_config_command_extended.py +0 -0
  253. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_dependency_container.py +0 -0
  254. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_echo_command_di.py +0 -0
  255. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_health_command_extended.py +0 -0
  256. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_help_command.py +0 -0
  257. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_priority_commands.py +0 -0
  258. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_reload_commands_extended.py +0 -0
  259. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_result.py +0 -0
  260. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/commands/test_settings_command_extended.py +0 -0
  261. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/conftest.py +0 -0
  262. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/core/test_config.py +0 -0
  263. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/core/test_errors.py +0 -0
  264. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/core/test_logging.py +0 -0
  265. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/core/test_settings_extended.py +0 -0
  266. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/core/test_utils.py +0 -0
  267. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_advanced_hooks.py +0 -0
  268. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_auto_echo_command.py +0 -0
  269. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_auto_info_command.py +0 -0
  270. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_basic_server.py +0 -0
  271. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_commands.py +0 -0
  272. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_commands_hooks.py +0 -0
  273. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_health_command.py +0 -0
  274. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_help_command.py +0 -0
  275. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_openapi_generator.py +0 -0
  276. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_custom_settings_manager.py +0 -0
  277. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_data_transform_command.py +0 -0
  278. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_echo_command.py +0 -0
  279. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_intercept_command.py +0 -0
  280. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/examples/test_manual_echo_command.py +0 -0
  281. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/integration/__init__.py +0 -0
  282. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/integration/test_di_integration.py +0 -0
  283. {mcp_proxy_adapter-4.0.0 → mcp_proxy_adapter-4.1.0}/tests/test_custom_openapi_extended.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 4.0.0
3
+ Version: 4.1.0
4
4
  Summary: Reliable microservice with unified JSON-RPC endpoint
5
- Home-page: https://github.com/yourusername/mcp-proxy-adapter
6
- Author: MCP Team
5
+ Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
+ Author: Vasiliy Zdanovskiy
7
7
  Author-email: Vasiliy Zubarev <vasiliy.zubarev@example.com>
8
8
  License: MIT License
9
9
 
@@ -0,0 +1,277 @@
1
+ # Command Auto-Discovery and Configuration Reload
2
+
3
+ ## Overview
4
+
5
+ The MCP Proxy Adapter system supports automatic command discovery and the ability to reload configuration without restarting the server. During reload, custom commands are preserved while built-in commands are reloaded fresh.
6
+
7
+ ## Command Auto-Discovery Process
8
+
9
+ ### How It Works
10
+
11
+ Command auto-discovery works according to the following principles:
12
+
13
+ 1. **Package Scanning**: The system scans specified packages for modules with names ending in `_command`
14
+ 2. **Class Analysis**: In each module, it looks for classes that inherit from `Command`
15
+ 3. **Automatic Registration**: Found commands are automatically registered in the registry
16
+
17
+ ### Auto-Discovery Configuration
18
+
19
+ ```json
20
+ {
21
+ "commands": {
22
+ "auto_discovery": true,
23
+ "discovery_path": "mcp_proxy_adapter.commands",
24
+ "custom_commands_path": "./custom_commands"
25
+ }
26
+ }
27
+ ```
28
+
29
+ ### `discover_commands()` Method
30
+
31
+ ```python
32
+ def discover_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> int:
33
+ """
34
+ Automatically discovers and registers commands in the specified package.
35
+
36
+ Args:
37
+ package_path: Path to package with commands
38
+
39
+ Returns:
40
+ Number of discovered and registered commands
41
+ """
42
+ ```
43
+
44
+ ## Command Types
45
+
46
+ ### 1. Built-in Commands
47
+
48
+ Commands provided with the framework:
49
+ - `help` - command help
50
+ - `health` - server health check
51
+ - `config` - configuration management
52
+ - `reload` - configuration reload
53
+ - `settings` - settings management
54
+ - `reload_settings` - settings reload
55
+
56
+ ### 2. Auto-Discovered Commands
57
+
58
+ Commands found automatically in packages:
59
+ - Must be located in modules with names `*_command.py`
60
+ - Must inherit from the base `Command` class
61
+ - Are registered automatically at startup
62
+
63
+ ### 3. Custom Commands
64
+
65
+ Commands registered manually:
66
+ - Registered via `register_custom_command()`
67
+ - Have priority over built-in commands
68
+ - Are preserved during configuration reload
69
+
70
+ ## Command Priority Hierarchy
71
+
72
+ 1. **Custom Commands** (highest priority)
73
+ 2. **Auto-Discovered Commands**
74
+ 3. **Built-in Commands** (lowest priority)
75
+
76
+ ## Configuration Reload
77
+
78
+ ### `reload_config_and_commands()` Method
79
+
80
+ ```python
81
+ def reload_config_and_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> Dict[str, Any]:
82
+ """
83
+ Reloads configuration and re-discovers commands.
84
+
85
+ Args:
86
+ package_path: Path to package with commands
87
+
88
+ Returns:
89
+ Dictionary with reload information:
90
+ - config_reloaded: Configuration reload success
91
+ - commands_discovered: Number of discovered commands
92
+ - custom_commands_preserved: Number of preserved custom commands
93
+ - total_commands: Total number of commands after reload
94
+ - built_in_commands: Number of built-in commands
95
+ - custom_commands: Number of custom commands
96
+ """
97
+ ```
98
+
99
+ ### Reload Process
100
+
101
+ 1. **Preserve Custom Commands**: Create backup of custom commands
102
+ 2. **Reload Configuration**: Load new configuration from file
103
+ 3. **Reinitialize Logging**: Configure logging with new parameters
104
+ 4. **Clear Registry**: Remove all commands except custom ones
105
+ 5. **Restore Custom Commands**: Restore saved custom commands
106
+ 6. **Re-discover Commands**: Re-discover and register commands
107
+
108
+ ### Custom Command Preservation
109
+
110
+ Custom commands are preserved during reload thanks to:
111
+
112
+ ```python
113
+ # Preserve custom commands
114
+ custom_commands_backup = self._custom_commands.copy()
115
+
116
+ # Clear all commands
117
+ self._commands.clear()
118
+ self._instances.clear()
119
+
120
+ # Restore custom commands
121
+ self._custom_commands = custom_commands_backup
122
+ ```
123
+
124
+ ## Usage Examples
125
+
126
+ ### Registering Custom Commands
127
+
128
+ ```python
129
+ from mcp_proxy_adapter.commands.command_registry import registry
130
+ from mcp_proxy_adapter.commands.base import Command
131
+
132
+ class MyCustomCommand(Command):
133
+ name = "my_custom"
134
+
135
+ async def execute(self, **kwargs):
136
+ return SuccessResult(message="Custom command executed")
137
+
138
+ # Register with priority
139
+ registry.register_custom_command(MyCustomCommand)
140
+ ```
141
+
142
+ ### Configuration Reload
143
+
144
+ ```python
145
+ # Reload via command
146
+ result = await reload_command.execute()
147
+
148
+ # Direct reload
149
+ reload_info = registry.reload_config_and_commands()
150
+ print(f"Discovered commands: {reload_info['commands_discovered']}")
151
+ print(f"Preserved custom: {reload_info['custom_commands_preserved']}")
152
+ ```
153
+
154
+ ### Checking Command Types
155
+
156
+ ```python
157
+ # Check custom command existence
158
+ if registry.custom_command_exists("my_custom"):
159
+ print("Custom command exists")
160
+
161
+ # Get command with priority
162
+ command = registry.get_command_with_priority("my_custom")
163
+
164
+ # Get all commands with info
165
+ all_commands = registry.get_all_commands_info()
166
+ ```
167
+
168
+ ## Work Demonstration
169
+
170
+ Create file `demo_reload.py`:
171
+
172
+ ```python
173
+ #!/usr/bin/env python3
174
+ """
175
+ Demonstration of command auto-discovery and configuration reload.
176
+ """
177
+
178
+ from mcp_proxy_adapter.commands.command_registry import registry
179
+ from mcp_proxy_adapter.commands.base import Command
180
+ from mcp_proxy_adapter.commands.result import SuccessResult
181
+
182
+ class DemoCommand(Command):
183
+ name = "demo"
184
+ result_class = SuccessResult
185
+
186
+ async def execute(self, message: str = "Hello!", **kwargs):
187
+ return SuccessResult(message=f"Demo: {message}")
188
+
189
+ def main():
190
+ # Register custom command
191
+ registry.register_custom_command(DemoCommand)
192
+ print(f"Before reload: {len(registry.get_all_commands())} commands")
193
+
194
+ # Reload configuration
195
+ result = registry.reload_config_and_commands()
196
+ print(f"After reload: {result['total_commands']} commands")
197
+ print(f"Preserved custom: {result['custom_commands_preserved']}")
198
+
199
+ # Check preservation
200
+ if registry.custom_command_exists("demo"):
201
+ print("✅ Custom command preserved!")
202
+ else:
203
+ print("❌ Custom command lost!")
204
+
205
+ if __name__ == "__main__":
206
+ main()
207
+ ```
208
+
209
+ ## System Advantages
210
+
211
+ 1. **Flexibility**: Ability to add commands without code changes
212
+ 2. **Reliability**: Preservation of custom commands during reload
213
+ 3. **Performance**: Automatic discovery without manual registration
214
+ 4. **Prioritization**: Custom commands have priority over built-in ones
215
+ 5. **Monitoring**: Detailed information about reload process
216
+
217
+ ## Behavior When Deleting Commands
218
+
219
+ ### What Happens When a Command File is Deleted
220
+
221
+ 1. **Before Reload**: Command remains available as it's already loaded in memory
222
+ 2. **After Reload**: Command disappears from registry as the file no longer exists
223
+
224
+ ### Process for Handling Deleted Commands
225
+
226
+ ```python
227
+ # During configuration reload:
228
+ def reload_config_and_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> Dict[str, Any]:
229
+ # 1. Preserve custom commands
230
+ custom_commands_backup = self._custom_commands.copy()
231
+
232
+ # 2. Clear all commands (except custom ones)
233
+ self._commands.clear()
234
+ self._instances.clear()
235
+
236
+ # 3. Re-discover commands (deleted files are ignored)
237
+ commands_discovered = self.discover_commands(package_path)
238
+
239
+ # 4. Restore custom commands
240
+ self._custom_commands = custom_commands_backup
241
+ ```
242
+
243
+ ### Import Error Handling
244
+
245
+ The system correctly handles situations where command files are deleted:
246
+
247
+ ```python
248
+ try:
249
+ module = importlib.import_module(module_path)
250
+ # Process command...
251
+ except Exception as e:
252
+ logger.error(f"Error loading command module {module_path}: {e}")
253
+ # Module is skipped, error is logged
254
+ ```
255
+
256
+ ### Advantages of This Behavior
257
+
258
+ 1. **Safety**: Deleted commands don't remain in the system
259
+ 2. **Consistency**: Command registry always matches the file system
260
+ 3. **Fault Tolerance**: Import errors don't interrupt system operation
261
+ 4. **Flexibility**: Commands can be dynamically added and removed
262
+
263
+ ## Limitations
264
+
265
+ 1. **Naming Requirements**: Modules must end with `_command`
266
+ 2. **Inheritance**: Commands must inherit from base `Command` class
267
+ 3. **Server Restart**: Some configuration changes may require server restart
268
+ 4. **Dependencies**: Custom commands with dependencies must be registered as instances
269
+ 5. **Command Deletion**: Configuration reload is required to remove commands from registry
270
+
271
+ ## Recommendations
272
+
273
+ 1. **Use Custom Commands** to override built-in ones
274
+ 2. **Group Commands** in separate packages for better organization
275
+ 3. **Test Reload** before deploying to production
276
+ 4. **Monitor Logs** to track auto-discovery process
277
+ 5. **Document Custom Commands** to facilitate maintenance
@@ -0,0 +1,277 @@
1
+ # Автообнаружение команд и перезагрузка конфигурации
2
+
3
+ ## Обзор
4
+
5
+ Система MCP Proxy Adapter поддерживает автоматическое обнаружение команд и возможность перезагрузки конфигурации без перезапуска сервера. При перезагрузке пользовательские команды сохраняются, а встроенные команды перезагружаются заново.
6
+
7
+ ## Процесс автообнаружения команд
8
+
9
+ ### Принцип работы
10
+
11
+ Автообнаружение команд работает по следующим принципам:
12
+
13
+ 1. **Сканирование пакетов**: Система сканирует указанные пакеты на наличие модулей с именами, заканчивающимися на `_command`
14
+ 2. **Анализ классов**: В каждом модуле ищутся классы, наследующие от `Command`
15
+ 3. **Автоматическая регистрация**: Найденные команды автоматически регистрируются в реестре
16
+
17
+ ### Конфигурация автообнаружения
18
+
19
+ ```json
20
+ {
21
+ "commands": {
22
+ "auto_discovery": true,
23
+ "discovery_path": "mcp_proxy_adapter.commands",
24
+ "custom_commands_path": "./custom_commands"
25
+ }
26
+ }
27
+ ```
28
+
29
+ ### Метод `discover_commands()`
30
+
31
+ ```python
32
+ def discover_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> int:
33
+ """
34
+ Автоматически обнаруживает и регистрирует команды в указанном пакете.
35
+
36
+ Args:
37
+ package_path: Путь к пакету с командами
38
+
39
+ Returns:
40
+ Количество обнаруженных и зарегистрированных команд
41
+ """
42
+ ```
43
+
44
+ ## Типы команд
45
+
46
+ ### 1. Встроенные команды (Built-in Commands)
47
+
48
+ Команды, поставляемые с фреймворком:
49
+ - `help` - справка по командам
50
+ - `health` - проверка состояния сервера
51
+ - `config` - управление конфигурацией
52
+ - `reload` - перезагрузка конфигурации
53
+ - `settings` - управление настройками
54
+ - `reload_settings` - перезагрузка настроек
55
+
56
+ ### 2. Автообнаруженные команды (Auto-discovered Commands)
57
+
58
+ Команды, найденные автоматически в пакетах:
59
+ - Должны находиться в модулях с именами `*_command.py`
60
+ - Должны наследовать от базового класса `Command`
61
+ - Регистрируются автоматически при запуске
62
+
63
+ ### 3. Пользовательские команды (Custom Commands)
64
+
65
+ Команды, зарегистрированные вручную:
66
+ - Регистрируются через `register_custom_command()`
67
+ - Имеют приоритет над встроенными командами
68
+ - Сохраняются при перезагрузке конфигурации
69
+
70
+ ## Иерархия приоритетов команд
71
+
72
+ 1. **Пользовательские команды** (высший приоритет)
73
+ 2. **Автообнаруженные команды**
74
+ 3. **Встроенные команды** (низший приоритет)
75
+
76
+ ## Перезагрузка конфигурации
77
+
78
+ ### Метод `reload_config_and_commands()`
79
+
80
+ ```python
81
+ def reload_config_and_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> Dict[str, Any]:
82
+ """
83
+ Перезагружает конфигурацию и переобнаруживает команды.
84
+
85
+ Args:
86
+ package_path: Путь к пакету с командами
87
+
88
+ Returns:
89
+ Словарь с информацией о перезагрузке:
90
+ - config_reloaded: Успешность перезагрузки конфигурации
91
+ - commands_discovered: Количество обнаруженных команд
92
+ - custom_commands_preserved: Количество сохраненных пользовательских команд
93
+ - total_commands: Общее количество команд после перезагрузки
94
+ - built_in_commands: Количество встроенных команд
95
+ - custom_commands: Количество пользовательских команд
96
+ """
97
+ ```
98
+
99
+ ### Процесс перезагрузки
100
+
101
+ 1. **Сохранение пользовательских команд**: Создается резервная копия пользовательских команд
102
+ 2. **Перезагрузка конфигурации**: Загружается новая конфигурация из файла
103
+ 3. **Переинициализация логирования**: Настраивается логирование с новыми параметрами
104
+ 4. **Очистка реестра**: Удаляются все команды, кроме пользовательских
105
+ 5. **Восстановление пользовательских команд**: Восстанавливаются сохраненные пользовательские команды
106
+ 6. **Переобнаружение команд**: Заново обнаруживаются и регистрируются команды
107
+
108
+ ### Сохранение пользовательских команд
109
+
110
+ Пользовательские команды сохраняются при перезагрузке благодаря:
111
+
112
+ ```python
113
+ # Сохранение пользовательских команд
114
+ custom_commands_backup = self._custom_commands.copy()
115
+
116
+ # Очистка всех команд
117
+ self._commands.clear()
118
+ self._instances.clear()
119
+
120
+ # Восстановление пользовательских команд
121
+ self._custom_commands = custom_commands_backup
122
+ ```
123
+
124
+ ## Примеры использования
125
+
126
+ ### Регистрация пользовательской команды
127
+
128
+ ```python
129
+ from mcp_proxy_adapter.commands.command_registry import registry
130
+ from mcp_proxy_adapter.commands.base import Command
131
+
132
+ class MyCustomCommand(Command):
133
+ name = "my_custom"
134
+
135
+ async def execute(self, **kwargs):
136
+ return SuccessResult(message="Custom command executed")
137
+
138
+ # Регистрация с приоритетом
139
+ registry.register_custom_command(MyCustomCommand)
140
+ ```
141
+
142
+ ### Перезагрузка конфигурации
143
+
144
+ ```python
145
+ # Перезагрузка через команду
146
+ result = await reload_command.execute()
147
+
148
+ # Прямая перезагрузка
149
+ reload_info = registry.reload_config_and_commands()
150
+ print(f"Обнаружено команд: {reload_info['commands_discovered']}")
151
+ print(f"Сохранено пользовательских: {reload_info['custom_commands_preserved']}")
152
+ ```
153
+
154
+ ### Проверка типов команд
155
+
156
+ ```python
157
+ # Проверка существования пользовательской команды
158
+ if registry.custom_command_exists("my_custom"):
159
+ print("Пользовательская команда существует")
160
+
161
+ # Получение команды с учетом приоритета
162
+ command = registry.get_command_with_priority("my_custom")
163
+
164
+ # Получение всех команд с информацией
165
+ all_commands = registry.get_all_commands_info()
166
+ ```
167
+
168
+ ## Демонстрация работы
169
+
170
+ Создайте файл `demo_reload.py`:
171
+
172
+ ```python
173
+ #!/usr/bin/env python3
174
+ """
175
+ Демонстрация автообнаружения команд и перезагрузки конфигурации.
176
+ """
177
+
178
+ from mcp_proxy_adapter.commands.command_registry import registry
179
+ from mcp_proxy_adapter.commands.base import Command
180
+ from mcp_proxy_adapter.commands.result import SuccessResult
181
+
182
+ class DemoCommand(Command):
183
+ name = "demo"
184
+ result_class = SuccessResult
185
+
186
+ async def execute(self, message: str = "Hello!", **kwargs):
187
+ return SuccessResult(message=f"Demo: {message}")
188
+
189
+ def main():
190
+ # Регистрация пользовательской команды
191
+ registry.register_custom_command(DemoCommand)
192
+ print(f"До перезагрузки: {len(registry.get_all_commands())} команд")
193
+
194
+ # Перезагрузка конфигурации
195
+ result = registry.reload_config_and_commands()
196
+ print(f"После перезагрузки: {result['total_commands']} команд")
197
+ print(f"Сохранено пользовательских: {result['custom_commands_preserved']}")
198
+
199
+ # Проверка сохранения
200
+ if registry.custom_command_exists("demo"):
201
+ print("✅ Пользовательская команда сохранена!")
202
+ else:
203
+ print("❌ Пользовательская команда потеряна!")
204
+
205
+ if __name__ == "__main__":
206
+ main()
207
+ ```
208
+
209
+ ## Преимущества системы
210
+
211
+ 1. **Гибкость**: Возможность добавления команд без изменения кода
212
+ 2. **Надежность**: Сохранение пользовательских команд при перезагрузке
213
+ 3. **Производительность**: Автоматическое обнаружение без ручной регистрации
214
+ 4. **Приоритизация**: Пользовательские команды имеют приоритет над встроенными
215
+ 5. **Мониторинг**: Детальная информация о процессе перезагрузки
216
+
217
+ ## Поведение при удалении команд
218
+
219
+ ### Что происходит при удалении файла команды
220
+
221
+ 1. **До перезагрузки**: Команда остается доступной, так как она уже загружена в память
222
+ 2. **После перезагрузки**: Команда исчезает из реестра, так как файл больше не существует
223
+
224
+ ### Процесс обработки удаленных команд
225
+
226
+ ```python
227
+ # При перезагрузке конфигурации:
228
+ def reload_config_and_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> Dict[str, Any]:
229
+ # 1. Сохранение пользовательских команд
230
+ custom_commands_backup = self._custom_commands.copy()
231
+
232
+ # 2. Очистка всех команд (кроме пользовательских)
233
+ self._commands.clear()
234
+ self._instances.clear()
235
+
236
+ # 3. Переобнаружение команд (удаленные файлы игнорируются)
237
+ commands_discovered = self.discover_commands(package_path)
238
+
239
+ # 4. Восстановление пользовательских команд
240
+ self._custom_commands = custom_commands_backup
241
+ ```
242
+
243
+ ### Обработка ошибок импорта
244
+
245
+ Система корректно обрабатывает ситуации, когда файлы команд удалены:
246
+
247
+ ```python
248
+ try:
249
+ module = importlib.import_module(module_path)
250
+ # Обработка команды...
251
+ except Exception as e:
252
+ logger.error(f"Error loading command module {module_path}: {e}")
253
+ # Модуль пропускается, ошибка логируется
254
+ ```
255
+
256
+ ### Преимущества такого поведения
257
+
258
+ 1. **Безопасность**: Удаленные команды не остаются в системе
259
+ 2. **Консистентность**: Реестр команд всегда соответствует файловой системе
260
+ 3. **Отказоустойчивость**: Ошибки импорта не прерывают работу системы
261
+ 4. **Гибкость**: Можно динамически добавлять и удалять команды
262
+
263
+ ## Ограничения
264
+
265
+ 1. **Требования к именованию**: Модули должны заканчиваться на `_command`
266
+ 2. **Наследование**: Команды должны наследовать от базового класса `Command`
267
+ 3. **Перезапуск сервера**: Некоторые изменения конфигурации могут требовать перезапуска
268
+ 4. **Зависимости**: Пользовательские команды с зависимостями должны регистрироваться как экземпляры
269
+ 5. **Удаление команд**: Требуется перезагрузка конфигурации для удаления команд из реестра
270
+
271
+ ## Рекомендации
272
+
273
+ 1. **Используйте пользовательские команды** для переопределения встроенных
274
+ 2. **Группируйте команды** в отдельные пакеты для лучшей организации
275
+ 3. **Тестируйте перезагрузку** перед развертыванием в продакшене
276
+ 4. **Мониторьте логи** для отслеживания процесса автообнаружения
277
+ 5. **Документируйте пользовательские команды** для облегчения поддержки
@@ -257,15 +257,20 @@ class CommandRegistry:
257
257
  commands_info[name] = self.get_command_info(name)
258
258
  return commands_info
259
259
 
260
- def discover_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> None:
260
+ def discover_commands(self, package_path: str = "mcp_proxy_adapter.commands") -> int:
261
261
  """
262
262
  Automatically discovers and registers commands in the specified package.
263
263
 
264
264
  Args:
265
265
  package_path: Path to package with commands.
266
+
267
+ Returns:
268
+ Number of commands discovered and registered.
266
269
  """
267
270
  logger.info(f"Discovering commands in package: {package_path}")
268
271
 
272
+ commands_discovered = 0
273
+
269
274
  try:
270
275
  package = importlib.import_module(package_path)
271
276
  package_dir = os.path.dirname(package.__file__ or "")
@@ -273,7 +278,7 @@ class CommandRegistry:
273
278
  for _, module_name, is_pkg in pkgutil.iter_modules([package_dir]):
274
279
  if is_pkg:
275
280
  # Recursively traverse subpackages
276
- self.discover_commands(f"{package_path}.{module_name}")
281
+ commands_discovered += self.discover_commands(f"{package_path}.{module_name}")
277
282
  elif module_name.endswith("_command"):
278
283
  # Import only command modules
279
284
  module_path = f"{package_path}.{module_name}"
@@ -297,6 +302,8 @@ class CommandRegistry:
297
302
  # Register the command only if it doesn't exist
298
303
  if not self.command_exists(command_name):
299
304
  self.register(cast(Type[Command], obj))
305
+ commands_discovered += 1
306
+ logger.debug(f"Registered command: {command_name}")
300
307
  else:
301
308
  logger.debug(f"Command '{command_name}' is already registered, skipping")
302
309
  except ValueError as e:
@@ -307,6 +314,8 @@ class CommandRegistry:
307
314
  except Exception as e:
308
315
  logger.error(f"Error discovering commands: {e}")
309
316
 
317
+ return commands_discovered
318
+
310
319
  def register_custom_command(self, command: Union[Type[Command], Command]) -> None:
311
320
  """
312
321
  Register a custom command with priority over built-in commands.
@@ -1,3 +1,3 @@
1
1
  """Version information for MCP Microservice."""
2
2
 
3
- __version__ = "4.0.0"
3
+ __version__ = "4.1.0"
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 4.0.0
3
+ Version: 4.1.0
4
4
  Summary: Reliable microservice with unified JSON-RPC endpoint
5
- Home-page: https://github.com/yourusername/mcp-proxy-adapter
6
- Author: MCP Team
5
+ Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
+ Author: Vasiliy Zdanovskiy
7
7
  Author-email: Vasiliy Zubarev <vasiliy.zubarev@example.com>
8
8
  License: MIT License
9
9
 
@@ -44,6 +44,7 @@ docs/EN/development/OPENAPI_CUSTOMIZATION.md
44
44
  docs/EN/development/REMOVE_COMMAND_GUIDE.md
45
45
  docs/EN/development/TOOL_INTEGRATION.md
46
46
  docs/EN/development/architecture.md
47
+ docs/EN/development/command_auto_discovery.md
47
48
  docs/EN/development/settings_management.md
48
49
  docs/EN/examples/README.md
49
50
  docs/EN/examples/anti_patterns.md
@@ -97,6 +98,7 @@ docs/RU/development/PLAN_REALIZACII_METADATA.md
97
98
  docs/RU/development/REMOVE_COMMAND_GUIDE.md
98
99
  docs/RU/development/TOOL_INTEGRATION.md
99
100
  docs/RU/development/architecture.md
101
+ docs/RU/development/command_auto_discovery.md
100
102
  docs/RU/development/settings_management.md
101
103
  docs/RU/examples/README.md
102
104
  docs/RU/examples/anti_patterns.md
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mcp-proxy-adapter"
7
- version = "4.0.0"
7
+ version = "4.1.0"
8
8
  description = "Reliable microservice with unified JSON-RPC endpoint"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -2,13 +2,13 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="mcp-proxy-adapter",
5
- version="3.1.6",
5
+ version="4.1.0",
6
6
  description="Adapter for MCP Proxy JSON-RPC communications",
7
7
  long_description=open("README.md").read(),
8
8
  long_description_content_type="text/markdown",
9
- author="MCP Team",
10
- author_email="info@example.com",
11
- url="https://github.com/yourusername/mcp-proxy-adapter",
9
+ author="Vasiliy Zdanovskiy",
10
+ author_email="vasilyvz@gmail.com",
11
+ url="https://github.com/maverikod/mcp-proxy-adapter",
12
12
  packages=find_packages(exclude=["mcp_sdk*"]) + ['examples',
13
13
  'examples.minimal_example',
14
14
  'examples.basic_example',