소개
노션을 자동으로 조작할 수 있게 해주는 Notion MCP 서버를 발견하고 흥미를 느꼈고, '유료 모델을 쓰지 않고도, 로컬에서 프롬프트 기반으로 노션에 글을 써보면 어떨까?'라는 생각이 들었습니다. 특히 Claude나 GPT-4 같은 유료 모델이 부담스러운 분들에게 대안이 될 수 있겠다는 기대도 들었습니다.
진행 방법
시도한 방식은 다음과 같습니다:
사용 도구 및 환경
LM Studio에서 로컬 실행 가능한 오픈소스 모델:
qwen2.5-coder-32b-instruct
Notion MCP 서버: GitHub에서 클론
API 테스트: Postman
로컬 서버 및 컨테이너 관리: Docker
연동 확인용 Python 스크립트 작성
시도한 과정
MCP 서버를 로컬에서 실행시켜 Postman으로 HTTP 요청을 보내 노션에 글이 작성되는지 확인합니다.
다운로드 받은 Notion MCP에 아래 app.py파일을 만들고 실행합니다.from flask import Flask, request, jsonify import requests app = Flask(__name__) NOTION_API_URL = "https://api.notion.com/v1/pages" NOTION_TOKEN = "Notion Integration 토큰은 이곳에" NOTION_DATABASE_ID = "데이터베이스 id는 이곳에" NOTION_HEADERS = { "Authorization": f"Bearer {NOTION_TOKEN}", "Content-Type": "application/json", "Notion-Version": "2022-06-28" } @app.route("/ask", methods=["POST"]) def create_notion_page(): data = request.get_json() question = data.get("question", "").strip() if not question: return jsonify({"error": "No question provided"}), 400 payload = { "parent": {"database_id": NOTION_DATABASE_ID}, "properties": { "title": [ {"text": {"content": question}} ] } } response = requests.post(NOTION_API_URL, headers=NOTION_HEADERS, json=payload) if response.status_code == 200 or response.status_code == 201: return jsonify({"message": "노션 페이지가 성공적으로 생성되었습니다."}), 200 else: return jsonify({ "message": "노션 페이지 생성 실패", "status_code": response.status_code, "error": response.text }), response.status_code if __name__ == "__main__": app.run(host="0.0.0.0", port=3000)
이제 postman을 통해 http를 호출합니다.
이제 연동한 notion database에서 결과를 확인합니다.
LM studio 모델을 불러오는 클라이언트를 열어 노션의 글을 작성하는지를 확인합니다.
1에서 만든 app.py 서버를 열어둔채로 sender.py라는 제 2의 서버를 작성하고 실행합니다.import requests def send_to_notion_if_needed(prompt: str): if prompt.startswith("노션에 추가해줘:"): content = prompt.replace("노션에 추가해줘:", "").strip() payload = {"question": content} try: response = requests.post("http://localhost:3000/ask", json=payload) if response.status_code == 200: print("노션 페이지가 생성되었습니다.") else: print(f"실패 (Status {response.status_code}): {response.text}") except Exception as e: print(f"오류 발생: {e}") else: print("'노션에 추가해줘:' 형식이 아닙니다.") if __name__ == "__main__": while True: user_prompt = input("\nLM Studio 프롬프트를 붙여넣으세요 (종료: exit):\n> ") if user_prompt.lower() == "exit": break send_to_notion_if_needed(user_prompt)
실행에 따라 노션페이지 생성을 요청합니다.
Notion에서 결과를 확인합니다.
시간이 조금만 더 있었더라면 Open webui를 통해 좀 더 프롬프트다운 생김새를 만들 수 있었을 것 같네요, 게다가 아직 노션에 페이지 생성만 만들어두었기 때문에 많은 개선의 여지가 있습니다.
결과와 배운 점
MCP 서버는 JSON 파일을 로컬 네트워크로 전달해 동작할 수 있다는 점을 실험적으로 확인해볼 수 있었습니다.
Python으로 간단한 로컬 서버를 구성해 프롬프트 기반 모델과 외부 애플리케이션을 연결하는 법을 익혔습니다.
"자동화"가 되기까지 필요한 로직 연결이 생각보다 많다는 걸 체감했고, 오픈소스 도구들을 어떻게 조화시킬지에 대한 감각도 길렀습니다.
로컬 모델의 출력 결과를 파일 형태로 MCP에 넘기는 자동화 스크립트를 만들어볼 예정입니다. 추후에는 RAG 방식으로 로컬 정보를 기반으로 노션에 문서를 생성하는 것도 시도해보려고 합니다.