MCP Prompt
자주 사용하는 프롬프트와 MCP Prompt를 활용하여 AI Agent의 효율을 높이는 다양한 방법들을 소개합니다.
Contents
- 재사용되는 프롬프트들
- 프롬프트 사용법
- MCP Prompt
- 기본 기능
- 동적인 인자 전달 가능
- 리소스 기반의 컨텍스트 포함 가능
- 여러 대화를 체인 형태로 구성 가능
- Amazon Q에서의 활용
- Prompt Server
- 시연
- 정리

재사용되는 프롬프트들
AI Agent를 사용하면 즐겨 사용하는 반복적인 프롬프트들이 생깁니다. 다음은 제가 자주 사용하는 프롬프트들입니다.
1.Data Converter
다양한 데이터를 원하는 데이터 형식으로 변환해 줍니다. 예를 들어 JSON 형식으로 작성된 데이터를 Kotlin Data Class 나 Typescript Interface 로 변환해야 하는 경우가 많이 존재합니다. 이러한 반복작업은 다음과 같은 프롬프트로 쉽게 해결할 수 있습니다. 이 프롬프트를 활용하면, DTO 파일 등을 생성하는 반복작업을 쉽게 처리할 수 있습니다.
2.Planner
AI Agent와 페어 프로그래밍할 때 단순히 프로그래밍 업무를 시키는 것보다, 계획 단계부터 AI와 함께한다면 AI의 작업 능률이 올라간다는 사실을 알게 되었습니다. Claude Code에서는 Plan Mode를 별도로 제공하지만, Plan Mode가 지원되지 않는 AI Agent에서는 다음과 같은 Planner 프롬프트를 활용하면 Plan 모드처럼 사용할 수 있습니다.
프롬프트 사용법
이러한 프롬프트들을 쉽게 사용하는 방법은 어떤 방법들이 있을까요? 가장 쉽게 생각할 수 있는 방법은 Snippet 앱을 사용하는 것입니다. Snippet 앱에 자주 사용하는 프롬프트들을 저장해 두고, 필요할 때마다 꺼내 쓰는 방식입니다. 저도 처음에는 Alfred를 활용해서 유용한 프롬프트들을 저장해 두고, 프롬프트들을 Snippet에서 꺼내 사용했습니다.
두 번째 방법은 Claude Code를 사용하는 것입니다. Claude Code에서는 Custom Commands라는 기능이 있는데, 사용법이 매우 간단합니다. 위의 예시 프롬프트처럼 Markdown 형식으로 프롬프트들을 작성한 뒤, ~/.claude/commands/ 하위 경로에 마크다운 파일들을 위치시키면 됩니다. 다음의 사진과 같이 Claude에 Custom Command가 추가됩니다.

