Model Context Protocol (MCP) 服务器,通过标准化API进行任务调度和管理。该服务器支持通过MCP协议访问Shell命令和AI驱动的任务调度功能。
# 克隆仓库
git clone https://github.com/jolks/mcp-cron.git
cd mcp-cron
# 构建应用程序为mcp-cron二进制文件
go build -o mcp-cron cmd/mcp-cron/main.go
服务器支持两种传输模式:
| 客户端 | 配置文件位置 |
|---|---|
| Cursor | ~/.cursor/mcp.json |
| Claude Desktop (Mac) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
# 使用HTTP SSE传输启动服务器(默认模式)
# 默认为localhost:8080
./mcp-cron
# 使用自定义地址和端口启动
./mcp-cron --address 127.0.0.1 --port 9090
配置文件示例
{
"mcpServers": {
"mcp-cron": {
"url": "http://localhost:8080/sse"
}
}
}
stdio传输特别适用于:
启动Cursor IDE和Claude Desktop时,会自动启动服务器
配置文件示例
{
"mcpServers": {
"mcp-cron": {
"command": "<mcp-cron二进制文件所在路径>/mcp-cron",
"args": ["--transport", "stdio"]
}
}
}
支持以下命令行参数:
| 参数 | 描述 | 默认值 |
|---|---|---|
--address | 绑定服务器的地址 | localhost |
--port | 绑定服务器的端口 | 8080 |
--transport | 传输模式:sse 或 stdio | sse |
--log-level | 日志级别:debug, info, warn, error, fatal | info |
--log-file | 日志文件路径 | stdout |
--version | 显示版本信息并退出 | false |
--ai-model | 用于AI任务的AI模型 | gpt-4o |
--ai-max-iterations | 工具启用的AI任务的最大迭代次数 | 20 |
--mcp-config-path | MCP配置文件路径 | ~/.cursor/mcp.json |
支持以下环境变量:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
MCP_CRON_SERVER_ADDRESS | 绑定服务器的地址 | localhost |
MCP_CRON_SERVER_PORT | 绑定服务器的端口 | 8080 |
MCP_CRON_SERVER_TRANSPORT | 传输模式:sse 或 stdio | sse |
MCP_CRON_SERVER_NAME | 服务器名称 | mcp-cron |
MCP_CRON_SERVER_VERSION | 服务器版本 | 0.1.0 |
MCP_CRON_SCHEDULER_DEFAULT_TIMEOUT | 任务执行的默认超时时间 | 10m |
MCP_CRON_LOGGING_LEVEL | 日志级别:debug, info, warn, error, fatal | info |
MCP_CRON_LOGGING_FILE | 日志文件路径 | stdout |
OPENAI_API_KEY | AI任务的OpenAI API密钥 | 未设置 |
MCP_CRON_ENABLE_OPENAI_TESTS | 启用OpenAI集成测试 | false |
MCP_CRON_AI_MODEL | 用于AI任务的LLM模型 | gpt-4o |
MCP_CRON_AI_MAX_TOOL_ITERATIONS | 工具启用的任务最大迭代次数 | 20 |
MCP_CRON_MCP_CONFIG_FILE_PATH | MCP配置文件路径 | ~/.cursor/mcp.json |
使用默认的SSE传输运行时,日志输出到控制台。
使用stdio传输运行时,日志重定向到一个名为mcp-cron.log的日志文件中,以防止干扰JSON-RPC协议:
mcp-cron二进制文件相同的位置。服务器通过MCP协议暴露了多个工具:
list_tasks - 列出所有已调度的任务get_task - 根据ID获取特定任务add_task - 添加新的已调度任务add_ai_task - 添加新的已调度AI(LLM)任务,并带有提示update_task - 更新现有任务remove_task - 根据ID删除任务enable_task - 启用已禁用的任务disable_task - 禁用已启用的任务任务具有以下结构:
{
"id": "task_1234567890",
"name": "示例任务",
"schedule": "0 */5 * * * *",
"command": "echo '任务执行!'",
"prompt": "分析昨天的销售数据并提供总结",
"type": "shell_command",
"description": "每5分钟运行一次的示例任务",
"enabled": true,
"lastRun": "2025-01-01T12:00:00Z",
"nextRun": "2025-01-01T12:05:00Z",
"status": "已完成",
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T12:00:00Z"
}
对于Shell命令任务,使用command字段指定要执行的命令。
对于AI任务,使用prompt字段指定AI应该做什么。
type字段可以是shell_command(默认)或AI。
任务可以有以下状态值:
待处理 - 任务尚未运行正在运行 - 任务当前正在运行已完成 - 任务成功完成失败 - 任务在执行过程中失败已禁用 - 任务已禁用,不会按计划运行调度器使用github.com/robfig/cron/v3库解析Cron表达式。格式包括秒:
┌───────────── 秒 (0 - 59) (可选)
│ ┌───────────── 分钟 (0 - 59)
│ │ ┌───────────── 小时 (0 - 23)
│ │ │ ┌───────────── 月中的日期 (1 - 31)
│ │ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ │ ┌───────────── 星期几 (0 - 6) (周日到周六)
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * *
示例:
0 */5 * * * * - 每5分钟(在0秒处)0 0 * * * * - 每小时0 0 0 * * * - 每天午夜0 0 12 * * MON-FRI - 每个工作日中午mcp-cron/
├── cmd/
│ └── mcp-cron/ # 主应用程序入口点
├── internal/
│ ├── agent/ # AI代理执行功能
│ ├── command/ # 命令执行功能
│ ├── config/ # 配置处理
│ ├── errors/ # 错误类型和处理
│ ├── logging/ # 日志实用工具
│ ├── model/ # 数据模型和类型
│ ├── scheduler/ # 任务调度
│ ├── server/ # MCP服务器实现
│ └── utils/ # 杂项实用工具
├── scripts/ # 实用脚本
├── go.mod # Go模块定义
├── go.sum # Go模块校验和
└── README.md # 项目文档
# 构建应用程序
go build -o mcp-cron cmd/mcp-cron/main.go
# 运行测试
go test ./...
# 运行测试并检查覆盖率
go test ./... -cover