Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/kimi_cli/soul/kimisoul.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
set_current_approval_source,
)
from kimi_cli.background import build_active_task_snapshot
from kimi_cli.exception import MCPRuntimeError
from kimi_cli.hooks.engine import HookEngine
from kimi_cli.llm import ModelCapability
from kimi_cli.notifications import (
Expand Down Expand Up @@ -532,7 +533,13 @@ async def wait_for_background_mcp_loading(self) -> None:
"""Wait for any in-flight MCP startup to finish."""
if not isinstance(self._agent.toolset, KimiToolset):
return
await self._agent.toolset.wait_for_mcp_tools()
try:
await self._agent.toolset.wait_for_mcp_tools()
except MCPRuntimeError as exc:
logger.warning(
"MCP startup failed; continuing without unavailable servers: {error}",
error=exc,
)

async def _checkpoint(self):
await self._context.checkpoint(self._checkpoint_with_user_message)
Expand Down
32 changes: 32 additions & 0 deletions tests/core/test_kimisoul_mcp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from __future__ import annotations

from types import SimpleNamespace

import pytest

import kimi_cli.soul.kimisoul as kimisoul_module
from kimi_cli.exception import MCPRuntimeError
from kimi_cli.soul.kimisoul import KimiSoul


class _FailingMCPToolset:
def __init__(self) -> None:
self.waited = False

async def wait_for_mcp_tools(self) -> None:
self.waited = True
raise MCPRuntimeError("Failed to connect MCP servers: broken")


@pytest.mark.asyncio
async def test_background_mcp_loading_failure_does_not_stop_turn(
monkeypatch: pytest.MonkeyPatch,
) -> None:
toolset = _FailingMCPToolset()
soul = KimiSoul.__new__(KimiSoul)
soul._agent = SimpleNamespace(toolset=toolset)
monkeypatch.setattr(kimisoul_module, "KimiToolset", _FailingMCPToolset)

await soul.wait_for_background_mcp_loading()

assert toolset.waited
Loading