세 번째 방법은 바로 MCP Prompt 기능을 사용하는 것입니다.
MCP Prompt
MCP Prompt는 프롬프트들의 Snippet 기능으로도 활용이 가능하고, 다음의 부가적인 기능들을 포함합니다.
- 동적인 인자 전달 가능
- 리소스 기반의 컨텍스트 포함 가능
- 여러 상호작용을 체인 형태로 구성 가능
- 특정 워크플로우를 유도 가능
- UI 요소 (슬래시 명령 등)로 노출 가능
기본 기능
먼저 MCP Prompt의 기본적인 기능에 대해 살펴보겠습니다. 먼저 MCP Prompt는 MCP Server의 일부입니다. Node.js에서는 @modelcontextprotocol/sdk/server/mcp.js 패키지에서 MCP Server와 유사하게 MCP Prompt를 사용할 수 있습니다.
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
const server = new McpServer({
name: 'mcp-prompt-server',
version: '1.0.0',
})
server.prompt(
// 프롬프트명
'프롬프트 이름',
// 프롬프트 인자 Zod Schema
argumentsSchema,
// 프롬프트 등록 콜백
async (args: ArgumentsType) => {
return this.processPromptWithValidation(prompt, args);
}
);
MCP Prompt는 다음과 같은 형태를 지닙니다.
{
name: string; // 프롬프트의 고유 식별자
description?: string; // 설명
arguments?: [ // (선택사항) 전달받는 인자 목록
{
name: string; // 인자 이름
description?: string; // 인자 설명
required?: boolean; // 필수 여부
}
]
}
MCP Client는 다음과 같은 명령어로 등록된 Prompt들을 조회할 수 있습니다.
// 요청
{
method: "prompts/list";
}
// 응답
{
prompts: [
{
name: "analyze-code",
description: "코드 개선점을 분석합니다.",
arguments: [
{
name: "language",
description: "프로그래밍 언어",
required: true,
},
],
},
];
}
또 등록된 Prompt를 조회하여 사용하고 싶을 때에는 get 요청을 사용하면 됩니다.
// 요청
{
method: "prompts/get",
params: {
name: "analyze-code",
arguments: {
language: "python"
}
}
}
// 응답
{
description: "Python 코드의 개선점을 분석합니다.",
messages: [
{
role: "user",
content: {
type: "text",
text: "다음 Python 코드를 개선할 수 있는 부분이 있다면 분석해 주세요:\n\n```python\ndef calculate_sum(numbers):\n total = 0\n for num in numbers:\n total = total + num\n return total\n\nresult = calculate_sum([1, 2, 3, 4, 5])\nprint(result)\n```"
}
}
]
}
요약하면, MCP Prompt 는 유저가 자주 사용하는 프롬프트들을 쉽게 재사용할 수 있도록 MCP Server 에서 조회할 수 있는 기능입니다. 근데 반복되는 프롬프트들을 단순히 재사용 할 수 있는 용도면 Alfred, Raycast 등의 Snippet 을 사용하는 것이 훨씬 간편하지 않을까요 ? 왜 MCP Prompt 라는 기술이 있는 걸까요 ?
눈치채신 분도 있으시겠지만, MCP Prompt 는 프롬프트 Snippet 이상의 기능을 제공합니다. 어떤 기능들을 제공하는지 하나씩 살펴보겠습니다.
동적인 인자 전달 가능
MCP Server에는 단순한 Snippet 기능 외에도 유용한 기능들이 내장되어 있는데, 그 중 첫 번째가 동적인 파라미터입니다. 저장된 Prompt의 중간중간에 파라미터를 추가할 수 있습니다. 사용자는 고정된 Prompt를 넘어서, 상황에 맞게 인자를 동적으로 설정할 수 있습니다.
{
"name": "analyze-project",
"description": "프로젝트 로그와 코드를 분석합니다",
// 경우에 따라서 달라져야 할 변수들을 arguments 로 넘길 수 있습니다.
"arguments": [
{
"name": "timeframe",
"description": "로그 분석 기간",
"required": true
},
{
"name": "fileUri",
"description": "검토할 코드 파일 URI",
"required": true
}
]
}
리소스 기반의 컨텍스트 포함 가능
LLM에 컨텍스트를 입력할 때, 텍스트뿐만 아니라 리소스 기반으로 컨텍스트를 추가시킬 수 있습니다. 아래와 같이, 파일을 컨텍스트로 제공하는 것이 가능합니다.
{
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "다음 시스템 로그와 코드 파일을 분석해 주세요:"
}
},
{
"role": "user",
// 파일을 리소스 형태로 context 에 입력 가능
"content": {
"type": "resource",
"resource": {
"uri": "logs://recent?timeframe=1h",
"text": "[2024-03-14 15:32:11] ERROR: Connection timeout in network.py:127\n...",
"mimeType": "text/plain"
}
}
},
{
"role": "user",
// 파일을 리소스 형태로 context 에 입력 가능
"content": {
"type": "resource",
"resource": {
"uri": "file:///path/to/code.py",
"text": "def connect_to_service(timeout=30):\n ...",
"mimeType": "text/x-python"
}
}
}
]
}
여러 대화를 체인 형태로 구성 가능
MCP Prompt를 사용하면, LLM과의 여러 대화를 하나의 단계로 처리할 수 있습니다. 아래의 예시처럼, 사용자와 AI Agent와의 여러 대화를 하나의 프롬프트 묶음으로 제공할 수 있습니다.
const debugWorkflow = {
name: "debug-error",
/**
* 에러를 파라미터로 받아서 동적인 템플릿을 생성하고,
* 여러 대화를 체인 형태로 Context 로 제공합니다.
*/
async getMessages(error: string) {
return [
{
role: "user",
content: {
type: "text",
text: `Here's an error I'm seeing: ${error}`,
},
},
{
role: "assistant",
content: {
type: "text",
text: "I'll help analyze this error. What have you tried so far?",
},
},
{
role: "user",
content: {
type: "text",
text: "I've tried restarting the service, but the error persists.",
},
},
];
},
};
Amazon Q에서의 활용
저는 Amazon Q Developer CLI를 AI Agent로 활용하고 있는데, MCP Prompts를 Amazon Q에서 사용할 수 있습니다. 가이드 문서에 적혀있는 대로, @{prompt_name} {arguments}와 같은 형태로 프롬프트를 호출할 수 있습니다.

