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 |