每天MCP
MCP(模型上下文协议)服务器,提供对以下内容的只读访问:
- 微软Entra ID (Azure AD)——用户、组、服务主体、条件访问等。
- Microsoft Defender --安全警报、事件、安全评分、威胁情报
- Microsoft Intune --受管设备、合规策略、设备配置、应用程序
- 天气 --当前状况、预报、天文数据 weatherapi.com
先决条件
- 18岁或以后
- Git
- 已注册应用程序的Microsoft Entra(Azure AD)租户(请参阅下面的步骤1)
- A. weatherapi.com API密钥(可用的免费层)
入门指南
1.创建Entra应用程序注册
服务器向Microsoft Graph进行身份验证 您的用户帐户 您需要在自己的Entra租户中注册应用程序才能启用此功能。
- 登录到 微软Entra管理中心
- 导航到 身份 > 应用程序 > 应用注册 > 新注册
- 填写登记表:
- 名字: EverydayMCP (或您喜欢的任何名称) - 支持的帐户类型: *仅此组织目录中的帐户* (单租户) - 重定向URI:选择 单页应用程序(SPA) 并进入 http://localhost:3000
- 点击 注册
- 在应用程序上 概述 页面,复制这两个值——稍后您将需要它们:
- 应用程序(客户端)ID → 这是你的 CLIENT_ID - 目录(租户)ID → 这是你的 TENANT_ID
- 首选 API权限 > 添加权限 > 微软图形 > 委托权限 并添加所需的权限:
| 服务 | 权限 |
|---|---|
| 参赛者ID | User.Read, User.Read.All, Group.Read.All, Directory.Read.All, Policy.Read.All |
| 后卫 | SecurityEvents.Read.All, SecurityIncident.Read.All, ThreatHunting.Read.All |
| Intune | DeviceManagementManagedDevices.Read.All, DeviceManagementConfiguration.Read.All, DeviceManagementApps.Read.All |
> 小贴士:从以下内容开始 User.Read 要验证auth是否有效,请根据需要添加更多权限。如果稍后添加新权限,请重新运行 npm run login 把它们捡起来。
- 如果您的组织需要它,请单击 授予管理员同意 对于上述权限
2.克隆存储库
git clone https://github.com/bscarberry/everydaymcp.git
cd everydaymcp3.安装依赖项
npm install4.建造
npm run build这将编译TypeScript源代码 src/ JavaScript在 build/ 目录。
5.登录(一次性)
在MCP服务器可以使用Graph API之前,您必须从终端登录一次。这将打开一个浏览器窗口,对您进行身份验证,并在本地缓存令牌,以便MCP服务器可以静默使用它。
Windows(PowerShell):
$env:TENANT_ID="your-tenant-id"; $env:CLIENT_ID="your-client-id"; npm run loginmacOS/Linux:
TENANT_ID="your-tenant-id" CLIENT_ID="your-client-id" npm run login将打开一个浏览器窗口供Microsoft登录。在您进行身份验证后,令牌将缓存到 ~/.everydaymcp/auth-record.json 以及OS证书存储。您只需执行一次(或者在令牌过期或更改权限时再次执行)。
6.配置您的MCP客户端
看 MCP客户端配置 下面的部分。
配置
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
TENANT_ID | 是 | 您的Entra目录(租户)ID——来自上述步骤1.5 |
CLIENT_ID | 是 | 您的Entra应用程序注册(客户端)ID——来自上述步骤1.5 |
REDIRECT_URI | 否 | OAuth重定向URI(默认为 http://localhost:3000) |
WEATHER_API_KEY | 是\* | weatherapi.com API密钥(\*仅天气工具需要) |
USE_GRAPH_BETA | 否 | 设置为 false 使用Graph v1.0而不是beta |
认证
服务器使用 两步身份验证 方法:
npm run login--在终端中运行一次。打开浏览器进行交互式Microsoft登录,然后将令牌缓存到磁盘和操作系统凭据存储中。- MCP服务器 --启动时,加载缓存的凭据并获取令牌 默默地 (无浏览器,无提示)。服务器从不打开浏览器或要求提供设备代码。
您的用户帐户的权限决定了哪些Graph数据是可访问的。如果发生以下情况,服务器将在启动时退出并出错 TENANT_ID 或 CLIENT_ID 未设置。
重新认证:如果您的缓存令牌过期或您向应用程序注册添加了新权限,只需重新运行 npm run login.MCP客户端配置
克劳德桌面版
将以下内容添加到您的 claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json
Windows示例:
{
"mcpServers": {
"everydaymcp": {
"command": "node",
"args": ["C:/Users/YourName/everydaymcp/build/main.js"],
"env": {
"TENANT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"CLIENT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"WEATHER_API_KEY": "your-weatherapi-key"
}
}
}
}macOS示例:
{
"mcpServers": {
"everydaymcp": {
"command": "node",
"args": ["/Users/YourName/everydaymcp/build/main.js"],
"env": {
"TENANT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"CLIENT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"WEATHER_API_KEY": "your-weatherapi-key"
}
}
}
}重要提示: 路径必须指向build/main.js(不是main.js).在路径中使用正斜杠,即使在Windows上也是如此——Node.js可以正确处理它们。
更换 TENANT_ID 和 CLIENT_ID 使用您在步骤1中从Entra应用程序注册中复制的ID值。
可用工具
图形API(Entra、Defender、Intune)
| 工具 | 说明 |
|---|---|
entra-query | 查询Entra ID——用户、组、应用程序、角色、条件访问 |
defender-query | Query Defender——警报、事件、安全分数、威胁情报 |
intune-query | 查询Intune--受管设备、合规性、配置、应用程序 |
get-auth-status | 检查身份验证状态、令牌过期和授予的范围 |
天气
| 工具 | 说明 |
|---|---|
weather-current | 某一地点的当前天气状况 |
weather-forecast | 天气预报(最多10天) |
weather-search | 搜索/自动完成位置 |
weather-astronomy | 日出、日落、月相数据 |
故障排除
“未找到缓存登录名”错误
跑 npm run login 首先在您的终端中,然后重新启动MCP服务器。
令牌已过期
重新运行 npm run login 刷新缓存的令牌。
来自Graph API的权限被拒绝错误
在Entra中为您的应用程序注册添加所需的权限(步骤1.6),必要时授予管理员同意,然后重新运行 npm run login.
服务器日志位置
服务器将日志写入 build/mcp-server.log 在项目目录中。
查询示例
# Entra: list all users
entra-query { path: "/users" }
# Defender: high severity alerts
defender-query { path: "/security/alerts_v2", queryParams: { "$filter": "severity eq 'high'" } }
# Intune: all managed devices
intune-query { path: "/deviceManagement/managedDevices", fetchAll: true }
# Weather: current conditions
weather-current { location: "Seattle" }
# Weather: 5-day forecast with alerts
weather-forecast { location: "New York", days: 5, alerts: true }