sls-log-mcp-worker
v0.1.2
Published
MCP server for querying Aliyun SLS logs over Cloudflare Worker or stdio.
Downloads
445
Readme
SLS Log MCP
一个最小可用的 MCP Server,用于查询阿里云 SLS 日志。支持两种运行方式:
- Cloudflare Worker:适合部署成远程 MCP HTTP 服务。
- stdio:适合本地 MCP 客户端通过
npx或全局命令直接启动。
能力
只提供一个通用工具:
query_logs:按 SLSproject、logstore和GetLogs查询参数查询日志。默认返回 CSV 文本。
这个 MCP 不内置业务环境概念。prod、beta、test、api、worker 这类映射应由调用方或 Agent 提示词维护,而不是写死在工具参数里。
阿里云 AK/SK 不写死在代码里。Worker 模式通过请求 Header 传入,stdio 模式通过环境变量传入。SLS Endpoint 是工具参数,由调用 query_logs 时传入。
query_logs 参数
| 参数 | 必填 | 说明 | 默认 |
| --- | --- | --- | --- |
| sls_endpoint | 是 | SLS 公网 Endpoint,例如 cn-hangzhou.log.aliyuncs.com。不要带 https:// | 无 |
| project | 是 | SLS Project 名称,例如 evose-private-prod | 无 |
| logstore | 是 | SLS LogStore 名称,例如 api | 无 |
| start_time | 否 | 查询开始时间。支持 Unix 秒、ISO 时间、YYYY-MM-DD HH:mm:ss | 最近 15 分钟 |
| end_time | 否 | 查询结束时间。支持 Unix 秒、ISO 时间、YYYY-MM-DD HH:mm:ss | 当前时间 |
| query | 否 | SLS 查询语句,支持原生 SLS 查询语法 | * |
| limit | 否 | 返回条数,范围 0-100000 | 20 |
| offset | 否 | 分页偏移 | 0 |
| page_size | 否 | 每次请求 SLS 的条数,范围 1-100;查询容易超时时调小 | 20 |
| max_field_length | 否 | 单个字符串字段最大返回字符数,范围 0-20000;0 表示不截断 | 2000 |
| sort_order | 否 | 排序方向:desc 或 asc | desc |
| topic | 否 | SLS topic | 空字符串 |
| response_format | 否 | 返回格式:csv 或 json。默认 CSV;传 json 时返回完整查询元数据和 logs | csv |
内置限制:
- 默认查最近 15 分钟。
- 默认返回 CSV 文本。
- 默认返回 20 条。
- 最多返回 100000 条。
- 默认每次向 SLS 拉 20 条,降低单次查询超时概率。
- 默认截断单个超长字段,避免 MCP 响应体过大。
- 大于
page_size时,Worker 内部自动分页拉取。 - 无日志时,CSV 返回空字符串。
真正的查询范围由 RAM 权限控制。传入的 AK/SK 只能查哪些 Project,这个 MCP 就只能查哪些 Project。
Cloudflare Worker 在公网运行,sls_endpoint 不能使用阿里云内网地址,所以不要传 *-intranet.log.aliyuncs.com。
配置
Worker 侧只保留查询限制参数:
DEFAULT_QUERY_SECONDS = "900"
DEFAULT_QUERY_LIMIT = "20"
DEFAULT_PAGE_SIZE = "20"
MAX_QUERY_LIMIT = "100000"
MAX_FIELD_LENGTH = "2000"stdio 模式
安装后运行:
npm install -g sls-log-mcp-worker
sls-log-mcp也可以直接用 npx:
npx -y sls-log-mcp-workerstdio 模式通过环境变量读取阿里云凭证:
| 环境变量 | 必填 | 说明 |
| --- | --- | --- |
| ALIYUN_ACCESS_KEY_ID | 是 | 阿里云 RAM 用户 AccessKey ID |
| ALIYUN_ACCESS_KEY_SECRET | 是 | 阿里云 RAM 用户 AccessKey Secret |
同时兼容 ALICLOUD_ACCESS_KEY_ID、ALICLOUD_ACCESS_KEY_SECRET、ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET。
可选环境变量:
| 环境变量 | 默认 | 说明 |
| --- | --- | --- |
| SLS_MCP_DEFAULT_QUERY_SECONDS | 900 | 不传 start_time 时默认查询最近多少秒 |
| SLS_MCP_DEFAULT_QUERY_LIMIT | 20 | 默认返回条数 |
| SLS_MCP_DEFAULT_PAGE_SIZE | 20 | 每次请求 SLS 的条数 |
| SLS_MCP_MAX_QUERY_LIMIT | 100000 | 最大返回条数 |
| SLS_MCP_MAX_FIELD_LENGTH | 2000 | 单个字符串字段最大返回字符数,0 表示不截断 |
| SLS_MCP_DEFAULT_TIMEZONE_OFFSET | +08:00 | 解析无时区时间字符串时使用的默认时区 |
MCP 客户端配置示例:
{
"mcpServers": {
"sls-log": {
"command": "npx",
"args": ["-y", "sls-log-mcp-worker"],
"env": {
"ALIYUN_ACCESS_KEY_ID": "<ALIYUN_ACCESS_KEY_ID>",
"ALIYUN_ACCESS_KEY_SECRET": "<ALIYUN_ACCESS_KEY_SECRET>"
}
}
}
}Worker 模式 Header
每次使用 MCP 时传这些 Header:
| Header | 必填 | 说明 |
| --- | --- | --- |
| x-aliyun-access-key-id | 是 | 阿里云 RAM 用户 AccessKey ID |
| x-aliyun-access-key-secret | 是 | 阿里云 RAM 用户 AccessKey Secret |
本地开发 Worker
npm install
npm run dev本地验证 stdio
npm run build
ALIYUN_ACCESS_KEY_ID=<ALIYUN_ACCESS_KEY_ID> \
ALIYUN_ACCESS_KEY_SECRET=<ALIYUN_ACCESS_KEY_SECRET> \
node dist/stdio.js部署到 Cloudflare Worker
npm install
npm run deploy发布到 npm
发布由 GitHub Actions 自动完成。仓库推送形如 v0.1.0 的 tag 后,workflow 会执行类型检查、构建,并发布到 npm。
推荐使用 npm Trusted Publishing,不需要在 GitHub 配置 NPM_TOKEN。npm 会通过 OIDC 信任指定的 GitHub 仓库和 workflow。
前提:
- npm 包必须已经存在。首次发布包时,仍需要手动
npm publish --access public,或临时使用 token 发布一次。 - npm 账号需要开启 2FA。
首次发布后,在 npm 配置 Trusted Publisher:
- 打开 npm 包页面的
Settings。 - 找到
Trusted Publisher。 - 选择
GitHub Actions。 - 填写:
- Organization or user:
leezee7 - Repository:
sls-log-mcp-worker - Workflow filename:
publish-npm.yml - Allowed actions:勾选
npm publish
- Organization or user:
也可以用 npm CLI 配置:
npm install -g npm@latest
npm trust github sls-log-mcp-worker \
--repo leezee7/sls-log-mcp-worker \
--file publish-npm.yml \
--allow-publish发版步骤:
npm version patch --no-git-tag-version
git add package.json package-lock.json
git commit -m "Release 0.1.1"
git push origin main
git tag v0.1.1
git push origin v0.1.1要求:
- tag 必须以
v开头,例如v0.1.1。 - tag 去掉
v后必须等于package.json里的version。 - 不要把 npm token 写进代码、README 或 workflow 文件。
RAM 最小查询权限
把 ${ACCOUNT_ID} 替换成阿里云账号 ID。示例:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": ["log:GetLogStoreLogs"],
"Resource": [
"acs:log:*:${ACCOUNT_ID}:project/evose-private-prod",
"acs:log:*:${ACCOUNT_ID}:project/evose-private-beta",
"acs:log:*:${ACCOUNT_ID}:project/evose-private-test"
]
}
]
}如果只允许查某些 LogStore,可以进一步收窄到:
"acs:log:*:${ACCOUNT_ID}:project/evose-private-prod/logstore/api"MCP 调用示例
健康检查:
curl https://<worker-domain>/health初始化:
curl https://<worker-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'x-aliyun-access-key-id: <ALIYUN_ACCESS_KEY_ID>' \
-H 'x-aliyun-access-key-secret: <ALIYUN_ACCESS_KEY_SECRET>' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": {
"name": "curl",
"version": "0.1.0"
}
}
}'列出工具:
curl https://<worker-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'x-aliyun-access-key-id: <ALIYUN_ACCESS_KEY_ID>' \
-H 'x-aliyun-access-key-secret: <ALIYUN_ACCESS_KEY_SECRET>' \
--data '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}'查询最近 15 分钟 API 错误日志:
curl https://<worker-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'x-aliyun-access-key-id: <ALIYUN_ACCESS_KEY_ID>' \
-H 'x-aliyun-access-key-secret: <ALIYUN_ACCESS_KEY_SECRET>' \
--data '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "query_logs",
"arguments": {
"sls_endpoint": "cn-hangzhou.log.aliyuncs.com",
"project": "evose-private-prod",
"logstore": "api",
"query": "level: ERROR",
"limit": 20
}
}
}'按关键词查 worker 日志:
curl https://<worker-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'x-aliyun-access-key-id: <ALIYUN_ACCESS_KEY_ID>' \
-H 'x-aliyun-access-key-secret: <ALIYUN_ACCESS_KEY_SECRET>' \
--data '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "query_logs",
"arguments": {
"sls_endpoint": "cn-hangzhou.log.aliyuncs.com",
"project": "evose-private-beta",
"logstore": "worker",
"start_time": "2026-06-13 16:00:00",
"end_time": "2026-06-13 17:00:00",
"query": "\"notify_delivery\"",
"limit": 50,
"page_size": 20
}
}
}'Evose 接入
Worker MCP URL:
https://<worker-domain>/mcpstdio 模式的 MCP 服务配置:
{
"command": "npx",
"args": ["-y", "sls-log-mcp-worker"],
"env": {
"ALIYUN_ACCESS_KEY_ID": "<ALIYUN_ACCESS_KEY_ID>",
"ALIYUN_ACCESS_KEY_SECRET": "<ALIYUN_ACCESS_KEY_SECRET>"
}
}阿里云 Header:
x-aliyun-access-key-id: <ALIYUN_ACCESS_KEY_ID>
x-aliyun-access-key-secret: <ALIYUN_ACCESS_KEY_SECRET>工具参数里传:
{
"sls_endpoint": "cn-hangzhou.log.aliyuncs.com",
"project": "evose-private-prod",
"logstore": "api",
"query": "*",
"limit": 20
}