Aller au contenu principal
Retour au blog

MCP 2025-03-26 : OpenAI adopte le standard des agents IA

Flavien Métivier8 avril 20255 min

En novembre 2024, Anthropic publie MCP (Model Context Protocol) : un protocole ouvert pour connecter des agents IA à des outils et des sources de données. Quatre mois et deux annonces plus tard, ce protocole prometteur est devenu le standard de fait de l'interopérabilité des agents — la spec 2025-03-26 sur modelcontextprotocol.io d'un côté, l'adoption par OpenAI dans son Agents SDK de l'autre. Si tu exposes des APIs PHP à des agents, voici ce que ça change dès maintenant.

La spec 2025-03-26 : Streamable HTTP et OAuth 2.1

La spécification 2025-03-26 (disponible sur modelcontextprotocol.io/specification/2025-03-26) apporte deux ruptures majeures par rapport à la version initiale. Première rupture, le transport : Streamable HTTP remplace le tandem HTTP+SSE. L'ancienne spec imposait deux endpoints distincts — un POST pour les requêtes, un GET SSE pour les événements serveur. Le nouveau transport unifie tout sur un seul endpoint : le serveur retourne du JSON simple ou un flux SSE selon le Content-Type de la réponse. Un point d'entrée unique, deux modes de réponse, zéro complexité de routage SSE côté infrastructure.

Deuxième rupture, la sécurité : OAuth 2.1 avec PKCE devient la norme pour les serveurs distants. C'est la première fois que la spec adresse l'authentification sérieusement, ce qui rend les serveurs MCP utilisables dans des contextes multi-tenant ou exposés sur internet sans bricolage maison.

  • Transport unifié : un endpoint unique, JSON ou SSE selon le besoin du client
  • OAuth 2.1 + PKCE obligatoire pour les serveurs distants (cloud, SaaS, API tiers)
  • Négociation de capacités client/serveur plus explicite au moment du handshake
  • Support natif des notifications de progression pour le streaming partiel

OpenAI adopte MCP : la convergence du marché

En mars 2025, l'équipe @OpenAIDevs annonce l'intégration native de MCP dans l'Agents SDK. Sam Altman le confirme dans un tweet officiel (status/1904957755829481737). Ce n'est pas un détail de roadmap : Anthropic avait posé le protocole, mais c'est l'adoption par OpenAI qui lui confère le statut de standard industrie. Un serveur MCP exposé aujourd'hui peut être consommé indifféremment par Claude 3.7 Sonnet, par un agent GPT-4o via l'Agents SDK, ou par n'importe quel client compatible — sans adaptation, sans glue code. L'interopérabilité n'est plus théorique. Pour les développeurs, cela signifie une chose concrète : on arrête d'écrire des connecteurs ad hoc pour chaque LLM et on expose une surface MCP unique, versionnée, documentée.

Exposer ton API PHP en serveur MCP avec la spec 2025-03-26

Votre équipe utilise Claude Code ?

Découvrir le workshop

Un serveur MCP compatible avec la spec 2025-03-26 en Symfony 7.2 se réduit à un controller JSON-RPC sur un endpoint unique. Voici un exemple minimal et production-ready qui expose un outil get_invoice à n'importe quel agent compatible.

<?php
// src/Controller/McpController.php — Symfony 7.2 / PHP 8.4

namespace App\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;

#[Route('/mcp', name: 'mcp_endpoint', methods: ['POST'])]
class McpController
{
    public function __invoke(Request $request): JsonResponse
    {
        $body  = json_decode($request->getContent(), true, flags: JSON_THROW_ON_ERROR);
        $method = $body['method'] ?? '';
        $id     = $body['id']     ?? null;

        return match ($method) {
            'initialize'  => $this->initialize($id),
            'tools/list'  => $this->toolsList($id),
            'tools/call'  => $this->toolCall($body['params'] ?? [], $id),
            default       => new JsonResponse([
                'jsonrpc' => '2.0', 'id' => $id,
                'error'   => ['code' => -32601, 'message' => 'Method not found'],
            ], 404),
        };
    }

    private function initialize(mixed $id): JsonResponse
    {
        return new JsonResponse([
            'jsonrpc' => '2.0', 'id' => $id,
            'result'  => [
                'protocolVersion' => '2025-03-26',
                'capabilities'    => ['tools' => []],
                'serverInfo'      => ['name' => 'acme-mcp', 'version' => '1.0.0'],
            ],
        ]);
    }

    private function toolsList(mixed $id): JsonResponse
    {
        return new JsonResponse([
            'jsonrpc' => '2.0', 'id' => $id,
            'result'  => [
                'tools' => [[
                    'name'        => 'get_invoice',
                    'description' => 'Récupère une facture par son identifiant',
                    'inputSchema' => [
                        'type'       => 'object',
                        'properties' => [
                            'invoice_id' => ['type' => 'string', 'description' => 'ID de la facture'],
                        ],
                        'required' => ['invoice_id'],
                    ],
                ]],
            ],
        ]);
    }

    private function toolCall(array $params, mixed $id): JsonResponse
    {
        $tool = $params['name']      ?? '';
        $args = $params['arguments'] ?? [];

        $result = match ($tool) {
            'get_invoice' => [
                'id'     => $args['invoice_id'],
                'amount' => 1200,
                'status' => 'paid',
            ],
            default => throw new \InvalidArgumentException("Unknown tool: $tool"),
        };

        return new JsonResponse([
            'jsonrpc' => '2.0', 'id' => $id,
            'result'  => [
                'content' => [['type' => 'text', 'text' => json_encode($result)]],
            ],
        ]);
    }
}

Ce controller répond aux trois messages du handshake MCP : initialize (version du protocole et capacités), tools/list (catalogue d'outils) et tools/call (exécution). Pour un serveur distant exposé sur internet, la couche OAuth 2.1 s'ajoute en amont — un middleware Symfony qui valide le Bearer token issu du flow PKCE. La structure du controller reste identique : OAuth est orthogonal au routage MCP.

Ce qu'il faut retenir

  • MCP 2025-03-26 est la spec à implémenter aujourd'hui : Streamable HTTP simplifie le déploiement, OAuth 2.1 sécurise les serveurs distants
  • L'adoption par OpenAI transforme MCP en protocole cross-vendor : un seul serveur, tous les agents
  • Pour un dev PHP/Symfony, exposer un serveur MCP est straightforward — un controller JSON-RPC, pas une refonte d'architecture
  • Les APIs métier existantes (facturation, CRM, stock) sont les meilleures candidates : l'agent sait déjà ce qu'il cherche, il lui manque juste la surface MCP

MCP est en train de faire pour les agents ce que REST a fait pour les APIs web : poser un contrat commun que tout le monde peut implémenter. Les équipes PHP qui sécurisent ce socle aujourd'hui prendront de l'avance sur l'intégration agent dans leurs produits. Si tu veux auditer tes APIs existantes pour identifier celles qui ont le plus de valeur à exposer en MCP — ou structurer une première intégration agent dans ton stack Symfony — c'est exactement le type de chantier qu'on traite dans un Bear Scan ou un atelier Workshop Claude Code. Dis-moi ce que tu builds.

Cet article vous a plu ? Partagez-le !

Votre équipe utilise Claude Code ?

Workshop intensif : votre équipe opérationnelle en 1 jour.