Skip to content

Latest commit

 

History

History
161 lines (108 loc) · 10.5 KB

File metadata and controls

161 lines (108 loc) · 10.5 KB

Тестирование и отладка

Перед тем как начать тестировать ваш MCP сервер, важно понять доступные инструменты и лучшие практики отладки. Эффективное тестирование гарантирует, что ваш сервер работает как задумано, и помогает быстро выявлять и устранять проблемы. В следующем разделе описаны рекомендуемые подходы для проверки реализации MCP.

Обзор

В этом уроке рассматривается, как выбрать правильный подход к тестированию и наиболее эффективный инструмент для этого.

Цели обучения

К концу этого урока вы сможете:

  • Описывать различные подходы к тестированию.
  • Использовать разные инструменты для эффективного тестирования вашего кода.

Тестирование MCP серверов

MCP предоставляет инструменты для тестирования и отладки ваших серверов:

  • MCP Inspector: инструмент командной строки, который можно запускать как в CLI, так и в визуальном режиме.
  • Ручное тестирование: можно использовать такие инструменты, как curl, для выполнения веб-запросов, но подойдет любой инструмент, способный работать с HTTP.
  • Модульное тестирование: возможно использовать предпочитаемый вами фреймворк для тестирования функций как сервера, так и клиента.

Использование MCP Inspector

Мы уже описывали использование этого инструмента в предыдущих уроках, но давайте рассмотрим его вкратце. Это инструмент, написанный на Node.js, который можно запустить с помощью исполняемого файла npx. Он временно скачает и установит сам инструмент, а после выполнения вашего запроса удалит временные файлы.

MCP Inspector помогает вам:

  • Обнаруживать возможности сервера: автоматически определять доступные ресурсы, инструменты и подсказки
  • Тестировать выполнение инструментов: пробовать разные параметры и видеть ответы в реальном времени
  • Просматривать метаданные сервера: изучать информацию о сервере, схемы и конфигурации

Типичный запуск инструмента выглядит так:

npx @modelcontextprotocol/inspector node build/index.js

Команда запускает MCP и его визуальный интерфейс, открывая локальный веб-интерфейс в браузере. Вы увидите панель с зарегистрированными MCP серверами, их доступными инструментами, ресурсами и подсказками. Интерфейс позволяет интерактивно тестировать выполнение инструментов, исследовать метаданные сервера и смотреть ответы в реальном времени, что облегчает проверку и отладку реализации MCP сервера.

Вот как это может выглядеть: Inspector

Также можно запустить этот инструмент в режиме CLI, добавив параметр --cli. Вот пример запуска инструмента в режиме "CLI", который выводит список всех инструментов на сервере:

npx @modelcontextprotocol/inspector --cli node build/index.js --method tools/list

Ручное тестирование

Помимо использования MCP Inspector для проверки возможностей сервера, можно применить другой подход — запустить клиент, способный работать с HTTP, например curl.

С помощью curl вы можете тестировать MCP серверы напрямую через HTTP-запросы:

# Example: Test server metadata
curl http://localhost:3000/v1/metadata

# Example: Execute a tool
curl -X POST http://localhost:3000/v1/tools/execute \
  -H "Content-Type: application/json" \
  -d '{"name": "calculator", "parameters": {"expression": "2+2"}}'

Как видно из примера с curl, для вызова инструмента используется POST-запрос с телом, содержащим имя инструмента и его параметры. Используйте тот подход, который вам удобнее. CLI-инструменты обычно работают быстрее и их легко автоматизировать, что полезно в CI/CD средах.

Модульное тестирование

Создавайте модульные тесты для ваших инструментов и ресурсов, чтобы убедиться, что они работают корректно. Вот пример тестового кода.

import pytest

from mcp.server.fastmcp import FastMCP
from mcp.shared.memory import (
    create_connected_server_and_client_session as create_session,
)

# Mark the whole module for async tests
pytestmark = pytest.mark.anyio


async def test_list_tools_cursor_parameter():
    """Test that the cursor parameter is accepted for list_tools.

    Note: FastMCP doesn't currently implement pagination, so this test
    only verifies that the cursor parameter is accepted by the client.
    """

 server = FastMCP("test")

    # Create a couple of test tools
    @server.tool(name="test_tool_1")
    async def test_tool_1() -> str:
        """First test tool"""
        return "Result 1"

    @server.tool(name="test_tool_2")
    async def test_tool_2() -> str:
        """Second test tool"""
        return "Result 2"

    async with create_session(server._mcp_server) as client_session:
        # Test without cursor parameter (omitted)
        result1 = await client_session.list_tools()
        assert len(result1.tools) == 2

        # Test with cursor=None
        result2 = await client_session.list_tools(cursor=None)
        assert len(result2.tools) == 2

        # Test with cursor as string
        result3 = await client_session.list_tools(cursor="some_cursor_value")
        assert len(result3.tools) == 2

        # Test with empty string cursor
        result4 = await client_session.list_tools(cursor="")
        assert len(result4.tools) == 2
    

Данный код делает следующее:

  • Использует фреймворк pytest, который позволяет создавать тесты в виде функций и использовать утверждения assert.
  • Создает MCP сервер с двумя разными инструментами.
  • С помощью assert проверяет выполнение определенных условий.

Полный файл можно посмотреть здесь

Исходя из этого файла, вы можете тестировать свой сервер, чтобы убедиться, что возможности создаются правильно.

Все основные SDK имеют похожие разделы для тестирования, так что вы можете адаптировать их под выбранную среду выполнения.

Примеры

Дополнительные ресурсы

Что дальше

Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Несмотря на наши усилия обеспечить точность, просим учитывать, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется использовать профессиональный перевод, выполненный человеком. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.