mcp-proxy-adapter 6.6.3__tar.gz → 6.6.5__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 (144) hide show
  1. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/PKG-INFO +1 -1
  2. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/app.py +64 -40
  3. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/command_registry.py +27 -13
  4. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/config.py +1 -1
  5. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/proxy_registration.py +80 -7
  6. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/config_builder.py +2 -2
  7. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/main.py +12 -4
  8. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/version.py +1 -1
  9. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/PKG-INFO +1 -1
  10. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/pyproject.toml +1 -1
  11. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/README.md +0 -0
  12. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/__init__.py +0 -0
  13. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/__main__.py +0 -0
  14. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/__init__.py +0 -0
  15. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/handlers.py +0 -0
  16. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
  17. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/base.py +0 -0
  18. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -0
  19. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
  20. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/factory.py +0 -0
  21. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
  22. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
  23. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/protocol_middleware.py +0 -0
  24. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -0
  25. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/unified_security.py +0 -0
  26. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -0
  27. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/schemas.py +0 -0
  28. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/tool_integration.py +0 -0
  29. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/api/tools.py +0 -0
  30. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/__init__.py +0 -0
  31. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/auth_validation_command.py +0 -0
  32. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/base.py +0 -0
  33. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/builtin_commands.py +0 -0
  34. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/catalog_manager.py +0 -0
  35. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/cert_monitor_command.py +0 -0
  36. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/certificate_management_command.py +0 -0
  37. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/config_command.py +0 -0
  38. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
  39. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/dependency_manager.py +0 -0
  40. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/echo_command.py +0 -0
  41. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/health_command.py +0 -0
  42. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/help_command.py +0 -0
  43. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/hooks.py +0 -0
  44. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/key_management_command.py +0 -0
  45. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/load_command.py +0 -0
  46. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/plugins_command.py +0 -0
  47. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/protocol_management_command.py +0 -0
  48. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/proxy_registration_command.py +0 -0
  49. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/reload_command.py +0 -0
  50. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/result.py +0 -0
  51. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/role_test_command.py +0 -0
  52. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/roles_management_command.py +0 -0
  53. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/security_command.py +0 -0
  54. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/settings_command.py +0 -0
  55. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/ssl_setup_command.py +0 -0
  56. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/token_management_command.py +0 -0
  57. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/transport_management_command.py +0 -0
  58. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/commands/unload_command.py +0 -0
  59. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/__init__.py +0 -0
  60. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/app_factory.py +0 -0
  61. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/app_runner.py +0 -0
  62. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/auth_validator.py +0 -0
  63. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/certificate_utils.py +0 -0
  64. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/client.py +0 -0
  65. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/client_manager.py +0 -0
  66. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/client_security.py +0 -0
  67. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/config_converter.py +0 -0
  68. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/config_validator.py +0 -0
  69. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/crl_utils.py +0 -0
  70. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/errors.py +0 -0
  71. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/logging.py +0 -0
  72. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/mtls_asgi.py +0 -0
  73. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/mtls_asgi_app.py +0 -0
  74. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/mtls_server.py +0 -0
  75. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/protocol_manager.py +0 -0
  76. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/proxy_client.py +0 -0
  77. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/role_utils.py +0 -0
  78. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/security_adapter.py +0 -0
  79. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/security_factory.py +0 -0
  80. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/security_integration.py +0 -0
  81. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/server_adapter.py +0 -0
  82. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/server_engine.py +0 -0
  83. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/settings.py +0 -0
  84. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/ssl_utils.py +0 -0
  85. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/transport_manager.py +0 -0
  86. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/unified_config_adapter.py +0 -0
  87. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/core/utils.py +0 -0
  88. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/custom_openapi.py +0 -0
  89. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/__init__.py +0 -0
  90. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/basic_framework/__init__.py +0 -0
  91. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +0 -0
  92. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +0 -0
  93. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/basic_framework/main.py +0 -0
  94. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/bugfix_certificate_config.py +0 -0
  95. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/cert_manager_bugfix.py +0 -0
  96. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/check_config.py +0 -0
  97. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/commands/__init__.py +0 -0
  98. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/config_cli.py +0 -0
  99. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/create_test_configs.py +0 -0
  100. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/debug_request_state.py +0 -0
  101. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/debug_role_chain.py +0 -0
  102. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/demo_client.py +0 -0
  103. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/__init__.py +0 -0
  104. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/commands/__init__.py +0 -0
  105. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -0
  106. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -0
  107. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -0
  108. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -0
  109. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -0
  110. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/main.py +0 -0
  111. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -0
  112. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/generate_certificates.py +0 -0
  113. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/generate_config.py +0 -0
  114. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/proxy_registration_example.py +0 -0
  115. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/required_certificates.py +0 -0
  116. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/run_example.py +0 -0
  117. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/run_full_test_suite.py +0 -0
  118. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/run_proxy_server.py +0 -0
  119. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -0
  120. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/security_test_client.py +0 -0
  121. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/setup_test_environment.py +0 -0
  122. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/simple_protocol_test.py +0 -0
  123. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_chk_hostname_automated.py +0 -0
  124. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_config.py +0 -0
  125. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_config_builder.py +0 -0
  126. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_examples.py +0 -0
  127. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_framework_complete.py +0 -0
  128. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_mcp_server.py +0 -0
  129. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/test_protocol_examples.py +0 -0
  130. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/universal_client.py +0 -0
  131. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/examples/update_config_certificates.py +0 -0
  132. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/openapi.py +0 -0
  133. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/schemas/base_schema.json +0 -0
  134. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/schemas/openapi_schema.json +0 -0
  135. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/schemas/roles.json +0 -0
  136. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter/schemas/roles_schema.json +0 -0
  137. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/SOURCES.txt +0 -0
  138. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
  139. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/entry_points.txt +0 -0
  140. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/not-zip-safe +0 -0
  141. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
  142. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
  143. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/setup.cfg +0 -0
  144. {mcp_proxy_adapter-6.6.3 → mcp_proxy_adapter-6.6.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.6.3
3
+ Version: 6.6.5
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
@@ -65,11 +65,8 @@ def create_lifespan(config_path: Optional[str] = None):
65
65
  initialize_proxy_registration,
66
66
  )
