아래 링크에 수록된 코드에서 일부를 수정했다.
model은 로컬(LM Tools)에서 lmstudio-community/gemma-2-2b-it-GGUF 모델을 이용한다.
*코드 출처 : https://zzaebok.github.io/nlp/llm/mcp/
[07/10/25 10:37:52] INFO Processing request of type ListToolsRequest
server.py:558
[07/10/25 10:37:56] INFO Processing request of type CallToolRequest
server.py:558
{'messages': [
HumanMessage(content='I am a vegetarian. Can you recommend a menu for me?', additional_kwargs={}, response_metadata={}, id='4a69dca5-2187-4c15-b41c-79fa0d839637'),
AIMessage(content=' \n', additional_kwargs={'tool_calls': [{'index': 0, 'id': '634434116', 'function': {'arguments': '{"preference": "vegetarian"}', 'name': 'recommend_menu'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'stop', 'model_name': 'gemma-2-2b-it', 'system_fingerprint': 'gemma-2-2b-it'}, id='run--2c6607ad-746a-407e-9413-c78d893e81e4-0', tool_calls=[{'name': 'recommend_menu', 'args': {'preference': 'vegetarian'}, 'id': '634434116', 'type': 'tool_call'}]),
ToolMessage(content='Today, I recommend a Caesar Salad for a fresh, vegetarian-friendly option!', name='recommend_menu', id='6807a7ba-e205-4629-9d64-d63a8ccaf462', tool_call_id='634434116'),
AIMessage(content='Great! 😊 🥗 \n', additional_kwargs={}, response_metadata={'finish_reason': 'stop', 'model_name': 'gemma-2-2b-it', 'system_fingerprint': 'gemma-2-2b-it'}, id='run--b1ca329d-56e7-4b85-8653-2e8595b3fab1-0')
]}
from typing import List
from mcp.server.fastmcp import FastMCP
server = FastMCP("MCP Menu Recommender Server")
@server.tool()
def recommend_menu(preference: str) -> str:
"""
Recommend a menu item based on user preference.
Args:
preference (str): User preference, must be one of {"vegetarian", "sweet", "none"}.
"""
if "vegetarian" in preference:
return (
"Today, I recommend a Caesar Salad for a fresh, vegetarian-friendly option!"
)
elif "sweet" in preference:
return "Today, I recommend a Tiramisu for a delicious sweet treat!"
else:
return "Today, I recommend a classic Margherita Pizza!"
if __name__ == "__main__":
server.run()
import os
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
# os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
# model = ChatOpenAI(model="gpt-4o")
# 이 부분을 로컬(LM Tools)로 변경하면,##################################
model = ChatOpenAI(
base_url="http://localhost:1234/v1",
api_key="lm-studio",
# model="lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF",
model = "lmstudio-community/gemma-2-2b-it-GGUF",
temperature=0.1,
streaming=True,
#callbacks=[StreamingStdOutCallbackHandler()], # 스트림 출력 콜백
)
###################################################################
server_py = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mcp_server.py")
server_params = StdioServerParameters(
command="python",
args=[server_py],
)
async def main():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session: # Initialize the connection
await session.initialize()
# Get tools
tools = await load_mcp_tools(session)
# Create and run the agent
agent = create_react_agent(
model,
tools,
prompt="You are a helpful assistant. Answer the user's questions in one word.",
)
agent_response = await agent.ainvoke(
{"messages": "I am a vegetarian. Can you recommend a menu for me?"}
)
print(agent_response)
if __name__ == "__main__":
import asyncio
asyncio.run(main())