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.
- mcp_proxy_adapter/__init__.py +73 -0
- mcp_proxy_adapter/__main__.py +13 -0
- mcp_proxy_adapter/api/__init__.py +38 -0
- mcp_proxy_adapter/api/app.py +64 -0
- mcp_proxy_adapter/api/command_session_service.py +455 -0
- mcp_proxy_adapter/api/core/__init__.py +19 -0
- mcp_proxy_adapter/api/core/app_factory.py +215 -0
- mcp_proxy_adapter/api/core/app_factory_certificates.py +159 -0
- mcp_proxy_adapter/api/core/app_factory_config.py +75 -0
- mcp_proxy_adapter/api/core/app_factory_routes.py +345 -0
- mcp_proxy_adapter/api/core/app_factory_validators.py +165 -0
- mcp_proxy_adapter/api/core/lifespan_manager/__init__.py +52 -0
- mcp_proxy_adapter/api/core/lifespan_manager/manager.py +354 -0
- mcp_proxy_adapter/api/core/lifespan_manager/queue_config.py +37 -0
- mcp_proxy_adapter/api/core/lifespan_manager/signal_registration.py +74 -0
- mcp_proxy_adapter/api/core/registration/__init__.py +24 -0
- mcp_proxy_adapter/api/core/registration/config_parsers.py +247 -0
- mcp_proxy_adapter/api/core/registration/context_builder.py +130 -0
- mcp_proxy_adapter/api/core/registration/helpers.py +36 -0
- mcp_proxy_adapter/api/core/registration/metadata_builders.py +117 -0
- mcp_proxy_adapter/api/core/registration/models.py +42 -0
- mcp_proxy_adapter/api/core/registration/resolvers.py +195 -0
- mcp_proxy_adapter/api/core/registration/url_builders.py +122 -0
- mcp_proxy_adapter/api/core/registration_context.py +30 -0
- mcp_proxy_adapter/api/core/registration_manager/__init__.py +31 -0
- mcp_proxy_adapter/api/core/registration_manager/helpers.py +307 -0
- mcp_proxy_adapter/api/core/registration_manager/manager.py +584 -0
- mcp_proxy_adapter/api/core/registration_manager/status.py +152 -0
- mcp_proxy_adapter/api/core/registration_tasks.py +387 -0
- mcp_proxy_adapter/api/core/ssl_context_factory.py +99 -0
- mcp_proxy_adapter/api/execute_async_contract.py +124 -0
- mcp_proxy_adapter/api/handlers/__init__.py +335 -0
- mcp_proxy_adapter/api/handlers/command_execution.py +709 -0
- mcp_proxy_adapter/api/handlers/health.py +157 -0
- mcp_proxy_adapter/api/handlers/jsonrpc.py +207 -0
- mcp_proxy_adapter/api/handlers/transfer_notify.py +313 -0
- mcp_proxy_adapter/api/handlers/transfer_sessions.py +287 -0
- mcp_proxy_adapter/api/handlers_async.py +233 -0
- mcp_proxy_adapter/api/health_provider.py +44 -0
- mcp_proxy_adapter/api/jsonrpc_job_lifecycle.py +165 -0
- mcp_proxy_adapter/api/jsonrpc_job_status.py +94 -0
- mcp_proxy_adapter/api/middleware/__init__.py +14 -0
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +73 -0
- mcp_proxy_adapter/api/middleware/request_logging.py +153 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +367 -0
- mcp_proxy_adapter/api/openapi/__init__.py +18 -0
- mcp_proxy_adapter/api/openapi/command_integration.py +107 -0
- mcp_proxy_adapter/api/openapi/openapi_generator.py +138 -0
- mcp_proxy_adapter/api/openapi/openapi_registry.py +55 -0
- mcp_proxy_adapter/api/public_downloads.py +68 -0
- mcp_proxy_adapter/api/schemas.py +290 -0
- mcp_proxy_adapter/api/tool_integration.py +124 -0
- mcp_proxy_adapter/api/tools.py +244 -0
- mcp_proxy_adapter/api/transfer_session_service.py +329 -0
- mcp_proxy_adapter/api/ws_endpoint.py +653 -0
- mcp_proxy_adapter/api/ws_identity.py +111 -0
- mcp_proxy_adapter/cli/__init__.py +12 -0
- mcp_proxy_adapter/cli/commands/__init__.py +14 -0
- mcp_proxy_adapter/cli/commands/client.py +137 -0
- mcp_proxy_adapter/cli/commands/config_docs/__init__.py +23 -0
- mcp_proxy_adapter/cli/commands/config_docs/cli.py +63 -0
- mcp_proxy_adapter/cli/commands/config_docs/declared_settings.py +45 -0
- mcp_proxy_adapter/cli/commands/config_docs/render.py +58 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/__init__.py +61 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/_chunk.py +19 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/authentication.py +127 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/best_practices.py +166 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/common_patterns.py +154 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/overview.py +135 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/queue_manager.py +140 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/registration.py +212 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/server.py +193 -0
- mcp_proxy_adapter/cli/commands/config_docs/sections/troubleshooting.py +215 -0
- mcp_proxy_adapter/cli/commands/config_generate.py +95 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/__init__.py +1 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/arguments.py +44 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_core.py +141 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_queue.py +140 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/arguments_validation.py +142 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/generation.py +365 -0
- mcp_proxy_adapter/cli/commands/config_generate_parts/parsing.py +122 -0
- mcp_proxy_adapter/cli/commands/config_validate.py +154 -0
- mcp_proxy_adapter/cli/commands/info.py +297 -0
- mcp_proxy_adapter/cli/commands/server.py +361 -0
- mcp_proxy_adapter/cli/commands/sets.py +165 -0
- mcp_proxy_adapter/cli/commands/standalone_entry.py +25 -0
- mcp_proxy_adapter/cli/commands/testconfig.py +205 -0
- mcp_proxy_adapter/cli/examples/__init__.py +9 -0
- mcp_proxy_adapter/cli/main.py +75 -0
- mcp_proxy_adapter/cli/parser.py +244 -0
- mcp_proxy_adapter/cli/validators.py +389 -0
- mcp_proxy_adapter/client/jsonrpc_client/__init__.py +139 -0
- mcp_proxy_adapter/client/jsonrpc_client/client.py +257 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api.py +369 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/__init__.py +1 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/async_base.py +241 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/basic_base.py +150 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/catalog_base.py +178 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/constants.py +38 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/helpers.py +66 -0
- mcp_proxy_adapter/client/jsonrpc_client/command_api_bases/queue_base.py +137 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/__init__.py +70 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/base.py +102 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/classification.py +143 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/request_errors.py +169 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/schema_errors.py +90 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/transfer_errors.py +48 -0
- mcp_proxy_adapter/client/jsonrpc_client/exceptions/transport_errors.py +153 -0
- mcp_proxy_adapter/client/jsonrpc_client/execution_status_observer.py +66 -0
- mcp_proxy_adapter/client/jsonrpc_client/job_event_registry.py +322 -0
- mcp_proxy_adapter/client/jsonrpc_client/job_tracking_mixin.py +206 -0
- mcp_proxy_adapter/client/jsonrpc_client/job_tracking_types.py +135 -0
- mcp_proxy_adapter/client/jsonrpc_client/openapi_validator.py +127 -0
- mcp_proxy_adapter/client/jsonrpc_client/operation_state.py +221 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api.py +93 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/__init__.py +1 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/client_base.py +117 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/lifecycle_base.py +222 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/register_base.py +230 -0
- mcp_proxy_adapter/client/jsonrpc_client/proxy_api_bases/uuid_base.py +95 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_api.py +302 -0
- mcp_proxy_adapter/client/jsonrpc_client/queue_status.py +192 -0
- mcp_proxy_adapter/client/jsonrpc_client/schema_generator.py +143 -0
- mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/__init__.py +1 -0
- mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/models.py +45 -0
- mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/parse_base.py +215 -0
- mcp_proxy_adapter/client/jsonrpc_client/schema_generator_bases/validate_base.py +181 -0
- mcp_proxy_adapter/client/jsonrpc_client/transfer_integrity.py +57 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/__init__.py +161 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/constants.py +30 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/helpers.py +118 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/http_base.py +325 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/rpc_base.py +311 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/tls_base.py +295 -0
- mcp_proxy_adapter/client/jsonrpc_client/transport/transfer_base.py +282 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_command_session.py +230 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/__init__.py +1 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/core_base.py +154 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/helpers.py +72 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_command_session_bases/wait_base.py +279 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_job_status.py +337 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/__init__.py +1 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/channel.py +159 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/command_channel.py +154 -0
- mcp_proxy_adapter/client/jsonrpc_client/ws_job_status_parts/helpers.py +76 -0
- mcp_proxy_adapter/client/proxy.py +124 -0
- mcp_proxy_adapter/commands/__init__.py +27 -0
- mcp_proxy_adapter/commands/base.py +998 -0
- mcp_proxy_adapter/commands/builtin_commands.py +186 -0
- mcp_proxy_adapter/commands/command_help_info.py +101 -0
- mcp_proxy_adapter/commands/command_registry/__init__.py +55 -0
- mcp_proxy_adapter/commands/command_registry/builtins_part.py +206 -0
- mcp_proxy_adapter/commands/command_registry/facade.py +310 -0
- mcp_proxy_adapter/commands/command_registry/lifecycle_part.py +232 -0
- mcp_proxy_adapter/commands/command_registry/loader.py +145 -0
- mcp_proxy_adapter/commands/command_registry/mutations_part.py +228 -0
- mcp_proxy_adapter/commands/command_registry/part_base.py +59 -0
- mcp_proxy_adapter/commands/command_registry/queries_part.py +304 -0
- mcp_proxy_adapter/commands/config_command.py +208 -0
- mcp_proxy_adapter/commands/dependency_container.py +35 -0
- mcp_proxy_adapter/commands/echo_command.py +97 -0
- mcp_proxy_adapter/commands/health_command.py +162 -0
- mcp_proxy_adapter/commands/help_command.py +296 -0
- mcp_proxy_adapter/commands/hooks.py +590 -0
- mcp_proxy_adapter/commands/job_metadata.py +26 -0
- mcp_proxy_adapter/commands/load_command.py +134 -0
- mcp_proxy_adapter/commands/nested_validation.py +185 -0
- mcp_proxy_adapter/commands/plugins_command.py +250 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +475 -0
- mcp_proxy_adapter/commands/queue/__init__.py +83 -0
- mcp_proxy_adapter/commands/queue/add_job_command.py +358 -0
- mcp_proxy_adapter/commands/queue/command_execution_diagnostics.py +100 -0
- mcp_proxy_adapter/commands/queue/delete_job_command.py +92 -0
- mcp_proxy_adapter/commands/queue/get_logs_command.py +90 -0
- mcp_proxy_adapter/commands/queue/get_status_command.py +105 -0
- mcp_proxy_adapter/commands/queue/health_command.py +44 -0
- mcp_proxy_adapter/commands/queue/job_domain_errors.py +117 -0
- mcp_proxy_adapter/commands/queue/job_params.py +163 -0
- mcp_proxy_adapter/commands/queue/jobs/__init__.py +41 -0
- mcp_proxy_adapter/commands/queue/jobs/basic_jobs.py +205 -0
- mcp_proxy_adapter/commands/queue/jobs/command_execution_job.py +198 -0
- mcp_proxy_adapter/commands/queue/jobs/command_restore_base.py +48 -0
- mcp_proxy_adapter/commands/queue/jobs/command_run_base.py +389 -0
- mcp_proxy_adapter/commands/queue/jobs/job_helpers.py +80 -0
- mcp_proxy_adapter/commands/queue/jobs/long_jobs.py +257 -0
- mcp_proxy_adapter/commands/queue/list_jobs_command.py +127 -0
- mcp_proxy_adapter/commands/queue/start_job_command.py +97 -0
- mcp_proxy_adapter/commands/queue/stop_job_command.py +107 -0
- mcp_proxy_adapter/commands/queue_commands.py +49 -0
- mcp_proxy_adapter/commands/registration_status_command.py +83 -0
- mcp_proxy_adapter/commands/reload_command.py +183 -0
- mcp_proxy_adapter/commands/result.py +201 -0
- mcp_proxy_adapter/commands/result_helpers.py +43 -0
- mcp_proxy_adapter/commands/role_test_command.py +119 -0
- mcp_proxy_adapter/commands/roles_management_command/__init__.py +58 -0
- mcp_proxy_adapter/commands/roles_management_command/actions_part.py +400 -0
- mcp_proxy_adapter/commands/roles_management_command/dispatch_part.py +239 -0
- mcp_proxy_adapter/commands/roles_management_command/facade.py +233 -0
- mcp_proxy_adapter/commands/roles_management_command/part_base.py +61 -0
- mcp_proxy_adapter/commands/roles_management_command/results.py +105 -0
- mcp_proxy_adapter/commands/roles_management_command/storage_part.py +181 -0
- mcp_proxy_adapter/commands/schema_helpers.py +45 -0
- mcp_proxy_adapter/commands/settings_command.py +205 -0
- mcp_proxy_adapter/commands/transfer_command_support.py +83 -0
- mcp_proxy_adapter/commands/transfer_download_begin_command.py +245 -0
- mcp_proxy_adapter/commands/transfer_download_status_command.py +121 -0
- mcp_proxy_adapter/commands/transfer_schema_support.py +96 -0
- mcp_proxy_adapter/commands/transfer_upload_begin_command.py +254 -0
- mcp_proxy_adapter/commands/transfer_upload_complete_command.py +161 -0
- mcp_proxy_adapter/commands/transfer_upload_status_command.py +122 -0
- mcp_proxy_adapter/commands/transport_management_command.py +144 -0
- mcp_proxy_adapter/commands/unload_command.py +109 -0
- mcp_proxy_adapter/config.py +30 -0
- mcp_proxy_adapter/core/__init__.py +8 -0
- mcp_proxy_adapter/core/app_factory/__init__.py +17 -0
- mcp_proxy_adapter/core/app_factory/app_creator.py +66 -0
- mcp_proxy_adapter/core/app_factory/config_loader.py +125 -0
- mcp_proxy_adapter/core/app_factory/factory.py +158 -0
- mcp_proxy_adapter/core/app_factory/server_runner.py +152 -0
- mcp_proxy_adapter/core/app_factory/ssl_config.py +194 -0
- mcp_proxy_adapter/core/app_factory/validators.py +57 -0
- mcp_proxy_adapter/core/async_context.py +28 -0
- mcp_proxy_adapter/core/auth/__init__.py +18 -0
- mcp_proxy_adapter/core/auth/certificate_validator.py +239 -0
- mcp_proxy_adapter/core/auth/models.py +47 -0
- mcp_proxy_adapter/core/auth/mtls_validator.py +84 -0
- mcp_proxy_adapter/core/auth/token_validator.py +114 -0
- mcp_proxy_adapter/core/auth_validator.py +137 -0
- mcp_proxy_adapter/core/certificate/__init__.py +20 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/__init__.py +55 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/facade.py +340 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/info_part.py +130 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/key_part.py +146 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/part_base.py +65 -0
- mcp_proxy_adapter/core/certificate/certificate_validator/revocation_part.py +112 -0
- mcp_proxy_adapter/core/client/__init__.py +11 -0
- mcp_proxy_adapter/core/client/auth_handler.py +120 -0
- mcp_proxy_adapter/core/client/client.py +314 -0
- mcp_proxy_adapter/core/client/factory.py +110 -0
- mcp_proxy_adapter/core/client/request_handler.py +122 -0
- mcp_proxy_adapter/core/client/ssl_handler.py +105 -0
- mcp_proxy_adapter/core/client_manager.py +281 -0
- mcp_proxy_adapter/core/client_security/__init__.py +53 -0
- mcp_proxy_adapter/core/client_security/auth_part.py +227 -0
- mcp_proxy_adapter/core/client_security/cert_part.py +124 -0
- mcp_proxy_adapter/core/client_security/facade.py +181 -0
- mcp_proxy_adapter/core/client_security/part_base.py +62 -0
- mcp_proxy_adapter/core/client_security/ssl_part.py +275 -0
- mcp_proxy_adapter/core/config/__init__.py +29 -0
- mcp_proxy_adapter/core/config/config.py +963 -0
- mcp_proxy_adapter/core/config/config_factory.py +16 -0
- mcp_proxy_adapter/core/config/config_graph.py +250 -0
- mcp_proxy_adapter/core/config/config_loader.py +70 -0
- mcp_proxy_adapter/core/config/env_placeholders.py +52 -0
- mcp_proxy_adapter/core/config/feature_manager.py +109 -0
- mcp_proxy_adapter/core/config/orchestration_section.py +119 -0
- mcp_proxy_adapter/core/config/reload_violations.py +269 -0
- mcp_proxy_adapter/core/config/section_validators.py +190 -0
- mcp_proxy_adapter/core/config/settings_declaration.py +255 -0
- mcp_proxy_adapter/core/config/simple_config.py +893 -0
- mcp_proxy_adapter/core/config/simple_config_generator.py +917 -0
- mcp_proxy_adapter/core/config/simple_config_validator.py +333 -0
- mcp_proxy_adapter/core/config/validators/__init__.py +29 -0
- mcp_proxy_adapter/core/config/validators/auth_validator.py +146 -0
- mcp_proxy_adapter/core/config/validators/base_validator.py +102 -0
- mcp_proxy_adapter/core/config/validators/certificate_validator_helper.py +114 -0
- mcp_proxy_adapter/core/config/validators/client_validator.py +131 -0
- mcp_proxy_adapter/core/config/validators/job_push_validator.py +55 -0
- mcp_proxy_adapter/core/config/validators/queue_manager_validator.py +133 -0
- mcp_proxy_adapter/core/config/validators/registration_validator.py +366 -0
- mcp_proxy_adapter/core/config/validators/server_validation_validator.py +154 -0
- mcp_proxy_adapter/core/config/validators/server_validator.py +326 -0
- mcp_proxy_adapter/core/config/validators/ssl_validator.py +221 -0
- mcp_proxy_adapter/core/config/websocket_validator.py +99 -0
- mcp_proxy_adapter/core/config_validator.py +29 -0
- mcp_proxy_adapter/core/constants.py +201 -0
- mcp_proxy_adapter/core/crl_utils.py +338 -0
- mcp_proxy_adapter/core/date_utils.py +119 -0
- mcp_proxy_adapter/core/delivery/__init__.py +35 -0
- mcp_proxy_adapter/core/delivery/contracts.py +57 -0
- mcp_proxy_adapter/core/delivery/exceptions.py +19 -0
- mcp_proxy_adapter/core/delivery/terminal_replay_store.py +129 -0
- mcp_proxy_adapter/core/delivery/ws_delivery_manager.py +117 -0
- mcp_proxy_adapter/core/domain_errors.py +189 -0
- mcp_proxy_adapter/core/error_handling.py +98 -0
- mcp_proxy_adapter/core/errors/__init__.py +259 -0
- mcp_proxy_adapter/core/errors/config_errors.py +142 -0
- mcp_proxy_adapter/core/file_utils.py +94 -0
- mcp_proxy_adapter/core/job_manager.py +115 -0
- mcp_proxy_adapter/core/job_push/__init__.py +124 -0
- mcp_proxy_adapter/core/job_push/caller_loss.py +89 -0
- mcp_proxy_adapter/core/job_push/engine.py +282 -0
- mcp_proxy_adapter/core/job_push/events/__init__.py +111 -0
- mcp_proxy_adapter/core/job_push/events/builders.py +282 -0
- mcp_proxy_adapter/core/job_push/events/command_session_payloads.py +50 -0
- mcp_proxy_adapter/core/job_push/events/delivery_payloads.py +52 -0
- mcp_proxy_adapter/core/job_push/events/event_names.py +163 -0
- mcp_proxy_adapter/core/job_push/events/job_payloads.py +83 -0
- mcp_proxy_adapter/core/job_push/events/transfer_payloads.py +72 -0
- mcp_proxy_adapter/core/job_push/execute_async_deliver_guard.py +55 -0
- mcp_proxy_adapter/core/job_push/finish_signal.py +91 -0
- mcp_proxy_adapter/core/job_push/hooks.py +53 -0
- mcp_proxy_adapter/core/job_push/job_status_accumulator.py +376 -0
- mcp_proxy_adapter/core/job_push/lifespan_wiring.py +252 -0
- mcp_proxy_adapter/core/job_push/notifier.py +139 -0
- mcp_proxy_adapter/core/job_push/notifier_policy.py +38 -0
- mcp_proxy_adapter/core/job_push/queue_custom_push.py +67 -0
- mcp_proxy_adapter/core/job_push/subscriptions.py +160 -0
- mcp_proxy_adapter/core/job_push/transfer_correlation.py +47 -0
- mcp_proxy_adapter/core/job_push/transfer_push.py +135 -0
- mcp_proxy_adapter/core/json_utils.py +81 -0
- mcp_proxy_adapter/core/logging/__init__.py +42 -0
- mcp_proxy_adapter/core/logging/formatters.py +55 -0
- mcp_proxy_adapter/core/logging/global_logger.py +41 -0
- mcp_proxy_adapter/core/logging/request_logger.py +50 -0
- mcp_proxy_adapter/core/logging/setup.py +190 -0
- mcp_proxy_adapter/core/logging/worker.py +107 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +216 -0
- mcp_proxy_adapter/core/mtls_server.py +180 -0
- mcp_proxy_adapter/core/orchestration/__init__.py +90 -0
- mcp_proxy_adapter/core/orchestration/candidate_validator.py +196 -0
- mcp_proxy_adapter/core/orchestration/catalog_builder.py +136 -0
- mcp_proxy_adapter/core/orchestration/catalog_snapshot.py +115 -0
- mcp_proxy_adapter/core/orchestration/command_record.py +43 -0
- mcp_proxy_adapter/core/orchestration/discovery_client.py +229 -0
- mcp_proxy_adapter/core/orchestration/orchestration_api.py +273 -0
- mcp_proxy_adapter/core/orchestration/orchestration_config.py +146 -0
- mcp_proxy_adapter/core/orchestration/orchestration_errors.py +305 -0
- mcp_proxy_adapter/core/orchestration/orchestration_lifespan.py +199 -0
- mcp_proxy_adapter/core/orchestration/parameter_graph.py +106 -0
- mcp_proxy_adapter/core/orchestration/polling_loop.py +281 -0
- mcp_proxy_adapter/core/orchestration/server_record.py +37 -0
- mcp_proxy_adapter/core/orchestration/snapshot_holder.py +90 -0
- mcp_proxy_adapter/core/orchestration/tool_context_exposure.py +83 -0
- mcp_proxy_adapter/core/orchestration/tool_context_snapshot.py +164 -0
- mcp_proxy_adapter/core/path_utils.py +220 -0
- mcp_proxy_adapter/core/protocol_manager.py +260 -0
- mcp_proxy_adapter/core/proxy/__init__.py +62 -0
- mcp_proxy_adapter/core/proxy/auth_manager.py +110 -0
- mcp_proxy_adapter/core/proxy_client.py +252 -0
- mcp_proxy_adapter/core/proxy_registration.py +55 -0
- mcp_proxy_adapter/core/role_utils.py +166 -0
- mcp_proxy_adapter/core/server_adapter.py +302 -0
- mcp_proxy_adapter/core/server_engine.py +384 -0
- mcp_proxy_adapter/core/settings.py +299 -0
- mcp_proxy_adapter/core/signal_handler.py +136 -0
- mcp_proxy_adapter/core/ssl_utils.py +482 -0
- mcp_proxy_adapter/core/transport_manager.py +168 -0
- mcp_proxy_adapter/core/utils.py +74 -0
- mcp_proxy_adapter/core/validation/__init__.py +21 -0
- mcp_proxy_adapter/core/validation/config_validator.py +256 -0
- mcp_proxy_adapter/core/validation/file_validator.py +229 -0
- mcp_proxy_adapter/core/validation/protocol_validator.py +322 -0
- mcp_proxy_adapter/core/validation/proxy_registration_validator.py +268 -0
- mcp_proxy_adapter/core/validation/security_validator.py +300 -0
- mcp_proxy_adapter/core/validation/validation_result.py +34 -0
- mcp_proxy_adapter/core/validation/validator_support.py +64 -0
- mcp_proxy_adapter/core/validation_utils.py +160 -0
- mcp_proxy_adapter/core/ws_timeouts.py +88 -0
- mcp_proxy_adapter/custom_openapi.py +93 -0
- mcp_proxy_adapter/examples/PROTOCOL_EXAMPLES.md +79 -0
- mcp_proxy_adapter/examples/README.md +272 -0
- mcp_proxy_adapter/examples/README_EN.md +258 -0
- mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
- mcp_proxy_adapter/examples/__init__.py +16 -0
- mcp_proxy_adapter/examples/basic_framework/__init__.py +9 -0
- mcp_proxy_adapter/examples/basic_framework/commands/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_no_protocol_middleware.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_protocol_middleware.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_simple.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_registration.json +73 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +21 -0
- mcp_proxy_adapter/examples/basic_framework/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +123 -0
- mcp_proxy_adapter/examples/basic_framework/roles.json +1 -0
- mcp_proxy_adapter/examples/bug_report_security_framework.md +141 -0
- mcp_proxy_adapter/examples/cert_config.json +1 -0
- mcp_proxy_adapter/examples/certs/cert_config.json +1 -0
- mcp_proxy_adapter/examples/check_config.py +71 -0
- mcp_proxy_adapter/examples/check_config_split_parts/__init__.py +3 -0
- mcp_proxy_adapter/examples/check_config_split_parts/checker.py +247 -0
- mcp_proxy_adapter/examples/check_config_split_parts/cli.py +68 -0
- mcp_proxy_adapter/examples/check_config_split_parts/commands.py +102 -0
- mcp_proxy_adapter/examples/cli_config_examples/__init__.py +8 -0
- mcp_proxy_adapter/examples/cli_config_examples/examples_configs/http.json +69 -0
- mcp_proxy_adapter/examples/cli_config_examples/examples_configs/https_token_roles.json +84 -0
- mcp_proxy_adapter/examples/cli_config_examples/examples_configs/mtls_roles.json +84 -0
- mcp_proxy_adapter/examples/cli_config_examples/http_basic.py +97 -0
- mcp_proxy_adapter/examples/cli_config_examples/https_token.py +128 -0
- mcp_proxy_adapter/examples/cli_config_examples/mtls_roles.py +140 -0
- mcp_proxy_adapter/examples/client_configs/api_key_client.json +1 -0
- mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +1 -0
- mcp_proxy_adapter/examples/client_configs/certificate_client.json +1 -0
- mcp_proxy_adapter/examples/client_configs/jwt_client.json +1 -0
- mcp_proxy_adapter/examples/client_configs/no_auth_client.json +1 -0
- mcp_proxy_adapter/examples/client_usage_example.py +216 -0
- mcp_proxy_adapter/examples/commands/__init__.py +5 -0
- mcp_proxy_adapter/examples/comprehensive/__init__.py +10 -0
- mcp_proxy_adapter/examples/comprehensive/run.py +906 -0
- mcp_proxy_adapter/examples/comprehensive_config.json +10 -0
- mcp_proxy_adapter/examples/config.json +10 -0
- mcp_proxy_adapter/examples/config_builder.py +272 -0
- mcp_proxy_adapter/examples/config_cli.py +340 -0
- mcp_proxy_adapter/examples/config_factory.py +325 -0
- mcp_proxy_adapter/examples/configs/full_featured.json +10 -0
- mcp_proxy_adapter/examples/configs/http_auth.json +10 -0
- mcp_proxy_adapter/examples/configs/http_simple.json +10 -0
- mcp_proxy_adapter/examples/configs/http_token.json +10 -0
- mcp_proxy_adapter/examples/configs/https_auth.json +10 -0
- mcp_proxy_adapter/examples/configs/https_simple.json +10 -0
- mcp_proxy_adapter/examples/configs/https_token.json +10 -0
- mcp_proxy_adapter/examples/configs/mtls_no_roles.json +10 -0
- mcp_proxy_adapter/examples/configs/mtls_simple.json +10 -0
- mcp_proxy_adapter/examples/configs/mtls_with_proxy.json +10 -0
- mcp_proxy_adapter/examples/configs/mtls_with_roles.json +10 -0
- mcp_proxy_adapter/examples/configs/roles.json +1 -0
- mcp_proxy_adapter/examples/create_test_configs.py +216 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +192 -0
- mcp_proxy_adapter/examples/demo_client.py +339 -0
- mcp_proxy_adapter/examples/examples_correct/http_example.json +10 -0
- mcp_proxy_adapter/examples/full_application/__init__.py +11 -0
- mcp_proxy_adapter/examples/full_application/commands/__init__.py +32 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +75 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +101 -0
- mcp_proxy_adapter/examples/full_application/commands/embed_job_status_command.py +133 -0
- mcp_proxy_adapter/examples/full_application/commands/embed_queue_command.py +153 -0
- mcp_proxy_adapter/examples/full_application/commands/long_running_command.py +175 -0
- mcp_proxy_adapter/examples/full_application/commands/slow_start_long_task_command.py +172 -0
- mcp_proxy_adapter/examples/full_application/configs/http_basic.json +73 -0
- mcp_proxy_adapter/examples/full_application/configs/http_basic_smart_assistant_proxy3004.json +67 -0
- mcp_proxy_adapter/examples/full_application/configs/http_no_registration.json +72 -0
- mcp_proxy_adapter/examples/full_application/configs/http_token.json +69 -0
- mcp_proxy_adapter/examples/full_application/configs/http_token_roles.json +81 -0
- mcp_proxy_adapter/examples/full_application/configs/http_token_roles_smart_assistant_proxy3004.json +81 -0
- mcp_proxy_adapter/examples/full_application/configs/http_token_smart_assistant_proxy3004.json +69 -0
- mcp_proxy_adapter/examples/full_application/configs/https_basic.json +74 -0
- mcp_proxy_adapter/examples/full_application/configs/https_basic_smart_assistant_proxy3004.json +81 -0
- mcp_proxy_adapter/examples/full_application/configs/https_token.json +76 -0
- mcp_proxy_adapter/examples/full_application/configs/https_token_roles.json +88 -0
- mcp_proxy_adapter/examples/full_application/configs/https_token_roles_smart_assistant_proxy3004.json +95 -0
- mcp_proxy_adapter/examples/full_application/configs/https_token_smart_assistant_proxy3004.json +83 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +78 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles_correct.json +76 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles_smart_assistant_proxy3004.json +83 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_security.json +77 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +82 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles_correct.json +88 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles_smart_assistant_proxy3004.json +95 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_ws_repro.json +76 -0
- mcp_proxy_adapter/examples/full_application/configs/proxy_server.json +64 -0
- mcp_proxy_adapter/examples/full_application/configs/proxy_server_https.json +63 -0
- mcp_proxy_adapter/examples/full_application/configs/proxy_server_mtls.json +63 -0
- mcp_proxy_adapter/examples/full_application/example_support.py +45 -0
- mcp_proxy_adapter/examples/full_application/hooks/__init__.py +4 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +51 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +46 -0
- mcp_proxy_adapter/examples/full_application/main.py +95 -0
- mcp_proxy_adapter/examples/full_application/main_modules/__init__.py +1 -0
- mcp_proxy_adapter/examples/full_application/main_modules/registration.py +122 -0
- mcp_proxy_adapter/examples/full_application/main_modules/runner.py +310 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/__init__.py +113 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/_shared.py +8 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/lifecycle_commands.py +196 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/register_command.py +254 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/registry_state.py +8 -0
- mcp_proxy_adapter/examples/full_application/proxy_commands/results.py +142 -0
- mcp_proxy_adapter/examples/full_application/proxy_endpoints.py +162 -0
- mcp_proxy_adapter/examples/full_application/proxy_schemas.py +91 -0
- mcp_proxy_adapter/examples/full_application/roles.json +1 -0
- mcp_proxy_adapter/examples/full_application/test_client.py +341 -0
- mcp_proxy_adapter/examples/full_application/test_minimal_server.py +57 -0
- mcp_proxy_adapter/examples/full_application/test_queue_and_descriptions.py +283 -0
- mcp_proxy_adapter/examples/full_application/test_server.py +221 -0
- mcp_proxy_adapter/examples/full_application/test_simple_server.py +141 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +74 -0
- mcp_proxy_adapter/examples/generate_config.py +44 -0
- mcp_proxy_adapter/examples/generate_config_parts/__init__.py +3 -0
- mcp_proxy_adapter/examples/generate_config_parts/builders.py +234 -0
- mcp_proxy_adapter/examples/generate_config_parts/cli.py +260 -0
- mcp_proxy_adapter/examples/generate_config_parts/outputs.py +137 -0
- mcp_proxy_adapter/examples/generator_validator_compatibility_report.md +127 -0
- mcp_proxy_adapter/examples/http_proxy_example.json +17 -0
- mcp_proxy_adapter/examples/https_proxy_example.json +17 -0
- mcp_proxy_adapter/examples/job_tracking_demo.py +235 -0
- mcp_proxy_adapter/examples/proxy_server_support.py +384 -0
- mcp_proxy_adapter/examples/queue_demo_simple.py +37 -0
- mcp_proxy_adapter/examples/queue_demo_simple_parts/__init__.py +3 -0
- mcp_proxy_adapter/examples/queue_demo_simple_parts/_shared.py +8 -0
- mcp_proxy_adapter/examples/queue_demo_simple_parts/demo.py +213 -0
- mcp_proxy_adapter/examples/queue_demo_simple_parts/mock_commands.py +130 -0
- mcp_proxy_adapter/examples/queue_demo_simple_parts/mock_manager.py +272 -0
- mcp_proxy_adapter/examples/queue_example_support.py +36 -0
- mcp_proxy_adapter/examples/queue_fire_and_forget_example.py +370 -0
- mcp_proxy_adapter/examples/queue_server_demo.py +73 -0
- mcp_proxy_adapter/examples/queue_server_example.py +76 -0
- mcp_proxy_adapter/examples/queue_server_simple.py +251 -0
- mcp_proxy_adapter/examples/required_certificates.py +216 -0
- mcp_proxy_adapter/examples/run_example.py +119 -0
- mcp_proxy_adapter/examples/run_full_test_suite.py +674 -0
- mcp_proxy_adapter/examples/run_proxy_server.py +118 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +876 -0
- mcp_proxy_adapter/examples/security_test/__init__.py +18 -0
- mcp_proxy_adapter/examples/security_test/auth_manager.py +49 -0
- mcp_proxy_adapter/examples/security_test/ssl_context_manager.py +144 -0
- mcp_proxy_adapter/examples/security_test/test_client.py +218 -0
- mcp_proxy_adapter/examples/security_test/test_result.py +23 -0
- mcp_proxy_adapter/examples/security_test_client.py +103 -0
- mcp_proxy_adapter/examples/server_configs/config_basic_http.json +16 -0
- mcp_proxy_adapter/examples/server_configs/config_http_token.json +16 -0
- mcp_proxy_adapter/examples/server_configs/config_https.json +16 -0
- mcp_proxy_adapter/examples/server_configs/config_https_token.json +16 -0
- mcp_proxy_adapter/examples/server_configs/config_mtls.json +16 -0
- mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +15 -0
- mcp_proxy_adapter/examples/server_configs/config_simple.json +9 -0
- mcp_proxy_adapter/examples/server_configs/http_simple.json +14 -0
- mcp_proxy_adapter/examples/server_configs/http_token.json +14 -0
- mcp_proxy_adapter/examples/server_configs/https_simple.json +14 -0
- mcp_proxy_adapter/examples/server_configs/https_token.json +14 -0
- mcp_proxy_adapter/examples/server_configs/mtls_no_roles.json +8 -0
- mcp_proxy_adapter/examples/server_configs/mtls_test.json +8 -0
- mcp_proxy_adapter/examples/server_configs/mtls_with_roles.json +14 -0
- mcp_proxy_adapter/examples/server_configs/roles.json +1 -0
- mcp_proxy_adapter/examples/setup/__init__.py +48 -0
- mcp_proxy_adapter/examples/setup/certificate_manager.py +384 -0
- mcp_proxy_adapter/examples/setup/config_generator.py +6 -0
- mcp_proxy_adapter/examples/setup/config_validator.py +140 -0
- mcp_proxy_adapter/examples/setup/environment_setup.py +143 -0
- mcp_proxy_adapter/examples/setup/test_files_generator.py +6 -0
- mcp_proxy_adapter/examples/setup/test_runner.py +143 -0
- mcp_proxy_adapter/examples/setup_test_environment.py +233 -0
- mcp_proxy_adapter/examples/simple_http_example.json +17 -0
- mcp_proxy_adapter/examples/simple_https_example.json +17 -0
- mcp_proxy_adapter/examples/simple_protocol_test.py +167 -0
- mcp_proxy_adapter/examples/test_client/README.md +166 -0
- mcp_proxy_adapter/examples/test_client/__init__.py +7 -0
- mcp_proxy_adapter/examples/test_client/main.py +102 -0
- mcp_proxy_adapter/examples/test_client/main_split_parts/__init__.py +1 -0
- mcp_proxy_adapter/examples/test_client/main_split_parts/helpers.py +83 -0
- mcp_proxy_adapter/examples/test_client/main_split_parts/runner.py +115 -0
- mcp_proxy_adapter/examples/test_client/main_split_parts/scenarios.py +195 -0
- mcp_proxy_adapter/examples/test_config.py +183 -0
- mcp_proxy_adapter/examples/test_configs/custom_https.json +10 -0
- mcp_proxy_adapter/examples/test_configs/http_simple.json +10 -0
- mcp_proxy_adapter/examples/test_examples.py +361 -0
- mcp_proxy_adapter/examples/test_mcp_server.py +249 -0
- mcp_proxy_adapter/examples/test_protocol_examples.py +373 -0
- mcp_proxy_adapter/examples/test_proxy/README.md +70 -0
- mcp_proxy_adapter/examples/test_proxy/__init__.py +7 -0
- mcp_proxy_adapter/examples/test_proxy/main.py +106 -0
- mcp_proxy_adapter/examples/test_server/README.md +58 -0
- mcp_proxy_adapter/examples/test_server/__init__.py +7 -0
- mcp_proxy_adapter/examples/test_server/main.py +349 -0
- mcp_proxy_adapter/examples/transparent_queue_commands.py +281 -0
- mcp_proxy_adapter/examples/transparent_queue_e1_sync_call.py +102 -0
- mcp_proxy_adapter/examples/transparent_queue_e2_event_stream.py +134 -0
- mcp_proxy_adapter/examples/transparent_queue_e3_ws_timeouts.py +341 -0
- mcp_proxy_adapter/examples/transparent_queue_e4_ws_fallback.py +159 -0
- mcp_proxy_adapter/examples/transparent_queue_e5_inner_failure.py +189 -0
- mcp_proxy_adapter/examples/transparent_queue_e6_atomic_state.py +203 -0
- mcp_proxy_adapter/examples/transparent_queue_e7_caller_loss.py +63 -0
- mcp_proxy_adapter/examples/transparent_queue_e7_split2/__init__.py +3 -0
- mcp_proxy_adapter/examples/transparent_queue_e7_split2/cases.py +335 -0
- mcp_proxy_adapter/examples/transparent_queue_e7_split2/helpers.py +66 -0
- mcp_proxy_adapter/examples/transparent_queue_support.py +377 -0
- mcp_proxy_adapter/examples/unified_error_handling_example.py +127 -0
- mcp_proxy_adapter/examples/unified_error_handling_split_parts/__init__.py +3 -0
- mcp_proxy_adapter/examples/unified_error_handling_split_parts/demos.py +180 -0
- mcp_proxy_adapter/examples/unified_error_handling_split_parts/runner.py +109 -0
- mcp_proxy_adapter/examples/unified_error_handling_split_parts/support.py +79 -0
- mcp_proxy_adapter/examples/unified_error_handling_texts.py +17 -0
- mcp_proxy_adapter/examples/universal_client.py +215 -0
- mcp_proxy_adapter/examples/universal_client_split_parts/__init__.py +3 -0
- mcp_proxy_adapter/examples/universal_client_split_parts/configs.py +104 -0
- mcp_proxy_adapter/examples/universal_client_split_parts/demos.py +144 -0
- mcp_proxy_adapter/examples/update_config_certificates.py +156 -0
- mcp_proxy_adapter/examples/validate_generator_compatibility_simple.py +60 -0
- mcp_proxy_adapter/examples/websocket_examples/__init__.py +8 -0
- mcp_proxy_adapter/examples/websocket_examples/client_bidirectional_websocket.py +100 -0
- mcp_proxy_adapter/examples/websocket_examples/client_websocket_job_status.py +103 -0
- mcp_proxy_adapter/examples/websocket_examples/run_ws_test_server.py +157 -0
- mcp_proxy_adapter/examples/ws_examples/__init__.py +6 -0
- mcp_proxy_adapter/examples/ws_examples/http_basic_ws.py +68 -0
- mcp_proxy_adapter/examples/ws_examples/http_token_roles_ws.py +66 -0
- mcp_proxy_adapter/examples/ws_examples/http_token_ws.py +80 -0
- mcp_proxy_adapter/examples/ws_examples/https_basic_ws.py +61 -0
- mcp_proxy_adapter/examples/ws_examples/https_token_roles_ws.py +67 -0
- mcp_proxy_adapter/examples/ws_examples/https_token_ws.py +64 -0
- mcp_proxy_adapter/examples/ws_examples/mtls_basic_ws.py +94 -0
- mcp_proxy_adapter/examples/ws_examples/mtls_roles_ws.py +88 -0
- mcp_proxy_adapter/examples/ws_examples/ws_example_runner.py +233 -0
- mcp_proxy_adapter/integrations/__init__.py +31 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/__init__.py +124 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_compat.py +60 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_health.py +299 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_limits.py +70 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_process_reap.py +232 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_result_builders.py +119 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/_status_helpers.py +167 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/global_manager.py +174 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/job_types/__init__.py +375 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/job_types/value_types.py +97 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/job_types/worker_probe.py +29 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/__init__.py +52 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/fallback_base.py +240 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/fallback_stop_base.py +179 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/health_base.py +460 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/integration.py +189 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/job_start_base.py +333 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/job_stop_base.py +274 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/lifecycle_base.py +393 -0
- mcp_proxy_adapter/integrations/queuemgr_integration/manager/query_base.py +269 -0
- mcp_proxy_adapter/integrations/queuemgr_registration.py +66 -0
- mcp_proxy_adapter/integrations/queuemgr_version.py +39 -0
- mcp_proxy_adapter/main.py +385 -0
- mcp_proxy_adapter/main_ssl_paths.py +29 -0
- mcp_proxy_adapter/py.typed +0 -0
- mcp_proxy_adapter/schemas/base_schema.json +114 -0
- mcp_proxy_adapter/schemas/openapi_schema.json +269 -0
- mcp_proxy_adapter/schemas/roles.json +37 -0
- mcp_proxy_adapter/schemas/roles_schema.json +162 -0
- mcp_proxy_adapter/transfer/__init__.py +56 -0
- mcp_proxy_adapter/transfer/checksums.py +81 -0
- mcp_proxy_adapter/transfer/client_downloader/__init__.py +37 -0
- mcp_proxy_adapter/transfer/client_downloader/download_support.py +109 -0
- mcp_proxy_adapter/transfer/client_downloader/downloader.py +300 -0
- mcp_proxy_adapter/transfer/client_uploader.py +278 -0
- mcp_proxy_adapter/transfer/compression.py +127 -0
- mcp_proxy_adapter/transfer/errors.py +253 -0
- mcp_proxy_adapter/transfer/json_coerce.py +32 -0
- mcp_proxy_adapter/transfer/models.py +337 -0
- mcp_proxy_adapter/transfer/path_confinement.py +69 -0
- mcp_proxy_adapter/transfer/progress_percent.py +25 -0
- mcp_proxy_adapter/transfer/server_store.py +878 -0
- mcp_proxy_adapter/version.py +8 -0
- mcp_proxy_adapter_dev-8.11.16.dist-info/METADATA +1666 -0
- mcp_proxy_adapter_dev-8.11.16.dist-info/RECORD +644 -0
- mcp_proxy_adapter_dev-8.11.16.dist-info/WHEEL +5 -0
- mcp_proxy_adapter_dev-8.11.16.dist-info/entry_points.txt +12 -0
- 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
|
+
)
|