Prompt Server
MCP Prompt 라는 이름에서 알 수 있듯이, MCP Prompt 는 MCP 위에서 돌아가는 프로토콜입니다. MCP Prompt를 제대로 사용하기 위해서는 직접 MCP Server를 만들어야 하기 때문에, 약간의 번거로움이 있습니다. 하지만 한 번 MCP Server를 구성해 두면, 편하게 확장할 수 있는 장점이 있는 것 같습니다.
저는 MCP Prompt 개념을 공부하며 스스로 MCP Prompt Server를 작성하여 사용하고 있는데, 개인적으로는 재미있고 활용가 높다고 생각합니다.
제가 구축한 MCP Prompt Server는 다음과 같은 순서로 동작합니다. 서버 로직은 동적 HTML을 렌더링하는 백엔드 서버와 유사하게 구성하였습니다. 사용자로부터 파라미터를 받으면, 동적으로 생성해야 하는 프롬프트를 생성하여 반환합니다. 구체적인 템플릿은 이 파일을 참고해 보시면 좋습니다.

- MCP Client (AmazonQ, Cursor)는 Prompt Server에게 어떤 프롬프트가 사용 가능한지 쿼리합니다.
- MCP Prompt Server는 프롬프트 저장소를 뒤진 후, MCP Client에게 반환합니다.
- MCP Client는 Prompt Server에게 프롬프트를 호출합니다. Prompt에 argument가 필요한 경우, arguments와 함께 호출합니다.
- MCP Prompt Server는 프롬프트 저장소에서 프롬프트를 조회합니다. 저는 File System의 특정 디렉토리의 마크다운 파일들을 프롬프트 저장소로 사용하도록 서버를 구성하였습니다.
- MCP Prompt Server는 프롬프트 정보를 조회합니다.
- 프롬프트의 형식을 본 후, 동적 프롬프트를 생성해야 한다면 생성합니다. 저는 Node.js의 템플릿 엔진인 handlebars를 사용하여 동적인 프롬프트를 생성하도록 코드를 작성하였습니다.
- 템플릿 엔진은 동적으로 변경할 문구들을 수정하여, 완성된 프롬프트를 반환합니다.
- MCP Server는 MCP Client에게 완성된 프롬프트를 반환합니다.
시연
제가 만들어 사용하고 있는 MCP Server 을 로컬에 설치하고, MCP Prompt 기능을 사용해 보겠습니다.
- MCP Setting
{
"mcpServers": {
...
"prompts": {
"command": "npx",
"args": [
"-y",
"@h16rkim/mcp-prompt-server@latest"
],
"env": {
"PROMPTS_DIR": "$PATH_TO_REPOSITORY/src/prompts"
},
"transport": "stdio"
}
}
}
- MCP Prompt
- 작성한 글에서 어색한 표현이나 오타를 수정해 주는 프롬프트
- E2E 테스트 코드
정리
MCP Prompt Server는 아직 프로토콜 자체가 초기 단계이지만, 개인적으로 사용해 보면서 활용도가 높다는 인상을 받았습니다. 진입장벽이 있고 직접 구현해 주어야 할 부분도 있어서 번거롭지만, 고도화시킬수록 쓸모가 많은 기술이라는 생각이 들었습니다.
이것도 읽어보세요