Publié le
AI Agents

Construire des Agents IA avec DeepSeek et le Model Context Protocol (MCP) : Un Guide Pratique Utilisant le SDK Agentic d'OpenAI

Post image

Dans cet article, nous explorons comment intégrer DeepSeek AI avec le OpenAI Agentic SDK en utilisant le Model Context Protocol (MCP), présentant une alternative puissante et économique aux configurations traditionnelles de LLM. En combinant DeepSeek avec des standards émergents pour agents et des serveurs MCP publics, vous pouvez déployer des agents autonomes à moindre coût et avec une plus grande flexibilité.

Nous aborderons :

  • Ce qu'est le Model Context Protocol (MCP) et pourquoi il est important pour l'interopérabilité des agents
  • Comment connecter le SDK agentic d'OpenAI à DeepSeek au lieu des modèles OpenAI
  • Comment configurer l'installation pour se connecter à des serveurs MCP en direct
  • Un script Python complet que vous pouvez exécuter depuis la ligne de commande pour illustrer cette intégration

Ce guide met en lumière le potentiel émergent des agents IA, du Model Context Protocol (MCP) comme couche fondamentale, et de DeepSeek comme option de LLM économique mais performante pour les workflows agentiques.

Qu'est-ce que le Model Context Protocol (MCP) ?

Le Model Context Protocol (MCP) est un protocole ouvert pour la communication entre agents, permettant aux agents autonomes et aux outils d'échanger des messages structurés en temps réel. Il découple les agents des APIs spécifiques aux modèles, créant un écosystème interopérable où agents, outils et orchestrateurs peuvent parler un langage commun. Vous pouvez en apprendre plus sur le MCP dans cet article de mon blog.

Le Model Context Protocol (MCP) prend en charge les messages en streaming, les interactions multi-tours et l'utilisation standardisée d'outils. Avec son adoption croissante, le MCP devient une couche fondamentale pour l'infrastructure native des agents, un peu comme HTTP l'est pour le web.

Pour approfondir votre compréhension du protocole, visitez le site de documentation du MCP.

Pourquoi Utiliser DeepSeek avec le SDK Agentic ?

Le OpenAI Agentic SDK offre un cadre puissant pour construire des agents utilisant des outils. Bien qu'optimisé pour les modèles OpenAI, le SDK est suffisamment flexible pour intégrer d'autres fournisseurs de LLM, comme DeepSeek, via des clients personnalisés.

Pourquoi est-ce important :

  • Coût : Les tarifs de DeepSeek sont nettement inférieurs à ceux de GPT-4, permettant une expérimentation plus large.
  • Performance : Les modèles de DeepSeek sont compétitifs en matière de code, de raisonnement et de dialogues multi-tours.
  • Flexibilité : Changer de fournisseur vous permet d'optimiser selon votre budget et votre cas d'utilisation.

Dans cette configuration, nous remplacerons le client OpenAI par défaut et dirigerons les requêtes vers DeepSeek via son API compatible OpenAI. Deepseek-chat, le modèle LLM de DeepSeek AI, est conçu pour les applications d'IA conversationnelle, offrant des performances solides dans les dialogues multi-tours et la génération de code, ce qui le rend adapté aux workflows agentiques.

Configuration de l'Intégration

Les serveurs Model Context Protocol (MCP) utilisés dans cette configuration sont :

  • Filesystem MCP Server : Un serveur Node.js implémentant le Model Context Protocol (MCP) pour les opérations sur le système de fichiers.
  • Git MCP Server : Un serveur Model Context Protocol pour l'interaction et l'automatisation des dépôts Git. Ce serveur fournit des outils pour lire, rechercher et manipuler des dépôts Git via des modèles de langage avancés.

Pour suivre ce guide, vous aurez besoin :

  1. D'une clé API DeepSeek — obtenez-la ici
  2. De Python 3.8+
  3. Du SDK openai-agents :
python -m venv env
source env/bin/activate
pip install openai-agents
  1. Du script ci-dessous, enregistré sous agent_mcp_deepseek.py

Vous aurez également besoin :

  • De uvx installé
  • De Node.js et npx installés

Script Python : Agent avec Model Context Protocol (MCP) + DeepSeek

Pour exécuter le script, utilisez la commande suivante :

python agent_mcp_deepseek.py --repo_path /chemin/vers/votre/depot

