MCP и Python MCP Server Development Explained

Первое знакомство с MCP

MCP (Model Context Protocol) - это протокол, разработанный для стандартизации того, как приложения предоставляют контекст для больших моделей. MCP обеспечивает стандартный способ предоставления данных и инструментов для LLM, использование MCP упрощает создание агентов или сложных рабочих процессов на основе LLM.

 

построить

MCP - это структура CS, в которой хост-приложение MCP может связывать несколько серверов MCP. MCP 和 Python MCP Server 开发详解

  • MCP Host: Программы, которым необходимо получать данные через MCP, такие как Claude Desktop, IDE, некоторые инструменты искусственного интеллекта и т. д.
  • MCP Client: клиент протокола MCP, и MCP Server - поддержка один на один.
  • MCP Server: легкое приложение, которому необходимо предоставить некоторые специальные возможности через MCP. Согласно определению протокола MCP, сервер может предоставлять три типа стандартных возможностей, Resources, Tools, Prompts, каждый сервер может одновременно предоставлять три типа возможностей или одну из них.
    • Ресурсы: ресурсы, аналогично чтению данных из файла, могут быть файловыми ресурсами или содержимым, возвращаемым ответом API.
    • Инструменты: Инструменты, сторонние сервисы, функции, с помощью которых вы можете контролировать, какие функции могут быть вызваны LLM.
    • Подсказки: подсказки - заранее заданные шаблоны для выполнения пользователем определенных задач.
  • Локальные ресурсы данных: локальные файлы, базы данных, службы и т. д., к которым MCP Server может получить безопасный доступ.
  • Удаленная служба: внешняя система, к которой сервер MCP может подключаться через сеть (например, API).

 

Схема услуг MCP: MCP 和 Python MCP Server 开发详解

MCP-серверы предоставляют некоторый список функций хост-приложению через MCP-протокол (например, предоставляют список инструментов), а затем хост-приложение форматирует этот список в формат, который LLM может прочитать и понять. Host Application может использовать этот список функций для отправки LLM некоторых запросов, которые должны быть обработаны большой моделью (это подсказка), и LLM вернет json-строку tool_calls, основанную на этой подсказке. Когда Host Applicaiton получит эти tool_calls, он вызовет соответствующий инструмент сервера MCP, чтобы вернуть соответствующие результаты.

 

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

При использовании клиента Claude для рабочего стола вам обязательно нужно сначала установить его, а эту установку можно пропустить. Настраиваем файловую систему MCP Server. MCP 和 Python MCP Server 开发详解

Затем выберите Edit Config в разделе Developer, MCP 和 Python MCP Server 开发详解

показать (билет)claude_desktop_config.jsonЧтобы завершить настройку MCP Server для файловой системы, вам нужно заменить имя пользователя на имя пользователя вашего компьютера. (Имя пользователя конфигурации необходимо заменить на имя пользователя вашего компьютера, но также необходимо локально установить среду node.js).

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Desktop",
        "/Users/username/Downloads"
      ]
    }
  }
}

После завершения настройки перезапустите клиент Cluade. Он будет готов к опробованию.

MCP 和 Python MCP Server 开发详解

Нажмите на значок молотка, чтобы увидеть инструменты, предоставляемые MCP Server.

MCP 和 Python MCP Server 开发详解

Вы можете опробовать его, набрав следующее приглашение

Can you take all the images on my desktop and move them to a new folder called “Images”?

Сервер LLM с обратной связью и файловой системой MCP работает еще с несколькими напоминаниями о разрешениях, не забудьте их разрешить.

MCP 和 Python MCP Server 开发详解

После этого вы увидите, что LLM, MCPServer начинают работать.

MCP 和 Python MCP Server 开发详解

 

Учебник по началу разработки сервера MCP (python и pip)

Простой mcp-сервер с использованием технологического стека python

 

Требуется установка

Для сервера MCP требуется python-sdk, для python - 3.10, установите следующее

pip install mcp

 

PS: MCP официально использует инструмент управления пакетами uv, я обычно больше использую pip, поэтому в тексте в основном используется pip. Потому что некоторые зависимости пакета mcp имеют не самую последнюю версию, поэтому лучше всего получить чистую среду. Разработка сервера MCP требует наличия отладочного клиента, MCP inspector предоставляет эту функцию

npx @modelcontextprotocol/inspector <command> <arg1> <arg2>

Где команда python, если мы используем сервер, написанный на python.<arg1> <arg2>является необязательным параметром. После запуска

 

Разработка демонстрационного сервера MCP

MCP Server: легкое приложение, которому необходимо предоставить некоторые специальные возможности через MCP. Согласно определению протокола MCP, сервер может предоставлять три типа стандартных возможностей, Resources, Tools, Prompts, каждый сервер может одновременно предоставлять три типа возможностей или одну из них.

  • Ресурсы: ресурсы, аналогично чтению данных из файла, могут быть файловыми ресурсами или содержимым, возвращаемым ответом API.
  • Инструменты: Инструменты, сторонние сервисы, функции, с помощью которых вы можете контролировать, какие функции могут быть вызваны LLM.
  • Подсказки: подсказки - заранее заданные шаблоны для выполнения пользователем определенных задач.