67
67
 
68
- # Initialize proxy registration manager early
69
- try:
70
- initialize_proxy_registration(config.get_all())
71
- except Exception as e:
72
- logger.error(f"Failed to initialize proxy registration: {e}")
68
+ # Proxy registration manager will be initialized in registry.reload_system()
69
+ # after all commands are loaded to ensure complete command schema
73
70
 
74
71
  # Compute server_url EARLY and inject into registration manager so
75
72
  # that reload_system (which may perform registration) uses the correct
@@ -89,10 +86,20 @@ def create_lifespan(config_path: Optional[str] = None):
89
86
  public_port = reg_cfg.get("public_port")
90
87
 
91
88
  # Check SSL configuration from new structure
92
- protocol = config.get("server.protocol", "http")
93
- verify_client = config.get("transport.verify_client", False)
94
- ssl_enabled = protocol in ["https", "mtls"] or verify_client
95
- protocol = "https" if ssl_enabled else "http"
89
+ # Priority: registration.protocol > server.protocol > fallback to http
90
+ reg_cfg = config.get("registration", {})
91
+ registration_protocol = reg_cfg.get("protocol")
92
+ server_protocol = config.get("server.protocol", "http")
93
+
94
+ if registration_protocol:
95
+ # Use protocol from registration configuration
96
+ # Convert mtls to https for URL construction (mTLS is still HTTPS)
97
+ protocol = "https" if registration_protocol == "mtls" else registration_protocol
98
+ else:
99
+ # Fallback to server protocol
100
+ verify_client = config.get("transport.verify_client", False)
101
+ ssl_enabled = server_protocol in ["https", "mtls"] or verify_client
102
+ protocol = "https" if ssl_enabled else "http"
96
103
 
97
104
  import os
98
105
  docker_host_addr = os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
@@ -124,11 +131,7 @@ def create_lifespan(config_path: Optional[str] = None):
124
131
  )
125
132
  logger.info(f"System initialization result: {init_result}")
126
133
 
127
- # Initialize proxy registration manager with current config
128
- try:
129
- initialize_proxy_registration(config.get_all())
130
- except Exception as e:
131
- logger.error(f"Failed to initialize proxy registration: {e}")
134
+ # Proxy registration manager is already initialized in registry.reload_system()
132
135
 
133
136
  # Recompute registration URL AFTER config reload using final config
134
137
  try:
@@ -141,11 +144,21 @@ def create_lifespan(config_path: Optional[str] = None):
141
144
  public_host = reg_cfg.get("public_host")
