LM Studio + MCP 연동 시도기

소개

노션을 자동으로 조작할 수 있게 해주는 Notion MCP 서버를 발견하고 흥미를 느꼈고, '유료 모델을 쓰지 않고도, 로컬에서 프롬프트 기반으로 노션에 글을 써보면 어떨까?'라는 생각이 들었습니다. 특히 Claude나 GPT-4 같은 유료 모델이 부담스러운 분들에게 대안이 될 수 있겠다는 기대도 들었습니다.

진행 방법

시도한 방식은 다음과 같습니다:

  • 사용 도구 및 환경

    • LM Studio에서 로컬 실행 가능한 오픈소스 모델: qwen2.5-coder-32b-instruct

    • Notion MCP 서버: GitHub에서 클론

    • API 테스트: Postman

    • 로컬 서버 및 컨테이너 관리: Docker

    • 연동 확인용 Python 스크립트 작성

  • 시도한 과정

    1. 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에서 결과를 확인합니다.

      일본어와 중국어가있는 페이지의 스크린 샷


    2. 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 방식으로 로컬 정보를 기반으로 노션에 문서를 생성하는 것도 시도해보려고 합니다.

도움 받은 글

Notion MCP 서버 GitHub

1
1개의 답글

👉 이 게시글도 읽어보세요