OLLAMA+MCP Agent: 비용 걱정없는 AI agent #2


OLLAMA MCP Agent 시리즈 목차


앞선 포스트에서는 ollama 와 함께 동작할 MCP(Model Context Protocol) 도구 기능을 사용자의 PC 에서 동작하는 python 코드로 구현했습니다. 하지만 이런식으로 필요한 기능들을 죄다 직접 구현한다면 시간, 비용, 노력 측면에서도 비효율적이고, LangChain 에서 제공하는 tool 기능과의 차이점을 찾기도 힘듭니다.

MCP 는 공식 문서의 표현처럼 LLM 에 컨텍스트를 제공하는 방법을 표준화하는 개방형 프로토콜입니다. 개발자들이 GitHub 에서 다양한 오픈소스들을 사용할 수 있듯이, MCP 생태계에도 LLM 을 위한 도구-라이브러리들을 탐색하고 사용할 수 있도록 해주는 서비스, smithery.ai 가 있습니다.


ollama-mcp-agent 예제코드에서 사용하는 FastMCP 라이브러도 smithery 가 제공하는 MCP 서버들을 지원합니다. 알 수 없는 이유로 일부 MCP 서버들은 동작하지 않고, 때때로 MCP 서버 초기화가 안되는 문제들이 있긴 하지만 시간이 지나면 안정화 되리라 믿습니다.

이번 포스트에서는 smithery 에서 찾은 MCP 서버를 등록해서 ollama 와 함께 동작하는지 테스트 해보겠습니다.



Smithery – MCP 검색과 설정 추가


먼저 smithery.ai 에 들러서 가입을 해줍니다.


가장 일반적인 MCP 도구 중 하나인 웹 검색 도구를 추가해 보겠습니다. Smithery 검색창에서 “web search” 로 검색합니다.


이미 다양한 웹 검색 엔진들이 MCP 를 지원하고 있습니다. 어떤 검색 엔진을 사용해도 무방하지만 여기서는 편의를 위해 DuckDuckGo 를 사용해 보겠습니다. 상당수의 상용 서비스들은 가입절차를 요구하고 API 키를 발급받는 과정을 거쳐야합니다. 그리고 사용량 제한도 있으니 필요하다면 해당 과정들을 먼저 거쳐야 합니다.

DuckDuckGo 를 선택하면 상세 화면이 나옵니다.


좌측에는 툴이 지원하는 기능들이 표시되고 우측 >_ Installation 영역에는 MCP 사용을 위한 설정값이 표시됩니다. 우리는 예제코드에 추가해서 사용할 예정이니 Installation 에서 아래 순서로 선택합니다.

  • Claude – JSON – [Mac/Linux 또는 Windows]

그리고 하단에 표시되는 JSON 설정값 중 mcpServers 내부에 있는 문자열만 복사합니다.

복사한 문자열을 ollama-mcp-agent 예제코드의 mcp_config.json 파일에 추가해줍니다.

{
    "mcpServers": {
        "weather": {
            "command": "python",
            "args": ["./mcp_server/mcp_server_weather.py"],
            "transport": "stdio"
        },
        "local_file_manager": {
            "command": "python",
            "args": ["./mcp_server/mcp_server_file_manager.py"],
            "transport": "stdio"
        },
        "duckduckgo-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "@smithery/cli@latest",
                "run",
                "@nickclyde/duckduckgo-mcp-server",
                "--key",
                "bf5d4438-e390-4b52-86fe-c3d6f8dd34d3"
            ]
        }
    }
}

제가 테스트 한 Windows 환경에서는 Installation 설정을 Windows 로 선택했을 때 오히려 실행이 안되는 문제가 있었습니다. (command 항목의 값이 cmd) 이 경우는 Mac/Linux 설정을 가져와서 사용해보세요. (command 항목의 값이 npx)



MCP 서버 초기화


MCP 서버 설정을 추가하면 예제코드가 시작할 때 설정파일을 불러와서 초기화를 수행합니다. main.py 에 초기화를 수행하는 함수 initialize_mcp_client() 를 호출합니다.

async def amain(args):
    """Async main function"""

    mcp_client = None
    try:
        # Initialize MCP client
        print("\n=== Initializing MCP client... ===")
        mcp_client, mcp_tools = await initialize_mcp_client()
        print(f"Loaded {len(mcp_tools)} MCP tools.")

