# Utilisation de serveurs MCP avec le SDK GitHub Copilot

Le sdk Copilot peut s'intégrer à des serveurs MCP (protocole de contexte de modèle) pour étendre les fonctionnalités de l'assistant à des outils externes. Les serveurs MCP s’exécutent en tant que processus distincts et exposent des outils (fonctions) que Copilot peuvent appeler pendant les conversations.

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

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

> \[!NOTE]
> Il s’agit d’une fonctionnalité en constante évolution. Consultez [le problème n° 36](https://github.com/github/copilot-sdk/issues/36) pour une discussion en cours.

## Qu’est-ce que MCP ?

[Le protocole MCP (Model Context Protocol)](https://modelcontextprotocol.io/) est un standard ouvert pour connecter des assistants IA à des outils et sources de données externes. Les serveurs MCP peuvent :

* Exécuter du code ou des scripts
* Interroger des bases de données
* Accéder aux systèmes de fichiers
* Appeler des API externes
* Et bien plus encore

## Types de serveurs

Le Kit de développement logiciel (SDK) prend en charge deux types de serveurs MCP :

| Type            | Description                                                       | Cas d’usage                                              |
| --------------- | ----------------------------------------------------------------- | -------------------------------------------------------- |
| **Local/Stdio** | S’exécute en tant que sous-processus, communique via stdin/stdout | Outils locaux, accès aux fichiers, scripts personnalisés |
| **HTTP/SSE**    | Serveur distant accessible via HTTP                               | Services partagés, outils hébergés dans le cloud         |

## 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> { "*" },
        },
    },
});
```

## Désactivation des serveurs configurés par session

Définissez `disabledMcpServers` sur les noms exacts des serveurs MCP qui ne doivent pas être exécutés dans une session.
Le paramètre est limité à la demande de création ou de reprise individuelle ; elle ne modifie pas les paramètres MCP globaux ou la configuration du serveur.

```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     | Propriété de configuration       |
| ------- | -------------------------------- |
| Node.js | `disabledMcpServers`             |
| Python  | `disabled_mcp_servers`           |
| Go      | `DisabledMCPServers`             |
| .NET    | `DisabledMcpServers`             |
| Java    | `setDisabledMcpServers(...)`     |
| Rust    | `with_disabled_mcp_servers(...)` |

Lors de la création de session et d’une reprise **à froid** , les serveurs désactivés ne sont pas démarrés et le runtime ne lance pas leur authentification. Un cv résident ne peut pas annuler un serveur que le runtime a déjà généré. Les noms sont mis en correspondance exactement.

## Configuration de l’outil

Vous pouvez contrôler les outils disponibles pour un serveur MCP à l’aide du `tools` champ.

### Autoriser tous les outils

Permet `"*"` d’activer tous les outils fournis par le serveur MCP :

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

### Autoriser des outils spécifiques

Fournissez la liste des noms d’outils pour restreindre l’accès :

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

Seuls les outils répertoriés seront disponibles pour l’agent.

### Désactiver tous les outils

Utilisez un tableau vide pour désactiver tous les outils :

```typescript
tools: []
```

### Notes

* Le `tools` champ définit les outils autorisés.
* Il n’existe pas de configuration distincte `allow` ou `disallow` : l’accès aux outils est contrôlé directement par cette liste.

## Démarrage rapide : serveur MCP du système de fichiers

Voici un exemple de travail complet utilisant le serveur MCP officiel [`@modelcontextprotocol/server-filesystem`](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem) :

