現役のITエンジニアが、 システム開発の現場で求められる知識を発信
記事検索
公開

生成AIのSkillsに同梱するPythonスクリプトの便利な書き方

生成AI関連

はじめに

Claude CodeやCodexといった生成AIエージェントのSkillに、補助用のPythonスクリプトを同梱して利用する場面が増えてきました。Skillsそのものについては、過去記事で仕組みと使い方を整理しています。

生成AI関連
生成AIのSkillsとは?仕組み・MCPやカスタム指示との違い・デモまで

Skillにスクリプトを配置すること自体は容易ですが、外部ライブラリを利用するスクリプトを扱う場合は、依存関係の置き場所に悩むことがあります。pyproject.toml を同梱する、Skill専用のvenvを用意する、グローバル環境にインストールする、といった方法が考えられますが、いずれの場合も「実行前にこの準備を行うこと」「このvenvを使用すること」といった前提条件をエージェント向けに記述する必要が生じます。その結果、SKILL.md の説明文が長くなり、Skillの保守性が低下します。
本記事では、この課題に対するアプローチのひとつとして、Pythonのインラインメタデータ仕様であるPEP 723をSkillの中で利用した事例を紹介します。常に最適な選択肢というわけではありませんが、Skill同梱スクリプトとの相性は良好で、検討に値する書き方であると考えています。

依存関係の管理方法と課題の整理

Skillに同梱するPythonスクリプトが外部ライブラリを利用する場合、依存関係を管理する方法には複数の選択肢があります。代表的な方法と、それぞれの課題を整理します。

方法 課題
Skillディレクトリ内に venv を作成 venvの構築・有効化手順を SKILL.md に記述する必要があり、Skillの可搬性も低下する
pyproject.toml を同梱 事前の uv sync.venv の所在を SKILL.md でエージェントに指示する必要がある
グローバル環境にインストール 実行環境への依存が強くなり、マシン間で挙動が変動する
実行コマンド側に依存を記述 エージェントへ渡す実行コマンドが長くなり、指示の誤りや記述漏れが生じやすい

いずれの方法でも動作はしますが、Skillはエージェントが必要に応じて呼び出して活用する仕組みであるため、前提となる準備手順はできる限り減らすことが望まれます。SKILL.md の記述量が増えることは、Skillの保守性の観点からも避けたい点です。
加えて、エージェントに対する指示は、複雑になるほど忠実に守られる保証が弱くなります。venvの有効化や事前の uv sync といった手順を SKILL.md に記述しても、エージェントが手順の一部を省略してしまえば、依存関係が解決されないまま実行され、Skillが本来の役割を果たせなくなる可能性があります。SKILL.md をできる限り簡潔に保つことは、Skillの動作の安定性にも直結します。
そこで検討対象としたのが、近年Pythonコミュニティで利用が広がっているPEP 723です。

PEP 723 の概要

PEP 723 は、Pythonスクリプトの先頭に実行時メタデータをインラインで記述するための仕様です(PEP 723 – Inline script metadata)。
書き方は単純で、Pythonファイル先頭に次のようなコメントブロックを記述します。

Inline script metadata

# /// script
# requires-python = ">=3.13"
# dependencies = [
#   "openpyxl>=3.1.5"
# ]
# ///

~以降はpythonの本文を記載~

# /// script から # /// までのブロックがメタデータです。uv などのツールがこのブロックを読み取り、必要なバージョンのPythonと依存パッケージを揃えた上でスクリプトを実行します。
uv を利用する場合、PEP 723 メタデータを含むスクリプトは次のように実行します。

bash

uv run --script inline_sample.py

–script を付けることで、uv がインラインメタデータを解析する「スクリプト実行モード」で動作します。事前の uv syncuv add は不要で、依存パッケージは初回実行時に自動的に解決されます。
この方式の特徴は、依存関係の宣言がスクリプト自身に閉じている点です。pyproject.tomlrequirements.txt、別ディレクトリの .venv を参照する必要がなく、Skill同梱スクリプトの用途と相性が良い構造です。
なお、uv には uv run –with openpyxl script.py のように実行時に依存を追加するオプションもあります。一時的な検証用途には有用ですが、Skillに同梱する場合は次の点がデメリットとなります。

  • 依存関係が実行コマンド側に露出し、SKILL.md の記述に依存ライブラリ名が現れてしまう
  • スクリプトの依存ライブラリを変更した際に、SKILL.md の実行コマンドも合わせて修正する必要があり、スクリプトと SKILL.md の二重管理が発生する

これらを避けるため、本記事ではスクリプト内に依存関係を閉じ込められるPEP 723を採用しています。Agent Skillsのドキュメントでも、Skillに同梱するスクリプトの設計指針としてSelf-contained scriptsが紹介されており、その実装方法の一例としてPEP 723が挙げられています。

When you need reusable logic, bundle a script in scripts/ that declares its own dependencies inline. The agent can run the script with a single command — no separate manifest file or install step required.

