关于 AgentLater
AgentLater 是面向 Agent 的托管 MCP 服务,可安排 HTTP 请求、跟踪投递并在后续会话中读取结果。它记录执行结果,但不运行 Agent。
主要功能
- 01安排或排队发送 HTTP 请求
- 02重复请求并轮询任务
- 03接收 Webhook 并存入收件箱
- 04查看、取消或重试任务
- 05保存凭据并触发唤醒
适用场景
- 01延迟调用 Webhook
- 02轮询端点直至任务完成
- 03在后续会话查看投递结果
MCP 相关
它通过支持 OAuth 的 Streamable HTTP 向远程 MCP 客户端提供 HTTP 调度、任务管理、Webhook 收件箱、凭据和唤醒工具。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://gateway.agentlater.io/mcpclaude mcp add --transport http io-agentlater-agentlater https://gateway.agentlater.io/mcp{"mcpServers":{"io-agentlater-agentlater":{"type":"http","url":"https://gateway.agentlater.io/mcp"}}}在 Cursor 中打开{"servers":{"io-agentlater-agentlater":{"type":"http","url":"https://gateway.agentlater.io/mcp"}}}在 VS Code 中打开{"mcpServers":{"io-agentlater-agentlater":{"type":"http","url":"https://gateway.agentlater.io/mcp"}}}{"mcpServers":{"io-agentlater-agentlater":{"serverUrl":"https://gateway.agentlater.io/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
AgentLater
让 AI Agent 稍后发起 HTTP 请求,并检查请求是否已执行。
AgentLater 是一个托管的 模型上下文协议(MCP) 服务,面向需要安排 HTTP 任务、等待任务完成或在后续会话中获取结果的 Agent。 它会发送请求并记录投递结果;它本身不会运行 Agent。
Agent 可以做什么
| 需求 | 工具 |
|---|---|
| 稍后或在后台发送请求 | schedule_http、queue_http(可选择在命名队列中串行处理相关请求) |
| 重复请求或轮询,直到任务完成 | create_cron、watch_http |
| 接收 Webhook,并在后续会话中读取结果 | create_hook、read_inbox、ack_inbox |
| 检查、停止或重试任务 | get_task、list_tasks、cancel_task、redrive_task |
| 使用凭据,或在结果到达时触发 Agent 工作流 | set_secret、set_wake |
参数、限制和投递语义请参阅完整工具参考。 唤醒 URL 必须指向能够启动 Agent 运行的目标;仅有收件箱事件不会恢复聊天。
连接 MCP 客户端
请使用支持远程 Streamable HTTP 和 MCP OAuth 的客户端。添加一个名为 agentlater 的远程服务或自定义连接器,并使用以下 URL:
https://gateway.agentlater.io/mcp
对于使用 HTTP 传输和 mcpServers JSON 配置的客户端,配置如下:
{
"mcpServers": {
"agentlater": {
"type": "http",
"url": "https://gateway.agentlater.io/mcp"
}
}
}
不同客户端的配置格式有所不同;如果客户端不接受此格式,请使用其远程服务设置。 端点和传输方式也已在 server.json 中声明。
**身份验证:**完成客户端打开的 OAuth 流程,并在 AgentLater 授权页面上点击 Connect。无需创建账户,也无需将 API 密钥粘贴到配置中;客户端会管理 OAuth 令牌。每个获批的连接都拥有独立的项目和试用额度。连接后调用一次 create_project(再次调用会返回同一个项目):试用额度包含 7 天内的 1,000 次投递尝试。使用 get_project 查看余额,需要更多尝试次数时使用 get_payment_link。
对于 Claude Code,也可以安装插件,其中包含托管服务配置和使用这些工具的技能:
/plugin marketplace add thachp/agentlater
/plugin install agentlater@agentlater
安装和迁移详情请参阅插件 README。 自主集成也可以在网关使用 Agent Auth; 该身份及其项目独立于托管 MCP 连接。
A2A
使用 Agent2Agent 协议(版本 1.0、JSON-RPC)的 Agent,可以使用 Agent Auth 登录,无需人工登录即可安排一次性投递,并读取、列出和取消投递。请从 Agent Card 开始:https://gateway.agentlater.io/.well-known/agent-card.json。
# in a checkout, after npm ci
node apps/gateway/examples/a2a-client.mjs https://gateway-staging.agentlater.io
a2a-client.mjs 是一个完整的单文件客户端:它读取 Agent Card、注册、创建项目、安排投递并轮询直至结束。在代码库之外使用时,请复制该文件并运行 npm install @a2a-js/[email protected] @auth/[email protected]。密钥保存在 ~/.agentlater/ 中(模式为 0600)。身份验证流程、负载架构、任务状态、错误,以及 A2A 不支持的功能(定时任务、监视、钩子、密钥、付款、流式传输、推送通知、回调、通道)详见 A2A 文档和 PRODUCT.md。
示例:通过 webhook 触发后台作业
一种常见用法是在延迟一段时间后调用应用的作业端点,例如,在 15 分钟后生成导出文件,而无需让 Agent 会话保持打开状态。
连接后,请向你的 Agent 提出以下请求:
创建我的 AgentLater 项目,然后在 15 分钟后向我的导出 webhook 发送 POST 请求,并附上
{"report": "daily-sales", "format": "csv"}。使用我存储的 webhook 令牌,记录响应, 并将投递结果放入我的收件箱。
Agent 会使用 {} 调用 create_project。如果端点需要 bearer 令牌,请先使用以下参数调用
set_secret,将占位符替换为端点的实际令牌,并将主机替换为你自己的主机:
{
"name": "WEBHOOK_TOKEN",
"value": "<your-webhook-token>",
"allowed_hosts": ["api.example.com"]
}
然后使用以下参数调用 schedule_http。将示例 URL 替换为你自己的公开 HTTPS 作业端点。body 是经过 JSON 编码的字符串,而不是对象。
{
"url": "https://api.example.com/jobs/export",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{secret:WEBHOOK_TOKEN}}"
},
"body": "{\"report\":\"daily-sales\",\"format\":\"csv\"}",
"delay": "15m",
"idempotency_key": "daily-sales-export-001",
"capture": true,
"callback_url": "inbox"
}
每个计划作业都应使用新的 idempotency_key;如果重复使用相同的键和请求,系统会返回原始任务。你的端点还应使用 RunLater-Task-Id 对投递进行去重,因为投递重试可能会多次到达该端点。对于无需身份验证的端点,请省略密钥设置和 Authorization 标头。
保存返回的 task_id,并使用 get_task({"task_id": "<returned task_id>"}) 查看它。
在之后的会话中,使用 {} 调用 get_project,如果 inbox_unread 大于零,再使用 {} 调用 read_inbox。处理完事件后,调用 ack_inbox({"up_to": 1}),并将 1 替换为你已处理事件的最后一个 seq。这些是 MCP 工具名称和参数对象,不是 shell 命令。无需公共回调 URL 即可在收件箱中接收投递报告。如果端点返回 202 Accepted,表示它已接受该作业;如果还需要等待导出完成,请对其状态 URL 使用 watch_http。
投递采用至少一次语义;succeeded 表示目标返回了 HTTP 2xx。目标必须是公开的 HTTPS URL,不能是 localhost 或私有 IP 地址。对于需要身份验证的请求,请使用 set_secret 存储凭据,并在标头中使用 {{secret:NAME}},而不是将凭据直接粘贴到请求中。
限制与故障排查
- 最多可提前 7 天安排任务。Cron 表达式使用 UTC,运行频率最高为每小时一次;监视器的轮询间隔为 5 分钟至 24 小时。任务完成后的 7 天内,捕获的响应会保留正文的前 16 KiB。
project_not_found:请先在当前连接上调用create_project,然后再安排任务。budget_exhausted或trial_expired:检查get_project,并使用get_payment_link获取更多尝试次数。每次投递尝试、轮询和 URL 回调尝试都会消耗额度;收件箱投递免费。- 连接或登录失败:确认 URL 以
/mcp结尾,并且客户端同时支持 Streamable HTTP 和 OAuth。仅支持本地 stdio 服务的客户端需要使用受支持的桥接;请参阅 Agent Auth 桥接配置。 - 尚无结果:使用返回的
task_id检查get_task,查看其状态和尝试历史记录。请使用安排任务时的同一连接读取收件箱;新连接会有单独的项目。
文档与兼容性
AgentLater 以前名为 RunLater。现有的 runlater 插件连接会保留各自的项目;安装 agentlater 插件会创建单独的连接,而不会迁移现有工作。
部分内部软件包名称和投递标头(例如 RunLater-Task-Id)为保持兼容性,仍沿用旧名称。
规格文档包括 PRODUCT.md(功能说明)、ARCHITECTURE.md (构建方式)和 DESIGN.md(面向 Agent 和用户的体验设计)。重建前的实现已在切换时移除;可在此次变更之前的 git 历史中找到。
项目结构
| 路径 | 说明 | 技术栈 |
|---|---|---|
apps/api | 私有任务 API:账本、调度、交付 | Rust · workers-rs |
apps/gateway | 面向 Agent 的公共入口:Agent 身份验证、功能、MCP、A2A | TypeScript Worker |
apps/web | agentlater.io 落地页、文档和支付页面 | Next.js · OpenNext |
apps/receiver | 仅用于暂存环境的接收端,接收端到端流程和 A2A 运行结果 | TypeScript Worker |
crates/core | 任务领域逻辑,不依赖 Cloudflare | Rust |
crates/egress | 目标策略和请求签名 | Rust |
packages/contracts | 功能定义,以及 gateway 与 API 之间的 OpenAPI 契约 | TypeScript · OpenAPI 3.1 |
packages/tsconfig | 共享的 TypeScript 配置 | |
plugins/agentlater | Claude Code 插件:托管的 MCP 服务和 agentlater 技能 | Markdown · JSON |
plugins/runlater | 旧版插件,已弃用并冻结,以确保现有安装仍可正常工作 | Markdown · JSON |
所有内容都部署到 Cloudflare Workers;每个应用的 wrangler.jsonc 中都有 staging 和 production 环境(apps/receiver 仅有 staging);请参阅 docs/DEPLOY.md。
开发
需要安装 Rust(版本固定在 rust-toolchain.toml 中)、Node 22+,以及运行 cargo install worker-build --version 0.8.7 --locked。
npm install
cargo test && npm run typecheck && npm test
一条命令即可运行 CI 执行的所有检查(-- --fast 会跳过端到端测试套件):
npm run verify
代码遵循的规则及其对应的检查规则见 CODING_STANDARDS.md。
npm run dev -w @runlater/gateway
npm run dev -w @runlater/web
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。