mcp-proxy-adapter 6.4.9__tar.gz → 6.4.11__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.4.11/PKG-INFO +156 -0
  2. mcp_proxy_adapter-6.4.11/README.md +97 -0
  3. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/app.py +7 -8
  4. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/protocol_middleware.py +19 -86
  5. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/run_full_test_suite.py +122 -0
  6. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/setup_test_environment.py +12 -11
  7. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/version.py +1 -1
  8. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/PKG-INFO +156 -0
  9. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter.egg-info/SOURCES.txt +8 -11
  10. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/dependency_links.txt +1 -0
  11. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/entry_points.txt +2 -0
  12. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/not-zip-safe +1 -0
  13. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/requires.txt +27 -0
  14. mcp_proxy_adapter-6.4.11/mcp_proxy_adapter.egg-info/top_level.txt +1 -0
  15. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/pyproject.toml +2 -6
  16. mcp_proxy_adapter-6.4.11/setup.py +111 -0
  17. mcp_proxy_adapter-6.4.9/MANIFEST.in +0 -40
  18. mcp_proxy_adapter-6.4.9/PKG-INFO +0 -680
  19. mcp_proxy_adapter-6.4.9/README.md +0 -621
  20. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/examples/basic_framework/roles.json +0 -21
  21. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/examples/full_application/roles.json +0 -21
  22. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/examples/generate_comprehensive_config.py +0 -177
  23. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/examples/test_mcp_adapter.py +0 -207
  24. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/schemas/base_schema.json +0 -114
  25. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
  26. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter/utils/config_generator.py +0 -1167
  27. mcp_proxy_adapter-6.4.9/mcp_proxy_adapter_issue_package/demonstrate_issue.py +0 -208
  28. mcp_proxy_adapter-6.4.9/requirements.txt +0 -8
  29. mcp_proxy_adapter-6.4.9/setup.py +0 -624
  30. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/__init__.py +0 -0
  31. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/__main__.py +0 -0
  32. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/__init__.py +0 -0
  33. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/handlers.py +0 -0
  34. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/__init__.py +0 -0
  35. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/base.py +0 -0
  36. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/command_permission_middleware.py +0 -0
  37. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/error_handling.py +0 -0
  38. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/factory.py +0 -0
  39. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/logging.py +0 -0
  40. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/performance.py +0 -0
  41. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/transport_middleware.py +0 -0
  42. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/unified_security.py +0 -0
  43. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/middleware/user_info_middleware.py +0 -0
  44. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/schemas.py +0 -0
  45. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/tool_integration.py +0 -0
  46. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/api/tools.py +0 -0
  47. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/__init__.py +0 -0
  48. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/auth_validation_command.py +0 -0
  49. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/base.py +0 -0
  50. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/builtin_commands.py +0 -0
  51. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/catalog_manager.py +0 -0
  52. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/cert_monitor_command.py +0 -0
  53. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/certificate_management_command.py +0 -0
  54. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/command_registry.py +0 -0
  55. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/config_command.py +0 -0
  56. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/dependency_container.py +0 -0
  57. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/dependency_manager.py +0 -0
  58. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/echo_command.py +0 -0
  59. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/health_command.py +0 -0
  60. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/help_command.py +0 -0
  61. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/hooks.py +0 -0
  62. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/key_management_command.py +0 -0
  63. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/load_command.py +0 -0
  64. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/plugins_command.py +0 -0
  65. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/protocol_management_command.py +0 -0
  66. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/proxy_registration_command.py +0 -0
  67. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/reload_command.py +0 -0
  68. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/result.py +0 -0
  69. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/role_test_command.py +0 -0
  70. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/roles_management_command.py +0 -0
  71. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/security_command.py +0 -0
  72. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/settings_command.py +0 -0
  73. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/ssl_setup_command.py +0 -0
  74. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/token_management_command.py +0 -0
  75. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/transport_management_command.py +0 -0
  76. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/commands/unload_command.py +0 -0
  77. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/config.py +0 -0
  78. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/__init__.py +0 -0
  79. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/app_factory.py +0 -0
  80. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/app_runner.py +0 -0
  81. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/auth_validator.py +0 -0
  82. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/certificate_utils.py +0 -0
  83. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/client.py +0 -0
  84. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/client_manager.py +0 -0
  85. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/client_security.py +0 -0
  86. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/config_converter.py +0 -0
  87. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/config_validator.py +0 -0
  88. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/crl_utils.py +0 -0
  89. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/errors.py +0 -0
  90. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/logging.py +0 -0
  91. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/mtls_asgi.py +0 -0
  92. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/mtls_asgi_app.py +0 -0
  93. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/protocol_manager.py +0 -0
  94. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/proxy_client.py +0 -0
  95. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/proxy_registration.py +0 -0
  96. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/role_utils.py +0 -0
  97. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/security_adapter.py +0 -0
  98. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/security_factory.py +0 -0
  99. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/security_integration.py +0 -0
  100. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/server_adapter.py +0 -0
  101. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/server_engine.py +0 -0
  102. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/settings.py +0 -0
  103. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/ssl_utils.py +0 -0
  104. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/transport_manager.py +0 -0
  105. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/unified_config_adapter.py +0 -0
  106. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/core/utils.py +0 -0
  107. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/custom_openapi.py +0 -0
  108. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/__init__.py +0 -0
  109. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/basic_framework/__init__.py +0 -0
  110. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +0 -0
  111. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +0 -0
  112. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/basic_framework/main.py +0 -0
  113. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/commands/__init__.py +0 -0
  114. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/create_certificates_simple.py +0 -0
  115. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/debug_request_state.py +0 -0
  116. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/debug_role_chain.py +0 -0
  117. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/demo_client.py +0 -0
  118. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/basic_framework/__init__.py +0 -0
  119. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/basic_framework/commands/__init__.py +0 -0
  120. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/basic_framework/hooks/__init__.py +0 -0
  121. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/basic_framework/main.py +0 -0
  122. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/__init__.py +0 -0
  123. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/commands/__init__.py +0 -0
  124. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/commands/custom_echo_command.py +0 -0
  125. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/commands/dynamic_calculator_command.py +0 -0
  126. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/hooks/__init__.py +0 -0
  127. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/hooks/application_hooks.py +0 -0
  128. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/hooks/builtin_command_hooks.py +0 -0
  129. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/main.py +0 -0
  130. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/examples/full_application/proxy_endpoints.py +0 -0
  131. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/__init__.py +0 -0
  132. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/commands/__init__.py +0 -0
  133. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +0 -0
  134. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +0 -0
  135. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/hooks/__init__.py +0 -0
  136. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +0 -0
  137. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +0 -0
  138. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/main.py +0 -0
  139. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +0 -0
  140. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/generate_all_certificates.py +0 -0
  141. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/generate_certificates.py +0 -0
  142. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/generate_certificates_and_tokens.py +0 -0
  143. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/generate_test_configs.py +0 -0
  144. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/proxy_registration_example.py +0 -0
  145. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/run_example.py +0 -0
  146. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/run_proxy_server.py +0 -0
  147. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/run_security_tests.py +0 -0
  148. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/run_security_tests_fixed.py +0 -0
  149. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/scripts/config_generator.py +0 -0
  150. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/scripts/create_certificates_simple.py +0 -0
  151. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/scripts/generate_certificates_and_tokens.py +0 -0
  152. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/security_test_client.py +0 -0
  153. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/test_config.py +0 -0
  154. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/test_config_generator.py +0 -0
  155. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/test_examples.py +0 -0
  156. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/examples/universal_client.py +0 -0
  157. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/main.py +0 -0
  158. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/mcp_proxy_adapter/openapi.py +0 -0
  159. {mcp_proxy_adapter-6.4.9 → mcp_proxy_adapter-6.4.11}/setup.cfg +0 -0
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-proxy-adapter
3
+ Version: 6.4.11
4
+ Summary: Powerful JSON-RPC microservices framework with built-in security, authentication, and proxy registration
5
+ Home-page: https://github.com/maverikod/mcp-proxy-adapter
6
+ Author: Vasiliy Zdanovskiy
7
+ Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
8
+ Maintainer: Vasiliy Zdanovskiy
9
+ Maintainer-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
10
+ License: MIT
11
+ Project-URL: Homepage, https://github.com/maverikod/mcp-proxy-adapter
12
+ Project-URL: Documentation, https://github.com/maverikod/mcp-proxy-adapter#readme
13
+ Project-URL: Source, https://github.com/maverikod/mcp-proxy-adapter
14
+ Project-URL: Tracker, https://github.com/maverikod/mcp-proxy-adapter/issues
15
+ Project-URL: PyPI, https://pypi.org/project/mcp-proxy-adapter/
16
+ Keywords: json-rpc,microservices,fastapi,security,authentication,authorization,proxy,mcp,mtls,ssl,rest,api
17
+ Classifier: Development Status :: 4 - Beta
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Framework :: FastAPI
26
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
27
+ Classifier: Topic :: Security
28
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
+ Requires-Python: >=3.9
30
+ Description-Content-Type: text/markdown
31
+ Requires-Dist: fastapi<1.0.0,>=0.95.0
32
+ Requires-Dist: pydantic>=2.0.0
33
+ Requires-Dist: hypercorn<1.0.0,>=0.15.0
34
+ Requires-Dist: docstring-parser<1.0.0,>=0.15
35
+ Requires-Dist: typing-extensions<5.0.0,>=4.5.0
36
+ Requires-Dist: jsonrpc>=1.2.0
37
+ Requires-Dist: psutil>=5.9.0
38
+ Requires-Dist: mcp_security_framework>=1.1.2
39
+ Requires-Dist: packaging>=20.0
40
+ Requires-Dist: aiohttp<4.0.0,>=3.8.0
41
+ Requires-Dist: requests<3.0.0,>=2.28.0
42
+ Provides-Extra: dev
43
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
44
+ Requires-Dist: pytest-asyncio>=0.20.0; extra == "dev"
45
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
46
+ Requires-Dist: black>=23.0.0; extra == "dev"
47
+ Requires-Dist: isort>=5.12.0; extra == "dev"
48
+ Provides-Extra: test
49
+ Requires-Dist: pytest>=7.0.0; extra == "test"
50
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
51
+ Requires-Dist: pytest-cov>=4.0.0; extra == "test"
52
+ Requires-Dist: httpx>=0.24.0; extra == "test"
53
+ Requires-Dist: pytest-mock>=3.10.0; extra == "test"
54
+ Provides-Extra: examples
55
+ Dynamic: author
56
+ Dynamic: home-page
57
+ Dynamic: maintainer
58
+ Dynamic: requires-python
59
+
60
+ # MCP Proxy Adapter
61
+
62
+ **Author:** Vasiliy Zdanovskiy
63
+ **Email:** vasilyvz@gmail.com
64
+
65
+ ## Overview
66
+
67
+ MCP Proxy Adapter is a comprehensive framework for building JSON-RPC API servers with built-in security, SSL/TLS support, and proxy registration capabilities. It provides a unified interface for command execution, protocol management, and security enforcement.
68
+
69
+ ## Features
70
+
71
+ - **JSON-RPC API**: Full JSON-RPC 2.0 support with built-in commands
72
+ - **Security Framework**: Integrated authentication, authorization, and SSL/TLS
73
+ - **Protocol Management**: HTTP, HTTPS, and mTLS protocol support
74
+ - **Proxy Registration**: Automatic registration with proxy servers
75
+ - **Command System**: Extensible command registry with built-in commands
76
+ - **Configuration Management**: Comprehensive configuration with environment variable overrides
77
+
78
+ ## Quick Start
79
+
80
+ 1. **Installation**:
81
+ ```bash
82
+ pip install mcp-proxy-adapter
83
+ ```
84
+
85
+ 2. **Basic Configuration**:
86
+ ```bash
87
+ # Use the comprehensive config with all options disabled by default
88
+ python -m mcp_proxy_adapter --config config.json
89
+ ```
90
+
91
+ 3. **Access the API**:
92
+ - Health check: `GET http://localhost:8000/health`
93
+ - JSON-RPC: `POST http://localhost:8000/api/jsonrpc`
94
+ - REST API: `POST http://localhost:8000/cmd`
95
+ - Documentation: `http://localhost:8000/docs`
96
+
97
+ ## Configuration
98
+
99
+ The adapter uses a comprehensive JSON configuration file (`config.json`) that includes all available options with sensible defaults. All features are disabled by default and can be enabled as needed:
100
+
101
+ - **Server settings**: Host, port, debug mode
102
+ - **Security**: Authentication methods, SSL/TLS, permissions
103
+ - **Protocols**: HTTP/HTTPS/mTLS configuration
104
+ - **Proxy registration**: Automatic server registration
105
+ - **Logging**: Comprehensive logging configuration
106
+ - **Commands**: Built-in and custom command management
107
+
108
+ See `docs/EN/configuration.md` for complete configuration documentation.
109
+
110
+ ## Built-in Commands
111
+
112
+ - `health` - Server health check
113
+ - `echo` - Echo test command
114
+ - `config` - Configuration management
115
+ - `help` - Command help and documentation
116
+ - `reload` - Configuration reload
117
+ - `settings` - Settings management
118
+ - `load`/`unload` - Command loading/unloading
119
+ - `plugins` - Plugin management
120
+ - `proxy_registration` - Proxy registration control
121
+ - `transport_management` - Transport protocol management
122
+ - `role_test` - Role-based access testing
123
+
124
+ ## Security Features
125
+
126
+ - **Authentication**: API keys, JWT tokens, certificate-based auth
127
+ - **Authorization**: Role-based permissions with wildcard support
128
+ - **SSL/TLS**: Full SSL/TLS and mTLS support
129
+ - **Rate Limiting**: Configurable request rate limiting
130
+ - **Security Headers**: Automatic security header injection
131
+
132
+ ## Examples
133
+
134
+ The `mcp_proxy_adapter/examples/` directory contains comprehensive examples for different use cases:
135
+
136
+ - **Basic Framework**: Simple HTTP server setup
137
+ - **Full Application**: Complete application with custom commands and hooks
138
+ - **Security Testing**: Comprehensive security test suite
139
+ - **Certificate Generation**: SSL/TLS certificate management
140
+
141
+ ## Development
142
+
143
+ The project follows a modular architecture:
144
+
145
+ - `mcp_proxy_adapter/api/` - FastAPI application and handlers
146
+ - `mcp_proxy_adapter/commands/` - Command system and built-in commands
147
+ - `mcp_proxy_adapter/core/` - Core functionality and utilities
148
+ - `mcp_proxy_adapter/config.py` - Configuration management
149
+
150
+ ## License
151
+
152
+ This project is licensed under the MIT License.
153
+
154
+ ## Support
155
+
156
+ For issues and questions, please contact vasilyvz@gmail.com.
@@ -0,0 +1,97 @@
1
+ # MCP Proxy Adapter
2
+
3
+ **Author:** Vasiliy Zdanovskiy
4
+ **Email:** vasilyvz@gmail.com
5
+
6
+ ## Overview
7
+
8
+ MCP Proxy Adapter is a comprehensive framework for building JSON-RPC API servers with built-in security, SSL/TLS support, and proxy registration capabilities. It provides a unified interface for command execution, protocol management, and security enforcement.
9
+
10
+ ## Features
11
+
12
+ - **JSON-RPC API**: Full JSON-RPC 2.0 support with built-in commands
13
+ - **Security Framework**: Integrated authentication, authorization, and SSL/TLS
14
+ - **Protocol Management**: HTTP, HTTPS, and mTLS protocol support
15
+ - **Proxy Registration**: Automatic registration with proxy servers
16
+ - **Command System**: Extensible command registry with built-in commands
17
+ - **Configuration Management**: Comprehensive configuration with environment variable overrides
18
+
19
+ ## Quick Start
20
+
21
+ 1. **Installation**:
22
+ ```bash
23
+ pip install mcp-proxy-adapter
24
+ ```
25
+
26
+ 2. **Basic Configuration**:
27
+ ```bash
28
+ # Use the comprehensive config with all options disabled by default
29
+ python -m mcp_proxy_adapter --config config.json
30
+ ```
31
+
32
+ 3. **Access the API**:
33
+ - Health check: `GET http://localhost:8000/health`
34
+ - JSON-RPC: `POST http://localhost:8000/api/jsonrpc`
35
+ - REST API: `POST http://localhost:8000/cmd`
36
+ - Documentation: `http://localhost:8000/docs`
37
+
38
+ ## Configuration
39
+
40
+ The adapter uses a comprehensive JSON configuration file (`config.json`) that includes all available options with sensible defaults. All features are disabled by default and can be enabled as needed:
41
+
42
+ - **Server settings**: Host, port, debug mode
43
+ - **Security**: Authentication methods, SSL/TLS, permissions
44
+ - **Protocols**: HTTP/HTTPS/mTLS configuration
45
+ - **Proxy registration**: Automatic server registration
46
+ - **Logging**: Comprehensive logging configuration
47
+ - **Commands**: Built-in and custom command management
48
+
49
+ See `docs/EN/configuration.md` for complete configuration documentation.
50
+
51
+ ## Built-in Commands
52
+
53
+ - `health` - Server health check
54
+ - `echo` - Echo test command
55
+ - `config` - Configuration management
56
+ - `help` - Command help and documentation
57
+ - `reload` - Configuration reload
58
+ - `settings` - Settings management
59
+ - `load`/`unload` - Command loading/unloading
60
+ - `plugins` - Plugin management
61
+ - `proxy_registration` - Proxy registration control
62
+ - `transport_management` - Transport protocol management
63
+ - `role_test` - Role-based access testing
64
+
65
+ ## Security Features
66
+
67
+ - **Authentication**: API keys, JWT tokens, certificate-based auth
68
+ - **Authorization**: Role-based permissions with wildcard support
69
+ - **SSL/TLS**: Full SSL/TLS and mTLS support
70
+ - **Rate Limiting**: Configurable request rate limiting
71
+ - **Security Headers**: Automatic security header injection
72
+
73
+ ## Examples
74
+
75
+ The `mcp_proxy_adapter/examples/` directory contains comprehensive examples for different use cases:
76
+
77
+ - **Basic Framework**: Simple HTTP server setup
78
+ - **Full Application**: Complete application with custom commands and hooks
79
+ - **Security Testing**: Comprehensive security test suite
80
+ - **Certificate Generation**: SSL/TLS certificate management
81
+
82
+ ## Development
83
+
84
+ The project follows a modular architecture:
85
+
86
+ - `mcp_proxy_adapter/api/` - FastAPI application and handlers
87
+ - `mcp_proxy_adapter/commands/` - Command system and built-in commands
88
+ - `mcp_proxy_adapter/core/` - Core functionality and utilities
89
+ - `mcp_proxy_adapter/config.py` - Configuration management
90
+
91
+ ## License
92
+
93
+ This project is licensed under the MIT License.
94
+
95
+ ## Support
96
+
97
+ For issues and questions, please contact vasilyvz@gmail.com.
@@ -169,7 +169,7 @@ def create_lifespan(config_path: Optional[str] = None):
169
169
  except Exception:
