实用前景mcp
用于Microsoft Outlook的远程MCP服务器,具有适当的OAuth2和代理优化工具。
特性
- 符合规范:RFC 9728/8414 OAuth元数据,RFC 7591动态客户端注册
- 无状态OAuth:由客户端而非服务器管理的令牌——正如OAuth所希望的那样
- 代理优化工具:工具描述中广泛的快速工程
- 动态范围:OAuth作用域自动调整为启用的工具
- 生产就绪:Docker、速率限制、只读模式、工具过滤
快速开始
npm install
npm run build
npm start # Server at http://localhost:3000所需环境:
MS365_MCP_CLIENT_ID=your-azure-ad-client-id
MS365_MCP_CLIENT_SECRET=your-azure-ad-client-secret
MS365_MCP_TENANT_ID=your-tenant-id # or 'common'Azure AD安装程序
- Azure门户 → 微软Entra ID→ 应用注册→ New
- 添加委派权限:
User.Read,Mail.Read,Mail.ReadWrite,Mail.Send,Calendars.Read,Calendars.ReadWrite,Calendars.Read.Shared,Place.Read.All,People.Read,offline_access - 添加重定向URI:
http://localhost:6274/oauth/callback(供MCP检查员使用) - 证书和秘密→ 新客户机密→ 复制值
- 将客户端ID、客户端密码和租户ID复制到您的
.env
工具
邮件
list-mail-folders · list-mail-messages · search-mail · get-mail-message · send-mail · create-draft-mail · reply-mail · reply-all-mail · create-reply-draft · create-reply-all-draft · delete-mail-message · move-mail-message
日历
list-calendars · list-calendar-events · search-calendar-events · find-meeting-times · get-calendar-event · get-calendar-view · create-calendar-event · update-calendar-event · delete-calendar-event
人们
lookup-contact-email
房间搜索
对于面对面的会议, find-meeting-times 自动:
- 获取整个组织中所有可用的会议室
- 将他们与与会者一起纳入可用性检查中
- 按地点(城市/建筑)分组免费客房
- 仅返回带有预订电子邮件地址的可用房间
集 isOnlineMeeting: false 以启用房间搜索。对于在线会议(默认值: true),团队会议链接会自动生成。
所需范围: Place.Read.All (添加到Azure AD应用程序权限)
配置
| 变量 | 默认值 | 描述 |
|---|---|---|
MS365_MCP_CLIENT_ID | 必需 | Azure AD客户端ID |
MS365_MCP_CLIENT_SECRET | - | 客户端机密(可选) |
MS365_MCP_TENANT_ID | common | 租户ID |
MS365_MCP_PORT | 3000 | 服务器端口 |
MS365_MCP_READ_ONLY_MODE | false | 禁用写入操作 |
MS365_MCP_ENABLED_TOOLS | all | 逗号分隔的工具列表 |
MS365_MCP_CORS_ORIGIN | * | CORS起源 |
MS365_MCP_RATE_LIMIT_REQUESTS | 30 | 每个窗口的请求 |
MS365_MCP_RATE_LIMIT_WINDOW_MS | 60000 | 窗口大小(ms) |
MS365_MCP_ALLOWED_TENANTS | - | 仅限于特定租户 |
码头工人
来自GitHub容器注册表:
docker run -p 3000:3000 \
-e MS365_MCP_CLIENT_ID=xxx \
-e MS365_MCP_CLIENT_SECRET=xxx \
-e MS365_MCP_TENANT_ID=xxx \
ghcr.io/Leonine-Studios/useful-outlook-mcp:latest或者在本地构建:
docker build -t useful-outlook-mcp .
docker run -p 3000:3000 \
-e MS365_MCP_CLIENT_ID=xxx \
-e MS365_MCP_CLIENT_SECRET=xxx \
-e MS365_MCP_TENANT_ID=xxx \
useful-outlook-mcp端点
| 端点 | 描述 |
|---|---|
POST /mcp | MCP协议 |
GET /health | 健康检查 |
GET /.well-known/oauth-protected-resource | RFC 9728 |
GET /.well-known/oauth-authorization-server | RFC 8414 |
GET /authorize | OAuth(微软代理) |
POST /token | 令牌交换(微软代理) |
POST /register | 动态客户端注册 |
测试
npm run dev
npx @modelcontextprotocol/inspector # Connect to http://localhost:3000/mcp______________________________________________________________________
设计说明
Why another Outlook MCP server?
现有服务器的问题
- 遗留架构:作为stdio构建,附加HTTP。这是HTTP原生。
- OAuth出错:大多数服务器在服务器端存储令牌。此服务器是无状态的——通过Authorization标头为每个请求传递令牌,从不存储。
- 没有思考的工具:典型的服务器在没有指导的情况下1:1映射API端点。代理在实际使用中失败是因为他们不知道API的怪癖或多步骤工作流程。
有什么不同
每个工具包括:
- 何时使用它与替代品
- 已知的Graph API怪癖(有很多)
- 多步骤任务的工作流指导
- 失败的参数组合
例子: find-meeting-times 解释了电子邮件地址是必需的(名字不起作用),如何使用 search-mail什么 OrganizerUnavailable 意味着,而且 isOrganizerOptional=true 需要用户确认。
已知图形API异常
- 邮件发件人筛选:
eq上from/emailAddress/address不可靠--使用startswith() - 邮件收件人筛选:无法使用筛选到/cc/bcc
$filter--必须使用$search - 日历组织者筛选:
$filter在组织者电子邮件返回500中--经过筛选的客户端 - 并发:并行调用可以返回
MailboxConcurrency错误 - 搜索+排序:
$search无法与结合$orderby
许可证
麻省理工学院