142
145
  public_port = reg_cfg.get("public_port")
143
146
 
144
- security_config = final_config.get("security", {})
145
- ssl_cfg = security_config.get("ssl", {})
146
- if not ssl_cfg.get("enabled", False):
147
- ssl_cfg = final_config.get("ssl", {})
148
- protocol = "https" if ssl_cfg.get("enabled", False) else "http"
147
+ # Determine protocol using the new configuration structure
148
+ # Priority: registration.protocol > server.protocol > fallback to http
149
+ reg_cfg = final_config.get("registration", final_config.get("proxy_registration", {}))
150
+ registration_protocol = reg_cfg.get("protocol")
151
+ server_protocol = final_config.get("server", {}).get("protocol", "http")
152
+
153
+ if registration_protocol:
154
+ # Use protocol from registration configuration
155
+ # Convert mtls to https for URL construction (mTLS is still HTTPS)
156
+ protocol = "https" if registration_protocol == "mtls" else registration_protocol
157
+ else:
158
+ # Fallback to server protocol
159
+ verify_client_cfg = final_config.get("transport", {}).get("verify_client", False)
160
+ ssl_enabled_final = server_protocol in ["https", "mtls"] or verify_client_cfg
161
+ protocol = "https" if ssl_enabled_final else "http"
149
162
 
150
163
  import os
151
164
  docker_host_addr = os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
@@ -184,19 +197,26 @@ def create_lifespan(config_path: Optional[str] = None):
184
197
  logger.error(f"Failed to recompute registration URL: {e}")
185
198
  server_url = early_server_url
186
199
 
187
- # Attempt proxy registration in background with small delay
188
- async def _delayed_register():
200
+ # Proxy registration is now handled in registry.reload_system()
201
+ # after all commands are loaded, ensuring complete command schema
202
+ logger.info("ℹ️ Proxy registration will be handled after command loading completes")
203
+
204
+ # Add delayed registration task to allow server to fully start
205
+ async def delayed_registration():
206
+ """Delayed registration to ensure server is fully started."""
207
+ await asyncio.sleep(2) # Wait for server to start listening
208
+ logger.info("🔄 Attempting delayed proxy registration after server startup")
189
209
  try:
190
- await asyncio.sleep(0.5)
210
+ from mcp_proxy_adapter.core.proxy_registration import register_with_proxy
191
211
  success = await register_with_proxy(server_url)
192
212
  if success:
193
- logger.info("✅ Proxy registration completed successfully")
213
+ logger.info("✅ Delayed proxy registration successful")
194
214
  else:
195
- logger.info("ℹ️ Proxy registration is disabled or failed")
215
+ logger.warning("⚠️ Delayed proxy registration failed")
196
216
  except Exception as e:
197
- logger.error(f"Proxy registration failed: {e}")
198
-
199
- asyncio.create_task(_delayed_register())
217
+ logger.error(f" Delayed proxy registration error: {e}")
218
+
219
+ asyncio.create_task(delayed_registration())
200
220
 
201
221
  yield # Application is running
202
222
 