「依存関係をスクリプト内に宣言し、別途のマニフェストやインストール手順なしに1コマンドで実行できる」という方針は、PEP 723 と uv run の組み合わせで実現できる構成と一致しています。uv の公式ドキュメントにも、同様の趣旨の説明があります。

The inline metadata format allows the dependencies for a script to be declared in the script itself.
(中略)
uv will automatically create an environment with the dependencies necessary to run the script

スクリプト自身に依存関係を宣言でき、uv が必要な環境を自動的に構築するため、利用者やエージェントが仮想環境を意識的に管理する必要がない、という構造です。
なお、PEP 723 メタデータの解決をサポートするツールは uv だけではなく、pipx でも実行可能です。本記事では uv を前提に解説しますが、利用可能なツールに合わせて選択できます。
また、uv run で解決された依存パッケージは、プロジェクトディレクトリではなく uv のキャッシュディレクトリ(Linux/ で $HOME/.cache/uv)に配置されます。複数のSkillから同じパッケージが参照される場合もキャッシュが再利用されるため、初回以降の起動は高速です。
業界標準として確立しているわけではありませんが、Skill同梱スクリプトを扱う際の選択肢として把握しておく価値はあると考えています。

デモ:PEP 723を使ったSkillを作成して実行する

実際にPEP 723を利用してSkillを構成し、動作を確認します。
本記事ではサンプルとして、Excelファイル(.xlsx)の内容を読み取って表示するSkill pep-723-demo を作成します。シートを順に走査し、内容をタブ区切りで標準出力に表示するシンプルなスクリプトを同梱し、依存ライブラリの openpyxl をPEP 723メタデータで宣言します。
なお、本記事では Claude Code を利用しますが、Skillsの仕組みは Codex CLI や Gemini CLI でも共通しており、Skillの配置先ディレクトリ(Claude Codeでは .claude/skills/、Codexでは .codex/skills/、Gemini CLIでは .gemini/skills/ もしくは .agents/skills/)を変えるだけで、同じSkillをそれぞれのエージェントから利用できます。

ディレクトリ構成

ファイルは2点のみです。

text

.claude/skills/pep-723-demo/
├── SKILL.md
└── scripts/
    └── show_excel.py

pyproject.toml.venv は配置せず、依存関係は show_excel.py の中に記述します。

今回作成したスクリプト

scripts/show_excel.py の内容は次のとおりです。

show_excel.py

# /// script
# requires-python = ">=3.13"
# dependencies = [
#   "openpyxl>=3.1.5"
# ]
# ///

"""Print the contents of an Excel workbook."""

from __future__ import annotations

import sys
from pathlib import Path

from openpyxl import load_workbook


def main() -> int:
    if len(sys.argv) != 2:
        print("usage: show_excel.py workbook.xlsx", file=sys.stderr)
        return 2

    workbook_path = Path(sys.argv[1])
    workbook = load_workbook(workbook_path, data_only=True)

    for sheet in workbook.worksheets:
        print(f"# {sheet.title}")
        for row in sheet.iter_rows(values_only=True):
            print("\t".join("" if value is None else str(value) for value in row))

    return 0


if __name__ == "__main__":
    raise SystemExit(main())

Skillから呼び出される利用形態を想定し、非対話的に動作する構成としています。

SKILL.md

SKILL.md 側の記述は最小限に留めています。

SKILL.md

---
name: pep-723-demo
description: Excel ファイル(.xlsx)の内容を表示する必要があるときに使う。
---

# PEP 723 Excel Script

## 概要

Excel ファイルの内容を表示します。

依存関係はスクリプト内に書いてあります。

`uv run --script` で実行します。

## 使い方

第1引数に Excel ファイルを指定します。

```bash
uv run --script scripts/show_excel.py path/to/workbook.xlsx
```

`uv add` は不要です。
`openpyxl` は `show_excel.py` の metadata から解決されます。

uv sync の手順、専用venv、グローバル環境に関する注意書きは記載していません。Skillの説明は実行コマンド1行のみで完結しています。

動作確認

Excelファイルを用意し、Claude Codeにスキルを指定して、「xxディレクトリ内にあるExcelを読み取って簡単に説明してください」と依頼します。結果、SKILL.md に記載された手順に従って uv run –script でスクリプトを実行しました。

Claude CodeがSkillを使ってExcelを読み取り、内容を要約している様子

Claude Codeが `pep-723-demo` Skillを起動し、`uv run –script` で `show_excel.py` を呼び出してExcelの内容を読み取り、シート構成や設問内容を要約している様子(エクセルはダミーデータを使用)

※ 本記事で読み込ませているExcelは生成AIで作成したダミーデータ(架空の従業員エンゲージメント調査)であり、実在の組織・個人の情報は含まれていません。

