json-rpc

4 개의 포스트

cloudflare

Cloudflare는 MCP 트래픽을 어떻게 탐지하고 보안을 강화하는가 (새 탭에서 열림)

AI 에이전트는 기존 사용자보다 훨씬 빠르고 반복적으로 도구를 호출할 수 있어, 한 번의 잘못된 판단이 대규모 권한 오용으로 확산될 수 있다. MCP는 에이전트가 SaaS, 내부 애플리케이션, API의 도구를 호출하게 해주지만, 승인되지 않은 서버로 직접 연결하는 ‘Shadow MCP’가 일반 HTTPS 트래픽처럼 보일 수 있다는 문제가 있다. 따라서 클라이언트·네트워크·MCP 서버의 각 지점에서 호출을 식별하고, 검사하며, 실행 전 차단하는 다층 통제가 필요하다. ## AI 에이전트가 기존 권한 모델을 바꾸는 이유 - 기존 권한 체계는 사용자가 판단하고, 사람의 속도로만 작업한다는 가정에 기반했다. - AI 에이전트는 판단이 비결정적이며, 같은 도구를 피로 없이 반복 호출할 수 있다. - 잘못된 판단 하나가 사람이 알아차리기 전에 수천 건의 잘못된 작업으로 확대될 수 있다. - 에이전트 연결은 한 줄의 설정만으로 가능해, 직원이 승인 여부를 확인하지 않고 MCP 서버를 사용할 위험이 있다. ## MCP 도구 호출의 구조와 보안 신호 MCP 호출은 시스템의 위치에 따라 세 가지 형태로 나타난다. - 클라이언트 내부에서는 특정 도구와 인자를 호출하기로 한 에이전트의 결정이다. - 네트워크에서는 JSON-RPC 메시지를 담은 HTTP 요청이다. - 서버에서는 실제 도구 핸들러를 실행하는 작업으로 변환된다. - 요청에는 다음과 같은 식별 정보가 포함된다. - `Host`, 경로: 대상 서버 식별 - `Authorization`: 호출자 인증 정보 - `MCP-Protocol-Version`: MCP 프로토콜 버전 - `Mcp-Method`: 수행할 작업 - `Mcp-Name`: 호출할 도구 이름 - `id`: 요청과 응답을 연결하는 식별자 - `params`: 도구 인자 - 특히 `params`에는 검색어, 소스 코드, 고객 데이터, 티켓 생성이나 인프라 변경 지시가 포함될 수 있어 가장 민감하다. - 응답에도 도구가 반환한 민감한 데이터가 포함될 수 있으므로 요청뿐 아니라 응답 검사와 로깅도 중요하다. - MCP는 특정 호스트명이나 `/mcp` 경로를 반드시 요구하지 않기 때문에, 승인되지 않은 직접 연결이 일반 HTTPS API 호출처럼 보일 수 있다. ## 클라이언트 내부 통제 - 모델이 도구를 선택한 뒤 실제 요청으로 직렬화하기 전에 서버, 도구 이름, 인자를 검사할 수 있다. - 승인 목록에 없는 서버를 차단할 수 있다. - 민감한 작업에 사용자 확인을 요구할 수 있다. - 요청이 기기를 떠나기 전에 인자에서 민감한 데이터를 제거할 수 있다. - 네트워크를 사용하지 않는 로컬 `stdio` MCP 서버도 통제할 수 있다. - 단점은 사용하는 모든 MCP 클라이언트마다 통제를 별도로 구현해야 한다는 점이다. - 조직이 클라이언트와 기기를 모두 관리할 때 효과적이지만, 단일 클라이언트의 telemetry만으로는 전체 MCP 사용 현황을 파악할 수 없다. ## 네트워크 경계에서의 탐지와 차단 - 보안 웹 게이트웨이는 요청이 클라이언트를 떠난 뒤 HTTP 트래픽을 관찰한다. - TLS 복호화를 적용하면 사용자와 기기, 대상 서버, MCP 관련 헤더를 함께 식별할 수 있다. - 특정 MCP 클라이언트에 의존하지 않고 관리되는 네트워크 경로의 원격 MCP 트래픽을 폭넓게 탐지할 수 있다. - 승인된 MCP Portal을 거치지 않는 직접 연결을 목적지에 도달하기 전에 차단할 수 있다. - DLP 기능을 사용하면 JSON-RPC 메서드와 인자를 검사해 민감한 데이터 전송을 차단하거나 기록할 수 있다. - 다만 로컬 `stdio` 호출이나 조직 네트워크 밖에서 발생한 트래픽은 볼 수 없다. ## MCP 서버에서의 실행 전 통제 - MCP 서버는 호출자를 인증하고, 메시지를 해석하며, 도구와 인자를 검증한 뒤 실행하는 가장 풍부한 실행 컨텍스트를 가진다. - 도구 핸들러가 실행되기 전에 다음 정책을 적용할 수 있다. - 호출자별 도구 권한 확인 - 호출 횟수 제한 - 인자 검사 - 실행 결과와 승인 여부 기록 - 읽기 작업은 허용하되, 쓰기 작업에는 에이전트 식별 정보와 감사 이벤트를 추가할 수 있다. - 중요 작업은 핸들러 실행 전에 차단해야 하며, 실행 후 로그만 남기는 방식으로는 피해를 예방할 수 없다. - Cloudflare의 WriteGuard는 도구별 위험 등급과 활성화 상태를 사용해 읽기·쓰기·중요 작업을 차등 처리한다. - 서버 측 통제는 사용자가 클라이언트를 바꾸거나 로컬 훅을 비활성화해도 우회하기 어렵다. - 단, 해당 통제를 구현한 MCP 서버만 보호할 수 있다는 한계가 있다. ## Cloudflare One과 MCP Portal의 역할 - Cloudflare One은 검사된 MCP 트래픽을 식별하고, 어떤 사용자와 서버가 생성했는지 보여주는 기능을 제공한다. - 관리 네트워크 경로에서 직접 연결을 통제해 승인된 MCP Portal 경로만 사용하도록 강제할 수 있다. - 이를 통해 관리자는 에이전트가 승인된 경로를 이용하는지, 아니면 MCP Portal을 우회해 서버에 직접 연결하는지 확인할 수 있다. - 네트워크 계층은 가장 넓은 범위의 원격 MCP 연결을 감시하고, 클라이언트와 서버 계층은 요청 내용과 실행 맥락을 더 깊이 통제한다. ## 실용적인 권장 방식 MCP 보안은 한 지점에 의존하기보다 다층으로 구성하는 것이 적절하다. 클라이언트에서는 민감한 요청을 사전 확인하고, 네트워크에서는 Shadow MCP와 Portal 우회 연결을 탐지·차단하며, 서버에서는 도구별 권한·위험 등급·속도 제한을 적용해야 한다. 특히 데이터 변경이나 외부 시스템 조작을 수행하는 도구는 반드시 서버에서 실행 전에 검증하고 감사 로그를 남겨야 한다.

