日历MCP-人工智能日历助手
一个轻量级的web应用程序,使用模型上下文协议(MCP)连接到谷歌日历,并提供一个智能界面来与日历事件交互。作为内部工具层构建,演示如何将第三方系统与人工智能功能集成。
这有什么作用
此应用程序为您提供了两种与Google日历交互的方式:
- 经典观点 -一个传统的基于表格的界面,您可以在其中获取和查看过去或即将举行的会议。您还可以为过去的会议生成人工智能摘要,以快速回顾可能讨论的内容。
- 询问功能 -一个由人工智能驱动的聊天界面,您可以在其中询问有关日历的自然语言问题。人工智能使用MCP工具按需获取日历数据,并回答诸如“我本周有哪些会议?”或“我和约翰的下一次会议是什么时候?”之类的问题
技术栈
- 前端Next.js 16(应用路由器)、React 19、TypeScript
- 样式:带有Shadcn UI组件的顺风CSS
- 日历集成:Composio MCP(模型上下文协议)
- 人工智能:OpenAI GPT-4o-mini用于聊天和会议摘要
- 状态管理:用于API密钥管理的React Context API
先决条件
在开始之前,请确保您已经:
- 已安装Node.js 18+
- 已设置与Google日历集成的Composio帐户
- OpenAI API密钥(用于AI功能)
- Google帐户(用于日历访问)
入门指南
1.克隆和安装
cd frontend/my-app
npm install2.环境变量
创建一个 .env 文件在 frontend/my-app 目录:
# Composio API Key (get this from your Composio dashboard)
NEXT_PUBLIC_COMPOSIO_API_KEY=your_composio_api_key_here
# Optional: Your app URL (for OAuth callbacks)
# Defaults to http://localhost:3000 in development
NEXT_PUBLIC_APP_URL=http://localhost:30003.运行开发服务器
npm run dev打开 http://localhost:3000 在您的浏览器中。
运作原理
首次设置
- 连接您的日历:单击主页上的“连接到我的谷歌日历”按钮。这将把您重定向到谷歌的OAuth页面,在那里您将授权该应用程序访问您的日历。
- 输入OpenAI API密钥:连接后,在标题输入字段中输入您的OpenAI API键。以下情况需要这样做:
- 生成过去会议的人工智能摘要 - 使用“询问”功能聊天日历
使用经典观点
导航到“经典”菜单,然后在以下选项之间进行选择:
- 即将到来的预订:查看您未来的会议
- 过去的预订:使用生成人工智能摘要的选项查看您过去的会议
您可以指定要获取的预订数量(1-20)。对于过去的预订,点击“生成摘要”以获取人工智能生成的可能讨论内容的摘要。
使用询问功能
转到导航中的“提问”,开始询问有关日历的问题。AI将:
- 使用MCP工具获取相关日历数据
- 用自然语言回答你的问题
- 使用markdown格式化响应以提高可读性
示例问题:
- “这周我有什么会议?”
- “我下次会议是什么时候?”
- “我今天要和谁见面?”
- “上周一我安排了什么?”
假设和设计决策
为什么选择MCP而不是直接API?
我选择使用Composio的MCP实现,而不是直接调用Google Calendar API,因为:
- MCP提供了一种将工具与AI代理集成的标准化方法
- 它抽象了OAuth的复杂性和令牌管理
- 使将来更容易添加更多集成
- 该任务特别需要使用MCP,而不是普通API
为什么有两个不同的接口?
“经典”视图和“询问”功能服务于不同的用例:
- 古典:适用于结构化数据查看、批量操作以及需要一次查看所有详细信息的情况
- 问:更适合快速查询、自然语言交互,以及当你不知道自己在找什么时
会话管理
该应用程序仅使用HTTP Cookie来存储:
composio_user_id:会话的唯一标识符composio_connection_id:已连接的Google日历帐户ID
这种方法:
- 将敏感数据保存在服务器端
- 在页面刷新过程中保持会话
- 自动处理OAuth回调流
权衡取舍
我优先考虑什么
- 功能和抛光:我试图同时关注核心功能和用户界面
- 清除错误消息:用户总是知道出了什么问题以及如何解决
我简化了什么
- 无持久存储:会话基于cookie,不需要数据库
- 单日历支持:仅连接到主Google日历
- 基础用户界面:使用了Shadcn组件,但没有花时间定制样式
- 有限的错误恢复:基本重试逻辑,可能更稳健
已知限制
- 仅适用于谷歌日历(主日历)
- 摘要是基于元数据生成的,而不是基于实际的会议内容
- 无离线支持
- OAuth令牌过期(需要重新连接)
