Jamf MCP代理
 
进行中 --该项目正在积极开发中。API、配置和行为可能会发生变化。
使用AI驱动的Jamf Pro车队监控和补救代理 模型上下文协议 AWS Bedrock(克劳德)。
对Jamf Pro环境运行合规性、安全性和车队健康检查,生成结构化JSON报告,将调查结果发布到Slack,并可以自动修复问题——所有这些都是按照cron计划或按需进行的。
建筑
┌─────────────┐
│ Slack Bot │
└──────▲───────┘
│
┌──────────┐ tool calls ┌─────┴───────┐ invoke ┌──────────────┐
│ Jamf Pro │◄────────────►│ MCP Client │◄─────────►│ AWS Bedrock │
│ Server │ (stdio/http)│ │ (Claude) │ │
└──────────┘ └──┬──────┬───┘ └──────────────┘
│ │
┌────────▼┐ ┌──▼──────────┐
│Scheduler│ │Health Server │
│ (cron) │ │ :8080 │
└─────────┘ └─────────────┘代理连接到 Jamf MCP服务器 通过stdio或HTTP,通过工具调用查询Jamf Pro环境,并使用Claude(通过AWS Bedrock)生成结构化的合规性、安全性和车队健康报告。报告可以发布到Slack并按照cron计划运行。
先决条件
- Node.js 20+
- Jamf Pro 带有API客户端的实例(客户端ID+机密)
- AWS帐户 Claude型号已启用基岩访问功能
- (可选) Slack机器人令牌,用于向渠道发布报告
- (可选) Docker用于容器化部署
快速开始
# Clone
git clone https://github.com/dbankscard/jamf-mcp-agent.git
cd jamf-mcp-agent
# Install dependencies
npm install
# Configure
cp .env.example .env
# Edit .env with your Jamf, AWS, and Slack credentials
# Build
npm run build
# Run a one-off compliance check
npx jamf-agent check complianceCLI命令
报告
# Run a report (compliance | security | fleet)
jamf-agent check compliance
jamf-agent check security --slack # also post to Slack
jamf-agent check fleet --save report.json # save JSON to file特别问题
# Ask a read-only question about your fleet
jamf-agent ask "How many devices are running macOS 15?"
# Enable write tools for the question
jamf-agent ask "Deploy the latest OS update to the test group" --write
# Save the response
jamf-agent ask "List all unencrypted Macs" --save output.json补救
# Analyze and remediate — interactive selection
jamf-agent remediate compliance
# Dry run — plan remediation without executing
jamf-agent remediate security --dry-run --auto-approve
# Auto-approve automatable findings at or above a severity threshold
jamf-agent remediate compliance --auto-approve --min-severity high
# Remediate from a previously saved report
jamf-agent remediate --file report.json --auto-approve
# Select specific findings by index
jamf-agent remediate security --finding 0,2 --slack --save remediation.json补救工作流程:
- 分析 --运行报告(或从以下位置加载报告
--file) - 选择 --交互式提示,
--auto-approve,或--finding指数 - 补救 --通过编写工具执行修复(或使用
--dry-run) - 报告 --输出结构化的补救报告
守护程序模式
# Start with scheduled reports, health server, and preflight validation
jamf-agent start健康检查
# Check component health (MCP, Bedrock, Slack, Scheduler)
jamf-agent health报告格式
所有报告都遵循结构化的JSON模式:
{
"summary": "3 of 150 devices have critical compliance issues",
"overallStatus": "warning",
"findings": [
{
"title": "FileVault Not Enabled",
"severity": "critical",
"category": "security",
"description": "3 devices do not have FileVault disk encryption enabled",
"affectedDeviceCount": 3,
"affectedDevices": [
{ "name": "LAPTOP-001", "id": "42", "detail": "FileVault disabled, last check 2025-01-15" }
],
"remediation": {
"title": "Enable FileVault via Configuration Profile",
"steps": ["Deploy FileVault profile to affected devices", "Verify encryption status after 24h"],
"effort": "low",
"automatable": true
}
}
],
"metrics": {
"totalDevices": 150,
"compliantDevices": 147
}
}状态级别: healthy | warning | critical 严重程度: critical | high | medium | low 类别: compliance | security | maintenance
配置参考
所有配置都是通过环境变量(或 .env 文件)。括号中显示的默认值。
MCP服务器
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT | 运输方式: stdio 或 http | stdio |
MCP_SERVER_PATH | MCP服务器入口点的路径(stdio模式) | -- |
JAMF_URL | Jamf Pro实例URL(stdio模式) | -- |
JAMF_CLIENT_ID | Jamf API客户端ID(stdio模式) | -- |
JAMF_CLIENT_SECRET | Jamf API客户端机密(stdio模式) | -- |
MCP_SERVER_URL | MCP服务器URL(http模式) | -- |
MCP_CONNECT_TIMEOUT_MS | 连接超时 | 30000 |
MCP_TOOL_TIMEOUT_MS | 每次工具调用超时 | 120000 |
MCP_MAX_RECONNECT_ATTEMPTS | 最大重新连接尝试次数 | 5 |
MCP_RECONNECT_BASE_MS | 指数退避的基本延迟 | 1000 |
AWS基岩
| 变量 | 描述 | 默认值 |
|---|---|---|
AWS_REGION | AWS区域 | us-east-1 |
AWS_ACCESS_KEY_ID | AWS访问密钥(可选--使用默认凭据链) | -- |
AWS_SECRET_ACCESS_KEY | AWS密钥 | -- |
BEDROCK_MODEL | 基岩模型ID | us.anthropic.claude-sonnet-4-5-20250929-v1:0 |
BEDROCK_MAX_TOOL_ROUNDS | 每次运行的最大代理工具使用回合数 | 15 |
BEDROCK_MAX_TOKENS | 每个Bedrock请求的最大输出令牌数 | 8192 |
BEDROCK_REQUEST_TIMEOUT_MS | 基岩请求超时 | 120000 |
Slack
| 变量 | 描述 | 默认值 |
|---|---|---|
SLACK_ENABLED | 启用Slack发布 | false |
SLACK_BOT_TOKEN | Slack机器人OAuth令牌(xoxb-...) | -- |
SLACK_CHANNEL_COMPLIANCE | 合规性报告的通道ID | -- |
SLACK_CHANNEL_SECURITY | 安全报告的通道ID | -- |
SLACK_CHANNEL_FLEET | 车队报告的通道ID | -- |
调度器
| 变量 | 描述 | 默认值 |
|---|---|---|
SCHEDULER_ENABLED | 在守护进程模式下启用cron调度程序 | false |
SCHEDULER_TIMEZONE | cron表达式的时区 | America/New_York |
CRON_COMPLIANCE | 合规报告cron | 0 8 * * 1-5 |
CRON_SECURITY | 安全报告cron | 0 9 * * 1-5 |
CRON_FLEET | 舰队健康报告 | 0 10 * * 1 |
JOB_TIMEOUT_MS | 每个计划作业的最大持续时间 | 600000 |
健康服务器
| 变量 | 描述 | 默认值 |
|---|---|---|
HEALTH_PORT | HTTP端口 /health 和 /ready 端点 | 8080 |
守护程序模式
跑 jamf-agent start 以守护进程模式启动。启动时,代理:
- 加载配置 重试(3次尝试,指数回退)
- 运行飞行前检查 --验证MCP连接、Slack身份验证和基岩模型访问
- 记录启动横幅 包括运输、型号、时间表和健康港口
- 启动调度程序 用于cron的合规性、安全性和舰队报告
- 启动HTTP运行状况服务器 在已配置的端口上
- 安装信号处理程序 用于优雅关机(
SIGINT/SIGTERM)
代理防止作业运行重叠,应用每个作业超时,以指数回退重试失败的作业,并跟踪正在进行的操作以实现干净关闭。
Slack集成
- 使用创建Slack应用程序
chat:write范围 - 将其安装到您的工作区并复制bot令牌
- 集
SLACK_ENABLED=true,将机器人令牌和通道ID添加到.env - 集
SCHEDULER_ENABLED=true并根据需要调整cron表达式 - 跑
jamf-agent start
报告以丰富的Block Kit消息的形式发布。关键和高发现作为回复。中等和低调查结果总结在一个帖子回复中。
健康检查
守护进程公开了两个HTTP端点:
| 端点 | 目的 | 200时 | 503时 |
|---|---|---|---|
GET /health | 活体探针 | healthy 或 degraded | unhealthy |
GET /ready | 准备就绪探针 | MCP组件 healthy | MCP不健康 |
响应正文是完整的健康状态JSON:
{
"status": "healthy",
"components": {
"mcp": { "status": "healthy", "message": "Connected, 87 tools" },
"bedrock": { "status": "healthy", "message": "Model: us.anthropic.claude-sonnet-4-5-20250929-v1:0" },
"slack": { "status": "healthy", "message": "Slack disabled" },
"scheduler": { "status": "healthy", "message": "Scheduler active, no jobs running" }
},
"timestamp": "2025-01-15T14:30:00.000Z"
}码头工人
构建并运行
# Build the image
docker build -t jamf-agent .
# Run with your .env file
docker run --env-file .env -p 8080:8080 jamf-agent
# Check health
curl http://localhost:8080/health
curl http://localhost:8080/readyDocker Compose
docker compose up -d
# View logs
docker compose logs -f
# Stop
docker compose downDockerfile使用多阶段构建(Alpine、非root用户、非root、非root), ~120MB 图像)。健康检查是通过以下方式内置的 HEALTHCHECK MCP连接和飞行前的60秒启动期指令。
MCP传输模式
标准 (默认)--代理将MCP服务器作为子进程生成,并通过stdin/stdout进行通信。最有利于当地发展。需要 MCP_SERVER_PATH 以及Jamf证书。
超文本传输协议 --代理通过HTTP/SSE连接到正在运行的MCP服务器。最适合MCP服务器作为单独服务运行的生产部署(例如AWS Lambda)。需要 MCP_SERVER_URL.
工具安全
默认情况下,代理在 只读模式 --只有 search*, list*, get*, check*,以及 read* 工具暴露在LLM中。这确保了计划报告和临时查询无法修改您的Jamf环境。
写入工具(策略执行、配置文件部署、MDM命令等)仅在明确启用时可用:
jamf-agent ask "..." --write--为单个问题启用书写工具jamf-agent remediate ...--启用实时补救的写入工具(不--dry-run)
生产
AWS Secrets Manager
将敏感值(API密钥、令牌)存储在AWS机密管理器中,而不是 .env:
# Create a secret with your credentials as JSON
aws secretsmanager create-secret \
--name jamf-mcp-agent/production \
--secret-string '{"JAMF_CLIENT_SECRET":"...","SLACK_BOT_TOKEN":"xoxb-..."}'
# Tell the agent to use it
export AWS_SECRET_NAME=jamf-mcp-agent/productionAWS Secrets Manager的秘密覆盖环境变量。
CloudWatch指标
代理通过以下方式发布CloudWatch指标 aws-embedded-metrics 在...之下 JamfMCPAgent 命名空间:
| 度量 | 描述 |
|---|---|
mcp.connect.duration | MCP连接时间 |
mcp.tool_call.duration | 每个工具调用延迟 |
mcp.tool_call.errors | 工具调用错误计数 |
agent.run.duration | 代理运行总持续时间 |
agent.run.tool_calls | 每次运行的工具调用 |
agent.run.rounds | 每次LLM轮次 |
agent.run.input_tokens | 每次运行输入令牌 |
agent.run.output_tokens | 每次运行输出令牌 |
scheduler.job.duration | 计划作业持续时间 |
scheduler.job.success | 成功作业计数 |
scheduler.job.error | 失败作业计数 |
scheduler.job.skipped | 跳过作业计数(重叠) |
slack.post.duration | 延迟延迟 |
slack.post.errors | 松弛帖子错误计数 |
remediation.duration | 修复运行持续时间 |
remediation.findings_attempted | 尝试调查结果 |
remediation.findings_succeeded | 调查结果已纠正 |
发展
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
# Type-check without emitting
npm run typecheck
# Dev mode (tsx, no build step)
npm run cli -- check compliance
npm run cli -- ask "How many Macs do we have?"
npm run cli -- start项目结构
src/
cli/index.ts # CLI entry point (commander)
claude/
agent.ts # Bedrock agent loop
prompts.ts # System prompts & report schema
types.ts # Report & finding types
mcp/
client.ts # MCP client (stdio/http, reconnect)
options.ts # Config -> MCP options mapper
tool-mapper.ts # Tool filtering (read-only vs write)
scheduler/index.ts # Cron scheduler with retry
slack/
client.ts # Slack posting (Block Kit)
templates.ts # Slack message templates
config.ts # Zod schema, env mapping, secrets
errors.ts # Error hierarchy (AppError -> typed subclasses)
health.ts # Health checker (component status)
health-server.ts # HTTP health endpoints
index.ts # Programmatic entry point
logger.ts # Lightweight JSON/TTY logger
metrics.ts # CloudWatch embedded metrics
preflight.ts # Startup validation & banner
shutdown.ts # Graceful shutdown manager
context.ts # AsyncLocalStorage request context
secrets.ts # AWS Secrets Manager loader
utils.ts # withTimeout utility