aspscheduler mcp服务器
MCP(模型上下文协议)HTTP服务器实现 apscheduler.
示例/事件流程/场景(披萨星期五)
- 上下文:代理连接到此调度器MCP服务和其他MCP服务:
- 披萨订购MCP:工具 order_pizza(type-of-pizza, "time to delivery today") - 电子邮件MCP:工具 send_email(email, message) 邀请同事 - 竹MCP:用于检索生日的工具,例如。 get_birthdays(window) 哪里 window 可以是 last_week
- 用户向代理发出请求:“每周五,安排一份披萨订单在下午5:00交付,并安排一封电子邮件在下午4:45邀请同事参加周五披萨。邀请中包括上周过生日的人。”
- 代理行为:
- 检索可用的MCP服务端点及其工具 - 制定执行计划 - 使用JSON格式的计划调用此服务中的一个调度工具
- 调度器行为:
- 接受计划请求并存储cron触发器 - 当时间匹配时,执行计划
- 基于LLM的员工行为:
- 连接到所有MCP服务的工作LLM在触发时间接收计划,并通过调用引用的MCP工具执行每个操作,遵守每个操作的 condition 字段来管理排序和成功依赖关系。
下面有两个独立的时间表:(1)每周五17:00点点披萨的一个动作;(2)每周五16:45有两个动作——首先获取上周的生日,然后发送电子邮件。第二个动作以第一个动作的成功为条件。该消息显示了一个常见的占位符模式,以包括上游结果;实际的插值取决于执行计划的工人/代理。
时间表1:每周五17:00订购披萨
工具调用输入 schedule_tool_call_by_cron:
{
"execution_plan": {
"order_pizza": {
"mcp-service-endpoint": "http://pizza-mcp:3001/mcp/",
"mcp-tool-name": "order_pizza",
"mcp-tool-arguments": {
"type-of-pizza": "assorted",
"time to delivery today": "17:00"
}
}
},
"day_of_week": "fri",
"hour": "17",
"minute": "00",
"timezone": "America/Los_Angeles"
}时间表2:取生日,然后每周五16:45发送电子邮件
工具调用输入 schedule_tool_call_by_cron:
{
"execution_plan": {
"fetch_birthdays": {
"mcp-service-endpoint": "http://bamboo-mcp:3003/mcp/",
"mcp-tool-name": "get_birthdays",
"mcp-tool-arguments": {
"window": "last_week"
},
"condition": "executes first"
},
"send_email": {
"mcp-service-endpoint": "http://email-mcp:3002/mcp/",
"mcp-tool-name": "send_email",
"mcp-tool-arguments": {
"email": "team@company.com",
"message": "Welcome Pizza Friday in the kitchen at 4:45pm! Birthdays: ${fetch_birthdays.result.summary}"
},
"condition": "executes only if fetch_birthdays was successful"
}
},
"day_of_week": "fri",
"hour": "16",
"minute": "45",
"timezone": "America/Los_Angeles"
}\[!注意\] - 端点 是示例;使用您实际的MCP服务URL。 - 如果启用worker策略,则计划将转发到worker MCP>工具并在那里执行;如果您在以后的操作中依赖占位符,请确保worker支持引用以前的操作输出。
安装
环境变量/env文件
设置环境变量或配置 .env 文件使用 .env.example 作为模板。
常见变量:
MCP_HOST和MCP_PORT:配置服务绑定和公开的HTTP主机和端口。示例见.env.example.
执行策略
此服务支持两种策略来执行 execution_plan:
- 顺序(默认):在此服务流程中逐一执行每个操作。设置
EXECUTION_STRATEGY=sequential(未设置时为默认值)。 - 工人:将整个计划转发给工人MCP工具,然后由其执行操作。启用
EXECUTION_STRATEGY=worker.
使用worker策略时,请同时配置以下两项:
WORKER_ENDPOINT:工作MCP服务端点WORKER_TOOL_NAME:接受计划的工人MCP工具名称(用 `{ "execution_plan":
}`)
您可以通过环境变量进行设置(请参见 .env.example)或在运行时通过标记的MCP工具 admin:
set_worker_endpoint(worker_endpoint)--套装WORKER_ENDPOINTset_worker_tool_name(worker_tool_name)--套装WORKER_TOOL_NAME
执行计划架构
这 execution_plan 参数注释/模式在中定义 plan-schema.ann。此文件的格式不固定;它被用作向MCP代理显示的描述,以便他们可以阅读和填充计划。每个操作的最低必填字段为:
mcp-service-endpointmcp-tool-name
可选的每个操作字段:
mcp-tool-arguments
您可以使用以下命令覆盖注释文件路径 PLAN_SCHEMA_ANNOTATION_PATH 环境变量(默认为 plan-schema.ann).
码头工人
A. Dockerfile 提供,以便您可以在容器中构建和运行服务。
塑造形象:
docker build -t apscheduler-mcp-server:latest .运行容器(示例将主机端口3000映射到容器端口3000):
docker run --rm \
-p 3000:3000 \
-e MCP_HOST=0.0.0.0 \
-e MCP_PORT=3000 \
--env-file .env \
apscheduler-mcp-server:latest注:确保 MCP_HOST 设置为 0.0.0.0 因此可以从容器外部访问HTTP服务器。
发展
设置
- 克隆存储库。
- 安装开发依赖项:
uv sync --dev- 创建一个
.env文件来自.env.example.
预提交钩子
此项目使用 预承诺 使用以下命令自动检查代码样式 ruff 每次提交之前。
要设置预提交挂钩,请运行:
uv run pre-commit install这将确保 ruff 每次提交之前都会自动运行检查。
运行MCP服务
要启动MCP服务,请运行:
uv run --env-file .env src/main.py可用的MCP工具
list_scheduled_jobs()--列出所有计划作业(新)remove_scheduled_job(job_id)--按id删除计划作业schedule_tool_call_by_cron(execution_plan, ...)--Cron式调度schedule_tool_call_at_interval(execution_plan, ...)--固定时间间隔调度schedule_tool_call_once_at_date(execution_plan, run_date)--一次性日程安排set_worker_endpoint(worker_endpoint)--要设置的管理工具WORKER_ENDPOINTset_worker_tool_name(worker_tool_name)--要设置的管理工具WORKER_TOOL_NAME
运行测试
要运行测试套件,请使用:
uv run --dev pytest奔跑的林特斯
该项目使用 ruff 作为过梁的工具。
要检查代码样式和linting问题,请运行:
uv run ruff check要自动修复格式问题,请运行:
uv run ruff format