mcp-mesh 0.7.16__tar.gz → 0.7.18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/PKG-INFO +2 -1
  2. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/__init__.py +1 -1
  3. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/fastapiserver_setup.py +1 -0
  4. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/startup_orchestrator.py +1 -0
  5. mcp_mesh-0.7.18/_mcp_mesh/reload.py +206 -0
  6. mcp_mesh-0.7.18/_mcp_mesh/reload_runner.py +52 -0
  7. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/decorators.py +1 -0
  8. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/pyproject.toml +6 -5
  9. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/.gitignore +0 -0
  10. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/LICENSE +0 -0
  11. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/README.md +0 -0
  12. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/__init__.py +0 -0
  13. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/async_mcp_client.py +0 -0
  14. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/base_injector.py +0 -0
  15. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/decorator_registry.py +0 -0
  16. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/dependency_injector.py +0 -0
  17. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/http_wrapper.py +0 -0
  18. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/llm_config.py +0 -0
  19. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/llm_errors.py +0 -0
  20. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/mesh_llm_agent.py +0 -0
  21. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/mesh_llm_agent_injector.py +0 -0
  22. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/__init__.py +0 -0
  23. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/base_provider_handler.py +0 -0
  24. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/claude_handler.py +0 -0
  25. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/generic_handler.py +0 -0
  26. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/openai_handler.py +0 -0
  27. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/provider_handler_registry.py +0 -0
  28. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/response_parser.py +0 -0
  29. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/self_dependency_proxy.py +0 -0
  30. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/session_aware_client.py +0 -0
  31. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/session_manager.py +0 -0
  32. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/signature_analyzer.py +0 -0
  33. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/tool_executor.py +0 -0
  34. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/tool_schema_builder.py +0 -0
  35. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/unified_mcp_proxy.py +0 -0
  36. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator/FILES +0 -0
  37. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator/VERSION +0 -0
  38. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator-ignore +0 -0
  39. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/__init__.py +0 -0
  40. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/__init__.py +0 -0
  41. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/agents_api.py +0 -0
  42. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/health_api.py +0 -0
  43. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/tracing_api.py +0 -0
  44. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_client.py +0 -0
  45. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_response.py +0 -0
  46. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/configuration.py +0 -0
  47. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/exceptions.py +0 -0
  48. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/__init__.py +0 -0
  49. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_info.py +0 -0
  50. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_metadata.py +0 -0
  51. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_metadata_dependencies_inner.py +0 -0
  52. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_metadata_dependencies_inner_one_of.py +0 -0
  53. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_registration.py +0 -0
  54. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_registration_metadata.py +0 -0
  55. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agents_list_response.py +0 -0
  56. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/capability_info.py +0 -0
  57. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_agent_metadata.py +0 -0
  58. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_agent_request.py +0 -0
  59. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_info.py +0 -0
  60. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/dependency_info.py +0 -0
  61. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/dependency_resolution_info.py +0 -0
  62. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/error_response.py +0 -0
  63. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/health_response.py +0 -0
  64. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_request.py +0 -0
  65. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_request_metadata.py +0 -0
  66. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_response.py +0 -0
  67. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_provider.py +0 -0
  68. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_provider_resolution_info.py +0 -0
  69. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_filter.py +0 -0
  70. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_filter_filter_inner.py +0 -0
  71. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_filter_filter_inner_one_of.py +0 -0
  72. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_info.py +0 -0
  73. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_resolution_info.py +0 -0
  74. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_agent_register_metadata.py +0 -0
  75. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_agent_registration.py +0 -0
  76. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_registration_response.py +0 -0
  77. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_registration_response_dependencies_resolved_value_inner.py +0 -0
  78. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_tool_dependency_registration.py +0 -0
  79. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_tool_register_metadata.py +0 -0
  80. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_tool_registration.py +0 -0
  81. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/registration_response.py +0 -0
  82. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/resolved_llm_provider.py +0 -0
  83. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/rich_dependency.py +0 -0
  84. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/root_response.py +0 -0
  85. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/standardized_dependency.py +0 -0
  86. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/trace_event.py +0 -0
  87. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/py.typed +0 -0
  88. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/rest.py +0 -0
  89. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/__init__.py +0 -0
  90. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/__init__.py +0 -0
  91. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_dependency_resolution.py +0 -0
  92. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_fast_heartbeat_check.py +0 -0
  93. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_health_check.py +0 -0
  94. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_orchestrator.py +0 -0
  95. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_pipeline.py +0 -0
  96. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_send.py +0 -0
  97. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_lifespan_integration.py +0 -0
  98. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_registry_connection.py +0 -0
  99. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/__init__.py +0 -0
  100. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/api_pipeline.py +0 -0
  101. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/api_server_setup.py +0 -0
  102. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/fastapi_discovery.py +0 -0
  103. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/middleware_integration.py +0 -0
  104. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/route_collection.py +0 -0
  105. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/route_integration.py +0 -0
  106. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/__init__.py +0 -0
  107. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/dependency_resolution.py +0 -0
  108. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/fast_heartbeat_check.py +0 -0
  109. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_orchestrator.py +0 -0
  110. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_pipeline.py +0 -0
  111. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_send.py +0 -0
  112. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/lifespan_integration.py +0 -0
  113. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/llm_tools_resolution.py +0 -0
  114. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/registry_connection.py +0 -0
  115. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/__init__.py +0 -0
  116. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/configuration.py +0 -0
  117. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/decorator_collection.py +0 -0
  118. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/fastmcpserver_discovery.py +0 -0
  119. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/heartbeat_loop.py +0 -0
  120. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/heartbeat_preparation.py +0 -0
  121. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/lifespan_factory.py +0 -0
  122. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/server_discovery.py +0 -0
  123. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/startup_pipeline.py +0 -0
  124. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/__init__.py +0 -0
  125. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/base_step.py +0 -0
  126. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/mesh_pipeline.py +0 -0
  127. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/pipeline_types.py +0 -0
  128. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/registry_connection.py +0 -0
  129. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/__init__.py +0 -0
  130. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/config_resolver.py +0 -0
  131. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/content_extractor.py +0 -0
  132. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/defaults.py +0 -0
  133. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/fast_heartbeat_status.py +0 -0
  134. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/fastapi_middleware_manager.py +0 -0
  135. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/health_check_manager.py +0 -0
  136. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/host_resolver.py +0 -0
  137. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/logging_config.py +0 -0
  138. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/registry_client_wrapper.py +0 -0
  139. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/server_discovery.py +0 -0
  140. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/simple_shutdown.py +0 -0
  141. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/sse_parser.py +0 -0
  142. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/support_types.py +0 -0
  143. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/agent_context_helper.py +0 -0
  144. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/context.py +0 -0
  145. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/execution_tracer.py +0 -0
  146. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/fastapi_tracing_middleware.py +0 -0
  147. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/redis_metadata_publisher.py +0 -0
  148. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/trace_context_helper.py +0 -0
  149. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/utils.py +0 -0
  150. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/utils/fastmcp_schema_extractor.py +0 -0
  151. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/__init__.py +0 -0
  152. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/helpers.py +0 -0
  153. {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-mesh
3
- Version: 0.7.16
3
+ Version: 0.7.18
4
4
  Summary: Kubernetes-native platform for distributed MCP applications
5
5
  Project-URL: Homepage, https://github.com/dhyansraj/mcp-mesh
6
6
  Project-URL: Documentation, https://github.com/dhyansraj/mcp-mesh/tree/main/docs
@@ -40,6 +40,7 @@ Requires-Dist: rich<14.0.0,>=13.0.0
40
40
  Requires-Dist: typer<1.0.0,>=0.9.0
41
41
  Requires-Dist: urllib3<3.0.0,>=2.1.0
42
42
  Requires-Dist: uvicorn<1.0.0,>=0.24.0
43
+ Requires-Dist: watchfiles>=1.0.0
43
44
  Provides-Extra: dev
44
45
  Requires-Dist: bandit[toml]>=1.7.0; extra == 'dev'
45
46
  Requires-Dist: black>=25.0.0; extra == 'dev'
@@ -31,7 +31,7 @@ from .engine.decorator_registry import (
31
31
  get_decorator_stats,
32
32
  )
33
33
 
34
- __version__ = "0.7.16"
34
+ __version__ = "0.7.18"
35
35
 
36
36
  # Store reference to runtime processor if initialized
37
37
  _runtime_processor = None
@@ -553,6 +553,7 @@ mcp_mesh_up{{agent="{agent_name}"}} 1
553
553
  port=bind_port,
554
554
  log_level="info",
555
555
  access_log=False, # Reduce noise
556
+ ws="websockets-sansio", # Use modern websockets API (avoids deprecation warnings)
556
557
  )
