8.4 KiB
02 - Cliente MCP com Interpretação Inteligente
🎯 Objetivo
Gerar o arquivo mcp_client.py que implementa um cliente MCP com integração ao LLM, capaz de interpretar operações matemáticas solicitadas em linguagem natural e executá-las através do servidor MCP.
📋 Contexto
O cliente MCP conecta-se ao servidor via stdio, integra-se com um LLM (via API compatível com OpenAI) para interpretar as intenções do usuário, e executa tool calls apropriados. O sistema deve entender linguagem natural como "Eu tenho 25 maçãs e ganhei mais 13".
🔧 Especificações Técnicas
- Framework: MCP Client, OpenAI SDK
- Comunicação: stdio com servidor MCP
- LLM: API compatível com OpenAI
- Interface: Chat interativo via terminal
- Histórico: Mantém contexto da conversação
💬 PROMPT COMPLETO
Você é um desenvolvedor Python especialista em AI Agents e Model Context Protocol (MCP).
TAREFA:
Crie um arquivo Python chamado "mcp_client.py" que implemente um cliente MCP com integração a um LLM para criar uma calculadora inteligente com interface de chat.
REQUISITOS FUNCIONAIS:
1. CONEXÃO COM SERVIDOR MCP:
- Conectar ao servidor via stdio (subprocess)
- Comando: python3, args: ["mcp_server.py"]
- Usar StdioServerParameters e stdio_client
- Inicializar sessão e obter lista de ferramentas disponíveis
2. INTEGRAÇÃO COM LLM:
- API Base URL: "https://api.xptoai.com.br/genai/grokcode/v1"
- API Key: "biasb986lk657fsdv6d3543vs5b65s7v373sd321vsdv4sdv34bv3f4hb5f4j6mn546tu"
- Modelo: "grok-2-1212"
- Usar OpenAI SDK (compatível)
3. INTERPRETAÇÃO INTELIGENTE:
O LLM deve ser instruído (via system prompt) a:
- Interpretar qual operação matemática o usuário deseja
- Identificar os dois números envolvidos na conversa
- Chamar a ferramenta apropriada automaticamente
- Apresentar resultados de forma amigável
4. SYSTEM PROMPT (incluir no código):
"""
Você é um assistente matemático inteligente que ajuda usuários a realizar operações matemáticas.
Você tem acesso a 4 ferramentas: soma, subtração, multiplicação e divisão.
Seu objetivo é:
1. Interpretar qual operação matemática o usuário deseja realizar através da conversa natural
2. Identificar os dois números que o usuário quer usar
3. Chamar a ferramenta apropriada com os números corretos
4. Apresentar o resultado de forma clara e amigável
Exemplos de interpretação:
- 'Quanto é 5 mais 3?' → usar ferramenta 'soma' com 5 e 3
- 'Subtraia 10 de 25' → usar ferramenta 'subtracao' com 25 e 10
- 'Multiplique 7 por 8' → usar ferramenta 'multiplicacao' com 7 e 8
- 'Divida 20 por 4' → usar ferramenta 'divisao' com 20 e 4
- '15 menos 7' → usar ferramenta 'subtracao' com 15 e 7
Se o usuário pedir uma operação que não está disponível (como potência, raiz quadrada, etc.),
informe educadamente que apenas as 4 operações básicas estão implementadas.
Se houver erro na execução (como divisão por zero), explique o erro de forma educada e sugira uma alternativa.
Seja conversacional, natural e prestativo na interação.
"""
5. CLASSE MCPChatClient:
Métodos necessários:
- __init__(): Inicializar OpenAI client, session, tools, histórico
- connect_to_server(): Conectar ao servidor MCP via stdio
- format_tools_for_openai(): Converter ferramentas MCP para formato OpenAI
- call_mcp_tool(tool_name, arguments): Executar ferramenta no servidor
- chat(user_message): Processar mensagem e retornar resposta
- close(): Fechar conexões
6. FLUXO DO MÉTODO chat():
a. Adicionar mensagem do usuário ao histórico
b. Preparar mensagens (system prompt + histórico)
c. Chamar LLM com ferramentas disponíveis
d. Se LLM retornar tool_calls:
- Executar cada tool call no servidor MCP
- Adicionar resultados ao histórico
- Fazer nova chamada ao LLM com os resultados
- Retornar resposta final generativa
e. Se não houver tool_calls:
- Retornar resposta textual diretamente
7. FEEDBACK VISUAL:
Ao executar ferramentas, imprimir:
🔧 Executando ferramenta: nome_da_ferramenta Argumentos: {argumentos} ✓ Resultado: valor (se sucesso) ⚠️ Erro: mensagem (se erro)
8. INTERFACE DE CHAT:
- Função main() com loop interativo
- Prompt: "👤 Você: "
- Resposta: "🤖 Assistente: "
- Comando "sair" para encerrar
- Tratamento de KeyboardInterrupt (Ctrl+C)
9. GERENCIAMENTO DE CONTEXTO:
- Usar context managers assíncronos corretamente
- stdio_context = stdio_client(server_params)
- await stdio_context.__aenter__()
- await stdio_context.__aexit__() no close()
REQUISITOS TÉCNICOS:
- Imports: asyncio, json, typing.Optional, mcp, mcp.client.stdio, openai
- Usar async/await para todas operações assíncronas
- Manter histórico de conversação (lista de dicts)
- Shebang: #!/usr/bin/env python3
- Docstrings em português
ESTRUTURA DO CÓDIGO:
1. Imports e constantes (API_BASE_URL, API_KEY, MODEL_NAME)
2. Classe MCPChatClient com todos os métodos
3. Função async main() com loop de chat
4. Bloco if __name__ == "__main__"
EXEMPLO DE CONVERSÃO DE FERRAMENTAS:
```python
def format_tools_for_openai(self) -> list:
openai_tools = []
for tool in self.available_tools:
openai_tools.append({
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"parameters": tool.inputSchema
}
})
return openai_tools
Por favor, gere o código completo do arquivo mcp_client.py seguindo todas estas especificações.
---
## ✅ Resultado Esperado
Você deve receber um arquivo Python completo (~290 linhas) com:
**Estrutura:**
```python
#!/usr/bin/env python3
"""
Cliente MCP que interage com o usuário via chat usando LLM...
"""
import asyncio
import json
from typing import Optional
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from openai import OpenAI
# Configuração do LLM
API_BASE_URL = "https://api.xptoai.com.br/genai/grokcode/v1"
API_KEY = "biasb986lk657fsdv6d3543vs5b65s7v373sd321vsdv4sdv34bv3f4hb5f4j6mn546tu"
MODEL_NAME = "grok-2-1212"
class MCPChatClient:
# Métodos...
async def main():
# Loop de chat...
if __name__ == "__main__":
asyncio.run(main())
Características:
- ✅ Classe MCPChatClient completa
- ✅ Conexão com servidor MCP via stdio
- ✅ Integração com OpenAI SDK
- ✅ System prompt para interpretação inteligente
- ✅ Conversão de ferramentas MCP para formato OpenAI
- ✅ Execução de tool calls
- ✅ Feedback visual (✓ e ⚠️)
- ✅ Loop de chat interativo
- ✅ Tratamento de erros
🧪 Como Validar
Salve o código gerado em mcp_project/mcp_client.py e verifique:
# 1. Verificar sintaxe Python
python -m py_compile mcp_client.py
# 2. Verificar imports
python -c "import ast; ast.parse(open('mcp_client.py').read())"
# 3. Contar linhas
wc -l mcp_client.py
# 4. Verificar se constantes estão definidas
grep -E "API_BASE_URL|API_KEY|MODEL_NAME" mcp_client.py
Saída esperada:
294 mcp_client.py
Verificação manual:
- Arquivo tem shebang
#!/usr/bin/env python3 - Constantes API_BASE_URL, API_KEY, MODEL_NAME definidas
- Classe MCPChatClient presente
- Método connect_to_server() implementado
- Método chat() com lógica de tool calls
- System prompt detalhado incluído
- Função main() com loop interativo
- Feedback visual com emojis (🔧, ✓, ⚠️)
📝 Notas
- O cliente inicia o servidor automaticamente via subprocess
- A API key está hardcoded (em produção, use variáveis de ambiente)
- O histórico de conversação permite contexto entre mensagens
- O LLM decide quando chamar ferramentas baseado no system prompt
🔧 Troubleshooting
Erro: "Module 'openai' not found"
- Solução: Instale as dependências (será feito no prompt 04)
Erro: "Connection refused" ao conectar servidor
- Verifique se mcp_server.py existe no mesmo diretório
- Confirme que o comando no StdioServerParameters está correto
LLM não chama ferramentas:
- Verifique se o system prompt está correto
- Confirme que format_tools_for_openai() retorna formato válido
➡️ Próximo Passo
Após validar o cliente, prossiga para: 03-TESTS.md