Le script suivant se connecte à la fois aux serveurs Git et Filesystem MCP en utilisant MCPServerStdio, puis lance une session interactive d'agent alimentée par DeepSeek. L'utilisateur peut poser des questions sur le système de fichiers ou un dépôt Git, et l'agent utilise le contexte de ces serveurs pour répondre.

Fonctionnalités clés :

  • Intégration de deux serveurs Model Context Protocol (MCP) : Contexte Git via uvx, contexte système de fichiers via npx
  • URL de base et nom de modèle personnalisables pour DeepSeek via des variables d'environnement
  • Boucle CLI interactive : Posez des questions comme "Quels fichiers ont changé dans le dernier commit ?" ou "Listez le plus gros fichier du dossier"
Post image

Exemple de sortie d'exécution du script dans le terminal

Ci-dessous se trouve le code complet du script implémentant l'intégration décrite ci-dessus.

#!/usr/bin/env python3

"""
This script runs a Model Context Protocol (MCP) client that interacts with MCP servers
to answer questions about a specified git repository and its filesystem.

It utilizes an AI model (via OpenAI API or compatible services like DeepSeek)
to generate responses based on the context provided by the MCP servers.

Usage:
    python agent_mcp_deepseek.py --repo_path <path_to_your_git_repo>

Prerequisites:
- Python 3.7+
- Required Python packages (install via pip, e.g., openai, agents)
- `uvx` tool installed (`pip install uvx`)
- `npx` tool installed (comes with Node.js/npm)
- Environment variable `DEEPSEEK_API_KEY` set with your API key.
"""

import os
import asyncio
import shutil
import argparse
import logging
from typing import List

from openai import AsyncOpenAI

from agents import Agent, Runner, set_tracing_disabled, OpenAIChatCompletionsModel
from agents.mcp import MCPServer, MCPServerStdio

# --- Configuration ---

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

# AI Model Configuration (DeepSeek API or compatible)
BASE_URL = os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1")
API_KEY = os.getenv("DEEPSEEK_API_KEY")
MODEL_NAME = os.getenv("DEEPSEEK_MODEL_NAME", "deepseek-chat")

# ANSI escape codes for colored console output
DARK_BLUE = "\033[34m"
RESET = "\033[0m"

# --- Pre-run Checks ---

# Validate essential configuration
if not API_KEY:
    raise ValueError(
        "API key is missing. Please set the DEEPSEEK_API_KEY environment variable."
    )
if not BASE_URL:
    logging.warning("DEEPSEEK_BASE_URL not set, using default: %s", BASE_URL)
if not MODEL_NAME:
    logging.warning("DEEPSEEK_MODEL_NAME not set, using default: %s", MODEL_NAME)

# Check for required external tools
if not shutil.which("uvx"):
    raise RuntimeError("uvx command not found. Please install it, e.g., `pip install uvx`.")
if not shutil.which("npx"):
    raise RuntimeError("npx command not found. Please ensure Node.js and npm/npx are installed and in your system's PATH.")

# --- Core Logic ---

async def run_agent_query(
    mcp_servers: List[MCPServer],
    directory_path: str,
    user_query: str
) -> None:
    """Runs the AI agent to answer a specific query about the repository/filesystem.

    Args:
        mcp_servers: A list of active MCP server instances.
        directory_path: The path to the target git repository and filesystem root.
        user_query: The question asked by the user.
    """
    logging.info(f"Processing query for directory: {directory_path}")

    # Initialize the AI client
    client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY)

    # Disable agent tracing for cleaner output in this interactive tool
    set_tracing_disabled(disabled=True)

    # Create the AI agent instance
    agent = Agent(
        name="Assistant",
        instructions=(
            f"You answer questions about the git repository and filesystem located at "
            f"'{directory_path}'. Use this path for context when interacting with tools."
        ),
        mcp_servers=mcp_servers,
        model=OpenAIChatCompletionsModel(model=MODEL_NAME, openai_client=client),
    )

    # Run the agent with the user's query
    print("\n" + "-" * 40)
    print(f"{DARK_BLUE}Question: {user_query}{RESET}")
    print("Assistant thinking...")
    try:
        result = await Runner.run(starting_agent=agent, input=user_query)
        print(f"{DARK_BLUE}Answer:\n{result.final_output}{RESET}")
    except Exception as e:
        logging.error(f"Error during agent execution: {e}", exc_info=True)
        print(f"Sorry, an error occurred while processing your request: {e}")
    finally:
        print("-" * 40 + "\n")


