一个基于Model Context Protocol (MCP)的服务器,提供邮件、日历和教务系统集成功能。
- 📅 日历管理: 添加日程到Exchange日历,查询现有日程
- 📧 邮件管理: 获取未读邮件,查看单个邮件详情
- 🎓 教务系统: 获取西交利物浦大学课程表
- 运行时: Node.js + TypeScript
- MCP框架: @modelcontextprotocol/sdk
- 邮件/日历: Microsoft Graph API
- HTTP服务器: Express.js
- 认证: OAuth 2.0 (Microsoft Identity Platform)
npm install复制 .env.example 到 .env 并填写配置:
cp .env.example .env- 访问 Azure Portal
- 导航到 "Azure Active Directory" > "应用注册"
- 点击 "新注册"
- 填写应用信息:
- 名称:
MCP Email Calendar Server - 支持的账户类型:
仅此组织目录中的账户 - 重定向URI:
http://localhost:3000/auth/callback
- 名称:
选择权限类型:
选项A: 委托权限 (推荐 - 访问特定用户数据)
- 在应用注册页面,选择 "API权限"
- 点击 "添加权限" > "Microsoft Graph"
- 选择 "委托的权限",添加以下权限:
Calendars.ReadWriteMail.ReadMail.ReadWrite
- 点击 "授予管理员同意"
选项B: 应用程序权限 (后台服务)
- 在应用注册页面,选择 "API权限"
- 点击 "添加权限" > "Microsoft Graph"
- 选择 "应用程序权限",添加以下权限:
Calendars.ReadWriteMail.ReadMail.ReadWrite
- 点击 "授予管理员同意"
- 在应用注册页面,选择 "证书和密码"
- 点击 "新客户端密码",创建密码
- 复制客户端ID、客户端密码和租户ID
- 在
.env文件中填写:
委托权限配置 (推荐):
MICROSOFT_CLIENT_ID=your_client_id_here
MICROSOFT_CLIENT_SECRET=your_client_secret_here
MICROSOFT_TENANT_ID=your_tenant_id_here
PERMISSION_TYPE=delegated
USER_EMAIL=user@yourdomain.com应用程序权限配置:
MICROSOFT_CLIENT_ID=your_client_id_here
MICROSOFT_CLIENT_SECRET=your_client_secret_here
MICROSOFT_TENANT_ID=your_tenant_id_here
PERMISSION_TYPE=application如果使用委托权限,需要用户登录和授权:
-
启动认证流程:
# 访问认证URL http://localhost:3000/auth/login -
用户授权:
- 用户会被重定向到Microsoft登录页面
- 用户登录并授权应用访问其数据
- 授权成功后重定向回应用
-
获取访问令牌:
- 应用接收授权码
- 使用授权码获取访问令牌
- 使用访问令牌访问用户数据
默认使用内置Exchange客户端,适用于学校本地部署的Exchange服务器:
# 默认配置 - 无需修改
EMAIL_ACCESS_METHOD=exchange
EXCHANGE_URL=https://mail.school.edu
EXCHANGE_USERNAME=your_student_id
EXCHANGE_PASSWORD=your_password
EXCHANGE_DOMAIN=school.edu如果您的学校使用Microsoft 365,可以切换到Graph API:
EMAIL_ACCESS_METHOD=graph
MICROSOFT_CLIENT_ID=your_client_id_here
MICROSOFT_CLIENT_SECRET=your_client_secret_here
MICROSOFT_TENANT_ID=your_tenant_id_here
PERMISSION_TYPE=delegated
USER_EMAIL=user@yourdomain.com在 .env 文件中配置教务系统信息:
ACADEMIC_SYSTEM_URL=https://your-academic-system-url.com
ACADEMIC_SYSTEM_USERNAME=your_student_id
ACADEMIC_SYSTEM_PASSWORD=your_password系统支持5个日志等级,可以通过环境变量控制:
# 日志等级配置
LOG_LEVEL=info日志等级说明:
debug: 显示所有日志 (最详细,包含所有调试信息)info: 显示重要信息 (默认,推荐用于开发)warn: 只显示警告和错误error: 只显示错误信息none: 关闭所有日志
日志类型:
- 🚀 START: 启动信息
- ℹ️ INFO: 普通信息
⚠️ WARN: 警告信息- ❌ ERROR: 错误信息
- ✅ SUCCESS: 成功信息
- 📋 STEP: 操作步骤
- 📊 DATA: 数据信息
- 🌐 NETWORK: 网络请求
- 📧 EXCHANGE: Exchange相关
- 🔗 GRAPH: Graph API相关
- 🔐 AUTH: 认证相关
- 🔧 MCP: MCP协议相关
# 开发模式 (详细日志)
LOG_LEVEL=debug npm run dev
# 生产模式 (只显示错误)
LOG_LEVEL=error npm start
# 默认模式
npm run dev添加日程到Exchange日历
参数:
subject(string): 事件标题startDateTime(string): 开始时间 (ISO 8601格式)endDateTime(string): 结束时间 (ISO 8601格式)timeZone(string, 可选): 时区 (默认: Asia/Shanghai)location(string, 可选): 地点body(string, 可选): 事件描述
获取日历中的日程
参数:
startDate(string, 可选): 开始日期 (ISO 8601格式)endDate(string, 可选): 结束日期 (ISO 8601格式)
获取未读邮件列表
参数:
top(number, 可选): 返回邮件数量限制 (默认: 10, 最大: 50)
获取单个邮件详情
参数:
emailId(string): 邮件ID
获取课程表
参数:
semester(string, 可选): 学期 (如: 2024-1, 2024-2)
{
"method": "tools/call",
"token": "tooken_got_login",
"params": {
"name": "add_calendar_event",
"arguments": {
"subject": "团队会议",
"startDateTime": "2024-01-15T09:00:00",
"endDateTime": "2024-01-15T10:00:00",
"location": "会议室A",
"body": "讨论项目进展"
}
}
}{
"method": "tools/call",
"token": "tooken_got_login",
"params": {
"name": "get_unread_emails",
"arguments": {
"top": 5
}
}
}{
"method": "tools/call",
"params": {
"name": "get_course_schedule",
"token": "tooken_got_login",
"arguments": {
"semester": "2024-1"
}
}
}src/
├── index.ts # MCP服务器入口
├── server.ts # HTTP服务器配置
├── tools/
│ ├── calendar.ts # 日历工具
│ ├── email.ts # 邮件工具
│ └── academic.ts # 教务系统工具
├── services/
│ ├── graphClient.ts # Microsoft Graph客户端
│ └── academicSystem.ts # 教务系统客户端
└── types/
└── index.ts # TypeScript类型定义
npm run buildnpm run watch-
Microsoft Graph API限制:
- Graph API 主要设计用于 Microsoft 365 云服务
- 无法直接访问 本地部署的Exchange服务器
- 需要 Exchange 服务器与 Microsoft 365 集成
-
学校部署的Exchange服务器:
- 通常是 本地部署 (On-Premises)
- 可能没有与 Microsoft 365 集成
- 使用传统的 Exchange Web Services (EWS)
- ✅ 直接访问本地Exchange服务器
- ✅ 无需Microsoft 365集成
- ✅ 支持传统Exchange环境
- ❌ 需要SOAP协议处理
- ❌ 配置相对复杂
- ✅ 可以使用Graph API
- ✅ 现代化的API接口
- ❌ 需要IT管理员支持
- ❌ 可能需要额外费用
- 认证失败: 检查Microsoft Graph API凭据是否正确
- 权限不足: 确保已授予管理员同意
- 教务系统登录失败: 检查用户名密码是否正确
- Exchange连接失败: 检查Exchange服务器URL和凭据
- EWS访问被拒绝: 确认Exchange服务器支持EWS API
服务器日志会显示详细的错误信息,帮助诊断问题。
MIT License