MCP서버를 어떻게 동작시켜야 할 까?

MCP에 대해 좀 더 살펴보는 시간을 가져보려 합니다. 테크 스트리머들이 다 한번씩은 MCP에 대해 건드려보고 있더군요.

여기서는 Python의 FastMCP라이브러리를 활용해 MCP의 HelloWorld에 해당하는 덧셈 프로그램을 만들어 보겠습니다.

# main.py
from fastmcp import FastMCP

mcp = FastMCP("Demo 🚀")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b

if __name__ == "__main__":
    mcp.run(transport="sse", host="0.0.0.0", port=8080)

이는 FastMCP의 README에서 가져온 코드를 약간 변형한 것입니다. 이를 실행시키면 8080포트를 사용해 MCP sse서버가 실행됩니다. transport=see 옵션은 mcp를 sse방식으로 실행한다는 의미입니다.


[05/09/25 00:12:54] INFO     Starting server "Demo 🚀"...          server.py:298
INFO:     Started server process [3329278]
INFO:     Waiting for application startup.
INFO:     ASGI 'lifespan' protocol appears unsupported.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

이 서버 프로세스를 어떻게 사용해야 할 까요? 아래 코드는 어떤 테스트 코드로 mcp sse 가 어떻게 사용되는지 잘 보여 줍니다.

# my_server.py (계속)
from fastmcp import Client # 클라이언트 가져오기

async def test_server_locally():
    print("\n--- 로컬 서버 테스트 중 ---")
    # 클라이언트가 서버 객체를 가리키도록 설정합니다.
    client = Client(mcp)

    # 클라이언트는 비동작적이므로 비동기 컨텍스트 관리자를 사용합니다.
    async with client:
        # 'greet' 도구 호출
        greet_result = await client.call_tool("greet", {"name": "FastMCP 사용자"})
        print(f"greet 결과: {greet_result}")

        # 'add' 도구 호출
        add_result = await client.call_tool("add", {"a": 5, "b": 7})
        print(f"add 결과: {add_result}")

        # 'config' 리소스 읽기
        config_data = await client.read_resource("data://config")
        print(f"config 리소스: {config_data}")

        # 템플릿을 사용하여 사용자 프로필 읽기
        user_profile = await client.read_resource("users://101/profile")
        print(f"사용자 101 프로필: {user_profile}")

        # 'summarize' 프롬프트 구조 얻기(여기서 LLM 호출을 실행하지 않음)
        prompt_messages = await client.get_prompt("summarize", {"text": "이것은 일부 텍스트입니다."})
        print(f"요약 프롬프트 구조: {prompt_messages}")

(출처: https://apidog.com/kr/blog/fastmcp-kr/)

위 코드는 어떻게 mcp sse가 사용되는지 예들을 충실히 보여주고 있습니다. 보니까 우리가 만든 ‘덧셈(add)’ 프로그램에 대한 코드도 있네요.

Dify를 통해 간단하게 이를 활용하는 것을 만들어 보겠습니다.

Dify에서 MCP 를 사용하기 위해서는 플러그인 ‘MCP SSE’를 설치해야 합니다.

image-20250509093546084

플러그인 설치 후 인증을 해야 합니다. 인증은 서버의 sse url로 합니다. ‘인증되지 않음’ 버튼을 눌러 JSON으로 값을 입력합니다.

image-20250509100501468

image-20250509100536980

{  "server_name": {    "url": "[MCP서버도메인/sse]",    "headers": {}, "timeout": 50,    "sse_read_timeout": 50  }}

URL부분에 서버 도메인/sse 만 바꾸어 넣어 주고 저장을 하면 됩니다.

이제 이를 활용하는 간단한 Dify Flow를 만들어 보도록 하겠습니다. 워크플로우 앱으로 시작합니다. 여기서는 시작 다음에 도구중 아까 설치한 ‘MCP SSE’ 를 붙였습니다. 붙일 때 Fetch 와 Call 둘 중 하나를 선택할 수 있는데 여기서는 기능을 호출하여 실행할 것이기 때문에 Call을 선택했습니다.

실행을 해 보면 MCP의 입력 및 출력 JSON형태를 알 수 있습니다. 결과 탭에서 답을 정확히 12로 내는 것을 확인할 수 있습니다. 입출력 데이터 포멧은 트레이싱 탭을 참조하시기 바랍니다.

여기까지 보면 MCP를 사용한 것과 RESTAPI를 사용하는 것과 별 차이가 없어 보입니다. Dify에서도 HTTPS노드를 제공하고 있어 굳이 MCP를 안쓰더라도 이와 같은 구현은 가능합니다. 오히려 MCP의 응답속도가 더 느립니다.

그럼 왜 MCP를 쓰는지에 대해 다음 페이지에서 이야기해 보도록 하겠습니다.