mcp-proxy-adapter 6.9.14__tar.gz → 6.9.16__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 (159) hide show
  1. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/PKG-INFO +1 -1
  2. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/app.py +36 -12
  3. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/command_registry.py +9 -6
  4. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/config.py +1 -1
  5. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/app_factory.py +4 -1
  6. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/config_validator.py +20 -16
  7. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/logging.py +17 -34
  8. mcp_proxy_adapter-6.9.16/mcp_proxy_adapter/examples/full_application/test_minimal_server.py +69 -0
  9. mcp_proxy_adapter-6.9.16/mcp_proxy_adapter/examples/full_application/test_simple_server.py +62 -0
  10. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/version.py +1 -1
  11. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/PKG-INFO +1 -1
  12. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/SOURCES.txt +4 -0
  13. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/pyproject.toml +1 -1
  14. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/README.md +0 -0
  15. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/__init__.py +0 -0
  16. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/__main__.py +0 -0
  17. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/__init__.py +0 -0
  18. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/handlers.py +0 -0
  19. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
  20. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/base.py +0 -0
  21. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -0
  22. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
  23. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/factory.py +0 -0
  24. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
  25. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
  26. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/protocol_middleware.py +0 -0
  27. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -0
  28. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/unified_security.py +0 -0
  29. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -0
  30. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/schemas.py +0 -0
  31. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/tool_integration.py +0 -0
  32. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/api/tools.py +0 -0
  33. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/__init__.py +0 -0
  34. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/auth_validation_command.py +0 -0
  35. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/base.py +0 -0
  36. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/builtin_commands.py +0 -0
  37. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/catalog_manager.py +0 -0
  38. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/cert_monitor_command.py +0 -0
  39. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/certificate_management_command.py +0 -0
  40. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/config_command.py +0 -0
  41. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
  42. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/dependency_manager.py +0 -0
  43. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/echo_command.py +0 -0
  44. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/health_command.py +0 -0
  45. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/help_command.py +0 -0
  46. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/hooks.py +0 -0
  47. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/key_management_command.py +0 -0
  48. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/load_command.py +0 -0
  49. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/plugins_command.py +0 -0
  50. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/protocol_management_command.py +0 -0
  51. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/proxy_registration_command.py +0 -0
  52. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/registration_status_command.py +0 -0
  53. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/reload_command.py +0 -0
  54. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/result.py +0 -0
  55. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/role_test_command.py +0 -0
  56. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/roles_management_command.py +0 -0
  57. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/security_command.py +0 -0
  58. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/settings_command.py +0 -0
  59. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/ssl_setup_command.py +0 -0
  60. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/token_management_command.py +0 -0
  61. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/transport_management_command.py +0 -0
  62. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/commands/unload_command.py +0 -0
  63. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/__init__.py +0 -0
  64. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/app_runner.py +0 -0
  65. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/auth_validator.py +0 -0
  66. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/certificate_utils.py +0 -0
  67. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/client.py +0 -0
  68. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/client_manager.py +0 -0
  69. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/client_security.py +0 -0
  70. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/config_converter.py +0 -0
  71. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/crl_utils.py +0 -0
  72. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/errors.py +0 -0
  73. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/mtls_asgi.py +0 -0
  74. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/mtls_asgi_app.py +0 -0
  75. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/mtls_proxy.py +0 -0
  76. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/mtls_server.py +0 -0
  77. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/protocol_manager.py +0 -0
  78. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/proxy_client.py +0 -0
  79. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/proxy_registration.py +0 -0
  80. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/role_utils.py +0 -0
  81. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/security_adapter.py +0 -0
  82. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/security_factory.py +0 -0
  83. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/security_integration.py +0 -0
  84. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/server_adapter.py +0 -0
  85. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/server_engine.py +0 -0
  86. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/settings.py +0 -0
  87. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/signal_handler.py +0 -0
  88. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/ssl_utils.py +0 -0
  89. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/transport_manager.py +0 -0
  90. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/unified_config_adapter.py +0 -0
  91. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/core/utils.py +0 -0
  92. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/custom_openapi.py +0 -0
  93. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/__init__.py +0 -0
  94. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/basic_framework/__init__.py +0 -0
  95. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +0 -0
  96. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +0 -0
  97. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/basic_framework/main.py +0 -0
  98. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/bugfix_certificate_config.py +0 -0
  99. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/cert_manager_bugfix.py +0 -0
  100. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/check_config.py +0 -0
  101. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/commands/__init__.py +0 -0
  102. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/config_builder.py +0 -0
  103. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/config_cli.py +0 -0
  104. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/create_test_configs.py +0 -0
  105. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/debug_request_state.py +0 -0
  106. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/debug_role_chain.py +0 -0
  107. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/demo_client.py +0 -0
  108. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/__init__.py +0 -0
  109. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/commands/__init__.py +0 -0
  110. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -0
  111. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -0
  112. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -0
  113. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -0
  114. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -0
  115. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/main.py +0 -0
  116. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -0
  117. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/run_mtls.py +0 -0
  118. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/run_simple.py +0 -0
  119. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/full_application/test_server.py +0 -0
  120. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/generate_config.py +0 -0
  121. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/proxy_registration_example.py +0 -0
  122. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/required_certificates.py +0 -0
  123. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/run_example.py +0 -0
  124. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/run_full_test_suite.py +0 -0
  125. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/run_proxy_server.py +0 -0
  126. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -0
  127. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/security_test_client.py +0 -0
  128. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/setup_test_environment.py +0 -0
  129. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/simple_protocol_test.py +0 -0
  130. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_chk_hostname_automated.py +0 -0
  131. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_config.py +0 -0
  132. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_config_builder.py +0 -0
  133. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_examples.py +0 -0
  134. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_framework_complete.py +0 -0
  135. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_mcp_server.py +0 -0
  136. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/test_protocol_examples.py +0 -0
  137. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/universal_client.py +0 -0
  138. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/examples/update_config_certificates.py +0 -0
  139. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/main.py +0 -0
  140. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/openapi.py +0 -0
  141. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/schemas/base_schema.json +0 -0
  142. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/schemas/openapi_schema.json +0 -0
  143. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/schemas/roles.json +0 -0
  144. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter/schemas/roles_schema.json +0 -0
  145. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
  146. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/entry_points.txt +0 -0
  147. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/not-zip-safe +0 -0
  148. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
  149. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
  150. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/setup.cfg +0 -0
  151. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/setup.py +0 -0
  152. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_certificate_validation.py +0 -0
  153. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_config_integration.py +0 -0
  154. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_config_validation.py +0 -0
  155. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_config_validation_isolated.py +0 -0
  156. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_direct_import.py +0 -0
  157. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_isolated_validation.py +0 -0
  158. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_no_defaults.py +0 -0
  159. {mcp_proxy_adapter-6.9.14 → mcp_proxy_adapter-6.9.16}/tests/test_simple_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.9.14