cloudflare

MCP의 차세대 기술 (새 탭에서 열림)

지난 1년 반 동안 MCP는 에이전트와 외부 서비스를 연결하는 표준이 되었지만, 기존에는 세션과 연결 상태를 유지해야 해 원격 서버 운영이 복잡했다. 2026-07-28 사양부터 MCP는 완전한 무상태 프로토콜로 바뀌어, 서버가 세션을 저장하거나 sticky session·장기 스트림을 관리하지 않아도 된다. 그 결과 MCP 서버는 Cloudflare Workers 같은 요청 단위 인프라에서 더 저렴하고 간단하게 운영할 수 있다. ## MCP의 무상태 전환 - 기존 MCP는 `initialize`와 `initialized` 교환으로 세션을 만들고, 서버가 `Mcp-Session-Id`를 발급했다. - 이후 모든 요청은 해당 세션의 상태를 찾아야 했기 때문에 다음과 같은 운영 부담이 발생했다. - 오토스케일링 환경에서 세션 보존 - sticky session을 통한 요청 라우팅 - 배포 시 세션 drain 또는 migration - 인스턴스 장애 시 재연결 및 세션 복구 - 새 사양에서는 필수 handshake와 `Mcp-Session-Id`, 프로토콜 세션이 제거됐다. - 각 요청이 MCP 버전, 클라이언트 식별 정보, 클라이언트 capability를 직접 포함한다. - 서버 정보를 미리 확인해야 하는 경우에만 선택적으로 `server/discover`를 호출한다. - MCP 자체에 상태가 필요하지 않으므로 기존 `McpAgent` 없이도 서버를 구현할 수 있다. - 애플리케이션 자체에 상태가 필요할 때는 Durable Objects를 사용할 수 있지만, MCP 프로토콜만 제공하는 서버는 Cloudflare Workers처럼 요청 단위 인프라에서 실행할 수 있다. - Cloudflare SDK에서는 기존 `McpAgent` 대신 `createMcpHandler`로 새 무상태 사양을 지원한다. ## 장기 연결이 필요 없는 Elicitation - Elicitation은 서버가 작업을 완료하기 전에 사용자 입력이나 승인을 요청하는 기능이다. - 운영 배포 승인 - 디자인 색상 선택 - 환불 확인 - 기존에는 `elicitation/create`가 열린 스트림에 의존했다. - 이 방식은 스트림 유지, 타임아웃, 비용, 로드 밸런싱을 복잡하게 만들었다. - 새 사양은 Multi Round-Trip Requests(MRTR)를 사용한다. - 서버가 `input_required` 결과를 반환한다. - 클라이언트가 사용자 입력을 수집한다. - 클라이언트가 입력값과 함께 작업을 재시도한다. - 서버가 작업을 완료한다. - 요청 사이에 연결이나 transport session을 보존할 필요가 없다. - 기존 Elicitation 방식과 호환되지 않는 breaking change이지만, 구현과 운영은 훨씬 단순해진다. ## HTTP 인프라가 MCP 요청을 직접 이해 - 기존에는 MCP 요청의 메서드와 대상이 JSON-RPC 본문 안에만 있어, 게이트웨이가 내용을 파싱해야 했다. - 새 Streamable HTTP 요청에는 다음 헤더가 필수로 추가된다. - `Mcp-Protocol-Version` - `Mcp-Method` - `Mcp-Name` - 예를 들어 도구 호출은 `Mcp-Method: tools/call`, `Mcp-Name: search`로 표현할 수 있다. - 게이트웨이, rate limiter, WAF가 JSON 본문을 해석하지 않고도 요청 종류별 정책을 적용할 수 있다. - 도구별 metrics 수집, 메서드별 rate limit, 보안 규칙 적용도 기존 HTTP 인프라 방식으로 처리할 수 있다. ## 캐시와 도구 목록 개선 - `tools/list`, `prompts/list`, `resources/list`, `resources/read` 결과에 다음 힌트가 추가된다. - `ttlMs`: 결과를 얼마나 오래 캐시할 수 있는지 나타냄 - `cacheScope`: 캐시 적용 범위를 나타냄 - 도구 카탈로그는 결정론적으로 정렬된다. - 클라이언트가 연결이 끊겼다가 다시 연결되어도 카탈로그를 재사용하기 쉬워진다. - upstream prompt cache가 불필요하게 무효화되는 문제도 줄일 수 있다. ## 인증 체계의 변화 - 새 사양은 MCP 인증 방식의 우선순위를 정비한다. - 서버와 클라이언트 사이에 사전 관계가 있다면 사전 등록된 클라이언트를 우선 사용한다. - 동적 등록이 필요하면 Client ID Metadata Documents(CIMD)를 사용한다. - Dynamic Client Registration(DCR)은 최후의 수단으로 남지만, 신규 구현에서는 deprecated되었다. ## 실용적인 결론 새 MCP 서버는 세션 저장소나 장기 연결을 기본 전제로 설계할 필요가 없다. 단순한 도구·프롬프트·리소스 서버라면 `createMcpHandler`와 요청 단위 실행 환경을 사용하고, 애플리케이션 자체에 지속 상태나 실시간 협업이 필요할 때만 Durable Objects 같은 상태ful 인프라를 선택하는 것이 권장된다.

