mcp-proxy-adapter-dev 8.11.16__py3-none-any.whl

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 (644) hide show
  1. mcp_proxy_adapter/__init__.py +73 -0
  2. mcp_proxy_adapter/__main__.py +13 -0
  3. mcp_proxy_adapter/api/__init__.py +38 -0
  4. mcp_proxy_adapter/api/app.py +64 -0
  5. mcp_proxy_adapter/api/command_session_service.py +455 -0
  6. mcp_proxy_adapter/api/core/__init__.py +19 -0
  7. mcp_proxy_adapter/api/core/app_factory.py +215 -0
  8. mcp_proxy_adapter/api/core/app_factory_certificates.py +159 -0
  9. mcp_proxy_adapter/api/core/app_factory_config.py +75 -0
  10. mcp_proxy_adapter/api/core/app_factory_routes.py +345 -0
  11. mcp_proxy_adapter/api/core/app_factory_validators.py +165 -0
  12. mcp_proxy_adapter/api/core/lifespan_manager/__init__.py +52 -0
  13. mcp_proxy_adapter/api/core/lifespan_manager/manager.py +354 -0
  14. mcp_proxy_adapter/api/core/lifespan_manager/queue_config.py +37 -0
  15. mcp_proxy_adapter/api/core/lifespan_manager/signal_registration.py +74 -0
  16. mcp_proxy_adapter/api/core/registration/__init__.py +24 -0
  17. mcp_proxy_adapter/api/core/registration/config_parsers.py +247 -0
  18. mcp_proxy_adapter/api/core/registration/context_builder.py +130 -0
  19. mcp_proxy_adapter/api/core/registration/helpers.py +36 -0
  20. mcp_proxy_adapter/api/core/registration/metadata_builders.py +117 -0
  21. mcp_proxy_adapter/api/core/registration/models.py +42 -0
  22. mcp_proxy_adapter/api/core/registration/resolvers.py +195 -0
  23. mcp_proxy_adapter/api/core/registration/url_builders.py +122 -0
  24. mcp_proxy_adapter/api/core/registration_context.py +30 -0
  25. mcp_proxy_adapter/api/core/registration_manager/__init__.py +31 -0
  26. mcp_proxy_adapter/api/core/registration_manager/helpers.py +307 -0
  27. mcp_proxy_adapter/api/core/registration_manager/manager.py +584 -0
  28. mcp_proxy_adapter/api/core/registration_manager/status.py +152 -0
  29. mcp_proxy_adapter/api/core/registration_tasks.py +387 -0
  30. mcp_proxy_adapter/api/core/ssl_context_factory.py +99 -0
  31. mcp_proxy_adapter/api/execute_async_contract.py +124 -0
  32. mcp_proxy_adapter/api/handlers/__init__.py +335 -0
  33. mcp_proxy_adapter/api/handlers/command_execution.py +709 -0
  34. mcp_proxy_adapter/api/handlers/health.py +157 -0
  35. mcp_proxy_adapter/api/handlers/jsonrpc.py +207 -0
  36. mcp_proxy_adapter/api/handlers/transfer_notify.py +313 -0
  37. mcp_proxy_adapter/api/handlers/transfer_sessions.py +287 -0
  38. mcp_proxy_adapter/api/handlers_async.py +233 -0
  39. mcp_proxy_adapter/api/health_provider.py +44 -0
  40. mcp_proxy_adapter/api/jsonrpc_job_lifecycle.py +165 -0
  41. mcp_proxy_adapter/api/jsonrpc_job_status.py +94 -0
  42. mcp_proxy_adapter/api/middleware/__init__.py +14 -0
  43. mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
  44. mcp_proxy_adapter/api/middleware/request_logging.py +153 -0
  45. mcp_proxy_adapter/api/middleware/unified_security.py +367 -0
  46. mcp_proxy_adapter/api/openapi/__init__.py +18 -0
  47. mcp_proxy_adapter/api/openapi/command_integration.py +107 -0
  48. mcp_proxy_adapter/api/openapi/openapi_generator.py +138 -0
  49. mcp_proxy_adapter/api/openapi/openapi_registry.py +55 -0
  50. mcp_proxy_adapter/api/public_downloads.py +68 -0
  51. mcp_proxy_adapter/api/schemas.py +290 -0
  52. mcp_proxy_adapter/api/tool_integration.py +124 -0
  53. mcp_proxy_adapter/api/tools.py +244 -0
  54. mcp_proxy_adapter/api/transfer_session_service.py +329 -0
  55. mcp_proxy_adapter/api/ws_endpoint.py +653 -0
  56. mcp_proxy_adapter/api/ws_identity.py +111 -0
  57. mcp_proxy_adapter/cli/__init__.py +12 -0
  58. mcp_proxy_adapter/cli/commands/__init__.py +14 -0
  59. mcp_proxy_adapter/cli/commands/client.py +137 -0
  60. mcp_proxy_adapter/cli/commands/config_docs/__init__.py +23 -0
  61. mcp_proxy_adapter/cli/commands/config_docs/cli.py +63 -0
  62. mcp_proxy_adapter/cli/commands/config_docs/declared_settings.py +45 -0
  63. mcp_proxy_adapter/cli/commands/config_docs/render.py +58 -0
  64. mcp_proxy_adapter/cli/commands/config_docs/sections/__init__.py +61 -0
  65. mcp_proxy_adapter/cli/commands/config_docs/sections/_chunk.py +19 -0
  66. mcp_proxy_adapter/cli/commands/config_docs/sections/authentication.py +127 -0
  67. mcp_proxy_adapter/cli/commands/config_docs/sections/best_practices.py +166 -0
  68. mcp_proxy_adapter/cli/commands/config_docs/sections/common_patterns.py +154 -0
  69. mcp_proxy_adapter/cli/commands/config_docs/sections/overview.py +135 -0
  70. mcp_proxy_adapter/cli/commands/config_docs/sections/queue_manager.py +140 -0
  71. mcp_proxy_adapter/cli/commands/config_docs/sections/registration.py +212 -0
  72. mcp_proxy_adapter/cli/commands/config_docs/sections/server.py +193 -0
  73. mcp_proxy_adapter/cli/commands/config_docs/sections/troubleshooting.py +215 -0
  74. mcp_proxy_adapter/cli/commands/config_generate.py +95 -0
  75. mcp_proxy_adapter/cli/commands/config_generate_parts/__init__.py +1 -0
  76. mcp_proxy_adapter/cli/commands/config_generate_parts/arguments.py +44 -0
  77. mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_core.py +141 -0
  78. mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_queue.py +140 -0
  79. mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_validation.py +142 -0
  80. mcp_proxy_adapter/cli/commands/config_generate_parts/generation.py +365 -0
  81. mcp_proxy_adapter/cli/commands/config_generate_parts/parsing.py +122 -0
  82. mcp_proxy_adapter/cli/commands/config_validate.py +154 -0
  83. mcp_proxy_adapter/cli/commands/info.py +297 -0
  84. mcp_proxy_adapter/cli/commands/server.py +361 -0
  85. mcp_proxy_adapter/cli/commands/sets.py +165 -0
  86. mcp_proxy_adapter/cli/commands/standalone_entry.py +25 -0
  87. mcp_proxy_adapter/cli/commands/testconfig.py +205 -0
  88. mcp_proxy_adapter/cli/examples/__init__.py +9 -0
  89. mcp_proxy_adapter/cli/main.py +75 -0
  90. mcp_proxy_adapter/cli/parser.py +244 -0
  91. mcp_proxy_adapter/cli/validators.py +389 -0
  92. mcp_proxy_adapter/client/jsonrpc_client/__init__.py +139 -0
  93. mcp_proxy_adapter/client/jsonrpc_client/client.py +257 -0
  94. mcp_proxy_adapter/client/jsonrpc_client/command_api.py +369 -0
  95. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/__init__.py +1 -0
  96. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/async_base.py +241 -0
  97. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/basic_base.py +150 -0
  98. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/catalog_base.py +178 -0
  99. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/constants.py +38 -0
  100. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/helpers.py +66 -0
  101. mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/queue_base.py +137 -0
  102. mcp_proxy_adapter/client/jsonrpc_client/exceptions/__init__.py +70 -0
  103. mcp_proxy_adapter/client/jsonrpc_client/exceptions/base.py +102 -0
  104. mcp_proxy_adapter/client/jsonrpc_client/exceptions/classification.py +143 -0
  105. mcp_proxy_adapter/client/jsonrpc_client/exceptions/request_errors.py +169 -0
  106. mcp_proxy_adapter/client/jsonrpc_client/exceptions/schema_errors.py +90 -0
  107. mcp_proxy_adapter/client/jsonrpc_client/exceptions/transfer_errors.py +48 -0
  108. mcp_proxy_adapter/client/jsonrpc_client/exceptions/transport_errors.py +153 -0
  109. mcp_proxy_adapter/client/jsonrpc_client/execution_status_observer.py +66 -0
  110. mcp_proxy_adapter/client/jsonrpc_client/job_event_registry.py +322 -0
  111. mcp_proxy_adapter/client/jsonrpc_client/job_tracking_mixin.py +206 -0
  112. mcp_proxy_adapter/client/jsonrpc_client/job_tracking_types.py +135 -0
  113. mcp_proxy_adapter/client/jsonrpc_client/openapi_validator.py +127 -0
  114. mcp_proxy_adapter/client/jsonrpc_client/operation_state.py +221 -0
  115. mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +93 -0
  116. mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/__init__.py +1 -0
  117. mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/client_base.py +117 -0
  118. mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/lifecycle_base.py +222 -0
  119. mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/register_base.py +230 -0
  120. mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/uuid_base.py +95 -0
  121. mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +302 -0
  122. mcp_proxy_adapter/client/jsonrpc_client/queue_status.py +192 -0
  123. mcp_proxy_adapter/client/jsonrpc_client/schema_generator.py +143 -0
  124. mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/__init__.py +1 -0
  125. mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/models.py +45 -0
  126. mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/parse_base.py +215 -0
  127. mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/validate_base.py +181 -0
  128. mcp_proxy_adapter/client/jsonrpc_client/transfer_integrity.py +57 -0
  129. mcp_proxy_adapter/client/jsonrpc_client/transport/__init__.py +161 -0
  130. mcp_proxy_adapter/client/jsonrpc_client/transport/constants.py +30 -0
  131. mcp_proxy_adapter/client/jsonrpc_client/transport/helpers.py +118 -0
  132. mcp_proxy_adapter/client/jsonrpc_client/transport/http_base.py +325 -0
  133. mcp_proxy_adapter/client/jsonrpc_client/transport/rpc_base.py +311 -0
  134. mcp_proxy_adapter/client/jsonrpc_client/transport/tls_base.py +295 -0
  135. mcp_proxy_adapter/client/jsonrpc_client/transport/transfer_base.py +282 -0
  136. mcp_proxy_adapter/client/jsonrpc_client/ws_command_session.py +230 -0
  137. mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/__init__.py +1 -0
  138. mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/core_base.py +154 -0
  139. mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/helpers.py +72 -0
  140. mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/wait_base.py +279 -0
  141. mcp_proxy_adapter/client/jsonrpc_client/ws_job_status.py +337 -0
  142. mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/__init__.py +1 -0
  143. mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/channel.py +159 -0
  144. mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/command_channel.py +154 -0
  145. mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/helpers.py +76 -0
  146. mcp_proxy_adapter/client/proxy.py +124 -0
  147. mcp_proxy_adapter/commands/__init__.py +27 -0
  148. mcp_proxy_adapter/commands/base.py +998 -0
  149. mcp_proxy_adapter/commands/builtin_commands.py +186 -0
  150. mcp_proxy_adapter/commands/command_help_info.py +101 -0
  151. mcp_proxy_adapter/commands/command_registry/__init__.py +55 -0
  152. mcp_proxy_adapter/commands/command_registry/builtins_part.py +206 -0
  153. mcp_proxy_adapter/commands/command_registry/facade.py +310 -0
  154. mcp_proxy_adapter/commands/command_registry/lifecycle_part.py +232 -0
  155. mcp_proxy_adapter/commands/command_registry/loader.py +145 -0
  156. mcp_proxy_adapter/commands/command_registry/mutations_part.py +228 -0
  157. mcp_proxy_adapter/commands/command_registry/part_base.py +59 -0
  158. mcp_proxy_adapter/commands/command_registry/queries_part.py +304 -0
  159. mcp_proxy_adapter/commands/config_command.py +208 -0
  160. mcp_proxy_adapter/commands/dependency_container.py +35 -0
  161. mcp_proxy_adapter/commands/echo_command.py +97 -0
  162. mcp_proxy_adapter/commands/health_command.py +162 -0
  163. mcp_proxy_adapter/commands/help_command.py +296 -0
  164. mcp_proxy_adapter/commands/hooks.py +590 -0
  165. mcp_proxy_adapter/commands/job_metadata.py +26 -0
  166. mcp_proxy_adapter/commands/load_command.py +134 -0
  167. mcp_proxy_adapter/commands/nested_validation.py +185 -0
  168. mcp_proxy_adapter/commands/plugins_command.py +250 -0
  169. mcp_proxy_adapter/commands/proxy_registration_command.py +475 -0
  170. mcp_proxy_adapter/commands/queue/__init__.py +83 -0
  171. mcp_proxy_adapter/commands/queue/add_job_command.py +358 -0
  172. mcp_proxy_adapter/commands/queue/command_execution_diagnostics.py +100 -0
  173. mcp_proxy_adapter/commands/queue/delete_job_command.py +92 -0
  174. mcp_proxy_adapter/commands/queue/get_logs_command.py +90 -0
  175. mcp_proxy_adapter/commands/queue/get_status_command.py +105 -0
  176. mcp_proxy_adapter/commands/queue/health_command.py +44 -0
  177. mcp_proxy_adapter/commands/queue/job_domain_errors.py +117 -0
  178. mcp_proxy_adapter/commands/queue/job_params.py +163 -0
  179. mcp_proxy_adapter/commands/queue/jobs/__init__.py +41 -0
  180. mcp_proxy_adapter/commands/queue/jobs/basic_jobs.py +205 -0
  181. mcp_proxy_adapter/commands/queue/jobs/command_execution_job.py +198 -0
  182. mcp_proxy_adapter/commands/queue/jobs/command_restore_base.py +48 -0
  183. mcp_proxy_adapter/commands/queue/jobs/command_run_base.py +389 -0
  184. mcp_proxy_adapter/commands/queue/jobs/job_helpers.py +80 -0
  185. mcp_proxy_adapter/commands/queue/jobs/long_jobs.py +257 -0
  186. mcp_proxy_adapter/commands/queue/list_jobs_command.py +127 -0
  187. mcp_proxy_adapter/commands/queue/start_job_command.py +97 -0
  188. mcp_proxy_adapter/commands/queue/stop_job_command.py +107 -0
  189. mcp_proxy_adapter/commands/queue_commands.py +49 -0
  190. mcp_proxy_adapter/commands/registration_status_command.py +83 -0
  191. mcp_proxy_adapter/commands/reload_command.py +183 -0
  192. mcp_proxy_adapter/commands/result.py +201 -0
  193. mcp_proxy_adapter/commands/result_helpers.py +43 -0
  194. mcp_proxy_adapter/commands/role_test_command.py +119 -0
  195. mcp_proxy_adapter/commands/roles_management_command/__init__.py +58 -0
  196. mcp_proxy_adapter/commands/roles_management_command/actions_part.py +400 -0
  197. mcp_proxy_adapter/commands/roles_management_command/dispatch_part.py +239 -0
  198. mcp_proxy_adapter/commands/roles_management_command/facade.py +233 -0
  199. mcp_proxy_adapter/commands/roles_management_command/part_base.py +61 -0
  200. mcp_proxy_adapter/commands/roles_management_command/results.py +105 -0
  201. mcp_proxy_adapter/commands/roles_management_command/storage_part.py +181 -0
  202. mcp_proxy_adapter/commands/schema_helpers.py +45 -0
  203. mcp_proxy_adapter/commands/settings_command.py +205 -0
  204. mcp_proxy_adapter/commands/transfer_command_support.py +83 -0
  205. mcp_proxy_adapter/commands/transfer_download_begin_command.py +245 -0
  206. mcp_proxy_adapter/commands/transfer_download_status_command.py +121 -0
  207. mcp_proxy_adapter/commands/transfer_schema_support.py +96 -0
  208. mcp_proxy_adapter/commands/transfer_upload_begin_command.py +254 -0
  209. mcp_proxy_adapter/commands/transfer_upload_complete_command.py +161 -0
  210. mcp_proxy_adapter/commands/transfer_upload_status_command.py +122 -0
  211. mcp_proxy_adapter/commands/transport_management_command.py +144 -0
  212. mcp_proxy_adapter/commands/unload_command.py +109 -0
  213. mcp_proxy_adapter/config.py +30 -0
  214. mcp_proxy_adapter/core/__init__.py +8 -0
  215. mcp_proxy_adapter/core/app_factory/__init__.py +17 -0
  216. mcp_proxy_adapter/core/app_factory/app_creator.py +66 -0
  217. mcp_proxy_adapter/core/app_factory/config_loader.py +125 -0
  218. mcp_proxy_adapter/core/app_factory/factory.py +158 -0
  219. mcp_proxy_adapter/core/app_factory/server_runner.py +152 -0
  220. mcp_proxy_adapter/core/app_factory/ssl_config.py +194 -0
  221. mcp_proxy_adapter/core/app_factory/validators.py +57 -0
  222. mcp_proxy_adapter/core/async_context.py +28 -0
  223. mcp_proxy_adapter/core/auth/__init__.py +18 -0
  224. mcp_proxy_adapter/core/auth/certificate_validator.py +239 -0
  225. mcp_proxy_adapter/core/auth/models.py +47 -0
  226. mcp_proxy_adapter/core/auth/mtls_validator.py +84 -0
  227. mcp_proxy_adapter/core/auth/token_validator.py +114 -0
  228. mcp_proxy_adapter/core/auth_validator.py +137 -0
  229. mcp_proxy_adapter/core/certificate/__init__.py +20 -0
  230. mcp_proxy_adapter/core/certificate/certificate_validator/__init__.py +55 -0
  231. mcp_proxy_adapter/core/certificate/certificate_validator/facade.py +340 -0
  232. mcp_proxy_adapter/core/certificate/certificate_validator/info_part.py +130 -0
  233. mcp_proxy_adapter/core/certificate/certificate_validator/key_part.py +146 -0
  234. mcp_proxy_adapter/core/certificate/certificate_validator/part_base.py +65 -0
  235. mcp_proxy_adapter/core/certificate/certificate_validator/revocation_part.py +112 -0
  236. mcp_proxy_adapter/core/client/__init__.py +11 -0
  237. mcp_proxy_adapter/core/client/auth_handler.py +120 -0
  238. mcp_proxy_adapter/core/client/client.py +314 -0
  239. mcp_proxy_adapter/core/client/factory.py +110 -0
  240. mcp_proxy_adapter/core/client/request_handler.py +122 -0
  241. mcp_proxy_adapter/core/client/ssl_handler.py +105 -0
  242. mcp_proxy_adapter/core/client_manager.py +281 -0
  243. mcp_proxy_adapter/core/client_security/__init__.py +53 -0
  244. mcp_proxy_adapter/core/client_security/auth_part.py +227 -0
  245. mcp_proxy_adapter/core/client_security/cert_part.py +124 -0
  246. mcp_proxy_adapter/core/client_security/facade.py +181 -0
  247. mcp_proxy_adapter/core/client_security/part_base.py +62 -0
  248. mcp_proxy_adapter/core/client_security/ssl_part.py +275 -0
  249. mcp_proxy_adapter/core/config/__init__.py +29 -0
  250. mcp_proxy_adapter/core/config/config.py +963 -0
  251. mcp_proxy_adapter/core/config/config_factory.py +16 -0
  252. mcp_proxy_adapter/core/config/config_graph.py +250 -0
  253. mcp_proxy_adapter/core/config/config_loader.py +70 -0
  254. mcp_proxy_adapter/core/config/env_placeholders.py +52 -0
  255. mcp_proxy_adapter/core/config/feature_manager.py +109 -0
  256. mcp_proxy_adapter/core/config/orchestration_section.py +119 -0
  257. mcp_proxy_adapter/core/config/reload_violations.py +269 -0
  258. mcp_proxy_adapter/core/config/section_validators.py +190 -0
  259. mcp_proxy_adapter/core/config/settings_declaration.py +255 -0
  260. mcp_proxy_adapter/core/config/simple_config.py +893 -0
  261. mcp_proxy_adapter/core/config/simple_config_generator.py +917 -0
  262. mcp_proxy_adapter/core/config/simple_config_validator.py +333 -0
  263. mcp_proxy_adapter/core/config/validators/__init__.py +29 -0
  264. mcp_proxy_adapter/core/config/validators/auth_validator.py +146 -0
  265. mcp_proxy_adapter/core/config/validators/base_validator.py +102 -0
  266. mcp_proxy_adapter/core/config/validators/certificate_validator_helper.py +114 -0
  267. mcp_proxy_adapter/core/config/validators/client_validator.py +131 -0
  268. mcp_proxy_adapter/core/config/validators/job_push_validator.py +55 -0
  269. mcp_proxy_adapter/core/config/validators/queue_manager_validator.py +133 -0
  270. mcp_proxy_adapter/core/config/validators/registration_validator.py +366 -0
  271. mcp_proxy_adapter/core/config/validators/server_validation_validator.py +154 -0
  272. mcp_proxy_adapter/core/config/validators/server_validator.py +326 -0
  273. mcp_proxy_adapter/core/config/validators/ssl_validator.py +221 -0
  274. mcp_proxy_adapter/core/config/websocket_validator.py +99 -0
  275. mcp_proxy_adapter/core/config_validator.py +29 -0
  276. mcp_proxy_adapter/core/constants.py +201 -0
  277. mcp_proxy_adapter/core/crl_utils.py +338 -0
  278. mcp_proxy_adapter/core/date_utils.py +119 -0
  279. mcp_proxy_adapter/core/delivery/__init__.py +35 -0
  280. mcp_proxy_adapter/core/delivery/contracts.py +57 -0
  281. mcp_proxy_adapter/core/delivery/exceptions.py +19 -0
  282. mcp_proxy_adapter/core/delivery/terminal_replay_store.py +129 -0
  283. mcp_proxy_adapter/core/delivery/ws_delivery_manager.py +117 -0
  284. mcp_proxy_adapter/core/domain_errors.py +189 -0
  285. mcp_proxy_adapter/core/error_handling.py +98 -0
  286. mcp_proxy_adapter/core/errors/__init__.py +259 -0
  287. mcp_proxy_adapter/core/errors/config_errors.py +142 -0
  288. mcp_proxy_adapter/core/file_utils.py +94 -0
  289. mcp_proxy_adapter/core/job_manager.py +115 -0
  290. mcp_proxy_adapter/core/job_push/__init__.py +124 -0
  291. mcp_proxy_adapter/core/job_push/caller_loss.py +89 -0
  292. mcp_proxy_adapter/core/job_push/engine.py +282 -0
  293. mcp_proxy_adapter/core/job_push/events/__init__.py +111 -0
  294. mcp_proxy_adapter/core/job_push/events/builders.py +282 -0
  295. mcp_proxy_adapter/core/job_push/events/command_session_payloads.py +50 -0
  296. mcp_proxy_adapter/core/job_push/events/delivery_payloads.py +52 -0
  297. mcp_proxy_adapter/core/job_push/events/event_names.py +163 -0
  298. mcp_proxy_adapter/core/job_push/events/job_payloads.py +83 -0
  299. mcp_proxy_adapter/core/job_push/events/transfer_payloads.py +72 -0
  300. mcp_proxy_adapter/core/job_push/execute_async_deliver_guard.py +55 -0
  301. mcp_proxy_adapter/core/job_push/finish_signal.py +91 -0
  302. mcp_proxy_adapter/core/job_push/hooks.py +53 -0
  303. mcp_proxy_adapter/core/job_push/job_status_accumulator.py +376 -0
  304. mcp_proxy_adapter/core/job_push/lifespan_wiring.py +252 -0
  305. mcp_proxy_adapter/core/job_push/notifier.py +139 -0
  306. mcp_proxy_adapter/core/job_push/notifier_policy.py +38 -0
  307. mcp_proxy_adapter/core/job_push/queue_custom_push.py +67 -0
  308. mcp_proxy_adapter/core/job_push/subscriptions.py +160 -0
  309. mcp_proxy_adapter/core/job_push/transfer_correlation.py +47 -0
  310. mcp_proxy_adapter/core/job_push/transfer_push.py +135 -0
  311. mcp_proxy_adapter/core/json_utils.py +81 -0
  312. mcp_proxy_adapter/core/logging/__init__.py +42 -0
  313. mcp_proxy_adapter/core/logging/formatters.py +55 -0
  314. mcp_proxy_adapter/core/logging/global_logger.py +41 -0
  315. mcp_proxy_adapter/core/logging/request_logger.py +50 -0
  316. mcp_proxy_adapter/core/logging/setup.py +190 -0
  317. mcp_proxy_adapter/core/logging/worker.py +107 -0
  318. mcp_proxy_adapter/core/mtls_asgi_app.py +216 -0
  319. mcp_proxy_adapter/core/mtls_server.py +180 -0
  320. mcp_proxy_adapter/core/orchestration/__init__.py +90 -0
  321. mcp_proxy_adapter/core/orchestration/candidate_validator.py +196 -0
  322. mcp_proxy_adapter/core/orchestration/catalog_builder.py +136 -0
  323. mcp_proxy_adapter/core/orchestration/catalog_snapshot.py +115 -0
  324. mcp_proxy_adapter/core/orchestration/command_record.py +43 -0
  325. mcp_proxy_adapter/core/orchestration/discovery_client.py +229 -0
  326. mcp_proxy_adapter/core/orchestration/orchestration_api.py +273 -0
  327. mcp_proxy_adapter/core/orchestration/orchestration_config.py +146 -0
  328. mcp_proxy_adapter/core/orchestration/orchestration_errors.py +305 -0
  329. mcp_proxy_adapter/core/orchestration/orchestration_lifespan.py +199 -0
  330. mcp_proxy_adapter/core/orchestration/parameter_graph.py +106 -0
  331. mcp_proxy_adapter/core/orchestration/polling_loop.py +281 -0
  332. mcp_proxy_adapter/core/orchestration/server_record.py +37 -0
  333. mcp_proxy_adapter/core/orchestration/snapshot_holder.py +90 -0
  334. mcp_proxy_adapter/core/orchestration/tool_context_exposure.py +83 -0
  335. mcp_proxy_adapter/core/orchestration/tool_context_snapshot.py +164 -0
  336. mcp_proxy_adapter/core/path_utils.py +220 -0
  337. mcp_proxy_adapter/core/protocol_manager.py +260 -0
  338. mcp_proxy_adapter/core/proxy/__init__.py +62 -0
  339. mcp_proxy_adapter/core/proxy/auth_manager.py +110 -0
  340. mcp_proxy_adapter/core/proxy_client.py +252 -0
  341. mcp_proxy_adapter/core/proxy_registration.py +55 -0
  342. mcp_proxy_adapter/core/role_utils.py +166 -0
  343. mcp_proxy_adapter/core/server_adapter.py +302 -0
  344. mcp_proxy_adapter/core/server_engine.py +384 -0
  345. mcp_proxy_adapter/core/settings.py +299 -0
  346. mcp_proxy_adapter/core/signal_handler.py +136 -0
  347. mcp_proxy_adapter/core/ssl_utils.py +482 -0
  348. mcp_proxy_adapter/core/transport_manager.py +168 -0
  349. mcp_proxy_adapter/core/utils.py +74 -0
  350. mcp_proxy_adapter/core/validation/__init__.py +21 -0
  351. mcp_proxy_adapter/core/validation/config_validator.py +256 -0
  352. mcp_proxy_adapter/core/validation/file_validator.py +229 -0
  353. mcp_proxy_adapter/core/validation/protocol_validator.py +322 -0
  354. mcp_proxy_adapter/core/validation/proxy_registration_validator.py +268 -0
  355. mcp_proxy_adapter/core/validation/security_validator.py +300 -0
  356. mcp_proxy_adapter/core/validation/validation_result.py +34 -0
  357. mcp_proxy_adapter/core/validation/validator_support.py +64 -0
  358. mcp_proxy_adapter/core/validation_utils.py +160 -0
  359. mcp_proxy_adapter/core/ws_timeouts.py +88 -0
  360. mcp_proxy_adapter/custom_openapi.py +93 -0
  361. mcp_proxy_adapter/examples/PROTOCOL_EXAMPLES.md +79 -0
  362. mcp_proxy_adapter/examples/README.md +272 -0
  363. mcp_proxy_adapter/examples/README_EN.md +258 -0
  364. mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
  365. mcp_proxy_adapter/examples/__init__.py +16 -0
  366. mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
  367. mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
  368. mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +21 -0
  369. mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +21 -0
  370. mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +21 -0
  371. mcp_proxy_adapter/examples/basic_framework/configs/https_no_protocol_middleware.json +21 -0
  372. mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +21 -0
  373. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_protocol_middleware.json +21 -0
  374. mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +21 -0
  375. mcp_proxy_adapter/examples/basic_framework/configs/mtls_simple.json +21 -0
  376. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_registration.json +73 -0
  377. mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +21 -0
  378. mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
  379. mcp_proxy_adapter/examples/basic_framework/main.py +123 -0
  380. mcp_proxy_adapter/examples/basic_framework/roles.json +1 -0
  381. mcp_proxy_adapter/examples/bug_report_security_framework.md +141 -0
  382. mcp_proxy_adapter/examples/cert_config.json +1 -0
  383. mcp_proxy_adapter/examples/certs/cert_config.json +1 -0
  384. mcp_proxy_adapter/examples/check_config.py +71 -0
  385. mcp_proxy_adapter/examples/check_config_split_parts/__init__.py +3 -0
  386. mcp_proxy_adapter/examples/check_config_split_parts/checker.py +247 -0
  387. mcp_proxy_adapter/examples/check_config_split_parts/cli.py +68 -0
  388. mcp_proxy_adapter/examples/check_config_split_parts/commands.py +102 -0
  389. mcp_proxy_adapter/examples/cli_config_examples/__init__.py +8 -0
  390. mcp_proxy_adapter/examples/cli_config_examples/examples_configs/http.json +69 -0
  391. mcp_proxy_adapter/examples/cli_config_examples/examples_configs/https_token_roles.json +84 -0
  392. mcp_proxy_adapter/examples/cli_config_examples/examples_configs/mtls_roles.json +84 -0
  393. mcp_proxy_adapter/examples/cli_config_examples/http_basic.py +97 -0
  394. mcp_proxy_adapter/examples/cli_config_examples/https_token.py +128 -0
  395. mcp_proxy_adapter/examples/cli_config_examples/mtls_roles.py +140 -0
  396. mcp_proxy_adapter/examples/client_configs/api_key_client.json +1 -0
  397. mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +1 -0
  398. mcp_proxy_adapter/examples/client_configs/certificate_client.json +1 -0
  399. mcp_proxy_adapter/examples/client_configs/jwt_client.json +1 -0
  400. mcp_proxy_adapter/examples/client_configs/no_auth_client.json +1 -0
  401. mcp_proxy_adapter/examples/client_usage_example.py +216 -0
  402. mcp_proxy_adapter/examples/commands/__init__.py +5 -0
  403. mcp_proxy_adapter/examples/comprehensive/__init__.py +10 -0
  404. mcp_proxy_adapter/examples/comprehensive/run.py +906 -0
  405. mcp_proxy_adapter/examples/comprehensive_config.json +10 -0
  406. mcp_proxy_adapter/examples/config.json +10 -0
  407. mcp_proxy_adapter/examples/config_builder.py +272 -0
  408. mcp_proxy_adapter/examples/config_cli.py +340 -0
  409. mcp_proxy_adapter/examples/config_factory.py +325 -0
  410. mcp_proxy_adapter/examples/configs/full_featured.json +10 -0
  411. mcp_proxy_adapter/examples/configs/http_auth.json +10 -0
  412. mcp_proxy_adapter/examples/configs/http_simple.json +10 -0
  413. mcp_proxy_adapter/examples/configs/http_token.json +10 -0
  414. mcp_proxy_adapter/examples/configs/https_auth.json +10 -0
  415. mcp_proxy_adapter/examples/configs/https_simple.json +10 -0
  416. mcp_proxy_adapter/examples/configs/https_token.json +10 -0
  417. mcp_proxy_adapter/examples/configs/mtls_no_roles.json +10 -0
  418. mcp_proxy_adapter/examples/configs/mtls_simple.json +10 -0
  419. mcp_proxy_adapter/examples/configs/mtls_with_proxy.json +10 -0
  420. mcp_proxy_adapter/examples/configs/mtls_with_roles.json +10 -0
  421. mcp_proxy_adapter/examples/configs/roles.json +1 -0
  422. mcp_proxy_adapter/examples/create_test_configs.py +216 -0
  423. mcp_proxy_adapter/examples/debug_role_chain.py +192 -0
  424. mcp_proxy_adapter/examples/demo_client.py +339 -0
  425. mcp_proxy_adapter/examples/examples_correct/http_example.json +10 -0
  426. mcp_proxy_adapter/examples/full_application/__init__.py +11 -0
  427. mcp_proxy_adapter/examples/full_application/commands/__init__.py +32 -0
  428. mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +75 -0
  429. mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +101 -0
  430. mcp_proxy_adapter/examples/full_application/commands/embed_job_status_command.py +133 -0
  431. mcp_proxy_adapter/examples/full_application/commands/embed_queue_command.py +153 -0
  432. mcp_proxy_adapter/examples/full_application/commands/long_running_command.py +175 -0
  433. mcp_proxy_adapter/examples/full_application/commands/slow_start_long_task_command.py +172 -0
  434. mcp_proxy_adapter/examples/full_application/configs/http_basic.json +73 -0
  435. mcp_proxy_adapter/examples/full_application/configs/http_basic_smart_assistant_proxy3004.json +67 -0
  436. mcp_proxy_adapter/examples/full_application/configs/http_no_registration.json +72 -0
  437. mcp_proxy_adapter/examples/full_application/configs/http_token.json +69 -0
  438. mcp_proxy_adapter/examples/full_application/configs/http_token_roles.json +81 -0
  439. mcp_proxy_adapter/examples/full_application/configs/http_token_roles_smart_assistant_proxy3004.json +81 -0
  440. mcp_proxy_adapter/examples/full_application/configs/http_token_smart_assistant_proxy3004.json +69 -0
  441. mcp_proxy_adapter/examples/full_application/configs/https_basic.json +74 -0
  442. mcp_proxy_adapter/examples/full_application/configs/https_basic_smart_assistant_proxy3004.json +81 -0
  443. mcp_proxy_adapter/examples/full_application/configs/https_token.json +76 -0
  444. mcp_proxy_adapter/examples/full_application/configs/https_token_roles.json +88 -0
  445. mcp_proxy_adapter/examples/full_application/configs/https_token_roles_smart_assistant_proxy3004.json +95 -0
  446. mcp_proxy_adapter/examples/full_application/configs/https_token_smart_assistant_proxy3004.json +83 -0
  447. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +78 -0
  448. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles_correct.json +76 -0
  449. mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles_smart_assistant_proxy3004.json +83 -0
  450. mcp_proxy_adapter/examples/full_application/configs/mtls_no_security.json +77 -0
  451. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +82 -0
  452. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles_correct.json +88 -0
  453. mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles_smart_assistant_proxy3004.json +95 -0
  454. mcp_proxy_adapter/examples/full_application/configs/mtls_ws_repro.json +76 -0
  455. mcp_proxy_adapter/examples/full_application/configs/proxy_server.json +64 -0
  456. mcp_proxy_adapter/examples/full_application/configs/proxy_server_https.json +63 -0
  457. mcp_proxy_adapter/examples/full_application/configs/proxy_server_mtls.json +63 -0
  458. mcp_proxy_adapter/examples/full_application/example_support.py +45 -0
  459. mcp_proxy_adapter/examples/full_application/hooks/__init__.py +4 -0
  460. mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +51 -0
  461. mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +46 -0
  462. mcp_proxy_adapter/examples/full_application/main.py +95 -0
  463. mcp_proxy_adapter/examples/full_application/main_modules/__init__.py +1 -0
  464. mcp_proxy_adapter/examples/full_application/main_modules/registration.py +122 -0
  465. mcp_proxy_adapter/examples/full_application/main_modules/runner.py +310 -0
  466. mcp_proxy_adapter/examples/full_application/proxy_commands/__init__.py +113 -0
  467. mcp_proxy_adapter/examples/full_application/proxy_commands/_shared.py +8 -0
  468. mcp_proxy_adapter/examples/full_application/proxy_commands/lifecycle_commands.py +196 -0
  469. mcp_proxy_adapter/examples/full_application/proxy_commands/register_command.py +254 -0
  470. mcp_proxy_adapter/examples/full_application/proxy_commands/registry_state.py +8 -0
  471. mcp_proxy_adapter/examples/full_application/proxy_commands/results.py +142 -0
  472. mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +162 -0
  473. mcp_proxy_adapter/examples/full_application/proxy_schemas.py +91 -0
  474. mcp_proxy_adapter/examples/full_application/roles.json +1 -0
  475. mcp_proxy_adapter/examples/full_application/test_client.py +341 -0
  476. mcp_proxy_adapter/examples/full_application/test_minimal_server.py +57 -0
  477. mcp_proxy_adapter/examples/full_application/test_queue_and_descriptions.py +283 -0
  478. mcp_proxy_adapter/examples/full_application/test_server.py +221 -0
  479. mcp_proxy_adapter/examples/full_application/test_simple_server.py +141 -0
  480. mcp_proxy_adapter/examples/generate_all_certificates.py +74 -0
  481. mcp_proxy_adapter/examples/generate_config.py +44 -0
  482. mcp_proxy_adapter/examples/generate_config_parts/__init__.py +3 -0
  483. mcp_proxy_adapter/examples/generate_config_parts/builders.py +234 -0
  484. mcp_proxy_adapter/examples/generate_config_parts/cli.py +260 -0
  485. mcp_proxy_adapter/examples/generate_config_parts/outputs.py +137 -0
  486. mcp_proxy_adapter/examples/generator_validator_compatibility_report.md +127 -0
  487. mcp_proxy_adapter/examples/http_proxy_example.json +17 -0
  488. mcp_proxy_adapter/examples/https_proxy_example.json +17 -0
  489. mcp_proxy_adapter/examples/job_tracking_demo.py +235 -0
  490. mcp_proxy_adapter/examples/proxy_server_support.py +384 -0
  491. mcp_proxy_adapter/examples/queue_demo_simple.py +37 -0
  492. mcp_proxy_adapter/examples/queue_demo_simple_parts/__init__.py +3 -0
  493. mcp_proxy_adapter/examples/queue_demo_simple_parts/_shared.py +8 -0
  494. mcp_proxy_adapter/examples/queue_demo_simple_parts/demo.py +213 -0
  495. mcp_proxy_adapter/examples/queue_demo_simple_parts/mock_commands.py +130 -0
  496. mcp_proxy_adapter/examples/queue_demo_simple_parts/mock_manager.py +272 -0
  497. mcp_proxy_adapter/examples/queue_example_support.py +36 -0
  498. mcp_proxy_adapter/examples/queue_fire_and_forget_example.py +370 -0
  499. mcp_proxy_adapter/examples/queue_server_demo.py +73 -0
  500. mcp_proxy_adapter/examples/queue_server_example.py +76 -0
  501. mcp_proxy_adapter/examples/queue_server_simple.py +251 -0
  502. mcp_proxy_adapter/examples/required_certificates.py +216 -0
  503. mcp_proxy_adapter/examples/run_example.py +119 -0
  504. mcp_proxy_adapter/examples/run_full_test_suite.py +674 -0
  505. mcp_proxy_adapter/examples/run_proxy_server.py +118 -0
  506. mcp_proxy_adapter/examples/run_security_tests_fixed.py +876 -0
  507. mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
  508. mcp_proxy_adapter/examples/security_test/auth_manager.py +49 -0
  509. mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +144 -0
  510. mcp_proxy_adapter/examples/security_test/test_client.py +218 -0
  511. mcp_proxy_adapter/examples/security_test/test_result.py +23 -0
  512. mcp_proxy_adapter/examples/security_test_client.py +103 -0
  513. mcp_proxy_adapter/examples/server_configs/config_basic_http.json +16 -0
  514. mcp_proxy_adapter/examples/server_configs/config_http_token.json +16 -0
  515. mcp_proxy_adapter/examples/server_configs/config_https.json +16 -0
  516. mcp_proxy_adapter/examples/server_configs/config_https_token.json +16 -0
  517. mcp_proxy_adapter/examples/server_configs/config_mtls.json +16 -0
  518. mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +15 -0
  519. mcp_proxy_adapter/examples/server_configs/config_simple.json +9 -0
  520. mcp_proxy_adapter/examples/server_configs/http_simple.json +14 -0
  521. mcp_proxy_adapter/examples/server_configs/http_token.json +14 -0
  522. mcp_proxy_adapter/examples/server_configs/https_simple.json +14 -0
  523. mcp_proxy_adapter/examples/server_configs/https_token.json +14 -0
  524. mcp_proxy_adapter/examples/server_configs/mtls_no_roles.json +8 -0
  525. mcp_proxy_adapter/examples/server_configs/mtls_test.json +8 -0
  526. mcp_proxy_adapter/examples/server_configs/mtls_with_roles.json +14 -0
  527. mcp_proxy_adapter/examples/server_configs/roles.json +1 -0
  528. mcp_proxy_adapter/examples/setup/__init__.py +48 -0
  529. mcp_proxy_adapter/examples/setup/certificate_manager.py +384 -0
  530. mcp_proxy_adapter/examples/setup/config_generator.py +6 -0
  531. mcp_proxy_adapter/examples/setup/config_validator.py +140 -0
  532. mcp_proxy_adapter/examples/setup/environment_setup.py +143 -0
  533. mcp_proxy_adapter/examples/setup/test_files_generator.py +6 -0
  534. mcp_proxy_adapter/examples/setup/test_runner.py +143 -0
  535. mcp_proxy_adapter/examples/setup_test_environment.py +233 -0
  536. mcp_proxy_adapter/examples/simple_http_example.json +17 -0
  537. mcp_proxy_adapter/examples/simple_https_example.json +17 -0
  538. mcp_proxy_adapter/examples/simple_protocol_test.py +167 -0
  539. mcp_proxy_adapter/examples/test_client/README.md +166 -0
  540. mcp_proxy_adapter/examples/test_client/__init__.py +7 -0
  541. mcp_proxy_adapter/examples/test_client/main.py +102 -0
  542. mcp_proxy_adapter/examples/test_client/main_split_parts/__init__.py +1 -0
  543. mcp_proxy_adapter/examples/test_client/main_split_parts/helpers.py +83 -0
  544. mcp_proxy_adapter/examples/test_client/main_split_parts/runner.py +115 -0
  545. mcp_proxy_adapter/examples/test_client/main_split_parts/scenarios.py +195 -0
  546. mcp_proxy_adapter/examples/test_config.py +183 -0
  547. mcp_proxy_adapter/examples/test_configs/custom_https.json +10 -0
  548. mcp_proxy_adapter/examples/test_configs/http_simple.json +10 -0
  549. mcp_proxy_adapter/examples/test_examples.py +361 -0
  550. mcp_proxy_adapter/examples/test_mcp_server.py +249 -0
  551. mcp_proxy_adapter/examples/test_protocol_examples.py +373 -0
  552. mcp_proxy_adapter/examples/test_proxy/README.md +70 -0
  553. mcp_proxy_adapter/examples/test_proxy/__init__.py +7 -0
  554. mcp_proxy_adapter/examples/test_proxy/main.py +106 -0
  555. mcp_proxy_adapter/examples/test_server/README.md +58 -0
  556. mcp_proxy_adapter/examples/test_server/__init__.py +7 -0
  557. mcp_proxy_adapter/examples/test_server/main.py +349 -0
  558. mcp_proxy_adapter/examples/transparent_queue_commands.py +281 -0
  559. mcp_proxy_adapter/examples/transparent_queue_e1_sync_call.py +102 -0
  560. mcp_proxy_adapter/examples/transparent_queue_e2_event_stream.py +134 -0
  561. mcp_proxy_adapter/examples/transparent_queue_e3_ws_timeouts.py +341 -0
  562. mcp_proxy_adapter/examples/transparent_queue_e4_ws_fallback.py +159 -0
  563. mcp_proxy_adapter/examples/transparent_queue_e5_inner_failure.py +189 -0
  564. mcp_proxy_adapter/examples/transparent_queue_e6_atomic_state.py +203 -0
  565. mcp_proxy_adapter/examples/transparent_queue_e7_caller_loss.py +63 -0
  566. mcp_proxy_adapter/examples/transparent_queue_e7_split2/__init__.py +3 -0
  567. mcp_proxy_adapter/examples/transparent_queue_e7_split2/cases.py +335 -0
  568. mcp_proxy_adapter/examples/transparent_queue_e7_split2/helpers.py +66 -0
  569. mcp_proxy_adapter/examples/transparent_queue_support.py +377 -0
  570. mcp_proxy_adapter/examples/unified_error_handling_example.py +127 -0
  571. mcp_proxy_adapter/examples/unified_error_handling_split_parts/__init__.py +3 -0
  572. mcp_proxy_adapter/examples/unified_error_handling_split_parts/demos.py +180 -0
  573. mcp_proxy_adapter/examples/unified_error_handling_split_parts/runner.py +109 -0
  574. mcp_proxy_adapter/examples/unified_error_handling_split_parts/support.py +79 -0
  575. mcp_proxy_adapter/examples/unified_error_handling_texts.py +17 -0
  576. mcp_proxy_adapter/examples/universal_client.py +215 -0
  577. mcp_proxy_adapter/examples/universal_client_split_parts/__init__.py +3 -0
  578. mcp_proxy_adapter/examples/universal_client_split_parts/configs.py +104 -0
  579. mcp_proxy_adapter/examples/universal_client_split_parts/demos.py +144 -0
  580. mcp_proxy_adapter/examples/update_config_certificates.py +156 -0
  581. mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +60 -0
  582. mcp_proxy_adapter/examples/websocket_examples/__init__.py +8 -0
  583. mcp_proxy_adapter/examples/websocket_examples/client_bidirectional_websocket.py +100 -0
  584. mcp_proxy_adapter/examples/websocket_examples/client_websocket_job_status.py +103 -0
  585. mcp_proxy_adapter/examples/websocket_examples/run_ws_test_server.py +157 -0
  586. mcp_proxy_adapter/examples/ws_examples/__init__.py +6 -0
  587. mcp_proxy_adapter/examples/ws_examples/http_basic_ws.py +68 -0
  588. mcp_proxy_adapter/examples/ws_examples/http_token_roles_ws.py +66 -0
  589. mcp_proxy_adapter/examples/ws_examples/http_token_ws.py +80 -0
  590. mcp_proxy_adapter/examples/ws_examples/https_basic_ws.py +61 -0
  591. mcp_proxy_adapter/examples/ws_examples/https_token_roles_ws.py +67 -0
  592. mcp_proxy_adapter/examples/ws_examples/https_token_ws.py +64 -0
  593. mcp_proxy_adapter/examples/ws_examples/mtls_basic_ws.py +94 -0
  594. mcp_proxy_adapter/examples/ws_examples/mtls_roles_ws.py +88 -0
  595. mcp_proxy_adapter/examples/ws_examples/ws_example_runner.py +233 -0
  596. mcp_proxy_adapter/integrations/__init__.py +31 -0
  597. mcp_proxy_adapter/integrations/queuemgr_integration/__init__.py +124 -0
  598. mcp_proxy_adapter/integrations/queuemgr_integration/_compat.py +60 -0
  599. mcp_proxy_adapter/integrations/queuemgr_integration/_health.py +299 -0
  600. mcp_proxy_adapter/integrations/queuemgr_integration/_limits.py +70 -0
  601. mcp_proxy_adapter/integrations/queuemgr_integration/_process_reap.py +232 -0
  602. mcp_proxy_adapter/integrations/queuemgr_integration/_result_builders.py +119 -0
  603. mcp_proxy_adapter/integrations/queuemgr_integration/_status_helpers.py +167 -0
  604. mcp_proxy_adapter/integrations/queuemgr_integration/global_manager.py +174 -0
  605. mcp_proxy_adapter/integrations/queuemgr_integration/job_types/__init__.py +375 -0
  606. mcp_proxy_adapter/integrations/queuemgr_integration/job_types/value_types.py +97 -0
  607. mcp_proxy_adapter/integrations/queuemgr_integration/job_types/worker_probe.py +29 -0
  608. mcp_proxy_adapter/integrations/queuemgr_integration/manager/__init__.py +52 -0
  609. mcp_proxy_adapter/integrations/queuemgr_integration/manager/fallback_base.py +240 -0
  610. mcp_proxy_adapter/integrations/queuemgr_integration/manager/fallback_stop_base.py +179 -0
  611. mcp_proxy_adapter/integrations/queuemgr_integration/manager/health_base.py +460 -0
  612. mcp_proxy_adapter/integrations/queuemgr_integration/manager/integration.py +189 -0
  613. mcp_proxy_adapter/integrations/queuemgr_integration/manager/job_start_base.py +333 -0
  614. mcp_proxy_adapter/integrations/queuemgr_integration/manager/job_stop_base.py +274 -0
  615. mcp_proxy_adapter/integrations/queuemgr_integration/manager/lifecycle_base.py +393 -0
  616. mcp_proxy_adapter/integrations/queuemgr_integration/manager/query_base.py +269 -0
  617. mcp_proxy_adapter/integrations/queuemgr_registration.py +66 -0
  618. mcp_proxy_adapter/integrations/queuemgr_version.py +39 -0
  619. mcp_proxy_adapter/main.py +385 -0
  620. mcp_proxy_adapter/main_ssl_paths.py +29 -0
  621. mcp_proxy_adapter/py.typed +0 -0
  622. mcp_proxy_adapter/schemas/base_schema.json +114 -0
  623. mcp_proxy_adapter/schemas/openapi_schema.json +269 -0
  624. mcp_proxy_adapter/schemas/roles.json +37 -0
  625. mcp_proxy_adapter/schemas/roles_schema.json +162 -0
  626. mcp_proxy_adapter/transfer/__init__.py +56 -0
  627. mcp_proxy_adapter/transfer/checksums.py +81 -0
  628. mcp_proxy_adapter/transfer/client_downloader/__init__.py +37 -0
  629. mcp_proxy_adapter/transfer/client_downloader/download_support.py +109 -0
  630. mcp_proxy_adapter/transfer/client_downloader/downloader.py +300 -0
  631. mcp_proxy_adapter/transfer/client_uploader.py +278 -0
  632. mcp_proxy_adapter/transfer/compression.py +127 -0
  633. mcp_proxy_adapter/transfer/errors.py +253 -0
  634. mcp_proxy_adapter/transfer/json_coerce.py +32 -0
  635. mcp_proxy_adapter/transfer/models.py +337 -0
  636. mcp_proxy_adapter/transfer/path_confinement.py +69 -0
  637. mcp_proxy_adapter/transfer/progress_percent.py +25 -0
  638. mcp_proxy_adapter/transfer/server_store.py +878 -0
  639. mcp_proxy_adapter/version.py +8 -0
  640. mcp_proxy_adapter_dev-8.11.16.dist-info/METADATA +1666 -0
  641. mcp_proxy_adapter_dev-8.11.16.dist-info/RECORD +644 -0
  642. mcp_proxy_adapter_dev-8.11.16.dist-info/WHEEL +5 -0
  643. mcp_proxy_adapter_dev-8.11.16.dist-info/entry_points.txt +12 -0
  644. mcp_proxy_adapter_dev-8.11.16.dist-info/top_level.txt +1 -0