3
+ Version: 6.9.16
4
4
  Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
5
5
  Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
6
  Author: Vasiliy Zdanovskiy
@@ -116,12 +116,13 @@ def _determine_registration_url(config: Dict[str, Any]) -> str:
116
116
  return server_url
117
117
 
118
118
 
119
- def create_lifespan(config_path: Optional[str] = None):
119
+ def create_lifespan(config_path: Optional[str] = None, current_config: Optional[Dict[str, Any]] = None):
120
120
  """
121
121
  Create lifespan manager for the FastAPI application.
122
122
 
123
123
  Args:
124
124
  config_path: Path to configuration file (optional)
125
+ current_config: Current configuration data (optional)
125
126
 
126
127
  Returns:
127
128
  Lifespan context manager
@@ -146,7 +147,17 @@ def create_lifespan(config_path: Optional[str] = None):
146
147
  # Compute server_url EARLY and inject into registration manager so
147
148
  # that reload_system (which may perform registration) uses the correct
148
149
  # externally reachable address.
149
- server_config = config.get("server")
150
+ # Use current_config from closure or fallback to global config
151
+ config_to_use = current_config
152
+ if config_to_use is None:
153
+ # Fallback: try to get config from global instance
154
+ try:
155
+ from mcp_proxy_adapter.config import get_config
156
+ config_to_use = get_config().get_all()
157
+ except Exception:
158
+ config_to_use = {}
159
+
160
+ server_config = config_to_use.get("server")
150
161
  if not server_config:
151
162
  raise ValueError("server configuration is required")
152
163
  server_host = server_config.get("host")
@@ -159,10 +170,6 @@ def create_lifespan(config_path: Optional[str] = None):
159
170
  # Check port availability BEFORE starting registration manager
160
171
  from mcp_proxy_adapter.core.utils import check_port_availability, handle_port_conflict
161
172
 
162
- server_config = config.get("server", {})
163
- server_host = server_config.get("host", "0.0.0.0")
164
- server_port = server_config.get("port", 8000)
165
-
166
173
  print(f"🔍 Checking external server port availability: {server_host}:{server_port}")
167
174
  if not check_port_availability(server_host, server_port):
168
175
  print(f"❌ CRITICAL: External server port {server_port} is occupied")
@@ -171,7 +178,7 @@ def create_lifespan(config_path: Optional[str] = None):
171
178
  print(f"✅ External server port {server_port} is available")
172
179
 
173
180
  # Determine registration URL using unified logic
174
- early_server_url = _determine_registration_url(config)
181
+ early_server_url = _determine_registration_url(config_to_use)
175
182
  try:
176
183
  from mcp_proxy_adapter.core.proxy_registration import (
177
184
  register_with_proxy,
@@ -190,10 +197,20 @@ def create_lifespan(config_path: Optional[str] = None):
190
197
  logger.error(f"Failed to initialize async registration: {e}")
191
198
 
192
199
  # Initialize system using unified logic (may perform registration)
200
+ # Set global config for reload_system
201
+ from mcp_proxy_adapter.config import Config
202
+ config_obj = Config()
203
+ config_obj.config_data = config_to_use
204
+
205
+ # Set global config for command registry
206
+ from mcp_proxy_adapter.config import get_config
207
+ global_config = get_config()
208
+ global_config.config_data = config_to_use
209
+
193
210
  if config_path:
194
- init_result = await registry.reload_system(config_path=config_path)
211
+ init_result = await registry.reload_system(config_path=config_path, config_obj=config_obj)
195
212
  else:
196
- init_result = await registry.reload_system()
213
+ init_result = await registry.reload_system(config_obj=config_obj)
197
214
 
198
215
  logger.info(
199
216
  f"Application started with {init_result['total_commands']} commands registered"
@@ -362,9 +379,16 @@ def create_app(
362
379
  elif hasattr(app_config, "keys"):
363
380
  current_config = app_config
364
381
  else:
365
- current_config = config.get_all()
382
+ # If app_config is not a dict-like object, use it as is
383
+ current_config = app_config
366
384
  else:
367
- current_config = config.get_all()
385
+ # If no app_config provided, try to get global config
386
+ try:
387
+ from mcp_proxy_adapter.config import get_config
388
+ current_config = get_config().get_all()
389
+ except Exception:
390
+ # If global config is not available, create empty config
391
+ current_config = {}
368
392
 
369
393
  # Debug: Check what config is passed to create_app
370
394
  if app_config:
@@ -559,7 +583,7 @@ def create_app(
559
583
  version=app_version,
560
584
  docs_url="/docs",
561
585
  redoc_url="/redoc",
562
- lifespan=create_lifespan(config_path),
586
+ lifespan=create_lifespan(config_path, current_config),
563
587
  )
564
588
 
565
589
  # CRITICAL FIX: Register commands immediately during app creation
@@ -659,7 +659,7 @@ class CommandRegistry:
659
659
  self._loaded_commands.clear()
660
660
  self._instances.clear()
661
661
 
662
- async def reload_system(self, config_path: Optional[str] = None) -> Dict[str, Any]:
662
+ async def reload_system(self, config_path: Optional[str] = None, config_obj: Optional[Any] = None) -> Dict[str, Any]:
663
663
  """
