#4875
refactor: extract MCP tool provider lifecycle
Summary
- introduce
MCPToolProviderto own MCP dynamic tool lifecycle state - route AgentLoop MCP connect, reload, close, and runtime-context behavior through the provider
- update MCP lifecycle tests to assert provider-owned state
Closes #4858
Tests
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 PYTHONPATH=. pytest -p pytest_asyncio.plugin tests\agent\test_mcp_connection.py tests\agent\tools\test_self_tool.py -qruff check nanobot\agent\loop.py nanobot\agent\context.py nanobot\agent\tools\mcp.py nanobot\agent\tools\self.py