<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Contribuez</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Proposez vos articles, cours, tutoriels, faq, sources pour Python & Zope]]></description>
		<language>fr</language>
		<lastBuildDate>Sun, 19 Apr 2026 01:13:59 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Contribuez</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>MCP - La Nouvelle Hype</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2176561&amp;goto=newpost</link>
			<pubDate>Thu, 01 May 2025 15:01:27 GMT</pubDate>
			<description>Bonjour, 
 
Découvrez MCP :...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Découvrez MCP : La Nouvelle Hype pour les Développeurs IA !<br />
<br />
Vous ne connaissez pas encore MCP ? C'est pourtant le sujet d'enthousiasme du moment pour les développeurs ayant un intérêt pour l'intelligence artificielle. <br />
**Attention, nous n'en sommes qu'aux balbutiements de cette technologie.<br />
<br />
Imaginez un monde où vos scripts et applications communiquent nativement avec n'importe quelle IA. Ce futur est plus proche que vous ne le pensez grâce à MCP.<br />
Dès demain, allons-nous créer des serveurs MCP pour héberger tous nos scripts et applications ? Pourquoi cet engouement ?<br />
 - Demande de nos clients.<br />
 - Simplicité déconcertante pour ajouter cette fonctionnalité à notre travail.<br />
 - Le standard de demain avec l'IA ?<br />
<br />
<br />
Si vous viviez dans une grotte... <br />
MCP (Middleware Communication Protocol) s’impose comme une couche d’abstraction universelle entre les environnements d’exécution applicatifs et les moteurs d’IA.<br />
En pratique, un développeur peut, en quelques lignes de code, invoquer une fonction IA distante, recevoir une réponse contextualisée, et chaîner cette réponse avec d’autres modules métiers sans se soucier de la compatibilité technique entre les composants. MCP fait le lien entre les paradigmes de l’IA et ceux du développement logiciel traditionnel, en supprimant la friction entre les deux mondes.<br />
<br />
Pour nous, développeurs (et non administrateurs), ce protocole se révèle très simple à appréhender. Il nous suffit de créer une interface très proche de REST. Deux modes de communication existent : `io` pour une communication locale, et `http` pour une communication réseau, donc publique (avec authentification possible).<br />
<br />
Une librairie Python haut niveau &quot;<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">fastmcp</span>&quot; existe (qui utilise <a rel="nofollow" href="https://github.com/modelcontextprotocol/python-sdk" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">mcp</span></a>) pour nous simplifier grandement la vie. L'exportation d'une fonction se fait de la manière suivante :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">@mcp.tool<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: #0000ff;">def</span> ma_fonction_export&eacute;e<span class="br0">&#40;</span>
    param: str = Field<span class="br0">&#40;</span>description=<span style="color: #FF0000;">&quot;descriptif pour IA&quot;</span><span class="br0">&#41;</span>,
<span class="br0">&#41;</span> :
    <span style="color: #FF0000;">&quot;&quot;&quot;texte d'explication pour l'IA sur cette fonction&quot;&quot;&quot;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;ok&quot;</span></pre></td></tr></table></code><hr />
</div>Rien de plus simple, n'est-ce pas ? Il est crucial de comprendre que les annotations sont primordiales, car elles seront utilisées par l'IA pour déterminer si notre fonction est pertinente pour la requête de l'utilisateur.<br />
<br />
Cas d'usages simples :<br />
Lecture :<br />
    - Vous avez déjà un script qui retourne des informations ? Créez un serveur MCP qui l'inclura et offrira ces mêmes informations à toutes les IA.<br />
    - Votre application peut retourner la liste de vos clients, le stock, etc. Exposez ces données via MCP !<br />
    - Vous possédez une API (REST ou autre) ? MCP peut la consulter ou l'étendre.<br />
