# Использование MCP-серверов с SDK GitHub Copilot

Copilot SDK может интегрироваться с серверами MCP (протокол контекста модели) для расширения возможностей помощника с помощью внешних инструментов. MCP-серверы работают как отдельные процессы и предоставляют инструменты (функции), которые Copilot может вызывать во время разговоров.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

> \[!NOTE]
> Это развивающаяся функция. См. [выпуск #36](https://github.com/github/copilot-sdk/issues/36) для дальнейшего обсуждения.

## Что такое MCP?

[Протокол контекста модели (MCP)](https://modelcontextprotocol.io/) — это открытый стандарт для подключения ассистентов ИИ к внешним инструментам и источникам данных. MCP-серверы могут:

* Выполните код или скрипты
* Базы данных запросов
* Файловые системы доступа
* Вызов внешних API
* И многое другое

## Типы серверов

SDK поддерживает два типа MCP-серверов:

| Type            | Описание                                             | Вариант использования                                            |
| --------------- | ---------------------------------------------------- | ---------------------------------------------------------------- |
| **Local/Stdio** | Работает как подпроцесс, общается через stdin/stdout | Локальные инструменты, доступ к файлам, пользовательские скрипты |
| **HTTP/SSE**    | Удалённый сервер с доступом через HTTP               | Общие сервисы, облачные инструменты                              |

## Configuration

### Node.js / TypeScript

```typescript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-5",
    mcpServers: {
        // Local MCP server (stdio)
        "my-local-server": {
            type: "local",
            command: "node",
            args: ["./mcp-server.js"],
            env: { DEBUG: "true" },
            cwd: "./servers",
            tools: ["*"],  // "*" = all tools, [] = none, or list specific tools
            timeout: 30000,
        },
        // Remote MCP server (HTTP)
        "github": {
            type: "http",
            url: "https://api.githubcopilot.com/mcp/",
            headers: { "Authorization": "Bearer ${TOKEN}" },
            tools: ["*"],
        },
    },
});
```

### Python

```python
import asyncio
from copilot import CopilotClient
from copilot.session import PermissionHandler

async def main():
    client = CopilotClient()
    await client.start()

    session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model="gpt-5", mcp_servers={
        # Local MCP server (stdio)
        "my-local-server": {
            "type": "local",
            "command": "python",
            "args": ["./mcp_server.py"],
            "env": {"DEBUG": "true"},
            "cwd": "./servers",
            "tools": ["*"],
            "timeout": 30000,
        },
        # Remote MCP server (HTTP)
        "github": {
            "type": "http",
            "url": "https://api.githubcopilot.com/mcp/",
            "headers": {"Authorization": "Bearer ${TOKEN}"},
            "tools": ["*"],
        },
    })

    response = await session.send_and_wait("List my recent GitHub notifications")
    print(response.data.content)

    await client.stop()

asyncio.run(main())
```

### Go

```golang
package main

import (
    "context"
    "log"
    copilot "github.com/github/copilot-sdk/go"
)

func main() {
    ctx := context.Background()
    client := copilot.NewClient(nil)
    if err := client.Start(ctx); err != nil {
        log.Fatal(err)
    }
    defer client.Stop()

    session, err := client.CreateSession(ctx, &copilot.SessionConfig{
        Model: "gpt-5",
        MCPServers: map[string]copilot.MCPServerConfig{
            "my-local-server": copilot.MCPStdioServerConfig{
                Command: "node",
                Args:    []string{"./mcp-server.js"},
                Tools:   []string{"*"},
            },
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    defer session.Disconnect()

    // Use the session...
}
```

### .NET

```csharp
using GitHub.Copilot;

await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig
{
    Model = "gpt-5",
    McpServers = new Dictionary<string, McpServerConfig>
    {
        ["my-local-server"] = new McpStdioServerConfig
        {
            Command = "node",
            Args = new List<string> { "./mcp-server.js" },
            Tools = new List<string> { "*" },
        },
    },
});
```

## Отключение настроенных серверов на сеанс

Задайте `disabledMcpServers` точные имена серверов MCP, которые не должны выполняться в сеансе.
Параметр ограничен отдельным запросом на создание или возобновление работы; Он не изменяет глобальные параметры MCP или конфигурацию сервера.

```typescript
const session = await client.createSession({
    mcpServers: {
        filesystem: { type: "local", command: "npx", args: ["-y", "@modelcontextprotocol/server-filesystem", "."] },
        github: { type: "http", url: "https://api.githubcopilot.com/mcp/" },
    },
    disabledMcpServers: ["github"],
});
```

| SDK     | Свойство конфигурации            |
| ------- | -------------------------------- |
| Node.js | `disabledMcpServers`             |
| Python  | `disabled_mcp_servers`           |
| Go      | `DisabledMCPServers`             |
| .NET    | `DisabledMcpServers`             |
| Java    | `setDisabledMcpServers(...)`     |
| Rust    | `with_disabled_mcp_servers(...)` |

При создании сеанса и **холодном** возобновлении отключенные серверы не запускаются, и среда выполнения не инициирует их проверку подлинности. Резидентное резюме не может отменить сервер, который среда выполнения уже породила. Имена совпадают точно.

## Настройка средства

Вы можете управлять, какие инструменты доступны MCP-серверу, используя поле `tools` .

### Разрешить все инструменты

Используйте `"*"` для включения всех инструментов, предоставляемых сервером MCP:

```typescript
tools: ["*"]
```

### Разрешите определённые инструменты

Предоставьте список имён инструментов для ограничения доступа:

```typescript
tools: ["bash", "edit"]
```

Агенту будут доступны только указанные инструменты.

### Отключите все инструменты

Используйте пустой массив для отключения всех инструментов:

```typescript
tools: []
```

### Notes

* Это `tools` поле определяет, какие инструменты разрешены.
* Отдельного `allow` или `disallow` конфигурационного устройства нет — доступ к инструменту контролируется напрямую через этот список.

## Быстрый старт: сервер файловой системы MCP

Вот полный рабочий пример с использованием официального [`@modelcontextprotocol/server-filesystem`](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem) сервера MCP:

```typescript
import { CopilotClient } from "@github/copilot-sdk";

async function main() {
    const client = new CopilotClient();

    // Create session with filesystem MCP server
    const session = await client.createSession({
        mcpServers: {
            filesystem: {
                type: "local",
                command: "npx",
                args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
                tools: ["*"],
            },
        },
    });

    console.log("Session created:", session.sessionId);

    // The model can now use filesystem tools
    const result = await session.sendAndWait({
        prompt: "List the files in the allowed directory",
    });

    console.log("Response:", result?.data?.content);

    await session.disconnect();
    await client.stop();
}

main();
```

**Output:**

```text
Session created: 18b3482b-bcba-40ba-9f02-ad2ac949a59a
Response: The allowed directory is `/tmp`, which contains various files
and subdirectories including temporary system files, log files, and
directories for different applications.
```

> \[!TIP]
> Вы можете использовать любой MCP-сервер из [каталога MCP Servers](https://github.com/modelcontextprotocol/servers). Популярные варианты включают `@modelcontextprotocol/server-github`, `@modelcontextprotocol/server-sqlite`и `@modelcontextprotocol/server-puppeteer`.

## Параметры конфигурации

### Локальный/stdio сервер

| Property                | Type       | Обязательный                         | Описание                                                      |
| ----------------------- | ---------- | ------------------------------------ | ------------------------------------------------------------- |
| `type`                  |            |                                      |                                                               |
| `"local"` или `"stdio"` | Нет        | Тип сервера (по умолчанию локальный) |                                                               |
| `command`               | `string`   | Да                                   | Команда для выполнения                                        |
| `args`                  | `string[]` | Да                                   | Аргументы команд                                              |
| `env`                   | `object`   | Нет                                  | Переменные среды                                              |
| `cwd`                   | `string`   | Нет                                  | Рабочий каталог                                               |
| `tools`                 | `string[]` | Нет                                  | Инструменты для включения (`["*"]` для всех, `[]` для никого) |
| `timeout`               | `number`   | Нет                                  | Тайм-аут в миллисекундах                                      |

### Удалённый сервер (HTTP/SSE)

| Property             | Type       | Обязательный | Описание                                      |
| -------------------- | ---------- | ------------ | --------------------------------------------- |
| `type`               |            |              |                                               |
| `"http"` или `"sse"` | Да         | Тип сервера  |                                               |
| `url`                | `string`   | Да           | URL-адрес сервера                             |
| `headers`            | `object`   | Нет          | HTTP-заголовки (например, для аутентификации) |
| `tools`              | `string[]` | Нет          | Инструменты для включения                     |
| `timeout`            | `number`   | Нет          | Тайм-аут в миллисекундах                      |

## Troubleshooting

### Инструменты не отображаются или не вызываются

1. **Проверьте, что сервер MCP запускается правильно**
   * Проверьте, правильны ли команды и args
   * Убедитесь, что серверный процесс не вылетает при запуске
   * Ищите ошибку в stderr

2. **Конфигурация инструментов проверки**
   * Убедитесь, `tools` что он настроен или `["*"]` перечисляет конкретные инструменты, которые вам нужны
   * Пустой массив `[]` означает, что инструменты не включены

3. **Проверьте подключение для удалённых серверов**
   * Убедитесь, что URL доступен
   * Проверьте, правильны ли заголовки аутентификации

### Распространенные проблемы

| Issue                                  | Solution                                                              |
| -------------------------------------- | --------------------------------------------------------------------- |
| "MCP-сервер не найден"                 | Убедитесь, что путь команды правильный и выполнимый                   |
| "Соединение отказано" (HTTP)           | Проверьте URL и убедитесь, что сервер работает                        |
| Ошибки «Тайм-аут»                      | Увеличьте `timeout` значение или проверьте производительность сервера |
| Инструменты работают, но не называются | Убедитесь, что ваш запрос явно требует функциональности инструмента   |

Подробные рекомендации по отладке смотрите **[Руководство по отладке серверов MCP](/ru/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging)**.

## Связанные ресурсы

* [Спецификация протокола контекста модели](https://modelcontextprotocol.io/)
* [Каталог серверов MCP](https://github.com/modelcontextprotocol/servers) — серверы сообщества MCP
* [GitHub MCP сервер](https://github.com/github/github-mcp-server) — официальный сервер GitHub MCP
* [Создайте своё первое приложение на базе Copilot](/ru/copilot/how-tos/copilot-sdk/getting-started) — основы SDK и пользовательские инструменты
* [Руководство по отладке](/ru/copilot/how-tos/copilot-sdk/troubleshooting/debugging) — отладка по всему SDK

## См. также

* [Руководство по отладке серверов MCP](/ru/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging) — подробное устранение неполадок MCP
* [Выпуск #9](https://github.com/github/copilot-sdk/issues/9) - Вопрос об использовании оригинальных инструментов MCP
* [Проблема #36](https://github.com/github/copilot-sdk/issues/36) — Проблема с отслеживанием документации MCP