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")