mcpField
D
dockertag

dockertag

本地服务
github.com/CloudCorpRecords开发工具01 周前更新

关于 dockertag

dockertag 可在不联系镜像仓库或拉取镜像的情况下,审计容器镜像引用和提供的 OCI 标签。它面向维护者及 CI 工作流,用于发布前检查标签固定、仓库命名、元数据和 MCP Registry 服务名称标签。

主要功能

  1. 01解析镜像引用
  2. 02检查标签和摘要固定情况
  3. 03标记大写仓库名称
  4. 04检查来源和许可证标签
  5. 05验证 MCP 服务名称标签

适用场景

  1. 01发布前审计镜像引用
  2. 02在 CI 中检查 OCI 元数据
  3. 03验证 MCP Registry 服务名称标签
  4. 04查看镜像审计发现项和计数

MCP 相关

提供 MCP 服务及 audit_image_tags 工具,用于检查镜像引用和提供的 OCI 标签,也可按需验证预期的 MCP 服务名称标签。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-dockertag": {
"command": "npx",
"args": [
"-y",
"@reneturcios/dockertag"
]
}
}
}
启动命令npx -y @reneturcios/dockertag

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@reneturcios/dockertag0.1.0
ocighcr.io/cloudcorprecords/dockertag:0.1.0

工具

1

收录的工具列表 · 更新于 1 周前

参数类型必填说明
imagesarray是要审核的镜像引用(至少一个)
expected_server_namestring否io.modelcontextprotocol.server.name 标签的预期值(可选)

详细介绍

dockertag

镜像引用看起来似乎固定不变,仔细一看却并非如此。 repo 未指定标签时,实际会默默指向 repo:latest; latest 本身会变动;仓库名称中有大写字母时,推送到要求使用小写名称的镜像仓库会失败;发布的镜像也可能缺少用于说明其源代码位置、所采用许可证,以及 MCP 服务的服务器名称的标签,而 MCP Registry 会检查该服务器名称标签,确认无误后才会列出镜像。dockertag 采用折中方案:你提供引用和找到的标签,它会返回一份审计结果。

每个引用都会以同样谨慎的方式解析。摘要是最后一个 @ 后面的全部内容。只有当最后一个路径段包含 : 时,才存在标签——因此,localhost:5000 中的冒号表示端口,绝不是标签;标签是该路径段中最后一个 : 后面的文本。当第一个路径段包含 . 或 :,或者恰好是 localhost 时,它就是注册表;否则,注册表为 docker.io,整个路径则是仓库。

根据解析出的引用和提供的标签,会按固定顺序执行九项检查:

  • INVALID_REFERENCE(错误)——名称部分为空、仓库为空,或存在但为空的标签。该镜像不会继续进行其他检查,解析出的字段均为 null。
  • INVALID_DIGEST(错误)——摘要不符合 sha256: 后跟 64 个小写十六进制字符的格式。
  • UPPERCASE_REPOSITORY(错误)——仓库名称中任意位置包含大写字母。
  • UNPINNED(错误)——既没有标签,也没有摘要,因此该引用会解析为可变的 latest 标签。
  • LATEST_TAG(警告)——标签恰好为 latest,且没有摘要将其固定。
  • MISSING_SOURCE_LABEL(警告)——缺少 org.opencontainers.image.source 标签。
  • MISSING_LICENSE_LABEL(警告)——缺少 org.opencontainers.image.licenses 标签。
  • MISSING_SERVER_NAME_LABEL(错误)——仅当你提供 expected_server_name 时才会检查:缺少 io.modelcontextprotocol.server.name 标签。
  • SERVER_NAME_MISMATCH(错误)——存在该标签,但其值与预期值不同。

结果包含每个镜像解析出的注册表、仓库、标签和摘要,以及对应的问题代码;还包含按镜像输入顺序、再按检查顺序排列的问题平铺列表(附精确消息),以及镜像、错误、警告和无问题镜像的数量。

dockertag 不会联系注册表,也不会拉取镜像:标签由你提供,因此可在推送任何内容之前,在 CI 中使用该审计。格式错误的输入——例如缺少或空的镜像列表、缺少、为空或重复的引用、不是字符串到字符串映射的标签,以及无效的 expected_server_name——会产生验证错误并指出出错路径(例如 images[1].labels.custom must be a string),且不会生成部分审计结果。

CLI

npx @reneturcios/dockertag audit --input args.json
npx @reneturcios/dockertag --version

args.json 包含完整的参数对象:

{
  "expected_server_name": "io.github.CloudCorpRecords/dockertag",
  "images": [
    {
      "reference": "ghcr.io/cloudcorprecords/dockertag:0.1.0",
      "labels": {
        "org.opencontainers.image.source": "https://github.com/CloudCorpRecords/dockertag",
        "org.opencontainers.image.licenses": "MIT",
        "io.modelcontextprotocol.server.name": "io.github.CloudCorpRecords/dockertag"
      }
    },
    { "reference": "myteam/worker" }
  ]
}

审计结果以 JSON 格式打印:

{
  "images": [
    {
      "reference": "ghcr.io/cloudcorprecords/dockertag:0.1.0",
      "registry": "ghcr.io",
      "repository": "cloudcorprecords/dockertag",
      "tag": "0.1.0",
      "digest": null,
      "findings": []
    },
    {
      "reference": "myteam/worker",
      "registry": "docker.io",
      "repository": "myteam/worker",
      "tag": null,
      "digest": null,
      "findings": ["UNPINNED", "MISSING_SOURCE_LABEL", "MISSING_LICENSE_LABEL", "MISSING_SERVER_NAME_LABEL"]
    }
  ],
  "findings": [
    {
      "reference": "myteam/worker",
      "code": "UNPINNED",
      "severity": "error",
      "message": "no tag or digest: the reference resolves to the mutable latest tag"
    }
  ],
  "counts": { "images": 2, "errors": 2, "warnings": 2, "clean": 1 }
}

(上方的平铺 findings 列表经过了简略处理;其中每个问题都有一条记录。)退出代码:成功时为 0;运行时错误(包括无法读取或无效的输入文件,或无效输入)时为 1;用法错误时为 2。

MCP 服务

npx -y @reneturcios/dockertag mcp

MCP 客户端配置:

{
  "mcpServers": {
    "dockertag": {
      "command": "npx",
      "args": ["-y", "@reneturcios/dockertag", "mcp"]
    }
  }
}
工具
  • audit_image_tags — 审计容器镜像引用和 OCI 标签:标签固定、小写仓库名称、源代码和许可证标签,以及 MCP Registry 服务器名称标签。

    • images(数组,必需,至少一个)——镜像对象数组,格式为 {reference, labels?};reference 是按原样书写的完整镜像引用,且在集合中唯一;labels 是该镜像的 OCI 标签,采用字符串到字符串映射格式
    • expected_server_name(字符串,可选,非空)——io.modelcontextprotocol.server.name 标签的预期值;仅当提供此参数时,才会运行两项服务器名称检查

    返回 {images, findings, counts}。

Docker

docker run -i ghcr.io/cloudcorprecords/dockertag
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/dockertag audit --input /w/args.json

开发

npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (pure local, no network)
npm run dev     # run the CLI from source

许可证

MIT — 版权所有 (c) 2026 Rene Turcios

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。