<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo de mcp - Ramon Domingos Blog</title>
	<atom:link href="https://ramondomingos.com.br/tag/mcp/feed/" rel="self" type="application/rss+xml" />
	<link>https://ramondomingos.com.br/tag/mcp/</link>
	<description>Conteúdo sobre tecnologia e engenharia de software.</description>
	<lastBuildDate>Wed, 22 Apr 2026 22:21:23 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://ramondomingos.com.br/wp-content/uploads/2023/09/cropped-Logotipo_bold_minimalista_amarelo_para_blog__1_-removebg-preview-32x32.png</url>
	<title>Arquivo de mcp - Ramon Domingos Blog</title>
	<link>https://ramondomingos.com.br/tag/mcp/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Criando seu primeiro servidor FastMCP do zero</title>
		<link>https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/</link>
					<comments>https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 21:12:07 +0000</pubDate>
				<category><![CDATA[FastMCP]]></category>
		<category><![CDATA[fastmcp]]></category>
		<category><![CDATA[mcp]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=313</guid>

					<description><![CDATA[<p>Nos dois posts anteriores entendemos o que é o Model Context Protocol e conhecemos o FastMCP, a biblioteca que simplifica a criação de servidores MCP em Python. Agora é hora de colocar a mão na massa. Post 1: O que é MCP e por que ele importa para o futuro dos agentes de IA?Post 2:&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/">Criando seu primeiro servidor FastMCP do zero</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Nos dois posts anteriores entendemos o que é o <strong>Model Context Protocol</strong> e conhecemos o <strong>FastMCP</strong>, a biblioteca que simplifica a criação de servidores MCP em Python. Agora é hora de colocar a mão na massa.</p>



<blockquote class="wp-block-quote has-cyan-bluish-gray-background-color has-background is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-small-font-size">Post 1: <a href="https://ramondomingos.com.br/o-que-e-mcp-e-por-que-ele-importa-para-o-futuro-dos-agentes-de-ia/">O que é MCP e por que ele importa para o futuro dos agentes de IA?</a><br>Post 2: <a href="https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/">FastMCP: a forma mais rápida de criar servidores MCP em Python</a></p>
</blockquote>



<p>Neste post vamos construir um servidor FastMCP real, do zero, que consulta endereços a partir de um CEP usando a API pública <strong>ViaCEP</strong> — sem chave de API, sem autenticação, pronto para usar.</p>



<p>Ao final, você vai conectar esse servidor ao <strong>Claude Desktop</strong> e perguntar diretamente ao Claude: <em>&#8220;Qual o endereço do CEP 01310-100?&#8221;</em> — e ele vai responder usando a sua tool.</p>



<h2 class="wp-block-heading">Pré-requisitos</h2>



<p>Antes de começar, certifique-se de ter:</p>



<ul class="wp-block-list">
<li><strong>Python 3.10+</strong> instalado</li>



<li><strong>pip</strong> atualizado</li>



<li><strong>Claude Desktop</strong> instalado (<a href="https://claude.ai/download" target="_blank" rel="noreferrer noopener">download aqui</a>)</li>



<li>Terminal (usaremos o Terminal do Mac)</li>
</ul>



<p>Para verificar sua versão do Python:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>python3 --version</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">python3</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--version</span></span></code></pre></div>



<h2 class="wp-block-heading">1. Criando o ambiente do projeto</h2>



<p>Abra o Terminal e crie uma pasta para o projeto:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir mcp-cep-server
cd mcp-cep-server</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mcp-cep-server</span></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mcp-cep-server</span></span></code></pre></div>



<p>Crie e ative um ambiente virtual:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>python3 -m venv .venv
source .venv/bin/activate</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">python3</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-m</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">venv</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.venv</span></span>
<span class="line"><span style="color: #88C0D0">source</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.venv/bin/activate</span></span></code></pre></div>



<p>Você verá o prefixo <code>(.venv)</code> no terminal — isso confirma que o ambiente está ativo.</p>



<p>Instale as dependências:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pip install fastmcp httpx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">pip</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fastmcp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">httpx</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>fastmcp</strong> — o framework do servidor </li>



<li><strong>httpx</strong> — cliente HTTP moderno para consumir a API ViaCEP</li>
</ul>



<p>Você irá ver os logs, com o sucesso da instalação.</p>



<h2 class="wp-block-heading">2. Criando o servidor</h2>



<p>Crie o arquivo principal do servidor:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>touch server.py
# ou voce pode criar direto no vscode mesmo...</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">touch</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">server.py</span></span>
<span class="line"><span style="color: #616E88"># ou voce pode criar direto no vscode mesmo...</span></span></code></pre></div>



<p>Abra seu editor de código favorito e escreva o código:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import httpx
from fastmcp import FastMCP

mcp = FastMCP("servidor-cep")

@mcp.tool()
async def consultar_cep(cep: str) -> str:
    """
    Consulta o endereço completo a partir de um CEP brasileiro.
    Retorna rua, bairro, cidade e estado.
    """
    cep_limpo = cep.replace("-", "").replace(" ", "")

    if len(cep_limpo) != 8 or not cep_limpo.isdigit():
        return "CEP inválido. Informe um CEP com 8 dígitos numéricos."

    async with httpx.AsyncClient() as client:
        response = await client.get(
            f"https://viacep.com.br/ws/{cep_limpo}/json/"
        )

    if response.status_code != 200:
        return "Erro ao consultar o CEP. Tente novamente."

    dados = response.json()

    if "erro" in dados:
        return f"CEP {cep} não encontrado."

    return (
        f"CEP: {dados.get('cep', '-')}\n"
        f"Rua: {dados.get('logradouro', '-')}\n"
        f"Bairro: {dados.get('bairro', '-')}\n"
        f"Cidade: {dados.get('localidade', '-')}\n"
        f"Estado: {dados.get('uf', '-')}"
    )

if __name__ == "__main__":
    mcp.run()</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> httpx</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastmcp </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastMCP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">mcp </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastMCP</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">servidor-cep</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">tool</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">consultar_cep</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">cep</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">-&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #A3BE8C">    Consulta o endereço completo a partir de um CEP brasileiro.</span></span>
<span class="line"><span style="color: #A3BE8C">    Retorna rua, bairro, cidade e estado.</span></span>
<span class="line"><span style="color: #A3BE8C">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    cep_limpo </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> cep</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">replace</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #ECEFF4">).</span><span style="color: #88C0D0">replace</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">len</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">cep_limpo</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">or</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">not</span><span style="color: #D8DEE9FF"> cep_limpo</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">isdigit</span><span style="color: #ECEFF4">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">CEP inválido. Informe um CEP com 8 dígitos numéricos.</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> httpx</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">AsyncClient</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> client</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> client</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;https://viacep.com.br/ws/</span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">cep_limpo</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">/json/&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">status_code </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro ao consultar o CEP. Tente novamente.</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    dados </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> response</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">json</span><span style="color: #ECEFF4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">erro</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> dados</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;CEP </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">cep</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> não encontrado.&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;CEP: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">dados</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">cep</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #EBCB8B">}\n</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Rua: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">dados</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">logradouro</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #EBCB8B">}\n</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Bairro: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">dados</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">bairro</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #EBCB8B">}\n</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Cidade: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">dados</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">localidade</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #EBCB8B">}\n</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Estado: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">dados</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">uf</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">-</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> __name__ </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">__main__</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    mcp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">run</span><span style="color: #ECEFF4">()</span></span></code></pre></div>



<h3 class="wp-block-heading">O que esse código faz?</h3>



<ul class="wp-block-list">
<li><strong>Linha 4:</strong> instancia o servidor FastMCP com o nome <code>"servidor-cep"</code></li>



<li><strong>Linha 6:</strong> decora a função com <code>@mcp.tool()</code> — o FastMCP registra automaticamente a tool no protocolo</li>



<li><strong>Linhas 7-10:</strong> a docstring vira a descrição da tool que o LLM vai ler para decidir quando usá-la</li>



<li><strong>Linhas 12-14:</strong> limpa o CEP removendo traços e espaços, e valida o formato</li>



<li><strong>Linhas 16-20:</strong> faz a requisição HTTP para a API ViaCEP de forma assíncrona</li>



<li><strong>Linhas 22-30:</strong> trata erros e formata a resposta</li>
</ul>



<h2 class="wp-block-heading">3. Testando o servidor localmente</h2>



<p>Antes de conectar ao Claude Desktop, vamos garantir que o servidor está funcionando. O FastMCP tem um modo de inspeção embutido:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>fastmcp dev inspector  server.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">fastmcp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">inspector</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">server.py</span></span></code></pre></div>



<p>Esse comando sobe o servidor e abre o <strong>MCP Inspector</strong> no navegador, uma interface visual onde você pode chamar suas tools manualmente.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="718" src="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1024x718.png" alt="" class="wp-image-316" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1024x718.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-300x210.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-768x539.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1536x1078.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-2048x1437.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</blockquote>



<p>No Inspector:</p>



<ol class="wp-block-list">
<li>Clique em <strong>&#8220;Tools&#8221;</strong> no menu lateral</li>



<li>Selecione <strong>&#8220;consultar_cep&#8221;</strong></li>



<li>Preencha o campo <code>cep</code> com <code>01310-100</code></li>



<li>Clique em <strong>&#8220;Run&#8221;</strong></li>
</ol>



<p>Você deve ver a resposta:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="637" src="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1-1024x637.png" alt="" class="wp-image-317" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1-1024x637.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1-300x187.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1-768x478.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-1.png 1384w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</blockquote>



<h2 class="wp-block-heading">4. Conectando ao Claude Desktop</h2>



<p>Agora vamos conectar o servidor ao Claude Desktop para que o Claude possa usar a tool diretamente nas conversas.</p>



<h3 class="wp-block-heading">4.1 Localize o arquivo de configuração</h3>



<p>O Claude Desktop usa um arquivo JSON para registrar servidores MCP. No Mac, ele fica em:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>~/Library/Application Support/Claude/claude_desktop_config.json  </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9FF">Library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Application Support</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Claude</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">claude_desktop_config</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">json  </span></span></code></pre></div>



<pre class="wp-block-code"><code></code></pre>



<p>Abra o Terminal e edite o arquivo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>open -a TextEdit ~/Library/Application\ Support/Claude/claude_desktop_config.json</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">open</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">a TextEdit </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9FF">Library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Application</span><span style="color: #ECEFF4">\</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Support/Claude/claude_desktop_config.json</span></span></code></pre></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Se o arquivo não existir, crie-o com o comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir -p ~/Library/Application\ Support/Claude
touch ~/Library/Application\ Support/Claude/claude_desktop_config.json</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">mkdir </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">p </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9FF">Library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Application</span><span style="color: #ECEFF4">\</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Support/Claude</span></span>
<span class="line"><span style="color: #D8DEE9FF">touch </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9FF">Library</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Application</span><span style="color: #ECEFF4">\</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Support/Claude/claude_desktop_config.json</span></span></code></pre></div>
</blockquote>



<h3 class="wp-block-heading">4.2 Adicione o servidor</h3>



<p>Cole o seguinte conteúdo no arquivo, ajustando o caminho para o seu projeto:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "mcpServers": {
    "servidor-cep": {
      "command": "/caminho/para/seu/projeto/mcp-cep-server/.venv/bin/python",
      "args": &#91;
        "/caminho/para/seu/projeto/mcp-cep-server/server.py"
      &#93;
    }
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">mcpServers</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">servidor-cep</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">command</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/caminho/para/seu/projeto/mcp-cep-server/.venv/bin/python</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">args</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/caminho/para/seu/projeto/mcp-cep-server/server.py</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p>Para descobrir o caminho correto do Python no seu ambiente virtual, rode:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>which python</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">which</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">python</span></span></code></pre></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p></p>
</blockquote>



<h3 class="wp-block-heading">4.3 Reinicie o Claude Desktop</h3>



<p>Feche e abra o Claude Desktop novamente. Após reiniciar, você verá um ícone de <strong>conectore </strong> na interface de chat — isso indica que tools MCP estão disponíveis.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-full"><img decoding="async" width="897" height="612" src="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-2.png" alt="" class="wp-image-320" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-2.png 897w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-2-300x205.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-2-768x524.png 768w" sizes="(max-width: 897px) 100vw, 897px" /></figure>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. Testando no Claude Desktop</h2>



<p>Com tudo configurado, abra uma nova conversa no Claude Desktop e pergunte:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Qual o endereço do CEP 01310-100?&#8221;</em></p>
</blockquote>



<p>O Claude vai identificar que tem uma tool disponível para isso, vai chamá-la automaticamente e retornar a resposta formatada.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="522" src="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3-1024x522.png" alt="" class="wp-image-321" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3-1024x522.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3-300x153.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3-768x392.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3-1536x783.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-3.png 1898w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4f8.png" alt="📸" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Print da conversa no Claude Desktop com a resposta como cep da Avenida Paulista</em></figcaption></figure>
</blockquote>



<p>Você também pode testar casos de erro:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>&#8220;Consulta o CEP 00000-000 pra mim&#8221;</em></p>
</blockquote>



<p>E o Claude vai retornar a mensagem de CEP não encontrado — exatamente como programamos.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="698" src="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5-1024x698.png" alt="" class="wp-image-323" srcset="https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5-1024x698.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5-300x204.png 300w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5-768x524.png 768w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5-1536x1047.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2026/04/image-5.png 1558w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Retorno no Claude desktop, de um cep inválido.</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Em menos de 40 linhas de Python, criamos um servidor MCP real que:</p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Expõe uma tool funcional via protocolo MCP</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Consome uma API externa de forma assíncrona</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Valida entradas e trata erros</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Está conectado ao Claude Desktop e pronto para uso</li>
</ul>



<p>Isso é o poder do MCP na prática: você escreve a lógica, o protocolo cuida da comunicação, e o LLM sabe exatamente quando e como usar sua tool.</p>



<h3 class="wp-block-heading">Próximos passos</h3>



<p>A partir daqui, as possibilidades são muitas:</p>



<ul class="wp-block-list">
<li>Adicionar mais tools ao mesmo servidor (ex: consulta de CNPJ, cotação de moeda)</li>



<li>Criar <strong>Resources</strong> para expor dados estáticos ou dinâmicos</li>



<li>Fazer deploy do servidor em modo <strong>SSE</strong> para acesso remoto</li>



<li>Publicar seu servidor no ecossistema MCP para que outros usem</li>
</ul>



<p>A série não para por aqui — fique ligado nos próximos posts.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><em>Conseguiu rodar? Compartilha um print nos comentários! Tem alguma dúvida? Me chama.</em></p>



<p></p>
<p>O post <a href="https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/">Criando seu primeiro servidor FastMCP do zero</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>FastMCP: a forma mais rápida de criar servidores MCP em Python</title>
		<link>https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/</link>
					<comments>https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 16:26:31 +0000</pubDate>
				<category><![CDATA[FastMCP]]></category>
		<category><![CDATA[fastmcp]]></category>
		<category><![CDATA[mcp]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=303</guid>

					<description><![CDATA[<p>No post anterior, entendemos o que é o Model Context Protocol e por que ele está se tornando o padrão da indústria para conectar LLMs ao mundo real. Se você ainda não leu, recomendo começar por lá. Agora vamos dar um passo à frente: conhecer o FastMCP, a biblioteca Python que torna a criação de&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/">FastMCP: a forma mais rápida de criar servidores MCP em Python</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>No <a href="https://ramondomingos.com.br/o-que-e-mcp-e-por-que-ele-importa-para-o-futuro-dos-agentes-de-ia/">post anterior</a>, entendemos o que é o <strong>Model Context Protocol</strong> e por que ele está se tornando o padrão da indústria para conectar LLMs ao mundo real. Se você ainda não leu, recomendo começar por lá.</p>



<p>Agora vamos dar um passo à frente: conhecer o <strong>FastMCP</strong>, a biblioteca Python que torna a criação de servidores MCP algo surpreendentemente simples — e entender por que ela existe.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O SDK oficial do MCP</h2>



<p>A Anthropic disponibilizou um SDK oficial em Python para criar servidores MCP. Ele funciona, é completo e segue o protocolo à risca. Mas tem um problema: é <strong>verboso</strong>.</p>



<p>Para criar um servidor com uma única tool usando o SDK oficial, você escreve algo assim:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types
import asyncio

server = Server("meu-servidor")

@server.list_tools()
async def list_tools() -> list&#91;types.Tool&#93;:
    return [
        types.Tool(
            name="somar",
            description="Soma dois números",
            inputSchema={
                "type": "object",
                "properties": {
                    "a": {"type": "number"},
                    "b": {"type": "number"}
                },
                "required": &#91;"a", "b"&#93;
            }
        )
    ]

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "somar":
        return [types.TextContent(
            type="text",
            text=str(arguments&#91;"a"&#93; + arguments&#91;"b"&#93;)
        )]

async def main():
    async with stdio_server() as (read, write):
        await server.run(read, write, server.create_initialization_options())

asyncio.run(main())</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">Server</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">mcp</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">stdio</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">stdio_server</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">mcp</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">types</span></span>
<span class="line"><span style="color: #8FBCBB">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">asyncio</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">Server</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">meu-servidor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">@</span><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">list_tools</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">list_tools</span><span style="color: #D8DEE9FF">() -&gt; </span><span style="color: #8FBCBB">list</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #8FBCBB">types</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Tool</span><span style="color: #D8DEE9FF">&#93;:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">return</span><span style="color: #D8DEE9FF"> [</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">types</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Tool</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">name</span><span style="color: #D8DEE9FF">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">somar</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">description</span><span style="color: #D8DEE9FF">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Soma dois números</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">inputSchema</span><span style="color: #D8DEE9FF">=</span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">                &quot;</span><span style="color: #8FBCBB">type</span><span style="color: #D8DEE9FF">&quot;: &quot;</span><span style="color: #8FBCBB">object</span><span style="color: #D8DEE9FF">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                &quot;</span><span style="color: #8FBCBB">properties</span><span style="color: #D8DEE9FF">&quot;: {</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    &quot;</span><span style="color: #8FBCBB">a</span><span style="color: #D8DEE9FF">&quot;: {&quot;</span><span style="color: #8FBCBB">type</span><span style="color: #D8DEE9FF">&quot;: &quot;</span><span style="color: #8FBCBB">number</span><span style="color: #D8DEE9FF">&quot;</span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">b</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">&quot;</span><span style="color: #8FBCBB">type</span><span style="color: #D8DEE9FF">&quot;: &quot;</span><span style="color: #8FBCBB">number</span><span style="color: #D8DEE9FF">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">                }</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">required</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">b</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            }</span></span>
<span class="line"><span style="color: #D8DEE9FF">        )</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">@</span><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">call_tool</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">call_tool</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">name</span><span style="color: #D8DEE9FF">: </span><span style="color: #8FBCBB">str</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">arguments</span><span style="color: #D8DEE9FF">: </span><span style="color: #8FBCBB">dict</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #D8DEE9FF"> == </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">somar</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">return</span><span style="color: #D8DEE9FF"> [</span><span style="color: #8FBCBB">types</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">TextContent</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">type</span><span style="color: #D8DEE9FF">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">text</span><span style="color: #D8DEE9FF">=</span><span style="color: #8FBCBB">str</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">arguments</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">a</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93; + </span><span style="color: #8FBCBB">arguments</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">b</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">&#93;)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        )]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">main</span><span style="color: #D8DEE9FF">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">with</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">stdio_server</span><span style="color: #D8DEE9FF">() </span><span style="color: #8FBCBB">as</span><span style="color: #D8DEE9FF"> (</span><span style="color: #8FBCBB">read</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">write</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">run</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">read</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">write</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">server</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">create_initialization_options</span><span style="color: #D8DEE9FF">())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">asyncio</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">run</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">main</span><span style="color: #D8DEE9FF">())</span></span></code></pre></div>



<pre class="wp-block-code"><code><code>
</code></code></pre>



<p>Funciona. Mas são mais de 30 linhas para uma operação trivial. Imagine isso escalando para 10, 20 tools.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é o FastMCP?</h2>



<p>O <strong>FastMCP</strong> é uma biblioteca Python de alto nível construída <strong>sobre</strong> o SDK oficial do MCP. A inspiração é clara no nome: assim como o <strong>FastAPI</strong> simplificou a criação de APIs REST em Python, o FastMCP simplifica a criação de servidores MCP.</p>



<p>O mesmo servidor acima, com FastMCP:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from fastmcp import FastMCP

mcp = FastMCP("meu-servidor")

@mcp.tool()
def somar(a: float, b: float) -> float:
    """Soma dois números"""
    return a + b</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fastmcp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">FastMCP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">mcp</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">FastMCP</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">meu-servidor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">@</span><span style="color: #8FBCBB">mcp</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">tool</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">somar</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">a</span><span style="color: #D8DEE9FF">: </span><span style="color: #8FBCBB">float</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">b</span><span style="color: #D8DEE9FF">: </span><span style="color: #8FBCBB">float</span><span style="color: #D8DEE9FF">) -&gt; </span><span style="color: #8FBCBB">float</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span><span style="color: #A3BE8C">Soma dois números</span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">a</span><span style="color: #D8DEE9FF"> + </span><span style="color: #8FBCBB">b</span></span></code></pre></div>



<p><br><strong>4 linhas.</strong> Mesmo resultado. Mesmo protocolo. Mesma compatibilidade.</p>



<p>O FastMCP cuida de toda a camada de serialização, validação de schema, registro de tools e comunicação via JSON-RPC — você foca apenas na lógica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Por que FastMCP e não o SDK puro?</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th></th><th>SDK Oficial</th><th>FastMCP</th></tr></thead><tbody><tr><td>Linhas para 1 tool</td><td>~30</td><td>~4</td></tr><tr><td>Tipagem automática</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> via type hints</td></tr><tr><td>Validação de schema</td><td>Manual</td><td>Automática</td></tr><tr><td>Curva de aprendizado</td><td>Alta</td><td>Baixa</td></tr><tr><td>Compatibilidade MCP</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td></tr><tr><td>Ideal para</td><td>Controle total</td><td>Produtividade</td></tr></tbody></table></figure>



<p>A escolha não é binária — para casos que exigem controle fino do protocolo, o SDK oficial ainda faz sentido. Mas para a grande maioria dos projetos, o FastMCP é a escolha certa.</p>



<svg width="100%" viewBox="0 0 680 560" font-family="var(--font-sans)">
  <defs>
    <marker id="arr" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
      <path d="M0,0 L0,6 L8,3 z" fill="#aaa"/>
    </marker>
    <marker id="arr-teal" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
      <path d="M0,0 L0,6 L8,3 z" fill="#2ABFBF"/>
    </marker>
    <marker id="arr-green" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
      <path d="M0,0 L0,6 L8,3 z" fill="#4CAF50"/>
    </marker>
  </defs>

  <text x="340" y="26" text-anchor="middle" font-size="15" font-weight="500" fill="var(--color-text-primary)">SDK Oficial vs FastMCP — Como se relacionam</text>

  <!-- SDK OFICIAL - lado esquerdo -->
  <rect x="20" y="44" width="290" height="230" rx="14" fill="none" stroke="#E07B54" stroke-width="1.2"/>
  <text x="165" y="66" text-anchor="middle" font-size="12" font-weight="500" fill="#E07B54">SDK OFICIAL MCP</text>
  <text x="165" y="82" text-anchor="middle" font-size="10" fill="var(--color-text-tertiary)">Controle total · Verboso</text>

  <rect x="36" y="92" width="258" height="36" rx="6" fill="#E07B54" fill-opacity="0.1" stroke="#E07B54" stroke-width="0.6"/>
  <text x="165" y="106" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">list_tools() manual</text>
  <text x="165" y="120" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Schema JSON escrito à mão</text>

  <rect x="36" y="138" width="258" height="36" rx="6" fill="#E07B54" fill-opacity="0.1" stroke="#E07B54" stroke-width="0.6"/>
  <text x="165" y="152" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">call_tool() manual</text>
  <text x="165" y="166" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Serialização e tipos manuais</text>

  <rect x="36" y="184" width="258" height="36" rx="6" fill="#E07B54" fill-opacity="0.1" stroke="#E07B54" stroke-width="0.6"/>
  <text x="165" y="198" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">stdio_server() + asyncio</text>
  <text x="165" y="212" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Boilerplate de inicialização</text>

  <rect x="36" y="230" width="258" height="32" rx="6" fill="#E07B54" fill-opacity="0.06" stroke="#E07B54" stroke-width="0.5" stroke-dasharray="4,3"/>
  <text x="165" y="250" text-anchor="middle" font-size="10" fill="var(--color-text-tertiary)">~30 linhas para 1 tool simples</text>

  <!-- Seta SDK -> FastMCP -->
  <path d="M310 159 L370 159" fill="none" stroke="#aaa" stroke-width="1.2" marker-end="url(#arr)"/>
  <text x="340" y="152" text-anchor="middle" font-size="10" fill="var(--color-text-tertiary)">abstrai</text>

  <!-- FASTMCP - lado direito -->
  <rect x="370" y="44" width="290" height="230" rx="14" fill="none" stroke="#2ABFBF" stroke-width="1.5"/>
  <text x="515" y="66" text-anchor="middle" font-size="12" font-weight="500" fill="#2ABFBF">FASTMCP</text>
  <text x="515" y="82" text-anchor="middle" font-size="10" fill="var(--color-text-tertiary)">Alto nível · Produtivo</text>

  <rect x="386" y="92" width="258" height="36" rx="6" fill="#2ABFBF" fill-opacity="0.12" stroke="#2ABFBF" stroke-width="0.8"/>
  <text x="515" y="106" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">@mcp.tool()</text>
  <text x="515" y="120" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Schema gerado via type hints</text>

  <rect x="386" y="138" width="258" height="36" rx="6" fill="#2ABFBF" fill-opacity="0.12" stroke="#2ABFBF" stroke-width="0.8"/>
  <text x="515" y="152" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">@mcp.resource()</text>
  <text x="515" y="166" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Fontes de dados via URI</text>

  <rect x="386" y="184" width="258" height="36" rx="6" fill="#2ABFBF" fill-opacity="0.12" stroke="#2ABFBF" stroke-width="0.8"/>
  <text x="515" y="198" text-anchor="middle" font-size="11" font-weight="500" fill="var(--color-text-primary)">@mcp.prompt()</text>
  <text x="515" y="212" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Templates reutilizáveis</text>

  <rect x="386" y="230" width="258" height="32" rx="6" fill="#2ABFBF" fill-opacity="0.06" stroke="#2ABFBF" stroke-width="0.5" stroke-dasharray="4,3"/>
  <text x="515" y="250" text-anchor="middle" font-size="10" fill="var(--color-text-tertiary)">~4 linhas para 1 tool simples</text>

  <!-- CAMADAS INTERNAS FASTMCP -->
  <rect x="20" y="294" width="640" height="200" rx="14" fill="none" stroke="#2ABFBF" stroke-width="1"/>
  <text x="340" y="316" text-anchor="middle" font-size="12" font-weight="500" fill="#2ABFBF">O que o FastMCP faz por baixo dos panos</text>

  <!-- Camada 1: seu código -->
  <rect x="36" y="326" width="608" height="44" rx="8" fill="#4A90D9" fill-opacity="0.12" stroke="#4A90D9" stroke-width="0.8"/>
  <text x="340" y="344" text-anchor="middle" font-size="12" font-weight="500" fill="var(--color-text-primary)">Seu código Python</text>
  <text x="340" y="360" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">def somar(a: float, b: float) -> float — type hints + docstring</text>

  <path d="M340 370 L340 382" fill="none" stroke="#aaa" stroke-width="1" marker-end="url(#arr)"/>

  <!-- Camada 2: FastMCP -->
  <rect x="36" y="382" width="608" height="44" rx="8" fill="#2ABFBF" fill-opacity="0.12" stroke="#2ABFBF" stroke-width="0.8"/>
  <text x="340" y="400" text-anchor="middle" font-size="12" font-weight="500" fill="var(--color-text-primary)">FastMCP</text>
  <text x="340" y="416" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Valida tipos · Gera schema JSON · Registra tool · Gerencia erros</text>

  <path d="M340 426 L340 438" fill="none" stroke="#aaa" stroke-width="1" marker-end="url(#arr)"/>

  <!-- Camada 3: SDK / Protocolo -->
  <rect x="36" y="438" width="608" height="44" rx="8" fill="#888" fill-opacity="0.1" stroke="#888" stroke-width="0.6"/>
  <text x="340" y="456" text-anchor="middle" font-size="12" font-weight="500" fill="var(--color-text-primary)">SDK Oficial MCP · JSON-RPC 2.0</text>
  <text x="340" y="472" text-anchor="middle" font-size="10" fill="var(--color-text-secondary)">Serialização · Transporte (stdio / SSE) · Protocolo</text>

  <text x="340" y="516" text-anchor="middle" font-size="11" fill="var(--color-text-tertiary)">FastMCP não substitui o SDK — ele senta em cima dele e remove o boilerplate.</text>
<text x="340" y="536" text-anchor="middle" font-size="11" fill="var(--color-text-tertiary)">Imagem gerada com auxilio de IA.</text>
</svg>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Arquitetura de um servidor FastMCP</h2>



<p>Um servidor FastMCP é composto pelos mesmos três conceitos do protocolo MCP:</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f527.png" alt="🔧" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Tools</h3>



<p>Funções Python decoradas com <code>@mcp.tool()</code>. O FastMCP lê os <strong>type hints</strong> e a <strong>docstring</strong> automaticamente para gerar o schema JSON da tool.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@mcp.tool()
def buscar_usuario(user_id: int) -> str:
    """Busca um usuário pelo ID"""
    # sua lógica aqui
    return f"Usuário {user_id}"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D08770">@</span><span style="color: #D8DEE9">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">tool</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #D8DEE9">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">buscar_usuario</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">user_id</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9FF"> str</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span><span style="color: #A3BE8C">Busca um usuário pelo ID</span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    # </span><span style="color: #D8DEE9">sua</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lógica</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">aqui</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Usuário {user_id}</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<pre class="wp-block-code"><code></code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e6.png" alt="📦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Resources</h3>



<p>Fontes de dados expostas via URI, decoradas com <code>@mcp.resource()</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@mcp.resource("dados://config")
def get_config() -> str:
    """Retorna a configuração atual"""
    return "versão: 1.0"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D08770">@</span><span style="color: #D8DEE9">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">resource</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dados://config</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">get_config</span><span style="color: #D8DEE9FF">() </span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9FF"> str</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span><span style="color: #A3BE8C">Retorna a configuração atual</span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">versão: 1.0</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<pre class="wp-block-code"><code>
</code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4ac.png" alt="💬" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Prompts</h3>



<p>Templates reutilizáveis decorados com <code>@mcp.prompt()</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@mcp.prompt()
def resumir(texto: str) -> str:
    """Prompt para resumir um texto"""
    return f"Resuma o seguinte texto em 3 bullets:\n\n{texto}"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">prompt</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">resumir</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">texto</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">-&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span><span style="color: #A3BE8C">Prompt para resumir um texto</span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Resuma o seguinte texto em 3 bullets:</span><span style="color: #EBCB8B">\n\n{</span><span style="color: #D8DEE9FF">texto</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span></span></code></pre></div>



<pre class="wp-block-code"><code></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Instalação e configuração do ambiente</h2>



<p>O FastMCP requer <strong>Python 3.10+</strong>. A instalação é simples:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Com pip
pip install fastmcp

# Com uv (recomendado)
uv add fastmcp</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Com pip</span></span>
<span class="line"><span style="color: #88C0D0">pip</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fastmcp</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Com uv (recomendado)</span></span>
<span class="line"><span style="color: #88C0D0">uv</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fastmcp</span></span></code></pre></div>



<pre class="wp-block-code"><code>
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Por que <code>uv</code>?</strong> O <code>uv</code> é um gerenciador de pacotes e ambientes Python extremamente rápido, escrito em Rust. É a ferramenta recomendada pelo ecossistema MCP para gerenciar dependências. Se ainda não usa, vale a pena conhecer.</p>
</blockquote>



<p>Para verificar a instalação:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>python -c "import fastmcp; print(fastmcp.__version__)"
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">python</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-c</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">import fastmcp; print(fastmcp.__version__)</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">A estrutura mínima de um servidor FastMCP</h2>



<p>Todo servidor FastMCP segue esta estrutura base:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from fastmcp import FastMCP

# 1. Instancia o servidor com um nome
mcp = FastMCP("nome-do-servidor")

# 2. Define tools, resources e prompts
@mcp.tool()
def minha_tool(parametro: str) -> str:
    """Descrição da tool — o LLM vai ler isso"""
    return f"Resultado: {parametro}"

# 3. Ponto de entrada
if __name__ == "__main__":
    mcp.run()</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastmcp </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastMCP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 1. Instancia o servidor com um nome</span></span>
<span class="line"><span style="color: #D8DEE9FF">mcp </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastMCP</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">nome-do-servidor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 2. Define tools, resources e prompts</span></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">mcp</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">tool</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">minha_tool</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">parametro</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">-&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;&quot;&quot;</span><span style="color: #A3BE8C">Descrição da tool — o LLM vai ler isso</span><span style="color: #ECEFF4">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Resultado: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">parametro</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 3. Ponto de entrada</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> __name__ </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">__main__</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    mcp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">run</span><span style="color: #ECEFF4">()</span></span></code></pre></div>



<p>Três partes: <strong>instância</strong>, <strong>definição</strong> e <strong>execução</strong>. Simples assim.</p>



<p><a href="https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/">No próximo post</a>, vamos pegar exatamente essa estrutura e transformar em um servidor funcional, rodando localmente e conectado a um cliente MCP real.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>O FastMCP remove a fricção entre a ideia e a implementação. Com ele, você não precisa conhecer os detalhes do protocolo JSON-RPC, nem gerenciar manualmente schemas e serialização — tudo isso é abstraído de forma elegante.</p>



<p>Se o MCP é a &#8220;tomada universal&#8221; dos agentes de IA, o FastMCP é o cabo que torna tudo mais fácil de conectar.</p>



<p><strong><a href="https://ramondomingos.com.br/criando-seu-primeiro-servidor-fastmcp-do-zero/">No próximo post</a></strong>, vamos colocar a mão na massa: criar um servidor FastMCP do zero, definir tools reais, rodar localmente e conectar ao Claude Desktop para ver tudo funcionando.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><em>Está acompanhando a série? Deixa um comentário ou compartilha com alguém que trabalha com IA!</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p></p>



<p></p>
<p>O post <a href="https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/">FastMCP: a forma mais rápida de criar servidores MCP em Python</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/fastmcp-a-forma-mais-rapida-de-criar-servidores-mcp-em-python/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
