/ AI, MCP, ADMOB

AdMob API MCP 서버 만들기 - Part 6: 자주 사용하는 질문을 프롬프트로 제공하기

지난 5부에서는 애드몹 MCP 서버에 실적 리포트 조회 기능을 추가하여, 마치 대화하듯 자연어로 광고 수익을 물어볼 수 있게 만들었습니다.

자연어로 질문하는 건 정말 멋진 기능이죠. 하지만 매번 “지난 7일간 가장 실적이 좋았던 앱 목록을 수익 순서대로 보여줘” 같이 긴 문장을 입력하는 건 조금 번거로울 수 있습니다. 자주 확인하는 지표라면, 문장을 일일이 입력하는 대신 목록에서 탁 하고 선택하는 편이 훨씬 편리하지 않을까요?

바로 이럴 때 MCP 서버의 프롬프트(Prompt) 기능이 빛을 발합니다! 사용자가 자주 쓸 만한 질문들을 템플릿 형태로 미리 만들어 제공할 수 있거든요. 다만, 아직 모든 AI 에이전트가 프롬프트 기능을 지원하는 것은 아니라는 점은 살짝 아쉬운 부분입니다.

우리가 흔히 사용하는 AI 에이전트 중에서는 Claude Desktop이 프롬프트 기능을 지원하는데요, 프롬프트 기능을 지원하는 전체 AI 에이전트 목록이 궁금하다면 Model Context Protocol > Example Clients 페이지에서 확인해 보세요.

우리 서버가 ‘프롬프트’를 지원한다고 알려주기

MCP 서버가 어떤 기능을 제공하는지는 capabilities 객체에 정의됩니다. 이전 포스트까지는 ‘도구(Tools)’ 기능만 구현했기에 tools 속성만 있었죠. 이제 우리 서버가 프롬프트 기능도 지원한다는 사실을 AI 에이전트에게 알려주기 위해, prompts 속성을 추가해 줍시다.

// src/index.ts

const server = new Server(
  {
    name: "AdMob",
    version: "0.1.0",
  },
  {
    capabilities: {
      prompts: {}, // '프롬프트' 기능을 지원한다는 표시!
      tools: {},
    },
  }
);

...

본격적으로 프롬프트 만들어보기

프롬프트를 추가하는 과정은 도구를 추가할 때와 아주 비슷합니다. 크게 두 단계로 나눌 수 있죠.

  1. 사용 가능한 프롬프트 목록 알려주기
  2. 사용자가 특정 프롬프트를 선택했을 때, 해당 프롬프트의 내용 알려주기

이 포스트에서는 두 가지 프롬프트를 함께 구현해 볼 거예요. 하나는 ‘최근 7일간 가장 실적이 좋은 앱’을 알려주는 프롬프트, 다른 하나는 ‘특정 앱 내에서 최근 7일간 가장 실적이 좋은 광고 단위’를 알려주는 프롬프트입니다.

자, 그럼 시작해 볼까요? 먼저 프롬프트 관련 코드를 깔끔하게 관리하기 위해 src/prompts.ts 파일을 만들고, 필요한 import 구문과 우리가 만들 프롬프트의 종류를 정의해 줍시다.

// src/prompts.ts

