Loading...
    • Руководство разработчика
    • Справочник API
    • MCP
    • Ресурсы
    • Примечания к выпуску
    Search...
    ⌘K
    Первые шаги
    Введение в ClaudeБыстрый старт
    Модели и цены
    Обзор моделейВыбор моделиЧто нового в Claude 4.5Миграция на Claude 4.5Устаревшие моделиЦены
    Разработка с Claude
    Обзор функцийИспользование Messages APIКонтекстные окнаЛучшие практики промптирования
    Возможности
    Кэширование промптовРедактирование контекстаРасширенное мышлениеУсилиеПотоковая передача сообщенийПакетная обработкаЦитированияМногоязычная поддержкаПодсчет токеновEmbeddingsЗрениеПоддержка PDFFiles APIРезультаты поискаСтруктурированные выходные данные
    Инструменты
    ОбзорКак реализовать использование инструментовПотоковая передача инструментов с детализациейИнструмент BashИнструмент выполнения кодаПрограммное вызывание инструментовИнструмент управления компьютеромИнструмент текстового редактораИнструмент веб-выборкиИнструмент веб-поискаИнструмент памятиИнструмент поиска инструментов
    Agent Skills
    ОбзорБыстрый стартЛучшие практикиИспользование Skills с API
    Agent SDK
    ОбзорБыстрый стартTypeScript SDKTypeScript V2 (preview)Python SDKРуководство по миграции
    Потоковый вводОбработка разрешенийУправление выполнением с помощью хуковУправление сеансамиКонтрольные точки файловСтруктурированные выходные данные в SDKРазмещение Agent SDKБезопасное развертывание AI-агентовИзменение системных промптовMCP в SDKПользовательские инструментыПодагенты в SDKСлэш-команды в SDKAgent Skills в SDKОтслеживание затрат и использованияСписки задачПлагины в SDK
    MCP в API
    MCP коннекторУдаленные MCP серверы
    Claude на сторонних платформах
    Amazon BedrockMicrosoft FoundryVertex AI
    Инженерия промптов
    ОбзорГенератор промптовИспользование шаблонов промптовУлучшитель промптовБудьте ясны и прямолинейныИспользуйте примеры (многошаговое промптирование)Дайте Claude подумать (CoT)Используйте XML-тегиДайте Claude роль (системные промпты)Предзаполните ответ ClaudeЦепочка сложных промптовСоветы по длинному контекстуСоветы по расширенному мышлению
    Тестирование и оценка
    Определение критериев успехаРазработка тестовых случаевИспользование инструмента оценкиСнижение задержки
    Усиление защиты
    Снижение галлюцинацийПовышение согласованности выходных данныхСмягчение взломовПотоковые отказыСнижение утечки промптовДержите Claude в образе
    Администрирование и мониторинг
    Обзор Admin APIAPI использования и затратClaude Code Analytics API
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    Руководства

    Пользовательские инструменты

    Создавайте и интегрируйте пользовательские инструменты для расширения функциональности Claude Agent SDK
    • Создание пользовательских инструментов
    • Использование пользовательских инструментов
    • Формат имени инструмента
    • Настройка разрешенных инструментов
    • Пример с несколькими инструментами
    • Типобезопасность с Python
    • Обработка ошибок
    • Примеры инструментов
    • Инструмент запроса к базе данных
    • Инструмент API шлюза
    • Инструмент калькулятора
    • Связанная документация

    Пользовательские инструменты позволяют расширить возможности Claude Code с помощью собственной функциональности через внутрипроцессные MCP серверы, позволяя Claude взаимодействовать с внешними сервисами, API или выполнять специализированные операции.

    Создание пользовательских инструментов

    Используйте вспомогательные функции createSdkMcpServer и tool для определения типобезопасных пользовательских инструментов:

    import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
    import { z } from "zod";
    
    // Создание SDK MCP сервера с пользовательскими инструментами
    const customServer = createSdkMcpServer({
      name: "my-custom-tools",
      version: "1.0.0",
      tools: [
        tool(
          "get_weather",
          "Получить текущую температуру для местоположения по координатам",
          {
            latitude: z.number().describe("Координата широты"),
            longitude: z.number().describe("Координата долготы")
          },
          async (args) => {
            const response = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${args.latitude}&longitude=${args.longitude}&current=temperature_2m&temperature_unit=fahrenheit`);
            const data = await response.json();
    
            return {
              content: [{
                type: "text",
                text: `Температура: ${data.current.temperature_2m}°F`
              }]
            };
          }
        )
      ]
    });

    Использование пользовательских инструментов

    Передайте пользовательский сервер в функцию query через опцию mcpServers в виде словаря/объекта.

    Важно: Пользовательские MCP инструменты требуют режима потокового ввода. Вы должны использовать асинхронный генератор/итерируемый объект для параметра prompt - простая строка не будет работать с MCP серверами.

    Формат имени инструмента

    Когда MCP инструменты предоставляются Claude, их имена следуют определенному формату:

    • Шаблон: mcp__{server_name}__{tool_name}
    • Пример: Инструмент с именем get_weather на сервере my-custom-tools становится mcp__my-custom-tools__get_weather

    Настройка разрешенных инструментов

    Вы можете контролировать, какие инструменты может использовать Claude, через опцию allowedTools:

    Пример с несколькими инструментами

    Когда ваш MCP сервер имеет несколько инструментов, вы можете выборочно разрешить их:

    Типобезопасность с Python

    Декоратор @tool поддерживает различные подходы к определению схем для типобезопасности:

    Обработка ошибок

    Обрабатывайте ошибки корректно, чтобы предоставить осмысленную обратную связь:

    Примеры инструментов

    Инструмент запроса к базе данных

    Инструмент API шлюза

    Инструмент калькулятора

    Связанная документация

    • Справочник TypeScript SDK
    • Справочник Python SDK
    • Документация MCP
    • Обзор SDK
    import { query } from "@anthropic-ai/claude-agent-sdk";
    
    // Использование пользовательских инструментов в запросе с потоковым вводом
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Какая погода в Сан-Франциско?"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Использование асинхронного генератора для потокового ввода
      options: {
        mcpServers: {
          "my-custom-tools": customServer  // Передача как объект/словарь, не массив
        },
        // Опционально указать, какие инструменты может использовать Claude
        allowedTools: [
          "mcp__my-custom-tools__get_weather",  // Разрешить инструмент погоды
          // Добавить другие инструменты по необходимости
        ],
        maxTurns: 3
      }
    })) {
      if (message.type === "result" && message.subtype === "success") {
        console.log(message.result);
      }
    }
    const multiToolServer = createSdkMcpServer({
      name: "utilities",
      version: "1.0.0",
      tools: [
        tool("calculate", "Выполнить вычисления", { /* ... */ }, async (args) => { /* ... */ }),
        tool("translate", "Перевести текст", { /* ... */ }, async (args) => { /* ... */ }),
        tool("search_web", "Поиск в интернете", { /* ... */ }, async (args) => { /* ... */ })
      ]
    });
    
    // Разрешить только определенные инструменты с потоковым вводом
    async function* generateMessages() {
      yield {
        type: "user" as const,
        message: {
          role: "user" as const,
          content: "Вычисли 5 + 3 и переведи 'hello' на испанский"
        }
      };
    }
    
    for await (const message of query({
      prompt: generateMessages(),  // Использование асинхронного генератора для потокового ввода
      options: {
        mcpServers: {
          utilities: multiToolServer
        },
        allowedTools: [
          "mcp__utilities__calculate",   // Разрешить калькулятор
          "mcp__utilities__translate",   // Разрешить переводчик
          // "mcp__utilities__search_web" НЕ разрешен
        ]
      }
    })) {
      // Обработка сообщений
    }
    import { z } from "zod";
    
    tool(
      "process_data",
      "Обработать структурированные данные с типобезопасностью",
      {
        // Схема Zod определяет как валидацию времени выполнения, так и типы TypeScript
        data: z.object({
          name: z.string(),
          age: z.number().min(0).max(150),
          email: z.string().email(),
          preferences: z.array(z.string()).optional()
        }),
        format: z.enum(["json", "csv", "xml"]).default("json")
      },
      async (args) => {
        // args полностью типизирован на основе схемы
        // TypeScript знает: args.data.name это string, args.data.age это number, и т.д.
        console.log(`Обработка данных ${args.data.name} как ${args.format}`);
        
        // Ваша логика обработки здесь
        return {
          content: [{
            type: "text",
            text: `Обработаны данные для ${args.data.name}`
          }]
        };
      }
    )
    tool(
      "fetch_data",
      "Получить данные из API",
      {
        endpoint: z.string().url().describe("URL конечной точки API")
      },
      async (args) => {
        try {
          const response = await fetch(args.endpoint);
          
          if (!response.ok) {
            return {
              content: [{
                type: "text",
                text: `Ошибка API: ${response.status} ${response.statusText}`
              }]
            };
          }
          
          const data = await response.json();
          return {
            content: [{
              type: "text",
              text: JSON.stringify(data, null, 2)
            }]
          };
        } catch (error) {
          return {
            content: [{
              type: "text",
              text: `Не удалось получить данные: ${error.message}`
            }]
          };
        }
      }
    )
    const databaseServer = createSdkMcpServer({
      name: "database-tools",
      version: "1.0.0",
      tools: [
        tool(
          "query_database",
          "Выполнить запрос к базе данных",
          {
            query: z.string().describe("SQL запрос для выполнения"),
            params: z.array(z.any()).optional().describe("Параметры запроса")
          },
          async (args) => {
            const results = await db.query(args.query, args.params || []);
            return {
              content: [{
                type: "text",
                text: `Найдено ${results.length} строк:\n${JSON.stringify(results, null, 2)}`
              }]
            };
          }
        )
      ]
    });
    const apiGatewayServer = createSdkMcpServer({
      name: "api-gateway",
      version: "1.0.0",
      tools: [
        tool(
          "api_request",
          "Выполнить аутентифицированные API запросы к внешним сервисам",
          {
            service: z.enum(["stripe", "github", "openai", "slack"]).describe("Сервис для вызова"),
            endpoint: z.string().describe("Путь конечной точки API"),
            method: z.enum(["GET", "POST", "PUT", "DELETE"]).describe("HTTP метод"),
            body: z.record(z.any()).optional().describe("Тело запроса"),
            query: z.record(z.string()).optional().describe("Параметры запроса")
          },
          async (args) => {
            const config = {
              stripe: { baseUrl: "https://api.stripe.com/v1", key: process.env.STRIPE_KEY },
              github: { baseUrl: "https://api.github.com", key: process.env.GITHUB_TOKEN },
              openai: { baseUrl: "https://api.openai.com/v1", key: process.env.OPENAI_KEY },
              slack: { baseUrl: "https://slack.com/api", key: process.env.SLACK_TOKEN }
            };
            
            const { baseUrl, key } = config[args.service];
            const url = new URL(`${baseUrl}${args.endpoint}`);
            
            if (args.query) {
              Object.entries(args.query).forEach(([k, v]) => url.searchParams.set(k, v));
            }
            
            const response = await fetch(url, {
              method: args.method,
              headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" },
              body: args.body ? JSON.stringify(args.body) : undefined
            });
            
            const data = await response.json();
            return {
              content: [{
                type: "text",
                text: JSON.stringify(data, null, 2)
              }]
            };
          }
        )
      ]
    });
    const calculatorServer = createSdkMcpServer({
      name: "calculator",
      version: "1.0.0",
      tools: [
        tool(
          "calculate",
          "Выполнить математические вычисления",
          {
            expression: z.string().describe("Математическое выражение для вычисления"),
            precision: z.number().optional().default(2).describe("Точность десятичных знаков")
          },
          async (args) => {
            try {
              // Используйте безопасную библиотеку математических вычислений в продакшене
              const result = eval(args.expression); // Только для примера!
              const formatted = Number(result).toFixed(args.precision);
              
              return {
                content: [{
                  type: "text",
                  text: `${args.expression} = ${formatted}`
                }]
              };
            } catch (error) {
              return {
                content: [{
                  type: "text",
                  text: `Ошибка: Недопустимое выражение - ${error.message}`
                }]
              };
            }
          }
        ),
        tool(
          "compound_interest",
          "Вычислить сложные проценты для инвестиции",
          {
            principal: z.number().positive().describe("Начальная сумма инвестиции"),
            rate: z.number().describe("Годовая процентная ставка (как десятичная дробь, например, 0.05 для 5%)"),
            time: z.number().positive().describe("Период инвестиции в годах"),
            n: z.number().positive().default(12).describe("Частота начисления процентов в год")
          },
          async (args) => {
            const amount = args.principal * Math.pow(1 + args.rate / args.n, args.n * args.time);
            const interest = amount - args.principal;
            
            return {
              content: [{
                type: "text",
                text: `Анализ инвестиций:\n` +
                      `Основная сумма: $${args.principal.toFixed(2)}\n` +
                      `Ставка: ${(args.rate * 100).toFixed(2)}%\n` +
                      `Время: ${args.time} лет\n` +
                      `Начисление: ${args.n} раз в год\n\n` +
                      `Итоговая сумма: $${amount.toFixed(2)}\n` +
                      `Заработанные проценты: $${interest.toFixed(2)}\n` +
                      `Доходность: ${((interest / args.principal) * 100).toFixed(2)}%`
              }]
            };
          }
        )
      ]
    });