<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>MCP on Thomas</title>
        <link>https://blog.thomasplantain.fr/tags/mcp/</link>
        <description>Recent content in MCP on Thomas</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>fr-fr</language>
        <lastBuildDate>Thu, 28 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.thomasplantain.fr/tags/mcp/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Serveur MCP avec n8n</title>
        <link>https://blog.thomasplantain.fr/post/mcpn8n/</link>
        <pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.thomasplantain.fr/post/mcpn8n/</guid>
        <description>&lt;img src="https://blog.thomasplantain.fr/img/n8n/logo.png" alt="Featured image of post Serveur MCP avec n8n" /&gt;&lt;h2 id=&#34;mcp-server-trigger&#34;&gt;MCP server Trigger
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/n8n/card_mcp_server.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;n8n Card MCP Server&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;définition-des-tools&#34;&gt;Définition des Tools
&lt;/h2&gt;&lt;h3 id=&#34;bouchons-en-javascript&#34;&gt;Bouchons en Javascript
&lt;/h3&gt;&lt;h2 id=&#34;tests&#34;&gt;Tests
&lt;/h2&gt;</description>
        </item>
        <item>
        <title>LiteLLM - AI Gateway</title>
        <link>https://blog.thomasplantain.fr/post/litellm/</link>
        <pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.thomasplantain.fr/post/litellm/</guid>
        <description>&lt;img src="https://blog.thomasplantain.fr/img/litellm/litellm.avif" alt="Featured image of post LiteLLM - AI Gateway" /&gt;&lt;h2 id=&#34;présentation&#34;&gt;Présentation
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;LiteLLM est une gateway qui au départ est faite pour &amp;ldquo;proxyfier&amp;rdquo; l&amp;rsquo;accès aux LLMs et gérer le budget des multiples licences des équipes qui utilisent l&amp;rsquo;IA dans une entreprise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/BerriAI/litellm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub LiteLLM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;mcp-gateway&#34;&gt;MCP Gateway
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Dans la suite de mes articles sur les serveurs MCP et les AI Gateway, je veux utiliser LiteLLM pour sécuriser l&amp;rsquo;accès à mon serveur MCP de gestion des cartes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/litellm/litellm_call_tools.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LiteLLM - Tools&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker
&lt;ul&gt;
&lt;li&gt;LiteLLM&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Configuration avec Docker-compose &lt;a class=&#34;link&#34; href=&#34;https://docs.litellm.ai/docs/proxy/docker_quick_start&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LiteLLM Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ajout du serveur MCP de gestion des cartes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Création d&amp;rsquo;une &lt;strong&gt;Team&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ajout d&amp;rsquo;un &lt;strong&gt;User&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Configuration d&amp;rsquo;une Key pour le authoriser le &lt;strong&gt;User&lt;/strong&gt; à appeler le serveur MCP&lt;/li&gt;
&lt;li&gt;Test du serveur MCP via la gateway LiteLLM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/litellm/litellm-mcp-call.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LiteLLM - Call MCP&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/litellm/litellm-usage.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LiteLLM - Team Usage&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;gestion-des-couts&#34;&gt;Gestion des couts
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/litellm/litellm-cost.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;LiteLLM - Team Cost&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>MCP pour les nuls - la suite</title>
        <link>https://blog.thomasplantain.fr/post/mcpgtw/</link>
        <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.thomasplantain.fr/post/mcpgtw/</guid>
        <description>&lt;img src="https://blog.thomasplantain.fr/img/mcpgtw/mcp-gateway-gemini.avif" alt="Featured image of post MCP pour les nuls - la suite" /&gt;&lt;blockquote&gt;
