Gemini 4 Carbon is now live on CometAPI →

Blog

Blog CometAPI

Une API. Tous les modèles d'IA leaders.

Mises à jour de modèles, guides API, benchmarks et informations pratiques pour développer plus rapidement avec CometAPI.

MCP vs appels de fonctions : comment connecter des outils aux agents d’IA
Guide

MCP vs appels de fonctions : comment connecter des outils aux agents d’IA

Comparaison entre MCP et l’appel de fonctions - Appel de fonctions (function calling): - Intégration étroite: les fonctions vivent dans le même runtime que le modèle et sont appelées via des “tool calls” propriétaires. - Découverte limitée: pas de protocole standard pour lister, négocier ou versionner des outils; dépend des conventions de l’implémentation. - Couplage fort: sécurité, permissions, et contexte sont gérés au cas par cas; difficile à partager entre modèles/clients. - Transport implicite: pas de canal standard pour la communication; souvent spécifique à un fournisseur. - MCP (Model Context Protocol): - Standardisation: protocole normalisé pour exposer des outils, ressources et prompts avec schémas, capacités et négociation. - Découplage: serveur d’outils séparé, réutilisable par plusieurs clients et modèles; meilleure observabilité et gouvernance. - Découverte et schémas: outils listés, descriptions et schémas d’entrées/sorties publiés; validation systématique. - Transports variés: prise en charge de stdio, sockets, etc., avec sessions, permissions et flux structurés. Code Python: boucle d’outil complète CometAPI, exécution directe et via MCP comet_api.py ```python # comet_api.py # API Comet simulée pour la recherche de commandes. # Dans un cas réel, remplacez la logique par des appels HTTP (requests) vers votre service Comet. from __future__ import annotations import datetime import random from typing import Dict, Any, List class CometAPI: def __init__(self, api_key: str, base_url: str = "https://api.comet.example"): # Stocke les paramètres d’accès (dans la vraie vie, vérifiez la clé, gérez la rotation, etc.) self.api_key = api_key self.base_url = base_url def get_order(self, order_id: str) -> Dict[str, Any]: # Simule une recherche de commande. Remplacez par un appel réseau réel. rng = random.Random(hash(order_id) & 0xFFFFFFFF) status = rng.choice(["processing", "fulfilled", "cancelled"]) items: List[Dict[str, Any]] = [ {"sku": "SKU-001", "name": "Widget A", "qty": 2, "unit_price": 19.99}, {"sku": "SKU-045", "name": "Gadget B", "qty": 1, "unit_price": 49.9}, ] total = sum(i["qty"] * i["unit_price"] for i in items) return { "id": order_id, "status": status, "currency": "USD", "total": round(total, 2), "items": items, "customer": { "id": "CUST-1827", "name": "Jane Doe", "email": "jane.doe@example.com", }, "created_at": datetime.datetime.utcnow().isoformat() + "Z", "source": "CometAPI", } ``` direct_lookup.py ```python # direct_lookup.py # Exécute la recherche de commande directement via CometAPI (sans MCP). import os import json from comet_api import CometAPI def lookup_order_direct(order_id: str) -> dict: api_key = os.environ.get("COMET_API_KEY", "dev-key") api = CometAPI(api_key=api_key) return api.get_order(order_id) if __name__ == "__main__": order_id = os.environ.get("ORDER_ID", "ORDER-12345") result = lookup_order_direct(order_id) print(json.dumps(result, indent=2, ensure_ascii=False)) ``` mcp_server.py ```python # mcp_server.py # Serveur MCP qui expose l’outil "lookup_order" via CometAPI. # Nécessite la bibliothèque Python MCP. Adaptez l’import selon votre environnement MCP. import os import json import asyncio from typing import Any, Dict # Bibliothèques MCP (les noms peuvent varier selon la version) try: from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import TextContent except ImportError: raise ImportError("La bibliothèque MCP Python est requise (par ex. 'mcp').") from comet_api import CometAPI server = Server("comet-mcp-server") # Définition de l’outil avec schéma d’entrée JSON @server.tool( name="lookup_order", description="Recherche une commande par identifiant dans CometAPI.", input_schema={ "type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"], }, ) async def lookup_order(params: Dict[str, Any]) -> list[TextContent]: order_id = params["order_id"] api_key = os.environ.get("COMET_API_KEY", "dev-key") api = CometAPI(api_key=api_key) data = api.get_order(order_id) # Retourne le contenu texte (MCP supporte contenus structurés; ici, JSON sérialisé) return [TextContent(type="text", text=json.dumps(data))] async def main(): # Démarre le serveur MCP sur stdio async with stdio_server() as (read, write): await server.run(read, write) if __name__ == "__main__": asyncio.run(main()) ``` mcp_client.py ```python # mcp_client.py # Client MCP qui lance le serveur en sous-processus et appelle l’outil "lookup_order". import os import json import asyncio try: from mcp.client import Client from mcp.client.stdio import stdio_client except ImportError: raise ImportError("La bibliothèque MCP Python est requise (par ex. 'mcp').") async def run_via_mcp(order_id: str): # Lance le serveur MCP local (mcp_server.py) via stdio et appelle l’outil async with stdio_client(command=["python", "mcp_server.py"]) as (read, write): client = Client(read, write) await client.initialize() # négociation de capacités # Liste les outils disponibles (facultatif) tools = await client.list_tools() # Appel de l’outil avec paramètres result = await client.call_tool("lookup_order", {"order_id": order_id}) # Agrège le texte des contenus retournés texts = [] for content in result.contents: if getattr(content, "type", None) == "text": texts.append(content.text) return "\n".join(texts) if __name__ == "__main__": order_id = os.environ.get("ORDER_ID", "ORDER-12345") output = asyncio.run(run_via_mcp(order_id)) # Le serveur renvoie du JSON sérialisé en texte parsed = json.loads(output) print(json.dumps(parsed, indent=2, ensure_ascii=False)) ``` Notes d’exécution (même recherche de commande, deux chemins) - Exécution directe: - python direct_lookup.py - Exécution via MCP: - python mcp_client.py Structure des résultats - Les deux chemins renvoient un objet JSON avec: - id, status, currency, total, items (sku, name, qty, unit_price), customer (id, name, email), created_at, source - Le parcours “direct” appelle CometAPI directement. - Le parcours “MCP” appelle l’outil standardisé “lookup_order” servi par mcp_server.py via un client MCP, ce qui permet la découverte d’outil, la validation de schéma et le découplage du runtime.

D
Deon Goodwin