跳转到内容

TypeScript MCP 服务器

生成一个 TypeScript 模型上下文协议(MCP) 服务器,用于为大型语言模型(LLM)提供上下文,并可选择部署到 Amazon Bedrock AgentCore

模型上下文协议(MCP) 是一个开放标准,允许 AI 助手与外部工具和资源交互。它为 LLM 提供了一致的方式来:

  • 执行工具(函数)以执行操作或检索信息
  • 访问提供上下文或数据的资源

您可以通过两种方式生成 TypeScript MCP 服务器:

  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - ts#mcp-server
  5. 填写必需参数
    • 点击 Generate
    参数 类型 默认值 描述
    project 必需 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.

    生成器将在现有 TypeScript 项目中添加以下文件:

    • 文件夹your-project/
      • 文件夹src/
        • 文件夹mcp-server/ (或自定义名称)
          • index.ts 导出服务器
          • server.ts 主服务器定义
          • stdio.ts STDIO 传输入口,适用于本地简单 MCP 服务器
          • http.ts 流式 HTTP 传输入口,适用于托管 MCP 服务器
          • 文件夹tools/
            • add.ts 示例工具
          • 文件夹resources/
            • sample-guidance.ts 示例资源
          • Dockerfile MCP 服务器托管入口(当 computeType 设为 None 时排除)
      • package.json 更新 bin 条目和 MCP 依赖
      • project.json 更新 MCP 服务器服务目标

    由于该生成器会根据您选择的 iacProvider 以基础设施即代码的形式输出,它将在 packages/common 目录下创建一个包含相关 CDK 构造体或 Terraform 模块的项目。

    通用的基础设施即代码项目结构如下:

    • 文件夹packages/common/constructs
      • 文件夹src
        • 文件夹app/ 针对特定项目/生成器的基础设施构造体
        • 文件夹core/ app 目录构造体重用的通用构造体
        • index.ts 导出 app 目录构造体的入口文件
      • project.json 项目构建目标与配置

    部署 MCP 服务器时将会生成以下文件:

    • 文件夹packages/common/constructs/src
      • 文件夹app
        • 文件夹mcp-servers
          • 文件夹<project-name>
            • <project-name>.ts 用于部署 MCP 服务器的 CDK 构造
            • Dockerfile CDK 构造使用的直通式 docker 文件
      • 文件夹core
        • 文件夹agent-core
          • runtime.ts 用于部署到 Bedrock AgentCore Runtime 的通用 CDK 构造

    工具是 AI 助手可以调用的函数。您可以在 server.ts 文件中添加新工具:

    server.tool("工具名称", "工具描述",
    { 参数1: z.string(), 参数2: z.number() }, // 使用 Zod 的输入模式
    async ({ 参数1, 参数2 }) => {
    // 工具实现
    return {
    content: [{ type: "text", text: "结果" }]
    };
    }
    );

    资源为 AI 助手提供上下文。您可以从文件添加静态资源或动态资源:

    const 示例上下文 = '要返回的上下文内容';
    server.resource('资源名称', 'example://resource', async (uri) => ({
    contents: [{ uri: uri.href, text: 示例上下文 }],
    }));
    // 动态资源
    server.resource('动态资源', 'dynamic://resource', async (uri) => {
    const 数据 = await 获取数据();
    return {
    contents: [{ uri: uri.href, text: 数据 }],
    };
    });

    大多数支持 MCP 的 AI 助手都采用相似的配置方式。您需要创建或更新包含 MCP 服务器详细信息的配置文件:

    {
    "mcpServers": {
    "your-mcp-server": {
    "command": "npx",
    "args": ["tsx", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    在开发 MCP 服务器时,建议配置 --watch 参数以确保 AI 助手始终获取工具/资源的最新版本:

    {
    "mcpServers": {
    "your-mcp-server": {
    "command": "npx",
    "args": ["tsx", "--watch", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    请参考以下文档配置不同 AI 助手的 MCP 设置:

    生成器配置了名为 <your-server-name>-inspect 的目标,用于启动 MCP 检查器 并通过 STDIO 传输连接到您的 MCP 服务器。

    Terminal window
    pnpm nx run your-project:your-server-name-inspect

    检查器将在 http://localhost:6274 启动。点击 “Connect” 按钮开始使用。

    测试和使用 MCP 服务器最简单的方式是使用检查器或按上述方式配置 AI 助手。

    您也可以直接通过 <your-server-name>-serve-stdio 目标使用 STDIO 传输 运行服务器:

    Terminal window
    pnpm nx run your-project:your-server-name-serve-stdio

    此命令使用 tsx --watch 在文件更改时自动重启服务器。

    若需通过 流式 HTTP 传输 在本地运行 MCP 服务器,可使用 <your-server-name>-serve-http 目标:

    Terminal window
    pnpm nx run your-project:your-server-name-serve-http

    此命令同样使用 tsx --watch 自动重启服务器。

    如果您为 computeType 选择了 BedrockAgentCoreRuntime,系统会生成相应的 CDK 或 Terraform 基础设施代码,您可以用其将 MCP 服务器部署到 Amazon Bedrock AgentCore Runtime

    系统会基于生成器运行时指定的 name(默认为 <ProjectName>McpServer)生成一个 CDK 构造。

    您可以在 CDK 应用中使用该 CDK 构造:

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // 将 MCP 服务器添加到您的堆栈
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    默认情况下,您的 MCP 服务器将使用 IAM 认证进行保护,直接部署时无需额外参数:

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    您可以使用 grantInvoke 方法授予调用 Bedrock AgentCore Runtime 上 MCP 的权限。例如,您可能希望允许通过 py#strands-agent 生成器创建的代理调用您的 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);
    }
    }

    以下演示如何为代理配置 Cognito 认证。

    要配置 JWT 认证,您可以通过 authorizerConfiguration 属性传递给 MCP 服务器构造。以下示例配置了 Cognito 用户池和客户端来保护 MCP 服务器:

    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],
    },
    },
    });
    }
    }

    生成器会自动配置一个使用 Rolldown 创建部署包的 bundle 目标:

    Terminal window
    pnpm nx run <project-name>:bundle

    Rolldown 配置位于 rolldown.config.ts 文件中,每个要生成的包都有对应的入口配置。如果定义了多个包,Rolldown 会并行管理这些包的创建过程。

    打包目标使用 http.ts 作为入口点,用于在 Bedrock AgentCore 运行时托管流式 HTTP MCP 服务器。

    生成器配置了 <your-server-name>-docker 目标,该目标根据 MCP 协议约定 在端口 8000 上运行打包后的流式 HTTP MCP 服务器。

    若定义了多个 MCP 服务器,还会生成 docker 目标来执行所有 MCP 服务器的 Docker 构建。

    您的MCP服务器通过配置Dockerfile中的自动检测功能,使用AWS Distro for Open Telemetry (ADOT) 实现了开箱即用的可观测性。

    您可以在CloudWatch AWS控制台的菜单中选择”GenAI Observability”查看追踪数据。注意:要使追踪数据正常显示,需先启用Transaction Search功能。

    更多详细信息,请参考AgentCore可观测性配置文档