Compreendendo o problema que o MCP resolve
Para compreendermos o problema que o MCP resolve, vamos desmembrar suas partes, entender como funciona em um nível elevado, em um nível de apresentação, e como o implementamos e integramos em nossa arquitetura como um todo.
Primeiramente, é importante entender que o MCP foi criado para ajudar com as limitações de contexto mencionadas anteriormente. A primeira camada envolve a criação dos LLMs (Large Language Models, ou Modelos de Linguagem Grande). Inicialmente, utilizávamos esses modelos apenas para chat, fazendo perguntas e obtendo respostas diretamente, o que implicava em uma criação de texto fechada em um contexto específico da ferramenta, como o chat GPT, sem integração ou autonomia para interagir com sistemas externos. Era um sistema autocontido.
Evolução dos agentes de IA e a necessidade de autonomia
Posteriormente, surgiram os agentes de IA, que consistem em aproveitar a capacidade da ferramenta de gerar e interpretar texto, além de imagens e outras modalidades, para dar autonomia a essa ferramenta. Isso permite que ela pense em soluções diferentes, raciocine mais profundamente sobre problemas e discuta temas. No início, os agentes ainda estavam limitados a esse contexto, mas ganharam capacidades de discussão, argumentação e contraponto, que não existiam na primeira versão dos LLMs.
A seguir, surgiu a necessidade de dar autonomia ao LLM para interagir com outros sistemas. Desejamos ter um assistente pessoal que escreva código e o suba para o GitHub, programe eventos no calendário, cuide da agenda e envie lembretes. Para isso, precisamos de uma interface entre o GitHub, o calendário, o Excel da empresa, a folha de metas e o agente que processará e manipulará essas informações, permitindo autonomia. A grande diferença aqui é a autonomia dada a essas ferramentas baseadas em LLM.
Conectando o agente ao mundo externo através do MCP
Assim, temos a terceira camada, que é a conexão do agente com o mundo externo através do MCP. O servidor MCP é composto por um servidor, que possui o protocolo, e também por um cliente. Nesse sentido, é semelhante ao REST. Temos um cliente que faz uma solicitação ao servidor, o qual processa a solicitação e devolve a resposta. A arquitetura cliente-servidor continua funcionando aqui.
Em um cenário mais real, especialmente para empresas já operacionais com equipes estabelecidas, há outro tipo de arquitetura presente. Atualmente, já temos um backend em REST que atende ao cliente no front-end, além de dispositivos móveis e sistemas externos. Onde o MCP se encaixa nesse esquema? Podemos ter um servidor MCP que se conecta e faz a interface com o REST, funcionando como um wrapper ou adaptador para o agente de IA da API REST.
Funcionamento do MCP como adaptador e protocolo de comunicação
Dessa forma, nosso agente de IA se comunica com o backend MCP, que realiza a comunicação direta conosco. Ele, por meio das ferramentas que possui, interage com nosso REST, nosso sistema principal, onde ocorre a manipulação da informação. O MCP torna-se um adaptador, um interceptor no meio do caminho, permitindo que o agente de IA manipule nosso sistema, que originalmente foi desenvolvido em REST.
Então, esta é uma arquitetura que observamos ser muito comum atualmente. Do lado do nosso MCP, desse protocolo, temos o LLM Host. Nosso agente de IA terá dentro de si uma ferramenta que é o Client MCP. Assim, nosso agente, que é o LLM Host, terá um cliente internamente. O cliente fará a comunicação com o servidor, estando emparelhado com ele, e podemos ter vários clientes MCP conectados a vários servidores diferentes dentro do mesmo host.
Detalhando a comunicação via JSON RPC
Nosso servidor possui internamente as ferramentas e as APIs que pode invocar, permitindo um controle mais granular. Toda essa comunicação entre as partes do MCP será realizada por meio de entradas e saídas com JSON RPC. RPC não é um protocolo novo, já existe há bastante tempo, mas é diferente do REST, que não era tão utilizado. Na época dos microserviços, houve até uma discussão sobre o JRPC, um padrão do Google para reduzir o tráfego dentro dos clusters de Kubernetes ou Docker. Portanto, é um protocolo que já existe há bastante tempo.
O protocolo RPC se baseia em chamadas a funções, em vez de rotas. Temos chamadas a funções diretamente, e a ideia é que seja mais leve e ocupe menos largura de banda que o REST. Toda a comunicação entre nosso host, o cliente e o servidor será feita através de JSON RPC. São chamadas, pacotes JSON com a ferramenta que queremos invocar, a descrição e a saída. Este é o protocolo de entrada e saída entre as partes, principalmente entre o cliente e o servidor. O host chama o cliente diretamente, sendo uma ferramenta que está ali de forma direta, e o servidor já possui as funções que invocam as próprias ferramentas. Entre cliente e servidor, principalmente, teremos os inputs passando pela rede no formato JSON RPC, que também não é novo.
Resumindo o objetivo e funcionamento do MCP
Resumindo, o objetivo do MCP é fornecer ferramentas para que um agente execute ações, permitindo a ideia de autonomia. Seu foco é a integração com APIs, bases de dados, arquivos, e o que chamamos de ferramentas de forma ampla. Integração com nosso sistema, calendário, documentos no Google Drive, por exemplo. Atua como a mão de obra do agente, fornecendo as ferramentas para que ele possa atuar no mundo real. Esse é precisamente o problema que resolve: o agente atua no mundo real. É um tipo de fluxo determinístico. Uma vez que a chamada passa do cliente para o servidor MCP, o servidor MCP é código determinístico. Executará a tarefa, a função, exatamente como foi programada. Podemos passar parâmetros para essa função, assim como em uma rota REST, mas é uma chamada a uma função.
Nosso servidor MCP é determinístico, enquanto o agente e o LLM, na ponta, tendem a ser não determinísticos. Quando passamos o mesmo prompt, o mesmo input, obtemos respostas diferentes. Isso ocorre no lado do LLM, não no servidor MCP. Cada vez que passamos o mesmo input, obtemos a mesma resposta. A ideia é que seja determinístico, uma ferramenta programada para funcionar assim; não é um LLM em si. Seu alcance é de execução. Faremos uma chamada, ele executará, atuará, não pensará ou processará, nem refletirá. Realizará uma ação, chamará e executará algo. O MCP está nesse contexto. Esta é sua arquitetura, como a vemos encaixando nos sistemas já existentes hoje em dia, e para isso serve.
Criando o Alicom N8n
Agora, vamos criar nosso Alicom N8n.