🧠 MCP日历代理
在谷歌日历中预订活动之前,使用AI代理检查真实天气状况 模型上下文协议(MCP) 和 语义内核.
🚀 它做什么\ 1.️⃣ 检测用户何时想要安排户外活动\ 2.️⃣ 调用真实的天气MCP服务器(AccuWeather支持)\ 3.️⃣ 决定户外活动是否可行\ 4.️⃣ 自动创建真正的Google日历事件
______________________________________________________________________
🔧 技术栈
| 层 | 技术 |
|---|---|
| LLM | Azure OpenAI(gpt-4o/gpt-4o-agent) |
| 代理 | 微软语义内核 |
| 工具 | MCP天气服务器+自定义日历插件 |
| 天气API | AccuWeather(通过MCP) |
| 日历 | Google日历API(OAuth 2.0) |
| 运行时 | 。NET 8 C#控制台应用程序 |
______________________________________________________________________
🧩 运作原理
代理逻辑
代理遵循以下工作流程 户外活动:
- 询问用户 城市+国家
- 呼叫
weather-get_hourly具有该位置的MCP工具 - 如果下雨、下雪或低于10°C→ 建议a 联机会议
- 否则→ 创建户外活动 Google 日历
- 在创建事件之前,始终与用户确认详细信息
气象MCP工具
- 使用MCP兼容的天气服务器(通过
npx @timlukahorstmann/mcp-weather) - 返回给定位置的实时小时天气预报
- 代理使用此预测来决定事件是否可行
谷歌日历集成
- 使用OAuth(首次运行时打开浏览器窗口)
- 在用户的 主要的,重要的 Google 日历
- 使用适当的IANA时区(例如。,
Asia/Damascus,America/New_York)
______________________________________________________________________
📂 项目结构
mcp-calendar-agent/
├─ McpAgentApp.sln
├─ .gitignore
└─ McpAgentApp/
├─ Program.cs → Agent bootstrapping & chat loop
├─ GoogleCalendarPlugin.cs → Google Calendar event creation
├─ WeatherPlugin.cs → Example custom weather plugin (optional)
└─ McpAgentApp.csproj注意:类似文件credentials.json,secrets.json,令牌文件为 仅限本地 并被故意排除在外.gitignore.
______________________________________________________________________
🔐 安全与秘密
此存储库旨在 默认安全:
- 回购中未存储API密钥或OAuth机密
.gitignore不包括:
- credentials.json (谷歌OAuth客户端机密) - secrets.json / *.secrets.json - TokenResponse*.json 以及其他令牌文件
- GitHub秘密扫描/推送保护已启用并已验证
您必须配置机密 本地 在运行代理之前。
______________________________________________________________________
🛠 先决条件
- 已安装.NET 8 SDK
- Azure OpenAI资源(gpt-4o或类似部署)
- MCP Weather服务器使用的AccuWeather(或兼容的)API密钥
- 启用日历API和
credentials.json下载
______________________________________________________________________
⚙️ 本地配置
1.️⃣ 用户机密(推荐)
内部 McpAgentApp,初始化并设置用户机密:
dotnet user-secrets init
dotnet user-secrets set "AzureOpenAI:Endpoint" "https://YOUR-RESOURCE.openai.azure.com/"
dotnet user-secrets set "AzureOpenAI:ApiKey" "YOUR_AZURE_OPENAI_KEY"
dotnet user-secrets set "AzureOpenAI:DeploymentName" "gpt-4o-agent"
dotnet user-secrets set "AccuWeather:ApiKey" "YOUR_ACCUWEATHER_KEY"这些值被读入 Program.cs 通过 ConfigurationBuilder().AddUserSecrets ().
2.️⃣ Google OAuth凭据
- 转到谷歌云控制台
- 启用 谷歌日历API
- 创建OAuth客户端凭据(桌面应用程序)
- 下载
credentials.json - 将其放置在应用程序运行的位置旁边(例如,在
McpAgentApp文件夹)
做 不 提交 credentials.json。它被忽略了 .gitignore.
______________________________________________________________________
▶️ 运行代理
从解决方案根:
dotnet restore
dotnet run --project McpAgentApp您应该看到类似以下内容:
Custom GoogleCalendarPlugin loaded.
Connecting to Weather MCP Server...
Loaded 2 tools from Weather MCP Server.
------------------------------------------
Agent ready. Ask me to schedule an outdoor event.现在,您可以与代理人交谈:
You: Please schedule an outdoor football meeting for tomorrow at 5pm.
Agent: Certainly. What is the city and state/country for the weather check?
You: Damascus, Syria此时,代理人:
- 调用天气MCP工具(
weather-get_hourly) - 评估预测
- 决定活动是否可行
- 请求确认
- 在正确的时区创建Google日历事件(
Asia/Damascus在这个例子中)
______________________________________________________________________
🧪 示例会话(大马士革演示)
You: Please schedule an outdoor football meeting for tomorrow at 5pm.
Agent: Certainly. What is the city and state/country for the weather check?
You: Damascus, Syria
Agent: (calls weather-get_hourly via MCP)
Agent: The weather in Damascus, Syria tomorrow at 5 PM will be around 17°C and sunny, which is suitable for an outdoor football meeting.
Agent: I will schedule the event with the following details:
- Title: Outdoor Football Meeting
- Date:
- Time: 5 PM–6 PM
- Location: Damascus, Syria
- Time Zone: Asia/Damascus
Is this correct?
You: Yes, create it.
Agent: (calls CreateEventAsync via GoogleCalendarPlugin)
Agent: The outdoor football meeting has been successfully scheduled.
You can view and manage it at: https://www.google.com/calendar/event?eid=...查看谷歌日历,您将看到在正确的当地时间创建的活动。
______________________________________________________________________
🔌 使用的MCP工具
气象MCP工具
- 工具名称:
weather-get_hourly - 目的:返回给定地点的每小时预测,以便代理可以对户外活动做出决策
谷歌日历插件
- 方法:
CreateEventAsync(summary, startTime, endTime, location, description, timeZone) - 目的:在经过身份验证的用户的主Google日历中创建事件
这两个工具都是通过语义内核的工具调用行为自动调用的。
______________________________________________________________________
🎥 演示(领英)
该项目的简短演示视频将在领英上分享,显示:
- 使用MCP工具调用的控制台输出
- 代理推理(天气→ 决定→ 日历)
- Google日历中的结果事件
______________________________________________________________________
🌱 未来的增强功能
- 添加Outlook日历支持作为Google日历的替代方案
- 添加基于位置的自然语言时区检测
- 添加对重复事件的支持(每周站立、培训等)
- 添加更多MCP工具(地图、位置、提醒、通知)
______________________________________________________________________
📬 作者
萨利姆·阿勒萨利赫\ AI/MCP/。NET/语义内核\ github: SaleemAlsalehUAE\ 领英: SaleemAlsalehUAE
______________________________________________________________________
⭐ 支持
如果这个项目帮助或激励你构建自己的MCP工具:
- ⭐ 为存储库添加星号
- 📨 分享LinkedIn演示
- 🛠️ 用想法或扩展打开一个问题或公关
这个项目是一个实用的、现实世界的例子 使用MCP工具在现实世界中行动的代理,而不仅仅是回答问题。
