🔌 Cap 10: Model Context Protocol (MCP) - Exemplos Práticos
Código executável em Python simulando o ciclo completo de handshake e chamada de ferramenta via especificação aberta MCP.
🗺️ Fluxo de Processamento
flowchart LR
HOST["Host: IDE / Agente"]
--> |"1. Handshake (initialize)"| SERVER["Servidor MCP (sqlite-mcp)"]
SERVER --> |"2. Capabilities & Tools List"| HOST
HOST --> |"3. Tool Call: query_sql('SELECT * FROM users')"| SERVER
SERVER --> |"4. Executa no SQLite em Sandbox"| DB[("Banco de Dados")]
DB --> SERVER
SERVER --> |"5. Resposta Estruturada JSON-RPC"| HOST ⚡
style HOST fill:#ede7f6,stroke:#512da8,stroke-width:2px
style SERVER fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style DB fill:#e1f5fe,stroke:#03a9f4,stroke-width:1.5px
📄 Código de Demonstração (mcp_server_demo.py)
import json
class ServidorMCPLite:
def __init__(self, name):
self.name = name
self.tools = {}
def registrar_ferramenta(self, nome, descricao, funcao):
self.tools[nome] = {"desc": descricao, "func": funcao}
def processar_requisicao(self, mensagem_str):
req = json.loads(mensagem_str)
metodo = req.get("method")
msg_id = req.get("id")
if metodo == "initialize":
return json.dumps({
"jsonrpc": "2.0",
"id": msg_id,
"result": {"serverInfo": {"name": self.name, "version": "1.0"}}
})
elif metodo == "tools/list":
lista = [
{"name": k, "description": v["desc"]}
for k, v in self.tools.items()
]
return json.dumps({
"jsonrpc": "2.0",
"id": msg_id,
"result": {"tools": lista}
})
elif metodo == "tools/call":
params = req.get("params", {})
nome = params.get("name")
args = params.get("arguments", {})
if nome in self.tools:
resultado = self.tools[nome]["func"](**args)
return json.dumps({
"jsonrpc": "2.0",
"id": msg_id,
"result": {"content": [{"type": "text", "text": str(resultado)}]}
})
return json.dumps({"jsonrpc": "2.0", "id": msg_id, "error": {"code": -32601, "message": "Method not found"}})
if __name__ == "__main__":
server = ServidorMCPLite("CalculadoraMCP")
server.registrar_ferramenta("somar", "Calcula a soma", lambda x, y: x + y)
# 1. Simulação de Inicialização
init_res = server.processar_requisicao('{"jsonrpc": "2.0", "id": 1, "method": "initialize"}')
print("Handshake:", init_res)
# 2. Simulação de Chamada de Ferramenta
call_res = server.processar_requisicao('{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "somar", "arguments": {"x": 15, "y": 27}}}')
print("Invocação MCP:", call_res)
🚀 Saída Esperada no Terminal / Execução
Handshake: {"jsonrpc": "2.0", "id": 1, "result": {"serverInfo": {"name": "CalculadoraMCP", "version": "1.0"}}}
Invocação MCP: {"jsonrpc": "2.0", "id": 2, "result": {"content": [{"type": "text", "text": "42"}]}}
🧭 Navegação Rápida
| 📖 Teoria | 📊 Slides | 🧠 Quiz | 💻 Exemplos | 🧩 Exercícios | | :— | :— | :— | :— | :— | | Ler Tópico | Ver Slides | Fazer Quiz | Ver Código | Praticar |