import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
import {
  GetPromptRequestSchema,
  ListPromptsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";

enum PromptName {
  TOP_PERFORMING_APPS_LAST7D = "top_performing_apps_last7d",
  TOP_PERFORMING_AD_UNITS_LAST7D = "top_performing_ad_units_last7d",
}

이제 configurePrompts() 함수를 만들고, 그 안에 프롬프트 목록을 제공하는 코드를 작성해 보겠습니다. 여기에 쓰이는 titledescription은 사용자에게 직접 보이는 부분이므로, 한눈에 기능을 알아볼 수 있도록 명확하게 작성하는 것이 중요하답니다.

프롬프트에 매개변수(arguments)를 추가하면, 사용자에게 필요한 정보를 명시적으로 요청할 수 있습니다. 예를 들어 ‘특정 앱’의 실적을 보려면 ‘앱 ID’가 꼭 필요하겠죠? 프롬프트를 정의하는 형식에 대해 더 자세한 내용이 궁금하다면 프롬프트 스키마 문서를 참고해 보세요.

export function configurePrompts(server: Server): void {
  // 1. 사용 가능한 프롬프트 '목록' 제공하기
  server.setRequestHandler(ListPromptsRequestSchema, () => {
    return {
      prompts: [
        {
          name: PromptName.TOP_PERFORMING_APPS_LAST7D,
          title: "Top performing apps with earnings (Last 7 days)",
          description: "List top performing apps in the last 7 days, sorted by estimated earnings.",
        },
        {
          name: PromptName.TOP_PERFORMING_AD_UNITS_LAST7D,
          title: "Top performing ad units with earnings (Last 7 days)",
          description: "List top performing ad units in the last 7 days within a specific app.",
          arguments: [
            {
              name: "admob_app_id",
              description: "AdMob app ID (e.g., ca-app-pub-3940256099942544~3347511713)",
              required: true,
            },
          ],
        },
      ],
    };
  });

  ...
}

프롬프트 목록을 제공했으니, 이제 사용자가 목록에서 특정 프롬프트를 선택했을 때 실제 프롬프트 내용을 돌려주는 GetPromptRequestSchema 핸들러를 구현할 차례입니다.

요청받은 프롬프트 이름(name)에 따라 AI 에이전트에게 전달할 프롬프트 본문을 반환하면 됩니다. 만약 매개변수가 있는 프롬프트라면, 사용자가 입력한 매개변수 값을 프롬프트 내용에 쏙 넣어서 돌려줘야겠죠?

반환하는 프롬프트 형식에 대한 자세한 내용은 PromptMessage 스키마를 참고하세요!

export function configurePrompts(server: Server): void {
  server.setRequestHandler(ListPromptsRequestSchema, () => {
    // ... 이전 단계에서 작성한 목록 제공 코드
  });

  // 2. 선택된 프롬프트의 '내용' 제공하기
  server.setRequestHandler(GetPromptRequestSchema, request => {
    const { name } = request.params;

    if (name === PromptName.TOP_PERFORMING_APPS_LAST7D) {
      return {
        messages: [
          {
            role: "user",
            content: {
              type: "text",
              text: "List top performing apps with estimated earnings for all mediated networks over the last 7 days, sorted by estimated earnings.",
            },
          },
        ],
      };
    }

    if (name === PromptName.TOP_PERFORMING_AD_UNITS_LAST7D) {
      const args = request.params.arguments;
      if (!args) {
        throw new Error(`No arguments provided for prompt: ${name}`);
      }

      const appId = args.admob_app_id as string;
      if (!appId) {
        throw new Error("AdMob app ID is missing.");
      }

      return {
        messages: [
          {
            role: "user",
            content: {
              type: "text",
              text: `List top performing ad units with estimated earnings for all mediated networks within the AdMob app ID ${appId} over the last 7 days, sorted by estimated earnings.`,
            },
          },
        ],
      };
    }

    throw new Error(`Unknown prompt: ${name}`);
  });
}

MCP 서버에 프롬프트 기능 연결하기

자, 이제 우리가 만든 configurePrompts 함수를 MCP 서버가 시작될 때 실행하도록 index.ts 파일에 연결해 주기만 하면 됩니다.

// src/index.ts
...

// 우리가 만든 prompts.ts 파일을 import 합니다.
import { configurePrompts } from "./prompts.js";

...

const server = new Server(...);

// 서버에 프롬프트 설정을 추가합니다.
configurePrompts(server);

// 기존에 추가했던 도구 설정은 그대로 둡니다.
configureTools(server);

...

이것으로 서버 측 작업은 모두 끝났습니다! 정말 간단하죠? 이제 AI 에이전트에서 테스트해보기 전에, 새로운 기능을 서버에 반영하기 위해 빌드를 한번 실행해 주세요.

$ npm run build

Claude Desktop에서 우리 서버 만나보기

아쉽게도 이전 포스트에서 사용했던 Gemini CLI는 아직 프롬프트 기능을 지원하지 않아요. 그래서 이번에는 프롬프트 기능을 지원하는 Claude Desktop을 사용해 보겠습니다. 아직 설치하지 않았다면 이 링크를 통해 다운로드하여 설치해 주세요.

Claude Desktop을 실행한 후, Settings > Developer 메뉴로 이동하면 Local MCP Servers 라는 항목이 보일 겁니다.

Cluade Desktop Settings > Develoeprs

Edit Config 버튼을 눌러 claude_desktop_config.json 파일을 열고, 아래와 같이 우리 서버 정보를 추가해 주세요.

{
  "mcpServers": {
    "AdMob": {
      "command": "node",
      "args": [
        // 예) /Users/kunny/repo/admob-mcp-server/build/index.js
        "<MCP 서버의 index.js 절대 경로>/build/index.js"
      ],
      "env": {
        // 예) /Users/kunny/repo/admob-mcp-server/credentials
        "CREDENTIALS_DIR": "<MCP 서버의 credentials 폴더 절대 경로>/credentials",
        // 여러분의 애드몹 게시자 ID를 입력해 주세요.
        "PUBLISHER_CODE": "pub-xxxxxxxxx"
      }
    }
  }
}

파일을 저장하고 Claude Desktop 앱을 다시 시작해 보세요. 그리고 다시 Settings > Developer 메뉴로 가보면, 짜잔! 우리 애드몹 MCP 서버가 멋지게 등록된 것을 확인할 수 있습니다.

AdMob MCP Server runnig

두근두근, 프롬프트 테스트 시간!

이제 모든 준비가 끝났습니다. 우리가 만든 프롬프트가 잘 작동하는지 확인해 볼까요?

새 채팅을 시작하고, 입력창 왼쪽의 + 버튼을 눌러보세요. Add from AdMob 이라는 새로운 메뉴가 생긴 것이 보이나요?

Add from AdMob

이 메뉴를 선택하면, 우리가 서버 코드에 정성껏 추가했던 프롬프트 목록이 나타납니다.

List of prompts

먼저 실적이 좋은 앱 정보를 요청하는 프롬프트를 선택해 봅시다. 프롬프트를 선택하면 채팅창에 텍스트 파일이 하나 첨부될 거예요.

Prompt for top performing apps

이 텍스트 파일을 클릭하면 우리가 서버에서 정의했던 프롬프트 원본 내용을 확인할 수 있습니다.

Prompt for top performing apps - details

자, 이제 이 프롬프트를 전송해 봅시다! 잠시 후, 우리가 5부에서 만들었던 미디에이션 리포트 도구를 활용하여 가장 실적이 좋은 앱 이름과 수익을 깔끔하게 정리해서 보여주는 것을 확인할 수 있습니다.

I'll help you generate a report showing the top performing apps with estimated earnings for all mediated networks over the last 7 days. Let me create this report for you.Based on the mediation report for the last 7 days (September 17-23, 2025), here are your top performing apps by estimated earnings:

## Top Performing Apps - Last 7 Days
*Sorted by Estimated Earnings (USD)*

1. **XXXXXX**
   - App ID: ca-app-pub-XXXXXX~YYYYYY
   - Estimated Earnings: **$XX.XX**

2. **YYYYYY**
   - App ID: ca-app-pub-XXXXXX~YYYYYY
   - Estimated Earnings: **$XX.XX**

**Total Estimated Earnings:** $XX.XX across 2 apps

The first app (XXXXXXXX) is your top performer, generating over 96% of your total mediated earnings for this period. Both apps appear to be related to Korean real estate pre-subscription services.

Would you like me to generate additional reports with more detailed breakdowns, such as performance by ad source, country, or other dimensions?

이번에는 가장 실적이 좋은 광고 단위를 요청하는 프롬프트를 테스트해 볼까요? 이 프롬프트는 애드몹 앱 ID를 매개변수로 받기 때문에, 아래처럼 앱 ID를 입력하는 창이 나타납니다.

Prompt for top performing ad units

앱 ID를 입력하고 나면, 아까와 마찬가지로 텍스트 파일이 첨부됩니다. 파일을 열어보면 우리가 입력한 앱 ID가 프롬프트 내용에 잘 반영된 것을 확인할 수 있죠.

Prompt for top performing apps - Details

프롬프트를 전송하면, 해당 앱 내의 광고 단위별 실적을 멋지게 분석해서 보여줍니다. 성공이네요!

I'll generate a report showing the top performing ad units with estimated earnings for all mediated networks within your specific app over the last 7 days.Here are the top performing ad units within your "XXXX" app for the last 7 days (September 17-23, 2025):

## Top Performing Ad Units - Last 7 Days
*App: XXXX*
*Sorted by Estimated Earnings (USD)*

1. **XX**
   - Ad Unit ID: ca-app-pub-XXXXXX/YYYYYY
   - Estimated Earnings: **$XX.XX**
   - Share: 66.8% of app's total earnings

... (이하 생략) ...

**Key Insights:**
- Your **Interstitial ad unit (XX)** is your top performer, generating over 66% of the app's revenue
- **App Open ads (XX)** are also strong contributors at nearly 25% of earnings
- The various **banner ad units** contribute smaller but consistent amounts
- The combination of interstitial and app open ads drives 91% of your app's mediated earnings

Would you like me to provide additional analysis, such as performance by ad source or other metrics like impressions and CTR for these ad units?

마치며

이번 포스트에서는 MCP 서버에 프롬프트 기능을 추가하여 사용 편의성을 한 단계 끌어올려 보았습니다. 서버가 아무리 강력한 기능을 많이 가지고 있어도 사용자들이 그 기능을 어떻게 써야 할지 모른다면 무용지물이겠죠? 프롬프트 기능은 사용자에게 ‘이런 것도 할 수 있어요!’라고 알려주는 훌륭한 가이드가 될 뿐만 아니라, 복잡한 입력을 자동화하여 MCP 서버를 훨씬 편하게 사용하도록 도와줄 수 있습니다.

이 포스트에서 작성한 전체 소스 코드는 GitHub 저장소에 모두 공개되어 있으니 참고해 주세요.

참조 링크

kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More