初回実行時は uv がメタデータを読み取り、必要なPythonと openpyxl を解決するため若干の時間を要しますが、2回目以降はキャッシュが効くため十分な速度で起動します。
利用者から見ると、エージェントに依頼するだけで結果が得られています。事前の uv sync やvenvの有効化、グローバル環境へのインストールはいずれも不要です。

利用してみての評価

実際に運用して感じた利点と留意点を整理します。

利点

観点 内容
依存関係の場所 スクリプト内で完結し、依存定義の所在が明確
事前準備 uv run –script のみで動作し、追加の手順が不要
SKILL.md の記述量 実行コマンドのみで完結し、説明が簡潔になる
Skillの可搬性 ディレクトリ単位でコピーするだけで他環境でも動作する
実行環境への影響 グローバル環境や既存のvenvに影響を与えない

特に意義が大きいと感じているのは、次の2点です。

実行環境への影響がない点
依存パッケージは uv のキャッシュディレクトリに隔離されるため、グローバル環境や既存のvenvを変更することなくSkillを実行できます。Skillを試験的に導入する場合や、複数のSkillを並行して利用する場合でも、環境を汚さずに済みます。

SKILL.md を簡潔に保てる点
Skillsは段階的に読み込まれる仕組みですが、SKILL.md 本文はコンテキストを消費するため、説明が短くなるほどエージェントが本来の判断に利用できるトークンが増えます。さらに、SKILL.md の記述が短く明快であるほど、エージェントが手順を取りこぼさずに意図どおりの動作を取りやすくなります。前段で触れたとおり、指示が複雑になるほど忠実に守られる保証は弱くなるため、説明を簡潔に保てることはSkillの動作の安定性に直結します。

留意点

採用前に確認しておきたい点も挙げておきます。

  • 依存関係をスクリプトごとに記述する必要があります。pyproject.toml であれば同一ディレクトリ内の複数ファイルで依存関係を共通化できますが、PEP 723 はスクリプト単位の宣言となるため、同じ依存を複数スクリプトで利用する場合に記述が重複します
  • スクリプト単位で実行環境が構築されるため、依存パッケージが多くなるほど uv のキャッシュ容量が大きくなりやすい傾向があります
  • 実行には uv や pipx といったツールが必要となります。実行環境に未インストールの場合は、別途セットアップ手順を案内する必要があります

いずれも重大な障害となるものではありませんが、導入時には把握しておくことを推奨します。

まとめ

Skillに同梱するPythonスクリプトの依存関係をPEP 723で記述することで、次の状態を実現できました。

  • 依存関係がスクリプト1ファイル内で完結する
  • uv run –script の1コマンドで実行できる
  • SKILL.md は実行コマンドのみで完結する
  • uv等があれば、Skillのディレクトリをコピーするだけで他環境でも動作する

pyproject.toml で厳密に管理したい場面や、複数のスクリプト間で依存関係を共有したい場面では、他の選択肢が適している場合もあります。一方で、Skillに小規模な補助スクリプトを同梱する用途では、PEP 723 と uv run –script の組み合わせは扱いやすい選択肢のひとつだと言えます。
依存関係の管理に課題を感じている場合は、検討対象に加えていただければと思います。

生成AI活用支援サービスのご紹介

Tech Funでは、お客様のフェーズに合わせ、生成AI活用に向けた支援を3つのパックでご提供しています。

  1. 無料診断パック:業務・プロセスの現状を無料で診断し、生成AI活用の可能性をレポートします。
  2. 検証(PoC)パック:診断で有効性が確認された業務を対象に、プロトタイプ構築を支援します。
  3. コンサルティングサービス:生成AI導入戦略の策定から運用体制構築までを包括的に支援します。

生成AIに限らず、Web・業務システム開発やインフラ設計など、技術領域を問わずご相談を承っています。「何から始めれば良いか分からない」という段階でも構いませんので、ぜひお気軽にお問い合わせください。

執筆・編集

Tech Fun Magazine R&Dチーム
Tech Funの生成AI研究に携わるエンジニアが、最新のAIモデル動向やプロンプト設計、実業務への応用手法など、生成AIに特化した知見を執筆・編集しています。
モデル評価や業務シナリオに応じたAI活用設計など、日々のR&D活動で得られる実践的なノウハウをわかりやすく紹介します。

ARTICLE
生成AI関連記事一覧

生成AI関連

生成AIのSkillsに同梱するPythonスクリプトの便利…

生成AI関連

Windowsで始めるCodexアプリ入門

生成AI関連

Claude DesignとClaude Codeを連携する…

生成AI関連

ChatGPT Workspace Agentsの実務活用例…

生成AI関連

ChatGPT Workspace Agentsとは?チーム…

生成AI関連

Claude Designとは?対話しながらデザイン・プロト…

生成AI関連

AI時代の設計書の在り方を考える

生成AI関連

生成AIのバッチAPIとは

生成AI関連

生成AIにどこまで業務情報を入れてよいのか?

記事一覧を見る