Action :<br />
    - En plus, piloter un périphérique<br />
    - Le principe est similaire à la lecture pour nous (mais à voir si l'ia a bien compris le prompt... :aie:).<br />
<br />
<br />
<br />
Explorez cette belle <a rel="nofollow" href="https://github.com/punkpeye/awesome-mcp-servers" target="_blank">liste de serveurs MCP</a><br />
Chaque jour il y a de nouvelles entrées dans la <a rel="nofollow" href="https://dev.to/t/mcp" target="_blank">catégorie mcp</a> sur dev.to <br />
<br />
<br />
Notez que certaines IA peuvent enchaîner les requêtes MCP. Par exemple, consulter des données provenant d'un serveur MCP, puis, en fonction du résultat, solliciter une &quot;action&quot; auprès d'un autre serveur MCP.<br />
<br />
<i>&quot;Communication entre &quot;toutes*&quot; les IA&quot; : <br />
<b>Attention !</b> Ceci est un horizon futur. Nous n'en sommes qu'aux prémices. Toutes les IA ne supportent pas encore ce protocole, et surtout : chaque IA n'interprétera pas forcément la requête utilisateur de la même manière. Le risque est donc de voir l'IA appeler une fonction inappropriée ou avec les mauvais paramètres. De plus, la possibilité de connecter une centaine de serveurs à notre IA introduit un risque de confusion et de collision.</i><br />
<br />
Il est temps de présenter un petit code fonctionnel.<br />
<br />
`fastmcp` a été utilisé ici, une surcouche de haut niveau qui simplifie notre travail.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">#!/usr/bin/env -S uv run --script</span>
<span style="color: #808080;"># /// script</span>
<span style="color: #808080;"># requires-python = &quot;&lt;=3.14&quot;</span>
<span style="color: #808080;"># dependencies = [&quot;fastmcp&quot;, &quot;beautifulsoup4&quot;]</span>
<span style="color: #808080;"># ///</span>
&nbsp;
<span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">dans ia, test de quelques prompts:</span>
<span style="color: #FF0000;">&nbsp; les derniers messages du forum</span>
<span style="color: #FF0000;">&nbsp; les derniers messages du forum dans la cat&eacute;gorie administration</span>
<span style="color: #FF0000;">&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #0000ff;">import</span> asyncio
<span style="color: #0000ff;">import</span> urllib.request
<span style="color: #0000ff;">import</span> sys
<span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span> BeautifulSoup
&nbsp;
<span style="color: #0000ff;">from</span> pydantic <span style="color: #0000ff;">import</span> Field
<span style="color: #0000ff;">from</span> mcp.server.fastmcp <span style="color: #0000ff;">import</span> FastMCP
&nbsp;
&nbsp;
mcp = FastMCP<span class="br0">&#40;</span>
    <span style="color: #FF0000;">&quot;serveur-mcp-developpez&quot;</span>,
    log_level=<span style="color: #FF0000;">&quot;ERROR&quot;</span>,  <span style="color: #808080;"># pouvons changer pour DEBUG</span>
    instructions=<span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; informations sur le forum `developpez`</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; r&eacute;cup&eacute;rer les derniers sujets, messages du forum `developpez`</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; return : json format</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; json type is:</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; success : yes or not</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title : response title</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data : response datas</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error : if error, text</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>,
<span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_http_page<span class="br0">&#40;</span><span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; fonction m&eacute;tier, venant de motre application</span>
<span style="color: #FF0000;">&nbsp; &nbsp; from mon_application import get_http_page</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    URL = <span style="color: #FF0000;">&quot;https://www.developpez.net/forums/search.php?do=getdaily&quot;</span>
    html = urllib.request.urlopen<span class="br0">&#40;</span>URL<span class="br0">&#41;</span>.read<span class="br0">&#40;</span><span class="br0">&#41;</span>.decode<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;ISO-8859-1&quot;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #808080;"># code rapide pour ne garder que le texte</span>
    soup = BeautifulSoup<span class="br0">&#40;</span>html, <span style="color: #FF0000;">&quot;html.parser&quot;</span><span class="br0">&#41;</span>
    results = <span class="br0">&#91;</span><span class="br0">&#93;</span>
    <span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span> soup.select<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;li.imodselector&quot;</span><span class="br0">&#41;</span>:
        <span style="color: #0000ff;">try</span>:
            title = item.select<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;h3&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.get_text<span class="br0">&#40;</span><span class="br0">&#41;</span>.strip<span class="br0">&#40;</span><span class="br0">&#41;</span>
            url = item.select<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;h3 a&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #FF0000;">&quot;href&quot;</span><span class="br0">&#93;</span>
            cat = item.select<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;div.threadpostedin a&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.get_text<span class="br0">&#40;</span><span class="br0">&#41;</span>.strip<span class="br0">&#40;</span><span class="br0">&#41;</span>
            results.append<span class="br0">&#40;</span><span class="br0">&#123;</span><span style="color: #FF0000;">&quot;title&quot;</span>: title, <span style="color: #FF0000;">&quot;cat&quot;</span>: cat, <span style="color: #FF0000;">&quot;url&quot;</span>: url<span class="br0">&#125;</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">except</span> Exception:
            <span style="color: #0000ff;">continue</span>
    <span style="color: #0000ff;">return</span> results
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> ToolResult<span class="br0">&#40;</span>dict<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;facultatif, format structur&eacute; de tous nos retours de notre api&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, success, title=<span style="color: #FF0000;">&quot;&quot;</span>, data=<span style="color: #339933;">None</span>, error=<span style="color: #339933;">None</span><span class="br0">&#41;</span>:
        self<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;success&quot;</span><span class="br0">&#93;</span> = success
        self<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;title&quot;</span><span class="br0">&#93;</span> = title
        self<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;data&quot;</span><span class="br0">&#93;</span> = data <span style="color: #0000ff;">if</span> data <span style="color: #0000ff;">else</span> <span style="color: #339933;">None</span>
        <span style="color: #808080;"># if not self[&quot;data&quot;] : self[&quot;success&quot;] = False; ...</span>
        self<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;error&quot;</span><span class="br0">&#93;</span> = error
&nbsp;
&nbsp;
<span style="color: #339933;">@mcp.tool<span class="br0">&#40;</span><span class="br0">&#41;</span></span>
<span style="color: #0000ff;">async</span> <span style="color: #0000ff;">def</span> get_messages_forum<span class="br0">&#40;</span>
    category: str = Field<span class="br0">&#40;</span>description=<span style="color: #FF0000;">&quot;en optionnel, filtrer une cat&eacute;gorie&quot;</span>, default=<span style="color: #FF0000;">&quot;all&quot;</span><span class="br0">&#41;</span>,
<span class="br0">&#41;</span> -&gt; dict:
    <span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; return the content of the `developpez.net` forum</span>
<span style="color: #FF0000;">&nbsp; &nbsp; return type is json</span>
<span style="color: #FF0000;">&nbsp; &nbsp; category == `cat` in json</span>
<span style="color: #FF0000;">&nbsp; &nbsp; Le contenu est en francais</span>
<span style="color: #FF0000;">&nbsp; &nbsp; Dans la liste des messages, il peut avoir une duplication des sujets</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #808080;"># category : juste d&eacute;mo, non utilis&eacute; ici, IA peut filtrer la r&eacute;ponse complete (mais pas bon pour jetons)</span>
    <span style="color: #0000ff;">try</span>:
        html = get_http_page<span class="br0">&#40;</span><span class="br0">&#41;</span>
        <span style="color: #0000ff;">if</span> html:
            <span style="color: #0000ff;">return</span> ToolResult<span class="br0">&#40;</span><span style="color: #339933;">True</span>, <span style="color: #FF0000;">&quot;messages list developpez.net&quot;</span>, html<span class="br0">&#41;</span>
        <span style="color: #0000ff;">else</span>:
            <span style="color: #0000ff;">return</span> ToolResult<span class="br0">&#40;</span><span style="color: #339933;">False</span>, <span style="color: #FF0000;">&quot;forum error&quot;</span>, <span style="color: #339933;">None</span>, <span style="color: #FF0000;">&quot;no message found&quot;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #808080;"># except ConnectionRefusedError:</span>
    <span style="color: #808080;"># return {&quot;status&quot;: 0, &quot;message&quot;: f&quot;Erreur: Impossible de se connecter&quot;}</span>
    <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> e:
        <span style="color: #0000ff;">return</span> ToolResult<span class="br0">&#40;</span><span style="color: #339933;">False</span>, <span style="color: #FF0000;">&quot;forum error&quot;</span>, <span style="color: #339933;">None</span>, f<span style="color: #FF0000;">&quot;read forum error : {e}&quot;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">async</span> <span style="color: #0000ff;">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; juste pour un debug simple,</span>
<span style="color: #FF0000;">&nbsp; &nbsp; normalement fonctions sont d&eacute;j&agrave; pr&eacute;sentent et test&eacute;es dans notre application</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #0000ff;">await</span> get_messages_forum<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    exit<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span> == <span style="color: #FF0000;">&quot;__main__&quot;</span>:
    <span style="color: #0000ff;">if</span> <span style="color: #FF0000;">&quot;-t&quot;</span> <span style="color: #0000ff;">in</span> sys.argv:
        asyncio.run<span class="br0">&#40;</span>main<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    mcp.run<span class="br0">&#40;</span>transport=<span style="color: #FF0000;">&quot;stdio&quot;</span><span class="br0">&#41;</span>  <span style="color: #808080;"># uniquement en mode local</span></pre></td></tr></table></code><hr />
</div>Notez que l'utilisation de `uv` ici est arbitraire. Pour un déploiement plus simple, la PEP 723 n'est pas exclusive à `uv`, et il est possible de s'en passer.<br />
<br />
------------------------------------<br />
<br />
Pour tester notre serveur, toute IA supportant MCP fera l'affaire ! Par exemple en hôtes existe: VS Code avec Copilot (<a rel="nofollow" href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers#_add-an-mcp-server" target="_blank">doc</a>) ou AnythingLLM Desktop.<br />
<i>** vscode-copilot avec gemini : bug avec mcp mais fixé dans la prochaine release</i><br />
<br />
Gemini a annoncé son support... mais il est trop tôt pour émettre un jugement sur cet embryon. Pour l'instant, c'est très léger, mais suffisant pour tester. Et puisqu'il est possible d'obtenir une clé API gratuitement, autant en profiter.<br />
<br />
Nous pouvons créer un petit client pour tester notre serveur.<br />
Deux cas de figure se présentent : soit nous effectuons une action, et la réponse a peu d'importance, soit nous demandons des informations. Dans ce dernier cas, la <a rel="nofollow" href="https://ai.google.dev/gemini-api/docs/function-calling?hl=fr&amp;example=weather#use_model_context_protocol_mcp" target="_blank">documentation</a> nous demande d'injecter le résultat de la requête MCP dans la requête à l'IA. Soyez vigilants, les jetons en entrée correspondent à la sortie de notre fonction.<br />
<br />
Voici un petit client Gemini connecté à notre serveur qui interprète la réponse de notre serveur MCP.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">#!/usr/bin/env -S uv run --script</span>
<span style="color: #808080;"># /// script</span>
<span style="color: #808080;"># requires-python = &quot;&lt;=3.13.20&quot;</span>
<span style="color: #808080;"># dependencies = [&quot;mcp&quot;, &quot;google&gt;=3.0.0&quot;,&quot;google-genai&gt;=1.7.0&quot;]</span>
<span style="color: #808080;"># ///</span>
&nbsp;
<span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">https://ai.google.dev/gemini-api/docs/function-calling?hl=fr&amp;example=weather#use_model_context_protocol_mcp</span>
<span style="color: #FF0000;">&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #0000ff;">import</span> asyncio
<span style="color: #0000ff;">from</span> pathlib <span style="color: #0000ff;">import</span> Path
<span style="color: #0000ff;">import</span> os
&nbsp;
<span style="color: #0000ff;">from</span> google <span style="color: #0000ff;">import</span> genai
<span style="color: #0000ff;">from</span> google.genai <span style="color: #0000ff;">import</span> types
<span style="color: #0000ff;">from</span> mcp <span style="color: #0000ff;">import</span> ClientSession, StdioServerParameters
<span style="color: #0000ff;">from</span> mcp.client.stdio <span style="color: #0000ff;">import</span> stdio_client
&nbsp;
MCP_SERVER = Path<span class="br0">&#40;</span><span style="color: #0080ff;">__file__</span><span class="br0">&#41;</span>.parent / <span style="color: #FF0000;">&quot;mcp-developpez.py&quot;</span>
client = genai.Client<span class="br0">&#40;</span>api_key=os.getenv<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;GEMINI_API_KEY&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> set_params<span class="br0">&#40;</span>server_file=MCP_SERVER<span class="br0">&#41;</span>:
    <span style="color: #808080;"># Create server parameters for stdio connection</span>
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;server at:&quot;</span>, server_file<span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> StdioServerParameters<span class="br0">&#40;</span>
        command=str<span class="br0">&#40;</span>server_file<span class="br0">&#41;</span>,  <span style="color: #808080;"># Executable</span>
        args=<span class="br0">&#91;</span><span class="br0">&#93;</span>,
        <span style="color: #808080;"># command=&quot;python&quot;, args=[server_file],</span>
        <span style="color: #808080;"># command=&quot;uv&quot;, args=[&quot;run&quot;, &quot;c:/xxxx/mcp-developpez.py&quot;],</span>
        <span style="color: #808080;"># env=os.environ,</span>
        env=<span style="color: #339933;">None</span>,
    <span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">async</span> <span style="color: #0000ff;">def</span> run<span class="br0">&#40;</span>server_params<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">async</span> <span style="color: #0000ff;">with</span> stdio_client<span class="br0">&#40;</span>server_params<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> <span class="br0">&#40;</span>read, write<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">async</span> <span style="color: #0000ff;">with</span> ClientSession<span class="br0">&#40;</span>read, write<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> session:
            <span style="color: #0000ff;">await</span> session.initialize<span class="br0">&#40;</span><span class="br0">&#41;</span>
            <span style="color: #808080;"># Get tools from MCP session and convert to Gemini Tool objects</span>
            mcp_tools = <span style="color: #0000ff;">await</span> session.list_tools<span class="br0">&#40;</span><span class="br0">&#41;</span>
            tools = <span class="br0">&#91;</span>
                types.Tool<span class="br0">&#40;</span>
                    function_declarations=<span class="br0">&#91;</span>
                        <span class="br0">&#123;</span>
                            <span style="color: #FF0000;">&quot;name&quot;</span>: tool.name,
                            <span style="color: #FF0000;">&quot;description&quot;</span>: tool.description,
                            <span style="color: #FF0000;">&quot;parameters&quot;</span>: <span class="br0">&#123;</span>
                                k: v <span style="color: #0000ff;">for</span> k, v <span style="color: #0000ff;">in</span> tool.inputSchema.items<span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> k <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span> <span class="br0">&#91;</span><span style="color: #FF0000;">&quot;additionalProperties&quot;</span>, <span style="color: #FF0000;">&quot;$schema&quot;</span><span class="br0">&#93;</span>
                            <span class="br0">&#125;</span>,
                        <span class="br0">&#125;</span>
                    <span class="br0">&#93;</span>
                <span class="br0">&#41;</span>
                <span style="color: #0000ff;">for</span> tool <span style="color: #0000ff;">in</span> mcp_tools.tools
            <span class="br0">&#93;</span>
&nbsp;
            <span style="color: #0000ff;">while</span> <span style="color: #339933;">True</span>:
                <span style="color: #808080;"># Demande de l'utilisateur</span>
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;# exemple: les derniers messages du forum&quot;</span><span class="br0">&#41;</span>
                prompt = input<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>(IA-CLIENTE) Ask : &quot;</span><span class="br0">&#41;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> prompt:
                    <span style="color: #0000ff;">break</span>
&nbsp;
                <span style="color: #808080;"># Send request to the model with MCP function declarations</span>
                response = client.models.generate_content<span class="br0">&#40;</span>
                    model=<span style="color: #FF0000;">&quot;gemini-2.0-flash&quot;</span>,
                    contents=prompt,
                    config=types.GenerateContentConfig<span class="br0">&#40;</span>
                        temperature=<span style="color: #cc66cc;">0.5</span>,
                        tools=tools,
                        <span style="color: #808080;"># system_instruction=f&quot;use my lang : {os.getenv(&quot;LANG&quot;)}&quot;,</span>
                    <span class="br0">&#41;</span>,
                <span class="br0">&#41;</span>
&nbsp;
                <span style="color: #808080;"># print(&quot;datas brutes du serveur mcp...&quot;)</span>
                <span style="color: #808080;"># print(response)</span>
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>
                    <span style="color: #FF0000;">&quot;#&quot;</span>,
                    response.usage_metadata.total_token_count,
                    <span style="color: #FF0000;">&quot;jetons utilis&eacute;s pour interpr&eacute;ter mon prompt et trouver la fonction MCP&quot;</span>,
                <span class="br0">&#41;</span>
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
                <span style="color: #0000ff;">if</span> response.candidates<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.content.parts<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.function_call:
                    function_call = response.candidates<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.content.parts<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.function_call
&nbsp;
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;# appel de cette fonction dans le serveur MCP:&quot;</span>, function_call<span class="br0">&#41;</span>
                    <span style="color: #808080;"># on injecte les datas du mcp dans le prompt utilisateur</span>
                    result = <span style="color: #0000ff;">await</span> session.call_tool<span class="br0">&#40;</span>
                        function_call.name,
                        arguments=function_call.args,
                    <span class="br0">&#41;</span>
&nbsp;
                    <span style="color: #808080;"># ici, nous avons le retour brut de la requete &agrave; MCP</span>
                    <span style="color: #808080;"># print(&quot;\n&quot;.join(r.text for r in result.content))</span>
&nbsp;
                    <span style="color: #808080;"># eventuellement , encore une requete a ia pour mettre en clair</span>
                    <span style="color: #808080;"># on passe le r&eacute;sultat MCP dans le contexte ...</span>
                    <span style="color: #808080;"># https://ai.google.dev/gemini-api/docs/function-calling?hl=fr&amp;example=weather#step_4_create_user_friendly_response_with_function_result_and_call_the_model_again</span>
&nbsp;
                    contents = <span class="br0">&#91;</span>
                        types.Content<span class="br0">&#40;</span>
                            role=<span style="color: #FF0000;">&quot;user&quot;</span>,
                            parts=<span class="br0">&#91;</span>types.Part<span class="br0">&#40;</span>text=<span style="color: #FF0000;">&quot;not display json input., but format json result to humain text&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>,
                        <span class="br0">&#41;</span>
                    <span class="br0">&#93;</span>
&nbsp;
                    <span style="color: #808080;"># Create a function response part</span>
                    function_response_part = types.Part.from_function_response<span class="br0">&#40;</span>
                        name=function_call.name,
                        response=<span class="br0">&#123;</span><span style="color: #FF0000;">&quot;result&quot;</span>: result.content<span class="br0">&#125;</span>,
                    <span class="br0">&#41;</span>
&nbsp;
                    <span style="color: #808080;"># Append function call and result of the function execution to contents</span>
                    contents.append<span class="br0">&#40;</span>
                        types.Content<span class="br0">&#40;</span>role=<span style="color: #FF0000;">&quot;model&quot;</span>, parts=<span class="br0">&#91;</span>types.Part<span class="br0">&#40;</span>function_call=function_call<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
                    <span class="br0">&#41;</span>  <span style="color: #808080;"># Append the model's function call message</span>
                    contents.append<span class="br0">&#40;</span>types.Content<span class="br0">&#40;</span>role=<span style="color: #FF0000;">&quot;user&quot;</span>, parts=<span class="br0">&#91;</span>function_response_part<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>  <span style="color: #808080;"># Append the function response</span>
&nbsp;
                    final_response = client.models.generate_content<span class="br0">&#40;</span>
                        model=<span style="color: #FF0000;">&quot;gemini-2.0-flash&quot;</span>,
                        config=types.GenerateContentConfig<span class="br0">&#40;</span>
                            temperature=<span style="color: #cc66cc;">0.5</span>,
                            tools=tools,
                            system_instruction=f<span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; use my lang : <span class="br0">&#123;</span>os.getenv<span class="br0">&#40;</span>&quot;LANG&quot;<span class="br0">&#41;</span><span class="br0">&#125;</span></span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span>,
                        <span class="br0">&#41;</span>,
                        contents=contents,
                    <span class="br0">&#41;</span>
&nbsp;
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>final_response.text<span class="br0">&#41;</span>
&nbsp;
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;#&quot;</span>, final_response.usage_metadata.total_token_count, <span style="color: #FF0000;">&quot;jetons utilis&eacute;s encore en plus&quot;</span><span class="br0">&#41;</span>
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
                <span style="color: #0000ff;">else</span>:
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Pas d'utilisation du serveur MCP pour la r&eacute;ponse !&quot;</span><span class="br0">&#41;</span>
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>response.text<span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span> == <span style="color: #FF0000;">&quot;__main__&quot;</span>:
    serv = set_params<span class="br0">&#40;</span>MCP_SERVER<span class="br0">&#41;</span>
    asyncio.run<span class="br0">&#40;</span>run<span class="br0">&#40;</span>serv<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></td></tr></table></code><hr />
</div>Résultat du mini client, il a trouvé (actuellement) 2 sujets:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span>IA-CLIENTE<span class="br0">&#41;</span> Ask : les derniers messages du forum dans la cat&eacute;gorie administration
<span style="color: #808080;"># 87 jetons utilis&eacute;s</span>
&nbsp;
<span style="color: #808080;"># appel de cette fonction dans le serveur MCP: id=None args={'category': 'administration'} name='get_messages_forum'</span>
Voici le contenu du forum developpez.net, cat&eacute;gorie <span style="color: #FF0000;">&quot;administration&quot;</span> :
&nbsp;
*   **Comment cr&eacute;er une vraie copie d<span style="color: #FF0000;">'une bdd en ssh ?** dans Administration: &lt;https://www.developpez.net/forums/d2175945/bases-donnees/mysql/administration/creer-vraie-copie-d-bdd-ssh/&gt;</span>
<span style="color: #FF0000;">*   **[2017] Quelle limitation taille base SQL Express 2017 ?** dans Administration: &lt;https://www.developpez.net/forums/d2176398/bases-donnees/ms-sql-server/administration/limitation-taille-base-sql-express-2017-a/&gt;</span>
&nbsp;
<span style="color: #FF0000;"># 2528 jetons utilis&eacute;s encore en plus</span></pre></td></tr></table></code><hr />
</div><div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span>IA-CLIENTE<span class="br0">&#41;</span> Ask : les derniers messages du forum
<span style="color: #808080;"># 81 jetons utilis&eacute;s</span>
&nbsp;
<span style="color: #808080;"># appel de cette fonction dans le serveur MCP: id=None args={} name='get_messages_forum'</span>
Voici les sujets du forum developpez.net :
&nbsp;
*   **Qt Creator:** Comment redimensionner les &eacute;l&eacute;ments d<span style="color: #FF0000;">'une appli</span>
<span style="color: #FF0000;">*   **S&eacute;curit&eacute;:** Les gouvernements ont plus que jamais recours &agrave; des piratages de type &quot;zero-day&quot;</span>
<span style="color: #FF0000;">*   **CV:** CV pour emploi et/ou stage</span>
<span style="color: #FF0000;">*   **Firefox:** Nouvelle version Waterfox v6.5.7</span>
<span style="color: #FF0000;">*   **Sch&eacute;ma:** \[MCD] Inventaire livres biblioth&egrave;que personnelle</span>
<span style="color: #FF0000;">*   **WinDev:** \[WD23] Perte de l'</span>aide en ligne
*   **Linux:** Linus Torvalds exprime son m&eacute;contentement &agrave; l<span style="color: #FF0000;">'&eacute;gard des syst&egrave;mes de fichiers insensibles &agrave; la casse</span>
<span style="color: #FF0000;">*   **Hardware:** Meta transforme ses lunettes connect&eacute;es Ray-Ban en machine de surveillance pour l'</span>IA
*   **Actualit&eacute;s:** Un d&eacute;veloppeur signale que Microsoft GitHub Copilot s<span style="color: #FF0000;">'est activ&eacute; sans son consentement explicite</span>
<span style="color: #FF0000;">*   **S&eacute;curit&eacute;:** Certaines applications prennent automatiquement des captures d'</span>&eacute;cran et les envoient &agrave; des tiers
*   **D&eacute;buter:** probl&egrave;me d<span style="color: #FF0000;">'accent avec wamp</span>
<span style="color: #FF0000;">*   **Intelligence artificielle:** Wikip&eacute;dia a d&eacute;clar&eacute; qu'</span>elle utiliserait l<span style="color: #FF0000;">'IA pour am&eacute;liorer le travail de ses r&eacute;dacteurs et de ses b&eacute;n&eacute;voles</span>
<span style="color: #FF0000;">*   **D&eacute;buter:** Utilisation du TopenDialog au lieu du nom de dossier avec D6 et Win11 64bits</span>
<span style="color: #FF0000;">*   **Extensions:** \[PostGIS] Charger des primitives diff&eacute;rentes</span>
<span style="color: #FF0000;">*   **Administration:** Comment cr&eacute;er une vraie copie d'</span>une bdd en ssh ?
*   **Administration:** \<span class="br0">&#91;</span><span style="color: #cc66cc;">2017</span><span class="br0">&#93;</span> Quelle limitation taille base SQL Express <span style="color: #cc66cc;">2017</span> ?
*   **Macros et VBA Excel:** automatiser copier coller en VBE
*   **jQuery:** Une petite question sur un element presque fini
*   **Langage SQL:** S&eacute;lectionner les &eacute;l&eacute;ments d<span style="color: #FF0000;">'une table qui ne sont pas dans une autre</span>
<span style="color: #FF0000;">*   **React:** Connexion base de donn&eacute;es - r&eacute;cup&eacute;rer les messages d'</span>erreur
*   **Outlook:** \<span class="br0">&#91;</span>Toutes versions<span class="br0">&#93;</span> Outlook &amp; VBA / Selection d<span style="color: #FF0000;">'un r&eacute;pertoire ou d'</span>un fichier
*   **C<span style="color: #808080;">#:** \[D&eacute;butant] Remplacer des strings dans une liste</span>
*   **Outlook:** \<span class="br0">&#91;</span>OL-<span style="color: #cc66cc;">365</span><span class="br0">&#93;</span> Copier les rendez-vous d<span style="color: #FF0000;">'un calendrier partag&eacute; vers un nouveau calendrier</span>
<span style="color: #FF0000;">*   **Outlook:** \[OL-2019] Outlook 2021 - Accus&eacute; de r&eacute;ception ne fonctionne plus</span>
<span style="color: #FF0000;">*   **Macros et VBA Excel:** \[Toutes versions] Selection de r&eacute;pertoire et de fichiers</span>
&nbsp;
<span style="color: #FF0000;"># 2946 jetons utilis&eacute;s encore en plus</span></pre></td></tr></table></code><hr />
</div>----------<br />
<br />
A noter que fastmcp n'est pas la seule solution python, existe aussi<a rel="nofollow" href="https://github.com/tadata-org/fastapi_mcp/" target="_blank"> <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">fastapi-mcp</span></a> qui expose notre serveur mcp comme un serveur http<br />
Ces 2 librairies utilisent <a rel="nofollow" href="https://github.com/modelcontextprotocol/python-sdk" target="_blank"><span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">mcp</span></a> &quot;The official Python SDK for Model Context Protocol servers and clients&quot;<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			FastAPI MCP est une solution élégante qui vous permet d'exposer vos points de terminaison FastAPI en tant qu'outils MCP (Model Context Protocol) avec un minimum d'effort.
			
		<hr />
	</div>
</div><div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">#src: https://github.com/tadata-org/fastapi_mcp/blob/main/examples/02_full_schema_description_example.py</span>
&nbsp;
<span style="color: #339933;"><span style="color: #339933;"><span style="color: #339933;"><span style="color: #339933;">@app.get<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/items/{item_id}&quot;</span>,</span> response_model=Item,</span> tags=<span class="br0">&#91;</span><span style="color: #FF0000;">&quot;items&quot;</span><span class="br0">&#93;</span>,</span> operation_id=<span style="color: #FF0000;">&quot;get_item&quot;</span><span class="br0">&#41;</span></span>
<span style="color: #0000ff;">async</span> <span style="color: #0000ff;">def</span> read_item<span class="br0">&#40;</span>item_id: int<span class="br0">&#41;</span>:
    <span style="color: #FF0000;">&quot;&quot;&quot;</span>
<span style="color: #FF0000;">&nbsp; &nbsp; Get a specific item by its ID.</span>
<span style="color: #FF0000;">&nbsp; &nbsp; Raises a 404 error if the item does not exist.</span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span>
    <span style="color: #0000ff;">if</span> item_id <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span> items_db:
        <span style="color: #0000ff;">raise</span> HTTPException<span class="br0">&#40;</span>status_code=<span style="color: #cc66cc;">404</span>, detail=<span style="color: #FF0000;">&quot;Item not found&quot;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> items_db<span class="br0">&#91;</span>item_id<span class="br0">&#93;</span>
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span> == <span style="color: #FF0000;">&quot;__main__&quot;</span>:
    <span style="color: #0000ff;">import</span> uvicorn
    uvicorn.run<span class="br0">&#40;</span>app, host=<span style="color: #FF0000;">&quot;127.0.0.1&quot;</span>, port=PORT<span class="br0">&#41;</span></pre></td></tr></table></code><hr />
</div>Pour faire le lien avec fastmcp, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">operation_id</span> est en fait le nom de la fonction (tool) mcp transmise à l'ia<br />
<br />
<br />
----------<br />
<br />
À suivre... L'IA étant pilotable par la voix (la voix générant simplement un prompt texte), verrons-nous demain une IA intégrée à notre OS, où tout sera contrôlable vocalement ?</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f168/autres-langages/python/contribuez/">Contribuez</category>
			<dc:creator>papajoker</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2176561/autres-langages/python/contribuez/mcp-nouvelle-hype/</guid>
		</item>
	</channel>
</rss>
