본문 바로가기

인공지능

MCP 서버 확장하기: 리소스 템플릿(Resource Templates) 활용법

728x90
반응형

🚀 MCP 서버를 더 강력하게 만들고 싶다면?

MCP(Model Context Protocol) 서버를 구축하고 기본적인 리소스를 정의하는 것은 어렵지 않습니다. 하지만, 동적으로 생성되는 리소스를 다루려면 어떻게 해야 할까요?

예를 들어, 사용자 프로필을 가져올 때 users://12345와 같은 URI로 특정 사용자의 정보를 불러오고 싶다면?
이럴 때 **리소스 템플릿(Resource Templates)**을 사용하면 효율적으로 처리할 수 있습니다.

이번 글에서는 리소스 템플릿의 개념과 구현 방법, 그리고 테스트 방법까지 단계별로 설명하겠습니다. 이 글을 읽고 나면 MCP 서버에서 동적 리소스를 생성하고 활용하는 방법을 익힐 수 있습니다.

반응형

📌 리소스 템플릿이란?

리소스 템플릿은 동적 URI 패턴을 활용해 리소스를 정의하는 기능입니다.

일반적인 MCP 리소스는 정적인 URI를 가지지만, 리소스 템플릿을 사용하면 URI 안의 특정 값을 변수처럼 다뤄 동적인 데이터 요청이 가능합니다.

✅ 정적 리소스 vs 리소스 템플릿

정적 리소스 리소스 템플릿

URI 형식 hello://world users://{userId}
특징 항상 같은 데이터 반환 URI에 따라 다른 데이터 반환
예시 hello://world → "Hello, World!" users://12345 → "User ID: 12345"

💡 리소스 템플릿 활용 예제

  • users://{userId} → 특정 사용자의 프로필 조회
  • reports://{year}/{month} → 특정 기간의 보고서 조회
  • search://{query} → 검색 결과 제공

🛠 MCP 서버에서 리소스 템플릿 구현하기

이제 직접 MCP 서버에 리소스 템플릿을 추가해보겠습니다.
기본적인 MCP 서버가 이미 구축되어 있다고 가정하고, 새로운 리소스 템플릿을 추가하는 과정입니다.

1️⃣ 핸들러 파일 생성 (handlers.ts)

기존의 hello://world 리소스 핸들러가 있는 파일을 수정하여 새로운 템플릿을 추가합니다.

// src/handlers.ts
import {
  ListResourcesRequestSchema,
  ReadResourceRequestSchema,
  ListResourceTemplatesRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { type Server } from "@modelcontextprotocol/sdk/server/index.js";

export const setupHandlers = (server: Server): void => {
  // 기존 정적 리소스
  server.setRequestHandler(ListResourcesRequestSchema, async () => ({
    resources: [
      {
        uri: "hello://world",
        name: "Hello World Message",
        description: "A simple greeting message",
        mimeType: "text/plain",
      },
    ],
  }));

  // 리소스 템플릿 목록 추가
  server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({
    resourceTemplates: [
      {
        greetings: {
          uriTemplate: "greetings://{name}",
          name: "Personal Greeting",
          description: "A personalized greeting message",
          mimeType: "text/plain",
        },
      },
    ],
  }));

  // 리소스 읽기 핸들러 추가 (동적 URI 처리)
  server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
    if (request.params.uri === "hello://world") {
      return {
        contents: [
          {
            uri: "hello://world",
            text: "Hello, World! This is my first MCP resource.",
          },
        ],
      };
    }

    // 템플릿 리소스 처리
    const greetingExp = /^greetings:\/\/(.+)$/;
    const greetingMatch = request.params.uri.match(greetingExp);
    if (greetingMatch) {
      const name = decodeURIComponent(greetingMatch[1]);
      return {
        contents: [
          {
            uri: request.params.uri,
            text: `Hello, ${name}! Welcome to MCP.`,
          },
        ],
      };
    }

    throw new Error("Resource not found");
  });
};

2️⃣ 서버 메인 파일 수정 (index.ts)

이제 handlers.ts에서 정의한 핸들러를 서버에 연결합니다.

// src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { setupHandlers } from "./handlers.js";

const server = new Server(
  {
    name: "hello-mcp",
    version: "1.0.0",
  },
  {
    capabilities: {
      resources: {},
    },
  }
);

setupHandlers(server);

// 서버 실행
const transport = new StdioServerTransport();
await server.connect(transport);
console.info(
  '{"jsonrpc": "2.0", "method": "log", "params": { "message": "Server running..." }}'
);

🔍 리소스 템플릿 테스트하기

리소스 템플릿이 정상적으로 동작하는지 확인하려면 MCP Inspector를 사용하면 됩니다.

1️⃣ 서버 실행

npx tsc
npx @modelcontextprotocol/inspector node build/index.js

2️⃣ 리소스 테스트

✅ 정적 리소스 테스트

  1. MCP Inspector에서 "Resources" 탭 클릭
  2. "Hello World Message" 선택
  3. 응답 확인:
{
  "contents": [
    {
      "uri": "hello://world",
      "text": "Hello, World! This is my first MCP resource."
    }
  ]
}

✅ 동적 리소스 테스트 (리소스 템플릿)

  1. "Resource Templates" 탭 클릭
  2. "Personal Greeting" 선택
  3. {name} 입력값에 "Alice" 입력
  4. 응답 확인:
{
  "contents": [
    {
      "uri": "greetings://Alice",
      "text": "Hello, Alice! Welcome to MCP."
    }
  ]
}

728x90

🔥 MCP 서버 확장의 장점

  • 기존 정적 리소스보다 더 유연한 데이터 처리 가능
  • 사용자의 요청에 따라 동적으로 리소스를 생성할 수 있음
  • 간단한 코드 수정만으로 다양한 URI 패턴 추가 가능

이제 MCP 서버에서 정적인 리소스를 넘어 동적인 리소스를 효율적으로 다룰 수 있는 방법을 배웠습니다.
https://medium.com/@cstroliadavis/building-mcp-servers-315917582ad1

 

Building MCP Servers

Part 2 — Extending Resources with Resource Templates

medium.com

728x90
반응형