Вот демонстрация трех типов возможностей с использованием python-sdk.

 

Подсказки

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

@server.list_prompts()
async def handle_list_prompts() -> list[types.Prompt]:
    """
    提示模版定义
    """
    return [
        types.Prompt(
            name="example-prompt",
            description="An example prompt template",
            arguments=[
                types.PromptArgument(
                    name="arg1",
                    description="Example argument",
                    required=True
                )
            ]
        )
    ]

@server.get_prompt()
async def handle_get_prompt(
    name: str,
    arguments: dict[str, str] | None
) -> types.GetPromptResult:
    """
    提示模板处理
    """
    if name != "example-prompt":
        raise ValueError(f"Unknown prompt: {name}")

    return types.GetPromptResult(
        description="Example prompt",
        messages=[
            types.PromptMessage(
                role="user",
                content=types.TextContent(
                    type="text",
                    text="Example prompt text"
                )
            )
        ]
    )

 

Ресурсы

Код для функций управления ресурсамиlist_resourcesПеречисляет доступные ресурсы, возвращая список ресурсов.read_resourceSAMPLE_RESOURCES - это демо-версия, созданная для тестирования.

@server.list_resources()
async def list_resources() -> list[types.Resource]:
    """
    资源定义
    """
    test='test'
    return [
        types.Resource(
            uri=AnyUrl(f"file:///{test}.txt"),
            name=test,
            description=f"A sample text resource named {test}",
            mimeType="text/plain",
        )
        # for name in SAMPLE_RESOURCES.keys()
    ]
SAMPLE_RESOURCES={'test':'this demo is a mcp server!'}
@server.read_resource()
async def read_resource(uri: AnyUrl) -> str | bytes:
    assert uri.path is not None
    print(uri.path)
    name = uri.path.replace(".txt", "").lstrip("/")
    # print(name)
    if name not in SAMPLE_RESOURCES:
        raise ValueError(f"Unknown resource: {uri}")

    return SAMPLE_RESOURCES[name]

 

Инструменты

工具定义和调用,handle_list_tools定义可用的工具,使用 JSON Schema 验证工具参数。handle_call_tool处理工具调用,根据工具名称和参数执行相应的操作。 @server.list_tools() async def handle_list_tools() -> list[types.Tool]:     """     工具定义.     每个工具都使用JSON Schema验证指定其参数.     """     return [         types.Tool(             name="demo-tool",             description="Get data tool for a param",             inputSchema={                 "type": "object",                 "properties": {                     "param": {                         "type": "string",                         "description": "url",                     },                 },                 "required": ["param"],             },         )     ] @server.call_tool() async def handle_call_tool(     name: str, arguments: dict | None ) -> list[Any]:     logging.info(name)     """     处理工具调用     """     if not arguments:         raise ValueError("Missing arguments")     if name == "demo-tool":         param = arguments.get("param")         if not param:             raise ValueError("Missing state parameter")         param = param.upper()         return [             types.TextContent(                 type="text",                 text=f"text:{param}"             )         ]     else:         raise ValueError(f"Unknown tool: {name}")

 

инспектор

Сервер MCP был написан следующим образом, вы можете запустить инспектор MCP для отладки, в каталоге, где находится код сервера, введите

npx @modelcontextprotocal/inspector

После запуска получите следующий скриншот в соответствии с рисунком, посетите http://localhost:5273, в соответствии с тем, что я говорил ранее, выберите STDIO для типа транспорта, введите python для команды, введите server.py для Arguments (приведенный выше демонстрационный код сохраняется в файле server.py), нажмите connect. На диаграмме вы можете ввести соответствующий вызов службы Server по каждому типу, а также нажать List Resource в Resources, чтобы перечислить все ресурсы, и нажать соответствующий ресурс, чтобы увидеть содержимое конкретного ресурса.

Это позволяет нам взаимодействовать с разработанным нами сервером MCP.

 

Как настроить в Claude Desktop

Настройте этот MCP-сервер в Claude, следуя настройкам команд, которые вы только что выполнили в Inspector. Щелкните на настройках рабочего стола Claude, выберите вкладку developer, а затем нажмите edit config, чтобы перейти к файлу claude_desktop_config.json.

В настоящее время у меня установлено два MCP-сервера со следующими конфигурациями: один для организации файлов, другой для playwright (для установки MCP-сервера playwright через npx.

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/crisschan/Desktop",
        "/Users/crisschan/Downloads"
      ]
    },
     "playwright": {
      "command": "npx",
      "args": ["-y", 
      "@executeautomation/playwright-mcp-server"]
    }
  }
}

Настройте наш собственный демонстрационный сервис в этом формате, затем сохраните и перезапустите Claude desktop.

{
  "mcpServers": {
    ,
    "demo": {
      "command": "/opt/anaconda3/bin/python3",
      "args": ["/Users/workspace/pyspace/try_mcp/server.py"]
      }
  }
}

Где в конфигурации, команда должна быть абсолютным адресом соответствующей версии python, и то же самое касается расположения кода server.py в args, чтобы использовать абсолютный адрес.

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...