API、CLI和MCP
进入同一账户的三种方式,套餐限制和角色权限相同。以下内容均属于这三种方式之一,因此值得了解您选择的是哪一种。
您的API令牌
在账户的API令牌中生成一个。令牌仅显示一次,我们仅保存其指纹。它属于您而非组织:权限不超过您的角色权限,若您离开或角色变更则失效。选择读取或读取和写入权限。
在每次调用中将其作为Authorization: Bearer n404_...发送。第一个值得调用的是/api/v1/me,它会返回令牌所属的组织、角色以及两种权限范围中的哪一种:拥有两个账户的人会有两个令牌,无法通过其他方式区分环境变量中的令牌。
版本1的内容
| 调用 | 功能 |
|---|---|
| GET /api/v1/me | 此令牌的内容及其所属组织 |
| GET /api/v1/monitors | 所有监控,按时间从旧到新排序 |
| POST /api/v1/monitors | 创建一个,遵循表单规则 |
| GET /api/v1/monitors/{id} | 一个监控 |
| PATCH /api/v1/monitors/{id} | 更改其名称、地址、间隔或配置,或暂停监控 |
| DELETE /api/v1/monitors/{id} | 删除监控及其历史记录 |
| GET /api/v1/monitors/{id}/status | 当前状态及其在时间窗口内的正常运行时间 |
| GET /api/v1/groups | 每个组及其包含的监视器数量 |
| POST /api/v1/groups | 创建一个;已存在的名称会返回对应的组 |
| GET /api/v1/groups/{id} | 一个组 |
| PATCH /api/v1/groups/{id} | 重命名或修改描述 |
| DELETE /api/v1/groups/{id} | 删除组,其监视器会保留但不再分组 |
| GET /api/v1/incidents | 故障,按最新排序,可按状态、监视器或时间段筛选 |
| GET /api/v1/incidents/{id} | 一个事件及其检测和确认的探针 |
| GET /api/v1/maintenance | 维护窗口及其覆盖范围 |
| GET /api/v1/maintenance/{id} | 一个窗口及其覆盖的监视器和组 |
| POST /api/v1/maintenance | 按组织的时区安排一个窗口,以便部署前开启窗口 |
| DELETE /api/v1/maintenance/{id} | 删除窗口,其已覆盖的内容仍然保留 |
| GET /api/v1/status-pages | 每个状态页及其是否已启用 |
| GET /api/v1/status-pages/{id} | 一个状态页及其发布的内容 |
| POST /api/v1/status-pages/{id}/monitors | 将监视器放到状态页上,并使用受众应看到的名称 |
| DELETE /api/v1/status-pages/{id}/monitors/{id} | 从此状态页移除,其他状态页仍保留 |
| POST /api/v1/status-pages/{id}/groups | 将组放到状态页上,其监视器也会一并加入 |
| DELETE /api/v1/status-pages/{id}/groups/{id} | 移除标题,其监视器仍然发布 |
路径或正文中的每个id都是UUID,而不是数字。写入需要读写token和具有写入权限的角色:scope是你提供给程序的内容,role是你被允许提供的权限。
文档是OpenAPI 3.1。它描述了每个调用、每个正文的结构以及bearer token,因此可以从中生成客户端而无需手写:openapi-generator、oapi-codegen及其他内容按原样读取。操作以人为命名,因此生成的方法是listMonitors和createMonitor。
版本1只会增加字段,不会移除或更改字段类型,第二个版本会使用第二个路径。因此生成的客户端始终可用,重新生成客户端即可获取新增内容。
如果需要客户端
一个文件,Python 3.9或更高版本,无需依赖。下载后设置为可执行文件,并将token放入环境变量。它可以执行API的所有操作,因为每个命令都是对上述路由的一次调用。
curl -O https://nomore404.com/api/nomore404.py
curl -s https://nomore404.com/api/nomore404.py.sha256 | sha256sum -c
chmod +x nomore404.py
export N404_TOKEN=n404_...
./nomore404.py monitors list
./nomore404.py monitors add --type https --target shop.example.com
./nomore404.py incidents --state open
第二行值得运行。它会将文件与我们发布的摘要进行校验,该摘要是服务器发送内容的准确摘要,因此被篡改的下载文件不会匹配。./nomore404.py --version表示文件来自哪个版本,每个请求的User-Agent中也会包含相同信息。
token来自N404_TOKEN或脚本旁的nomore404.env文件,而不是命令行参数:参数在ps中对机器上的所有用户可见,并会保留在shell历史记录中。
用于助手
助手可以通过Model Context Protocol读取并修改此账户。有两种方式进入,但它们并不相同。
一个地址,无需安装
将此粘贴到助手要求自定义连接器的地方。它会将你引导至此登录并指定连接所属的组织,设置即完成。
它以你的身份操作:每次调用都会读取你的角色,因此由只能读取权限的人连接的助手也只能读取。它可以读取监视器、故障、正常运行时间、维护窗口和组,并可以添加和修改,包括删除监视器及其历史记录。你可以随时从API令牌中断开连接,助手会列在其中。
或者自己运行,让它保持读取
nomore404_mcp.py提供与本地工具相同的API。将它与nomore404.py放在一起,它会使用token和分页功能。它只读取而不写入,这也是选择它的原因:助手是一个可以被引导的调用者,而一个可以删除监视器及其历史记录的工具可能会被轻易使用。
两个文件,一个token放在旁边,一行命令注册服务器。Claude代码:
curl -O https://nomore404.com/api/nomore404.py
curl -O https://nomore404.com/api/nomore404_mcp.py
echo 'N404_TOKEN=n404_...' > nomore404.env
claude mcp add nomore404 -- python3 "$PWD/nomore404_mcp.py"
任何其他使用该协议的工具都可以将相同的命令写成JSON,无论客户端将其服务器放在哪里:
{
"mcpServers": {
"nomore404": {
"command": "python3",
"args": ["/path/to/nomore404_mcp.py"]
}
}
}
两者都不命名token,因为不应该命名:它会从脚本旁的nomore404.env或助手启动时的环境中的N404_TOKEN读取。然后询问它哪些服务宕机、事件为何发生或监视器本月的表现。
两者代码都只有几百行,运行前值得阅读。它们都未打包或签名,你也可以直接从文档生成自己的客户端。
故障及长列表
一种错误结构
状态表示类别,正文说明具体故障,包含一个用于分支的代码和一句可读的描述。这句话可能在任何版本中被修改,因此不应解析它。
{
"error": {
"code": "monitor_not_found",
"message": "Nothing here with that id."
}
}
使用游标而非偏移量
列表返回items和next_cursor。将游标传回以获取下一页,当游标为null时停止。事件可能在你阅读时到达,而偏移量可能会重复显示一行并漏掉下一行。
GET /api/v1/incidents?limit=50
GET /api/v1/incidents?limit=50&cursor=...
你可以请求多少
一个令牌每分钟可以进行一百二十次调用。每个响应都会包含 RateLimit-Remaining 和 RateLimit-Reset,这样守规矩的客户端可以自行调整速度,而不是通过触碰限制来发现它。超过限制会返回一个带有 Retry-After 的429状态码。