MCP - черный ящик

MCP-серверы могут сбоить – возвращать ошибки или работать слишком медленно

Добавление retry

В файле mcp-client.py в функциях list_tools и call_tool добавьте цикл со счетчиком попыток.

Для лучшей наблюдаемости стоит записывать неудачный попытки в метаданные спана.

def list_tools():
    with langfuse.start_as_current_observation(as_type="tool", name="list-tools") as tool:
        r = requests.post(
            f"{MCP_URL}",
            headers=_build_base_headers(),
            json=_build_base_request("tools/list"),
            timeout=5,
        )
        for attempt in range(MAX_RETRIES):
            try:
                r.raise_for_status()
                result = [_create_llm_tool_definition(t) for t in r.json()["result"]["tools"]]
                tool.update(output=result)
                return result
            except requests.RequestException as e:
                tool.update(metadata={attempt : e})
                if attempt < MAX_RETRIES - 1:
                    continue
                else:
                    raise
    return result

def call_tool(name, arguments):
    with langfuse.start_as_current_observation(as_type="tool", name="call-tool") as tool:
        tool.update(input={"name": name, "arguments": arguments})
        payload = _build_base_request("tools/call")
        payload["params"] = {
            "name": name,
            "arguments": arguments,
        }
        for attempt in range(MAX_RETRIES):
            try:
                r = requests.post(
                    f"{MCP_URL}",
                    headers=_build_base_headers(),
                    json=payload,
                    timeout=5,
                )
                r.raise_for_status()
                result = r.json()["result"]
                tool.update(output=result)
                return result
            except requests.RequestException as e:
                tool.update(metadata = {attempt: e})
                if attempt < MAX_RETRIES - 1:
                    continue
                else:
                    raise
    return result

Не забудьте объявить константу MAX_RETRIES с ограничением на число итераций:

MAX_RETRIES = 3

После изменений перезапустите агента:

docker compose up -d --force-recreate cookbook-agent

Задача

Добиться работы агента даже при ошибках MCP