664
664
  Universal method for system initialization and reload.
665
665
  This method should be used both at startup and during reload.
@@ -675,13 +675,16 @@ class CommandRegistry:
675
675
  )
676
676
 
677
677
  # Step 1: Load configuration (preserve previous config for soft-fail)
678
- previous_config = config.get_all()
678
+ if config_obj is None:
679
+ config_obj = config
680
+
681
+ previous_config = config_obj.get_all()
679
682
  try:
680
683
  if config_path:
681
- config.load_from_file(config_path)
684
+ config_obj.load_from_file(config_path)
682
685
  logger.info(f"✅ Configuration loaded from: {config_path}")
683
686
  else:
684
- config.load_config()
687
+ config_obj.load_config()
685
688
  logger.info("✅ Configuration loaded from default path")
686
689
 
687
690
  config_reloaded = True
@@ -694,14 +697,14 @@ class CommandRegistry:
694
697
  from mcp_proxy_adapter.core.config_validator import ConfigValidator
695
698
 
696
699
  validator = ConfigValidator()
697
- validation = validator.validate(config.get_all())
700
+ validation = validator.validate(config_obj.get_all())
698
701
  if not validation.is_valid:
699
702
  logger.error("⚠️ Configuration validation failed during reload:")
700
703
  for err in validation.errors:
