MÓDULO 3.6

📦 Adicionando Resources

Aprenda a expor dados como Resources — permitindo que o modelo acesse informações sem executar ações.

6
Tópicos
30
Minutos
Intermediário
Nível
Prático
Tipo
1

📦 O Que São Resources no Código

Até agora trabalhamos com tools — funções que executam ações e retornam resultados. Agora vamos conhecer os resources: dados que o modelo pode ler, mas não modificar. Enquanto tools são "verbos" (fazer algo), resources são "substantivos" (acessar algo). Essa distinção é fundamental na arquitetura MCP.

💎 Conceito Principal

No FastMCP, um resource é criado com o decorator @mcp.resource(), que recebe uma URI como identificador único:

@mcp.resource("config://app")

def get_config() -> str:

"""Retorna as configurações do app."""

return "versão: 1.0, modo: produção"

A diferença fundamental: tools executam ações (enviar email, calcular, consultar API), enquanto resources expõem dados (configurações, documentação, status). O modelo lê resources para obter contexto, mas não pode usá-los para modificar nada.

💡 Dica Prática

Pense em resources como arquivos em um sistema de arquivos virtual. Cada resource tem um endereço (URI) e um conteúdo. O modelo pode "abrir e ler" esses arquivos, mas não pode "escrever" neles. Use resources para tudo que o modelo precisa saber mas não precisa fazer: configurações, documentação, constantes, dados de referência.

❌ Evitar
  • Usar tools quando resources bastam
  • Colocar ações (side effects) em resources
  • Expor dados sensíveis sem controle
  • Misturar dados e ações no mesmo componente
✅ Fazer
  • Usar resources para dados de leitura
  • Manter resources como funções puras (sem efeitos)
  • Dar URIs descritivas e organizadas
  • Separar claramente tools de resources
2

📄 Resources Estáticos

Resources estáticos retornam dados fixos que não mudam entre chamadas — configurações do aplicativo, documentação, constantes, regras de negócio. São os mais simples de implementar e os mais comuns em servers MCP. O modelo pode acessá-los a qualquer momento para obter informações de referência.

💎 Conceito Principal

@mcp.resource("config://app")

def get_app_config() -> str:

"""Configurações do aplicativo."""

return """

Aplicativo: Meu Server MCP

Versão: 1.0.0

Ambiente: produção

Max conexões: 100

Timeout padrão: 30s

"""


@mcp.resource("docs://ajuda")

def get_help() -> str:

"""Documentação de ajuda."""

return "Use as tools disponíveis para calcular e consultar clima."

💡 Dica Prática

Resources estáticos são ótimos para dar contexto ao modelo. Por exemplo, um resource com as regras de negócio da empresa permite que o modelo responda perguntas sobre políticas sem precisar de uma tool. Um resource com a documentação do sistema ajuda o modelo a guiar o usuário. Pense nos resources como o "manual de instruções" que o modelo pode consultar.

3

🔄 Resources Dinâmicos

Diferente dos estáticos, resources dinâmicos retornam dados que mudam a cada acesso. A data e hora atual, o status do sistema, contadores, dados de monitoramento — tudo isso é dinâmico. A função do resource é chamada cada vez que o modelo acessa aquele URI, garantindo dados sempre atualizados.

💎 Conceito Principal

from datetime import datetime


@mcp.resource("status://hora-atual")

def get_hora_atual() -> str:

"""Retorna a data e hora atual do servidor."""

agora = datetime.now()

return f"Data e hora: {agora.strftime('%d/%m/%Y %H:%M:%S')}"


@mcp.resource("status://sistema")

def get_status_sistema() -> str:

"""Retorna o status atual do sistema."""

import platform

return (

f"SO: {platform.system()}\n"

f"Python: {platform.python_version()}\n"

f"Hora: {datetime.now().strftime('%H:%M:%S')}"

)

📋 Fluxo de acesso a um resource dinâmico
Passo 1

O modelo decide que precisa de um dado (ex: hora atual) e solicita o resource pela URI.

Passo 2

O FastMCP recebe a requisição e executa a função associada àquela URI naquele momento.

Passo 3

A função retorna o dado atualizado (ex: "14:35:22") e o modelo usa na sua resposta ao usuário.

📊 Dados e Pesquisa

Resources dinâmicos são particularmente úteis em cenários de monitoramento e observabilidade. Um server MCP pode expor resources com métricas do sistema, status de serviços, logs recentes e dashboards de saúde — permitindo que o modelo responda perguntas como "Como está a saúde do sistema?" ou "Qual o uso de memória atual?" sem precisar de tools específicas.

4

🔗 URI Schemes

