안녕하세요,
본인은 MCP의 가능성에 깜짝 놀라 본격적인 AI 스터디를 시작한 사람입니다.
처음으로 MCP 서버를 개발하며 겪는 과정을 공유드리면 다른 분들에게도 도움이 될까하여 글을 작성하게 됐습니다.
현재 저는 숙박업을 하고있는데, 지역의 최신 숙소나 사라진 숙소, 숙소 리스트 등을 바탕으로 숙박비나 사업성 검토 등을 해보고 싶 었습니다. (단순 개인 참고 용도)
따라서 다음과 같이 개발 목표를 설정하였습니다.
1. 개발 목표
MCP 공식 문서를 바탕으로 나만의 MCP 서버 개발 경험
MCP로 인터넷에서 데이터 크롤링 및 DB 업데이트
MCP로 데이터 분석
2. 진행 순서
데이터 크롤링 (원하는 데이터 긁어오는 python 프로그램 개발)
어떤 MCP 서버를 만들면 좋을지 ChatGPT와 기획 및 문서화
크롤러부터 개발하고, 클로드에서 테스트
2-1. 데이터 크롤링
먼저 33m2라는 사이트에서 '광화문'이라는 키워드로 검색되는 모든 숙소 리스트(정보 포함)를 가져옴
(광화문으로 검색되는 숙소는 총 99개이며, 본 json 파일에 99개의 숙소가 모두 저장되어 있음을 확인함)
'Copy as cURL'로 url로 데이터 가져오는 요청 복사하기
cURL command를 python requests 코드로 변경하기 (https://curlconverter.com/)
파이썬 파일 생성 및 데이터를 가져온 결과를 json 파일로 저장하는 코드 추가
파일 이름 : 1_output.py
import json
from urllib.parse import quote
import requests
kw = '광화문' # 사용자에게 입력 받을 예정
encoded_kw = quote(kw, safe='')
# print(encoded_kw)
data = {
'theme_type': '',
'keyword': kw, # 한글 그대로 사용
# ... (중략)
}
cookies = {
'_ga': 'GA1.1.1399544678.1746696521',
# ... (중략)
}
headers = {
'referer': f'https://33m2.co.kr/webpc/search/map?keyword={encoded_kw}&start_date=&end_date=&week=', # encoded_kw 사용
# ... (중략)
}
def main():
response = requests.post('https://33m2.co.kr/app/room/search', cookies=cookies, headers=headers, data=data)
# print(json.dumps(response.json(), ensure_ascii=False, indent=2))
with open('output.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(response.json(), ensure_ascii=False, indent=2))
if __name__ == "__main__":
main()
'광화문'이라는 키워드로 정보를 가져오기 때문에, '광화문'이라는 한글을 URL 인코딩 (위의 코드에서 5, 6번째 줄)
kw = '광화문' # 사용자에게 입력 받을 예정
encoded_kw = quote(kw, safe='')
2-2. 어떤 MCP 서버를 만들면 좋을지 ChatGPT와 기획 및 문서화
먼저 MCP 서버 개발을 위한 공식 문서를 ChatGPT에서 학습시킴
[MCP QuickStart for server developers] https://modelcontextprotocol.io/quickstart/server#importing-packages-and-setting-up-the-instance
[MCP Python SDK] https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file
MCP 서버 개발을 기획하기 위해 다음과 같이 프롬프트 입력 (1단계)
<Goal>
사용자가 첨부한 [ouput.json]에 있는 데이터와 [데이터 간단 설명], [개발 목표]에 쓴 글을 확인하고 어떤 MCP를 만들면 좋을지 아이데이션, 브레인스토밍 해줘.
</Goal>
<Role>
너는 Top-down 방식의 Python 개발자이자 MCP 서버 개발 전문가로서, 다음의 단계에 따라 사용자가 MCP 서버를 만들 수 있도록 돕는다. 각 단계를 넘어갈 때마다 수정해야 할 내용은 없는지 사용자에게 확인하고, 문제가 없으면 다음 단계로 넘어간다.
1. 사용자가 [ouput.json]과 [데이터 간단 설명], [개발 목표]를 전달해 줬는지 확인하고, 잘 전달해 줬다면 간단하게 요약한다.
2. 1단계의 데이터를 바탕으로 어떤 것들을 만들 수 있는지 markdown 표 형태로 기획한다.
3. bulleted list를 이용해서 트리 형태로 MCP 아키텍처를 설계한다.
4. db, @mcp.tool(), @mcp.resource, @mcp.prompt()를 어떻게 만들지 스켈레톤 코드를 작성한다. (함수 이름, 매개변수, return type, docstring, 데코레이터 등 구성) 마지막에 사용자에게 [데이터 수집 코드]를 물어봐서 json 혹은 html 코드를 크롤링해오는 소스 코드를 입력받아서 5단계에 활용한다.
5. 사용자에게 입력받은 [데이터 수집 코드]와 지금까지 나눈 대화를 활용해 MCP server를 python 프로그램을 개발한다.
</Role>
<Context dump>
[ouput.json]
{
"airbridge": {
"event_name": "airbridge.ecommerce.searchResults.viewed",
"action": "광화문",
"label": ""
},
"bucket_name": "samsamm2",
"error_code": 0,
"list": [
{
"rid": 41785,
"room_name": "광화문경복궁역/건조기",
"state": "서울특별시",
"province": "종로구",
"town": "내수동",
"pic_main": "room/210db99e-ce3e-460c-b4ba-080a6d2a746e.jpg",
"addr_lot": "서울특별시 종로구 내수동 75 용비어천가",
"addr_street": "서울특별시 종로구 새문안로3길 36",
"using_fee": 400000,
"pyeong_size": 11,
"room_cnt": 1,
"bathroom_cnt": 1,
"cookroom_cnt": 1,
"sittingroom_cnt": 1,
"reco_type_1": false,
"reco_type_2": false,
"longterm_discount_per": 10,
"early_discount_per": 0,
"is_new": false,
"is_super_host": true,
"lat": 37.57343,
"lng": 126.97327
},
{
"rid": 39967,
"room_name": "광화문 종각역 1.5룸",
"state": "서울특별시",
"province": "종로구",
"town": "수송동",
"pic_main": "room/dd40014c-0346-439a-a5d0-4a610a511bc4.jpg",
"addr_lot": "서울특별시 종로구 수송동 58 두산위브파빌리온",
"addr_street": "서울특별시 종로구 삼봉로 81",
"using_fee": 420000,
"pyeong_size": 11,
"room_cnt": 1,
"bathroom_cnt": 1,
"cookroom_cnt": 1,
"sittingroom_cnt": 1,
"reco_type_1": false,
"reco_type_2": false,
"longterm_discount_per": 8,
"early_discount_per": 2,
"is_new": false,
"is_super_host": true,
"lat": 37.57256,
"lng": 126.9815
},
{
"rid": 39601,
"room_name": "🎈서울역광화문/남산뻥뷰",
"state": "서울특별시",
"province": "서대문구",
"town": "충정로2가",
"pic_main": "room/5254800B-F5ED-4B22-AAA9-BA92AAFBC915.png",
"addr_lot": "서울특별시 서대문구 충정로2가 192 서대문 디오빌 오피스텔",
"addr_street": "서울특별시 서대문구 충정로 59",
"using_fee": 340000,
"pyeong_size": 8,
"room_cnt": 1,
"bathroom_cnt": 1,
"cookroom_cnt": 1,
"sittingroom_cnt": 1,
"reco_type_1": false,
"reco_type_2": false,
"longterm_discount_per": 10,
"early_discount_per": 2,
"is_new": false,
"is_super_host": true,
"lat": 37.56407,
"lng": 126.96488
},
... (중략)
[데이터 간단 설명]
33m2라는 사이트에서 '광화문'이라는 키워드로 숙소를 검색해서, 검색된 99개의 숙소에 대한 정보가 고유한 rid 별로 저장되어 있음.
- using_fee : 1주당 숙박비
- reco_type_1 : 33m2 추천 호스트
- longterm_discount_per : 4주 이상 숙박시 1주당 할인 비율(%)
- early_discount_per : 오늘부터 3일 이내 입주시 할인해주는 돈(만원 단위)
[개발 목표]
33m2에 숙소를 잘 운영하기 위해서 적절한 using_fee를 설정하는데 도움을 받고, 새로운 숙소를 오픈하기 위한 추천 시스템을 개발.
</Context dump>
※ 5단계의 역할로 MCP 서버를 바로 개발하라고 했는데, 여기서 ChatGPT가 많이 헤맸습니다. 따라서, 한 번에 바로 서버 개발을 시키는 것보다는 기능을 하나씩 개발하는 것이 훨씬 좋은 결과물이 나왔습니다.
ChatGPT의 MCP 기능 기획 (2단계)
MCP 서버 아키텍처 설계 (트리 형태, 3 단계)
스켈레톤 코드 구현 (4 단계)
이 코드는 당장 쓰이진 않았지만, 큰 그림을 그릴때 참고하기에는 좋은 것 같습니다.
기획서 문서화 (새로운 5단계)
기존의 5단계는 MCP 서버를 바로 개발하는 것이었는데 기획서 문서화 후 새로운 채팅에서 MCP 서버를 쉬운것부터 개발하는게 결과물이 좋았습니다)
2-3. 크롤러부터 개발하고, 클로드에서 테스트
2-1에서 개발한 파이썬 파일과 json 파일 결과물을 넘겨주며,
MCP 서버 개발 공식 문서를 기반으로 크롤러를 만들어 달라고 명령
ChatGPT가 만들어준 코드로 파이썬 파일 생성 후 클로드 에서 테스트
실행 결과 output 파일이 잘 만들어 진 것을 확인했습니다.
사실 ChatGPT가 코드를 짜줬을 때, 버그가 발생해서 제가 수정할 것을 각오하고 있었는데 생각보다 결과물이 너무 좋아서 놀랬습니다.... ㅎㅎㅎㅎ
그래서 ChatGPT가 만들어준 코드 어떻게 짰는지 이해한 뒤에, 기획서에 있는 다른 mcp tool을 추가로 개발해볼 예정입니다!
피드백
한 번에 너무 어려운 일을 시키지 말자.
(모든 MCP 기능을 개발시키지 말고, 가장 필요한 기능부터 순차적으로 하나씩 개발)분명한 기획서를 만들고 스켈레톤 코드를 만들어두니 프로그램을 개발할 때 고민하는 시간이 줄어든다.
ChatGPT와 너무 많은 대화를 나누지 말자.
(ChatGPT와 나눈 대화는 큰 목적을 하나 달성했으면 새로운 대화를 여는 게 확실히 성능적으로 좋았음)Cursor로 개발하면 더 쉬웠을 것 같으나, ChatGPT 만으로도 그렇게 귀찮지 않게 MCP 서버 개발할 수 있었다.
(Cursor를 무료로 쓰고 있고, 채팅 제한이 걸려 ChatGPT를 사용했습니다)
다음 과정
@mcp.resource와 @mcp.tools 하나씩 개발 (기획서 기반)
간단하게 mcp 개발에 쓰인 코드 해석
내 숙소의 적정 요금을 계산하는 코드 개발(ML / 딥러닝 하나씩 개발 후 비교 예정)
전체 프로그램 완성 후 테스트
다른 사이트에서도 숙소 정보 가져오기
아마 다음 글에서는 2번 과정까지 할 수 있지 않을까 싶습니다.
혹시 본 게시글 내용 중 잘못된 부분이 있거나 궁금하신 부분 있으시면 편하게 댓글 남겨주세요.
감사합니다~