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