701
704
  logger.error(f" - {err}")
702
705
  # Do NOT exit on reload; restore previous configuration
703
706
  try:
704
- config.config_data = previous_config
707
+ config_obj.config_data = previous_config
705
708
  config_reloaded = False
706
709
  logger.error("ℹ️ Restored previous configuration due to validation errors")
707
710
  except Exception as restore_ex:
@@ -52,7 +52,7 @@ class Config:
52
52
  if VALIDATION_AVAILABLE:
53
53
  self.validator = ConfigValidator()
54
54
 
55
- self.load_config()
55
+ # Don't auto-load config - let user call load_from_file explicitly
56
56
 
57
57
  def load_config(self) -> None:
58
58
  """
@@ -78,6 +78,8 @@ async def create_and_run_server(
78
78
  sys.exit(1)
79
79
 
80
80
  try:
81
+ from mcp_proxy_adapter.config import Config
82
+ config = Config()
81
83
  config.load_from_file(str(config_file))
82
84
  app_config = config.get_all()
83
85
  print(f"✅ Configuration loaded from: {config_path}")
@@ -169,7 +171,6 @@ async def create_and_run_server(
169
171
  f"Fix your configuration file."
170
172
  )
171
173
 
172
- from pathlib import Path
173
174
  if not Path(cert_file).exists():
174
175
  raise ValueError(
175
176
  f"CRITICAL CONFIG ERROR: SSL certificate file does not exist: {cert_file}. "
@@ -509,6 +510,8 @@ def validate_config_file(config_path: str) -> bool:
509
510
  return False
510
511
 
511
512
  # Try to load configuration to validate JSON format
513
+ from mcp_proxy_adapter.config import Config
514
+ config = Config()
512
515
  config.load_from_file(str(config_file))
513
516
  return True
514
517
 
@@ -341,13 +341,18 @@ class ConfigValidator:
341
341
 
342
342
  section_data = self.config_data[section_name]
343
343
  for key, expected_type in required_keys.items():
344
+ # Check if key allows None (optional)
345
+ is_optional = isinstance(expected_type, tuple) and type(None) in expected_type
346
+
344
347
  if key not in section_data:
345
- self.validation_results.append(ValidationResult(
346
- level="error",
347
- message=f"Required key '{key}' is missing in section '{section_name}' for enabled feature",
348
- section=section_name,
349
- key=key
350
- ))
348
+ # Only report error if key is not optional
349
+ if not is_optional:
350
+ self.validation_results.append(ValidationResult(
351
+ level="error",
352
+ message=f"Required key '{key}' is missing in section '{section_name}' for enabled feature",
353
+ section=section_name,
354
+ key=key
355
+ ))
351
356
  else:
352
357
  # Validate type
353
358
  value = section_data[key]
@@ -535,7 +540,11 @@ class ConfigValidator:
535
540
  ])
536
541
 
537
542
  for file_key in file_keys:
538
- file_path = self._get_nested_value(file_key)
543
+ # Skip if the key doesn't exist in the configuration
544
+ if not self._has_nested_key(file_key):
545
+ continue
546
+
547
+ file_path = self._get_nested_value_safe(file_key)
539
548
  if file_path and not os.path.exists(file_path):
540
549
  # Check if this is a required file based on enabled features
541
550
  is_required = self._is_file_required_for_enabled_features(file_key)
@@ -685,15 +694,10 @@ class ConfigValidator:
685
694
  else:
686
695
  key_file = self._get_nested_value("ssl.key_file")
687
696
 
688
- if not self._has_nested_key("ssl.ca_cert"):
689
- self.validation_results.append(ValidationResult(
690
- level="error",
691
- message="SSL is enabled but ca_cert is not specified",
692
- section="ssl",
693
- key="ca_cert"
694
- ))
695
- else:
696
- ca_cert = self._get_nested_value("ssl.ca_cert")
697
+ # CA cert is optional for HTTPS but may be required for mTLS with client verification
698
+ ca_cert = None
699
+ if self._has_nested_key("ssl.ca_cert"):
700
+ ca_cert = self._get_nested_value_safe("ssl.ca_cert")
697
701
 
698
702
  # Check certificate file
699
703
  if not cert_file:
@@ -120,46 +120,29 @@ def setup_logging(
120
120
  Returns:
121
121
  Configured logger.
122
122
  """
