콘텐츠로 이동

타입스크립트 MCP 서버

대형 언어 모델(LLM)에 컨텍스트를 제공하기 위한 TypeScript 모델 컨텍스트 프로토콜(MCP) 서버를 생성하고 선택적으로 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 Streamable HTTP 전송용 진입점 (MCP 서버 호스팅에 유용)
          • 디렉터리tools/
            • add.ts 샘플 도구
          • 디렉터리resources/
            • sample-guidance.ts 샘플 리소스
          • Dockerfile MCP 서버 호스팅용 진입점 (computeTypeNone으로 설정된 경우 제외)
      • 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 construct
            • Dockerfile CDK construct에서 사용되는 Passthrough docker 파일
      • 디렉터리core
        • 디렉터리agent-core
          • runtime.ts Bedrock AgentCore Runtime에 배포하기 위한 일반적인 CDK construct

    도구는 AI 어시스턴트가 호출할 수 있는 기능입니다. server.ts 파일에 새 도구를 추가할 수 있습니다:

    server.tool("toolName", "tool description",
    { param1: z.string(), param2: z.number() }, // Zod를 사용한 입력 스키마
    async ({ param1, param2 }) => {
    // 도구 구현
    return {
    content: [{ type: "text", text: "Result" }]
    };
    }
    );

    리소스는 AI 어시스턴트에 컨텍스트를 제공합니다. 파일에서 정적 리소스나 동적 리소스를 추가할 수 있습니다:

    const exampleContext = '반환할 컨텍스트 내용';
    server.resource('resource-name', 'example://resource', async (uri) => ({
    contents: [{ uri: uri.href, text: exampleContext }],
    }));
    // 동적 리소스
    server.resource('dynamic-resource', 'dynamic://resource', async (uri) => {
    const data = await fetchSomeData();
    return {
    contents: [{ uri: uri.href, text: data }],
    };
    });

    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 타겟을 구성하며, 이는 STDIO 전송을 사용해 MCP 서버에 연결하기 위한 설정으로 MCP 검사기를 시작합니다.

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

    이 명령은 http://localhost:6274에서 검사기를 시작합니다. “Connect” 버튼을 클릭하여 시작하세요.

    MCP 서버를 테스트하고 사용하는 가장 쉬운 방법은 검사기를 사용하거나 AI 어시스턴트와 연동하는 것입니다.

    STDIO 전송을 직접 사용해 서버를 실행하려면 <your-server-name>-serve-stdio 타겟을 사용하세요.

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

    이 명령은 파일 변경 시 서버를 자동으로 재시작하는 tsx --watch를 사용합니다.

    Streamable HTTP 전송으로 로컬에서 MCP 서버를 실행하려면 <your-server-name>-serve-http 타겟을 사용하세요.

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

    이 명령은 파일 변경 시 서버를 자동으로 재시작하는 tsx --watch를 사용합니다.

    Bedrock AgentCore 런타임에 MCP 서버 배포

    섹션 제목: “Bedrock AgentCore 런타임에 MCP 서버 배포”

    computeType으로 BedrockAgentCoreRuntime을 선택한 경우 관련 CDK 또는 Terraform 인프라스트럭처가 생성되며, 이를 사용하여 MCP 서버를 Amazon Bedrock AgentCore Runtime에 배포할 수 있습니다.

    생성기 실행 시 선택한 name을 기반으로 CDK 구성 요소가 생성되며, 기본값은 <ProjectName>McpServer입니다.

    이 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 인증을 구성하려면 MCP 서버 구성 요소에 authorizerConfiguration 속성을 전달할 수 있습니다. 다음은 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은 여러 번들을 병렬로 생성하는 작업을 관리합니다.

    번들 타겟은 Bedrock AgentCore 런타임에서 호스팅하기 위한 Streamable HTTP MCP 서버의 진입점으로 http.ts를 사용합니다.

    생성기는 MCP 프로토콜 계약에 따라 포트 8000에서 번들된 Streamable HTTP MCP 서버를 실행하는 <your-server-name>-docker 타겟을 구성합니다.

    여러 MCP 서버가 정의된 경우 모든 서버의 도커 빌드를 실행하는 docker 타겟도 생성됩니다.

    MCP 서버는 Dockerfile에 자동 계측을 구성하여 AWS Distro for Open Telemetry(ADOT)를 사용해 관측 가능성을 자동으로 구성합니다.

    트레이스는 CloudWatch AWS 콘솔에서 메뉴의 “GenAI Observability”를 선택해 확인할 수 있습니다. 트레이스 데이터가 표시되려면 트랜잭션 검색을 활성화해야 합니다.

    자세한 내용은 AgentCore 관측 가능성 문서를 참조하세요.