async def main() -> None:
    """Sets up MCP servers and handles the interactive user query loop.

    Parses command-line arguments for the repository path, starts the Git and
    Filesystem MCP servers, and then enters a loop to accept user questions,
    running the agent for each query until the user quits.
    """
    parser = argparse.ArgumentParser(
        description="Run an AI assistant powered by Model Context Protocol (MCP) servers to query a git repository."
    )
    parser.add_argument(
        "--repo_path",
        type=str,
        required=True,
        help="Path to the target git repository."
    )
    args = parser.parse_args()

    directory_path = os.path.abspath(args.repo_path) # Use absolute path
    logging.info(f"Target repository path: {directory_path}")

    if not os.path.isdir(directory_path):
        raise FileNotFoundError(f"The specified repository path does not exist or is not a directory: {directory_path}")

    # Start MCP servers concurrently
    try:
        async with MCPServerStdio(
            name="Git Server (via uvx)",
            cache_tools_list=True, # Example: Cache tool list for performance
            params={"command": "uvx", "args": ["mcp-server-git"]},
            # Note: mcp-server-git typically doesn't need a path argument,
            # it operates on the repo where it's invoked or uses tool parameters.
        ) as git_server, MCPServerStdio(
            name="Filesystem Server (via npx)",
            params={
                "command": "npx",
                "args": ["-y", "@modelcontextprotocol/server-filesystem", directory_path],
            },
        ) as fs_server:
            logging.info("Model Context Protocol (MCP) servers (Git, Filesystem) started successfully.")
            servers = [git_server, fs_server]

            # Interactive query loop
            while True:
                try:
                    message = input("Enter your question (or type '/quit' to exit): ")
                except EOFError:
                    print("\nExiting.") # Handle Ctrl+D
                    break

                if message.strip().lower() == "/quit":
                    logging.info("'/quit' command received. Exiting.")
                    break
                if not message.strip():
                    continue # Ignore empty input

                logging.info(f"User question: {message}")
                await run_agent_query(servers, directory_path, message)

    except Exception as e:
        logging.critical(f"Failed to start or run Model Context Protocol (MCP) servers: {e}", exc_info=True)
        print(f"Critical error: {e}. Exiting.")
    finally:
        logging.info("Model Context Protocol (MCP) toolkit finished.")


if __name__ == "__main__":
    logging.info("Starting Model Context Protocol (MCP) toolkit...")
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nInterrupted by user. Exiting.")
        logging.info("Process interrupted by user (KeyboardInterrupt).")
    except (ValueError, RuntimeError, FileNotFoundError) as e:
        logging.error(f"Initialization failed: {e}")
        print(f"Error: {e}")
        # Exit with error code if setup fails
        exit(1)

Points Clés à Retenir

  • Le Model Context Protocol (MCP) découple les agents des modèles et permet une communication flexible et en temps réel entre outils à travers des systèmes hétérogènes.
  • Le SDK Agentic n'est pas limité à OpenAI — avec quelques modifications, vous pouvez l'exécuter sur DeepSeek ou tout modèle compatible OpenAI.
  • Cette configuration réduit les coûts tout en maintenant les capacités des agents.
  • Avec des outils comme uvx et npx, vous pouvez composer une boîte à outils complète pour agents en utilisant des outils MCP publics et une pile de protocoles ouverts.

Ce script illustre le potentiel précoce de combiner une communication standardisée (Model Context Protocol (MCP)) avec une intelligence abordable (DeepSeek) pour construire des agents IA pratiques et puissants.

  • À mesure que l'écosystème Model Context Protocol (MCP) évolue, un ensemble croissant de serveurs conformes au protocole est attendu — permettant aux agents d'accéder à des bases de données, APIs, ressources cloud et systèmes d'entreprise.
  • Cette infrastructure ouverte et composable déverrouille des workflows indépendants des modèles et des capacités d'automatisation plus profondes.
  • Tout comme HTTP sous-tend le web moderne, le Model Context Protocol (MCP) pourrait servir de substrat central pour l'internet natif des agents en émergence.

Vous avez apprécié cet article ? Vous l'avez trouvé utile ? N'hésitez pas à laisser un commentaire ci-dessous pour partager vos réflexions ou poser des questions. Un compte GitHub est requis pour participer à la discussion.

Continuer la lecture

Articles similaires