생성이 완료되면 json 파일을 자동으로 떨궈준다. 소중하게 다룬다.
from pydantic import BaseModel
from google.oauth2 import service_account
from googleapiclient.discovery import build
from fastmcp import FastMCP
mcp = FastMCP("calendar_project")
# 인증 설정
SCOPES = ["https://www.googleapis.com/auth/calendar"]
SERVICE_ACCOUNT_FILE = "<<서비스계정 json 파일 경로>>" # 서비스 계정 JSON 파일 경로
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES
)
service = build('calendar', 'v3', credentials=credentials)
calendar_id = '<<서비스계정 이메일>>' # 서비스계정의 이메일
# 일정 추가 입력 모델
class CalendarEvent(BaseModel):
summary: str
start: str # ISO 형식 "2025-04-30T15:00:00"
end: str
def create_google_calendar_event(event: CalendarEvent):
event_body = {
'summary': event.summary,
'start': {'dateTime': event.start, 'timeZone': 'Asia/Seoul'},
'end': {'dateTime': event.end, 'timeZone': 'Asia/Seoul'},
}
created_event = service.events().insert(calendarId=calendar_id, body=event_body).execute()
return {"status": "created", "event_id": created_event.get("id")}
def get_google_calendar_events(start_time: str, end_time: str):
events_result = service.events().list(
calendarId=calendar_id,
timeMin=start_time,
timeMax=end_time,
maxResults=10,
singleEvents=True,
orderBy='startTime'
).execute()
events = events_result.get('items', [])
events_list = []
for event in events:
events_list.append({
'id': event.get('id'),
'summary': event.get('summary'),
'start': event.get('start').get('dateTime'),
'end': event.get('end').get('dateTime')
})
return {"events": events_list}
def delete_google_calendar_event(event_id: str):
try:
service.events().delete(calendarId=calendar_id, eventId=event_id).execute()
return {"status": "deleted", "event_id": event_id}
except Exception as e:
return {"status": "error", "message": str(e)}
# 일정 추가 툴
@mcp.tool(
name="create_calendar_event",
description="Google Calendar에 일정을 추가합니다."
)
def create_calendar_event_tool(summary: str, start: str, end: str):
res = create_google_calendar_event(CalendarEvent(summary=summary, start=start, end=end))
return res
# 일정 조회 툴
@mcp.tool(
name="get_calendar_events",
description="Google Calendar에서 일정을 조회합니다."
)
def get_calendar_events_tool(start_time: str, end_time: str):
res = get_google_calendar_events(start_time, end_time)
return res
# 일정 삭제 툴
@mcp.tool(
name="delete_calendar_event",
description="Google Calendar에서 일정을 삭제합니다."
)
def delete_calendar_event_tool(event_id: str):
res = delete_google_calendar_event(event_id)
return res
if __name__ == "__main__":
mcp.run()
"calendar_project": {
"command": "uv",
"args": [
"run",
"D:/google-mcp/google_calendar_tool.py"
]
}
오...
오오...
오오오...
이제 내 cursor ai 는 아주 훌륭한 mcp tool 연습장이 될 것이다.