반응형

MCP 서버 구동 방식

MCP 연동을 통해 제일 먼저 고민한건 MCP서버를 어디에 둘까?였다.

stdio vs streamable-http

먼저 stdio 방식은 해당프로세스가 자식프로세스로 mcp 서버를 관리하는 것으로 별도의 네트워크 이슈가 발생하지 않는 장점이 있지만, mcp 프로세스의 메모리점유율이 높아질 경우 해당 서버의 모든 프로세스에 영향이 올 수 있으므로 Enterprise 환경에서 맞지 않다. 그래서 별도로 MCP Server를 가지고 API로 서비스할 수 있는 기능을 활용해야한다. 바로 Streamable-http 방식인데 25년3월부터 해당 방식이 등장했다.(그전에는 sse 방식을 지원함)

 

결론부터 말하자면 두가지 방식을 다 테스트 해봄~

Streamable-http : Google MCP

  • 구글 캘린더에 일정을 추가&조회
  • 추가로 gmail 을 여는 방법으로 아주 쉽게 기능 확장을 경험

stdio : Notion MCP

  • LLM, 다른 에이전트에서 정리된 데이터를 Notion 정리하기 위함

Google MCP Server

Streamable-http 방식으로 구글MCP 를 올리는 방법에서 삽질을 많이 했다.

그냥 google-mcp 면 다 되는 줄 알고 .. ^^

github 에 올라온 많은 google-mcp 중에 streamable-http 을 지원하도록 FastAPI 로 개발된 repository를 발견하고 잘 올렸다.

 

 

GitHub - taylorwilsdon/google_workspace_mcp: Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search &

Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search & Drive with AI - Comprehensive Google Workspace / G Suite MCP Server & CLI Tool - taylorwilsdon/google_work...

github.com

 

GCP 에서 프로젝트를 생성하고 client, client-sercret 을 발급하여 .env 파일에 잘 적는다.

그리고 내가 사용할 tools 를 선택하여 사용할 수 있다.

main.py --transport streamable-http --tools calendar

 

MCP-Inspector

MCP 서버가 정상인지 체크하기 위해 위 프로그램을 실행

npx @modelcontextprotocol/inspector

웹페이지가 하나 뜨는데 아래와 같이 입력하고 Connect 해보면 Tools에 LLM이 사용할 수 있는 목록이 나온다.

SpringAI코드

MCP를 연결하려면 Transport 모듈을 사용해야하는데 별도의 패키지를 써야한다.

implementation 'org.springframework.ai:spring-ai-starter-mcp-client-webflux'
implementation 'io.modelcontextprotocol.sdk:mcp:1.1.0'

 

spring:
  ai:
    mcp:
      client:
        enabled: true
        initialized: true
        type: ASYNC
        request-timeout: 2s
        toolcallback:
          enabled: true
        streamable-http:
          connections:
            google-calendar:
              url: http://localhost:8000
              endpoint: /mcp
  jackson:
    default-property-inclusion: non_null

mcp client 는 yml autoconfiguration 이 정상적으로 잘 되었다.

근데 google 연동에서 default-user 를 계속 찾아다녀서 spring.jackson.default-property-inclusion: non_null 을 넣어주었다.

 

이제 ToolCallbackProvider 객체를 보면 google mcp tools 를 모두 볼 수 있게된다.

 

구글캘린더 결과

 

구글 서비스 확장

위에서 설명했듯이 이제 서비스만 [사용] 해주면 구글의 모든 서비스를 LLM 이 이용할 수 있다.

그래서 바로 Gmail 을 활성화 해보았다.

그리고 메일함 내용 검색!!

Notion MCP

이제 MCP에 자신이 생겼다, stdio 모드로 해보자!!

spring mcp client stdio 에 적어주면 스프링 프로세스가 기동되면서 같이 실행된다.

spring:
  ai:
    mcp:
      client:
        enabled: true
        initialized: true
        type: ASYNC
        request-timeout: 5s
        toolcallback:
          enabled: true
        stdio:
          connections:
            notion:
              command: C:\\Program Files\\nodejs\\npx.cmd # windows 명령어 위치, linux는 npx 바로 써도됨
              args:
                - "-y"
                - "@notionhq/notion-mcp-server"
              env:
                NOTION_TOKEN: ${NOTION_API_KEY}
                # 핵심: npx가 내부적으로 node를 찾을 수 있도록 PATH를 직접 넘겨줍니다.
                PATH: "C:\\Program Files\\nodejs\\;%PATH%"

window 에서 실행하느라 명령어 위치를 찾고 node 위치를 알려주기 위해 작업

 

접근토큰

notion은 ntn 으로 시작하는 access-token을 받아야함

그래서 application 에서 callback url 을 받을 수 있도록 했음

- resources/templates/notion-auth-result.html

그리고 위 코드로 postman 을 통해 oauth 2.0 인증을 해 ntn_ 토큰을 가져왔다.

참고로 노션 접근토큰은 만료기한이 없다.!!!

마찬가지로 mcp-inspector 로 연결체크!!

 

문제: user_id 를 자꾸 찾음

아니 자꾸 user_id 를 입력하라는거야. 그래서 mcp-inspector 로 get-users tool을 요청해서 내 id를 알아냈고, 프롬프트에 해당 값을 박아놨음

당신은 노션 관리 에이전트입니다
user_id 값은 3264d4d8-7956-810a-8939-0027b6fd1837 이거야.
추가로, '노션 AI 전용공간'이라는 이름의 페이지를 먼저 검색(search)한 뒤, 그곳에 페이지를 생성하세요.
사용자 식별 정보 없이 페이지 내용만 생성하세요.

당신은 노션 시인입니다. 다음 순서를 엄격히 지키세요:
1. 'search' 도구로 '노션 AI 전용공간' 페이지 ID를 찾는다.
2. 'create_page' 도구로 해당 공간 아래에 제목을 정해 페이지를 만든다.
3. 위에서 생성된 'new_page_id'를 사용하여 'append_block_children' 도구로 시 본문을 작성한다.
모든 단계가 끝나기 전에는 답변을 종료하지 마세요.

 

 

연동 완료

 

 

 

[Spring AI] 1편: 토이 프로젝트 개요 

[Spring AI] 2편: RAG 문서 임베딩

[Spring AI] 3편: Database 쿼리생성 및 실행을 위한 HITL(Human in the Loop)

 

 

GitHub - joonhyeok95/spring-ai-google-gen: 제미나이 무료API로 구현하는 PDF RAG, 데이터베이스 추출, LLM 서비

제미나이 무료API로 구현하는 PDF RAG, 데이터베이스 추출, LLM 서비스. Contribute to joonhyeok95/spring-ai-google-gen development by creating an account on GitHub.

github.com

 

반응형
복사했습니다!