557
558
 
558
559
  # Create and start server
@@ -319,6 +319,7 @@ class DebounceCoordinator:
319
319
  port=bind_port,
320
320
  log_level="info",
321
321
  access_log=False, # Reduce noise
322
+ ws="websockets-sansio", # Use modern websockets API (avoids deprecation warnings)
322
323
  )
323
324
 
324
325
  except KeyboardInterrupt:
@@ -0,0 +1,206 @@
1
+ """
2
+ File watch and reload functionality for MCP Mesh agents.
3
+
4
+ Provides automatic restart of agent processes when source files change.
5
+ Used by `meshctl start --watch` for development workflows.
6
+ """
7
+
8
+ import logging
9
+ import os
10
+ import signal
11
+ import subprocess
12
+ import sys
13
+ import threading
14
+ import time
15
+ from pathlib import Path
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ # Debounce delay to batch rapid file changes (seconds)
20
+ DEBOUNCE_DELAY = float(os.getenv("MCP_MESH_RELOAD_DEBOUNCE", "0.5"))
21
+
22
+ # Delay after stopping process to allow port release (seconds)
23
+ PORT_RELEASE_DELAY = float(os.getenv("MCP_MESH_RELOAD_PORT_DELAY", "0.5"))
24
+
25
+
26
+ def get_watch_paths(script_path: str) -> list[Path]:
27
+ """
28
+ Determine which paths to watch for changes.
29
+
30
+ Watches the directory containing the agent script and all subdirectories.
31
+ """
32
+ script_dir = Path(script_path).parent.absolute()
33
+ return [script_dir]
34
+
35
+
36
+ def should_watch_file(path: str) -> bool:
37
+ """
38
+ Filter function to determine which files to watch.
39
+
40
+ Only watches:
41
+ - Python files (.py)
42
+ - Jinja2 templates (.jinja2, .j2)
43
+ - YAML config files (.yaml, .yml)
44
+
45
+ Excludes common non-source directories like __pycache__, .git, .venv, etc.
46
+ Also excludes hidden files and editor temporary files.
47
+ """
48
+ path_obj = Path(path)
49
+ filename = path_obj.name
50
+
51
+ # Skip hidden files and editor temp files (e.g., .!12345!main.py from sed -i)
52
+ if filename.startswith("."):
53
+ return False
54
+
55
+ # Skip common editor backup/temp files
56
+ if filename.endswith("~") or filename.endswith(".swp") or filename.endswith(".tmp"):
57
+ return False
58
+
59
+ path_parts = {p.lower() for p in path_obj.parts}
60
+
61
+ # Skip common non-source directories (case-insensitive, exact component match)
62
+ skip_patterns = [
63
+ "__pycache__",
64
+ ".git",
65
+ ".venv",
66
+ "venv",
67
+ ".pytest_cache",
68
+ ".mypy_cache",
69
+ "node_modules",
70
+ ".eggs",
71
+ ".egg-info",
72
+ ]
73
+
74
+ for pattern in skip_patterns:
75
+ if pattern.lower() in path_parts:
76
+ return False
77
+
78
+ # Only watch specific file types
79
+ watch_extensions = [".py", ".jinja2", ".j2", ".yaml", ".yml"]
80
+ return path_obj.suffix.lower() in watch_extensions
81
+
82
+
83
+ def terminate_process(process: subprocess.Popen, timeout: int = 3) -> None:
84
+ """
85
+ Gracefully terminate a process and all its children, force kill if needed.
86
+
87
+ Args:
88
+ process: The subprocess to terminate
89
+ timeout: Seconds to wait before force killing
90
+ """
91
+ if process is None or process.poll() is not None:
92
+ return
93
+
94
+ pid = process.pid
95
+
96
+ # Try graceful termination first - send to process group to include children
97
+ try:
98
+ os.killpg(pid, signal.SIGTERM)
99
+ except (ProcessLookupError, PermissionError):
100
+ # Process group doesn't exist or we can't signal it, try direct
101
+ process.terminate()
102
+
103
+ try:
104
+ process.wait(timeout=timeout)
105
+ except subprocess.TimeoutExpired:
106
+ logger.warning(
107
+ f"Process {pid} didn't terminate gracefully, force killing..."
108
+ )
109
+ # Force kill the entire process group
110
+ try:
111
+ os.killpg(pid, signal.SIGKILL)
112
+ except (ProcessLookupError, PermissionError):
113
+ process.kill()
114
+ process.wait()
115
+
116
+
117
+ def run_with_reload(script_path: str) -> None:
118
+ """
119
+ Run the agent script with file watching and auto-reload.
120
+
121
+ Uses watchfiles to monitor the agent directory for changes.
122
+ When files change, the agent process is terminated and restarted.
123
+
124
+ Args:
125
+ script_path: Path to the agent's main.py script
126
+ """
127
+ try:
128
+ import watchfiles
129
+ except ImportError:
130
+ logger.error(
131
+ "watchfiles is required for reload mode. "
132
+ "Install with: pip install watchfiles"
133
+ )
134
+ sys.exit(1)
135
+
136
+ script_path = os.path.abspath(script_path)
137
+ watch_paths = get_watch_paths(script_path)
138
+ python_exec = sys.executable
139
+
140
+ logger.info("🔄 Starting agent with file watching enabled")
141
+ logger.info(f"📁 Watching: {watch_paths[0]}")
142
+ logger.info("📝 File types: .py, .jinja2, .j2, .yaml, .yml")
143
+ logger.info("🔃 Agent will restart automatically when files change")
144
+
145
+ process = None
146
+ stop_event = threading.Event()
147
+
148
+ def signal_handler(signum, frame):
149
+ stop_event.set()
150
+ logger.info("🛑 Stopping agent...")
151
+ terminate_process(process)
152
+
153
+ signal.signal(signal.SIGINT, signal_handler)
154
+ signal.signal(signal.SIGTERM, signal_handler)
155
+
156
+ def start_agent() -> subprocess.Popen:
157
+ """Start the agent subprocess in a new process group."""
158
+ return subprocess.Popen(
159
+ [python_exec, script_path],
160
+ stdout=sys.stdout,
161
+ stderr=sys.stderr,
162
+ stdin=sys.stdin,
163
+ start_new_session=True, # Create new process group for clean shutdown
164
+ )
165
+
166
+ # Start initial process
167
+ process = start_agent()
168
+ logger.info(f"✅ Agent started (PID: {process.pid})")
169
+
170
+ # Watch for file changes
171
+ try:
172
+ for changes in watchfiles.watch(
173
+ *watch_paths,
174
+ watch_filter=lambda ct, p: should_watch_file(p),
175
+ debounce=int(DEBOUNCE_DELAY * 1000), # Convert to milliseconds
176
+ stop_event=stop_event,
177
+ ):
178
+ if stop_event.is_set():
179
+ break
180
+
181
+ # Check if process crashed
182
+ if process.poll() is not None:
183
+ logger.warning(f"⚠️ Agent process exited with code {process.returncode}")
184
+
185
+ # Log changes
186
+ for change_type, path in changes:
187
+ rel_path = os.path.relpath(path, watch_paths[0])
188
+ logger.info(f"🔄 Detected {change_type.name}: {rel_path}")
189
+
190
+ logger.info("🔃 Restarting agent...")
191
+
192
+ # Stop current process
193
+ terminate_process(process)
194
+
195
+ # Delay to allow ports to be released
196
+ time.sleep(PORT_RELEASE_DELAY)
197
+
198
+ # Start new process
199
+ process = start_agent()
200
+ logger.info(f"✅ Agent restarted (PID: {process.pid})")
201
+
202
+ except KeyboardInterrupt:
203
+ pass
204
+ finally:
205
+ terminate_process(process)
206
+ logger.info("👋 File watcher stopped")
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ MCP Mesh Reload Runner - Entry point for file watching mode.
4
+
5
+ Usage:
6
+ python -m _mcp_mesh.reload_runner <agent_script.py>
7
+
8
+ This module is invoked by `meshctl start --watch` to wrap agent execution
9
+ with file watching. When source files change, the agent process is
10
+ automatically restarted.
11
+
12
+ Environment variables:
13
+ MCP_MESH_RELOAD_DEBOUNCE: Debounce delay in seconds (default: 0.5)
14
+ MCP_MESH_RELOAD_PORT_DELAY: Port release delay in seconds (default: 0.5)
15
+ """
16
+
17
+ import logging
18
+ import os
19
+ import sys
20
+
21
+ # Configure logging before imports
22
+ logging.basicConfig(
23
+ level=logging.INFO,
24
+ format="%(levelname)-8s %(message)s",
25
+ )
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ def main():
30
+ """Main entry point for reload runner."""
31
+ if len(sys.argv) < 2:
32
+ print("Usage: python -m _mcp_mesh.reload_runner <agent_script.py>")
33
+ sys.exit(1)
34
+
35
+ script_path = sys.argv[1]
36
+
37
+ if not os.path.exists(script_path):
38
+ print(f"Error: Script not found: {script_path}")
39
+ sys.exit(1)
40
+
41
+ if not script_path.endswith(".py"):
42
+ print(f"Error: Expected a Python script (.py), got: {script_path}")
43
+ sys.exit(1)
44
+
45
+ # Import and run with reload
46
+ from .reload import run_with_reload
47
+
48
+ run_with_reload(script_path)
49
+
50
+
51
+ if __name__ == "__main__":
52
+ main()
@@ -242,6 +242,7 @@ def _start_uvicorn_immediately(http_host: str, http_port: int):
242
242
  log_level="info",
243
243
  timeout_graceful_shutdown=30, # Allow time for registry cleanup
244
244
  access_log=False, # Reduce noise
245
+ ws="websockets-sansio", # Use modern websockets API (avoids deprecation warnings)
245
246
  )
246
247
  except Exception as e:
247
248
  logger.error(f"❌ IMMEDIATE UVICORN: Server failed: {e}")
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "mcp-mesh"
9
- version = "0.7.16"
9
+ version = "0.7.18"
10
10
  description = "Kubernetes-native platform for distributed MCP applications"
11
11
  readme = "README.md"
12
12
  license = { text = "MIT" }
@@ -53,7 +53,8 @@ dependencies = [
53
53
  "pyyaml>=6.0,<7.0",
54
54
  "jinja2>=3.1.0",
55
55
  "redis>=4.0.0,<7.0.0",
56
- "cachetools>=5.3.0"
56
+ "cachetools>=5.3.0",
57
+ "watchfiles>=1.0.0"
57
58
  ]
58
59
 
59
60
  [project.optional-dependencies]
@@ -120,7 +121,7 @@ extend-exclude = '''
120
121
  '''
121
122
 
122
123
  [tool.ruff]
123
- target-version = "0.7.16"
124
+ target-version = "0.7.18"
124
125
  line-length = 88
125
126
 
126
127
  [tool.ruff.lint]
@@ -157,7 +158,7 @@ ignore = [
157
158
  "tests/**" = ["E712", "F841", "B007", "C401", "F401"] # Relax style requirements for test files
158
159
 
159
160
  [tool.mypy]
160
- python_version = "0.7.16"
161
+ python_version = "0.7.18"
161
162
  check_untyped_defs = false # Temporarily relaxed
162
163
  disallow_any_generics = false # Temporarily relaxed
163
164
  disallow_incomplete_defs = false # Temporarily relaxed
@@ -169,7 +170,7 @@ warn_return_any = false # Temporarily relaxed
169
170
  exclude = ["tests/", ".*agent_server_generated.*", ".*registry_client_generated.*"] # Skip type checking for test and generated files
170
171
 
171
172
  [tool.pytest.ini_options]
172
- minversion = "0.7.16"
173
+ minversion = "0.7.18"
173
174
  addopts = "-ra -q --strict-markers --strict-config"
174
175
  testpaths = [
175
176
  "tests",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes