Skip to content

MCP

모델이 사용할 수 있는 내장 도구들 이외에도 MCP 서버를 통해 모델에 새로운 기능을 제할 수 있습니다. 이러한 도구를 통해 필요 시 외부 서비스에 연결하고 컨텍스트를 제공받아 사용자 프롬프트에 응답할 수 있습니다.

MCP 서버 설정

LLM 스튜디오의 환경 설정 메뉴에서 사용할 MCP 서버들을 설정할 수 있습니다.

MCP 도구 사용

아래의 예제는 Responses API를 통해 원격 MCP 서버와 상호 작용하는 방법을 보여 줍니다. mcp 내장 도구 타입으로 원격 MCP 서버를 사용할 수 있습니다.

curl https://.../v3/api/responses \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $KONANLLM_API_KEY" \
    -d '{
        "model": "Konan-LLM-ENT-11",
        "messages": [
            {
                "role": "user",
                "content": "어제 나스닥 시황 알려줘"
            }
        ],
        "stream": true,
        "tools": [
            {
                "type": "mcp",
                "mcp": {
                    "server_label": "finmap",
                    "server_description": "Discover interactive stock charts and curated news at finmap.org",
                    "headers": {},
                    "server_url": "https://mcp.finmap.org",
                    "transport": "streamable_http"
                }
            }
        ]
    }'

⚠️신뢰할 수 있는 MCP 서버와만 연결하는 것이 중요합니다. 악성 MCP 서버는 모델 컨텍스트를 통해 민감한 데이터에 접근할 수도 있습니다.

원격 MCP 서버 연결을 위해서는 server_url 이 필요합니다. 경우에 따라서는 인증을 위해 headers 파라미터를 지정해야 할 수도 있습니다.

도구 필터링

MCP 서버에 따라서는 수 십개의 도구들을 제공하기도 합니다. 고려해야할 많은 도구 개수가 많아지면 지연 시간이 늘어 나고, 모델에 따라서는 올바른 도구를 선택할 수 없어 불완전한 응답을 할 가능성이 커집니다. 서버가 제공하는 여러 도구들 중 특정 도구들만 고려해도 되는 상황일 경우 allowed_tools 파라미터를 통해 해당 도구들만 사용하도록 제약할 수 있습니다.

"tools": [
    {
        "type": "mcp",
        "mcp": {
            "server_label": "finmap",
            "server_description": "Discover interactive stock charts and curated news at finmap.org",
            "headers": {},
            "server_url": "https://mcp.finmap.org",
            "transport": "streamable_http",
            "allowed_tools": ["get_market_overview"]
        }
    }
]

응답 스트리밍

스트리밍을 활성화(stream=true) 시키면 어떠한 도구들이 사용되었는 지를 on_tool_start 이벤트를 통해 확인할 수 있습니다. 또한 on_tool_end 이벤트를 통해 도구 호출 결과를 확인할 수 있습니다.

event: on_chain_start
data: {"name": "kylin-service", "id": "run--8776192701604c976caf860c", "parent_id": null, "time": 1760684656}

...

event: on_chain_stream
data: {"content": "MCP Server 도구를 사용중... ", "name": "kylin-service", "id": "run--8776192701604c976caf860c", "parent_id": null}

event: on_tool_start
data: {"name": "get_market_overview", "id": "4c3838fe-99e2-4623-a7f8-d597b86af0ca", "parent_id": "run--8776192701604c976caf860c", "time": 1760684659}

event: on_tool_end
data: {"content": "...", "name": "get_market_overview", "id": "4c3838fe-99e2-4623-a7f8-d597b86af0ca", "parent_id": "run--8776192701604c976caf860c", "time": 1760684665}

event: on_chain_stream
data: {"content": "분석중...", "name": "kylin-service", "id": "run--8776192701604c976caf860c", "parent_id": null}

event: on_chat_model_start
data: {"id": "run--aa2113a3-2719-4d61-9136-9ceb7802b9dd", "parent_id": "run--8776192701604c976caf860c", "time": 1760684669}

event: on_chat_model_stream
data: {"content": "어제", "additional_kwargs": {}, "id": "run--aa2113a3-2719-4d61-9136-9ceb7802b9dd", "parent_id": "run--8776192701604c976caf860c"}

...

event: on_chat_model_end
data: {"model": "Konan-LLM-ENT-11", "finish_reason": "stop", "usage_metadata": {"input_tokens": 856, "output_tokens": 743, "total_tokens": 1599, "input_token_details": {}, "output_token_details": {}}, "id": "run--aa2113a3-2719-4d61-9136-9ceb7802b9dd", "parent_id": "run--8776192701604c976caf860c", "time": 1760684680}

event: on_chain_end
data: {"name": "kylin-service", "id": "run--8776192701604c976caf860c", "parent_id": null, "time": 1760684680}

event: done
data: {}

MCP 서버 구현

from pydantic import Field
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP(name="Demo")

# Add an addition tool
@mcp.tool()
def convert_currency(
    amount: float = Field(description="The amount of currency to convert"), 
    base_currency: str = Field(description="The base currency for exchange rate calculations, i.e. USD, EUR, KRW"), 
    target_currency: str = Field(description="The target currency for exchange rate calculations, i.e. USD, EUR, KRW")
    ) -> float:
    """Convert the currency with the latest exchange rate"""
    url = f"https://cdn.jsdeliver.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/{base_currency.lower()}.json"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        return amount * data.get(base_currency.lower(), {}).get(target_currency.lower(), None)
    else:
        raise Exception(f"Failed to fetch exchange: rate: {response.status_code}")

@mcp.tool()
def calculate_bmi(weight_kg: float, height_m: float) -> float:
    """Calculate BMI given weight in kg and height in meters"""
    return weight_kg / (height_m**2)

if __name__ == "__main__":
    mcp.run(transport="sse")