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.