github

Copilot SDK를 활용한 AI 기반 GitHub 이슈 분류 구축하기 (새 탭에서 열림)

IssueCrush는 GitHub 이슈를 카드처럼 검토하고, Copilot SDK로 각 이슈의 요약과 처리 방향을 자동으로 제안하는 앱이다. React Native가 Node.js 기반 SDK를 직접 실행할 수 없기 때문에, Copilot SDK는 서버에서 실행하고 클라이언트는 HTTPS로 통신하는 구조를 사용한다. 핵심은 AI를 활용해 트리아지 시간을 줄이되, 인증 보안·리소스 정리·AI 장애 시 대체 경로까지 함께 설계하는 것이다. ## IssueCrush: 스와이프로 이슈 트리아지 - GitHub 이슈를 스와이프 가능한 카드로 표시한다. - 왼쪽으로 넘기면 이슈를 닫고, 오른쪽으로 넘기면 유지한다. - “Get AI Summary”를 누르면 Copilot이 이슈 내용을 분석한다. - 긴 이슈 설명을 직접 모두 읽지 않고도 다음 정보를 빠르게 파악할 수 있다. - 이슈의 핵심 내용 - 주요 문제나 기능 요청 - 조사, 구현, 담당 팀 배정, 중복 이슈 종료 등 권장 조치 ## React Native와 서버 측 SDK 아키텍처 - Copilot SDK는 Node.js 패키지이며 내부적으로 Copilot CLI 프로세스를 실행하고 JSON-RPC로 통신한다. - React Native 앱에서는 Node.js 런타임과 CLI 바이너리를 직접 사용할 수 없으므로 SDK를 서버에서 실행해야 한다. - 구성은 다음과 같다. - React Native·웹 클라이언트 → HTTPS → Node.js 서버 - Node.js 서버 → Copilot SDK → 로컬 Copilot CLI - 클라이언트는 별도로 GitHub OAuth와 GitHub REST API를 사용해 이슈 데이터를 가져온다. - 서버 측 통합의 장점: - 여러 클라이언트가 하나의 SDK 인스턴스를 공유해 연결과 인증 오버헤드를 줄인다. - Copilot 인증 정보와 API 토큰을 모바일 앱에 포함하지 않아 보안성이 높다. - Copilot 장애나 타임아웃이 발생해도 기본 요약으로 대체할 수 있다. - 서버에서 요청·응답, 지연 시간, 오류를 기록해 디버깅과 모니터링이 쉽다. ## 사전 준비 사항 - 서버에 Copilot CLI를 설치하고 시스템 `PATH`에서 실행 가능하게 해야 한다. - GitHub Copilot 구독 또는 BYOK 방식의 자체 API 키가 필요하다. - 서버에서 `copilot auth`를 실행하거나 `COPILOT_GITHUB_TOKEN` 환경 변수를 설정해 CLI를 인증해야 한다. ## Copilot SDK의 세션 기반 실행 SDK 사용 흐름은 다음과 같다. - `CopilotClient`를 생성하고 `start()`로 CLI 프로세스를 시작한다. - `createSession()`으로 사용할 모델과 권한 처리 방식을 지정한다. - `sendAndWait()`에 프롬프트를 전달해 응답을 기다린다. - `response.data.content`에서 요약 결과를 추출한다. - 작업이 끝나면 세션을 `disconnect()`하고 클라이언트를 `stop()`한다. 예시에서는 `gpt-4.1` 모델과 `approveAll` 권한 처리기를 사용하며, 초기화부터 정리까지 `try/finally`로 감싼다. ## 세션 생명주기와 리소스 정리 - SDK의 기본 생명주기는 다음 순서다. - `start()` - `createSession()` - `sendAndWait()` - `disconnect()` - `stop()` - 세션을 정리하지 않으면 리소스와 메모리가 누수될 수 있다. - 항상 `try/finally`에서 정리 작업을 수행해야 한다. - 정리 과정의 오류가 원래 발생한 오류를 덮지 않도록 `catch(() => {})`로 무시할 수 있다. ## 트리아지를 위한 프롬프트 설계 - 원문을 그대로 전달하기보다 모델이 판단하기 쉬운 구조화된 정보를 제공한다. - 프롬프트에는 다음 정보가 포함된다. - 제목과 이슈 번호 - 저장소 이름 - 상태와 라벨 - 생성일 - 작성자 - 이슈 본문 - 모델에게 2~3문장으로 간결하게 답하도록 요청한다. - 응답 목표는 다음 세 가지다. - 이슈가 무엇에 관한 것인지 설명 - 핵심 문제나 요청 식별 - 조사 필요, 구현 가능, 백엔드 팀 배정, 중복으로 종료 등 권장 조치 제안 - 빠른 검토를 위해 명확하고 실행 가능하게 작성하도록 하고, 마크다운 형식은 사용하지 않도록 지시한다. - 라벨과 작성자 같은 메타데이터도 이슈의 성격과 처리 방향을 판단하는 데 중요한 맥락으로 활용된다. ## 실용적인 권장 사항 Copilot SDK를 모바일이나 웹 앱에 직접 넣기보다 Node.js 서버에 배치하고, 인증 정보는 서버에만 보관하는 구성이 적절하다. 또한 세션 정리를 반드시 보장하고, AI가 실패해도 기본 트리아지가 가능하도록 비AI 대체 경로를 마련하는 것이 안정적인 운영에 중요하다.

