Разработка с Claude API

Запросы, потоковые ответы, tool use, структурированный вывод и стоимость.

92 уроков, первые 3 бесплатно. Полный доступ: 1490 руб.

Уроки курса

  1. Welcome to the course
  2. Overview of Claude models
  3. Accessing the API
  4. Getting an API key
  5. Making a request
  6. Multi-Turn conversations
  7. Chat exercise
  8. System prompts
  9. System prompts exercise
  10. Temperature
  11. Course satisfaction survey
  12. Response streaming
  13. Structured data
  14. Structured data exercise
  15. Quiz on accessing Claude with the API
  16. Prompt evaluation
  17. A typical eval workflow
  18. Generating test datasets
  19. Running the eval
  20. Model based grading
  21. Code based grading
  22. Exercise on prompt evals
  23. Quiz on prompt evaluation
  24. Prompt engineering
  25. Being clear and direct
  26. Being specific
  27. Structure with XML tags
  28. Providing examples
  29. Exercise on prompting
  30. Quiz on prompt engineering techniques
  31. Introducing tool use
  32. Project overview
  33. Tool functions
  34. Tool schemas
  35. Handling message blocks
  36. Sending tool results
  37. Multi-turn conversations with tools
  38. Implementing multiple turns
  39. Using multiple tools
  40. Fine grained tool calling
  41. The text edit tool
  42. The web search tool
  43. Quiz on tool use with Claude
  44. Introducing Retrieval Augmented Generation
  45. Text chunking strategies
  46. Text embeddings
  47. The full RAG flow
  48. Implementing the RAG flow
  49. BM25 lexical search
  50. A Multi-Index RAG pipeline
  51. Extended thinking
  52. Image support
  53. PDF support
  54. Citations
  55. Prompt caching
  56. Rules of prompt caching
  57. Prompt caching in action
  58. Code execution and the Files API
  59. Quiz on features of Claude
  60. Introducing MCP
  61. MCP clients
  62. Project setup
  63. Defining tools with MCP
  64. The server inspector
  65. Implementing a client
  66. Defining resources
  67. Accessing resources
  68. Defining prompts
  69. Prompts in the client
  70. MCP review
  71. Quiz on Model Context Protocol
  72. Anthropic apps
  73. Claude Code setup
  74. Claude Code in action
  75. Enhancements with MCP servers
  76. Agents and workflows
  77. Parallelization workflows
  78. Chaining workflows
  79. Routing workflows
  80. Agents and tools
  81. Environment inspection
  82. Workflows vs agents
  83. Quiz on Agents and Workflows
  84. Final Assessment
  85. Course Wrap Up
  86. What You'll Learn
  87. What You'll Learn
  88. What You'll Learn
  89. What You'll Learn
  90. What You'll Learn
  91. What You'll Learn
  92. What You'll Learn

Реализация клиентской части

После того как мы успешно настроили и запустили наш сервер MCP (Multi-tool Coordination Platform), пришло время сосредоточиться на создании его клиентской части. Клиент — это ключевой компонент, который позволяет нашему приложению взаимодействовать с сервером MCP и использовать весь спектр его функциональных возможностей. Он служит мостом, обеспечивающим бесшовную связь между логикой вашего приложения и мощными инструментами, предоставляемыми сервером.

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

Архитектура клиентской части

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

Одной из важнейших функций нашего пользовательского класса-обертки является автоматическая очистка ресурсов. Сессия клиента требует корректного закрытия и освобождения ресурсов после завершения работы, чтобы избежать утечек памяти и других проблем. Наш класс берет на себя эту ответственность, гарантируя, что все ресурсы будут аккуратно освобождены, когда сессия больше не нужна.

Роль клиента в работе приложения

Вспомните общий поток работы нашего приложения. Наш код командной строки (CLI) должен выполнять две основные задачи при взаимодействии с сервером MCP:

Клиент MCP предоставляет эти возможности через простые вызовы методов, которые наш код приложения может легко использовать. Это позволяет разработчикам сосредоточиться на бизнес-логике, не углубляясь в детали сетевого взаимодействия и управления сессиями.

Реализация ключевых методов клиента

Для обеспечения необходимой функциональности нам нужно реализовать два ключевых метода в нашем клиентском классе:

Метод list_tools

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

async def list_tools(self) -> list[types.Tool]:
    result = await self.session().list_tools()
    return result.tools

Как видите, его реализация довольно проста: мы получаем доступ к нашей сессии (соединению с сервером), вызываем встроенный метод list_tools() и возвращаем полученный список инструментов.

Метод call_tool

Этот метод предназначен для выполнения конкретного инструмента на сервере. Когда Claude принимает решение использовать инструмент, он предоставляет его название и необходимые входные параметры. Метод call_tool передает эту информацию серверу, который затем выполняет запрошенное действие и возвращает результат.

async def call_tool(
    self, tool_name: str, tool_input: dict
) -> types.CallToolResult | None:
    return await self.session().call_tool(tool_name, tool_input)

Мы передаем имя инструмента (tool_name) и входные параметры (tool_input), предоставленные Claude, на сервер и возвращаем результат выполнения. Этот результат затем может быть передан обратно Claude для формирования окончательного ответа пользователю.

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

Чтобы убедиться в корректности нашей реализации, мы можем запустить клиентскую часть напрямую и проверить ее взаимодействие с сервером. В реальных проектах для этого обычно создается тестовый сценарий или "обвязка" (testing harness), которая имитирует работу приложения. Этот сценарий подключается к нашему серверу MCP и вызывает реализованные нами методы.

Например, тестовый код может выглядеть следующим образом:

async with MCPClient(
    command="uv", args=["run", "mcp_server.py"]
) as client:
    result = await client.list_tools()
    print(result)

При выполнении такого теста мы ожидаем увидеть вывод определений наших инструментов, включая, например, инструмент read_doc_contents, который мы могли настроить ранее на сервере. Это подтверждает, что клиент успешно устанавливает соединение, запрашивает список инструментов и получает корректные данные от сервера.

Полный цикл взаимодействия: Клиент, Сервер и Claude

Теперь, когда наш клиент способен получать список инструментов и вызывать их, мы можем рассмотреть полный цикл взаимодействия в приложении. Представьте, что мы запускаем наше основное приложение и задаем Claude вопрос о документе:

  1. Наш код использует клиент для получения списка всех доступных инструментов с сервера MCP.
  2. Эти инструменты, вместе с вопросом пользователя, отправляются в Claude.
  3. Claude анализирует запрос и доступные инструменты, а затем принимает решение использовать один из них, например, инструмент для чтения документов.
  4. Наш код, используя клиент, выполняет этот инструмент на сервере MCP, передавая ему необходимые параметры (например, имя файла документа).
  5. Результат выполнения инструмента (содержимое документа) отправляется обратно Claude.
  6. Claude использует полученную информацию для формирования осмысленного ответа пользователю.

Например, если пользователь спросит: "Каково содержимое документа report.pdf?", это инициирует использование Claude нашего инструмента для чтения документов. В ответ мы получим информацию о документе "20m condenser tower", который мы настроили на нашем сервере. Клиентская часть выступает в роли незаменимого связующего звена между логикой нашего приложения и функциональностью сервера MCP, значительно упрощая доступ к возможностям сервера без необходимости углубляться в тонкости базовых деталей соединения.