返回市场
mcp-定时任务

mcp-定时任务

作者:jolks13 星标更新:2025-04-26

项目介绍

MCP Cron

Model Context Protocol (MCP) 服务器,通过标准化API进行任务调度和管理。该服务器支持通过MCP协议访问Shell命令和AI驱动的任务调度功能。

特性

  • 使用Cron表达式调度Shell命令或提示AI任务
  • AI可以访问MCP服务器
  • 通过MCP协议管理任务
  • 命令执行并捕获输出

安装

从源代码构建

先决条件

  • Go 1.23.0 或更高版本
# 克隆仓库
git clone https://github.com/jolks/mcp-cron.git
cd mcp-cron

# 构建应用程序为mcp-cron二进制文件
go build -o mcp-cron cmd/mcp-cron/main.go

使用方法

服务器支持两种传输模式:

  • SSE(服务器发送事件):默认基于HTTP的浏览器和网络客户端传输方式
  • stdio:标准输入/输出传输方式,适用于直接管道和进程间通信
客户端配置文件位置
Cursor~/.cursor/mcp.json
Claude Desktop (Mac)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows)%APPDATA%\Claude\claude_desktop_config.json

SSE

# 使用HTTP SSE传输启动服务器(默认模式)
# 默认为localhost:8080
./mcp-cron

# 使用自定义地址和端口启动
./mcp-cron --address 127.0.0.1 --port 9090

配置文件示例

{
  "mcpServers": {
    "mcp-cron": {
      "url": "http://localhost:8080/sse"
    }
  }
}

stdio

stdio传输特别适用于:

启动Cursor IDE和Claude Desktop时,会自动启动服务器

配置文件示例

{
  "mcpServers": {
    "mcp-cron": {
      "command": "<mcp-cron二进制文件所在路径>/mcp-cron",
      "args": ["--transport", "stdio"]
    }
  }
}

命令行参数

支持以下命令行参数:

参数描述默认值
--address绑定服务器的地址localhost
--port绑定服务器的端口8080
--transport传输模式:ssestdiosse
--log-level日志级别:debug, info, warn, error, fatalinfo
--log-file日志文件路径stdout
--version显示版本信息并退出false
--ai-model用于AI任务的AI模型gpt-4o
--ai-max-iterations工具启用的AI任务的最大迭代次数20
--mcp-config-pathMCP配置文件路径~/.cursor/mcp.json

环境变量

支持以下环境变量:

环境变量描述默认值
MCP_CRON_SERVER_ADDRESS绑定服务器的地址localhost
MCP_CRON_SERVER_PORT绑定服务器的端口8080
MCP_CRON_SERVER_TRANSPORT传输模式:ssestdiosse
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, fatalinfo
MCP_CRON_LOGGING_FILE日志文件路径stdout
OPENAI_API_KEYAI任务的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_PATHMCP配置文件路径~/.cursor/mcp.json

日志记录

使用默认的SSE传输运行时,日志输出到控制台。

使用stdio传输运行时,日志重定向到一个名为mcp-cron.log的日志文件中,以防止干扰JSON-RPC协议:

  • 日志文件位置:与mcp-cron二进制文件相同的位置。
  • 任务输出、执行详情和服务器诊断信息写入此文件。
  • 保留stdout/stderr流仅用于协议消息。

可用的MCP工具

服务器通过MCP协议暴露了多个工具:

  1. list_tasks - 列出所有已调度的任务
  2. get_task - 根据ID获取特定任务
  3. add_task - 添加新的已调度任务
  4. add_ai_task - 添加新的已调度AI(LLM)任务,并带有提示
  5. update_task - 更新现有任务
  6. remove_task - 根据ID删除任务
  7. enable_task - 启用已禁用的任务
  8. 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

任务状态

任务可以有以下状态值:

  • 待处理 - 任务尚未运行
  • 正在运行 - 任务当前正在运行
  • 已完成 - 任务成功完成
  • 失败 - 任务在执行过程中失败
  • 已禁用 - 任务已禁用,不会按计划运行

Cron表达式格式

调度器使用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

致谢