microsoft

Microsoft Learn MCP 서버 구축기 (새 탭에서 열림)

Microsoft Learn MCP(Model Context Protocol) 서버는 AI 에이전트가 신뢰할 수 있는 최신 기술 문서를 실시간으로 활용할 수 있도록 설계된 원격 서버입니다. 기존의 복잡한 API 통합 방식 대신 표준화된 프로토콜을 채택하여 에이전트가 런타임에 도구를 스스로 발견하고 실행하게 함으로써, 개발자가 브라우저 이동 없이 개발 환경 내에서 정확한 기술 가이드를 받을 수 있도록 지원합니다. ### MCP 도입 배경과 서버 방식의 이점 * **에이전트 네이티브 표준:** MCP는 에이전트가 기능을 실시간으로 협상하고 결과를 스트리밍하는 표준을 제공하여, 수동 검색이나 별도의 임베딩 관리 없이도 최신 데이터를 활용할 수 있게 합니다. * **통합의 단순화:** 클라이언트가 개별 API의 인증, 요청 형식, 에러 처리를 직접 구현할 필요 없이 MCP 호환 에이전트라면 서버 연결만으로 도구 스키마를 자동 인식하고 사용할 수 있습니다. * **지식 서비스의 재사용:** "Ask Learn" 서비스와 동일한 벡터 저장소 및 지식 서비스를 백엔드로 사용하여, RAG(검색 증강 생성) 기반의 높은 정확도와 최신성을 보장합니다. ### 핵심 도구 및 아키텍처 * **제공 도구:** 문서 제목과 URL을 찾는 `microsoft_docs_search`, 전체 문서 내용을 가져오는 `microsoft_docs_fetch`, 언어별 코드 예제 검색에 최적화된 `microsoft_code_sample_search`를 제공합니다. * **시스템 구조:** Azure App Service에 호스트된 C# SDK 기반의 원격 서버로 운영되며, Streamable HTTP Transport를 통해 클라이언트와 통신합니다. * **에이전트 워크플로우 최적화:** LLM 에이전트가 익숙한 '검색 후 읽기' 패턴을 따를 수 있도록 내부 API의 복잡한 파라미터를 직관적인 도구 운영 방식으로 압축하여 제공합니다. ### 운영 및 설계상의 주요 교훈 * **도구 설명이 곧 사용자 경험:** AI 모델에게 도구와 파라미터 설명은 매뉴얼과 같습니다. 단어 선택의 미세한 차이가 도구 활성화율에 직접적인 영향을 미치므로 데이터 기반의 지속적인 최적화가 필요합니다. * **도구 조합의 시너지:** 검색 도구로 최적의 일치 항목을 찾은 후 전체 문서를 읽어 답변의 근거를 강화하는 '도구 조합' 방식을 명시적으로 가이드하여 인용 품질을 개선했습니다. * **분산 시스템으로서의 운영:** 공용 MCP 서버는 다중 지역 배포, 동적 확장, CORS 관리 등 일반적인 상태 비저장(Stateless) 서비스와 동일한 운영상의 복잡성을 가집니다. * **방어적 스키마 진화:** 동적 발견 구조임에도 불구하고 파라미터를 하드코딩하는 클라이언트를 위해, 명칭 변경 시 기존 이름을 병행 지원하는 유예 기간을 두는 등 안정적인 서비스 진화 전략이 중요합니다. ### 실용적인 활용 및 기대 효과 개발자는 이제 브라우저를 열고 검색 결과를 훑어보는 번거로운 과정 대신, 선호하는 AI 에이전트에 Learn MCP 서버를 연결하여 Microsoft 기술 문서를 코드 맥락에 즉시 적용할 수 있습니다. 이는 개발 워크플로우 내에서 정확한 공식 문서를 기반으로 한 자동화된 코딩 지원과 문제 해결을 가능하게 합니다.