mcpField
D
dockertag

dockertag

ローカル
github.com/CloudCorpRecords開発ツール01 週間前に更新

dockertag について

dockertagは、レジストリへの接続やイメージの取得を行わず、コンテナイメージ参照と入力されたOCIラベルを監査します。公開前にタグの固定、リポジトリ名、メタデータ、MCP Registryのサーバー名ラベルを確認するメンテナーやCIワークフロー向けです。

主な機能

  1. 01イメージ参照の解析
  2. 02タグとダイジェストの固定確認
  3. 03大文字のリポジトリ名の検出
  4. 04ソースとライセンスラベルの確認
  5. 05MCPサーバー名ラベルの検証

活用シーン

  1. 01公開前のイメージ参照の監査
  2. 02CIでのOCIメタデータ確認
  3. 03MCP 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はい監査するイメージ参照(1 つ以上)
expected_server_namestringいいえio.modelcontextprotocol.server.name ラベルの期待値(任意)

詳細

dockertag

イメージ参照は、よく見るまでは固定されているように見えます。 タグを付けずに repo と書くと、暗黙のうちに repo:latest を意味します。 latest 自体も変わり続けます。リポジトリ名に大文字が含まれていると、 小文字を必須とするレジストリへのプッシュに失敗します。また、 公開済みのイメージに、ソースの場所やライセンス、さらに MCP サーバーの場合は、MCP Registry がイメージを掲載する前に確認する サーバー名ラベルが欠けていることもあります。dockertag はその中間を 取ります。参照と見つかったラベルを渡すと、監査結果が返されます。

すべての参照は、同じ慎重な方法で解析されます。ダイジェストは 最後の @ 以降のすべてです。タグがあるのは、最後のパス要素に : が含まれる場合だけです。そのため、localhost:5000 のコロンは ポートを表し、タグではありません。タグは、その要素で最後に現れる : の後の文字列です。レジストリは、. または : を含むか、 localhost と完全に一致する場合は最初の要素です。それ以外の場合、 レジストリは docker.io で、パス全体がリポジトリになります。

解析した参照と指定されたラベルに対して、次の 9 件のチェックが 固定順で実行されます。

  • INVALID_REFERENCE(エラー) — 名前部分が空、リポジトリが空、 または指定されたタグが空です。このイメージに対する以降の チェックは実行されず、解析されたフィールドは null になります。
  • INVALID_DIGEST(エラー) — ダイジェストが sha256: の後に 64 個の小文字の 16 進数が続く形式ではありません。
  • 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 リストは省略形です。検出結果ごとに 1 件の項目が含まれます。)終了コード:成功時は 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(配列、必須、1 件以上) — {reference, labels?} オブジェクト としてのイメージ。reference は記述どおりの完全なイメージ参照で、 セット内で一意です。labels は文字列から文字列へのマップ形式の イメージの OCI ラベルです。
    • expected_server_name(文字列、省略可能、空でない) — io.modelcontextprotocol.server.name ラベルの期待値です。 この値を指定した場合にのみ、サーバー名に関する 2 件のチェックが 実行されます。

    {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 — Copyright (c) 2026 Rene Turcios

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。