123
- # Get parameters from configuration if not explicitly specified
124
- level = level or get_config().get("logging.level", "INFO")
125
-
126
- # Check debug level from config if debug is enabled
127
- if get_config().get("debug.enabled", False):
128
- debug_level = get_config().get("debug.level", "INFO")
129
- # Use debug level if it's more verbose than the logging level
130
- debug_level_num = getattr(logging, debug_level.upper(), logging.INFO)
131
- level_num = getattr(logging, level.upper(), logging.INFO)
132
- if debug_level_num < level_num:
133
- level = debug_level
134
- logger.debug(f"Using debug level from config: {debug_level}")
135
-
136
- log_file = log_file or get_config().get("logging.file")
137
- rotation_type = rotation_type or "size" # Default to size-based rotation
138
-
139
- # Get log directory and file settings from config
140
- log_dir = get_config().get("logging.log_dir", "./logs")
141
- log_file_name = get_config().get("logging.log_file", "mcp_proxy_adapter.log")
142
- error_log_file = get_config().get("logging.error_log_file", "mcp_proxy_adapter_error.log")
143
- access_log_file = get_config().get(
144
- "logging.access_log_file", "mcp_proxy_adapter_access.log"
145
- )
146
-
147
- # Get rotation settings from config
148
- max_file_size_str = get_config().get("logging.max_file_size", "10MB")
149
- backup_count = backup_count or get_config().get("logging.backup_count", 5)
123
+ # Use provided parameters or defaults
124
+ level = level or "INFO"
125
+ log_file = log_file
126
+ rotation_type = rotation_type or "size"
127
+ log_dir = "./logs"
128
+ log_file_name = "mcp_proxy_adapter.log"
129
+ error_log_file = "mcp_proxy_adapter_error.log"
130
+ access_log_file = "mcp_proxy_adapter_access.log"
131
+
132
+ # Get rotation settings
133
+ max_file_size_str = "10MB"
134
+ backup_count = backup_count or 5
150
135
 
