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.
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/PKG-INFO +2 -1
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/__init__.py +1 -1
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/fastapiserver_setup.py +1 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/startup_orchestrator.py +1 -0
- mcp_mesh-0.7.18/_mcp_mesh/reload.py +206 -0
- mcp_mesh-0.7.18/_mcp_mesh/reload_runner.py +52 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/decorators.py +1 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/pyproject.toml +6 -5
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/.gitignore +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/LICENSE +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/README.md +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/async_mcp_client.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/base_injector.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/decorator_registry.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/dependency_injector.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/http_wrapper.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/llm_config.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/llm_errors.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/mesh_llm_agent.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/mesh_llm_agent_injector.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/base_provider_handler.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/claude_handler.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/generic_handler.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/openai_handler.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/provider_handler_registry.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/response_parser.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/self_dependency_proxy.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/session_aware_client.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/session_manager.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/signature_analyzer.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/tool_executor.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/tool_schema_builder.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/unified_mcp_proxy.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator/FILES +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator/VERSION +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/.openapi-generator-ignore +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/agents_api.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/health_api.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/tracing_api.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_client.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/configuration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/exceptions.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_info.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_metadata.py +0 -0
- {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
- {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
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_registration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agent_registration_metadata.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/agents_list_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/capability_info.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_agent_metadata.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_agent_request.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/decorator_info.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/dependency_info.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/dependency_resolution_info.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/error_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/health_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_request.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_request_metadata.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/heartbeat_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_provider.py +0 -0
- {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
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_filter.py +0 -0
- {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
- {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
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/llm_tool_info.py +0 -0
- {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
- {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
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_agent_registration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_registration_response.py +0 -0
- {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
- {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
- {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
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/mesh_tool_registration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/registration_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/resolved_llm_provider.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/rich_dependency.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/root_response.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/standardized_dependency.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/trace_event.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/py.typed +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/rest.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_dependency_resolution.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_fast_heartbeat_check.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_health_check.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_orchestrator.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_pipeline.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_send.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_lifespan_integration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_registry_connection.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/api_pipeline.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/api_server_setup.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/fastapi_discovery.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/middleware_integration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/route_collection.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/route_integration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/dependency_resolution.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/fast_heartbeat_check.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_orchestrator.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_pipeline.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_send.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/lifespan_integration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/llm_tools_resolution.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/registry_connection.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/configuration.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/decorator_collection.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/fastmcpserver_discovery.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/heartbeat_loop.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/heartbeat_preparation.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/lifespan_factory.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/server_discovery.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/startup_pipeline.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/base_step.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/mesh_pipeline.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/pipeline_types.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/shared/registry_connection.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/config_resolver.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/content_extractor.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/defaults.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/fast_heartbeat_status.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/fastapi_middleware_manager.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/health_check_manager.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/host_resolver.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/logging_config.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/registry_client_wrapper.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/server_discovery.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/simple_shutdown.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/sse_parser.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/shared/support_types.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/agent_context_helper.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/context.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/execution_tracer.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/fastapi_tracing_middleware.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/redis_metadata_publisher.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/trace_context_helper.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/tracing/utils.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/utils/fastmcp_schema_extractor.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/__init__.py +0 -0
- {mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/mesh/helpers.py +0 -0
- {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.
|
|
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'
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/base_provider_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/engine/provider_handlers/provider_handler_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/__init__.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/__init__.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/agents_api.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/health_api.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api/tracing_api.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_client.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/api_response.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/configuration.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/exceptions.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/generated/mcp_mesh_registry_client/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_dependency_resolution.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_fast_heartbeat_check.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_orchestrator.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_heartbeat_pipeline.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_lifespan_integration.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_heartbeat/api_registry_connection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/api_startup/middleware_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/dependency_resolution.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/fast_heartbeat_check.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/heartbeat_orchestrator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/lifespan_integration.py
RENAMED
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_heartbeat/llm_tools_resolution.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_mesh-0.7.16 → mcp_mesh-0.7.18}/_mcp_mesh/pipeline/mcp_startup/fastmcpserver_discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|