Servidor MCP em TypeScript
Gere um servidor TypeScript do Model Context Protocol (MCP) para fornecer contexto a Large Language Models (LLMs), e opcionalmente implante-o no Amazon Bedrock AgentCore.
O que é o MCP?
Seção intitulada “O que é o MCP?”O Model Context Protocol (MCP) é um padrão aberto que permite a assistentes de IA interagirem com ferramentas e recursos externos. Ele fornece uma maneira consistente para LLMs:
- Executar ferramentas (funções) que realizam ações ou recuperam informações
- Acessar recursos que fornecem contexto ou dados
Utilização
Seção intitulada “Utilização”Gerar um servidor MCP
Seção intitulada “Gerar um servidor MCP”Você pode gerar um servidor MCP em TypeScript de duas formas:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - ts#mcp-server - Preencha os parâmetros obrigatórios
- Clique em
Generate
pnpm nx g @aws/nx-plugin:ts#mcp-serveryarn nx g @aws/nx-plugin:ts#mcp-servernpx nx g @aws/nx-plugin:ts#mcp-serverbunx nx g @aws/nx-plugin:ts#mcp-serverVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
pnpm nx g @aws/nx-plugin:ts#mcp-server --dry-runyarn nx g @aws/nx-plugin:ts#mcp-server --dry-runnpx nx g @aws/nx-plugin:ts#mcp-server --dry-runbunx nx g @aws/nx-plugin:ts#mcp-server --dry-run| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| project Obrigatório | string | - | The project to add an MCP server to |
| computeType | string | BedrockAgentCoreRuntime | The type of compute to host your MCP server. Select None for no hosting. |
| name | string | - | The name of your MCP server (default: mcp-server) |
| iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
Saída do Gerador
Seção intitulada “Saída do Gerador”O gerador adicionará os seguintes arquivos ao seu projeto TypeScript existente:
Directoryyour-project/
Directorysrc/
Directorymcp-server/ (ou nome personalizado se especificado)
- index.ts Exporta seu servidor
- server.ts Definição principal do servidor
- stdio.ts Ponto de entrada para transporte STDIO, útil para servidores MCP locais simples
- http.ts Ponto de entrada para transporte HTTP Streamable, útil para hospedar seu servidor MCP
Directorytools/
- add.ts Exemplo de ferramenta
Directoryresources/
- sample-guidance.ts Exemplo de recurso
- Dockerfile Ponto de entrada para hospedar seu servidor MCP (excluído quando
computeTypeé definido comoNone)
- package.json Atualizado com entrada bin e dependências MCP
- project.json Atualizado com alvo de serviço do servidor MCP
Infraestrutura
Seção intitulada “Infraestrutura”Como este gerador fornece infraestrutura como código com base no iacProvider escolhido, ele criará um projeto em packages/common que inclui os constructs CDK ou módulos Terraform relevantes.
O projeto comum de infraestrutura como código está estruturado da seguinte forma:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Constructs para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Constructs genéricos reutilizados pelos constructs em
app- …
- index.ts Ponto de entrada exportando os constructs de
app
- project.json Metas de build e configuração do projeto
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Módulos Terraform para infraestrutura específica de um projeto/gerador
- …
Directorycore/ Módulos genéricos reutilizados pelos módulos em
app- …
- project.json Metas de build e configuração do projeto
Para implantar seu MCP Server, os seguintes arquivos são gerados:
Directorypackages/common/constructs/src
Directoryapp
Directorymcp-servers
Directory<project-name>
- <project-name>.ts Construto CDK para implantar seu MCP Server
- Dockerfile Arquivo Docker passthrough usado pelo construto CDK
Directorycore
Directoryagent-core
- runtime.ts Construto CDK genérico para implantação no Bedrock AgentCore Runtime
Directorypackages/common/terraform/src
Directoryapp
Directorymcp-servers
Directory<project-name>
- <project-name>.tf Módulo para implantar seu MCP Server
Directorycore
Directoryagent-core
- runtime.tf Módulo genérico para implantação no Bedrock AgentCore Runtime
Trabalhando com Seu Servidor MCP
Seção intitulada “Trabalhando com Seu Servidor MCP”Adicionando Ferramentas
Seção intitulada “Adicionando Ferramentas”Ferramentas são funções que o assistente de IA pode chamar para realizar ações. Você pode adicionar novas ferramentas no arquivo server.ts:
server.tool("toolName", "tool description", { param1: z.string(), param2: z.number() }, // Esquema de entrada usando Zod async ({ param1, param2 }) => { // Implementação da ferramenta return { content: [{ type: "text", text: "Result" }] }; });Adicionando Recursos
Seção intitulada “Adicionando Recursos”Recursos fornecem contexto ao assistente de IA. Você pode adicionar recursos estáticos de arquivos ou recursos dinâmicos:
const exampleContext = 'algum contexto para retornar';
server.resource('resource-name', 'example://resource', async (uri) => ({ contents: [{ uri: uri.href, text: exampleContext }],}));
// Recurso dinâmicoserver.resource('dynamic-resource', 'dynamic://resource', async (uri) => { const data = await fetchSomeData(); return { contents: [{ uri: uri.href, text: data }], };});Configurando com Assistente de IA
Seção intitulada “Configurando com Assistente de IA”Arquivos de Configuração
Seção intitulada “Arquivos de Configuração”A maioria dos assistentes de IA que suportam MCP usam uma abordagem de configuração semelhante. Você precisará criar ou atualizar um arquivo de configuração com os detalhes do seu servidor MCP:
{ "mcpServers": { "your-mcp-server": { "command": "npx", "args": ["tsx", "/path/to/your-mcp-server/stdio.ts"] } }}Recarregamento a Quente
Seção intitulada “Recarregamento a Quente”Durante o desenvolvimento do seu servidor MCP, você pode querer configurar a flag --watch para que o assistente de IA sempre veja as versões mais recentes de ferramentas/recursos:
{ "mcpServers": { "your-mcp-server": { "command": "npx", "args": ["tsx", "--watch", "/path/to/your-mcp-server/stdio.ts"] } }}Configuração Específica do Assistente
Seção intitulada “Configuração Específica do Assistente”Consulte a documentação a seguir para configurar o MCP com assistentes de IA específicos:
Executando Seu Servidor MCP
Seção intitulada “Executando Seu Servidor MCP”Inspector
Seção intitulada “Inspector”O gerador configura um alvo chamado <your-server-name>-inspect, que inicia o MCP Inspector com a configuração para conectar ao seu servidor MCP usando transporte STDIO.
pnpm nx run your-project:your-server-name-inspectyarn nx run your-project:your-server-name-inspectnpx nx run your-project:your-server-name-inspectbunx nx run your-project:your-server-name-inspectIsso iniciará o inspector em http://localhost:6274. Comece clicando no botão “Connect”.
A maneira mais fácil de testar e usar um servidor MCP é usando o inspector ou configurando-o com um assistente de IA (como acima).
Você também pode executar seu servidor com transporte STDIO diretamente usando o alvo <your-server-name>-serve-stdio.
pnpm nx run your-project:your-server-name-serve-stdioyarn nx run your-project:your-server-name-serve-stdionpx nx run your-project:your-server-name-serve-stdiobunx nx run your-project:your-server-name-serve-stdioEste comando usa tsx --watch para reiniciar automaticamente o servidor quando arquivos mudarem.
HTTP Streamable
Seção intitulada “HTTP Streamable”Se você deseja executar seu servidor MCP localmente usando transporte HTTP Streamable, pode usar o alvo <your-server-name>-serve.
pnpm nx run your-project:your-server-name-serveyarn nx run your-project:your-server-name-servenpx nx run your-project:your-server-name-servebunx nx run your-project:your-server-name-serveEste comando usa tsx --watch para reiniciar automaticamente o servidor quando arquivos mudarem.
Implantando Seu Servidor MCP no Bedrock AgentCore Runtime
Seção intitulada “Implantando Seu Servidor MCP no Bedrock AgentCore Runtime”Infraestrutura como Código
Seção intitulada “Infraestrutura como Código”Se você selecionou BedrockAgentCoreRuntime para computeType, a infraestrutura relevante do CDK ou Terraform será gerada para que você possa implantar seu servidor MCP no Amazon Bedrock AgentCore Runtime.
Um construto CDK é gerado para você, nomeado com base no name escolhido ao executar o gerador, ou <ProjectName>McpServer por padrão.
Você pode usar este construto CDK em uma aplicação CDK:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Adicione o servidor MCP à sua stack new MyProjectMcpServer(this, 'MyProjectMcpServer'); }}Um módulo do Terraform é gerado para você, nomeado com base no name escolhido ao executar o gerador, ou <ProjectName>-mcp-server por padrão.
Você pode usar este módulo do Terraform em um projeto Terraform:
# Servidor MCPmodule "my_project_mcp_server" { # Caminho relativo para o módulo gerado no projeto common/terraform source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"}Autenticação
Seção intitulada “Autenticação”Por padrão, seu servidor MCP será protegido usando autenticação IAM. Basta implantá-lo sem argumentos adicionais:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectMcpServer(this, 'MyProjectMcpServer'); }}Você pode conceder acesso para invocar seu MCP no Bedrock AgentCore Runtime usando o método grantInvoke. Por exemplo, você pode permitir que um agent gerado com o gerador py#strands-agent chame seu servidor MCP:
import { MyProjectAgent, MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const agent = new MyProjectAgent(this, 'MyProjectAgent'); const mcpServer = new MyProjectMcpServer(this, 'MyProjectMcpServer');
mcpServer.agentCoreRuntime.grantInvoke(agent.agentCoreRuntime); }}# Servidor MCPmodule "my_project_mcp_server" { # Caminho relativo para o módulo gerado no projeto common/terraform source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"}Para conceder acesso de invocação, você precisará adicionar uma política como a seguinte, referenciando a saída module.my_project_mcp_server.agent_core_runtime_arn:
{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime" ] Resource = [ module.my_project_mcp_server.agent_core_runtime_arn, "${module.my_project_mcp_server.agent_core_runtime_arn}/*" ]}Autenticação Cognito JWT
Seção intitulada “Autenticação Cognito JWT”O exemplo abaixo demonstra como configurar autenticação Cognito para seu servidor.
Para configurar autenticação JWT, você pode passar a propriedade authorizerConfiguration para seu construto de servidor MCP. Este exemplo configura um user pool e client Cognito para proteger o servidor:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const userPool = new UserPool(this, 'UserPool'); const client = userPool.addClient('Client', { authFlows: { userPassword: true, }, });
new MyProjectMcpServer(this, 'MyProjectMcpServer', { authorizerConfiguration: { customJwtAuthorizer: { discoveryUrl: `https://cognito-idp.${Stack.of(userPool).region}.amazonaws.com/${userPool.userPoolId}/.well-known/openid-configuration`, allowedClients: [client.userPoolClientId], }, }, }); }}Para configurar autenticação JWT, você pode editar seu módulo do Servidor MCP para configurar a variável customJWTAuthorizer da seguinte forma:
data "aws_region" "current" {}
locals { aws_region = data.aws_region.current.name
# Substitua pelos IDs do seu user pool e client ou exponha como variáveis user_pool_id = "xxx" user_pool_client_ids = ["yyy"]}
module "agent_core_runtime" { source = "../../../core/agent-core" agent_runtime_name = "MyProjectMcpServer" docker_image_tag = "my-scope-my-project-agent:latest" server_protocol = "MCP" customJWTAuthorizer = { discoveryUrl = "https://cognito-idp.${local.aws_region}.amazonaws.com/${local.user_pool_id}/.well-known/openid-configuration", allowedClients = local.user_pool_client_ids } env = var.env additional_iam_policy_statements = var.additional_iam_policy_statements tags = var.tags}Alvo de Bundle
Seção intitulada “Alvo de Bundle”O gerador configura automaticamente um destino bundle que utiliza o Rolldown para criar um pacote de implantação:
pnpm nx run <project-name>:bundleyarn nx run <project-name>:bundlenpx nx run <project-name>:bundlebunx nx run <project-name>:bundleA configuração do Rolldown pode ser encontrada em rolldown.config.ts, com uma entrada para cada pacote a ser gerado. O Rolldown gerencia a criação de múltiplos pacotes em paralelo, se definidos.
O alvo de bundle usa http.ts como ponto de entrada para o servidor MCP HTTP Streamable hospedado no Bedrock AgentCore Runtime.
Alvo Docker
Seção intitulada “Alvo Docker”O gerador configura um alvo <your-server-name>-docker que executa o servidor MCP HTTP Streamable empacotado na porta 8000 conforme o contrato do protocolo MCP.
Um alvo docker também é gerado para executar o build docker para todos servidores MCP se você tiver múltiplos definidos.
Observabilidade
Seção intitulada “Observabilidade”Seu servidor MCP é configurado automaticamente com observabilidade usando a AWS Distro for Open Telemetry (ADOT), através da configuração de instrumentação automática em seu Dockerfile.
Você pode encontrar traces no Console AWS do CloudWatch, selecionando “GenAI Observability” no menu. Observe que para que os traces sejam populados, você precisará habilitar o Transaction Search.
Para mais detalhes, consulte a documentação do AgentCore sobre observabilidade.