151
136
  # Parse max file size (e.g., "10MB" -> 10 * 1024 * 1024)
152
137
  max_bytes = max_bytes or _parse_file_size(max_file_size_str)
153
138
 
154
139
  # Get format settings
155
- log_format = get_config().get(
156
- "logging.format", "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
157
- )
158
- date_format = get_config().get("logging.date_format", "%Y-%m-%d %H:%M:%S")
140
+ log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
141
+ date_format = "%Y-%m-%d %H:%M:%S"
159
142
 
160
143
  # Get output settings
161
- console_output = get_config().get("logging.console_output", True)
162
- file_output = get_config().get("logging.file_output", True)
144
+ console_output = True
145
+ file_output = True
163
146
 
164
147
  # Convert string logging level to constant
165
148
  numeric_level = getattr(logging, level.upper(), None)
@@ -227,7 +210,7 @@ def setup_logging(
227
210
  logger.addHandler(access_handler)
228
211
 
229
212
  # Configure loggers for external libraries
230
- log_levels = get_config().get("logging.levels", {})
213
+ log_levels = {}
231
214
  for logger_name, logger_level in log_levels.items():
232
215
  lib_logger = logging.getLogger(logger_name)
233
216
  lib_logger.setLevel(getattr(logging, logger_level.upper(), logging.INFO))
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Minimal server test without lifespan issues.
4
+ """
5
+
6
+ import sys
7
+ import os
8
+ from pathlib import Path
9
+
10
+ # Add the project root to the path
11
+ project_root = Path(__file__).parent.parent.parent.parent
12
+ sys.path.insert(0, str(project_root))
13
+
14
+ from fastapi import FastAPI
15
+ from mcp_proxy_adapter.api.handlers import execute_command
16
+ import uvicorn
17
+
18
+ def main():
19
+ """Test minimal server startup."""
20
+ print("🚀 Testing Minimal Server Startup")
21
+ print("=" * 50)
22
+
23
+ # Create minimal FastAPI app
24
+ app = FastAPI(
25
+ title="Test Server",
26
+ description="Minimal test server",
27
+ version="1.0.0"
28
+ )
29
+
30
+ # Add health endpoint
31
+ @app.get("/health")
32
+ async def health():
33
+ return {"status": "ok", "message": "Server is running"}
34
+
35
+ # Add JSON-RPC endpoint
36
+ @app.post("/api/jsonrpc")
37
+ async def jsonrpc_endpoint(request: dict):
38
+ try:
39
+ # Simple health command
40
+ if request.get("method") == "health":
41
+ return {
42
+ "jsonrpc": "2.0",
43
+ "id": request.get("id"),
44
+ "result": {"status": "ok", "message": "Health check passed"}
45
+ }
46
+ else:
47
+ return {
48
+ "jsonrpc": "2.0",
49
+ "id": request.get("id"),
50
+ "error": {"code": -32601, "message": "Method not found"}
51
+ }
52
+ except Exception as e:
53
+ return {
54
+ "jsonrpc": "2.0",
55
+ "id": request.get("id"),
56
+ "error": {"code": -32603, "message": str(e)}
57
+ }
58
+
59
+ print("✅ FastAPI app created successfully")
60
+
61
+ # Start server
62
+ print("🚀 Starting server on http://0.0.0.0:8000")
63
+ print("📡 Test with: curl -X POST http://localhost:8000/api/jsonrpc -H 'Content-Type: application/json' -d '{\"jsonrpc\": \"2.0\", \"method\": \"health\", \"id\": 1}'")
64
+ print("🛑 Press Ctrl+C to stop")
65
+
66
+ uvicorn.run(app, host="0.0.0.0", port=8000)
67
+
68
+ if __name__ == "__main__":
69
+ main()
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Simple server test without complex lifespan.
4
+ """
5
+
6
+ import sys
7
+ import os
8
+ from pathlib import Path
9
+
10
+ # Add the project root to the path
11
+ project_root = Path(__file__).parent.parent.parent.parent
12
+ sys.path.insert(0, str(project_root))
13
+
14
+ from mcp_proxy_adapter.api.app import create_app
15
+ from mcp_proxy_adapter.config import Config
16
+ import uvicorn
17
+
18
+ def main():
19
+ """Test simple server startup."""
20
+ print("🚀 Testing Simple Server Startup")
21
+ print("=" * 50)
22
+
23
+ # Load configuration
24
+ config_path = "configs/http_simple_correct.json"
25
+ if not os.path.exists(config_path):
26
+ print(f"❌ Configuration file not found: {config_path}")
27
+ return 1
28
+
29
+ try:
30
+ # Load config
31
+ config = Config()
32
+ config.load_from_file(config_path)
33
+ app_config = config.get_all()
34
+
35
+ print(f"✅ Configuration loaded: {config_path}")
36
+ print(f"🔍 Config keys: {list(app_config.keys())}")
37
+
38
+ # Create app
39
+ app = create_app(
40
+ title="Test Server",
41
+ description="Simple test server",
42
+ version="1.0.0",
43
+ app_config=app_config
44
+ )
45
+
46
+ print("✅ FastAPI app created successfully")
47
+
48
+ # Start server
49
+ print("🚀 Starting server on http://0.0.0.0:8000")
50
+ print("📡 Test with: curl -X POST http://localhost:8000/api/jsonrpc -H 'Content-Type: application/json' -d '{\"jsonrpc\": \"2.0\", \"method\": \"health\", \"id\": 1}'")
51
+ print("🛑 Press Ctrl+C to stop")
52
+
53
+ uvicorn.run(app, host="0.0.0.0", port=8000)
54
+
55
+ except Exception as e:
56
+ print(f"❌ Error: {e}")
57
+ import traceback
58
+ traceback.print_exc()
59
+ return 1
60
+
61
+ if __name__ == "__main__":
62
+ sys.exit(main())
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.9.14"
5
+ __version__ = "6.9.16"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.9.14
3
+ Version: 6.9.16
4
4
  Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
5
5
  Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
6
  Author: Vasiliy Zdanovskiy
@@ -127,7 +127,9 @@ setup.py
127
127
  ./mcp_proxy_adapter/examples/full_application/proxy_endpoints.py
128
128
  ./mcp_proxy_adapter/examples/full_application/run_mtls.py
129
129
  ./mcp_proxy_adapter/examples/full_application/run_simple.py
130
+ ./mcp_proxy_adapter/examples/full_application/test_minimal_server.py
130
131
  ./mcp_proxy_adapter/examples/full_application/test_server.py
132
+ ./mcp_proxy_adapter/examples/full_application/test_simple_server.py
131
133
  ./mcp_proxy_adapter/examples/full_application/commands/__init__.py
132
134
  ./mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py
133
135
  ./mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py
@@ -271,7 +273,9 @@ mcp_proxy_adapter/examples/full_application/main.py
271
273
  mcp_proxy_adapter/examples/full_application/proxy_endpoints.py
272
274
  mcp_proxy_adapter/examples/full_application/run_mtls.py
273
275
  mcp_proxy_adapter/examples/full_application/run_simple.py
276
+ mcp_proxy_adapter/examples/full_application/test_minimal_server.py
274
277
  mcp_proxy_adapter/examples/full_application/test_server.py
278
+ mcp_proxy_adapter/examples/full_application/test_simple_server.py
275
279
  mcp_proxy_adapter/examples/full_application/commands/__init__.py
276
280
  mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py
277
281
  mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mcp-proxy-adapter"
7
- version = "6.9.14"
7
+ version = "6.9.16"
8
8
  description = "Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}