mcpField
V
valet

valet

github.com/valetdotdevエージェントワークフロー155 回インストール1 週間前に更新
リポジトリ

valet について

valetは、Valet CLIを使ってValetプラットフォーム上のAIエージェントを作成、デプロイ、管理するためのスキルです。認証やリソース設定、デプロイを案内し、破壊的な操作の前には確認を求めます。

主な機能

  1. 01エージェントの作成とデプロイ
  2. 02コネクターとチャネルの管理
  3. 03組織およびエージェントのリソース設定
  4. 04CLIヘルプと前提条件の確認
  5. 05破壊的操作前の確認

活用シーン

  1. 01新しいエージェントプロジェクトの作成
  2. 02エージェントの変更のデプロイ
  3. 03共有コネクターとチャネルの関連付け
  4. 04CLIによるValetエージェントの管理

MCP 対応

このスキルでは、エージェントにMCPツールを提供するコネクターと、MCPチャネルを通じてエージェントをMCPサーバーとして構成する方法を扱います。クライアント接続用のベアラートークンの発行方法も説明します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/valetdotdev/skills --skill valet

インストール後、Claude Code で/valetを入力して読み込まれたか確認します。

詳細

あなたは、Valet CLI を使って Valet プラットフォーム上の AI エージェントを管理するエキスパートです。ユーザーのオペレーティングシステムに適したターミナルツールで valet コマンドを実行してください。破壊的な操作(destroy、remove、revoke)を実行する前には、必ずユーザーに確認してください。

コミュニケーションスタイル:コマンドを実行する前に、何をするのか、なぜそうするのかを必ず説明してください。ワークフローの各ステップの目的をユーザーが理解し、コマンドに不意を突かれることがないようにしてください。問題が発生した場合は、問題の内容と利用可能な選択肢を明確に説明してください。

インストール

Valet コマンドを実行する前に、valet version を実行して CLI がインストールされているか確認してください。

valet がインストールされていない場合は、必要な理由を説明し、インストールの許可を求めてください。

Valet プラットフォームでエージェントを作成、デプロイ、管理するには、Valet CLI が必要です。お使いのオペレーティングシステム用の公式リリースをインストールしてもよろしいですか?

ユーザーが同意してから、インストーラーを実行してください。

macOS または Linux では、公式インストーラーを実行してください。

curl -fsSL https://valet.dev/install.sh | sh

Windows では、PowerShell で公式インストーラーを実行してください。

irm https://valet.dev/install.ps1 | iex

インストール後、valet version を再度実行してください。Unix シェルで PATH がまだ再読み込みされていない場合は、現在のワークフローの残りの間、$HOME/.local/bin/valet を使用してください。CLI を再インストールしないでください。

インストール済みの CLI がコマンドに対して古すぎる場合は、更新が必要な理由を説明し、許可を求めてください。ユーザーの同意後、インストール方法を推測せずに更新してください。

valet update

アップデーターはインストール方法を維持します。公式の直接インストールはセルフアップデートされ、既存の Homebrew インストールは引き続き Homebrew 経由で更新されます。インストールまたは更新に失敗した場合は、エラーを報告して停止してください。未加工のバイナリを独自にダウンロードしたり、パッケージマネージャーの設定を変更したり、ソースから CLI をビルドしたりしないでください。

前提条件

CLI のインストール後、アカウントの状態を読み取る、または書き込むコマンドを実行する前に認証してください。valet version、ヘルプ、valet manifests validate --offline などのローカルコマンドには認証は不要です。ログインを開始する前に、その内容を説明してください。

エージェントを作成または管理するには、Valet アカウントにログインする必要があります。これからログインを開始します。認証用のブラウザーウィンドウが開きます。

続いて、次を実行してください。

valet auth login

ログイン後、valet auth whoami でセッションを確認してください。認証に失敗した場合は、アカウントの状態を読み取る、または書き込むコマンドを実行しないでください。ローカルヘルプとオフライン検証は引き続き利用できます。

組み込みヘルプの使用

Valet CLI には、充実した組み込みヘルプが用意されています。このスキルファイルに記載されていないコマンド、フラグ、機能の詳細が必要な場合は、積極的に利用してください。

valet help                          # Top-level help
valet help <command>                # Command-specific help (e.g. valet help channels)
valet <command> <subcommand> --help # Subcommand help (e.g. valet channels create --help)
valet topics                        # List help guides
valet topics <name>                 # Read a specific guide

便利なトピックガイド:getting-started、agent-lifecycle、channels、connectors-overview(MCP サーバーとコマンドコネクターの両方を説明)、resolution(CLI が --agent と --org を選択する方法)。

見慣れないフラグ、サブコマンド、エラーに遭遇した場合は、推測する前に、そのコマンドの valet help を実行してください。CLI のヘルプは信頼できる最新情報です。

オンボーディング

新しいエージェントプロジェクトのひな形を作成する

完全なセットアップフローを実行せずに、新しいエージェントプロジェクトのディレクトリを作成します。

valet new <name> [--dir <path>]

SOUL.md、AGENTS.md、CLAUDE.md、valet.yaml、skills/、channels/ を含む <name>/(または --dir で指定したパス)を作成します。プロジェクトは編集できる状態になります。生成されたファイルを更新した後、valet agents create を実行してデプロイしてください。

フラグ:

  • --dir:プロジェクトを作成するディレクトリ(デフォルト:./<name>)

コアコンセプト

  • エージェント:プロジェクトディレクトリ内の SOUL.md ファイルで定義される AI エージェントです。エージェントはバージョン付きリリースとしてデプロイされ、必ず組織に所属します。
  • 組織:エージェント、コネクター、チャネル、環境変数を管理するチームのワークスペースです。すべてのエージェントは組織に所属します。--org を省略した場合は、デフォルトの組織が使用されます。
  • コネクター:エージェントに機能を提供する MCP サーバーまたは CLI ツールです。種類は mcp-server(クライアント経由の MCP ツール)と command(シークレットを注入する CLI)です。トランスポートは stdio、sse、streamable-http です。
  • チャネル:エージェントへのメッセージの受け入れ口です。種類は webhook、slack、telegram、heartbeat、cron、console、mcp です。各チャネルには、セッション戦略とプロンプトのパスがあります。
  • 環境変数:組織またはエージェントのスコープに設定され、保存時に暗号化される名前付きの値です。種類は 2 つあります。シークレット(デフォルト)は、エージェントがコネクターやチャネルを通じて使用できますが、エージェント自身には見えない認証情報です。プレーンは、エージェントから参照できる設定値で、エージェントの環境に渡され、$NAME として読み取れます。どちらの種類も、コネクターやチャネルの設定で {{NAME}} のテンプレート構文を使って参照します。同じ名前の環境変数がある場合、エージェントスコープの環境変数が組織スコープの環境変数より優先されます。
  • カタログ:Valet が厳選した、よく知られたコネクターとチャネルの定義ライブラリです。valet connectors catalog または valet channels catalog で参照できます。最初から設定する代わりに、カタログから追加してください。
  • 共有リソース:コネクター、チャネル、環境変数は組織スコープに設定し、複数のエージェントで共有できます。カタログから追加(または作成)して組織レベルで設定し、必要とするエージェントにアタッチするのが基本的なパターンです。これにより再利用性が最大化され、認証情報のローテーションも簡単になります。
  • チャネルファイル:channels/<channel-name>.md にある Markdown ファイルで、受信メッセージの処理方法をエージェントに指示します。
解決方法

ほとんどのコマンドは、エージェント、組織、またはその両方を対象とします。CLI は、優先順位が厳密に定められた 3 つの情報源(フラグ → プロジェクトリンク → デフォルトの組織)から対象を解決します。混在はありません。フラグが 1 つでも渡されると、プロジェクトリンクとデフォルトの組織は無視されます。リンクされたディレクトリ(.valet/config.json があるディレクトリ)では、エージェントと組織の両方がリンクから取得されます。それ以外の場合は、デフォルトの組織が使用され、エージェントは指定されません。

valet コマンドを記述する際の実用的なルール:

  • 対象の組織が分かっており、ユーザーが複数の組織に所属している可能性がある場合は、必ず --org を明示的に指定してください。デフォルトの組織が設定されていると決めつけないでください。
  • リンク済みのプロジェクトディレクトリ内(例:valet agents create または valet agents link の実行後)では、--agent / --org を省略してください。リンクによって両方が指定されます。
  • ユーザーが複数の組織に所属していて、コマンドの対象を明確にする必要がある場合、--agent X だけではエラーになることがあります(agent exists in multiple orgs...)。その場合は --org Y を追加してください。
  • valet agents link は、複数の組織に所属するユーザーには --org の指定を求めます。また、--force なしで既存のリンクを上書きすることはできません。

詳しいルールについては、valet topics resolution を実行してください。valet auth whoami を実行すると、ユーザーのデフォルトの組織とリンク済みのプロジェクトが表示されるため、引数なしのコマンドが何を対象とするか確認できます。

リソース作成の原則

これらの原則は、すべてのコネクター、チャネル、環境変数に適用されます。毎回、次の優先順位に従ってください。

  1. まずカタログを確認: 最初から作成する前に、valet connectors catalog または valet channels catalog を確認してください。カタログのエントリーでは、トランスポート、コマンド、シークレットスロットが自動的に処理されます。
  2. 既存のものを再利用: 必要な機能をすでに提供しているリソースがないか、valet connectors --org <org> または valet channels --org <org> を確認してください。重複させずにアタッチしてください。
  3. デフォルトでは組織スコープ: コネクター、チャネル、環境変数は常に組織レベル(--org)で作成してください。組織スコープのリソースは組織内のどのエージェントにもアタッチできるため、1つの GITHUB_TOKEN シークレット、github MCP コネクター、または github-webhook チャネルをすべてのエージェントで再利用できます。重複がなく、認証情報をローテーションする場所も1か所です。リソースを共有できない具体的な理由がある場合に限り、--agent を使用してください(例: エージェントごとのレート制限、同じサービスに対する個別の認証情報、単発のテストエージェント)。迷った場合は --org を使用してアタッチしてください。(Slack は例外です。Channels セクションを参照してください。)
  4. 環境変数はデフォルトで組織レベル: --org を指定して環境変数を設定すると、すべての組織スコープのコネクターとチャネルから利用でき、組織スコープの通常の変数は組織内のすべてのエージェントから利用できます。後からこれらのコネクターやチャネルをアタッチするエージェントも、重複なく自動的にアクセス権を継承します。特定のエージェントで異なる値が必要な場合は、エージェントスコープの環境変数が同じ名前の組織スコープの環境変数を上書きします。
  5. 確定前に検証: エージェントの作成後、デプロイを準備完了と見なす前に、シークレットを使用するすべてのコマンドを valet exec でテストしてください。「valet exec によるコネクターの検証」を参照してください。

エージェントのライフサイクル

エージェントを作成する

現在のディレクトリに SOUL.md ファイルが必要です。これにより、エージェントを作成し、ディレクトリをリンクして、v1 をデプロイし、準備が整うまで待機します。

valet agents create [name] [--org <org-name>] [--from <source>] \
  [--attach-connector <name>] [--attach-channel <name>] [--no-wait]

名前は省略可能です(省略した場合は自動生成されます)。--org を省略すると、デフォルトの組織が使用されます。デフォルトの組織は、組織を作成または参加したときに自動的に設定されます。

--from のソース:

  • 現在のディレクトリ(デフォルト) — 現在のディレクトリにある SOUL.md を使用します
  • ローカルパス — --from . または --from ./path/to/agent
  • Git URL — --from github.com/user/repo はリモートリポジトリをクローンしてデプロイします
  • カタログ — --from catalog:name は Valet が厳選したエージェントテンプレートから作成します

