mcp-proxy-adapter 6.7.0__tar.gz → 6.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/PKG-INFO +1 -1
  2. mcp_proxy_adapter-6.7.2/mcp_proxy_adapter/core/mtls_proxy.py +181 -0
  3. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/proxy_registration.py +42 -30
  4. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/main.py +50 -5
  5. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/version.py +1 -1
  6. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/PKG-INFO +1 -1
  7. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/SOURCES.txt +2 -0
  8. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/pyproject.toml +1 -1
  9. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/README.md +0 -0
  10. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/__init__.py +0 -0
  11. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/__main__.py +0 -0
  12. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/__init__.py +0 -0
  13. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/app.py +0 -0
  14. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/handlers.py +0 -0
  15. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
  16. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/base.py +0 -0
  17. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -0
  18. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
  19. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/factory.py +0 -0
  20. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
  21. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
  22. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/protocol_middleware.py +0 -0
  23. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -0
  24. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/unified_security.py +0 -0
  25. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -0
  26. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/schemas.py +0 -0
  27. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/tool_integration.py +0 -0
  28. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/api/tools.py +0 -0
  29. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/__init__.py +0 -0
  30. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/auth_validation_command.py +0 -0
  31. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/base.py +0 -0
  32. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/builtin_commands.py +0 -0
  33. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/catalog_manager.py +0 -0
  34. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/cert_monitor_command.py +0 -0
  35. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/certificate_management_command.py +0 -0
  36. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/command_registry.py +0 -0
  37. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/config_command.py +0 -0
  38. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
  39. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/dependency_manager.py +0 -0
  40. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/echo_command.py +0 -0
  41. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/health_command.py +0 -0
  42. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/help_command.py +0 -0
  43. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/hooks.py +0 -0
  44. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/key_management_command.py +0 -0
  45. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/load_command.py +0 -0
  46. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/plugins_command.py +0 -0
  47. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/protocol_management_command.py +0 -0
  48. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/proxy_registration_command.py +0 -0
  49. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/registration_status_command.py +0 -0
  50. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/reload_command.py +0 -0
  51. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/result.py +0 -0
  52. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/role_test_command.py +0 -0
  53. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/roles_management_command.py +0 -0
  54. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/security_command.py +0 -0
  55. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/settings_command.py +0 -0
  56. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/ssl_setup_command.py +0 -0
  57. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/token_management_command.py +0 -0
  58. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/transport_management_command.py +0 -0
  59. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/commands/unload_command.py +0 -0
  60. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/config.py +0 -0
  61. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/__init__.py +0 -0
  62. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/app_factory.py +0 -0
  63. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/app_runner.py +0 -0
  64. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/async_proxy_registration.py +0 -0
  65. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/auth_validator.py +0 -0
  66. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/certificate_utils.py +0 -0
  67. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/client.py +0 -0
  68. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/client_manager.py +0 -0
  69. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/client_security.py +0 -0
  70. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/config_converter.py +0 -0
  71. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/config_validator.py +0 -0
  72. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/crl_utils.py +0 -0
  73. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/errors.py +0 -0
  74. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/logging.py +0 -0
  75. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/mtls_asgi.py +0 -0
  76. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/mtls_asgi_app.py +0 -0
  77. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/mtls_server.py +0 -0
  78. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/protocol_manager.py +0 -0
  79. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/proxy_client.py +0 -0
  80. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/role_utils.py +0 -0
  81. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/security_adapter.py +0 -0
  82. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/security_factory.py +0 -0
  83. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/security_integration.py +0 -0
  84. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/server_adapter.py +0 -0
  85. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/server_engine.py +0 -0
  86. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/settings.py +0 -0
  87. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/signal_handler.py +0 -0
  88. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/ssl_utils.py +0 -0
  89. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/transport_manager.py +0 -0
  90. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/unified_config_adapter.py +0 -0
  91. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/core/utils.py +0 -0
  92. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/custom_openapi.py +0 -0
  93. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/__init__.py +0 -0
  94. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/basic_framework/__init__.py +0 -0
  95. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +0 -0
  96. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +0 -0
  97. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/basic_framework/main.py +0 -0
  98. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/bugfix_certificate_config.py +0 -0
  99. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/cert_manager_bugfix.py +0 -0
  100. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/check_config.py +0 -0
  101. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/commands/__init__.py +0 -0
  102. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/config_builder.py +0 -0
  103. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/config_cli.py +0 -0
  104. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/create_test_configs.py +0 -0
  105. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/debug_request_state.py +0 -0
  106. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/debug_role_chain.py +0 -0
  107. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/demo_client.py +0 -0
  108. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/__init__.py +0 -0
  109. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/commands/__init__.py +0 -0
  110. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -0
  111. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -0
  112. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -0
  113. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -0
  114. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -0
  115. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/main.py +0 -0
  116. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -0
  117. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/generate_certificates.py +0 -0
  118. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/generate_config.py +0 -0
  119. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/proxy_registration_example.py +0 -0
  120. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/required_certificates.py +0 -0
  121. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/run_example.py +0 -0
  122. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/run_full_test_suite.py +0 -0
  123. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/run_proxy_server.py +0 -0
  124. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -0
  125. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/security_test_client.py +0 -0
  126. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/setup_test_environment.py +0 -0
  127. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/simple_protocol_test.py +0 -0
  128. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_chk_hostname_automated.py +0 -0
  129. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_config.py +0 -0
  130. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_config_builder.py +0 -0
  131. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_examples.py +0 -0
  132. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_framework_complete.py +0 -0
  133. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_mcp_server.py +0 -0
  134. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/test_protocol_examples.py +0 -0
  135. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/universal_client.py +0 -0
  136. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/examples/update_config_certificates.py +0 -0
  137. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/openapi.py +0 -0
  138. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/schemas/base_schema.json +0 -0
  139. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/schemas/openapi_schema.json +0 -0
  140. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/schemas/roles.json +0 -0
  141. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter/schemas/roles_schema.json +0 -0
  142. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/dependency_links.txt +0 -0
  143. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/entry_points.txt +0 -0
  144. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/not-zip-safe +0 -0
  145. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/requires.txt +0 -0
  146. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/mcp_proxy_adapter.egg-info/top_level.txt +0 -0
  147. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/setup.cfg +0 -0
  148. {mcp_proxy_adapter-6.7.0 → mcp_proxy_adapter-6.7.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.7.0
3
+ Version: 6.7.2
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
@@ -0,0 +1,181 @@
1
+ """
2
+ mTLS Proxy for MCP Proxy Adapter
3
+
4
+ This module provides mTLS proxy functionality that accepts mTLS connections
5
+ and proxies them to the internal hypercorn server.
6
+
7
+ Author: Vasiliy Zdanovskiy
8
+ email: vasilyvz@gmail.com
9
+ """
10
+
11
+ import asyncio
12
+ import ssl
13
+ import logging
14
+ from typing import Optional, Dict, Any
15
+ from pathlib import Path
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class MTLSProxy:
21
+ """
22
+ mTLS Proxy that accepts mTLS connections and proxies them to internal server.
23
+ """
24
+
25
+ def __init__(self,
26
+ external_host: str,
27
+ external_port: int,
28
+ internal_host: str = "127.0.0.1",
29
+ internal_port: int = 9000,
30
+ cert_file: Optional[str] = None,
31
+ key_file: Optional[str] = None,
32
+ ca_cert: Optional[str] = None):
33
+ """
34
+ Initialize mTLS Proxy.
35
+
36
+ Args:
37
+ external_host: External host to bind to
38
+ external_port: External port to bind to
39
+ internal_host: Internal server host
40
+ internal_port: Internal server port
41
+ cert_file: Server certificate file
42
+ key_file: Server private key file
43
+ ca_cert: CA certificate file for client verification
44
+ """
45
+ self.external_host = external_host
46
+ self.external_port = external_port
47
+ self.internal_host = internal_host
48
+ self.internal_port = internal_port
49
+ self.cert_file = cert_file
50
+ self.key_file = key_file
51
+ self.ca_cert = ca_cert
52
+ self.server = None
53
+
54
+ async def start(self):
55
+ """Start the mTLS proxy server."""
56
+ try:
57
+ # Create SSL context
58
+ ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
59
+ ssl_context.load_cert_chain(self.cert_file, self.key_file)
60
+
61
+ if self.ca_cert:
62
+ ssl_context.load_verify_locations(self.ca_cert)
63
+ ssl_context.verify_mode = ssl.CERT_REQUIRED
64
+ else:
65
+ ssl_context.verify_mode = ssl.CERT_NONE
66
+
67
+ # Start server
68
+ self.server = await asyncio.start_server(
69
+ self._handle_client,
70
+ self.external_host,
71
+ self.external_port,
72
+ ssl=ssl_context
73
+ )
74
+
75
+ logger.info(f"🔐 mTLS Proxy started on {self.external_host}:{self.external_port}")
76
+ logger.info(f"🌐 Proxying to {self.internal_host}:{self.internal_port}")
77
+
78
+ except Exception as e:
79
+ logger.error(f"❌ Failed to start mTLS proxy: {e}")
80
+ raise
81
+
82
+ async def stop(self):
83
+ """Stop the mTLS proxy server."""
84
+ if self.server:
85
+ self.server.close()
86
+ await self.server.wait_closed()
87
+ logger.info("🔐 mTLS Proxy stopped")
88
+
89
+ async def _handle_client(self, reader, writer):
90
+ """Handle client connection."""
91
+ try:
92
+ # Get client address
93
+ client_addr = writer.get_extra_info('peername')
94
+ logger.info(f"🔐 mTLS connection from {client_addr}")
95
+
96
+ # Connect to internal server
97
+ internal_reader, internal_writer = await asyncio.open_connection(
98
+ self.internal_host, self.internal_port
99
+ )
100
+
101
+ # Create bidirectional proxy
102
+ await asyncio.gather(
103
+ self._proxy_data(reader, internal_writer, "client->server"),
104
+ self._proxy_data(internal_reader, writer, "server->client")
105
+ )
106
+
107
+ except Exception as e:
108
+ logger.error(f"❌ Error handling client connection: {e}")
109
+ finally:
110
+ try:
111
+ writer.close()
112
+ await writer.wait_closed()
113
+ except:
114
+ pass
115
+
116
+ async def _proxy_data(self, reader, writer, direction):
117
+ """Proxy data between reader and writer."""
118
+ try:
119
+ while True:
120
+ data = await reader.read(4096)
121
+ if not data:
122
+ break
123
+ writer.write(data)
124
+ await writer.drain()
125
+ except Exception as e:
126
+ logger.debug(f"Proxy connection closed ({direction}): {e}")
127
+ finally:
128
+ try:
129
+ writer.close()
130
+ await writer.wait_closed()
131
+ except:
132
+ pass
133
+
134
+
135
+ async def start_mtls_proxy(config: Dict[str, Any]) -> Optional[MTLSProxy]:
136
+ """
137
+ Start mTLS proxy based on configuration.
138
+
139
+ Args:
140
+ config: Application configuration
141
+
142
+ Returns:
143
+ MTLSProxy instance if started, None otherwise
144
+ """
145
+ # Check if mTLS is enabled
146
+ protocol = config.get("server", {}).get("protocol", "http")
147
+ verify_client = config.get("transport", {}).get("verify_client", False)
148
+
149
+ # Only start mTLS proxy if mTLS is explicitly enabled
150
+ if protocol != "mtls" and not verify_client:
151
+ logger.info("🌐 Regular mode: no mTLS proxy needed")
152
+ return None
153
+
154
+ # Get configuration
155
+ server_config = config.get("server", {})
156
+ transport_config = config.get("transport", {})
157
+
158
+ external_host = server_config.get("host", "0.0.0.0")
159
+ external_port = server_config.get("port", 8000)
160
+ internal_port = external_port + 1000 # Internal port
161
+
162
+ cert_file = transport_config.get("cert_file")
163
+ key_file = transport_config.get("key_file")
164
+ ca_cert = transport_config.get("ca_cert")
165
+
166
+ if not cert_file or not key_file:
167
+ logger.warning("⚠️ mTLS enabled but certificates not configured")
168
+ return None
169
+
170
+ # Create and start proxy
171
+ proxy = MTLSProxy(
172
+ external_host=external_host,
173
+ external_port=external_port,
174
+ internal_port=internal_port,
175
+ cert_file=cert_file,
176
+ key_file=key_file,
177
+ ca_cert=ca_cert
178
+ )
179
+
180
+ await proxy.start()
181
+ return proxy
@@ -132,40 +132,43 @@ class ProxyRegistrationManager:
132
132
  # Heartbeat settings - only validate if enabled
133
133
  if self.enabled:
134
134
  heartbeat_config = self.registration_config.get("heartbeat", {})
135
- self.timeout = heartbeat_config.get("timeout")
136
- if self.timeout is None:
137
- raise ValueError(
138
- "heartbeat.timeout is required in registration configuration. "
139
- "Please specify a timeout value."
140
- )
141
- self.retry_attempts = heartbeat_config.get("retry_attempts")
142
- if self.retry_attempts is None:
143
- raise ValueError(
144
- "heartbeat.retry_attempts is required in registration configuration. "
145
- "Please specify a retry_attempts value."
146
- )
135
+ heartbeat_enabled = heartbeat_config.get("enabled", True)
136
+
137
+ if heartbeat_enabled:
138
+ self.timeout = heartbeat_config.get("timeout")
139
+ if self.timeout is None:
140
+ raise ValueError(
141
+ "heartbeat.timeout is required in registration configuration. "
142
+ "Please specify a timeout value."
143
+ )
144
+ self.retry_attempts = heartbeat_config.get("retry_attempts")
145
+ if self.retry_attempts is None:
146
+ raise ValueError(
147
+ "heartbeat.retry_attempts is required in registration configuration. "
148
+ "Please specify a retry_attempts value."
149
+ )
150
+ self.retry_delay = heartbeat_config.get("retry_delay")
151
+ if self.retry_delay is None:
152
+ raise ValueError(
153
+ "heartbeat.retry_delay is required in registration configuration. "
154
+ "Please specify a retry_delay value."
155
+ )
156
+ self.heartbeat_interval = heartbeat_config.get("interval")
157
+ if self.heartbeat_interval is None:
158
+ raise ValueError(
159
+ "heartbeat.interval is required in registration configuration. "
160
+ "Please specify an interval value."
161
+ )
162
+ else:
163
+ # Heartbeat disabled - use defaults
164
+ self.timeout = heartbeat_config.get("timeout", 30)
165
+ self.retry_attempts = heartbeat_config.get("retry_attempts", 3)
166
+ self.retry_delay = heartbeat_config.get("retry_delay", 5)
167
+ self.heartbeat_interval = heartbeat_config.get("interval", 30)
147
168
  else:
148
169
  self.timeout = None
149
170
  self.retry_attempts = None
150
-
151
- if self.enabled:
152
- self.retry_delay = heartbeat_config.get("retry_delay")
153
- if self.retry_delay is None:
154
- raise ValueError(
155
- "heartbeat.retry_delay is required in registration configuration. "
156
- "Please specify a retry_delay value."
157
- )
158
- else:
159
171
  self.retry_delay = None
160
-
161
- if self.enabled:
162
- self.heartbeat_interval = heartbeat_config.get("interval")
163
- if self.heartbeat_interval is None:
164
- raise ValueError(
165
- "heartbeat.interval is required in registration configuration. "
166
- "Please specify an interval value."
167
- )
168
- else:
169
172
  self.heartbeat_interval = None
170
173
 
171
174
  # Auto registration settings
@@ -782,6 +785,15 @@ class ProxyRegistrationManager:
782
785
  except Exception as e:
783
786
  logger.error(f"Heartbeat error: {e}")
784
787
 
788
+ async def heartbeat(self) -> bool:
789
+ """
790
+ Public method to send heartbeat to proxy server.
791
+
792
+ Returns:
793
+ True if heartbeat was successful, False otherwise.
794
+ """
795
+ return await self._send_heartbeat()
796
+
785
797
  async def _send_heartbeat(self) -> bool:
786
798
  """Send heartbeat to proxy server."""
787
799
  if not self.server_key:
@@ -89,8 +89,23 @@ def main():
89
89
  verify_client = config.get("transport.verify_client", False)
90
90
  chk_hostname = config.get("transport.chk_hostname", False)
91
91
 
92
- # SSL enabled if protocol is HTTPS or mTLS (verify_client=True)
93
- ssl_enabled = protocol in ["https", "mtls"] or verify_client
92
+ # Check if mTLS is required
93
+ is_mtls_mode = protocol == "mtls" or verify_client
94
+
95
+ if is_mtls_mode:
96
+ # mTLS mode: hypercorn on localhost, mTLS proxy on external port
97
+ hypercorn_host = "127.0.0.1" # localhost only
98
+ hypercorn_port = port + 1000 # internal port
99
+ mtls_proxy_port = port # external port
100
+ ssl_enabled = True
101
+ print(f"🔐 mTLS Mode: hypercorn on {hypercorn_host}:{hypercorn_port}, mTLS proxy on {host}:{mtls_proxy_port}")
102
+ else:
103
+ # Regular mode: hypercorn on external port (no proxy needed)
104
+ hypercorn_host = host
105
+ hypercorn_port = port
106
+ mtls_proxy_port = None
107
+ ssl_enabled = protocol == "https"
108
+ print(f"🌐 Regular Mode: hypercorn on {hypercorn_host}:{hypercorn_port}")
94
109
 
95
110
  # SSL configuration based on protocol
96
111
  ssl_cert_file = None
@@ -118,7 +133,11 @@ def main():
118
133
  print("🔍 Source: configuration")
119
134
 
120
135
  print("🚀 Starting MCP Proxy Adapter")
121
- print(f"🌐 Server: {host}:{port}")
136
+ if mtls_proxy_port:
137
+ print(f"🔐 mTLS Proxy: {host}:{mtls_proxy_port}")
138
+ print(f"🌐 Internal Server: {hypercorn_host}:{hypercorn_port}")
139
+ else:
140
+ print(f"🌐 Server: {hypercorn_host}:{hypercorn_port}")
122
141
  print(f"🔒 Protocol: {protocol}")
123
142
  if ssl_enabled:
124
143
  print("🔐 SSL: Enabled")
@@ -131,7 +150,7 @@ def main():
131
150
 
132
151
  # Configure hypercorn using framework
133
152
  config_hypercorn = hypercorn.config.Config()
134
- config_hypercorn.bind = [f"{host}:{port}"]
153
+ config_hypercorn.bind = [f"{hypercorn_host}:{hypercorn_port}"]
135
154
 
136
155
  if ssl_enabled and ssl_cert_file and ssl_key_file:
137
156
  # Use framework to convert SSL configuration
@@ -201,7 +220,33 @@ def main():
201
220
 
202
221
  # Run the server
203
222
  try:
204
- asyncio.run(hypercorn.asyncio.serve(app, config_hypercorn))
223
+ if is_mtls_mode:
224
+ # mTLS mode: start hypercorn and mTLS proxy
225
+ print("🔐 Starting mTLS mode with proxy...")
226
+
227
+ async def run_mtls_mode():
228
+ # Start hypercorn server on localhost
229
+ hypercorn_task = asyncio.create_task(
230
+ hypercorn.asyncio.serve(app, config_hypercorn)
231
+ )
232
+
233
+ # Start mTLS proxy on external port
234
+ from mcp_proxy_adapter.core.mtls_proxy import start_mtls_proxy
235
+ proxy = await start_mtls_proxy(config.get_all())
236
+
237
+ if proxy:
238
+ print("✅ mTLS proxy started successfully")
239
+ else:
240
+ print("⚠️ mTLS proxy not started, running hypercorn only")
241
+
242
+ # Wait for hypercorn
243
+ await hypercorn_task
244
+
245
+ asyncio.run(run_mtls_mode())
246
+ else:
247
+ # Regular mode: start hypercorn only (no proxy needed)
248
+ print("🌐 Starting regular mode...")
249
+ asyncio.run(hypercorn.asyncio.serve(app, config_hypercorn))
205
250
  except KeyboardInterrupt:
206
251
  print("\n🛑 Server stopped by user (Ctrl+C)")
207
252
  if is_shutdown_requested():
@@ -2,4 +2,4 @@
2
2
  Version information for MCP Proxy Adapter.
3
3
  """
4
4
 
5
- __version__ = "6.7.0"
5
+ __version__ = "6.7.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-proxy-adapter
3
- Version: 6.7.0
3
+ Version: 6.7.2
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
@@ -72,6 +72,7 @@ setup.py
72
72
  ./mcp_proxy_adapter/core/logging.py
73
73
  ./mcp_proxy_adapter/core/mtls_asgi.py
74
74
  ./mcp_proxy_adapter/core/mtls_asgi_app.py
75
+ ./mcp_proxy_adapter/core/mtls_proxy.py
75
76
  ./mcp_proxy_adapter/core/mtls_server.py
76
77
  ./mcp_proxy_adapter/core/protocol_manager.py
77
78
  ./mcp_proxy_adapter/core/proxy_client.py
@@ -214,6 +215,7 @@ mcp_proxy_adapter/core/errors.py
214
215
  mcp_proxy_adapter/core/logging.py
215
216
  mcp_proxy_adapter/core/mtls_asgi.py
216
217
  mcp_proxy_adapter/core/mtls_asgi_app.py
218
+ mcp_proxy_adapter/core/mtls_proxy.py
217
219
  mcp_proxy_adapter/core/mtls_server.py
218
220
  mcp_proxy_adapter/core/protocol_manager.py
219
221
  mcp_proxy_adapter/core/proxy_client.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mcp-proxy-adapter"
7
- version = "6.7.0"
7
+ version = "6.7.2"
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"}