Model Context Protocol
Model Context Protocol(MCP)은 AI 에이전트가 일관된 인터페이스를 통해 외부 도구 및 서비스와 상호작용할 수 있게 해주는 표준화된 프로토콜입니다.
MCP는 도구와 프롬프트를 AI 에이전트가 호출할 수 있는 API 엔드포인트로 노출합니다. 각 도구는 고유한 이름과 JSON 스키마(JSON Schema) 형식을 사용하여 입력 및 출력을 설명하는 입력 스키마를 가집니다.
Koog 프레임워크는 MCP 서버와의 통합을 제공하여, MCP 도구를 Koog 에이전트에 통합할 수 있게 해줍니다.
프로토콜에 대해 자세히 알아보려면 Model Context Protocol 문서를 참조하세요.
MCP 서버
MCP 서버는 Model Context Protocol을 구현하며 AI 에이전트가 도구 및 서비스와 상호작용할 수 있는 표준화된 방법을 제공합니다.
MCP Marketplace 또는 MCP DockerHub에서 바로 사용 가능한 MCP 서버를 찾을 수 있습니다.
MCP 서버는 에이전트와 통신하기 위해 다음과 같은 전송 프로토콜을 지원합니다:
- 별도의 프로세스로 실행되는 MCP 서버와 통신하는 데 사용되는 표준 입출력(stdio) 전송 프로토콜. 예를 들어, Docker 컨테이너나 CLI 도구가 있습니다.
- HTTP를 통해 MCP 서버와 통신하는 데 사용되는 서버 전송 이벤트(SSE) 전송 프로토콜 (선택 사항).
Koog와의 통합
Koog 프레임워크는 agent-mcp 모듈에서 제공되는 추가 API 확장과 함께 MCP SDK를 사용하여 MCP와 통합됩니다.
이 통합을 통해 Koog 에이전트는 다음 작업을 수행할 수 있습니다:
- 다양한 전송 메커니즘(stdio, SSE)을 통해 MCP 서버에 연결합니다.
- MCP 서버에서 사용 가능한 도구를 가져옵니다.
- MCP 도구를 Koog 도구 인터페이스로 변환합니다.
- 변환된 도구를 도구 레지스트리에 등록합니다.
- LLM이 제공한 인자(arguments)를 사용하여 MCP 도구를 호출합니다.
주요 구성 요소
Koog의 MCP 통합을 위한 주요 구성 요소는 다음과 같습니다:
| 구성 요소 | 설명 |
|---|---|
McpTool | Koog 도구 인터페이스와 MCP SDK 사이의 브리지 역할을 합니다. |
McpToolDescriptorParser | MCP 도구 정의를 Koog 도구 디스크립터 형식으로 파싱합니다. |
McpToolRegistryProvider | 다양한 전송 메커니즘(stdio, SSE)을 통해 MCP 서버에 연결하는 MCP 도구 레지스트리를 생성합니다. |
시작하기
1. MCP 연결 설정
Koog에서 MCP를 사용하려면 연결을 설정해야 합니다:
- MCP 서버를 시작합니다(프로세스, Docker 컨테이너 또는 웹 서비스 중 하나로).
- 서버와 통신하기 위한 전송 메커니즘을 생성합니다.
MCP 서버는 에이전트와 통신하기 위해 stdio 및 SSE 전송 메커니즘을 지원하므로, 이 중 하나를 사용하여 연결할 수 있습니다.
stdio로 연결
이 프로토콜은 MCP 서버가 별도의 프로세스로 실행될 때 사용됩니다. 다음은 stdio 전송을 사용하여 MCP 연결을 설정하는 예제입니다:
// MCP 서버 시작 (예: 프로세스로 실행)
val process = ProcessBuilder("path/to/mcp/server").start()
// stdio 전송 생성
val transport = McpToolRegistryProvider.defaultStdioTransport(process)SSE로 연결
이 프로토콜은 MCP 서버가 웹 서비스로 실행될 때 사용됩니다. 다음은 SSE 전송을 사용하여 MCP 연결을 설정하는 예제입니다:
// SSE 전송 생성
val transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:8931")2. 도구 레지스트리 생성
MCP 연결이 설정되면, 다음 방법 중 하나로 MCP 서버의 도구가 포함된 도구 레지스트리를 생성할 수 있습니다:
- 통신을 위해 제공된 전송 메커니즘 사용. 예:
// MCP 서버의 도구로 도구 레지스트리 생성
val toolRegistry = McpToolRegistryProvider.fromTransport(
transport = transport,
serverInfo = McpServerInfo(url = "http://localhost:8931", command = "path/to/mcp/server"),
name = "my-client",
version = "1.0.0"
)- MCP 서버에 연결된 MCP 클라이언트 사용. 예:
// 기존 MCP 클라이언트에서 도구 레지스트리 생성
val toolRegistry = McpToolRegistryProvider.fromClient(
mcpClient = existingMcpClient,
serverInfo = McpServerInfo(url = "http://localhost:8931")
)3. 에이전트와 통합
Koog 에이전트에서 MCP 도구를 사용하려면 에이전트에 도구 레지스트리를 등록해야 합니다:
// 도구가 포함된 에이전트 생성
val agent = AIAgent(
promptExecutor = executor,
strategy = strategy,
llmModel = OpenAIModels.Chat.GPT4o,
toolRegistry = toolRegistry
)
// MCP 도구를 사용하는 태스크로 에이전트 실행
val result = agent.run("Use the MCP tool to perform a task")사용 예제
Google Maps MCP 통합
이 예제는 MCP를 사용하여 지리 데이터를 위한 Google Maps 서버에 연결하는 방법을 보여줍니다:
// Google Maps MCP 서버가 포함된 Docker 컨테이너 시작
val process = ProcessBuilder(
"docker", "run", "-i",
"-e", "GOOGLE_MAPS_API_KEY=$googleMapsApiKey",
"mcp/google-maps"
).start()
// MCP 서버의 도구로 ToolRegistry 생성
val toolRegistry = McpToolRegistryProvider.fromProcess(process = process)
// 에이전트 생성 및 실행
val agent = AIAgent(
promptExecutor = simpleOpenAIExecutor(openAIApiToken),
llmModel = OpenAIModels.Chat.GPT4o,
toolRegistry = toolRegistry,
)
agent.run("Get elevation of the Jetbrains Office in Munich, Germany?")Playwright MCP 통합
이 예제는 MCP를 사용하여 웹 자동화를 위한 Playwright 서버에 연결하는 방법을 보여줍니다:
// Playwright MCP 서버 시작
val process = ProcessBuilder(
"npx", "@playwright/mcp@latest", "--port", "8931"
).start()
// MCP 서버의 도구로 ToolRegistry 생성
val toolRegistry = McpToolRegistryProvider.fromSseUrl("http://localhost:8931")
// 에이전트 생성 및 실행
val agent = AIAgent(
promptExecutor = simpleOpenAIExecutor(openAIApiToken),
llmModel = OpenAIModels.Chat.GPT4o,
toolRegistry = toolRegistry,
)
agent.run("Open a browser, navigate to jetbrains.com, accept all cookies, click AI in toolbar")