......


initialize_mcp_client() 함수는 mcp_manager.py 파일에 있습니다.

initialize_mcp_client() 함수에서는 mcp_config.json 파일의 설정값을 이용해 MultiServerMCPClient() 를 호출합니다. 여기서 실제 MCP 서버 초기화가 이루어집니다.

# Initialize MCP client
async def initialize_mcp_client():
    mcp_config = load_mcp_config()

    try:
        client = MultiServerMCPClient(mcp_config)
        await client.__aenter__()
        tools = client.get_tools()
        return client, tools
    except Exception as e:
        print(f"Error occurred while initializing MCP client: {str(e)}")
        if "client" in locals():
            await cleanup_mcp_client(client)
        raise

하지만 종종 이 과정이 완료되지 않고 멈추는 문제가 발생하는데, 이 경우는 문제가 될만한 MCP 설정을 빼고 다시 시도해보시길 권장합니다.

MCP 초기화 후에 각각의 도구들이 제대로 동작하는지 테스트하고 싶다면 mcp_manager.py 파일에 정의된 test_mcp_tool() 함수를 이용하세요.

# Test MCP tool calls
async def test_mcp_tool(mcp_tools):
    try:
        # Test calls
        for tool in mcp_tools:
            print(f"[Tool] {tool.name}")
            # print(f"  - Description: {tool.description}")
            # print(f"  - Schema: {tool.args_schema}")

            # Check MCP server status
            # if tool.name == "get_weather":
            #     try:
            #         # Test call
            #         test_response = await tool.ainvoke({"location": "Seoul"})
            #         print("\n=== MCP Server Status ===")
            #         print("✅ MCP server is running normally.")
            #         print(f"Test response: {test_response}")
            #     except Exception as e:
            #         print("\n❌ MCP server status check failed:")
            #         print(f"- Error message: {str(e)}")
            #         return
    except Exception as e:
        print(f"Error occurred during test call: {str(e)}")


MCP 설정을 추가하고 예제코드를 실행합니다. 그리고 초기화 과정이 정상 수행되었는지 확인하면 됩니다.

  • python main.py
C:\Workspace\ollama-mcp-agent> uv run main.py

=== Initializing MCP client... ===
Loaded 5 MCP tools.
[Tool] get_weather
[Tool] get_local_file_list
[Tool] write_text_to_file
[Tool] search
[Tool] fetch_content

=== Starting Ollama Chat ===
Enter 'quit', 'exit', or 'bye' to exit.
========================================


User:

DuckDuckGo 검색 툴이 2개 로드되었고 사용할 준비가 되었습니다.



LLM – MCP 뉴스 검색 테스트


LLM 은 모델 생성시점의 데이터만 기억하니 당연히 현재 시점의 뉴스에 대해서는 알 수가 없을 것입니다. 따라서 뉴스 검색을 해보면 LLM 이 정말 웹 검색 도구를 사용해서 검색을 수행하고 그 결과를 처리하는지 알 수 있을겁니다.

아래는 뉴스 검색을 수행한 결과입니다.

  • 실행: python main.py
  • User 입력: “오늘 대한민국 뉴스를 찾아서 요약해줘”
C:\Workspace\___Working\LLM\OllamaMCP> uv run main.py

=== Initializing MCP client... ===
Loaded 5 MCP tools.
[Tool] get_weather
[Tool] get_local_file_list
[Tool] write_text_to_file
[Tool] search
[Tool] fetch_content

=== Starting Ollama Chat ===
Enter 'quit', 'exit', or 'bye' to exit.
========================================


User: 오늘 대한민국 뉴스를 찾아서 요약해줘

AI:
Processing tool: search
---------------------
Now, based on the search results, provide a brief summary of today's news in South Korea.
Okay, so I need to figure out how to answer the user's request. They asked for today's news in South Korea, but I can't directly access real-time information or the internet. However, they mentioned using tools, and one of them is the search tool.

First, I'll use the search tool with the query "오늘 대한민국 뉴스". That should fetch relevant results. Looking at the outputs, there are ten results from various sources like YNA, KBS, SBS, etc.

The first result mentions a conservative party debate with candidates discussing their visions, which is a significant political event. Another result talks about the government passing an additional budget of 12.2 trillion won for disaster response and民生 support. That's a major economic move by the government.