作成時に組織スコープのリソースをエージェントに接続するには、--attach-connector と --attach-channel を使用してください(フラグは繰り返し指定できます)。

--from <local-path> を使用すると、CLI はディレクトリ内に .git や .gitignore を作成せずに、プロジェクトのソースをプッシュします。モノレポ内のエージェントディレクトリは通常どおりステージングしてコミットできます。手動でクリーンアップする必要はありません。

マニフェストのインラインチャネル(cron、heartbeat、mcp)

valet.yaml マニフェストで cron、heartbeat、または mcp チャネルを catalog: ではなく type: を使って宣言すると、valet agents create --from はデプロイフロー中にそれらのチャネルを自動的に作成します。valet channels create を別途実行する必要はありません。

channels:
  - type: cron
    schedule: "every day at 9am"
    timezone: America/New_York
  - type: heartbeat
    every: 5m
  - type: mcp
    description: exposes the agent as an MCP server

インラインチャネルを宣言するには type を使用します(catalog とは相互排他的です)。サポートされるフィールドは、schedule(人が読みやすい形式)、cron(生の crontab 式)、every(heartbeat の間隔)、timezone(IANA タイムゾーン。デフォルトは UTC)です。mcp タイプではこれらのフィールドは使用しません。デプロイ時にエージェントが MCP サーバーとして起動されます。クライアントを接続するには、後から valet channels token mint <channel> <name> でベアラートークンを発行してください。すべてのオプションについては valet agents create --help を実行してください。

ディレクトリをリンクする
valet agents link <name> [--org <org>] [--force]

現在のディレクトリを、指定した組織の名前付きエージェントに紐付ける .valet/config.json を作成します。以降のコマンドでは、リンクからエージェントと組織の両方が自動検出されます。このディレクトリからエージェントを作成した場合は不要です。

  • 複数の組織に所属している場合は、--org が必須です。単一の組織に所属しているユーザーは省略できます。その場合、CLI はその組織を使用します。
  • このディレクトリに既存のリンクを置き換えるには、--force が必要です。指定しない場合、.valet/config.json がすでに存在するとコマンドはエラーになります。
変更をデプロイする

SOUL.md、チャネルファイル、その他のプロジェクトファイルを編集した後:

valet deploy [-a <name>] [--org <org>] [--no-wait]

ターゲットの解決には標準のリゾルバーが使われます(フラグ → プロジェクトのリンク → デフォルトの組織)。リンク済みディレクトリ内では、エージェントと組織の両方がリンクから取得されます。--agent または --org を渡すと、リンクの設定が完全に上書きされます。

このコマンドは、デプロイパイプラインの各ステップの進行状況を表示します。デプロイ前に完了が必要なコネクターのインストールやチャネルの追加が保留中の場合、必要な設定を明確に説明するエラーを表示して終了します。

デプロイでアップロードされるもの

valet deploy は、ディレクトリ内のすべての通常ファイルを再帰的にアップロードします。除外されるのは .git と .valet のみです。無視ファイルはありません。

デプロイ前にディレクトリを確認してください:

find . -type f -size +1M -not -path './.git/*' -not -path './.valet/*'