&lt;p&gt;Suite du post précédent, je mets en place une gateway pour protéger mon serveur MCP. Le serveur MCP a été déployé sur Azure Container, il est accessible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-gateway-gemini.avif&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;MCP Gateway&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;mise-en-place-dune-flex-gateway&#34;&gt;Mise en place d&amp;rsquo;une Flex gateway
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Création et enregistrement de ma nouvelle Flex gateway (mcp-gateway)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;J&amp;rsquo;ai créé une image Docker de la flex avec son fichier d&amp;rsquo;enregistrement. L&amp;rsquo;image Docker tourne sur un Azure Container, elle est maintenant visible sur Anypoint (le control plane de MuleSoft).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/new-flex-gtw.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Flex Gateway&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;configuration-de-mon-server-mcp-sur-anypoint&#34;&gt;Configuration de mon server MCP sur Anypoint
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.mulesoft.com/api-manager/latest/create-instance-task-agent-tool&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Documentation officielle de MuleSoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ajout de mon serveur MCP (mcp_card)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Aller sur &lt;strong&gt;API Manager&lt;/strong&gt; (Anypoint) et sélectionner &lt;strong&gt;Agent and Tools Instances&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-server-instance.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API Manager&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En sélectionnant la Flex Gateway mise en place pour ce projet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/add-mcp1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Flex Gateway&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Maintenant on peut ajouter un &lt;strong&gt;MCP Server&lt;/strong&gt; et on finalise la configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-config1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Flex Gateway&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le contrat du serveur &lt;strong&gt;mcp_card&lt;/strong&gt; est visible sur le portail API d&amp;rsquo;Anypoint (Exchange).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/exchange-mcp.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Echange&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le serveur mcp_card est théoriquement accessible via la gateway, il faut maintenant ajouter les policies pour le sécuriser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;policies-pour-mon-serveur-mcp&#34;&gt;Policies pour mon serveur MCP
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.mulesoft.com/gateway/latest/policies-included-mcp-support&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MCP Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Cette policy est obligatoire pour le bon fonctionnement du serveur MCP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Client ID Enforcement&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour limiter l&amp;rsquo;accès au serveur &lt;strong&gt;mcp_card&lt;/strong&gt; aux applications enregistrées qui ont le duo &lt;strong&gt;client_id/client_secret&lt;/strong&gt; dans leurs Headers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-clientid.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Echange&#34;
	
	
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nous avons donc 2 policies configurées sur notre gateway pour le serveur &lt;strong&gt;mcp_card&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-policies.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Policies&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;appels-du-serveur-mcp-avec-bruno&#34;&gt;Appels du serveur MCP avec Bruno
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Nous allons tester la connectivité au server &lt;strong&gt;mcp_card&lt;/strong&gt; avec le client API &lt;a class=&#34;link&#34; href=&#34;https://www.usebruno.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bruno&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Configuration des Headers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/bruno-headers.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Headers&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Appels aux services du serveur &lt;strong&gt;mcp_card&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/call-mcp1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;card_details&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/call-mcp4.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;transaction_list&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si le &lt;strong&gt;client_secret&lt;/strong&gt; est faux dans les Headers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/call-mcp-failed.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;failed&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;observabilité&#34;&gt;Observabilité
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;L&amp;rsquo;outil de monitoring d&amp;rsquo;Anypoint nous permet au niveau de la configuration du serveur de visualiser les appels. On voit les appels de chaque service et les appels en erreurs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;card_details&lt;/li&gt;
&lt;li&gt;transaction_list&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcpgtw/mcp-metrics.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;metrics&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>MCP pour les nuls</title>
        <link>https://blog.thomasplantain.fr/post/mcp/</link>
        <pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.thomasplantain.fr/post/mcp/</guid>
        <description>&lt;img src="https://blog.thomasplantain.fr/img/mcp/mcp_bg.avif" alt="Featured image of post MCP pour les nuls" /&gt;&lt;h2 id=&#34;mcp-kesako-&#34;&gt;MCP Kesako ?
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Protocole de communication entre un agent IA et un service.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://modelcontextprotocol.io/docs/getting-started/intro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MCP Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le service permet à un agent d&amp;rsquo;avoir accès à des données structurées (format JSON) qui ne sont pas déjà présentes dans son modèle LLM.
Il existe deux protocoles de communication, io et http. Dans mon cas, je souhaite utiliser http, dans l&amp;rsquo;idée de créer un serveur MCP accessible à tous.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcp/mcp-simple-diagram.avif&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;copilot&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Pour accélérer le développement, je vais utiliser la librairie Python fastMCP :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fastMCP: &lt;a class=&#34;link&#34; href=&#34;https://gofastmcp.com/getting-started/welcome&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://gofastmcp.com/getting-started/welcome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;prototype-du-service-mcp&#34;&gt;Prototype du service MCP
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Mon cas d&amp;rsquo;utilisation : je veux mettre en place un service qui donne les détails d&amp;rsquo;une carte de crédit si on lui donne le numéro en paramètre, ou la liste des transactions d&amp;rsquo;un compte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans ce premier post, je ne vais pas aborder la sécurité ni l&amp;rsquo;observabilité, mais je souhaite en parler bientôt dans un post dédié, notamment via une API Gateway.&lt;/p&gt;
&lt;h3 id=&#34;pour-commencer&#34;&gt;Pour commencer
&lt;/h3&gt;&lt;p&gt;Dans un environnement Python :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install fastmcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;serveur-mcp-card-details&#34;&gt;Serveur MCP Card Details
&lt;/h3&gt;&lt;p&gt;J&amp;rsquo;ai créé deux services : le détail d&amp;rsquo;une carte et la liste des transactions d&amp;rsquo;un compte, avec des données fictives.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; fastmcp &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; FastMCP
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; starlette.requests &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Request
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; starlette.responses &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; PlainTextResponse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mcp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; FastMCP(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;My MCP Server&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@mcp.custom_route&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/health&amp;#34;&lt;/span&gt;, methods&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;health_check&lt;/span&gt;(request: Request) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; PlainTextResponse:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; PlainTextResponse(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@mcp.tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;card_details&lt;/span&gt;(card_number: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; dict:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Dummy implementation for demonstration purposes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;card_number&amp;#34;&lt;/span&gt;: card_number,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;card_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Visa&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;expiry_date&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;12/25&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cardholder_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;John Doe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@mcp.tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;transaction_list&lt;/span&gt;(account_id: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; list:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Dummy implementation for demonstration purposes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;transaction_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;txn_001&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100.0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;currency&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;completed&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;transaction_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;txn_002&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;50.0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;currency&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;transaction_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;txn_003&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;75.0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;currency&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;failed&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mcp&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(transport&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http&amp;#34;&lt;/span&gt;, port&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour lancer le serveur qui va écouter sur le port 8000, j&amp;rsquo;exécute :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python my_server.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuration-de-copilot&#34;&gt;Configuration de Copilot
&lt;/h2&gt;&lt;p&gt;Une fois que le serveur MCP tourne dans la console, je configure mon GitHub Copilot pour qu&amp;rsquo;il ajoute le serveur dans sa liste :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcp/mcp_copilot_config.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;copilot&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la configuration faite, on peut voir le serveur et les deux fonctionnalités (&lt;code&gt;card_details&lt;/code&gt; et &lt;code&gt;transaction_list&lt;/code&gt;) :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcp/mcp_tools.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;tools&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;utilisation-du-service&#34;&gt;Utilisation du service
&lt;/h3&gt;&lt;p&gt;Les deux fonctionnalités sont maintenant accessibles dans le chat de Copilot :
&lt;img src=&#34;https://blog.thomasplantain.fr/img/mcp/mcp_copilot.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;chat&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;prochaines-étapes&#34;&gt;Prochaines étapes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Mettre en place une API Gateway
&lt;ul&gt;
&lt;li&gt;Authentification&lt;/li&gt;
&lt;li&gt;Observabilité&lt;/li&gt;
&lt;li&gt;Limitation, quotas&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