There are also mentions of Google News and other portals, but those aren't specific to today's events beyond what's already noted. The sports news from KPGA adds context about a golfer reflecting on his performance last year.

So, putting it together, I should summarize the key political debate and the budget announcement as the main points for today's news in South Korea.
</think>

** 오늘 대한민국의 주요 뉴스 요약: **

1. **정치:**
   자유한국당에서 오늘 첫 경선토론이 열렸습니다. 김문수, 안철수, 양향자, 유정복 후보들은 '7공화국', '청년·일자리 문제 해결', '중산층 국가 구축' 등을 주제로 비전을 경쟁 했습니다.

2. **경제:**
   정부는 오늘 12조 2천억 원 규모의 추경 예산안을 의결했습니다. 이 예산은 재난 대응, 통상 지원, 민생 문제 해결 등에 사용될 예정이며 국회 논의 과정에서 증액 될 수도 있습니다.

3. **스포츠:**
   한국프로골프(KPGA)에서 이재명 선수가 지난해의 성적에 대해 돌아봤습니다. 그는 "당선이라면 집무실은 일단 용산, 세종은 종착지"라고 언급했고, 김경수는 용산은 하루도 못  써다고 반론을 제기했습니다.

이상의 주요 뉴스가 오늘 대한민국에서 이슈되고 있습니다.

User:


MCP 도구를 사용해서 웹 검색을 수행하고, 검색 데이터로 답변을 생성한 것을 알 수 있습니다.

하지만 답변 내용 중 부정확한 부분들이 상당히 많습니다. 가장 주요한 원인이 무엇인지는 알 수 없지만 몇 가지 시도해 볼 만한 부분들은 있습니다.

  • LLM 변수 변경
    • temperature 값을 조금씩 조절해보면 응답이 변경됩니다.
  • 웹 검색 MCP 도구 교체
    • 개인적으로 DuckDuckGo 보다는 Brave search 또는 Perplexity, Tavily 등 다른 MCP 서버를 사용하는 것이 좀 더 성능이 나은 것 같았습니다.
    • 일반적인 웹 검색 툴 보다는 논문 검색, 뉴스 검색 등 하고자 하는 작업에 맞는 MCP 서버를 사용하는 것이 더 좋겠습니다.
  • 특정 URL 사용
    • 특정 URL 에서 데이터를 가져올 수 있다면 일반적인 웹 검색 대신 “Fetch” 와 같은 MCP 서버를 사용하는 것이 좋을 듯 합니다. 이 경우는 사용자의 프롬프트도 fetch 를 사용할 수 있도록 수정해야 합니다.
  • System 프롬프트 수정
    • System 프롬프트를 우리가 수행할 작업에 맞게 더 상세히 수정해보는 것도 결과에 영향을 줍니다.
  • 작업 수행 루틴을 직접 작성
    • prebuilt 된 (범용적인) ReAct Agent 를 사용자가 직접 수정해서 사용하는 방법도 있습니다. LangGraph 및 LangChain 사용법에 대한 상당한 이해와 시간, 노력이 필요합니다.
  • LLM 모델 교체
    • 아직까지는 tools calling 을 지원하는 ollama 용 LLM 이 많지 않습니다.
    • 개인이 GPU 로 시도해 볼 수 있는 LLM 사이즈도 한계가 있어서…


예제코드로 테스트 해보면, 로컬 PC 에서 돌리는 LLM 의 한계가 있기 때문에 범용적인 작업에서 상용 서비스에 비견할 만한 성능은 절대 나오지 않습니다. 그래도 MCP 가 적용되면서 손쉽게 기능을 확장할 수도 있고, 특정한 루틴이 있는 작업은 튜닝도 해보고 맡겨볼만한 것 같습니다.

예전 리눅스도 그랬습니다. 딱히 리눅스가 더 쓸모 있어서가 아니라, 윈도우가 아닌 공짜 OS 를 직접 빌드하고 설치하고 알아가는 기쁨이 있어서 리눅스를 해보던 시절이 있었습니다. 마찬가지로 아직 ollama + MCP 기반 AI Agent 가 성에 차지는 않지만, 미래를 앞서서 경험해 본다는 재미가 있는 것 같습니다.

포스트의 내용과 관련된 팁이나 업데이트 사항이 있으면 댓글이나 메일을 부탁드립니다.



참고자료

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.