{"componentChunkName":"component---src-templates-blog-post-js","path":"/etc/MCP-Model-Context-Protocol-실전-가이드-AI-에디터에-도구를-붙이는-방법/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog"}},"markdownRemark":{"id":"bc400e94-c8e0-5808-baa4-d711de9af488","excerpt":"MCP 실전 가이드 생성형 AI가 코드를 작성하고 리팩터링하는 시대에, “우리 팀의 내부 API 문서”, “사내 지식 DB”, “운영 중인 대시보드”, “특정 CLI 도구”까지 한 번에 묶어 주는 것이 새로운 병목이 되었다. REST…","html":"<p><img src=\"/assets/etc.png\" alt=\"MCP 실전 가이드\" title=\"MCP 실전 가이드\"></p>\n<p>생성형 AI가 코드를 작성하고 리팩터링하는 시대에, “우리 팀의 내부 API 문서”, “사내 지식 DB”, “운영 중인 대시보드”, “특정 CLI 도구”까지 한 번에 묶어 주는 것이 새로운 병목이 되었다. REST로 열어두면 보안이 걱정되고, 매번 프롬프트에 붙여 넣기면 컨텍스트 한도가 터진다. 이런 틈을 메우기 위해 등장한 표준 중 하나가 바로 <strong>Model Context Protocol(MCP)</strong>이다. 이 글은 MCP가 무엇인지, 어떻게 동작하는지, 그리고 실제로 서버를 만들어 에디터에 붙일 때 무엇을 조심해야 하는지를 <strong>실무에서 바로 쓸 수 있는 수준</strong>으로 정리한다.</p>\n<h2 id=\"mcp의-위치-왜-또-다른-프로토콜인가\" style=\"position:relative;\"><a href=\"#mcp%EC%9D%98-%EC%9C%84%EC%B9%98-%EC%99%9C-%EB%98%90-%EB%8B%A4%EB%A5%B8-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B8%EA%B0%80\" aria-label=\"mcp의 위치 왜 또 다른 프로토콜인가 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MCP의 위치: 왜 또 다른 프로토콜인가</h2>\n<p>대부분의 LLM 애플리케이션은 “텍스트 입력 → 모델 → 텍스트 출력”이라는 단순한 파이프라인으로 시작한다. 하지만 실제 제품에서는 다음이 필요하다.</p>\n<ul>\n<li><strong>최신 정보</strong>: 사내 위키나 티켓 시스템의 내용을 반영해야 한다.</li>\n<li><strong>실행</strong>: 빌드, 테스트, 배포 스크립트를 안전한 범위에서 호출해야 한다.</li>\n<li><strong>탐색</strong>: 거대한 저장소에서 특정 심볼만 찾아 요약해야 한다.</li>\n</ul>\n<p>이미 “함수 호출(Function Calling)”이나 “Tool Use”라는 개념은 OpenAI, Anthropic 등 여러 API에서 제공한다. 하지만 <strong>호스트 애플리케이션(에디터, 데스크톱 앱, 자체 에이전트)</strong> 입장에서는, 도구를 어떻게 노출하고, 어떤 형식으로 주고받고, 어떻게 권한을 분리할지에 대한 <strong>공통 언어</strong>가 없으면 매 통합마다 제각각 구현해야 한다.</p>\n<p>MCP는 이런 <strong>도구·리소스·프롬프트 힌트를 표준화하는 프로토콜</strong>이다. JSON-RPC 스타일의 메시지로 “어떤 도구가 있는지”, “어떤 인자를 받는지”, “실행 결과를 어떻게 돌려줄지”를 정의한다. 덕분에 <strong>한 번 MCP 서버를 만들면</strong>, 여러 MCP 호스트 클라이언트에서 재사용할 수 있다는 점이 기대 효과다.</p>\n<h3 id=\"기존-방식과의-차이\" style=\"position:relative;\"><a href=\"#%EA%B8%B0%EC%A1%B4-%EB%B0%A9%EC%8B%9D%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4\" aria-label=\"기존 방식과의 차이 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>기존 방식과의 차이</h3>\n<table>\n<thead>\n<tr>\n<th>접근</th>\n<th>장점</th>\n<th>한계</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>긴 프롬프트에 문서 붙여넣기</td>\n<td>구현 단순</td>\n<td>토큰 낭비, 최신성 없음, 민감 정보 유출 위험</td>\n</tr>\n<tr>\n<td>REST 래핑 API</td>\n<td>익숙한 패턴</td>\n<td>에디터별 통합 코드 반복, 세밀한 권한 모델 부족</td>\n</tr>\n<tr>\n<td>MCP 서버</td>\n<td>표준화, 재사용, 호스트·도구 분리</td>\n<td>서버 설계·배포·보안 책임이 개발자에게 있음</td>\n</tr>\n</tbody>\n</table>\n<p>MCP는 “은총알”이 아니다. <strong>팀이 정리한 도구 경계와 보안 정책이 없으면</strong>, 아무리 표준화해도 난장판이 된다. 그래서 이 글 후반부에는 <strong>보안·운영 체크리스트</strong>를 비중 있게 두었다.</p>\n<h2 id=\"구성-요소-호스트-클라이언트-서버\" style=\"position:relative;\"><a href=\"#%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C-%ED%98%B8%EC%8A%A4%ED%8A%B8-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%84%9C%EB%B2%84\" aria-label=\"구성 요소 호스트 클라이언트 서버 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>구성 요소: 호스트, 클라이언트, 서버</h2>\n<p>용어가 혼동되기 쉬우니, 역할을 먼저 고정한다.</p>\n<ol>\n<li><strong>호스트(Host)</strong><br>\n사용자가 상호작용하는 애플리케이션이다. 예를 들어 Cursor, Claude Desktop, 자체 제작한 AI 채팅 앱 등이 여기에 해당한다. 호스트는 MCP <strong>클라이언트</strong>를 내장하고, 사용자 세션과 UI를 담당한다.</li>\n<li><strong>MCP 클라이언트</strong><br>\n호스트 안에서 동작하며, MCP <strong>서버</strong>와 통신한다. “어떤 도구 목록이 있는지 물어보기”, “특정 도구 실행 요청”, “리소스 읽기” 같은 작업을 프로토콜에 맞게 보낸다.</li>\n<li><strong>MCP 서버</strong><br>\n실제로 <strong>도구(Tools)</strong>, <strong>리소스(Resources)</strong>, <strong>프롬프트(Prompts)</strong> 를 제공하는 프로세스다. Node, Python, Go 등으로 구현할 수 있고, stdio(표준 입출력)나 HTTP(S) 등 전송 방식을 선택할 수 있다(호스트·SDK에 따라 지원 범위가 다름).</li>\n</ol>\n<p>직관적으로 말하면, <strong>서버는 “능력을 노출하는 쪽”</strong>, <strong>클라이언트는 “그 능력을 AI에게 연결하는 쪽”</strong>이다. 사용자가 보는 채팅 UI는 호스트가 책임진다.</p>\n<h2 id=\"도구tools-리소스resources-프롬프트prompts\" style=\"position:relative;\"><a href=\"#%EB%8F%84%EA%B5%ACtools-%EB%A6%AC%EC%86%8C%EC%8A%A4resources-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8prompts\" aria-label=\"도구tools 리소스resources 프롬프트prompts permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>도구(Tools), 리소스(Resources), 프롬프트(Prompts)</h2>\n<p>MCP에서 자주 쓰이는 세 가지 추상화를 정리한다.</p>\n<h3 id=\"도구tools\" style=\"position:relative;\"><a href=\"#%EB%8F%84%EA%B5%ACtools\" aria-label=\"도구tools permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>도구(Tools)</h3>\n<p>모델이 <strong>호출할 수 있는 함수</strong>에 가깝다. 이름, 설명, JSON Schema 형태의 입력 스키마를 등록한다. 예를 들어 <code class=\"language-text\">search_internal_wiki</code> 도구는 <code class=\"language-text\">query</code> 문자열을 받아 관련 문서 요약을 반환할 수 있다.</p>\n<p>도구 설계 시 실무 팁은 다음과 같다.</p>\n<ul>\n<li><strong>입력 스키마를 좁게</strong>: “문자열 하나”로 때우기 쉽지만, 모델이 헷갈리면 잘못된 인자를 넣는다. 열거형(enum), 기본값, 최대 길이 등을 명시한다.</li>\n<li><strong>멱등성</strong>: 같은 입력이면 같은 결과가 나오게 할 수 있는지 검토한다. 외부 부작용이 크면 “dry-run” 도구를 별도로 둔다.</li>\n<li><strong>에러 메시지</strong>: 모델이 다음 행동을 정하도록, 사람이 읽기 좋은 한국어/영문 메시지와 함께 <strong>재시도 가능 여부</strong>를 적어 준다.</li>\n</ul>\n<h3 id=\"리소스resources\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%EC%86%8C%EC%8A%A4resources\" aria-label=\"리소스resources permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리소스(Resources)</h3>\n<p>파일, 문서, URL 같은 <strong>참조 가능한 데이터</strong>를 노출한다. “이 경로의 스펙 문서를 읽어라”처럼, 모델이 필요할 때 내용을 가져가는 용도다. 도구와의 차이는, 리소스는 <strong>읽기 중심</strong>인 경우가 많다는 점이다(구현에 따라 쓰기도 가능하지만 정책을 엄격히 할 것).</p>\n<h3 id=\"프롬프트prompts\" style=\"position:relative;\"><a href=\"#%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8prompts\" aria-label=\"프롬프트prompts permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>프롬프트(Prompts)</h3>\n<p>재사용 가능한 <strong>프롬프트 템플릿</strong>을 등록할 수 있다. 팀에서 자주 쓰는 “코드 리뷰 체크리스트”, “장애 보고서 초안” 같은 것을 표준화할 때 유용하다.</p>\n<h2 id=\"전송-방식-stdio와-원격\" style=\"position:relative;\"><a href=\"#%EC%A0%84%EC%86%A1-%EB%B0%A9%EC%8B%9D-stdio%EC%99%80-%EC%9B%90%EA%B2%A9\" aria-label=\"전송 방식 stdio와 원격 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>전송 방식: stdio와 원격</h2>\n<p>초기에 많이 쓰이는 방식은 <strong>stdio</strong>다. 호스트가 MCP 서버 프로세스를 띄우고, 표준 입출력으로 JSON-RPC 메시지를 주고받는다. 장점은 방화벽 안에서도 동작하기 쉽고, 로컬 개발이 간단하다는 것이다. 단점은 <strong>프로세스 생명주기 관리</strong>와 <strong>동시 접속</strong>이 호스트 구현에 의존한다는 점이다.</p>\n<p>원격(HTTP/SSE 등) 전송은 팀 단위로 <strong>중앙 MCP 서버</strong>를 두고 싶을 때 고려한다. 이때는 인증·TLS·레이트 리밋이 필수이고, <strong>서버를 인터넷에 노출할지</strong>, <strong>VPN 뒤에 둘지</strong>를 아키텍처 차원에서 결정해야 한다.</p>\n<h2 id=\"typescript로-최소-mcp-서버-만들기-개념-예제\" style=\"position:relative;\"><a href=\"#typescript%EB%A1%9C-%EC%B5%9C%EC%86%8C-mcp-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B0%9C%EB%85%90-%EC%98%88%EC%A0%9C\" aria-label=\"typescript로 최소 mcp 서버 만들기 개념 예제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript로 최소 MCP 서버 만들기 (개념 예제)</h2>\n<p>아래는 <strong>개념을 잡기 위한 의사 코드에 가까운 예시</strong>다. 실제 SDK 버전에 따라 import 경로와 클래스 이름이 다를 수 있으므로, 공식 문서와 사용 중인 호스트의 예제를 함께 보라. 중요한 것은 <strong>“무엇을 export하는가”</strong>이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 개념 예시: 실제 프로젝트에서는 공식 @modelcontextprotocol/sdk 등을 사용한다.</span>\n<span class=\"token comment\">// 1) 서버 인스턴스 생성</span>\n<span class=\"token comment\">// 2) list_tools 로 도구 목록 노출</span>\n<span class=\"token comment\">// 3) call_tool 로 분기 처리</span>\n<span class=\"token comment\">// 4) stdio transport 로 호스트에 연결</span>\n\n<span class=\"token comment\">// 의사 코드</span>\n<span class=\"token comment\">/*\nserver.registerTool({\n  name: \"add_internal_comment\",\n  description: \"내부 이슈에 코멘트를 남긴다. dryRun이 true면 실제 기록하지 않는다.\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      issueId: { type: \"string\" },\n      body: { type: \"string\", maxLength: 4000 },\n      dryRun: { type: \"boolean\", default: true },\n    },\n    required: [\"issueId\", \"body\"],\n  },\n  handler: async ({ issueId, body, dryRun }) => {\n    if (dryRun) {\n      return { content: [{ type: \"text\", text: `[dry-run] Would comment on ${issueId}` }] };\n    }\n    // await issueTracker.postComment(issueId, body);\n    return { content: [{ type: \"text\", text: \"ok\" }] };\n  },\n});\n*/</span></code></pre></div>\n<p>실무에서는 다음을 추가한다.</p>\n<ul>\n<li><strong>로깅</strong>: 어떤 도구가 어떤 인자로 호출되었는지(PII 마스킹 후)</li>\n<li><strong>타임아웃</strong>: 외부 API가 느릴 때 무한 대기 방지</li>\n<li><strong>레이트 리밋</strong>: 동일 사용자·동일 IP 기준 호출 제한</li>\n</ul>\n<h2 id=\"cursor-등-에디터와의-연동에서-생기는-실제-문제\" style=\"position:relative;\"><a href=\"#cursor-%EB%93%B1-%EC%97%90%EB%94%94%ED%84%B0%EC%99%80%EC%9D%98-%EC%97%B0%EB%8F%99%EC%97%90%EC%84%9C-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%8B%A4%EC%A0%9C-%EB%AC%B8%EC%A0%9C\" aria-label=\"cursor 등 에디터와의 연동에서 생기는 실제 문제 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cursor 등 에디터와의 연동에서 생기는 실제 문제</h2>\n<p>많은 개발자가 MCP를 처음 쓸 때 <strong>“로컬에서는 되는데 동료는 안 된다”</strong>는 상황을 겪는다. 흔한 원인은 다음과 같다.</p>\n<ol>\n<li><strong>실행 파일 경로</strong>: Node 버전 매니저(nvm, fnm)를 쓰면, GUI 앱이 로그인 셸 환경변수를 못 읽어 <code class=\"language-text\">node</code>를 찾지 못하는 경우가 있다. 이때는 절대 경로로 <code class=\"language-text\">node</code>를 지정하거나, 래퍼 스크립트를 둔다.</li>\n<li><strong>권한</strong>: 사내 인증서, VPN, AWS SSO 토큰이 터미널 세션에만 있는 경우가 있다. MCP 서버 프로세스가 같은 권한을 갖지 못하면 API 호출이 실패한다.</li>\n<li><strong>민감 정보</strong>: 도구 응답에 토큰, 개인정보가 섞이면 모델 컨텍스트에 남는다. <strong>마스킹·필터링 레이어</strong>를 서버 측에 둔다.</li>\n</ol>\n<h3 id=\"팀-규칙-예시\" style=\"position:relative;\"><a href=\"#%ED%8C%80-%EA%B7%9C%EC%B9%99-%EC%98%88%EC%8B%9C\" aria-label=\"팀 규칙 예시 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>팀 규칙 예시</h3>\n<ul>\n<li>프로덕션 DB에 <strong>직접 쓰기</strong> 도구는 금지하고, 읽기 전용 복제본에만 연결한다.</li>\n<li><strong>삭제·배포</strong> 류 도구는 별도 프로파일에서만 활성화한다.</li>\n<li>모든 도구 호출은 <strong>감사 로그</strong>를 남긴다(누가, 언제, 무엇을).</li>\n</ul>\n<h2 id=\"보안-mcp는-새로운-공격면이다\" style=\"position:relative;\"><a href=\"#%EB%B3%B4%EC%95%88-mcp%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B3%B5%EA%B2%A9%EB%A9%B4%EC%9D%B4%EB%8B%A4\" aria-label=\"보안 mcp는 새로운 공격면이다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>보안: MCP는 “새로운 공격면”이다</h2>\n<p>MCP를 도입하면 편해지는 만큼, <strong>에이전트가 할 수 있는 일의 범위</strong>가 넓어진다. 고려해야 할 위협은 다음과 같다.</p>\n<ol>\n<li><strong>프롬프트 인젝션과 도구 남용</strong><br>\n사용자 입력에 악의적인 지시가 섞이면, 모델이 의도하지 않은 도구를 호출할 수 있다. 완화책으로는 도구별 <strong>허용 목록</strong>, <strong>2단계 확인(사용자 승인)</strong>, <strong>읽기 전용 모드</strong>가 있다.</li>\n<li><strong>과도한 데이터 유출</strong><br>\n“내부 문서 검색” 도구가 너무 많은 컨텍스트를 한 번에 반환하면, 모델 제공자 측 로그나 다른 세션으로 이어질 위험을 평가해야 한다(특히 클라우드 모델 사용 시).</li>\n<li><strong>서플라이 체인</strong><br>\nnpm 패키지로 배포된 MCP 서버를 그대로 믿지 말고, <strong>소스 검토</strong>, <strong>고정 버전</strong>, <strong>내부 레지스트리 미러</strong>를 검토한다.</li>\n<li><strong>권한 최소화</strong><br>\n서버 프로세스 OS 사용자, 클라우드 IAM 역할, DB 계정 모두 <strong>최소 권한</strong> 원칙을 적용한다.</li>\n</ol>\n<h2 id=\"운영-관점-관측-가능성과-장애-대응\" style=\"position:relative;\"><a href=\"#%EC%9A%B4%EC%98%81-%EA%B4%80%EC%A0%90-%EA%B4%80%EC%B8%A1-%EA%B0%80%EB%8A%A5%EC%84%B1%EA%B3%BC-%EC%9E%A5%EC%95%A0-%EB%8C%80%EC%9D%91\" aria-label=\"운영 관점 관측 가능성과 장애 대응 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>운영 관점: 관측 가능성과 장애 대응</h2>\n<p>MCP 서버도 결국 하나의 마이크로서비스처럼 다루는 것이 안전하다.</p>\n<ul>\n<li><strong>헬스체크</strong>: 프로세스가 살아 있는지, 의존 API가 응답하는지</li>\n<li><strong>메트릭</strong>: 도구 호출 수, 지연, 에러율, 타임아웃 비율</li>\n<li><strong>알림</strong>: 특정 도구의 에러율이 급증하면 페이지</li>\n</ul>\n<p>특히 <strong>외부 API 의존</strong>이 큰 도구는, 장애 시 <strong>우아한 실패(graceful degradation)</strong> 메시지를 반환하도록 설계한다. “지금 이슈 트래커가 응답하지 않습니다. 5분 후 다시 시도하세요” 같은 문장은 모델이 사용자에게 전달하기 좋다.</p>\n<h2 id=\"설계-패턴-도구를-작게-쪼개기\" style=\"position:relative;\"><a href=\"#%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EC%9E%91%EA%B2%8C-%EC%AA%BC%EA%B0%9C%EA%B8%B0\" aria-label=\"설계 패턴 도구를 작게 쪼개기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>설계 패턴: 도구를 작게 쪼개기</h2>\n<p>초보자가 자주 하는 실패는 <strong>하나의 거대한 도구</strong>에 모든 것을 넣는 것이다. 예를 들어 <code class=\"language-text\">do_everything_for_deploy</code> 같은 도구는 모델이 언제 어떤 단계에서 실패했는지 알기 어렵다. 대신 다음처럼 나눈다.</p>\n<ul>\n<li><code class=\"language-text\">get_latest_commit_sha</code></li>\n<li><code class=\"language-text\">run_ci_status_check</code></li>\n<li><code class=\"language-text\">create_release_tag</code> (승인 후에만)</li>\n</ul>\n<p>이렇게 하면 <strong>디버깅</strong>, <strong>권한 분리</strong>, <strong>감사</strong>가 모두 쉬워진다.</p>\n<h2 id=\"팀-도입-로드맵-제안\" style=\"position:relative;\"><a href=\"#%ED%8C%80-%EB%8F%84%EC%9E%85-%EB%A1%9C%EB%93%9C%EB%A7%B5-%EC%A0%9C%EC%95%88\" aria-label=\"팀 도입 로드맵 제안 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>팀 도입 로드맵 제안</h2>\n<ol>\n<li><strong>1주차</strong>: 읽기 전용 도구만(문서 검색, 스키마 조회). 로그 수집.</li>\n<li><strong>2주차</strong>: 팀원 피드백으로 스키마·설명문 개선. 잘못된 호출 패턴 분석.</li>\n<li><strong>3주차</strong>: 제한된 쓰기 도구(티켓 코멘트 dry-run → 실제).</li>\n<li><strong>4주차</strong>: 배포·운영 도구는 별도 프로파일과 승인 플로우.</li>\n</ol>\n<p>무리하게 처음부터 “모든 자동화”를 넣으면, 보안 사고나 운영 부담만 커진다.</p>\n<h2 id=\"mcp만으로-해결되지-않는-것\" style=\"position:relative;\"><a href=\"#mcp%EB%A7%8C%EC%9C%BC%EB%A1%9C-%ED%95%B4%EA%B2%B0%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EA%B2%83\" aria-label=\"mcp만으로 해결되지 않는 것 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MCP만으로 해결되지 않는 것</h2>\n<ul>\n<li><strong>나쁜 데이터 품질</strong>: 위키가 엉망이면 검색 도구도 엉망이다.</li>\n<li><strong>조직 절차</strong>: 코드 리뷰, 변경 관리 프로세스가 없으면 도구만 늘어난다.</li>\n<li><strong>모델 한계</strong>: 도구가 완벽해도 추론 실패는 남는다. 평가 세트를 준비할 것.</li>\n</ul>\n<h2 id=\"정리\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EB%A6%AC\" aria-label=\"정리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정리</h2>\n<p>MCP는 <strong>AI 에디터와 사내 시스템 사이의 접착제</strong>로 이해하면 쉽다. 표준 프로토콜이 있기 때문에, 호스트가 바뀌어도 서버를 재사용할 여지가 생긴다. 하지만 <strong>도구 경계 설계, 권한, 로깅, 팀 규칙</strong> 없이 도입하면 “편의를 위한 새로운 단일 장애점”이 될 수 있다. 이 글이 MCP 서버를 처음 설계하거나, Cursor에 사내 도구를 안전하게 붙이려는 팀에게 <strong>실전 체크리스트</strong> 역할을 하길 바란다.</p>\n<h3 id=\"참고로-알아두면-좋은-것들\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0%EB%A1%9C-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EA%B2%83%EB%93%A4\" aria-label=\"참고로 알아두면 좋은 것들 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고로 알아두면 좋은 것들</h3>\n<ul>\n<li>사용 중인 호스트가 지원하는 <strong>전송 방식(stdio / remote)</strong> 과 <strong>인증 모델</strong></li>\n<li>공식 SDK 릴리스 노트(브레이킹 체인지)</li>\n<li>사내 보안팀의 <strong>클라우드 LLM 사용 정책</strong></li>\n</ul>\n<p>MCP는 도구다. <strong>어떤 일을 자동화할지</strong>, <strong>어디까지 허용할지</strong>를 팀이 먼저 합의하는 것이, 기술보다 앞선다.</p>\n<h2 id=\"프로토콜-메시지-흐름을-한-번-더-짚기\" style=\"position:relative;\"><a href=\"#%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%9D%90%EB%A6%84%EC%9D%84-%ED%95%9C-%EB%B2%88-%EB%8D%94-%EC%A7%9A%EA%B8%B0\" aria-label=\"프로토콜 메시지 흐름을 한 번 더 짚기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>프로토콜 메시지 흐름을 한 번 더 짚기</h2>\n<p>실제 구현을 읽을 때 헷갈리는 부분이 “언제 무엇이 오가는가”다. 대략적인 순서는 다음과 같다(호스트·SDK에 따라 세부는 다를 수 있다).</p>\n<ol>\n<li><strong>클라이언트 초기화</strong>: 클라이언트가 서버에 연결하고, 서버가 지원하는 기능(capabilities)을 서로 교환한다.</li>\n<li><strong>도구 목록 조회</strong>: <code class=\"language-text\">tools/list</code> 또는 이에 상응하는 요청으로 도구 이름·설명·입력 스키마를 받는다.</li>\n<li><strong>도구 호출</strong>: 모델이 특정 도구를 선택하면 <code class=\"language-text\">tools/call</code> 형태로 인자가 전달되고, 서버는 구조화된 결과를 돌려준다.</li>\n<li><strong>리소스·프롬프트</strong>: 필요 시 리소스 URI 목록, 프롬프트 템플릿을 추가로 조회한다.</li>\n</ol>\n<p>여기서 중요한 점은, <strong>모델이 “도구를 호출했다”는 사실은 호스트 쪽에서도 관찰 가능</strong>해야 한다는 것이다. 그래서 운영 팀은 호스트 로그와 MCP 서버 로그를 <strong>상관관계(correlation id)</strong> 로 묶는 것을 권장한다. 예를 들어 사용자 세션 ID나 요청 ID를 도구 핸들러 인자에 넣지는 않더라도, 로그 한 줄에 같은 ID를 남겨 추적 가능하게 한다.</p>\n<h3 id=\"json-rpc-스타일-사고방식\" style=\"position:relative;\"><a href=\"#json-rpc-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%82%AC%EA%B3%A0%EB%B0%A9%EC%8B%9D\" aria-label=\"json rpc 스타일 사고방식 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JSON-RPC 스타일 사고방식</h3>\n<p>MCP는 내부적으로 JSON 메시지를 주고받는다. 직접 패킷을 만질 일은 SDK가 줄여 주지만, 장애 분석할 때는 “요청 ID”, “에러 객체”, “부분 실패”를 이해해야 한다.</p>\n<ul>\n<li><strong>요청 ID</strong>: 비동기 환경에서 응답 매칭에 쓰인다. 로그에 요청 ID를 남기면 재현이 쉽다.</li>\n<li><strong>에러 객체</strong>: HTTP가 아니라도, 애플리케이션 수준에서 <code class=\"language-text\">code</code>, <code class=\"language-text\">message</code>, <code class=\"language-text\">data</code>를 구조화해 돌려줄 수 있다. 사용자에게 보여 줄 문구와, 개발자가 디버깅할 상세는 분리하는 것이 좋다.</li>\n<li><strong>스트리밍</strong>: 일부 호스트는 긴 응답을 스트리밍한다. 도구 구현 시 “중간 청크”와 “최종 요약”을 어떻게 나눌지 미리 정한다.</li>\n</ul>\n<h2 id=\"cursor에서의-설정-개략-개념\" style=\"position:relative;\"><a href=\"#cursor%EC%97%90%EC%84%9C%EC%9D%98-%EC%84%A4%EC%A0%95-%EA%B0%9C%EB%9E%B5-%EA%B0%9C%EB%85%90\" aria-label=\"cursor에서의 설정 개략 개념 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cursor에서의 설정 개략 (개념)</h2>\n<p>Cursor를 예로 들면, 사용자는 설정 파일에 MCP 서버 실행 커맨드를 등록한다. 정확한 키 이름과 스키마는 제품 업데이트로 바뀔 수 있으므로 <strong>공식 문서를 항상 우선</strong>하라. 여기서는 “무엇을 채워야 하는지” 수준만 적는다.</p>\n<ul>\n<li><strong>command</strong>: <code class=\"language-text\">node</code> 혹은 <code class=\"language-text\">npx</code>, <code class=\"language-text\">uvx</code> 등 실행 파일</li>\n<li><strong>args</strong>: 엔트리 스크립트 경로, <code class=\"language-text\">--port</code> 같은 인자</li>\n<li><strong>env</strong>: API 키, <code class=\"language-text\">NODE_ENV</code>, 사내 프록시 URL</li>\n<li><strong>cwd</strong>: 모노레포 루트를 지정해야 상대 경로가 맞는 경우</li>\n</ul>\n<p>자주 발생하는 실수는 <strong>상대 경로를 앱이 실행되는 cwd 기준으로 해석</strong>한다는 점이다. 팀 저장소 루트에 <code class=\"language-text\">mcp-servers/wiki</code>가 있다면, <code class=\"language-text\">cwd</code>를 명시하거나 절대 경로를 쓴다.</p>\n<h2 id=\"장애-분석-체크리스트\" style=\"position:relative;\"><a href=\"#%EC%9E%A5%EC%95%A0-%EB%B6%84%EC%84%9D-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8\" aria-label=\"장애 분석 체크리스트 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>장애 분석 체크리스트</h2>\n<p>현장에서 바로 쓸 수 있는 순서다.</p>\n<ol>\n<li><strong>프로세스가 뜨는가</strong>: 호스트가 서버를 기동했는지, 즉시 크래시하는지 확인한다.</li>\n<li><strong>stdio 버퍼링</strong>: 로그가 안 보인다고 해서 없는 것이 아닐 수 있다. 표준 에러로 로깅하고, 버퍼링 이슈를 의심한다.</li>\n<li><strong>네트워크</strong>: 원격 MCP라면 TLS 핸드셰이크, 프록시, DNS를 순서대로 점검한다.</li>\n<li><strong>권한 토큰</strong>: OAuth 토큰 만료, AWS 자격 증명 갱신 실패.</li>\n<li><strong>의존 서비스 레이트 리밋</strong>: 외부 API가 429를 반환하면 도구는 실패하고, 모델은 다른 전략을 시도한다. <strong>백오프(backoff)</strong> 와 <strong>캐시</strong>를 도입한다.</li>\n</ol>\n<h2 id=\"팀에서-자주-묻는-질문\" style=\"position:relative;\"><a href=\"#%ED%8C%80%EC%97%90%EC%84%9C-%EC%9E%90%EC%A3%BC-%EB%AC%BB%EB%8A%94-%EC%A7%88%EB%AC%B8\" aria-label=\"팀에서 자주 묻는 질문 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>팀에서 자주 묻는 질문</h2>\n<p><strong>Q. REST로 다 할 수 있는데 MCP가 꼭 필요한가?</strong><br>\nA. 필수는 아니다. 다만 에디터·에이전트 생태계에서 <strong>재사용과 표준화</strong>를 노린다면 MCP가 유리한 경우가 많다. 이미 REST 게이트웨이가 잘 갖춰져 있고, 통합 대상이 한두 개라면 굳이 옮기지 않아도 된다.</p>\n<p><strong>Q. 사내 규정상 모델은 온프레미스만 쓴다. MCP는 괜찮은가?</strong><br>\nA. MCP는 <strong>프로토콜</strong>이지 특정 클라우드가 아니다. 다만 호스트가 외부로 데이터를 보내는지, MCP 서버 응답이 로그에 남는지는 <strong>데이터 분류 정책</strong>과 함께 검토해야 한다.</p>\n<p><strong>Q. 도구가 너무 많으면 모델이 헷갈리지 않나?</strong><br>\nA. 그렇다. 그래서 <strong>프로파일별로 서버를 나누거나</strong>, 세션 시작 시 필요한 도구만 활성화하는 패턴이 나온다. “전부 켜기”는 편해 보여도 품질을 떨어뜨린다.</p>\n<p><strong>Q. 테스트는 어떻게 하나?</strong><br>\nA. 도구 핸들러는 <strong>순수 함수에 가깝게</strong> 분리하고, 단위 테스트로 입력 스키마 검증·외부 API 모킹을 한다. 통합 테스트는 실제 MCP 클라이언트를 띄우기보다, <strong>서버를 직접 호출하는 스크립트</strong>로 스모크 테스트하는 팀도 많다.</p>\n<p><strong>Q. 버전 업으로 도구 스키마가 바뀌면?</strong><br>\nA. 시맨틱 버저닝을 도구 이름에 반영하거나(<code class=\"language-text\">search_wiki_v2</code>), 마이그레이션 기간 동안 구버전을 병행 제공한다. 모델이 예전 스키마로 호출하는 혼선을 줄이려면, <strong>설명문(description)에 “deprecated, 대신 X 사용”</strong>을 명확히 쓴다.</p>\n<h2 id=\"사례-연구-문서-검색-도구를-도입할-때의-의사결정\" style=\"position:relative;\"><a href=\"#%EC%82%AC%EB%A1%80-%EC%97%B0%EA%B5%AC-%EB%AC%B8%EC%84%9C-%EA%B2%80%EC%83%89-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%8F%84%EC%9E%85%ED%95%A0-%EB%95%8C%EC%9D%98-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95\" aria-label=\"사례 연구 문서 검색 도구를 도입할 때의 의사결정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>사례 연구: “문서 검색” 도구를 도입할 때의 의사결정</h2>\n<p>가장 흔한 첫 도구는 내부 문서 검색이다. 이때 팀은 보통 다음 갈림길에 선다.</p>\n<ol>\n<li><strong>전체 본문을 그대로 반환</strong>할 것인가, <strong>요약과 링크만</strong> 줄 것인가. 전자는 구현은 쉽지만 토큰 비용과 유출 면적이 커진다.</li>\n<li><strong>검색 엔진</strong>을 무엇으로 둘 것인가. Elasticsearch, OpenSearch, 사내 Solr, 혹은 벡터 DB와의 하이브리드.</li>\n<li><strong>접근 제어</strong>를 어디서 할 것인가. MCP 서버가 사용자 신원을 어떻게 알 것인지(호스트가 헤더로 넘겨주는지, SSO 토큰을 검증하는지)를 정하지 않으면, “내부용”이라는 말이 공허해진다.</li>\n</ol>\n<p>이 세 가지를 문서화한 뒤에야, 검색 품질 튜닝과 프롬프트 개선이 의미 있는 반복이 된다. 기술만으로는 부족하고, <strong>정보 설계와 권한 모델</strong>이 함께 가야 한다.</p>\n<h2 id=\"마무리-표준은-책임을-줄여-주지-않는다\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EB%AC%B4%EB%A6%AC-%ED%91%9C%EC%A4%80%EC%9D%80-%EC%B1%85%EC%9E%84%EC%9D%84-%EC%A4%84%EC%97%AC-%EC%A3%BC%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4\" aria-label=\"마무리 표준은 책임을 줄여 주지 않는다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마무리: “표준”은 책임을 줄여 주지 않는다</h2>\n<p>MCP는 통합 비용을 낮출 수 있는 좋은 방향이다. 하지만 <strong>무엇을 노출할지</strong>는 여전히 우리의 몫이다. 작은 도구부터, 읽기부터, 로그부터 시작해 점진적으로 확장하라. 그리고 항상 한 가지를 기억하라. <strong>가장 위험한 것은 강력한 도구가 아니라, 감사 없는 도구다.</strong></p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#mcp%EC%9D%98-%EC%9C%84%EC%B9%98-%EC%99%9C-%EB%98%90-%EB%8B%A4%EB%A5%B8-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9D%B8%EA%B0%80\">MCP의 위치: 왜 또 다른 프로토콜인가</a></p>\n<ul>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EA%B8%B0%EC%A1%B4-%EB%B0%A9%EC%8B%9D%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4\">기존 방식과의 차이</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C-%ED%98%B8%EC%8A%A4%ED%8A%B8-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%84%9C%EB%B2%84\">구성 요소: 호스트, 클라이언트, 서버</a></li>\n<li>\n<p><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EB%8F%84%EA%B5%ACtools-%EB%A6%AC%EC%86%8C%EC%8A%A4resources-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8prompts\">도구(Tools), 리소스(Resources), 프롬프트(Prompts)</a></p>\n<ul>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EB%8F%84%EA%B5%ACtools\">도구(Tools)</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EB%A6%AC%EC%86%8C%EC%8A%A4resources\">리소스(Resources)</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8prompts\">프롬프트(Prompts)</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%A0%84%EC%86%A1-%EB%B0%A9%EC%8B%9D-stdio%EC%99%80-%EC%9B%90%EA%B2%A9\">전송 방식: stdio와 원격</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#typescript%EB%A1%9C-%EC%B5%9C%EC%86%8C-mcp-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B0%9C%EB%85%90-%EC%98%88%EC%A0%9C\">TypeScript로 최소 MCP 서버 만들기 (개념 예제)</a></li>\n<li>\n<p><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#cursor-%EB%93%B1-%EC%97%90%EB%94%94%ED%84%B0%EC%99%80%EC%9D%98-%EC%97%B0%EB%8F%99%EC%97%90%EC%84%9C-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%8B%A4%EC%A0%9C-%EB%AC%B8%EC%A0%9C\">Cursor 등 에디터와의 연동에서 생기는 실제 문제</a></p>\n<ul>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%ED%8C%80-%EA%B7%9C%EC%B9%99-%EC%98%88%EC%8B%9C\">팀 규칙 예시</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EB%B3%B4%EC%95%88-mcp%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B3%B5%EA%B2%A9%EB%A9%B4%EC%9D%B4%EB%8B%A4\">보안: MCP는 “새로운 공격면”이다</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%9A%B4%EC%98%81-%EA%B4%80%EC%A0%90-%EA%B4%80%EC%B8%A1-%EA%B0%80%EB%8A%A5%EC%84%B1%EA%B3%BC-%EC%9E%A5%EC%95%A0-%EB%8C%80%EC%9D%91\">운영 관점: 관측 가능성과 장애 대응</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%84%A4%EA%B3%84-%ED%8C%A8%ED%84%B4-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EC%9E%91%EA%B2%8C-%EC%AA%BC%EA%B0%9C%EA%B8%B0\">설계 패턴: 도구를 작게 쪼개기</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%ED%8C%80-%EB%8F%84%EC%9E%85-%EB%A1%9C%EB%93%9C%EB%A7%B5-%EC%A0%9C%EC%95%88\">팀 도입 로드맵 제안</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#mcp%EB%A7%8C%EC%9C%BC%EB%A1%9C-%ED%95%B4%EA%B2%B0%EB%90%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EA%B2%83\">MCP만으로 해결되지 않는 것</a></li>\n<li>\n<p><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%A0%95%EB%A6%AC\">정리</a></p>\n<ul>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%B0%B8%EA%B3%A0%EB%A1%9C-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EA%B2%83%EB%93%A4\">참고로 알아두면 좋은 것들</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%9D%90%EB%A6%84%EC%9D%84-%ED%95%9C-%EB%B2%88-%EB%8D%94-%EC%A7%9A%EA%B8%B0\">프로토콜 메시지 흐름을 한 번 더 짚기</a></p>\n<ul>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#json-rpc-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%82%AC%EA%B3%A0%EB%B0%A9%EC%8B%9D\">JSON-RPC 스타일 사고방식</a></li>\n</ul>\n</li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#cursor%EC%97%90%EC%84%9C%EC%9D%98-%EC%84%A4%EC%A0%95-%EA%B0%9C%EB%9E%B5-%EA%B0%9C%EB%85%90\">Cursor에서의 설정 개략 (개념)</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%9E%A5%EC%95%A0-%EB%B6%84%EC%84%9D-%EC%B2%B4%ED%81%AC%EB%A6%AC%EC%8A%A4%ED%8A%B8\">장애 분석 체크리스트</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%ED%8C%80%EC%97%90%EC%84%9C-%EC%9E%90%EC%A3%BC-%EB%AC%BB%EB%8A%94-%EC%A7%88%EB%AC%B8\">팀에서 자주 묻는 질문</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EC%82%AC%EB%A1%80-%EC%97%B0%EA%B5%AC-%EB%AC%B8%EC%84%9C-%EA%B2%80%EC%83%89-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%8F%84%EC%9E%85%ED%95%A0-%EB%95%8C%EC%9D%98-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95\">사례 연구: “문서 검색” 도구를 도입할 때의 의사결정</a></li>\n<li><a href=\"/etc/MCP-Model-Context-Protocol-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EC%97%90%EB%94%94%ED%84%B0%EC%97%90-%EB%8F%84%EA%B5%AC%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EB%B0%A9%EB%B2%95/#%EB%A7%88%EB%AC%B4%EB%A6%AC-%ED%91%9C%EC%A4%80%EC%9D%80-%EC%B1%85%EC%9E%84%EC%9D%84-%EC%A4%84%EC%97%AC-%EC%A3%BC%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4\">마무리: “표준”은 책임을 줄여 주지 않는다</a></li>\n</ul>","frontmatter":{"title":"MCP(Model Context Protocol) 실전 가이드 — AI 에디터에 도구를 붙이는 방법","date":"April 15, 2026","description":"Model Context Protocol의 구조와 호스트·클라이언트·서버 관계를 정리하고, TypeScript로 MCP 서버를 구현하는 예제, Cursor 등 IDE 연동, 보안·권한·운영 시 고려할 점까지 실무 관점에서 상세히 다룬다.","tags":["MCP","Model Context Protocol","Cursor","AI","TypeScript","개발 생산성","도구 통합"]}}},"pageContext":{"slug":"/etc/MCP-Model-Context-Protocol-실전-가이드-AI-에디터에-도구를-붙이는-방법/","previous":{"fields":{"slug":"/etc/k6-부하-테스트-시나리오-설계와-GitHub-Actions-CI-게이트/"},"frontmatter":{"title":"k6 부하 테스트 — 시나리오 설계와 GitHub Actions CI 게이트까지","tags":["k6","부하 테스트","성능","GitHub Actions","CI","SRE","관측 가능성"]}},"next":{"fields":{"slug":"/etc/Drizzle-ORM과-PostgreSQL-스키마-마이그레이션-운영-완전-가이드/"},"frontmatter":{"title":"Drizzle ORM과 PostgreSQL — 스키마·마이그레이션·운영 완전 가이드","tags":["Drizzle ORM","PostgreSQL","TypeScript","마이그레이션","drizzle-kit","백엔드","데이터베이스"]}}}},"staticQueryHashes":["3262363727","4027999303"]}