@@ -237,16 +257,20 @@ def create_ssl_context(
237
257
  return None
238
258
 
239
259
  # Get certificate paths from configuration
240
- cert_file = current_config.get("ssl", {}).get("cert_file")
241
- key_file = current_config.get("ssl", {}).get("key_file")
260
+ cert_file = current_config.get("transport", {}).get("cert_file")
261
+ key_file = current_config.get("transport", {}).get("key_file")
262
+ ca_cert = current_config.get("transport", {}).get("ca_cert")
242
263
 
243
- # If not found in ssl section, use default paths
244
- if not cert_file:
264
+ # Convert relative paths to absolute paths
265
+ if cert_file and not Path(cert_file).is_absolute():
266
+ project_root = Path(__file__).parent.parent.parent
267
+ cert_file = str(project_root / cert_file)
268
+ if key_file and not Path(key_file).is_absolute():
245
269
  project_root = Path(__file__).parent.parent.parent
246
- cert_file = str(project_root / "certs" / "server.crt")
247
- if not key_file:
270
+ key_file = str(project_root / key_file)
271
+ if ca_cert and not Path(ca_cert).is_absolute():
248
272
  project_root = Path(__file__).parent.parent.parent
249
- key_file = str(project_root / "certs" / "server.key")
273
+ ca_cert = str(project_root / ca_cert)
250
274
 
251
275
  if not cert_file or not key_file:
252
276
  logger.warning("SSL enabled but certificate or key file not specified")
@@ -257,15 +281,15 @@ def create_ssl_context(
257
281
  ssl_context = SSLUtils.create_ssl_context(
258
282
  cert_file=cert_file,
259
283
  key_file=key_file,
260
- ca_cert=ssl_config.get("ca_cert"),
261
- verify_client=ssl_config.get("verify_client", False),
262
- cipher_suites=ssl_config.get("cipher_suites", []),
263
- min_tls_version=ssl_config.get("min_tls_version", "1.2"),
264
- max_tls_version=ssl_config.get("max_tls_version", "1.3"),
284
+ ca_cert=ca_cert,
285
+ verify_client=current_config.get("transport", {}).get("verify_client", False),
286
+ cipher_suites=[],
287
+ min_tls_version="1.2",
288
+ max_tls_version="1.3",
265
289
  )
266
290
 
267
291
  logger.info(
268
- f"SSL context created successfully for mode: {ssl_config.get('mode', 'https_only')}"
292
+ f"SSL context created successfully for mode: https_only"
269
293
  )
270
294
  return ssl_context
271
295
 
@@ -786,23 +786,37 @@ class CommandRegistry:
786
786
  # Initialize proxy registration manager with current config
787
787
  initialize_proxy_registration(config.get_all())
788
788
 
789
- # Get server configuration
789
+ # Get server configuration with proper URL resolution logic
790
790
  server_config = config.get("server", {})
791
791
  server_host = server_config.get("host", "0.0.0.0")
792
792
  server_port = server_config.get("port", 8000)
793
793
 
794
- # Determine server URL based on SSL configuration
795
- ssl_config = config.get("ssl", {})
796
- if ssl_config.get("enabled", False):
797
- protocol = "https"
798
- else:
799
- protocol = "http"
800
-
801
- # Use localhost for external access if host is 0.0.0.0
802
- if server_host == "0.0.0.0":
803
- server_host = "localhost"
804
-
805
- server_url = f"{protocol}://{server_host}:{server_port}"
794
+ # Get registration configuration for public host/port overrides
795
+ # First check server config, then registration config
796
+ public_host = config.get("server.public_host")
797
+ public_port = config.get("server.public_port")
798
+
799
+ # Fallback to registration config if not found in server
800
+ if not public_host or not public_port:
801
+ reg_cfg = config.get("registration", config.get("proxy_registration", {}))
802
+ public_host = public_host or reg_cfg.get("public_host")
803
+ public_port = public_port or reg_cfg.get("public_port")
804
+
805
+ # Determine protocol based on new configuration structure
806
+ protocol = config.get("server.protocol", "http")
807
+ verify_client = config.get("transport.verify_client", False)
808
+ ssl_enabled = protocol in ["https", "mtls"] or verify_client
809
+ protocol = "https" if ssl_enabled else "http"
810
+
811
+ # Resolve host and port (same logic as in app.py)
812
+ import os
813
+ docker_host_addr = os.getenv("DOCKER_HOST_ADDR", "172.17.0.1")
814
+ resolved_host = public_host or (docker_host_addr if server_host == "0.0.0.0" else server_host)
815
+ resolved_port = public_port or server_port
816
+
817
+ server_url = f"{protocol}://{resolved_host}:{resolved_port}"
818
+
819
+ logger.info(f"🔍 Proxy registration URL resolved: {server_url}")
806
820
 
807
821
  # Attempt proxy registration
808
822
  proxy_registration_success = await register_with_proxy(server_url)
@@ -84,7 +84,7 @@ class Config:
84
84
  "transport": {
85
85
  "type": "http",
86
86
  "port": None,
87
- "verify_client": False,
87
+ "verify_client": False,
88
88
  "chk_hostname": False, # Default to False for HTTP
89
89
  },
90
90
  "proxy_registration": {
@@ -13,6 +13,7 @@ email: vasilyvz@gmail.com
13
13
  import asyncio
14
14
  import time
15
15
  import ssl
16
+ import traceback
16
17
  from typing import Dict, Any, Optional, Tuple
17
18
  from pathlib import Path
18
19
  from urllib.parse import urljoin
@@ -248,10 +249,15 @@ class ProxyRegistrationManager:
248
249
  """
249
250
  logger.debug("_create_ssl_context called")
250
251
 
251
- # Check if we're in HTTP mode - if so, don't create SSL context
252
- server_config = self.config.get("server", {})
253
- if server_config.get("protocol", "http").lower() == "http":
254
- logger.debug("HTTP mode detected, skipping SSL context creation")
252
+ # Decide SSL strictly by proxy URL scheme: use SSL only for https proxy URLs
253
+ try:
254
+ from urllib.parse import urlparse as _urlparse
255
+ scheme = _urlparse(self.proxy_url).scheme if self.proxy_url else "http"
256
+ if scheme.lower() != "https":
257
+ logger.debug("Proxy URL is HTTP, skipping SSL context creation for registration")
258
+ return None
259
+ except Exception:
260
+ logger.debug("Failed to parse proxy_url, assuming HTTP and skipping SSL context")
255
261
  return None
256
262
 
257
263
  if not self.client_security:
@@ -440,7 +446,11 @@ class ProxyRegistrationManager:
440
446
 
441
447
  if success:
442
448
  self.registered = True
443
- self.server_key = result.get("server_key")
449
+ # Safely extract server_key from result
450
+ if isinstance(result, dict):
451
+ self.server_key = result.get("server_key")
452
+ else:
453
+ self.server_key = None
444
454
  logger.info(
445
455
  f"✅ Successfully registered with proxy. Server key: {self.server_key}"
446
456
  )
@@ -455,8 +465,65 @@ class ProxyRegistrationManager:
455
465
  else:
456
466
  # Be robust if result is not a dict
457
467
  error_msg = None
468
+ logger.error(f"DEBUG: result type = {type(result)}, result = {result}")
458
469
  if isinstance(result, dict):
459
- error_msg = result.get("error", {}).get("message", "Unknown error")
470
+ logger.error(f"DEBUG: result is dict, getting error field")
471
+ error_field = result.get("error", {})
472
+ logger.error(f"DEBUG: error_field type = {type(error_field)}, error_field = {error_field}")
473
+ if isinstance(error_field, dict):
474
+ error_msg = error_field.get("message", "Unknown error")
475
+ elif isinstance(error_field, str):
476
+ error_msg = error_field
477
+ else:
478
+ error_msg = str(error_field)
479
+
480
+ # Auto-recovery: already registered case → force unregistration then retry once
481
+ error_code = result.get("error_code") or (result.get("error", {}).get("code") if isinstance(result.get("error"), dict) else None)
482
+ already_registered = False
483
+ existing_server_key = None
484
+ # Prefer structured detail if provided
485
+ if isinstance(result.get("details"), dict):
486
+ existing_server_key = result.get("details", {}).get("existing_server_key")
487
+ # Fallback: parse from error message text
488
+ if not existing_server_key and isinstance(error_msg, str) and "already registered as" in error_msg:
489
+ try:
490
+ # Expecting: "... already registered as <server_id>_<copy_number>"
491
+ tail = error_msg.split("already registered as", 1)[1].strip()
492
+ existing_server_key = tail.split()[0]
493
+ except Exception:
494
+ existing_server_key = None
495
+
496
+ if (error_code in ("DUPLICATE_SERVER_URL", "REGISTRATION_ERROR") or already_registered) and existing_server_key:
497
+ try:
498
+ logger.info(f"Attempting auto-unregistration of existing instance: {existing_server_key}")
499
+ # Build unregistration payload using parsed server_key
500
+ try:
501
+ copy_number = int(existing_server_key.split("_")[-1])
502
+ except Exception:
503
+ copy_number = 1
504
+ unregistration_data = {"server_id": self.server_id, "copy_number": copy_number}
505
+ # Reuse secure unregistration request directly
506
+ unreg_success, _unreg_result = await self._make_secure_unregistration_request(unregistration_data)
507
+ if unreg_success:
508
+ logger.info("Auto-unregistration succeeded, retrying registration once...")
509
+ # Retry registration once immediately
510
+ retry_success, retry_result = await self._make_secure_registration_request(registration_data)
511
+ if retry_success:
512
+ self.registered = True
513
+ if isinstance(retry_result, dict):
514
+ self.server_key = retry_result.get("server_key")
515
+ else:
516
+ self.server_key = None
517
+ logger.info(f"✅ Successfully registered after auto-unregistration. Server key: {self.server_key}")
518
+ if self.registration_config.get("heartbeat", {}).get("enabled", True):
519
+ await self._start_heartbeat()
520
+ return True
521
+ else:
522
+ logger.warning(f"Retry registration failed after auto-unregistration: {retry_result}")
523
+ else:
524
+ logger.warning(f"Auto-unregistration failed: {_unreg_result}")
525
+ except Exception as _auto_e:
526
+ logger.warning(f"Auto-unregistration/registration flow error: {_auto_e}")
460
527
  else:
461
528
  error_msg = str(result)
462
529
  logger.warning(
@@ -467,6 +534,7 @@ class ProxyRegistrationManager:
467
534
  logger.error(
468
535
  f"❌ Registration attempt {attempt + 1} failed with exception: {e}"
469
536
  )
537
+ logger.error(f"Full traceback: {traceback.format_exc()}")
470
538
 
471
539
  logger.error(
472
540
  f"❌ Failed to register with proxy after {self.retry_attempts} attempts"
@@ -562,8 +630,10 @@ class ProxyRegistrationManager:
562
630
  ) as response:
563
631
  try:
564
632
  result = await response.json()
565
- except Exception:
633
+ logger.debug(f"Response JSON parsed successfully: {type(result)} - {result}")
634
+ except Exception as e:
566
635
  text_body = await response.text()
636
+ logger.debug(f"JSON parsing failed: {e}, text_body: {text_body}")
567
637
  result = {"success": False, "error": {"code": "NON_JSON_RESPONSE", "message": text_body}}
568
638
 
569
639
  # Validate response headers if security framework available
@@ -604,6 +674,9 @@ class ProxyRegistrationManager:
604
674
  logger.warning(
605
675
  f"Registration failed with HTTP status: {response.status}"
606
676
  )
677
+ # Ensure result is a dict for consistent error handling
678
+ if isinstance(result, str):
679
+ result = {"success": False, "error": {"code": "HTTP_ERROR", "message": result}}
607
680
  return False, result
608
681
  finally:
609
682
  if connector:
@@ -76,7 +76,7 @@ class ConfigBuilder:
76
76
  },
77
77
  "transport": {
78
78
  "type": "http",
79
- "port": None,
79
+ "port": None,
80
80
  "verify_client": False,
81
81
  "chk_hostname": False
82
82
  }
@@ -231,7 +231,7 @@ class ConfigFactory:
231
231
  .set_auth(AuthMethod.TOKEN)
232
232
  .set_server(port=port)
233
233
  .build())
234
-
234
+
235
235
  @staticmethod
236
236
  def create_mtls_token_roles_config(port: int = 8008) -> Dict[str, Any]:
237
237
  """Create mTLS with token and roles configuration."""
@@ -73,11 +73,19 @@ def main():
73
73
  ssl_ca_cert = None
74
74
 
75
75
  if ssl_enabled:
76
- # Configure SSL certificates - use absolute paths
76
+ # Configure SSL certificates from configuration
77
+ ssl_cert_file = config.get("transport.cert_file")
78
+ ssl_key_file = config.get("transport.key_file")
79
+ ssl_ca_cert = config.get("transport.ca_cert")
80
+
81
+ # Convert relative paths to absolute paths
77
82
  project_root = Path(__file__).parent.parent
78
- ssl_cert_file = str(project_root / "certs" / "server_cert.pem")
79
- ssl_key_file = str(project_root / "keys" / "server_key.pem")
80
- ssl_ca_cert = str(project_root / "certs" / "localhost_server.crt")
83
+ if ssl_cert_file and not Path(ssl_cert_file).is_absolute():
84
+ ssl_cert_file = str(project_root / ssl_cert_file)
85
+ if ssl_key_file and not Path(ssl_key_file).is_absolute():
86
+ ssl_key_file = str(project_root / ssl_key_file)
87
+ if ssl_ca_cert and not Path(ssl_ca_cert).is_absolute():
88
+ ssl_ca_cert = str(project_root / ssl_ca_cert)
81
89
 
82
90
  print("🔍 Debug config:")
83
91
  print(f" protocol: {protocol}")
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.6.3"
5
+ __version__ = "6.6.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.6.3
3
+ Version: 6.6.5
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mcp-proxy-adapter"
7
- version = "6.6.3"
7
+ version = "6.6.5"
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"}