Skip to content

프롬프트

프롬프트는 MCP 클라이언트가 호출할 수 있는 재사용 가능한 메시지 템플릿입니다. LLM 대화에 구조화된 메시지를 생성합니다.

도구 vs 프롬프트

도구 (Tool)프롬프트 (Prompt)
용도AI가 코드를 실행AI에게 보낼 메시지 템플릿
호출 주체AI가 자동으로 선택·실행사용자가 명시적으로 선택
반환값실행 결과 (텍스트, 이미지 등)메시지 배열 (role + content)
예시DB 쿼리 실행, 파일 생성"이 코드를 리뷰해줘" 템플릿

간단한 규칙: 서버에서 뭔가 실행하면 도구, AI에게 보낼 메시지를 조립하면 프롬프트.

기본 프롬프트

typescript
import { definePrompt } from '@airmcp-dev/core';

const summarize = definePrompt('summarize', {
  description: '콘텐츠 요약',
  arguments: [
    { name: 'text', description: '요약할 텍스트', required: true },
    { name: 'style', description: '요약 스타일 (간략/상세)', required: false },
  ],
  handler: async ({ text, style }) => [
    {
      role: 'user',
      content: `다음을 ${style || '간략'}하게 요약해주세요:\n\n${text}`,
    },
  ],
});

definePrompt API

두 가지 호출 방식:

typescript
// 방식 1: 이름 + 옵션
definePrompt('summarize', { description, arguments, handler });

// 방식 2: 단일 객체
definePrompt({ name: 'summarize', description, arguments, handler });

AirPromptDef

typescript
interface AirPromptDef {
  name: string;                     // 프롬프트 이름
  description?: string;             // 설명
  arguments?: AirPromptArg[];       // 인자 정의
  handler: (args: Record<string, string>) => Promise<AirPromptMessage[]> | AirPromptMessage[];
}

handler는 동기 함수와 비동기 함수 모두 가능합니다.

AirPromptArg

typescript
interface AirPromptArg {
  name: string;          // 인자 이름
  description?: string;  // 설명
  required?: boolean;    // 기본: false
}

AirPromptMessage

typescript
interface AirPromptMessage {
  role: 'user' | 'assistant';
  content: string;
}

내부적으로 MCP SDK에 등록될 때 { role, content: { type: 'text', text: content } } 형식으로 변환됩니다.

인자

프롬프트 인자는 모두 string 타입입니다 (도구의 params와 달리 타입 지정 불가). MCP 프로토콜 스펙에 의한 제약입니다.

typescript
definePrompt('search-help', {
  arguments: [
    { name: 'topic', description: '검색 주제', required: true },
    { name: 'language', description: '응답 언어', required: false },
  ],
  handler: ({ topic, language }) => [
    {
      role: 'user',
      content: `${topic}에 대해 ${language || '한국어'}로 설명해주세요.`,
    },
  ],
});

인자가 없는 프롬프트:

typescript
definePrompt('greeting', {
  description: '기본 인사 메시지',
  handler: () => [
    { role: 'user', content: '안녕하세요! 무엇을 도와드릴까요?' },
  ],
});

멀티턴 프롬프트

여러 메시지를 반환하여 대화 템플릿을 만들 수 있습니다:

typescript
definePrompt('code-review', {
  description: '코드 리뷰 및 개선 제안',
  arguments: [
    { name: 'code', description: '리뷰할 코드', required: true },
    { name: 'language', description: '프로그래밍 언어', required: true },
  ],
  handler: ({ code, language }) => [
    {
      role: 'user',
      content: `이 ${language} 코드를 버그와 개선점 위주로 리뷰해주세요:\n\n\`\`\`${language}\n${code}\n\`\`\``,
    },
    {
      role: 'assistant',
      content: '잠재적 버그, 성능 문제, 스타일 개선점을 살펴보겠습니다.',
    },
    {
      role: 'user',
      content: '보안 취약점이 있다면 집중해주세요.',
    },
  ],
});

실전 사용 사례

문서 작성 도우미

typescript
definePrompt('write-doc', {
  description: 'API 문서 작성 템플릿',
  arguments: [
    { name: 'functionName', description: '함수 이름', required: true },
    { name: 'signature', description: '함수 시그니처', required: true },
    { name: 'purpose', description: '함수 목적', required: true },
  ],
  handler: ({ functionName, signature, purpose }) => [
    {
      role: 'user',
      content: `다음 함수에 대한 API 문서를 작성해주세요.

함수: ${functionName}
시그니처: ${signature}
목적: ${purpose}

다음 형식으로 작성해주세요:
- 설명
- 파라미터 표
- 반환값
- 사용 예제
- 주의사항`,
    },
  ],
});

SQL 쿼리 도우미

typescript
definePrompt('sql-help', {
  description: 'SQL 쿼리 작성 도우미',
  arguments: [
    { name: 'tables', description: '사용 가능한 테이블 목록', required: true },
    { name: 'question', description: '자연어 질문', required: true },
  ],
  handler: ({ tables, question }) => [
    {
      role: 'user',
      content: `다음 테이블 구조를 참고하여 SQL 쿼리를 작성해주세요.

테이블:
${tables}

질문: ${question}

PostgreSQL 문법으로 작성하고, 설명도 함께 제공해주세요.`,
    },
  ],
});

에러 분석

typescript
definePrompt('analyze-error', {
  description: '에러 로그 분석 및 해결 방안 제시',
  arguments: [
    { name: 'error', description: '에러 메시지 또는 스택 트레이스', required: true },
    { name: 'context', description: '에러 발생 맥락', required: false },
  ],
  handler: ({ error, context }) => [
    {
      role: 'user',
      content: `다음 에러를 분석하고 해결 방안을 제시해주세요.

에러:
${error}
${context ? `\n맥락:\n${context}` : ''}

다음을 포함해주세요:
1. 에러 원인 분석
2. 해결 방안 (코드 포함)
3. 재발 방지 조치`,
    },
  ],
});

서버에 등록

typescript
defineServer({
  prompts: [
    definePrompt('summarize', {
      description: '텍스트 요약',
      arguments: [{ name: 'text', required: true }],
      handler: ({ text }) => [
        { role: 'user', content: `요약해주세요: ${text}` },
      ],
    }),
    definePrompt('translate', {
      description: '텍스트 번역',
      arguments: [
        { name: 'text', description: '번역할 텍스트', required: true },
        { name: 'to', description: '대상 언어', required: true },
      ],
      handler: ({ text, to }) => [
        { role: 'user', content: `${to}(으)로 번역해주세요: ${text}` },
      ],
    }),
  ],
});

Released under the Apache-2.0 License.