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] 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
'개발 > Spring' 카테고리의 다른 글
| [Spring AI] 3편: Database 쿼리생성 및 실행을 위한 HITL(Human in the Loop) (0) | 2026.03.20 |
|---|---|
| [Spring AI] 2편: RAG 문서 임베딩 (0) | 2026.03.20 |
| [Spring AI] 1편: 토이 프로젝트 개요 (0) | 2026.03.20 |
| [Springboot] @JsonProperty는 언제 써야 할까! (0) | 2023.02.22 |
| [MSA] SAGA pattern (0) | 2022.12.19 |