Cada resource é identificado por uma URI (Uniform Resource Identifier) — um endereço único que segue o padrão tipo://caminho. O "tipo" (scheme) indica a categoria do dado e o "caminho" identifica o recurso específico. URIs bem organizadas facilitam a descoberta e o uso dos resources pelo modelo.

💎 Conceito Principal

O formato da URI é scheme://path, onde o scheme indica o tipo de dado:

config://settings → configurações do sistema
file://readme.md → conteúdo de um arquivo
db://users → dados de uma tabela
status://health → status de saúde do sistema
docs://api/endpoints → documentação de endpoints

A URI identifica unicamente cada resource. Duas URIs diferentes sempre apontam para resources diferentes. Organize suas URIs de forma lógica e consistente.

❌ URIs confusas
  • data://x1 — sem significado
  • resource://get_stuff — verbo em resource
  • abc://123 — scheme sem semântica
  • config://ConfiguraçõesDoApp — acentos e maiúsculas
✅ URIs claras
  • config://app — claro e conciso
  • status://health — semântica clara
  • docs://api/endpoints — hierárquico
  • db://users/schema — específico
5

📋 Listando Resources

O protocolo MCP permite que o client liste todos os resources disponíveis no server. Isso é feito automaticamente pelo FastMCP — todos os resources registrados com @mcp.resource() aparecem na listagem. Além disso, o MCP suporta resource templates — resources parametrizados onde parte da URI é variável.

💎 Conceito Principal

Resource templates permitem criar resources parametrizados. O FastMCP detecta parâmetros na URI automaticamente:

@mcp.resource("users://{user_id}/profile")

def get_user_profile(user_id: str) -> str:

"""Retorna o perfil de um usuário."""

return f"Perfil do usuário {user_id}"

O {user_id} na URI se torna um parâmetro. O modelo pode acessar users://alice/profile ou users://bob/profile — cada um retornando dados diferentes. O FastMCP registra isso como um resource template na listagem.

💡 Dica Prática

A listagem de resources funciona como um "catálogo" do server. O client MCP pode pedir a lista completa de resources antes de usar qualquer um deles. Isso permite que o modelo saiba exatamente quais dados estão disponíveis e como acessá-los. Mantenha suas URIs e descrições (docstrings) organizadas para facilitar a descoberta.

🚨 Alerta

Cuidado com o que você expõe como resource. Todos os resources registrados ficam visíveis para o client MCP. Nunca exponha dados sensíveis como senhas, tokens de API, chaves privadas ou dados pessoais sem proteção adequada. Trate resources como endpoints públicos — se um dado não deve ser lido pelo modelo, não crie um resource para ele.

6

🧪 Testando Resources

Vamos testar os resources que criamos no Claude Desktop. O modelo deve ser capaz de listar os resources disponíveis e ler o conteúdo de cada um. Diferente das tools (que o modelo chama ativamente), resources são dados que o modelo pode acessar quando precisa de contexto para responder uma pergunta.

💎 Conceito Principal

Teste seus resources com perguntas que motivem o modelo a buscá-los:

  • 1. "Quais configurações estão disponíveis?" — o modelo deve ler o resource config://app.
  • 2. "Qual a data e hora atual?" — o modelo deve ler status://hora-atual e retornar o valor dinâmico.
  • 3. "Qual o status do sistema?" — o modelo deve ler status://sistema.
  • 4. "Me mostre a documentação de ajuda." — o modelo deve ler docs://ajuda.
💡 Dica Prática

Uma boa prática é criar um resource docs://ajuda em todo server MCP que explique quais tools e resources estão disponíveis. Quando o usuário pergunta "O que você pode fazer?", o modelo lê esse resource e apresenta as capacidades do server de forma organizada. É como criar um menu de ajuda integrado.

📋 Sequência de testes recomendada
Teste 1 — Resource estático

Pergunte sobre configurações. Verifique que o modelo retorna os dados fixos do resource config://app.

Teste 2 — Resource dinâmico

Pergunte a hora duas vezes com intervalo. Verifique que os valores mudam entre as consultas.

Teste 3 — Combinando tools + resources

Faça perguntas que usem tanto tools quanto resources. Ex: "Consulte o clima e me diga a hora atual."

📝 Resumo do Módulo

  • Resources são dados que o modelo lê — diferentes de tools que executam ações.
  • Resources estáticos retornam dados fixos: configurações, documentação, constantes.
  • Resources dinâmicos retornam dados atualizados a cada acesso: hora, status, métricas.
  • URIs seguem o padrão scheme://path e devem ser claras, organizadas e descritivas.
  • Resource templates permitem resources parametrizados com variáveis na URI.
  • Resources e tools se complementam — dados de contexto + ações formam um server completo.

Próximo Módulo: 3.7 — Adicionando Prompts