Execute um MCP server na Azion
Crie um servidor Model Context Protocol com o MCP SDK e o Hono, execute-o como uma function da Azion e faça o deploy dele com a Azion CLI.
Você pode executar o seu próprio servidor Model Context Protocol (MCP) como uma function da Azion e fazer o deploy dele com a Azion CLI. Para conectar um agente de código aos MCP servers que a Azion hospeda, consulte Primeiros passos com o MCP server.
O MCP é uma especificação aberta que usa JSON-RPC para padronizar como aplicações e agentes de IA se comunicam. Um servidor expõe três tipos de capacidade: ferramentas (ações), recursos (dados como arquivos ou respostas de API) e prompts (templates de prompt compartilhados). Qualquer cliente compatível pode listar e chamar as ferramentas, ler os recursos e buscar os prompts. Um modelo de linguagem pode então chamar as suas funções e ler os seus dados. Para mais informações, consulte a documentação do MCP.
O servidor desta página usa o MCP SDK para TypeScript, @modelcontextprotocol/sdk, que implementa o protocolo. O Hono roteia as requisições HTTP. O WebStandardStreamableHTTPServerTransport do SDK responde a elas por streamable HTTP e funciona com os objetos Request e Response da Fetch API que uma function recebe e retorna. Para os outros transportes que o protocolo define, consulte Transports.
Pré-requisitos
- Uma conta da Azion. Para criar uma, consulte Criar uma conta.
- A Azion CLI instalada e com login feito. Para a configuração, consulte Primeiros passos com a Azion CLI.
- Node.js e npm. A CLI executa o Azion Bundler com
npxpara fazer o build do projeto, e o npm instala os pacotes que o servidor importa.
Crie e faça o deploy do servidor
A CLI cria um projeto Hono a partir de um template. Você substitui a entrada do template pelo MCP server, executa o servidor localmente e faz o deploy dele. O servidor usa a classe de alto nível McpServer, que registra cada ferramenta, recurso e prompt com uma chamada de método.
Para criar, executar e fazer o deploy do servidor:
Execute azion init com um nome para o projeto:
Em Choose a preset:, selecione Hono. Você pode digitar Hono para filtrar a lista. Em Choose a template:, selecione Hono Boilerplate. Responda Y para instalar as dependências e n ao servidor de desenvolvimento local e ao deploy. O comando imprime esta saída:
O projeto fica na pasta my-mcp-server, e a entrada dele é src/index.ts. Para todas as perguntas e as flags que as pulam, consulte Azion CLI init.
O template instala somente o hono. Vá para a pasta do projeto. Instale o MCP SDK e a versão 3 do zod, que o SDK usa:
O npm adiciona os dois pacotes às dependencies do package.json, ao lado do hono.
Substitua o conteúdo de src/index.ts pelo código a seguir. Ele registra uma ferramenta add e um recurso greeting e responde às requisições MCP em POST /mcp:
Cada requisição recebe um servidor novo e um transporte novo, sem ID de sessão, então o servidor não mantém estado entre as requisições. Uma instância de McpServer se conecta a um transporte por vez, então o código cria a instância em getServer() a cada requisição. Em caso de erro, o handler registra o erro no log e retorna o erro JSON-RPC -32603, Internal server error, com o status HTTP 500.
Na pasta do projeto, inicie o servidor de desenvolvimento local:
O comando faz o build de src/index.ts e serve a function na porta 3333:
O servidor continua em execução até você interrompê-lo. Para as flags do comando, consulte Azion CLI dev.
Em um segundo terminal, envie uma requisição MCP initialize para http://localhost:3333/mcp. O cliente precisa aceitar tanto JSON quanto um event stream:
O servidor responde com um evento que contém o nome e as capacidades dele:
Para listar as ferramentas, envie uma requisição tools/list para a mesma URL:
O resultado lista a ferramenta add com o schema de entrada que o código declara:
Interrompa o servidor local, ou abra um segundo terminal, e faça o deploy do projeto a partir da pasta do projeto:
A CLI envia o projeto e faz o build dele. No final, ela imprime a URL do domínio do projeto, no formato https://xxxxxxxxxx.map.azionedge.net. Para a saída do deploy e as flags dele, consulte Azion CLI deploy.
O MCP server roda na infraestrutura distribuída da Azion e responde em https://<your-domain>/mcp, em que <your-domain> é o domínio que o azion deploy imprimiu. O primeiro deploy pode levar vários minutos para responder de todas as localidades. Os deploys seguintes levam cerca de dois minutos.
Leia a configuração do deploy
O azion deploy cria os recursos que o azion.config.ts declara, e o azion init escreveu esse arquivo a partir do template Hono. Ele faz o build de src/index.ts com o preset typescript e com os polyfills ativados. O build grava a function em .edge/functions/index.js, que o arquivo chama de ./functions/index.js. Uma aplicação executa essa function em todos os caminhos por meio de uma regra de requisição chamada Execute Function, e um workload serve a aplicação:
A CLI preenche cada nome com $ quando cria o recurso e registra os IDs dos recursos em azion/azion.json. Para todas as configurações do arquivo, consulte azion.config.js.
Uma pasta de projeto que o azion init não criou não tem nenhum dos dois arquivos, e o azion build se recusa a fazer o build dela com Azion configuration not found. Execute azion link nessa pasta primeiro e depois azion build e azion deploy. Para as perguntas que o azion link faz, consulte Azion CLI link.
Conecte um cliente ao servidor
Um cliente MCP precisa da URL do servidor: https://<your-domain>/mcp depois do deploy, ou http://localhost:3333/mcp enquanto o azion dev está em execução. O caminho é /mcp porque a rota Hono do servidor é app.post('/mcp', …).
Configure o cliente como para os MCP servers da Azion, com a sua URL no lugar de https://docs-mcp.azion.com/mcp. Para as configurações do cliente, consulte Primeiros passos com o MCP server. O servidor de exemplo não verifica nenhuma credencial, então o cliente não envia nenhum header Authorization, e qualquer pessoa com a URL pode chamar as ferramentas dele.
Use a classe Server
A classe de baixo nível Server do SDK substitui os métodos de registro do McpServer por handlers de requisição. Você mesmo escreve o handler de cada método MCP, o que dá a você controle total sobre cada resposta. Cada capacidade precisa de um handler que a lista e de outro que a chama ou a lê:
| Capacidade | Método do McpServer | Handler de listagem do Server | Handler de chamada ou leitura do Server |
|---|---|---|---|
| Ferramentas | registerTool | ListToolsRequestSchema | CallToolRequestSchema |
| Recursos | registerResource | ListResourcesRequestSchema | ReadResourceRequestSchema |
| Prompts | registerPrompt | ListPromptsRequestSchema | GetPromptRequestSchema |
Registre cada handler com server.setRequestHandler(<schema>, async (request) => { ... }). Os schemas vêm de @modelcontextprotocol/sdk/types.js, que também exporta os schemas dos outros métodos MCP. Para mais informações, consulte o MCP SDK para TypeScript.
O src/index.ts a seguir serve as ferramentas e os prompts do pacote do MCP server da HubSpot, @hubspot/mcp-server. Ele declara as capacidades tools, prompts e resources e registra quatro handlers. A rota, o transporte e o tratamento de erros são os mesmos do servidor McpServer. Adicione o pacote ao projeto antes de fazer o build:
O pacote da HubSpot lê um access token da HubSpot da variável de ambiente PRIVATE_APP_ACCESS_TOKEN. Sem a variável, o azion dev faz o build do projeto e depois para com HubSpot access token is required.
Execute e faça o deploy deste servidor com os mesmos comandos azion dev e azion deploy do servidor McpServer.
Prepare o servidor para agentes
Um agente escolhe uma ferramenta pelo nome e pela descrição dela e a chama com as entradas que o schema dela declara. Verifique estes pontos antes de passar a URL para outras pessoas:
| Área | Prática |
|---|---|
| Nomes das ferramentas | Dê a cada ferramenta um nome com um verbo e um substantivo, como search_docs ou create_rule. |
| Descrições das ferramentas | Diga quando um agente usa a ferramenta e como. |
| Entradas das ferramentas | Declare um tipo para cada parâmetro e valide cada valor antes de usá-lo. |
| Erros | Retorne uma mensagem que diga o que falhou. |
| Chamadas repetidas | Torne cada ferramenta segura para ser chamada mais de uma vez. |
| Respostas | Faça cache dos dados que as ferramentas leem com frequência, pagine resultados grandes, defina timeouts para operações longas e comprima respostas grandes. |
| Acesso | Limite o número de requisições que cada token pode enviar e registre em log toda operação sensível. |
| Saída | Remova dados sensíveis de uma resposta antes de retorná-la. |
Para um exemplo maior de servidor criado com Hono e com o MCP SDK, consulte o repositório aziontech/mcp-server.