Construindo um Servidor MCP em Produção com Laravel
Aviso sobre a versão da especificação: Este artigo tem como alvo a versão da especificação MCP 2025-11-25. O protocolo teve mudanças significativas entre as versões, os nomes dos campos do esquema da ferramenta e os códigos de erro mudaram em lançamentos anteriores. Verifique a string
protocolVersioncontra o registro de alterações da especificação oficial do MCP antes da implantação e em cada atualização da especificação.
A maioria dos desenvolvedores Laravel encontra o Protocolo de Contexto de Modelo do lado do cliente. Você adicionou um servidor ao Claude Desktop, seu IDE se conectou a ele e ferramentas apareceram. Você era o consumidor. Este artigo constrói o outro lado dessa relação: um servidor mcp laravel que agentes de IA externos podem descobrir, autenticar e invocar.
Este é parte da série mais ampla Arquitetura de IA Laravel que cobre as decisões de infraestrutura que tornam as integrações de IA sustentáveis em escala. Os exemplos de código usam um domínio fictício consistente ao longo (uma aplicação de base de conhecimento baseada em Laravel) para que cada trecho se componha em um sistema coerente em vez de uma coleção de fragmentos isolados.
O que é realmente o MCP (e o que não é)
O MCP, o Protocolo de Contexto de Modelo, é um protocolo JSON-RPC 2.0. Não é um padrão de API. Não é REST. Não é um framework. Ele define uma conversa estruturada entre duas partes: um cliente e um servidor. O cliente solicita uma lista de ferramentas disponíveis. O servidor as descreve. O cliente pede ao servidor para executar uma. O servidor valida a entrada, executa a lógica e retorna um resultado dentro de um envelope JSON-RPC.
A distinção entre cliente e servidor é importante porque a maioria dos desenvolvedores Laravel esteve apenas de um lado. Ao integrar o Laravel Boost ao seu fluxo de trabalho, seu assistente de IA se conecta a um servidor MCP que expõe seus modelos Eloquent, rotas e configurações. Você é o cliente. O Laravel Boost faz a resposta. Este artigo é a outra extremidade desse fio, você constrói o servidor.
Há um pacote PHP, php-mcp/laravel, que estrutura um servidor para você. No momento da escrita, ele tem como alvo a versão da especificação 2025-03-26, que está duas revisões atrás do lançamento estável atual. Para sistemas de produção onde a negociação da versão do protocolo e a correção do esquema são importantes, construir a camada de transporte você mesmo lhe dá controle total sobre qual versão você anuncia e como você lida com falhas de negociação. Essa é a abordagem adotada aqui.
Os dois modos de transporte: stdio vs HTTP+SSE
O MCP suporta dois modos de transporte. Escolher o errado para o seu contexto de implantação é o erro mais comum no início.
| Modo | Transporte | Caso de uso | Múltiplos clientes | Apropriado para produção |
|---|---|---|---|---|
| stdio | stdin / stdout | Desenvolvimento local, ferramentas de IDE | Não | Não |
| HTTP+SSE | HTTP POST + Eventos Enviados pelo Servidor | Remoto, hospedado, múltiplos clientes | Sim | Sim |
stdio é executado como um processo filho. O cliente o inicia, se comunica via stdin/stdout e o processo sai quando a sessão termina. Rápido, sem configuração de rede, apropriado apenas para ferramentas locais.
HTTP+SSE é executado como um processo HTTP persistente. Os clientes se conectam pela rede. Chamadas JSON-RPC chegam como requisições POST. Respostas em streaming usam Eventos Enviados pelo Servidor em um canal separado. Tudo neste artigo é direcionado ao HTTP+SSE.
Definindo o manifesto do servidor e a negociação de capacidades
Toda sessão MCP começa com um initialize handshake. O cliente declara sua versão de protocolo e capacidades; o servidor responde com sua própria identidade e o que suporta.
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {
"roots": { "listChanged": true },
"sampling": {}
},
"clientInfo": {
"name": "claude-desktop",
"version": "1.0.0"
}
}
}
O servidor responde:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": { "listChanged": false }
},
"serverInfo": {
"name": "knowledge-base-mcp",
"version": "1.0.0"
}
}
}
Após initialize, o cliente envia uma notificação notifications/initialized (sem id, nenhuma resposta esperada), e a sessão está ativa. A string protocolVersion não é cosmética. Versões incompatíveis causam falhas silenciosas em alguns clientes; sempre ecoe exatamente o que você suporta.
Dirija ambos os valores a partir da configuração:
// config/mcp.php
return [
'protocol_version' => env('MCP_PROTOCOL_VERSION', '2025-11-25'),
'server_name' => env('MCP_SERVER_NAME', 'knowledge-base-mcp'),
];
// app/MCP/Handlers/InitializeHandler.php
namespace App\MCP\Handlers;
class InitializeHandler
{
public function handle(array $params): array
{
return [
'protocolVersion' => config('mcp.protocol_version'),
'capabilities' => [
'tools' => ['listChanged' => false],
],
'serverInfo' => [
'name' => config('mcp.server_name'),
'version' => config('app.version', '1.0.0'),
],
];
}
}
listChanged: false informa ao cliente que sua lista de ferramentas é estática para a sessão. Defina como true apenas se você implementar o mecanismo de notificação push correspondente, caso contrário, você está anunciando uma capacidade que não pode cumprir.
Construindo a camada de rotas do Laravel
Todas as chamadas JSON-RPC chegam como um POST para um único endpoint. Este é o contrato de transporte do MCP: uma URL, todo o despacho de métodos tratado pelo servidor.
// routes/api.php
use App\Http\Controllers\McpController;
Route::middleware(['auth:sanctum', 'ability:mcp:connect', 'throttle:mcp'])
->group(function () {
Route::post('/mcp', [McpController::class, 'handle']);
});
Uma closure aqui é tentadora e errada. O controlador dedicado oferece injeção de construtor, testabilidade e um ponto de extensão limpo quando sua lista de métodos cresce.
// app/Http/Controllers/McpController.php
namespace App\Http\Controllers;
use App\MCP\Exceptions\McpException;
use App\MCP\Handlers\IA implementação de um servidor MCP pode permitir que empresas brasileiras integrem agentes de IA em suas aplicações Laravel, melhorando a eficiência e a automação. Com a crescente adoção de IA, entender e aplicar o MCP se torna essencial para manter a competitividade no mercado. O artigo fornece orientações práticas para desenvolvedores que desejam explorar essa tecnologia.
Noticias relacionadas

Liquidação Atômica é Cega a Sybil por Design - E é por Isso que um Diretório de Contrapartes Está Acima Disso
O artigo discute como contratos de liquidação atômica são cegos a identidades, garantindo segurança sem depender de quem é a contraparte. A separação entre liquidação e seleção é crucial para a segurança em transações.

Dia 10/30: Citações Precisos
O artigo discute como um agente de pesquisa começou a gerar citações falsas, levando à necessidade de um entendimento mais estruturado sobre citações usando o Model Context Protocol (MCP). A implementação de um modelo de citação melhorou a precisão das referências.

Servidor MCP para gerar códigos QR personalizados diretamente no Cursor e Claude
Um servidor MCP foi criado para gerar códigos QR personalizados diretamente em editores como Cursor e Claude, eliminando a necessidade de geradores online. O servidor permite controle sobre formato, design e branding dos códigos.
Gostou do conteudo?
Receba toda semana as principais novidades sobre WebMCP.