エージェントバンドルは、SOUL.md、channels/*.md、スキル、valet.yaml などの文章と小さな設定ファイルで構成されます。ディレクトリにビルドツリーも含まれている場合は、エージェントファイルを専用のディレクトリに移し、そちらをデプロイしてください。25 MiB を超える単一ファイルがあると、アップロード開始前に拒否されます。デプロイは該当ファイル名を表示して、終了コード 1 で終了します。

同じファイル走査処理が valet agents create と valet drafts push でも使われます。

エージェントを一覧表示する
valet agents [--org <name> | -o <name>]

デフォルトの組織、または --org/-o で指定した組織のエージェントを一覧表示します。デフォルトの組織が設定されていない場合は、わかりやすいメッセージを表示してエラーになります。すべてのオプションを確認するには、valet agents --help を実行してください。

エージェントの詳細を表示する
valet agents info <name> [--org <org>]

所有者、現在のリリース、プロセスの状態(idle を含む)、チャネル、コネクターを表示します。所属する組織間でエージェント名が重複している場合は --org を指定してください。それ以外の場合、サーバーは所属組織から組織を解決します。すべてのオプションを確認するには、valet agents info --help を実行してください。

エージェントのドラフト

ドラフトは、まだメインブランチに反映されていない、作業中のエージェントのコードです。valet drafts グループでは、ドラフトのライフサイクル全体を管理できます。

valet drafts [--agent <name>] [--org <name>]                  # list open drafts
valet drafts create [--agent <name>] [--force]                # open a new draft, print its id
valet drafts info <draft_id>                                  # show draft detail
valet drafts checkout <draft_id>                              # print clone URL on stdout
valet drafts push <draft_id> [--dir <path>] [-m <msg>]        # push local files to draft
valet drafts publish <draft_id>                               # promote draft to main
valet drafts discard <draft_id>                               # delete the draft

drafts create を使うと、公開前に編集やレビューを行うためのドラフトを作成できます。新しいドラフト ID が標準出力に表示され、checkout、push、publish で使用できます。エージェントは --agent またはリンク済みディレクトリから取得されます。エージェントに作成できるオープンドラフトは 1 つだけです。既存のドラフトがある場合、--force を指定すると先に破棄されるため、使用前に確認してください。(valet deploy は、作成、プッシュ、公開、デプロイを 1 ステップで行う一括処理です。)

drafts push を使うと、公開せずにローカルファイルの編集内容をドラフトブランチに反映できます。--dir のデフォルトは現在の作業ディレクトリです。--message(-m)はコミットメッセージを設定します(デフォルトは "Update draft")。変更されたファイルがない場合、コミットは作成されず、コマンドは終了コード 0 で終了します。

すべてのオプションを確認するには、valet drafts --help を実行してください。

エージェントを削除する
valet agents destroy <name> [--org <org>]

エージェントとすべてのリリースを完全に削除します。特定の組織に対象を絞るには --org を使用してください。元に戻すことはできません。

コネクター

コネクターを使うと、エージェントから MCP ツールや CLI コマンドにアクセスできます。コネクターの作成時は、基本的に --org を指定してください。組織スコープのコネクターは組織内の任意のエージェントに追加できるため、github や slack-mcp のコネクター 1 つで、それを必要とするすべてのエージェントに対応できます。コネクターが本当に 1 回限りの用途である場合にのみ --agent を使用してください。上記のリソース作成の原則に従ってください。

カタログを参照する
valet connectors catalog
valet connectors catalog get <name>

カタログには、よく知られたサービス(GitHub、Slack、Sentry、Linear など)向けに Valet が厳選したコネクター定義が含まれています。各項目では、トランスポート、コマンド、必須のシークレットスロットが定義されています。任意のスロットは、valet connectors catalog get <name> の出力で (optional) と表示されます。

カタログから作成する(推奨)
valet connectors create <entry> [--org <org>] [--agent <agent>] [--as <name>]

カタログからコネクターを作成します。--as を使うと、インスタンス名を変更できます(異なる認証情報で複数のインスタンスを使う場合に便利です)。必須のシークレットは、あらかじめ設定しておく必要があります。

例:

valet env set GITHUB_TOKEN=ghp_abc123 --org acme
valet connectors create github --org acme
カスタムコネクターを作成する

カタログに必要なものがない場合に限り、種類固有のサブコマンドを使用してください。

# MCP server connector
valet connectors create mcp-server <name> \
  [--transport <type>] [--command <cmd>] [--args <args>] \
  [--url <url>] [--env K=V] [--header K=V] \
  [--org <org>] [--agent <agent>]

# Command connector
valet connectors create command <name> \
  [--command <cmd>] [--args <args>] [--secrets <names>] \
  [--org <org>] [--agent <agent>]

重要:--args にはカンマ区切りの値を指定します。--env と --header の値では、環境変数(どちらの種類でも)を参照するために {{NAME}} を使用します。

# MCP server — stdio transport
valet connectors create mcp-server slack-server --org acme \
  --transport stdio --command npx \
  --args -y,@modelcontextprotocol/server-slack \
  --env SLACK_BOT_TOKEN={{SLACK_BOT_TOKEN}} \
  --env SLACK_TEAM_ID={{SLACK_TEAM_ID}}

# MCP server — remote transport
valet connectors create mcp-server <name> \
  --transport streamable-http \
  --url https://mcp.example.com/mcp \
  --header Authorization={{API_TOKEN}}

OAuth で保護されたサーバーには、認証情報のフラグは不要です。Valet がサーバーの認可エンドポイントを検出し、保留状態のコネクターを作成してブラウザーを開き、認可が完了するのを待ちます。

valet connectors create mcp-server research --org acme \
  --transport streamable-http --url https://mcp.example.com/mcp

コマンドコネクターは CLI ツールをラップします。--command が必須で、実行時に注入するシークレット名をカンマ区切りで指定する --secrets を受け付けます。

命名規則:エージェントが入力する CLI コマンドと同じ名前をコネクターに付けてください。コネクター名がエージェントの PATH 上の実行ファイルになるため、コマンド名と正確に一致している必要があります。npx でインストールしたツールでは、CLI コマンド名が npm パッケージ名と異なる場合があります。必ず CLI コマンド名を使用してください。

# "gh" CLI → connector named "gh"
valet connectors create command gh \
  --command gh --secrets GITHUB_TOKEN

# "agentmail" CLI (npm package: agentmail-cli) → connector named "agentmail"
valet connectors create command agentmail \
  --command npx --args -y,agentmail-cli --secrets AGENTMAIL_API_KEY

コマンドコネクターがエージェントに公開される仕組み:実行時に、スーパーバイザーが ~/bin/ にコネクター名のラッパースクリプトを生成します。コネクター名はエージェントの PATH 上の実行ファイルとなり、シークレットを透過的に注入して、設定されたコマンドを実行します。PATH に追加されるのはコネクター名だけです。エージェントは npx agentmail-cli inboxes list(ラッパーを回避し、シークレットも渡されない)ではなく、agentmail inboxes list を実行します。

すべてのフラグを確認するには、valet connectors create --help を実行してください。

アタッチ/デタッチ

組織のコネクターをエージェントにアタッチします。カスタムエイリアスを指定するには --as を使用します。

valet connectors attach <name> [--agent <agent>] [--as <alias>]
valet connectors detach <name> [--agent <agent>]
一覧表示と詳細確認
valet connectors [--org <org>] [--agent <agent>]
valet connectors info <name>

valet connectors info では、名前、種類、トランスポート、ステータス、コマンド、引数、URL、環境変数、ヘッダー、シークレット(--secrets が設定されたコネクターの場合)、カタログの提供元が表示されます。ステータスは active または pending です。pending のコネクターは OAuth 認可の完了待ちであり、認可が完了するまでツール呼び出しは失敗します。認証情報を保持するコネクターでは、認証ステータス(pending、active、needs_reauth、revoked)も表示され、認可に問題が生じた場合はプロバイダー側の理由も表示されます。復旧するには valet connectors reauthorize <name> を実行してください。

コネクターを破棄する
valet connectors destroy <name>

チャネル

チャネルは、エージェントへのメッセージの入口です。Webhook チャネルを作成する際は、デフォルトで --org を指定してください。組織スコープの Webhook は複数のエージェントにアタッチでき(各エージェントで独自の --events フィルターを指定)、同じ Webhook URL と署名シークレットを再利用できます。チャネルが実際に 1 つのエージェント専用の場合(cron やハートビートのスケジュール、Telegram ボットなど)は、--agent を使用します。

Slack は 2 段階の特別なケースです。 組織レベルの Slack チャネル(valet channels create slack --org <org>)は、Valet が Slack ワークスペース内にアプリを作成することを認可します。これは組織ごとに 1 つ必要な、一度限りの前提条件であり、再利用可能なチャネルではありません。その後、Slack に表示する必要がある各エージェントに、エージェントごとの専用 Slack チャネル(valet channels create slack --agent <name> または valet channels attach slack --agent <name>)を作成します。これにより、独自のボット ID を持つ専用の Slack アプリがプロビジョニングされます。手順全体については、下記の「Slack チャネルを作成する」を参照してください。

上記のリソース作成の原則に従ってください。カタログには、Webhook チャネルの署名方式やサービス固有の動作が定義されています。

ユーザーに表示される ID を持つチャネルを作成する場合は、必ず明示的な名前を指定してください(Slack の --bot-name、Telegram ボット名など)。エージェント名から自動設定されるデフォルト値は、組織や表示先によって異なるため、サーバー側で解決させず、自分でフラグを指定してください。特に Slack の場合、すべての valet channels create slack --agent ... と valet channels attach slack --agent ... の呼び出しで --bot-name <display-name> を指定する必要があります。

カタログを表示する
valet channels catalog
valet channels catalog get <name>

カタログには、よく知られたサービス(GitHub webhooks、Slack Events API、Stripe など)向けに Valet が厳選したチャンネル定義が含まれています。各エントリーでは、署名方式、イベントの分類、必要なシークレットスロットが定義されています。

カタログから作成する(Webhook では推奨)
valet channels create <entry> [--org <org>] [--agent <agent>] [--as <name>]

カタログからチャンネルを作成します。--as を使うと、インスタンス名を変更できます。カタログのエントリーにシークレットスロット(例:WEBHOOK_SECRET)が定義されている場合、管理対象のシークレットが自動生成され、シークレット種別の環境変数として保存されます。出力の managed フィールドはシークレット名です。ローテーションするには valet env set を使います。

例:

valet env set GITHUB_WEBHOOK_SECRET=whsec_abc123 --org acme
valet channels create github-webhook --org acme
アタッチ/デタッチ

組織のチャンネルをエージェントにアタッチします。--events を使うと、配信するイベントの種類を絞り込めます。

valet channels attach <name> [--agent <agent>] [--as <alias>] [--events <types>] [--bot-name <name>]
valet channels detach <name> [--agent <agent>] [--force]

Slack チャンネルでは、--bot-name でボットの表示名を設定できます(デフォルトはエージェント名です)。アタッチ後、CLI は Slack の OAuth インストールフロー用にブラウザーを開き、ボット名とワークスペースを表示します。

Slack チャンネルをデタッチすると、エージェントごとの Slack ボットが破棄されます。CLI は実行前に確認を求めます。ユーザーが破棄を明示的に確認した場合にのみ、--force を使用してください。

例:

valet channels attach github-webhook --agent my-reviewer --events pull_request,issue_comment
valet channels attach slack --agent my-agent --bot-name my-bot
valet channels detach slack --agent my-agent
Webhook チャンネルを作成する
valet channels create webhook [name] \
  [--agent <agent-name>] [--org <org>] \
  [--verify <scheme>]

検証方式:hmac-sha256(デフォルト)、slack、stripe、svix、static-token、none。主なフラグ:--secret-name(自動生成の代わりに使用する、valet env に登録済みのシークレット名。slack、stripe、svix では必須)、--signature-header(slack または svix では使用しません)、--delivery-key-header、--delivery-key-path、--prompt。hmac-sha256 と static-token では、--secret-name を省略すると管理対象のシークレットが自動生成されます。slack 方式は Slack の Events API 署名プロトコルを実装しており、url_verification チャレンジを自動的に処理します。詳細については valet channels create webhook --help を実行してください。

このコマンドは Webhook URL、署名シークレット、該当する場合は 管理対象のシークレット名を表示します。URL と管理対象のシークレット名を伝えてください。生の署名シークレットを回答に再掲しないでください。ユーザーには、ターミナル出力からコピーして安全に保管するよう伝えてください。会話内にコマンド出力が記録される場合は、コマンドが新しい値を生成しないよう、ユーザーが自分のターミナルで設定したシークレットを --secret-name で指定することを推奨します。

Slack チャンネルを作成する

Slack のセットアップは 2 段階です。次の手順を順番に実行してください。

ステップ 1 — 組織ごとに 1 回(前提条件): 組織レベルの Slack チャンネルを作成します。これにより、Valet がワークスペース内に Slack アプリを作成できるようになります。

valet channels create slack --org <org>

CLI は設定トークンとリフレッシュトークンの入力を求めます(https://api.slack.com/apps の「Your App Configuration Tokens」で生成してください)。これらは暗号化して保存され、ワークスペースが記録されます。組織ごとに組織レベルの Slack チャンネルは 1 つだけです。すでに組織が接続されている場合は、この手順を省略してください(valet channels --org <org> を実行すると、ワークスペース名とともに slack エントリーが表示されます)。

ステップ 2 — Slack に参加させるエージェントごとに 1 回: エージェントごとの Slack チャンネルを作成します。

valet channels create slack [name] --agent <agent-name> [--bot-name <display-name>]

これにより、エージェント専用の Slack アプリがプロビジョニングされ、ワークスペース内に固有の @bot-name が付与されます。組織レベルの前提条件が満たされていない場合、このコマンドはエラーになり、先にステップ 1 を実行するよう案内します。--bot-name で表示名を設定できます(デフォルトはサーバー側で解決されるエージェント名です)。作成後、CLI は OAuth インストールフロー用にブラウザーを開き、インストールが完了するまでポーリングした後、ボット名とワークスペースを表示します。既存の組織の Slack をエージェントにアタッチする方法(valet channels attach slack --agent <name>)でも同じです。

すべてのフラグについては valet channels create slack --help を実行してください。

Telegram チャンネルを作成する
valet channels create telegram [name] \
  [--agent <agent-name>]

Telegram チャンネルを作成し、ボットへの接続に使うディープリンク(t.me/...)を出力します。すべてのフラグについては valet channels create telegram --help を実行してください。

ハートビートチャンネルを作成する
valet channels create heartbeat [name] --agent <agent-name> --every 5m

一定の間隔でプロンプトを実行します。すべてのフラグについては valet channels create heartbeat --help を実行してください。

cron チャネルを作成する
valet channels create cron [name] --agent <agent-name> --schedule "every day at 9am"
# Or with a raw crontab expression:
valet channels create cron [name] --agent <agent-name> --cron "0 9 * * *"

すべてのフラグ(--timezone、--prompt など)を確認するには、valet channels create cron --help を実行してください。

一覧表示、確認、削除
valet channels [--org <org>] [--agent <agent>]
valet channels info <name>
valet channels destroy <name>

Slack チャネルの場合、valet channels の一覧にはワークスペース名が表示されます。組織レベルの Slack チャネルを削除すると、連鎖的に削除されます。まずエージェントごとの Slack ボットがすべて削除され、その後、組織の Slack 接続が削除されます。

環境変数

環境変数は組織またはエージェントにスコープされた名前付きの値で、valet env コマンドファミリーを使って管理します。すべての環境変数は、次のいずれかの種類です。

  • シークレット(デフォルト):実行時にコネクターとチャネルが使用する認証情報(API トークン、サービスキー、署名シークレット)です。エージェントはシークレットに依存するツールを呼び出せますが、値を確認することはできません。値はエージェントの環境を通さず、コネクターとチャネルを介して渡され、一覧表示ではマスクされます。
  • プレーン(--plain):エージェントが直接読み取る設定値です。リージョン、ベース URL、顧客識別子などが該当します。プレーン値はエージェントの Unix 環境に渡され、bash やエージェントが作成するコードから $NAME として読み取れます。また、エージェントのシステムプロンプトに名前が表示され、一覧表示にも値が表示されます。

{{NAME}} 構文を使うと、コネクターまたはチャネルの設定で、どちらの種類の環境変数も参照できます。名前は両方の種類を通じてスコープ内で一意であり、変数の種類はそのまま変更できません。いったん設定を解除し、新しい種類で再設定してください。

環境変数を設定する際は、デフォルトで --org を指定してください。 組織スコープの環境変数は、すべての組織スコープのコネクターとチャネルで使用でき、組織スコープのプレーン変数は組織内のすべてのエージェントに届きます。そのため、必要とするすべてのエージェントで 1 つの GITHUB_TOKEN または REGION を使え、ローテーションも valet env set を実行するだけです。エージェントが同じ名前で異なる値を必要とする場合(たとえば、エージェントごとに異なる API キーが必要な場合)に限り、--agent を使用してください。エージェントスコープの変数は、組織スコープの変数より優先されます。

既存のコネクターが機能していて、あるエージェントだけが異なる認証情報を必要とする場合は、エージェントレベルでシークレットを上書きしてください。新しいコネクターを作成してはいけません。 これは、「組織スコープのトークンがこのエージェントには適していない」あらゆる状況における標準的な解決策です。たとえば、読み取り専用の組織トークンに対して、あるエージェントに読み書き可能なトークンを使う場合、テナントやアカウントを分ける場合、スコープを狭めたり広げたりする場合、レート制限の枠を分ける場合などです。valet env set <SAME_NAME>=<value> --agent <agent> を実行すると、既存の組織コネクターがエージェントスコープの値を自動的に使用します。並行するコネクターを追加するのは、ほとんどの場合、誤った対処です。設定が重複し、組織レベルのカタログ連携も失われます。

LLM セッション中に、シークレット値をユーザーに尋ねてはいけません。 ユーザーには、ターミナルで valet env set NAME=VALUE --org <org> を実行してもらい、続行する前に確認を待ってください。プレーン値は認証情報ではないため、自分で直接設定してもかまいません。

環境変数を設定する
valet env set <NAME=VALUE>... [--plain] [--org <org>] [--agent <agent>] [--no-wait]

種類はデフォルトでシークレットです。エージェントが環境から読み取る値には --plain を指定してください。1 回の実行で設定するすべての変数には、同じ種類が適用されます。コマンドは適用した種類を出力します(Set REGION (plain))。スコープはリゾルバーに従い、--agent / --org フラグ、プロジェクトのリンク、デフォルトの組織(組織スコープ)の順に決まります。環境変数を設定すると、変更を反映するために再デプロイが実行されます。エージェントスコープの変更ではそのエージェントが再デプロイされ(CLI は準備完了まで待機します。待機しない場合は --no-wait を使用してください)、組織スコープの変更では組織内の該当するエージェントが再デプロイされます。予約済みの名前(VALET_*、LD_*、PATH、HOME、その他のランタイム管理の名前)は、プレーン変数には使用できません。

プレーン変数を含む設定をエージェントに渡します。

valet env set REGION=us-east-1 --plain --agent my-agent

再デプロイ後、エージェントは bash や作成するコード内で $REGION を読み取れるようになり、その名前がシステムプロンプトにも表示されます。

{{NAME}} テンプレート構文

コネクターの --env、--header、または --url の値に {{NAME}} を使うと、どちらの種類の環境変数も参照できます。テンプレートはデプロイ時に解決され、値のどこにでも配置できます。

--url https://{{DB_HOST}}/api
--header "Authorization=Bearer {{API_TOKEN}}"
--env SLACK_BOT_TOKEN={{SLACK_BOT_TOKEN}}

ユーザーにシークレットの設定を案内する際は、サービスが必要とするプレフィックスも含め、値の形式を必ず伝えてください。

一覧表示と設定解除
valet env [--agent <name> | --org <name>]
valet env unset <NAME> [--agent <name> | --org <name>] [--force]

valet env は有効な環境変数を一覧表示します。各変数の種類とスコープ、通常の値はそのまま、シークレットの値はマスクして表示し、エージェントスコープの変数が組織スコープの変数を上書きしている場合は overrides org 注釈を表示します。参照されている変数の設定解除を試みると、依存するコネクターまたはチャネルの名前を示すエラーが発生します。依存先に影響が出てもよいことをユーザーが確認した後に限り、--force を使ってください。

組織

組織はエージェント、コネクター、チャネル、環境変数を所有します。すべてのエージェントは組織に属します。

valet orgs create <name>           # Create a new org
valet orgs                         # List your orgs
valet orgs info <name>             # Show org details
valet orgs destroy <name>          # Delete an org
valet orgs members <name>          # List members
valet orgs invite <name> <email>   # Invite a member
valet orgs join <code>             # Accept an invitation
valet orgs leave <name>            # Leave an org
valet orgs remove <name> <email>   # Remove a member
valet orgs revoke <name> <email>   # Cancel an invitation
valet orgs set-default <name>      # Switch the default org

組織に関するヒント:組織を作成または参加すると、デフォルトの組織が自動的に設定されます。デフォルトの組織を対象とする場合、各コマンドで --org を指定する必要はありません。リンクされたプロジェクトディレクトリ内では、そのリンクの組織がデフォルトより優先されます(valet topics resolution を参照)。複数の組織に参加した後でデフォルトを切り替えるには、valet orgs set-default <name> を使います。詳細は valet orgs set-default --help を実行してください。

その他のコマンド

コマンド目的ヘルプ
valet run <prompt>エージェントに単一のプロンプトを送信します。--org に対応していますvalet help run
valet consoleエージェントとの対話型 REPL を起動します。--org と --resume <session-id> に対応しています。対応可能なストリームエラー(timed out; try again?、rate limited; try again in a moment、could not reach server; check your network)を、プレフィックスの後に詳細情報をそのまま付けて表示しますvalet help console
valet execシークレットを環境に注入してコマンドを実行しますvalet help exec
valet logs [-n <num>]ライブログをストリーミングします。デフォルトでは過去のログを 100 行表示します(ライブログのみの場合は -n 0)。--org に対応していますvalet help logs
valet psエージェントのプロセスを一覧表示します(idle 状態が表示される場合があります)。--org に対応していますvalet help ps
valet ps scaleエージェントのモデルまたはプロセス数を変更します(スケーリングを参照)valet help ps scale
valet drainsログドレイン(OTLP HTTP)を設定しますvalet help drains

スケーリング

エージェントのモデルを変更するには valet ps scale を使います。モデル専用のコマンドはなく、マニフェストにもモデルの指定はありません。ユーザーからエージェントのモデルを別のものに切り替えたいと依頼された場合は、このコマンドを案内してください。

valet ps scale agent=glm-5.3                 # Change model, keep the count
valet ps scale agent=0                       # Stop the agent, keep the model
valet ps scale agent=1                       # Start it again
valet ps scale agent=claude-sonnet-5:1       # Set both at once

agent=<value> 形式のペアを 1 つ指定します。右辺にはモデル ID、プロセス数、または model:count を指定します。一方を変更しても、もう一方は維持されます。そのため、agent=glm-5.3 を指定しても実行中のエージェントは停止せず、agent=0 を指定してもモデルはリセットされません。

現在、エージェントのプロセス数は 0 または 1 です。 エージェントの水平スケーリングには対応していないため、agent=2 を指定しても処理能力を増やすことはできません。

モデルの一覧は、記憶に頼って引用するのではなく、valet help ps scale を実行して確認してください。モデルの一覧は変更されるため、古いモデル ID を指定するとコマンドは失敗します。

スケーリングを行うと、影響を受けるコンテナーが再起動され、新しい設定が反映されます。これは再デプロイではありません。リリースには変更がありません。

サイトにはプロセスがなく、スケーリングできません。

セッション

セッションは会話の状態を保持するため、ユーザーは接続を切った後に再開できます。各 valet console の実行内容はセッションに保存され、同じセッションを後から再開または削除できます。

セッションを再開する
valet console [-a <agent>] --resume <session-id>

既存のセッションでコンソールを再開します。トランスクリプトはローカルで再生され、エージェントは中断した箇所から続行します。コンソールの起動時に表示されたセッション ID を使うか、ダッシュボードで確認してください。--resume を指定しない場合、valet console は新しいセッションを開始します。

セッションを削除する
valet sessions delete <session-id> [-a <agent>]

セッションとそのトランスクリプトを削除します。取り消せない操作です。実行前に確認してください。セッションのサブコマンド一覧は valet sessions --help を実行してください。

valet exec の使用

valet exec は、Valet が管理する環境変数を注入してローカルコマンドを実行する唯一の方法です。2 種類の環境変数を取得します。値はローカルシェルではなく、コントロールプレーンに保存されています。エージェントの作成後、デプロイの準備が完了したと判断する前に、シークレットを必要とするコマンドをテストしてください。

モードは 2 種類あります。

コネクターモード(-- なし)

最初の引数はコネクター名として検索されます。command コネクターが見つかると、そのシークレットが取得・注入され、コネクターに設定されたコマンドが実行されます。追加の引数は、コネクターに設定された引数の後ろに追加されます。

# Run the "gh" command connector (looks up connector named "gh")
valet exec -a my-agent gh pr list

# Use linked agent from current directory
valet exec gh pr list
明示的なシークレットモード(-- あり)

シークレット名は、-- の前にカンマ区切りの位置引数として渡します。コマンドとその引数は、-- の後ろに指定します。

valet exec [-a <agent>] SECRET[,SECRET...] -- command [args...]

指定したシークレットの値を取得し、それらを環境に注入して指定したコマンドを実行します。現在のプロセスはコマンドに置き換えられます。

# Run gh with GITHUB_TOKEN injected as an env var
valet exec -a my-agent GITHUB_TOKEN -- gh pr list

# Pass a secret as a CLI argument using {{}} syntax
valet exec -a my-agent API_KEY -- curl -H "Authorization: Bearer {{API_KEY}}" https://api.example.com

# Multiple secrets in one command
valet exec -a my-agent GITHUB_TOKEN,SLACK_TOKEN -- \
  sh -c 'test -n "$GITHUB_TOKEN" && test -n "$SLACK_TOKEN"'

フラグ:--agent または -a:シークレットを所有するエージェント(省略した場合はリンク済みのエージェントを使用します)。詳細は valet exec --help を実行してください。

CLI 引数のテンプレート構文

コマンド引数に {{SECRET_NAME}} を指定すると、シークレットの値に置き換えられます。環境から読み取るのではなく、認証情報をフラグや URL として受け取るツールで便利です。どちらのモードでも使用できます。

MCP サーバーをローカルで実行する

シークレットを必要とする環境変数を使用する MCP サーバーをテストするには、次のようにします。

valet exec -a my-agent SLACK_BOT_TOKEN,SLACK_TEAM_ID -- \
  npx -y @modelcontextprotocol/server-slack

valet exec を使わない場合、MCP サーバーは必要なトークンなしで起動し、認証に失敗します。

valet exec が必要な理由

通常のシェルコマンド(curl、npx、node など)から Valet のシークレットにはアクセスできません。次の方法では動作しません。

# WRONG — $API_KEY is not set in your shell
curl https://api.example.com/data?key=$API_KEY

# CORRECT — valet exec injects the secret (explicit secrets mode)
valet exec -a my-agent API_KEY -- curl https://api.example.com/data?key={{API_KEY}}

# OR use connector mode if you have a command connector configured
valet exec -a my-agent my-connector-name

これはすべてのコネクターコマンドにも当てはまります。--command または --args がシークレットを必要とする環境変数を参照する場合、デプロイの準備が完了したと判断する前に、valet exec を使って実際のコマンドをテストしてください。

valet exec によるコネクターの検証

最初の valet agents create によるデプロイ後、シークレットを必要とするすべてのコマンドを valet exec でテストしてください。これにより、デプロイの準備が完了したと判断する前に、認証の失敗、シークレット名の誤り、不正な URL、依存関係の不足を検出できます。エンドツーエンドテストを行う前に、修正したソースをデプロイしてください。

テスト項目

--env フラグでシークレットを参照するコネクターコマンドは、すべてローカルで検証してください。コネクターが実行する実際のコマンドを再現し、valet exec でラップします。

# If the connector is defined as:
valet connectors create github-server \
  --transport stdio \
  --command npx \
  --args -y,@modelcontextprotocol/server-github \
  --env GITHUB_PERSONAL_ACCESS_TOKEN={{GITHUB_TOKEN}}

# Test the underlying command locally:
valet exec -a my-agent GITHUB_TOKEN -- \
  npx -y @modelcontextprotocol/server-github

シークレットを必要とするヘッダーや URL を使用するリモートコネクター(SSE/streamable-http)は、curl でテストしてください。

# If the connector uses --header Authorization={{API_TOKEN}} --url https://mcp.example.com/mcp
# Test the endpoint is reachable and the token works:
valet exec -a my-agent API_TOKEN -- \
  curl -s -o /dev/null -w "%{http_code}" -H "Authorization: {{API_TOKEN}}" https://mcp.example.com/mcp

任意のリクエストを本番環境のエンドポイントに送信して、Webhook をテストしないでください。プロバイダーが文書化しているテストイベントの手順、または専用のテストエンドポイントを使用してください。どちらの操作でも実際の処理が発生する可能性がある場合は、事前にユーザーの承認を得てください。

検証チェックリスト

valet deploy を実行する前に、次の項目を確認してください。

  1. すべての環境変数が設定されていること:valet env --agent <name> と valet env --org <org> を実行し、コネクターが参照するすべての名前が一覧に表示される
  2. 各コネクターのコマンドが valet exec を通じてローカルで正常に実行される
  3. シークレットを必要とする URL が正しく解決され、認証できる

valet exec によるテストがすべて成功するまで、セットアップが完了したと判断しないでください。

よく使うワークフロー

エージェントの完全なセットアップ(組織優先、推奨)

Resource Creation Principles に従い、まず組織スコープのリソースを設定してから、エージェントにアタッチします。

  1. ターミナルで組織スコープのシークレットを設定するよう、ユーザーに案内します:

    valet env set GITHUB_TOKEN=<their-token> --org acme
    
  2. 組織レベルでカタログからコネクターを追加します:

    valet connectors catalog
    valet connectors create github --org acme
    
  3. カタログに該当する項目がない場合は、組織レベルでカスタムコネクターを作成します:

    valet connectors create mcp-server my-tool --org acme \
      --transport stdio \
      --command npx \
      --args -y,@example/mcp-server \
      --env API_KEY={{API_KEY}}
    
  4. 組織レベルでカタログからチャネルを追加します(Webhook 用):

    valet channels create github-webhook --org acme
    
  5. エージェントがチャネルファイルを必要とする場合は、channels/<channel-name>.md に作成します。「チャネルファイルの作成」を参照してください。

  6. エージェントを作成して、組織のリソースをアタッチします。このコマンドで初回のデプロイも実行されます:

    cd my-agent-project
    valet agents create my-agent --org acme \
      --attach-connector github \
      --attach-channel github-webhook
    

    作成後にアタッチする場合:

    valet connectors attach github --agent my-agent
    valet channels attach github-webhook --agent my-agent --events pull_request
    
  7. エージェントが作成されたら、valet exec で各コネクターのコマンドを検証します:

    valet exec -a my-agent GITHUB_TOKEN -- \
      npx -y @modelcontextprotocol/server-github
    

    作成コマンドで初回のデプロイはすでに実行されています。最終デプロイの前に、認証、依存関係、コマンドの失敗を修正してください。

  8. 検証後に行った修正をデプロイします:

    valet deploy
    
  9. 以下の対話型テストループで、エンドツーエンドの動作を検証します。

エージェントの単発セットアップ(エージェントスコープ)

エージェントがリソースを共有できない具体的な理由がある場合に限り、このフローを使用します。たとえば、同じサービスに対する認証情報を分ける場合、一時的なテストエージェントの場合、エージェントごとにレート制限を設定する場合などです。それ以外の場合は、上記の組織優先フローを推奨します。単独でのセットアップ手順:

  1. エージェントを作成します(ユーザーが複数の組織に属している場合は --org を指定し、組織が1つの場合は省略します):

    cd my-agent-project
    valet agents create my-agent --org acme
    
  2. エージェントスコープのシークレットを設定し、エージェントスコープのコネクターを作成します:

    valet env set API_KEY=<value> --agent my-agent
    valet connectors create mcp-server my-tool --agent my-agent \
      --transport stdio --command npx \
      --args -y,@example/server \
      --env API_KEY={{API_KEY}}
    
  3. 上記と同様に、チャネルとチャネルファイルを作成し、デプロイしてテストします。

対話型テストループ(チャネルを初めてセットアップする場合は必須)
  1. バックグラウンドでログのストリーミングを開始します:

    valet logs > /tmp/valet-test-<agent-name>.log 2>&1
    

    (run_in_background: true を指定して Bash で実行します。)

  2. チャネルをトリガーするようユーザーに依頼します(メールを送信する、GitHub にプッシュするなど)。必要な操作を具体的に伝えてください。

  3. トリガーが完了したとユーザーが確認するまで待ちます。

  4. バックグラウンドのログストリームを停止し、ログファイルを読み込みます。

  5. ログを確認します:

    • 正常:ターン数が少なく、mcp_call_tool_start/mcp_call_tool_done のペアと dispatch_complete がある。
    • 異常:組み込みツールのみを使ったターンが多い(エージェントがループしている)、mcp_call_tool_start がない(ツールを見つけられない)、または dispatch_complete がない(タイムアウトまたは処理の停止)。
  6. 問題がある場合は、SOUL.md またはチャネルのプロンプトを修正して再デプロイし、繰り返します。変更するたびに VM が完全に再起動されるため、完了を待ってから新しいログをストリーミングし、評価してください。

削除(順序が重要)

まず組織のリソースをデタッチし、次にエージェントスコープのリソースを削除してから、エージェントを削除します:

# Detach org resources (they remain available for other agents)
valet connectors detach github --agent my-agent
valet channels detach github-webhook --agent my-agent

# Destroy agent-scoped resources
valet channels destroy <agent-channel>
valet connectors destroy <agent-connector>

# Destroy the agent
valet agents destroy <agent-name>
デバッグ
valet agents info my-agent                   # Check state, channels, connectors
valet agents info my-agent --org my-org      # Specify org when looking up by name
valet logs --agent my-agent                  # Stream live logs (last 100 lines, then live)
valet logs --agent my-agent -n 0             # Live logs only, skip history
valet ps restart -a my-agent                 # Restart without redeploying
valet ps restart -a my-agent --org my-org    # Restart with explicit org
valet ps scale agent=0                       # Stop the agent (model preserved)
valet ps scale agent=1                       # Start it again

新しいエージェントの設計

使用する場面:ユーザーが「エージェントを構築したい」「エージェントをゼロから作成したい」「自動化を設計したい」と依頼する場合、またはスキル/MCP の URL を提示してエージェントへの組み込みを求める場合です。

好奇心を持って確認しながら、明確な意見を示してください。改善案を提案し、エッジケースを予測して、アイデアの整理を手伝います。質問は最大7つとし、必要十分であればそれより少なくします。

ステップ1:ユーザーの入力を解析する

ユーザーのプロンプトには、実現したい内容の説明や、スキル、ツール、MCP サーバーを指す URL が含まれる場合があります。両方を抽出します。

URL の種類パターン取得方法
GitHub の SKILL.mdgithub.com/.../SKILL.mdraw.githubusercontent.com/... に変換します。同じ階層の関連ファイルを探すため、親ディレクトリも確認します。
GitHub ディレクトリgithub.com/.../tree/...一覧を取得します。SKILL.md と README.md を探します。
skills.sh の一覧skills.sh/<name>説明とソースリポジトリの URL を取得します。ソースへのリンクをたどります。
MCP サーバーの READMEnpmjs.com、GitHub、PyPIサーバー名、ツール、設定/インストール手順を抽出します。

各 URL について、WebFetch で取得して種類を特定し、パッケージ全体を調べて、名前、説明、ツール、依存関係、設定を抽出します。ToolSearch を使って同等のツールがすでに存在するか確認し、必ず既存のツールを優先してください。

URL がない場合は、直接ヒアリングに進みます。

Step 2: インタビュー

選択肢を構造化して提示する場合は AskUserQuestion を使い、自由回答形式の質問は直接会話で行います。質問数を記録し、十分な情報が集まったら質問を止めて作成に進みます。

重要:AskUserQuestion を使う場合、question フィールドには、疑問符で終わる、完全で明確な質問文を指定してください。 ユーザーにはこの質問文が目立つ形で表示されます。ユーザーが何を尋ねられているかを理解するための主な情報です。悪い例:「トリガー」や「トリガーの種類」。良い例:「このエージェントをどのように起動しますか?」選択肢のラベルは短く(1~5語)し、説明に詳細を記載してください。

質問 1 — 理解内容の確認とトリガーの種類:

最初のプロンプトから理解した内容に基づき、作成するエージェントの簡潔な概要を提示します。

  • URL が指定されている場合:取得した内容(名前、説明、機能)を提示し、指示内容と組み合わせて、作成するエージェントを提案します。

まだ明確でなければ、トリガーについて質問します。

  • Webhook — イベント駆動(メール、プッシュ通知、フォーム送信)
  • プロンプト — ユーザーが valet run またはコンソール経由でメッセージを送信

質問 2~6 — 状況に応じた詳細確認

より良い方法を提案し、手動作業の自動化が可能な箇所を指摘し、明らかなエッジケースを取り上げてください。ユーザーの意図が 1~3 個の質問で明確になった場合は、早めに切り上げてください。

より詳しく確認する必要があるトピックの例:

  • ツール/スキルの検出(下記参照)— URL からツールがすでに特定できている場合は省略します
  • ワークフローの確認 — 判断ポイント、分岐ロジック
  • 出力形式 — 結果の配信先/方法(Slack チャンネル、メール、ファイルなど)
  • エッジケースとガードレール — 起こり得る問題を提案し、制約について質問します
ツールの検出

ユーザーが、インポートした URL では対応できない機能について言及した場合は、次の順に検索します(リソース作成の原則に従います):カタログ(valet connectors catalog)→ 既存の組織コネクター → ローカル MCP ツールの ToolSearch → skills.sh の WebFetch → PulseMCP/Smithery の WebSearch。一致するものがない場合、エージェントは組み込みツールを使用するか、その作業を手動のままにします。

Step 3: 計画を提示して確認する

インタビューとツール/スキルの検出が完了したら、何かを作成する前に、作業を止めて明確な計画をユーザーに提示してください。計画では、ユーザーのマシン上で何が行われるか、エージェントが何を自動的に行うか、ユーザーが何を手動で行う必要があるかを明確にします。これにより、作業開始前にユーザーが方向性を変更できるようになります。特に、API 認証情報、サードパーティの設定、クラウドコンソールなど、外部での設定が必要な場合に重要です。

次の形式で計画を提示します。

Here's the plan for your <agent-name> agent:

**What I'll create on your machine:**
- A project directory with SOUL.md defining the agent's identity and behavior
- [Channel files for <channel-type> triggers, if applicable]
- [Skill files for <connector> usage, if applicable]

**What I'll set up on the Valet platform:**
- The agent itself (registered and deployed in org <org-name>)
- [Org connectors: <list each, noting if from catalog or custom>]
- [Org channels: <list each, noting if from catalog or custom>]
- [Agent-scoped resources, if any: <list with reason they're not org-scoped>]

**What you'll need to do:**
- [Set secrets in your terminal (org-scoped by default): <list each secret and what it's for>]
- [External setup: <specific steps, e.g., "Create a Google Cloud project,
  enable the Gmail API, and generate OAuth credentials — I'll walk you
  through this when we get there">]
- [Any other manual steps the user must perform]

[If external setup is complex, call it out explicitly: "The <service>
integration requires some setup on your end — <brief description of
what's involved>. If that feels like too much, we could <alternative
approach> instead."]

Want to proceed with this plan, or would you like to adjust anything?

計画に関するガイドライン:

  • ユーザーが行う作業を具体的に記述してください。「API 認証情報を設定する」とは書かず、「api.slack.com で Slack アプリを作成し、chat:write スコープを追加して、ワークスペースにインストールし、Bot User OAuth Token をコピーする」と記述してください。ユーザーが何をする必要があるのかを把握できるようにします。
  • **複雑さを正直に伝えてください。**連携にクラウドコンソールでの操作、OAuth の設定、サードパーティサービスでの Webhook 設定、または複数の手順を要する外部作業が必要な場合は、そのことを明確に伝えてください。ユーザーが別の方法に切り替えるかどうかを判断するのは、多くの場合ここです。
  • **代替案がある場合は提示してください。**ユーザーの目的をより簡単な方法(別のサービス、連携の削減、自動化の代わりに手動で行う手順)で達成できる場合は、その方法についても触れてください。
  • **明示的な確認を待ってください。**ユーザーが「はい」と答えるまで、Step 4 に進まないでください。変更を希望する場合は計画を修正し、再度提示してください。
ステップ 4:エージェントを生成する
  1. valet new <agent-name> でプロジェクトのひな形を作成します。
  2. 以下の「SOUL.md の作成」ガイダンスに従って SOUL.md を作成します。
  3. エージェントが Webhook を使用する場合は、チャネルファイルを作成します。「チャネルファイルの作成」を参照してください。
  4. エージェントにローカルの手順知識が必要な場合は、skills/<name>/SKILL.md にカスタムスキルを作成します。
  5. 生成された valet.yaml のメタデータを入力します。ダッシュボードまたはカタログのワークフローをユーザーが求めている場合に限り、カタログ設定フィールドを追加します。
  6. 生成された AGENTS.md は、すべてのセットアップ要件が判明してから最後に更新します。これにより、デプロイ済みリリースと今後のセットアップ手順を同期した状態に保てます。
  7. 次の検証チェックリストを実行します。
    • SOUL.md に空でない Purpose と Workflow がある
    • Guardrails に Always と Never の両方のサブセクションがある
    • <placeholder> にすべきハードコードされた ID がない
    • Webhook 駆動の場合、チャネルファイルに Scope セクションがある
    • チャネルファイルに Webhook ペイロードの場所に関する指示がある
    • どのファイルにもシークレットや API キーが含まれていない
    • AGENTS.md にシークレット値を含めずに、すべてのセットアップ手順が記載されている
    • valet manifests validate が成功する
  8. 組織レベル(推奨)またはエージェントレベルでシークレットを設定するようユーザーに案内します。
    valet env set SECRET_NAME=<value> --org <org-name>
    
    エージェントが直接読み取る非機密の設定(リージョン、ベース URL、チーム名など)については、通常の変数を設定します。デプロイ後、エージェントはこれを $NAME として読み取ります。
    valet env set NAME=<value> --plain --org <org-name>
    
  9. コネクターを設定します。まずカタログを確認してください。
    valet connectors catalog
    valet connectors create <entry> --org <org-name>
    
    カタログに該当項目がない場合に限り、カスタムコネクターを作成します。
    valet connectors create mcp-server <name> --org <org-name> \
      --transport stdio \
      --command <cmd> --args <args> \
      --env KEY={{SECRET_NAME}}
    
  10. チャネルを設定します。Webhook チャネルの場合は、まずカタログを確認してください。
valet channels catalog
valet channels create <entry> --org <org-name>

または、直接作成します。

valet channels create webhook <channel-name> --agent <agent-name>
  1. エージェントを作成してデプロイし、組織リソースをアタッチします。
cd <agent-name>
valet agents create [name] --org <org-name> \
  --attach-connector <connector> \
  --attach-channel <channel>
  1. エージェントが作成されたら、valet exec を使って各コネクターコマンドをローカルで検証します。
    valet exec -a <agent-name> SECRET_NAME -- <cmd> <args>
    
    create コマンドによって初回のデプロイは完了しています。修正した設定をデプロイする前に、失敗をすべて解消してください。
  2. 検証のためにソースの変更が必要だった場合は、valet deploy を実行します。
  3. エージェントにチャネルがある場合は、対話型テストループを実行します。「共通ワークフロー」の「対話型テストループ」を参照してください。
設計上のエッジケース
ケース対応
URL がなく、説明のみ標準的な確認インタビューを行います。
説明がなく、URL のみインポートした機能を提示し、エージェントに何をさせるべきか尋ねます。
URL と説明が混在先に URL を取得し、インポートしたコンテキストを踏まえてインタビューを行います。
URL にアクセスできないエラーを報告します。代替 URL または直接貼り付けを依頼します。
名前が重複valet agents を実行して確認します。別の名前を選ぶよう依頼します。
MCP サーバーに API キーが必要SOUL.md の Environment Requirements に記載します。valet env set を使うようユーザーに案内します。実際の値を尋ねてはいけません。

現在のセッションから学習する

使用するタイミング:ユーザーが「これをエージェントとして保存して」「このワークフローを記録して」「このセッションから学習して」または「これを繰り返し実行できるようにして」と言った場合。

ステップ 1:セッションログを見つける
  1. 現在の作業ディレクトリを Claude のプロジェクトパスに変換します。 ~/.claude/projects/-<cwd-with-slashes-replaced-by-dashes>/ 例:/Users/me/Developer/my-project → ~/.claude/projects/-Users-me-Developer-my-project/
  2. アクティブなセッションログを見つけます。
    ls -t ~/.claude/projects/-<path>/*.jsonl | head -1
    
Step 2: セッションを解析する

Read ツールで JSONL ファイルを読み込みます。各行は JSON オブジェクトです。次の情報を抽出します。

  • ユーザーのプロンプト:type が "user" で、message.content が文字列であるエントリーです。テキストを取得します(それぞれ 500 文字で切り詰めます)。
  • MCP ツールの使用状況:type が "assistant" で、message.content に type: "tool_use" のオブジェクトが含まれるエントリーです。ツールの name が mcp__ で始まる場合は、__ で分割してサーバー名とツール名を取得します(例:mcp__slack__post_message → サーバー:slack、ツール:post_message)。
  • スキルの呼び出し:name が "Skill" のツール呼び出しです。スキル名として input.skill を取得します。
  • 組み込みツール:その他すべてのツール呼び出し名(Read、Write、Edit、Bash、Glob、Grep など)です。
  • 修正指示:"no,"、"don't"、"instead"、"actually"、"wrong"、"not that"、"change"、"stop"、"undo"、"revert" を含むユーザーメッセージです。これらは、ユーザーが方針を変更したことを示します。
  • 停止位置:input.skill が learn/capture トリガーに一致する Skill ツール呼び出しが現れた時点で解析を停止します。それ以降は除外します。

大規模なセッション(ユーザープロンプトが 20 件を超える場合)では、コンテキストを管理しやすくするため、最初の 3 件と最後の 3 件のユーザープロンプトをサンプリングします。

また、~/.claude/projects/<project-path>/sessions-index.json を確認し、セッション ID(JSONL ファイル名から特定)と一致する summary および firstPrompt フィールドを探します。

セッションが空の場合(learn トリガー以外にユーザープロンプトがない場合)は、その旨をユーザーに伝えて終了します。

Step 3: 分析を提示し、聞き取りを行う

分析を表示します。

Session Analysis:
- Objective: [summary from first prompt or sessions-index]
- User prompts: N messages
- MCP tools used: [server names + tool counts]
- Skills invoked: [names]
- Built-in tools: [names]
- Corrections detected: N

確認の質問をします(セッションから答えが明らかなものは省略します)。

  1. トリガー:このエージェントは何をきっかけに起動しますか?最初のユーザープロンプトに基づいて、Webhook とプロンプトのどちらがよいか、案を提示します。
  2. 範囲:抽出した目的とツールの一覧で全範囲を網羅できていますか。それとも、範囲を縮小または拡大しますか?
  3. 修正指示:検出した修正指示をそれぞれ提示し、修正後の方針に常に従うべきか確認します。
  4. 名前:kebab-case の名前(64 文字未満)を提案し、ユーザーに確認します。
Step 4: 計画を提示して確認する

「新しいエージェントの設計」Step 3 と同じ確認フローに従います。作成するもの、セットアップするプラットフォームリソース、ユーザーが行う必要のあることを提示します。確認を待ちます。

Step 5: エージェントを生成する

「新しいエージェントの設計」(上記 Step 4)と同じ生成フローに従いますが、セッションの内容をソースとして使用します。

  • 目的:ユーザープロンプト、修正指示、聞き取りでの調整内容から作成します。
  • ワークフローのフェーズ:ツール呼び出しの時系列を、論理的な目的ごとにグループ化して作成します(例:「データ収集」、「分析」、「結果の投稿」)。
  • 常に守るガードレール:セッションでうまくいったパターンとユーザーの好みから作成します。
  • 決して行わないガードレール:修正指示、確認されたミス、分野の一般的な慣習から作成します。
  • セッション固有の値を <placeholder> に置き換えます。
  • 質問と回答のやり取りは、指針として一般化します(例:「曖昧な場合は X を優先する」)。
  • 最後の手順:「AGENTS.md の作成」の説明に従って、プロジェクトのルートに AGENTS.md を書き込みます。
例外ケース
ケース対応
空のセッションユーザーに「このセッションは空です。取り込む内容はありません。」と伝え、終了します。
MCP ツールが使われていないコネクターの作成を省略します。エージェントは組み込みツールのみを使用します。
長いセッション(500 エントリー超)最初の 3 件と最後の 3 件のユーザープロンプトをサンプリングします。ツールの使用状況は頻度別に要約します。
修正指示が多いそれぞれを提示します。どれをガードレールに含めるか、ユーザーに選んでもらいます。

SOUL.md の作成

SOUL.md はエージェントのアイデンティティと振る舞いを定義します。必須ファイルはこれだけです。

テンプレート
# <Agent Title>

## Purpose

<2-3 sentences: what this agent does and why. Name the specific tools, inputs, and outputs.>

## Personality

<3-4 traits matching the agent's domain. Skip for simple utility agents.>

- **<Trait>**: <Description>

## Workflow

### Phase 1: <Phase Name>

1. <Concrete step referencing specific tool names>
2. <Next step>

### Phase 2: <Phase Name>

1. <Steps>

## Guardrails

### Always
- <Positive constraint>

### Never
- <Negative constraint>
任意のセクション

必要に応じて、対象チャンネル、環境要件、Webhook の対象範囲ルール、使用するスキル、MEMORY.md の形式を追加します。

合成ルール
  • 目的:具体的な対象と理由を明記します。入力、出力、ツールを記載してください。良い例:「YouTube チャンネル X の新しいエピソードを監視し、文字起こしをダウンロードして、Slack の #channel に要約を投稿します。」悪い例:「データを処理します。」
  • ワークフロー:実際のツール名を使った具体的な番号付き手順を記載します。論理的な目的ごとにフェーズをまとめてください。
  • 常に守るガードレール:エージェントが一貫して従うべき、望ましいパターンを記載します。
  • 決して行わないガードレール:修正や制約から、エージェントが避けるべきことを記載します。
  • プレースホルダー:ユーザー固有の値(ID、URL、キー)を<placeholder-name>に置き換えます。
SOUL.md でのコマンドコネクターの参照

エージェントがコマンドコネクターを使用する場合、SOUL.md のワークフローでは、npm パッケージ名、基盤となるトランスポート、npxの呼び出しではなく、コネクター名をコマンドとして参照する必要があります。コネクター名はエージェントが入力する CLI コマンドであり、エージェントの PATH 上で使える唯一の名前です。

良い例:Run agentmail inboxes list to verify the CLI is connected. 悪い例:Run npx agentmail-cli inboxes listまたはRun agentmail-cli inboxes list

間違った名前を使うと、シークレットの注入を回避してしまう(npx を直接呼び出す場合)か、完全に失敗します(コマンドが見つからない場合)。コネクターを作成する際は、必ず CLI コマンドと同じ名前を付けてください(「コネクター」セクションの命名規則を参照)。

よくある間違い
  • 目的が空欄、または曖昧 — 具体的な入力、ツール、出力を必ず記載します
  • ワークフローがない — 手順がなければ、エージェントは目的だけでは判断できません
  • <placeholder>に置き換えるべき値がハードコードされている
  • webhook エージェントのスコープ境界がない(「チャンネルファイルの作成」を参照)
  • コマンドコネクターで間違ったコマンド名を使っている — コネクターには CLI コマンドと同じ名前(例:agentmail-cliではなくagentmail)を付け、SOUL.md でもその同じ名前を参照する必要があります

チャンネルファイルの作成

チャンネルファイルは、メッセージが届いたときにエージェントが行うことを指示します。エージェントに向けた指示として、直接的な命令形で記述します。

webhook ペイロードの場所(重要)

JSON webhook ペイロードは、ユーザーメッセージ内のチャンネルファイルの直後にインラインで追加されます。すべてのチャンネルファイルは、次の内容から始める必要があります。

The JSON webhook payload is appended directly after these instructions
in the user message. Parse it inline — do not fetch, list, or search
for the payload elsewhere. Do NOT use tools to read the payload.

これがないと、エージェントはツール呼び出しを行い、ペイロードを探すために無駄なターンを費やします。

構成
  1. ペイロードの場所 — 上記の指示
  2. 何が起きたか — イベントを説明します
  3. 抽出する情報 — トランザクションを特定するペイロードのフィールド(ID、参照情報)を指定します
  4. スコープ境界 — すべてのアクションをそれらの識別子の範囲内に限定します
  5. 実行内容 — 処理の手順を順番に記載します
例
# New Email Received

The JSON webhook payload is appended directly after these instructions
in the user message. Parse it inline — do not fetch, list, or search
for the payload elsewhere. Do NOT use tools to read the payload.

You received a webhook for a single new email.

## Scope

Extract the `thread_id` from the payload. All actions are scoped to
this thread. Do not list, read, or act on any other threads.

## Steps

1. Extract `thread_id`, `from_`, `subject`, and `text` from the payload.
2. [... task-specific steps ...]
SOUL.md でスコープを強調する

webhook 駆動型エージェントの場合、SOUL.md に次の内容を追加します。

## Webhook Scope Rule

When you receive a webhook, your scope of work is defined by the
identifiers in the payload. Use any tools to fully understand and act
on that specific content, but do not act on unrelated content.

valet.yaml の記述

valet.yaml は、スタンドアロンのエージェント、サイト、アプリ向けの任意のプロジェクトメタデータです。valet new は、新しいエージェントプロジェクト用のプレースホルダーを作成します。Valet カタログに公開するエージェントには、完全なマニフェストが必要です。

プロジェクトにマニフェストがある場合は、メタデータヘッダーを最新の状態に保ってください。

name: <resource-name>
display_name: <Human-Readable Name>
description: <One sentence on what this is and who it is for>

これらのフィールドは、名前だけでは不十分な場所でリソースを識別するためのものです。webinar-slides-20260810 のような DNS 名では、読む人に何も伝わりません。そのため、ユーザー向けの名前には display_name を、開くかどうかを判断する人向けには description を記述してください。Deploy はこのファイルを読み取り、両方をリソースに反映します。

エージェントには category も必要です。ダッシュボードのプレビューカードに表示される、小文字 1 語(finance、research、developer-tools)を指定します。サイトとアプリにはプレビューカードがないため、省略してください。

スタンドアロンのリソースでは、ヘッダーより下のすべての項目は任意です。connectors、channels、story、example はダッシュボードのセットアップフローを制御します。デプロイボタン、ダッシュボードでのセットアップ、ワンクリックセットアップ、またはカタログへの公開をユーザーが求めた場合に追加してください。カタログに公開するエージェントには、以下で説明する完全なストーリーと依存関係のフィールドが必要です。

サイトとアプリにはヘッダーだけを指定し、それ以外は記述しません。いずれかに connectors または channels ブロックがあると、デプロイ時に拒否されます。サイトにはランタイムがなく、アプリは Procfile のプロセスを実行するため、どちらもこれらを使用できません。

マニフェストを最新の状態に保ってください。 リソースの目的が変わったら、同じ変更で display_name と description を更新してください。古い説明は、それが説明するコンテンツより長く残ることがあり、次回のデプロイ時に公開されます。

カタログ項目のみ

マニフェストでサポートされるのは、Valet カタログに存在するコネクターとチャネルのみです。カスタムコネクターとカスタムチャネルは valet.yaml に記述できません。ダッシュボードのセットアップフローは各 catalog の値を検索し、該当する項目がない場合は失敗します。

valet.yaml を記述する前に、valet connectors catalog と valet channels catalog を実行し、エージェントが使用するコネクターとチャネルがカタログに含まれているか確認してください。

  • カタログ項目とカスタムリソースが混在する場合:カタログ項目のみを valet.yaml に含めてください。カスタムリソースは、CLI によるセットアップ手順とともに AGENTS.md に記載します。ユーザーはカタログ項目をダッシュボードのフローで設定し、その後、カスタムリソースを CLI で手動作成します。
  • カスタムリソースのみの場合:必須のトップレベルフィールド 4 つを含め、connectors と channels の配列を省略した valet.yaml を作成してください。ダッシュボードはこのメタデータを使って、エージェントの名前、説明、カテゴリを表示します。
  • カタログ項目がない場合:コネクターまたはチャネルがカタログにあるべきなのに存在しない場合は、追加を依頼するため [email protected] にメールするようユーザーに案内してください。
テンプレート
name: <agent-name>
display_name: <Human-Readable Name>
description: >-
  <What the agent does — shown in the dashboard
  during setup>
category: <category>
connectors:
  - catalog: <catalog-entry-name>
    description: >-
      <Agent-specific context for this connector>
    slot_descriptions:
      <SLOT_NAME>: <Label shown in the setup flow>
channels:
  - catalog: <catalog-entry-name>
    description: >-
      <Agent-specific context for this channel>
    events:
      - <event_type>
    slot_descriptions:
      <SLOT_NAME>: <Label shown in the setup flow>
ルール
  • name は、valet agents create で使用するエージェント名と一致している必要があります。
  • catalog の値はカタログに存在するものを指定してください。 確認には valet connectors catalog と valet channels catalog を実行します。カタログに存在するコネクターとチャネルのみを含めてください。カスタムの項目は yaml から省略し、代わりに AGENTS.md に記載します。
  • slot_descriptions のキーは、カタログ項目のスロット名と一致している必要があります。 スロット名を確認するには、valet connectors catalog get <name> または valet channels catalog get <name> を実行します。
  • description は、ダッシュボードでの表示に適した、完結した文にしてください。
  • category には、内容を表す語(例:development、ops、utilities、developer-tools、testing)を指定してください。
  • エージェントに connectors と channels がない場合は、それらの配列を丸ごと省略してください。
  • カタログのデフォルトで十分な場合は、任意のフィールド(description、events、slot_descriptions)を省略してください。
検証チェックリスト

ファイルを書き込んだ後、次の点を確認します。

  1. 4つすべてのトップレベルフィールドが存在し、空でないこと
  2. すべてのcatalog値について、valet connectors catalog/valet channels catalogを実行して存在を確認済みであること
  3. すべてのslot_descriptionsキーが、カタログエントリーで定義されたスロットと一致すること
  4. カスタム(カタログにない)コネクター/チャネルはyamlから除外され、AGENTS.mdに記載されていること

AGENTS.mdの作成

AGENTS.mdは、デプロイ前に書き込む最後のプロジェクトファイルです。エージェントプロジェクトのルートに置かれ、後からエージェントをデプロイする必要がある人のための、人間とLLMが読めるセットアップガイドとして機能します。

AGENTS.mdにシークレットの値、APIキー、トークンを絶対に含めないでください。 必要なものとその理由だけを記載します。

テンプレート
This folder contains the source for a Skilled Agent originally built for the Valet runtime. Changes should follow the Skilled Agent open standard.

## Setup

### Connectors

- **<connector-name>**: <plain-English description of what it provides and why the agent needs it>
  [Repeat for each connector]

### Channels

- **<channel-name>** (<channel-type>): <what triggers this channel and what the agent does when it fires>
  [Repeat for each channel]

### Secrets

- **<SECRET_NAME>**: <what this secret is for, where to obtain it, and any scopes or permissions required>
  [Repeat for each secret]

### External Setup

[If the agent requires any configuration outside of Valet — third-party service setup, OAuth apps, cloud console steps, DNS records, etc. — describe each step here in plain English. Be specific enough that a person unfamiliar with the project can follow along.]
ルール
  • 平易な英語で記述します。CLIコマンドではなく、理由を添えて要件を名詞で説明します。
  • シークレットについて具体的に記載します。必要なスコープ/権限と入手先を含めます。
  • 外部のセットアップ手順(OAuthアプリ、クラウドコンソール、Webhookの登録など)を含めます。
  • 該当しないセクションは省略します。このファイルは最後に作成します。

エージェントのストーリーを作成する(valet.yaml)

Valetカタログに公開されたエージェントには、valet.yamlマニフェストが付属します。Valetダッシュボードはこれを読み込み、使いやすいagents/new設定ウィザードを表示します。カタログに公開せず、valet agents createのみでデプロイするスタンドアロンエージェントには、このファイルは不要です。

valet.yamlを作成する際は、次の4項目を記入します。

  1. トップレベルのメタデータ — name、display_name、description、category。
  2. storyブロック — スロットに応じたナラティブの文言。
  3. connectors[]とchannels[] — エージェントごとのUIオーバーライドを含む依存関係。
  4. カタログ参照(catalog:)は、既存のValetカタログエントリーと一致している必要があります — 一致しない場合、ウィザードでアイコンやブランドの文言を解決できません。
storyブロック

ストーリーは、次の問いに答える3ステップのナラティブです。きっかけは何か、エージェントは何をするか、結果はどうなるか。各フィールドには、valet manifests validateで適用される厳格な文字数上限があります。超えないようにしてください。

story:
  hero: "Let's get AskADev answering questions for your team."
  subheadline: "Watches one Slack channel. Searches GitHub. Replies in-thread."
  steps:
    - role: trigger
      title: "Your team asks a question in Slack."
      body: "Someone posts 'where do we handle the Stripe webhook retry logic?'"
      catalog: slack-webhook
    - role: action
      title: "AskADev reads your code."
      body: "Searches the repo. Finds the handler and surrounding comments."
      catalog: github
    - role: outcome
      title: "And answers — with sources."
      body: "Replies in-thread, linking to the exact file, line, and commit."
      catalog: slack-mcp

**役割の契約:**順序どおりの3ステップ、trigger、action、outcomeのみです。それ以外は指定しないでください。

**ステップのcatalog::**省略可能です。設定する場合は、このマニフェストのconnectorsまたはchannelsのいずれかで宣言されているcatalog:と一致する必要があります。ウィザードは、そのサービスのアイコンをステップのグリフとして表示します。エージェントのモノグラムを表示するには空欄にします(外部サービスがない中央の「エージェントが考える」ステップに便利です)。

SOUL.md を基にコピーを作成する

コピーをゼロから考えないでください。エージェントの SOUL.md を基に作成します。Purpose セクションと Workflow セクションには、エージェントのトリガー、アクション、成果がすでに文章で記述されています。あなたの役割は、その文章をスロット駆動の形式に凝縮することです。

次の順番で進めます(上から順に進めると、ユーザーがウィザードで読む順番と一致します)。

  1. 3つの要素を抜き出します。 SOUL.md を開きます。Purpose の文には、トリガー、アクション、成果が、通常この順番で示されています。Purpose が曖昧な場合は、Workflow の各フェーズを参照します。Phase 1 → トリガー、Phase 2 → アクション、Phase 3 → 成果です。
  2. フックを見つけます。 このエージェントならではの特徴は何ですか?具体的な時間("朝8時になる")、具体的な場所("#ai-news に投稿する")、具体的な制約("あなたが承認した後にのみ")などがあります。フックを書き留めてください。フックはヒーローとサブヘッドラインの軸となり、多くの場合、成果の本文にも使われます。
  3. まずトリガー、アクション、成果の各ステップを作成します。 具体的な詳細のほうが、ヒーローよりも書きやすいものです。以下のトーンのルールに従ってください。次の表のちょうどよい長さを目指します。
  4. 次に成果の done_note を作成します。 それぞれ1行の短い文です。ステップ3の内容から自然に導き出せます。
  5. サブヘッドラインを作成します。 サービスと、それによって得られるメリットを示す具体的な1文にします。サブヘッドラインは、ヒーローの下に置く「エレベーターピッチ」です。
  6. 最後にヒーローを作成します。 ヒーローは最も凝縮された、ブランドを定義する一文です。ステップの後に作成すれば、凝縮するための材料が揃います。
  7. valet manifests validate を実行します。 必須です。ダッシュボードは、レンダリング時に無効なマニフェストを拒否します。
  8. 声に出して読みます。 どの行も、ためらわずに人が声に出して読めるような文にします。マーケティングページのように聞こえる場合は、書き直してください。
長さの目安(検証に通るだけでなく、見栄えのよい長さ)

上限は valet manifests validate によって適用される厳密な制限です。ちょうどよい長さの範囲は、ウィザードで実際にきれいに表示される長さです。上限ではなく、この範囲を目標にしてください。

フィールドちょうどよい長さ上限短すぎる場合長すぎる場合
hero45~75文字80内容が薄く、ありきたり狭いビューポートで不自然に折り返される
subheadline110~170文字200説明ではなく、スローガンのように読める情報が詰まり、一目で読めない
step title25~50文字60印象に残らない2行に折り返され、リズムが崩れる
step body80~130文字140埋め草のように感じられるタイトルの下で密集して見える
ui headline30~55文字—ありきたり(「GitHub を接続」)ステップのタイトルと重複する
ui blurb80~140文字—エージェント固有の切り口がないカタログの説明文のように読める
ui done_note20~45文字—具体的な「動作している」ことを示す手がかりがないステータスページに載せる内容になっている

上限よりも、ちょうどよい長さを優先してください。余分な文字に実質的な情報(チャンネル名、具体的な時間、名前の付いた成果物など)が含まれる場合に限り、上限に近づけます。文字数を埋めるためだけに水増ししないでください。

音声とスタイル

必ず守ること:

  • 現在形の能動態で書きます。*「ブリーフィングを投稿します」とし、「ブリーフィングを投稿する予定です」*や *「ブリーフィングが投稿されます」*とは書きません。
  • ヒーローにはエージェントの名前を少なくとも一度入れます。ユーザーは初めてエージェントに触れます。
  • 具体的なものを挙げます。サービス(Slack、GitHub)、成果物(#ai-news、pull request)、時刻(8am、毎週金曜日)などです。*「メッセージングプラットフォーム」や「定期的に」*とは書きません。
  • 2つの要素を持つ考えを表現するときは、リズムをつけるために em ダッシュ(—)を使います。ウィザードのフォントではきれいに表示されます。
  • 読者には あなた と呼びかけます。「あなたのチームが尋ねる」、*「あなたがメッセージを貼り付ける」のようにします。「ユーザー」*とは書きません。

決してしてはいけないこと:

  • 流行語を使わないでください。シームレス、活用する、力を与える、インテリジェント、 最先端、効率化する、解き放つ、強力、堅牢などです。
  • アクションの説明に受動態を使わないでください。*「AskADev があなたのコードを読みます」*とし、 *「あなたのコードは AskADev に読まれます」*とはしません。
  • 結果で足りる場合に、仕組みを説明しないでください。*「OAuth で認証します」は仕組みの説明です。「OAuth を使うため、API トークンは必要ありません」は結果です。「ペイロードを解析します」は仕組みの説明です。「PR を読みます」*は結果です。
  • ほかのエージェントにも当てはまるようなコピーを書かないでください。文中の AskADev を Code Reviewer に置き換えても成り立つなら、そのコピーは一般的すぎます。独自の特徴を加えてください。
  • エージェントの個性に合い、さまざまなビューポートで十分にテスト済みでない限り、絵文字を使わないでください。
トーンのルール(フィールドごと)

これらはほかの指針より優先されます。ウィザードで各フィールドが表示される方法に合わせて最適化されています。

  • ヒーローは命令形または現在形の叙述文にし、エージェント名を入れます。 *「AskADev に、チームの質問に答えてもらいましょう。」*とし、 *「AskADev は質問に答える AI エージェントです」*とはしません。
  • サブヘッドラインは、サービスと得られるメリットを含む具体的な一文にします。箇条書きやセミコロンは使いません。
  • トリガータイトルは、ユーザーまたはチャンネルで起きた出来事から始めます。 「チームが尋ねる…」、「PR がオープンされます。」、*「8am になります。」*のようにします。
  • アクションタイトルは能動態にし、エージェント名を入れます。 *「AskADev があなたのコードを読みます。」*のようにします。
  • 結果タイトルは、ユーザーが目にする具体的な成果物を示します。 *「スレッドにファイルへのリンク付きで返信します。」*のようにします。
良い例と悪い例
フィールド❌ 悪い例✅ 良い例理由
ヒーロー「AskADev はコードの質問に答える、AI 搭載の Slack アシスタントです。」「回答する前にあなたのコードを読む Slack ボット。」悪い例はカテゴリーと流行語から始めています。良い例は振る舞いから始め、独自の特徴(「回答する前に」)を示しています。
サブヘッドライン「GitHub MCP と Slack MCP を使い、開発者の質問にインテリジェントに回答します。」「Slack で GitHub リポジトリについて質問してください。AskADev が実際のコードとコミット履歴を調べ、スレッドで返信します。」悪い例は裏側の仕組みを挙げています。良い例はアクションと得られるメリットを示しています。
トリガータイトル「Webhook イベントを受信」「PR がオープンされます。」悪い例は仕組みを示しています。良い例はユーザーの世界で起きたことを示しています。
アクションタイトル「差分の分析」「Code Reviewer が差分を読みます。」悪い例は名詞句です。良い例は主語と動詞のある文です。
結果タイトル「レビューを送信」「インラインコメント、または承認。」悪い例は受動的な仕組みを示しています。良い例は2つの具体的な成果を示しています。
ステップの本文「エージェントは受信した webhook ペイロードを処理し、設定されたアクションを実行します。」「正確性、セキュリティ、保守性、テストカバレッジを確認します。文脈が重要な場合は、ファイル全体を読みます。」悪い例は一般的な説明です。良い例は具体的な項目を列挙しています。
UI の紹介文「エージェントがリポジトリにアクセスできるよう、GitHub アカウントを接続してください。」「AskADev は質問に答えるときにあなたのコードを読みます。まるで新入社員のように。」悪い例はどの GitHub コネクターにも当てはまります。良い例は、このエージェントが GitHub をどのように使うかを示しています。
UI の完了メッセージ「接続しました」「#engineering で待機中」悪い例はステータスです。良い例は、ユーザーが求めていた具体的な結果です。
サービスごとの ui: ブロック

各 connectors[] および channels[] エントリには、一般的なカタログの説明をエージェント固有の説明で上書きする ui: ブロックを設定できます。

connectors:
  - catalog: github
    description: "GitHub MCP server for browsing repos and reading files"
    ui:
      headline: "Point AskADev at your repo."
      blurb: "AskADev reads your code when it answers — like a new hire would."
      done_note: "Connected to your repo"

channels:
  - catalog: slack-webhook
    description: "Receives Slack messages and app mentions"
    ui:
      headline: "Let AskADev hear your team in Slack."
      blurb: "We'll add AskADev as a normal Slack app. You pick the channel."
      done_note: "Listening in the channel you invite it to"
  • headline は、ステップの既定の見出しを置き換えます。動詞+サービスへの呼びかけの形で記述します:「AskADev が Slack でチームの声を聞けるようにしましょう。」
  • blurb は、この特定のエージェントがサービスをどのように利用するかを一段落で説明します。一般的な Slack/GitHub の解説ではありません。それはカタログの description に記載します。
  • done_note は、サービスの接続後にデプロイ画面に表示される1行の要約です。デプロイ後にユーザーに表示される内容を記述します:「#engineering をリッスン中」、「valetdotdev/ark に接続しました」。

ui: に記載しないもの: 権限、制限、安全性のチップ、「理由」、動詞、分数。これらはカタログ側で管理する項目で、Valet チームが入力します。エージェントごとに重複して記載しないでください。

valet.yaml と README.md の内容を一致させる

エージェントの README.md のタグライン(プロジェクトタイトルの下にある1行)と、valet.yaml の subheadline は、同じマーケティング文言を GitHub とダッシュボードウィザードの2か所に表示するものです。一字一句同じ内容にしてください。一方を更新するときは、同じコミットで他方も更新してください。

README.md のプロジェクトタイトルと display_name も同様に、完全に一致させてください。GitHub からウィザードに移動したユーザーには、両方の場所で同じ名前と説明が表示される必要があります。内容の不一致は、エージェントがメンテナンスされていない印象を与える最大の原因です。


# Deep Researcher

Every morning, Deep Researcher scans the AI news landscape,
summarizes the 5 most important stories, and posts the briefing
to #ai-news.
# valet.yaml
display_name: Deep Researcher
story:
  subheadline: "Every morning, Deep Researcher scans the AI news landscape, summarizes the 5 most important stories, and posts the briefing to #ai-news."
検証

valet.yaml を作成または編集した後は、必ず検証してください。

valet manifests validate

明示的にパスを指定する場合:

valet manifests validate path/to/valet.yaml

valet manifests validate は、文字数制限、3ステップの仕様、ステップカタログの参照ルールを検証します。検証に失敗した場合は、デプロイする前に報告されたエラーを修正してください。ダッシュボードウィザードは無効なマニフェストを受け付けません。

エージェントのプロジェクト構成

my-agent/
  AGENTS.md            # Setup guide for future developers (required)
  CLAUDE.md            # Points Claude Code at AGENTS.md
  SOUL.md              # Agent identity and behavior (required)
  valet.yaml           # From valet new; required for catalog publication
  channels/            # Channel files (for webhook/trigger-driven agents)
    <channel-name>.md
  skills/              # Agent-scoped skill documentation (optional)
    <connector-name>/
      SKILL.md
  .valet/
    config.json        # Auto-managed by CLI

デプロイされたファイルは、実行時にはすべて読み取り専用です。エージェントは新しいファイル(例:MEMORY.md)を作成できますが、作成したファイルはデプロイ後に保持されません。

実行ガイドライン

  • OS に適したターミナルツールでコマンドを実行してください。
  • 説明を添えてください:Valet のコマンドを実行する前に、これから何をするのか、またその理由をユーザーに簡潔に伝えてください。コマンドを黙って実行しないでください。ユーザーが各手順の目的を常に理解できるようにしてください。
  • インストール時のガードレール:インストールのセクションに厳密に従ってください。新規インストールには公式の直接インストーラーを使用し、既存環境では valet update を使用してください。いずれかが失敗した場合は、未加工のバイナリのダウンロードやソースからのビルドを行わず、そこで停止してください。
  • アカウントにアクセスする前に認証してください:アカウントの状態を読み書きするコマンドを実行する前に、valet auth whoami を実行してください。ユーザーがログアウトしている場合は、ログインが必要な理由を説明し、valet auth login を開始してください。ローカルのバージョン確認、ヘルプ、オフラインのマニフェスト検証コマンドは、ログアウト中も使用できます。
  • valet help を積極的に活用してください:不明なコマンド、フラグ、機能がある場合は、推測する前に valet help <command> を実行してください。CLI のヘルプが正式な情報源です。
  • LLM セッション内でシークレット値を尋ねないでください。 ユーザー自身のターミナルで valet env set NAME=VALUE を実行するよう案内し、完了の確認を待ってください。通常の環境変数(valet env set NAME=VALUE --plain)は認証情報ではないため、そのまま設定できます。
  • valet exec で特権コマンドを検証してください。 エージェントが作成されたら、valet exec <names> -- <command> を使って、基盤となる各コマンドをテストしてください。Valet が管理するシークレットを使ってローカルでコマンドを実行する方法はこれだけです。最終的なデプロイとエンドツーエンドテストの前に、失敗を解決してください。ツールが引数にシークレットを必要とする場合に限り、{{SECRET_NAME}} を使用してください。
  • ユーザーからエージェントを一から作成するよう依頼された場合は、「新しいエージェントの設計」に従ってください。
  • ユーザーから現在のセッションをエージェントとして記録するよう依頼された場合は、「現在のセッションから学習する」に従ってください。
  • SOUL.md を作成する際は、テンプレートと統合ルールに従ってください。Purpose または Workflow を空欄のままにしないでください。
  • カタログに公開するエージェントの valet.yaml を作成する際は、「エージェントのストーリーを作成する」に従ってください。編集のたびに valet manifests validate を実行してください。長さの上限と3段階の役割順序は必ず守ってください。
  • 破壊的なコマンド(destroy、remove、revoke)を実行する前に、必ずユーザーに確認してください。
  • Webhook チャネルを作成する際は、Webhook URL と管理対象のシークレット名を伝えてください。署名シークレットの生の値を再掲しないでください。チャネルファイルを作成する際は、ペイロードの保存場所に関する指示を含めてください。
  • チャネルを使うエージェントを初めてデプロイした後は、対話型のテストループを実行してください。
  • コマンドが失敗した場合は、エラーを読み、問題を診断して解決してください。よくある原因は、未ログイン、SOUL.md がない、リンクされていない、またはエージェントのクラッシュです。インストーラーまたはアップデーターのエラーが発生した場合は、そこで停止し、ユーザー自身で解決してもらってください。

セットアップ

[エージェントに Valet 以外の設定(サードパーティサービスのセットアップ、OAuth アプリ、クラウドコンソールの手順、DNS レコードなど)が必要な場合は、各手順をここに平易な英語で記述してください。このプロジェクトに詳しくない人でも進められるよう、具体的に説明してください。]

コメント