```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]
> Vous pouvez utiliser n’importe quel serveur MCP à partir du [répertoire des serveurs MCP](https://github.com/modelcontextprotocol/servers). Les options populaires incluent `@modelcontextprotocol/server-github`, `@modelcontextprotocol/server-sqlite`et `@modelcontextprotocol/server-puppeteer`.

## Options de configuration

### Serveur local/stdio

| Propriété              | Type       | Obligatoire                           | Description                                           |
| ---------------------- | ---------- | ------------------------------------- | ----------------------------------------------------- |
| `type`                 |            |                                       |                                                       |
| `"local"` ou `"stdio"` | Non        | Type de serveur (par défaut en local) |                                                       |
| `command`              | `string`   | Yes                                   | Commande à exécuter                                   |
| `args`                 | `string[]` | Yes                                   | Les arguments de la commande                          |
| `env`                  | `object`   | Non                                   | Variables d’environnement                             |
| `cwd`                  | `string`   | Non                                   | Répertoire de travail                                 |
| `tools`                | `string[]` | Non                                   | Outils à activer (`["*"]` pour tous, `[]` pour aucun) |
| `timeout`              | `number`   | Non                                   | Délai d’expiration en millisecondes                   |

### Serveur distant (HTTP/SSE)

| Propriété           | Type       | Obligatoire     | Description                                          |
| ------------------- | ---------- | --------------- | ---------------------------------------------------- |
| `type`              |            |                 |                                                      |
| `"http"` ou `"sse"` | Yes        | Type de serveur |                                                      |
| `url`               | `string`   | Yes             | URL du serveur                                       |
| `headers`           | `object`   | Non             | En-têtes HTTP (par exemple, pour l’authentification) |
| `tools`             | `string[]` | Non             | Outils à activer                                     |
| `timeout`           | `number`   | Non             | Délai d’expiration en millisecondes                  |

## Troubleshooting

### Les outils ne s’affichent pas ou ne sont pas appelés

1. **Vérifier que le serveur MCP démarre correctement**
   * Vérifiez que la commande et les arguments sont corrects
   * Vérifier que le processus du serveur ne se bloque pas au démarrage
   * Recherchez la sortie d’erreur dans stderr

2. **Vérifier la configuration de l’outil**
   * Assurez-vous que `tools` est défini sur `["*"]` ou répertorie les outils spécifiques dont vous avez besoin
   * Un tableau `[]` vide signifie qu’aucun outil n’est activé

3. **Vérifier la connectivité pour les serveurs distants**
   * Vérifier que l’URL est accessible
   * Vérifier que les en-têtes d’authentification sont corrects

### Problèmes courants

| Issue                                             | Solution                                                                        |
| ------------------------------------------------- | ------------------------------------------------------------------------------- |
| « Serveur MCP introuvable »                       | Vérifier que le chemin de commande est correct et exécutable                    |
| « Connexion refusée » (HTTP)                      | Vérifiez l’URL et vérifiez que le serveur est en cours d’exécution              |
| Erreurs « Délai d’expiration »                    | Augmenter la valeur ou vérifier les performances du `timeout` serveur           |
| Les outils fonctionnent, mais ne sont pas appelés | Assurez-vous que votre invite nécessite clairement la fonctionnalité de l’outil |

Pour obtenir des instructions détaillées sur le débogage, consultez **[autoTITLE](/fr/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging)**.

## Ressources associées

* [Spécification du protocole de contexte de modèle](https://modelcontextprotocol.io/)
* [Répertoire des serveurs MCP](https://github.com/modelcontextprotocol/servers) - Serveurs MCP de la communauté
* [GitHub MCP Server](https://github.com/github/github-mcp-server) - Serveur MCP officiel de GitHub
* [Créez votre première application avec Copilot](/fr/copilot/how-tos/copilot-sdk/getting-started) - Concepts de base et outils personnalisés du Kit de développement logiciel (SDK)
* [Guide de débogage](/fr/copilot/how-tos/copilot-sdk/troubleshooting/debugging) - Débogage à l’échelle du Kit de développement logiciel (SDK)

## Voir aussi

* [Guide de débogage du serveur MCP](/fr/copilot/how-tos/copilot-sdk/troubleshooting/mcp-debugging) - Résolution détaillée des problèmes MCP
* [Problème n° 9 - Question](https://github.com/github/copilot-sdk/issues/9) d’utilisation des outils MCP d’origine
* [Problème n° 36 - Problème](https://github.com/github/copilot-sdk/issues/36) de suivi de la documentation MCP