170
170
  pass
171
171
 
172
- logger.info("🔍 Registration server_url resolved to: %s", server_url)
172
+ logger.debug("Registration server_url resolved to: %s", server_url)
173
173
  try:
174
174
  print("🔍 Registration server_url resolved to (print):", server_url)
175
175
  except Exception:
@@ -499,11 +499,11 @@ def create_app(
499
499
  # This ensures commands are available before the server starts accepting requests
500
500
  try:
501
501
  from mcp_proxy_adapter.commands.builtin_commands import register_builtin_commands
502
- logger.info("🔧 Registering built-in commands during app creation...")
502
+ logger.info("Registering built-in commands during app creation...")
503
503
  registered_count = register_builtin_commands()
504
- logger.info(f"Registered {registered_count} built-in commands during app creation")
504
+ logger.info(f"Registered {registered_count} built-in commands during app creation")
505
505
  except Exception as e:
506
- logger.error(f"Failed to register built-in commands during app creation: {e}")
506
+ logger.error(f"Failed to register built-in commands during app creation: {e}")
507
507
  # Don't fail app creation, but log the error
508
508
 
509
509
  # Configure CORS
@@ -518,14 +518,13 @@ def create_app(
518
518
  # Add request logging middleware for debugging
519
519
  @app.middleware("http")
520
520
  async def debug_request_middleware(request: Request, call_next):
521
- logger.info(f"🔍 FastAPI Request START: {request.method} {request.url.path}")
522
- logger.info(f"🔍 FastAPI Request Headers: {dict(request.headers)}")
521
+ logger.debug(f"FastAPI Request START: {request.method} {request.url.path}")
523
522
  try:
524
523
  response = await call_next(request)
525
- logger.info(f"🔍 FastAPI Request COMPLETED: {response.status_code}")
524
+ logger.debug(f"FastAPI Request COMPLETED: {response.status_code}")
526
525
  return response
527
526
  except Exception as e:
528
- logger.error(f"🔍 FastAPI Request ERROR: {e}", exc_info=True)
527
+ logger.error(f"FastAPI Request ERROR: {e}", exc_info=True)
529
528
  raise
530
529
 
531
530
  # Setup middleware using the new middleware package
@@ -97,26 +97,19 @@ class ProtocolMiddleware(BaseHTTPMiddleware):
97
97
  Returns:
98
98
  Response object
99
99
  """
100
- logger.info(f"🔍 PROTOCOL STEP 1: ProtocolMiddleware.dispatch START - {request.method} {request.url.path}")
101
- logger.info(f"🔍 PROTOCOL STEP 1.1: Request scheme: {request.url.scheme}")
102
- logger.info(f"🔍 PROTOCOL STEP 1.2: Request headers: {dict(request.headers)}")
103
- logger.info(f"🔍 PROTOCOL STEP 1.3: Request scope: {request.scope}")
104
- logger.info(f"🔍 PROTOCOL STEP 1.4: Protocol manager enabled: {self.protocol_manager.enabled}")
105
- logger.info(f"🔍 PROTOCOL STEP 1.5: Protocol manager allowed_protocols: {self.protocol_manager.allowed_protocols}")
100
+ logger.debug(f"ProtocolMiddleware processing {request.method} {request.url.path}")
106
101
 
107
102
  try:
108
103
  # Get protocol from request
109
- logger.info(f"🔍 PROTOCOL STEP 2: Getting request protocol...")
110
104
  protocol = self._get_request_protocol(request)
111
- logger.info(f"🔍 PROTOCOL STEP 3: Detected protocol: {protocol} for {request.method} {request.url.path}")
105
+ logger.debug(f"Detected protocol: {protocol} for {request.method} {request.url.path}")
112
106
 
113
107
  # Check if protocol is allowed
114
- logger.info(f"🔍 PROTOCOL STEP 4: Checking if protocol '{protocol}' is allowed...")
115
108
  is_allowed = self.protocol_manager.is_protocol_allowed(protocol)
116
- logger.info(f"🔍 PROTOCOL STEP 5: Protocol '{protocol}' allowed: {is_allowed}")
109
+ logger.debug(f"Protocol '{protocol}' allowed: {is_allowed}")
117
110
 
118
111
  if not is_allowed:
119
- logger.warning(f"❌ PROTOCOL STEP ERROR: Protocol '{protocol}' not allowed for request to {request.url.path}")
112
+ logger.warning(f"Protocol '{protocol}' not allowed for request to {request.url.path}")
120
113
  return JSONResponse(
121
114
  status_code=403,
122
115
  content={
@@ -127,17 +120,11 @@ class ProtocolMiddleware(BaseHTTPMiddleware):
127
120
  )
128
121
 
129
122
  # Continue processing
130
- logger.info(f"✅ PROTOCOL STEP 6: Protocol '{protocol}' allowed, proceeding...")
131
- logger.info(f"🔍 PROTOCOL STEP 7: Adding protocol '{protocol}' to request state...")
132
123
  request.state.protocol = protocol
133
- logger.info(f"🔍 PROTOCOL STEP 8: Protocol '{protocol}' added to request state")
124
+ logger.debug(f"Protocol '{protocol}' added to request state")
134
125
 
135
- logger.info(f"🔍 PROTOCOL STEP 9: Calling next middleware/endpoint...")
136
126
  response = await call_next(request)
137
- logger.info(f"🔍 PROTOCOL STEP 10: Next middleware/endpoint completed with status: {response.status_code}")
138
- logger.info(f"🔍 PROTOCOL STEP 10.1: Response headers: {dict(response.headers)}")
139
-
140
- logger.info(f"✅ PROTOCOL STEP 11: ProtocolMiddleware completed successfully")
127
+ logger.debug(f"ProtocolMiddleware completed with status: {response.status_code}")
141
128
  return response
142
129
 
143
130
  except Exception as e:
@@ -157,63 +144,33 @@ class ProtocolMiddleware(BaseHTTPMiddleware):
157
144
  Returns:
158
145
  Protocol name (http, https, mtls)
159
146
  """
160
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol START")
161
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - request.url.scheme: {request.url.scheme}")
162
-
163
147
  try:
164
148
  # Check if request is secure (HTTPS)
165
149
  if request.url.scheme:
166
150
  scheme = request.url.scheme.lower()
167
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - scheme: {scheme}")
168
151
 
169
152
  # If HTTPS, check if client certificate is provided (MTLS)
170
153
  if scheme == "https":
171
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - HTTPS detected, checking for mTLS")
172
-
173
154
  # Check for client certificate in ASGI scope
174
155
  try:
175
156
  # Method 1: Check transport info in ASGI scope
176
157
  if hasattr(request, "scope") and request.scope:
177
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - ASGI scope available")
178
- # Check for client certificate in transport layer
179
158
  transport = request.scope.get("transport")
180
159
  if transport and hasattr(transport, "get_extra_info"):
181
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - transport available, checking SSL object")
182
160
  try:
183
161
  ssl_object = transport.get_extra_info("ssl_object")
184
162
  if ssl_object:
185
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - SSL object available, checking peer cert")
186
163
  try:
187
164
  cert = ssl_object.getpeercert()
188
165
  if cert:
189
- logger.debug(f"✅ ProtocolMiddleware._get_request_protocol - mTLS client certificate detected: {cert.get('subject', 'unknown')}")
166
+ logger.debug(f"mTLS client certificate detected: {cert.get('subject', 'unknown')}")
190
167
  return "mtls"
191
- else:
192
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - No peer certificate found")
193
- except Exception as e:
194
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Error checking client certificate: {e}")
195
- else:
196
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - No SSL object found")
197
- except Exception as e:
198
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Error getting SSL object from transport: {e}")
199
- else:
200
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - No transport or get_extra_info method")
201
-
202
- # Method 2: Check client info in ASGI scope
203
- try:
204
- client_info = request.scope.get("client")
205
- if client_info and len(client_info) > 2:
206
- # client_info format: (host, port, additional_info...)
207
- # Additional info might contain certificate information
208
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Client info detected, might be mTLS: {client_info}")
209
- else:
210
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Client info: {client_info}")
211
- except Exception as e:
212
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Error checking client info: {e}")
213
- else:
214
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - No ASGI scope available")
215
- except Exception as e:
216
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Error checking ASGI scope for mTLS: {e}")
168
+ except Exception:
169
+ pass
170
+ except Exception:
171
+ pass
172
+ except Exception:
173
+ pass
217
174
 
218
175
  # Check for client certificate in headers (proxy forwarded)
219
176
  try:
@@ -224,31 +181,25 @@ class ProtocolMiddleware(BaseHTTPMiddleware):
224
181
  request.headers.get("x-forwarded-client-cert")
225
182
  ]
226
183
  if any(mtls_headers):
227
- logger.debug(f"✅ ProtocolMiddleware._get_request_protocol - mTLS client certificate detected in headers")
184
+ logger.debug("mTLS client certificate detected in headers")
228
185
  return "mtls"
229
- else:
230
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - No mTLS headers found")
231
- except Exception as e:
232
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Error checking headers for mTLS: {e}")
186
+ except Exception:
187
+ pass
233
188
 
234
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Returning 'https' (no mTLS detected)")
235
189
  return "https"
236
190
 
237
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Returning scheme: {scheme}")
238
191
  return scheme
239
192
 
240
193
  # Fallback to checking headers
241
194
  x_forwarded_proto = request.headers.get("x-forwarded-proto")
242
195
  if x_forwarded_proto:
243
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Using x-forwarded-proto: {x_forwarded_proto}")
244
196
  return x_forwarded_proto.lower()
245
197
 
246
198
  # Default to HTTP
247
- logger.debug(f"🔍 ProtocolMiddleware._get_request_protocol - Defaulting to 'http'")
248
199
  return "http"
249
200
 
250
201
  except Exception as e:
251
- logger.error(f" ProtocolMiddleware._get_request_protocol - Error: {e}", exc_info=True)
202
+ logger.error(f"Error extracting protocol from request: {e}", exc_info=True)
252
203
  # Fallback to HTTP if there's any error
253
204
  return "http"
254
205
 
@@ -261,43 +212,25 @@ def setup_protocol_middleware(app, app_config: Optional[Dict[str, Any]] = None):
261
212
  app: FastAPI application
262
213
  app_config: Application configuration dictionary (optional)
263
214
  """
264
- logger.info(f"🔍 SETUP STEP 1: setup_protocol_middleware - app_config type: {type(app_config)}")
265
-
266
215
  # Check if protocol management is enabled
267
216
  if app_config is None:
268
- logger.info(f"🔍 SETUP STEP 2: app_config is None, loading from global config...")
269
217
  from mcp_proxy_adapter.config import config
270
-
271
218
  app_config = config.get_all()
272
- logger.info(f"🔍 SETUP STEP 3: loaded from global config, type: {type(app_config)}")
273
-
274
- logger.info(f"🔍 SETUP STEP 4: final app_config type: {type(app_config)}")
275
219
 
276
220
  if hasattr(app_config, "get"):
277
- logger.info(f"🔍 SETUP STEP 5: app_config has 'get' method")
278
- logger.info(f"🔍 SETUP STEP 5.1: app_config keys: {list(app_config.keys()) if hasattr(app_config, 'keys') else 'no keys'}")
279
221
  protocols_config = app_config.get("protocols", {})
280
- logger.info(f"🔍 SETUP STEP 6: protocols_config: {protocols_config}")
281
- logger.info(f"🔍 SETUP STEP 6.1: protocols_config type: {type(protocols_config)}")
282
222
  enabled = (
283
223
  protocols_config.get("enabled", True)
284
224
  if hasattr(protocols_config, "get")
285
225
  else True
286
226
  )
287
- logger.info(f"🔍 SETUP STEP 7: protocols_config.get('enabled', True) = {enabled}")
288
227
  else:
289
- logger.info(f"🔍 SETUP STEP 5: app_config is not dict-like: {repr(app_config)}")
290
228
  enabled = True
291
229
 
292
- logger.info(f"🔍 SETUP STEP 8: protocol management enabled: {enabled}")
293
-
294
230
  if enabled:
295
231
  # Create protocol middleware with current configuration
296
- logger.info(f"🔍 SETUP STEP 9: Creating ProtocolMiddleware with config type: {type(app_config)}")
297
232
  middleware = ProtocolMiddleware(app, app_config)
298
- logger.info(f"🔍 SETUP STEP 10: ProtocolMiddleware created successfully")
299
- logger.info(f"🔍 SETUP STEP 11: Adding ProtocolMiddleware to app...")
300
233
  app.add_middleware(ProtocolMiddleware, app_config=app_config)
301
- logger.info(f"✅ SETUP STEP 12: Protocol middleware added to application")
234
+ logger.info("Protocol middleware added to application")
302
235
  else:
303
- logger.info(f"✅ SETUP STEP 9: Protocol management is disabled, skipping protocol middleware")
236
+ logger.info("Protocol management is disabled, skipping protocol middleware")
@@ -235,6 +235,123 @@ class FullTestSuiteRunner:
235
235
  self.print_error(f"Failed to run security tests: {e}")
236
236
  return False
237
237
 
238
+ def run_mtls_registration_test(self) -> bool:
239
+ """Run mTLS with proxy registration test."""
240
+ self.print_step("6", "mTLS Proxy Registration Testing")
241
+
242
+ try:
243
+ # Check if test_proxy_registration.py exists
244
+ test_script = self.working_dir / "test_proxy_registration.py"
245
+ if not test_script.exists():
246
+ self.print_error(f"Test script not found: {test_script}")
247
+ return False
248
+
249
+ # Create test_proxy_registration.json config if it doesn't exist
250
+ test_config = self.configs_dir / "test_proxy_registration.json"
251
+ if not test_config.exists():
252
+ self.print_info("Creating test_proxy_registration.json configuration...")
253
+ test_config_content = {
254
+ "uuid": "550e8400-e29b-41d4-a716-446655440001",
255
+ "server": {
256
+ "host": "127.0.0.1",
257
+ "port": 20005
258
+ },
259
+ "ssl": {
260
+ "enabled": True,
261
+ "cert_file": "certs/localhost_server.crt",
262
+ "key_file": "keys/localhost_server.key",
263
+ "ca_cert": "certs/mcp_proxy_adapter_ca_ca.crt",
264
+ "client_cert_file": "certs/admin_cert.pem",
265
+ "client_key_file": "certs/admin_key.pem",
266
+ "verify_client": True
267
+ },
268
+ "registration": {
269
+ "enabled": True,
270
+ "auth_method": "token",
271
+ "server_url": "http://127.0.0.1:3006/proxy",
272
+ "token": {
273
+ "enabled": True,
274
+ "token": "proxy_registration_token_123"
275
+ },
276
+ "proxy_info": {
277
+ "name": "mcp_test_server",
278
+ "capabilities": [
279
+ "jsonrpc",
280
+ "rest",
281
+ "security",
282
+ "proxy_registration"
283
+ ],
284
+ "endpoints": {
285
+ "jsonrpc": "/api/jsonrpc",
286
+ "rest": "/cmd",
287
+ "health": "/health"
288
+ }
289
+ },
290
+ "heartbeat": {
291
+ "enabled": True,
292
+ "interval": 30
293
+ }
294
+ },
295
+ "security": {
296
+ "enabled": True,
297
+ "auth": {
298
+ "enabled": True,
299
+ "methods": [
300
+ "certificate"
301
+ ]
302
+ },
303
+ "permissions": {
304
+ "enabled": True,
305
+ "roles_file": "configs/roles.json"
306
+ }
307
+ },
308
+ "protocols": {
309
+ "enabled": True,
310
+ "default_protocol": "mtls",
311
+ "allowed_protocols": [
312
+ "https",
313
+ "mtls"
314
+ ]
315
+ }
316
+ }
317
+
318
+ import json
319
+ with open(test_config, 'w', encoding='utf-8') as f:
320
+ json.dump(test_config_content, f, indent=2)
321
+ self.print_success(f"Created test configuration: {test_config}")
322
+
323
+ self.print_info("Running mTLS proxy registration test...")
324
+ self.print_info("This test verifies:")
325
+ self.print_info(" - mTLS server startup with client certificate verification")
326
+ self.print_info(" - Proxy registration functionality")
327
+ self.print_info(" - SSL configuration validation")
328
+
329
+ # Run the test
330
+ cmd = [sys.executable, "test_proxy_registration.py"]
331
+ result = subprocess.run(
332
+ cmd, capture_output=True, text=True, cwd=self.working_dir
333
+ )
334
+
335
+ if result.returncode == 0:
336
+ self.print_success("mTLS proxy registration test completed successfully!")
337
+ if result.stdout:
338
+ print("Test output:")
339
+ print(result.stdout)
340
+ return True
341
+ else:
342
+ self.print_error("mTLS proxy registration test failed!")
343
+ if result.stdout:
344
+ print("Test output:")
345
+ print(result.stdout)
346
+ if result.stderr:
347
+ print("Error output:")
348
+ print(result.stderr)
349
+ return False
350
+
351
+ except Exception as e:
352
+ self.print_error(f"Failed to run mTLS registration test: {e}")
353
+ return False
354
+
238
355
  def cleanup(self):
239
356
  """Clean up temporary files and processes."""
240
357
  self.print_info("Cleaning up...")
@@ -305,6 +422,10 @@ class FullTestSuiteRunner:
305
422
  if not self.run_security_tests():
306
423
  return False
307
424
 
425
+ # Step 6: mTLS proxy registration testing
426
+ if not self.run_mtls_registration_test():
427
+ return False
428
+
308
429
  # All steps completed successfully
309
430
  print(f"\n{'='*60}")
310
431
  print("🎉 FULL TEST SUITE COMPLETED SUCCESSFULLY!")
@@ -315,6 +436,7 @@ class FullTestSuiteRunner:
315
436
  print("✅ Certificates generated")
316
437
  print("✅ Configurations generated")
317
438
  print("✅ Security tests passed")
439
+ print("✅ mTLS proxy registration test passed")
318
440
  print(f"\n📁 Test artifacts created in: {self.working_dir}")
319
441
  print(f"📁 Configurations: {self.configs_dir}")
320
442
  print(f"📁 Certificates: {self.certs_dir}")