模型上下文协议服务器

一个提供对Microsoft Entra ID、Microsoft Defender、Microsoft Intune和天气数据的只读访问的模型上下文协议服务器。

  • by bscarberry
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 bscarberry/everydaymcp

使用说明

每天MCP

MCP(模型上下文协议)服务器,提供对以下内容的只读访问:

  • 微软Entra ID (Azure AD)——用户、组、服务主体、条件访问等。
  • Microsoft Defender --安全警报、事件、安全评分、威胁情报
  • Microsoft Intune --受管设备、合规策略、设备配置、应用程序
  • 天气 --当前状况、预报、天文数据 weatherapi.com

先决条件

  • Node.js 18岁或以后
  • Git
  • 已注册应用程序的Microsoft Entra(Azure AD)租户(请参阅下面的步骤1)
  • A. weatherapi.com API密钥(可用的免费层)

入门指南

1.创建Entra应用程序注册

服务器向Microsoft Graph进行身份验证 您的用户帐户 您需要在自己的Entra租户中注册应用程序才能启用此功能。

  1. 登录到 微软Entra管理中心

  2. 导航到 身份 > 应用程序 > 应用注册 > 新注册

  3. 填写登记表:

    • 名字: EverydayMCP (或您喜欢的任何名称)
    • 支持的帐户类型: 仅此组织目录中的帐户 (单租户)
    • 重定向URI:选择 单页应用程序(SPA) 并进入 http://localhost:3000
  4. 点击 注册

  5. 在应用程序上 概述 页面,复制这两个值——稍后您将需要它们:

    • 应用程序(客户端)ID → 这是你的 CLIENT_ID
    • 目录(租户)ID → 这是你的 TENANT_ID
  6. 首选 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 把它们捡起来。

  7. 如果您的组织需要它,请单击 授予管理员同意 对于上述权限

2.克隆存储库

git clone https://github.com/bscarberry/everydaymcp.git
cd everydaymcp

3.安装依赖项

npm install

4.建造

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 login

macOS/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

认证

服务器使用 两步身份验证 方法:

  1. npm run login --在终端中运行一次。打开浏览器进行交互式Microsoft登录,然后将令牌缓存到磁盘和操作系统凭据存储中。
  2. 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 }