@@ -0,0 +1,215 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Application factory for MCP Proxy Adapter API.
6
+ """
7
+
8
+ from typing import Any, Dict, Optional
9
+
10
+ from fastapi import FastAPI
11
+
12
+ from mcp_proxy_adapter.commands.help_command import set_app_metadata
13
+ from mcp_proxy_adapter.core.logging import get_global_logger
14
+ from mcp_proxy_adapter.custom_openapi import custom_openapi_with_fallback
15
+
16
+ from .app_factory_config import debug_config_info, resolve_current_config
17
+ from .app_factory_routes import setup_routes
18
+ from .app_factory_validators import validate_configuration
19
+ from .lifespan_manager import LifespanManager
20
+
21
+
22
+ class AppFactory:
23
+ """Factory for creating FastAPI applications."""
24
+
25
+ def __init__(self) -> None:
26
+ """Initialize app factory."""
27
+ self.logger = get_global_logger()
28
+ self.lifespan_manager = LifespanManager()
29
+ self._config_path: Optional[str] = None
30
+
31
+ def create_app(
32
+ self,
33
+ title: Optional[str] = None,
34
+ description: Optional[str] = None,
35
+ version: Optional[str] = None,
36
+ app_config: Optional[Dict[str, Any]] = None,
37
+ config_path: Optional[str] = None,
38
+ ) -> FastAPI:
39
+ """Create and configure FastAPI application."""
40
+ self._config_path = config_path
41
+ if config_path:
42
+ # The file given at start stays the default source of `reload`
43
+ # for the whole server lifetime.
44
+ from mcp_proxy_adapter.config import get_config
45
+
46
+ get_config().set_start_config_path(config_path)
47
+ current_config = resolve_current_config(app_config)
48
+ debug_config_info(app_config, self.logger)
49
+
50
+ # ONE enforcement call: validate_configuration builds a SimpleConfigModel
51
+ # from current_config and runs SimpleConfigValidator, rejecting any
52
+ # invalid configuration (bug e86b4fb5's fix removed the second,
53
+ # independently-implemented validate_certificates() call that used to
54
+ # duplicate this exact work under a misleading name - see
55
+ # pipeline/checks/check_config_validation_wired.py).
56
+ validate_configuration(current_config, self.logger, self._config_path)
57
+
58
+ title = title or "MCP Proxy Adapter"
59
+ description = description or "JSON-RPC API for interacting with MCP Proxy"
60
+ version = version or "1.0.0"
61
+
62
+ self.logger.info(
63
+ "🔍 AppFactory: Creating lifespan with current_config keys: %s",
64
+ list(current_config.keys()) if hasattr(current_config, "keys") else "None",
65
+ )
66
+ lifespan = self.lifespan_manager.create_lifespan(config_path, current_config)
67
+ self.logger.info(
68
+ "🔍 AppFactory: lifespan created, callable=%s", callable(lifespan)
69
+ )
70
+
71
+ app = FastAPI(
72
+ title=title,
73
+ description=description,
74
+ version=version,
75
+ lifespan=lifespan,
76
+ )
77
+ # The listener is started after this factory returns. Keep the
78
+ # validated source configuration on this app so ServerEngineFactory
79
+ # can apply its TLS settings even when a consumer supplies only
80
+ # host/port/log_level to engine.run_server().
81
+ app.state.mcp_proxy_adapter_config = current_config
82
+ app.state.mcp_proxy_adapter_config_path = config_path
83
+ self.logger.info("🔍 AppFactory: FastAPI app created")
84
+
85
+ # Register built-in commands automatically
86
+ # Pass current_config to enable automatic queue commands registration
87
+ #
88
+ # Import deferred to point of use (surfaced while fixing bug
89
+ # 7f7ce943): this module is reachable from
90
+ # `commands/builtin_commands.py` itself via
91
+ # `health_command.py -> core/proxy_registration.py ->
92
+ # api/core/registration_manager -> api/core/__init__.py ->
93
+ # this module`. A module-level import here used to work only by
94
+ # ACCIDENT OF IMPORT ORDER - as long as something else (previously,
95
+ # `mcp_proxy_adapter/__init__.py`'s own eager `create_app` import)
96
+ # fully warmed `api.core`/this module BEFORE anything imported
97
+ # `commands.builtin_commands` directly, the cycle never manifested.
98
+ # Once that accidental warm-up was removed (deferred, for the same
99
+ # bug), any direct import of `commands.builtin_commands` (e.g.
100
+ # `pipeline/checks/check_info_command.py`) hit this module while
101
+ # `commands.builtin_commands` was still mid-init, and
102
+ # `register_builtin_commands` did not exist on it yet -
103
+ # `ImportError: cannot import name 'register_builtin_commands' from
104
+ # partially initialized module ... (most likely due to a circular
105
+ # import)`. Importing here instead means this module finishes
106
+ # loading regardless of which side of the cycle is entered first.
107
+ from mcp_proxy_adapter.commands.builtin_commands import (
108
+ register_builtin_commands,
109
+ )
110
+
111
+ register_builtin_commands(config_data=current_config)
112
+ self.logger.info("✅ Built-in commands registered")
113
+
114
+ # Store app metadata for help command
115
+ set_app_metadata(title, description, version)
116
+ self.logger.info(f"✅ App metadata stored: {title} v{version}")
117
+
118
+ setup_routes(app)
119
+ app.openapi = lambda: custom_openapi_with_fallback(app) # type: ignore[method-assign] # monkeypatch
120
+
121
+ # Add security middleware when EITHER the canonical auth.use_token or
122
+ # the legacy security.enabled flag requests authentication, so /ws and
123
+ # other public paths are enforced (enables repro of WebSocket 403
124
+ # under mTLS). Defect 2e24933f-a130-47d7-95b2-370b69c89b8f: every
125
+ # shipped config declares credentials under "auth" (the schema
126
+ # SimpleConfigModel declares, AuthValidator validates, and both
127
+ # packaged config generators emit) rather than the legacy "security"
128
+ # section, so gating registration on security.enabled alone left
129
+ # those configs' credentials completely unenforced. auth takes
130
+ # precedence when both sections are present; a config with neither
131
+ # flag set registers no middleware and stays open (three shipped
132
+ # modes legitimately run without credentials).
133
+ auth_cfg = current_config.get("auth", {}) or {}
134
+ security_cfg = current_config.get("security", {}) or {}
135
+ if auth_cfg.get("use_token", False) or security_cfg.get("enabled", False):
136
+ from mcp_proxy_adapter.api.middleware.unified_security import (
137
+ UnifiedSecurityMiddleware,
138
+ )
139
+
140
+ app.add_middleware(UnifiedSecurityMiddleware, config=current_config)
141
+ self.logger.info(
142
+ "Unified security middleware added (auth.use_token=%s, "
143
+ "security.enabled=%s)",
144
+ auth_cfg.get("use_token", False),
145
+ security_cfg.get("enabled", False),
146
+ )
147
+
148
+ # Request logging middleware: UNCONDITIONAL (bug 73b03995 / deb24fa7
149
+ # logging half). Access logging is observability, not a security
150
+ # feature, so it needs no config flag. Added AFTER the security
151
+ # middleware above so it ends up OUTERMOST (Starlette's
152
+ # add_middleware() makes the LAST-added middleware the outermost
153
+ # one - see mcp_proxy_adapter/api/middleware/request_logging.py's
154
+ # docstring), wrapping the security middleware so its one access-log
155
+ # line per request also covers a 401/403 security rejection.
156
+ from mcp_proxy_adapter.api.middleware.request_logging import (
157
+ RequestLoggingMiddleware,
158
+ )
159
+
160
+ app.add_middleware(RequestLoggingMiddleware)
161
+ self.logger.info("Request logging middleware added (unconditional)")
162
+
163
+ # CORS middleware: UNCONDITIONAL, like request logging above (bug
164
+ # 4d3d801c). Before this fix, CORSMiddleware was wired only in the
165
+ # OTHER app-creation path - core/app_factory/app_creator.py, reached
166
+ # only by examples/basic_framework/main.py and examples/test_config.py
167
+ # - while THIS factory (AppFactory.create_app, the one
168
+ # examples/full_application/main.py and the pipeline's server
169
+ # actually use) never added it at all, so a browser-based caller got
170
+ # no CORS headers on any request, preflight included.
171
+ #
172
+ # No "cors" config surface existed anywhere in this project (no
173
+ # dataclass field on SimpleConfigModel, no key any generator emits)
174
+ # before this fix, so an optional "cors" section is read the same
175
+ # way "auth"/"security" are read above - a raw dict lookup on
176
+ # current_config, never routed through SimpleConfigModel - and
177
+ # unknown/absent keys fall back to a CONSERVATIVE documented
178
+ # default: reflect the requesting origin (allow_origins=["*"]) but
179
+ # WITHOUT credentials, and restrict methods to what this JSON-RPC/
180
+ # command API actually exposes (GET for /health and docs, POST for
181
+ # /api/jsonrpc and /api/async, OPTIONS for the preflight itself).
182
+ # This is spec-legal and safe: a wildcard origin combined with
183
+ # allow_credentials=False never leaks cookies/auth headers
184
+ # cross-origin (unlike app_creator.py's allow_origins=["*"] +
185
+ # allow_credentials=True combination, which relies on Starlette
186
+ # reflecting the concrete origin instead of literal "*" to stay
187
+ # spec-legal and is intentionally NOT replicated here). Added LAST
188
+ # so it is the OUTERMOST middleware (see the comment on
189
+ # RequestLoggingMiddleware above for why last-added = outermost in
190
+ # Starlette): CORS headers must be present even on a 401/403/5xx
191
+ # response, or a browser-based caller sees an opaque network error
192
+ # instead of the real status.
193
+ cors_cfg = current_config.get("cors", {}) or {}
194
+ from fastapi.middleware.cors import CORSMiddleware
195
+
196
+ cors_allow_origins = cors_cfg.get("allow_origins", ["*"])
197
+ cors_allow_credentials = cors_cfg.get("allow_credentials", False)
198
+ cors_allow_methods = cors_cfg.get("allow_methods", ["GET", "POST", "OPTIONS"])
199
+ cors_allow_headers = cors_cfg.get("allow_headers", ["*"])
200
+ app.add_middleware(
201
+ CORSMiddleware,
202
+ allow_origins=cors_allow_origins,
203
+ allow_credentials=cors_allow_credentials,
204
+ allow_methods=cors_allow_methods,
205
+ allow_headers=cors_allow_headers,
206
+ )
207
+ self.logger.info(
208
+ "CORS middleware added (allow_origins=%s, allow_credentials=%s, "
209
+ "allow_methods=%s)",
210
+ cors_allow_origins,
211
+ cors_allow_credentials,
212
+ cors_allow_methods,
213
+ )
214
+
215
+ return app
@@ -0,0 +1,159 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Certificate validation helpers for API AppFactory.
6
+ """
7
+
8
+ from dataclasses import fields
9
+ from typing import Any, Dict, Optional, Tuple, Type
10
+
11
+ RegistrationConfigData = Dict[str, Any]
12
+
13
+
14
+ def build_simple_config_model(current_config: Dict[str, Any]) -> Any:
15
+ """
16
+ Build a SimpleConfigModel from a raw configuration dict.
17
+
18
+ This is the single shared implementation for reconstructing a
19
+ ``SimpleConfigModel`` out of an in-memory config dict (as opposed to
20
+ ``SimpleConfig.load()``, which reconstructs one from a config file path).
21
+ Both certificate validation and startup configuration validation use
22
+ this helper so there is exactly one place that knows how to map a raw
23
+ dict onto the dataclass model.
24
+
25
+ Args:
26
+ current_config: Configuration dictionary.
27
+
28
+ Returns:
29
+ A populated SimpleConfigModel instance.
30
+ """
31
+ from mcp_proxy_adapter.core.config.simple_config import (
32
+ AuthConfig,
33
+ ClientConfig,
34
+ HeartbeatConfig,
35
+ QueueManagerConfig,
36
+ RegistrationConfig,
37
+ ServerConfig,
38
+ ServerValidationConfig,
39
+ SimpleConfigModel,
40
+ SSLConfig,
41
+ )
42
+
43
+ server_data = _filter_dataclass_fields(
44
+ ServerConfig, current_config.get("server", {})
45
+ )
46
+ if "servername" not in server_data:
47
+ server_data["servername"] = server_data.get("host", "localhost")
48
+ server_data = _coerce_ssl_config(server_data, SSLConfig)
49
+ server = ServerConfig(**server_data)
50
+ client_data = _filter_dataclass_fields(
51
+ ClientConfig, current_config.get("client", {})
52
+ )
53
+ client_data = _coerce_ssl_config(client_data, SSLConfig)
54
+ client = ClientConfig(**client_data)
55
+ registration, heartbeat_override = _build_registration_config(current_config)
56
+ registration = _filter_dataclass_fields(RegistrationConfig, registration)
57
+ registration = _coerce_ssl_config(registration, SSLConfig)
58
+ auth = AuthConfig(**current_config.get("auth", {}))
59
+ server_validation_data = _filter_dataclass_fields(
60
+ ServerValidationConfig,
61
+ current_config.get("server_validation", {}),
62
+ )
63
+ server_validation_data = _coerce_ssl_config(server_validation_data, SSLConfig)
64
+ server_validation = ServerValidationConfig(**server_validation_data)
65
+ queue_manager_data = _filter_dataclass_fields(
66
+ QueueManagerConfig,
67
+ current_config.get("queue_manager", {}),
68
+ )
69
+ queue_manager = QueueManagerConfig(**queue_manager_data)
70
+ registration_model = RegistrationConfig(**registration)
71
+ if heartbeat_override is not None:
72
+ registration_model.heartbeat = HeartbeatConfig(**heartbeat_override)
73
+ return SimpleConfigModel(
74
+ server=server,
75
+ client=client,
76
+ registration=registration_model,
77
+ server_validation=server_validation,
78
+ auth=auth,
79
+ queue_manager=queue_manager,
80
+ )
81
+
82
+
83
+ def _filter_dataclass_fields(cls: Type[Any], data: Any) -> Dict[str, Any]:
84
+ """Return only keys accepted by a dataclass constructor."""
85
+ if not isinstance(data, dict):
86
+ return {}
87
+ allowed = {field.name for field in fields(cls)}
88
+ return {key: value for key, value in data.items() if key in allowed}
89
+
90
+
91
+ def _coerce_ssl_config(data: Dict[str, Any], ssl_cls: Type[Any]) -> Dict[str, Any]:
92
+ """Convert nested ssl dict to SSLConfig while preserving existing objects."""
93
+ ssl_value = data.get("ssl")
94
+ if not isinstance(ssl_value, dict):
95
+ return data
96
+
97
+ ssl_data = ssl_value.copy()
98
+ if "check_hostname" in ssl_data:
99
+ ssl_data["dnscheck"] = ssl_data["check_hostname"]
100
+ elif "dnscheck" in ssl_data and "check_hostname" not in ssl_data:
101
+ ssl_data["check_hostname"] = ssl_data["dnscheck"]
102
+ data = data.copy()
103
+ # Unknown/retired keys (e.g. server.ssl.verify_client) must not crash the
104
+ # strict dataclass; SimpleConfigValidator reports them from the raw dict.
105
+ known = {f.name for f in fields(ssl_cls)}
106
+ data["ssl"] = ssl_cls(**{k: v for k, v in ssl_data.items() if k in known})
107
+ return data
108
+
109
+
110
+ def _build_registration_config(
111
+ current_config: Dict[str, Any],
112
+ ) -> Tuple[RegistrationConfigData, Optional[Dict[str, Any]]]:
113
+ """Build registration configuration and heartbeat overrides."""
114
+ registration_config = current_config.get("registration", {}) or {}
115
+ if not registration_config and current_config.get("proxy_client"):
116
+ pc = current_config["proxy_client"]
117
+ registration_config = {
118
+ "enabled": pc.get("enabled", False),
119
+ "host": pc.get("host", "localhost"),
120
+ "port": pc.get("port", 3005),
121
+ "protocol": pc.get("protocol", "http"),
122
+ "server_id": pc.get("server_id"),
123
+ "server_name": pc.get("server_name"),
124
+ "cert_file": pc.get("cert_file"),
125
+ "key_file": pc.get("key_file"),
126
+ "ca_cert_file": pc.get("ca_cert_file"),
127
+ "crl_file": pc.get("crl_file"),
128
+ "use_system_ca": pc.get("use_system_ca", False),
129
+ "register_endpoint": (
130
+ pc.get("registration", {}).get("register_endpoint", "/register")
131
+ if isinstance(pc.get("registration"), dict)
132
+ else "/register"
133
+ ),
134
+ "unregister_endpoint": (
135
+ pc.get("registration", {}).get("unregister_endpoint", "/unregister")
136
+ if isinstance(pc.get("registration"), dict)
137
+ else "/unregister"
138
+ ),
139
+ "auto_on_startup": (
140
+ pc.get("registration", {}).get("auto_on_startup", True)
141
+ if isinstance(pc.get("registration"), dict)
142
+ else True
143
+ ),
144
+ "auto_on_shutdown": (
145
+ pc.get("registration", {}).get("auto_on_shutdown", True)
146
+ if isinstance(pc.get("registration"), dict)
147
+ else True
148
+ ),
149
+ "heartbeat": pc.get("heartbeat", {}),
150
+ }
151
+
152
+ heartbeat_override = None
153
+ heartbeat = registration_config.get("heartbeat")
154
+ if isinstance(heartbeat, dict):
155
+ heartbeat_override = heartbeat.copy()
156
+ if "endpoint" in heartbeat_override and "url" not in heartbeat_override:
157
+ heartbeat_override.pop("endpoint")
158
+
159
+ return registration_config, heartbeat_override
@@ -0,0 +1,75 @@
1
+ """
2
+ Author: Vasiliy Zdanovskiy
3
+ email: vasilyvz@gmail.com
4
+
5
+ Configuration helpers for API AppFactory.
6
+ """
7
+
8
+ import logging
9
+ from typing import Any, Dict, Optional, cast
10
+
11
+ from mcp_proxy_adapter.core.logging import get_global_logger
12
+
13
+
14
+ def resolve_current_config(app_config: Optional[Dict[str, Any]]) -> Dict[str, Any]:
15
+ """
16
+ Resolve application configuration from provided source or global config.
17
+
18
+ Args:
19
+ app_config: Configuration dict or config object.
20
+
21
+ Returns:
22
+ Dictionary with resolved configuration.
23
+ """
24
+ if app_config is not None:
25
+ if hasattr(app_config, "get_all"):
26
+ return cast(Dict[str, Any], app_config.get_all())
27
+ if hasattr(app_config, "keys"):
28
+ return app_config
29
+ return app_config
30
+
31
+ try:
32
+ from mcp_proxy_adapter.config import get_config
33
+
34
+ return get_config().get_all()
35
+ except Exception:
36
+ return {}
37
+
38
+
39
+ def debug_config_info(
40
+ app_config: Optional[Dict[str, Any]],
41
+ logger: Optional[logging.Logger] = None,
42
+ ) -> None:
43
+ """
44
+ Log diagnostic information about the configuration create_app() received.
45
+
46
+ Silent by default (bug 20231492): this used to be five bare print()
47
+ calls, which made every create_app() invocation write to stdout
48
+ regardless of caller intent. Reporting now goes through logger.debug(),
49
+ which is silent unless the caller has explicitly enabled DEBUG-level
50
+ console logging (see core.logging.setup_logging) - the pure scaffolding
51
+ branches (no app_config supplied; app_config of an unexpected type) that
52
+ carried no diagnostic value beyond restating the obvious were dropped
53
+ instead of being demoted.
54
+
55
+ Args:
56
+ app_config: Configuration dict or config object.
57
+ logger: Logger to report through. Defaults to the package's global
58
+ logger (mcp_proxy_adapter.core.logging.get_global_logger()).
59
+ """
60
+ if not app_config or not hasattr(app_config, "keys"):
61
+ return
62
+
63
+ log = logger or get_global_logger()
64
+ keys = list(app_config.keys())
65
+ protocol = app_config.get("server", {}).get("protocol", "http")
66
+ # verify_client is protocol-derived only (todo 9425f2d0 target B,
67
+ # BREAKING) - the former transport.verify_client debug read is dropped,
68
+ # it was print-only scaffolding.
69
+ ssl_enabled = protocol in ["https", "mtls"]
70
+ log.debug(
71
+ "create_app received app_config keys=%s protocol=%s ssl_enabled=%s",
72
+ keys,
73
+ protocol,
74
+ ssl_enabled,
75
+ )