tres-wallets-upload について
Tres Finance にウォレットや取引所アカウントを登録するためのエージェントスキルです。データ収集から検証、プレビュー、確認後のアップロードまでを順に案内します。
主な機能
- 01オンチェーンまたは取引所アカウント情報の収集
- 02CSV、Excel、手入力に対応
- 03ネットワーク、アドレス、重複の検証
- 04既存アカウントの照合とプレビュー
- 05確認済みデータの一括アップロードと結果報告
活用シーン
- 01表計算ファイルから複数のウォレットを登録
- 02Tres 内の既存ウォレットを照合して更新
- 03取引所アカウントの認証情報を収集
MCP 対応
TRES MCP でプラットフォームのスキーマとアカウント情報を取得し、一括アカウント更新を呼び出してデータを登録します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ anthropics/ claude-plugins-community --skill tres-wallets-uploadインストール後、Claude Code で/tres-wallets-uploadを入力して読み込まれたか確認します。
詳細
TRES Wallet Upload Skill
検証、プレビュー、確認を行いながら、オンチェーンウォレットと取引所アカウントをTres Financeに登録します。
⚠️ 実行ルール — 開始前にお読みください: このスキルは、厳密な順序に従うチェックリストです。記載されたとおりの順序で、すべてのステップに必ず従ってください。ステップを省略したり、まとめたり、順序を入れ替えたりしないでください。次のステップに進む前に、現在のステップが完全に完了していることを確認してください。API 呼び出しを伴うステップ(スキーマの取得、既存ウォレットの確認、一括変更)は必須です。時間を節約するため、または結果が明らかに思えるという理由で、決して省略しないでください。ステップを省略しようとしていることに気付いたら、いったん止まり、まずそのステップを実行してください。
ステップ 0 — ウォレットの種類を尋ねる
ほかの作業を始める前に、ask_user_input_v0を使って、追加したいウォレットの種類をユーザーに尋ねます。
question: "What would you like to add to Tres?"
options:
- "On-Chain Wallets (Ethereum, Solana, Bitcoin, etc.)"
- "Exchange Accounts (Binance, Coinbase, Kraken, etc.)"
type: single_select
- ユーザーがオンチェーンウォレットを選択した場合 → [ON-CHAIN FLOW](ステップ OC-1)に進みます
- ユーザーが取引所アカウントを選択した場合 → [EXCHANGE FLOW](ステップ EX-1)に進みます
ON-CHAIN FLOW
ステップ OC-1 — 入力方法を尋ねる
ask_user_input_v0を使って、オンチェーンウォレットをどのように入力するかユーザーに尋ねます。
question: "How would you like to add your wallets?"
options:
- "Upload a file (CSV or Excel)"
- "Enter manually in a table"
type: single_select
ユーザーの回答を待ってから、ステップ OC-2 の該当する選択肢に進みます。
ステップ OC-2 — ウォレットデータを収集する
選択肢 A:ファイルのアップロード
ユーザーが「ファイルをアップロード」を選択した場合(または CSV ファイルや Excel ファイルを直接アップロードした場合):
/mnt/user-data/uploads/から pandas / openpyxl を使ってファイルを読み込みます- 想定される列(柔軟に対応):
name、address(またはidentifier)、network(またはplatform)、tags(任意)、description(任意) - ヘッダー名を正規化し(大文字小文字を区別せず、空白を削除し、別名にも対応)、ウォレット辞書のリストに解析してから、ステップ OC-3 に進みます
選択肢 B:簡単な手動入力(会話形式)
ユーザーが「表に手動で入力」を選択した場合:
- **HTML ウィジェットを表示しないでください。**代わりに、次の形式でウォレットを1行ずつプレーンテキストで入力するようユーザーに依頼します。
例:Name | Address | Network | Tags (optional)Treasury Hot | 0xABCD...1234 | ETHEREUM | defi,treasury Cold Storage | bc1q...xyz | BITCOIN | - ユーザーがウォレットを貼り付けたら、各行をウォレット辞書のリストに解析してから、ステップ OC-4 に進みます。
- ネットワーク名がわからない場合は、わかる範囲で入力するよう伝え、正しい
ParentPlatform値にファジーマッチングします。
ステップ OC-3 — スキーマから最新のプラットフォーム一覧を取得する
必ず、TRES MCP スキーマからParentPlatformの列挙値を最新の状態で取得してください。決してハードコードしないでください。次を使用します。
# Via TRES MCP introspect tool:
introspect("ParentPlatform")
これにより、ネットワークのドロップダウンと検証に使用する、有効な列挙値の全一覧が返されます。
取引所とオンチェーンウォレットの識別
ParentPlatformの一覧をオンチェーンプラットフォームのみに絞り込むには、既知の取引所またはカストディアンに該当する値を除外します。サポート対象の取引所の正式な最新一覧は、Exchange Flow(ステップ EX-1)で取得します。オンチェーンフィルターのローカルなヒューリスティックとして、次の値を除外してください。
ANCHORAGE, AQUANOW, ASCENDEX, B2C2, BACKPACK, BINANCE_EXCHANGE, BINANCE_EXCHANGE_TR,
BITCOIN_SUISSE, BITFINEX, BITGET, BITGO, BITMEX, BITSO, BITSTAMP, BITVAVO, BREX,
BTC_MARKETS, BTCTURK, BULLISH, BYBIT, CEFFU, CIRCLE, COBO, COINBASE, COINBASE_COMMERCE,
COINBASE_EXCHANGE, COINBASE_INTERNATIONAL, COINBASE_PRIME, COINEX, COPPER, CRYPTOCOM,
CRYPTOCOM_EXCHANGE, CUSTOMERS_BANK, DERIBIT, EQUALSMONEY, FALCONX, FIDELITY,
FIFTH_THIRD_BANK, FIREBLOCKS, FORDEFI_UTXO, FTX, FTXUS, GATEIO, GEMINI, HITBTC, HTX,
KRAKEN, KRAKEN_CUSTODY, KRAKEN_FUTURES, KUCOIN, LAYERONE, LEDGER_ENTERPRISE, LMAX,
LUKKA, M2, MERCADO, MERCURY, MERCURY_TREASURY, MEOW, MEOW_TREASURY, MESH_PAYMENTS,
MORGAN_STANLEY, NONCO, OKX, PAXFUL, PARADEX, QONTO, QREDO, REVOLUT_FR, REVOLUT_UK,
SVB_GO, SVB_ONLINE, SYGNUM, TALOS, VERTEX, WHITEBIT, WINTERMUTE, WISE_US,
BANK_HAPOALIM_BIZ, BANK_HAPOALIM_INTERNATIONAL, BANK_OF_AMERICA,
BANQUE_POPULAIRE_RIVES_DE_PARIS, CHASE, CHECKOUT
この一覧に含まれないプラットフォームはすべて、標準的なブロックチェーンアドレスを必要とするオンチェーンウォレットとして扱います。
ステップ OC-4 — ウォレットを検証する
以下のチェックをすべて実行します。行ごとにエラーを収集し、早期に処理を中止しないでください。
必須フィールドのチェック
| フィールド | ルール |
|---|---|
name | 空でない文字列 |
identifier | 空でない文字列 |
parentPlatform | 有効なParentPlatform列挙値であること(最新のスキーマから取得) |
ネットワーク名の正規化
CSV のネットワーク名が小文字または大文字小文字混在の場合(例:tezos、Ethereum)、大文字に変換し、最も近い有効なParentPlatform列挙値にファジーマッチングします。プレビューに警告バナーを表示し、正規化したことを知らせてユーザーに確認を求めます。
ネットワークごとのアドレス形式の検証(オンチェーンのみ)
オンチェーンウォレットには、以下の正規表現ルールを適用します。取引所は対象外です。
| ネットワーク | ルール |
|---|---|
| ETHEREUM、BNB、POLYGON、AVALANCHE_*、ARBITRUM、OPTIMISM、BASE、FANTOM、MOONBEAM、およびその他のEVMチェーン | ^0x[0-9a-fA-F]{40}$ |
| BITCOIN | P2PKH 1...、P2SH 3...、またはBech32 bc1... — 25~62文字 |
| SOLANA | Base58、32~44文字:^[1-9A-HJ-NP-Za-km-z]{32,44}$ |
| TRON | ^T[1-9A-HJ-NP-Za-km-z]{33}$ |
| TEZOS | ^tz[123][1-9A-HJ-NP-Za-km-z]{33}$ |
| SUI、APTOS | ^0x[0-9a-fA-F]{62,64}$ |
| STELLAR | Gで始まる56文字 |
| RIPPLE | rで始まる25~34文字 |
| CARDANO | addr1で始まり、長さが50文字を超える |
| NEAR | .nearで終わる、または64文字の16進数 |
| TON | EQまたはUQで始まる48文字 |
| ALGORAND | 58文字の大文字Base32 |
ネットワークとアドレスの不一致検出
明らかな不一致(例:ネットワークがSOLANAなのにアドレスが0x...、またはETHEREUMなのにBitcoinアドレス)にフラグを付けます。
重複検出
バッチ内の重複:
同じ(identifier, parentPlatform)の組み合わせを持つ行にフラグを付けます。両方をエラーとしてマークします。
Tresに対する既存ウォレットの確認(200ウォレット以下のバッチ):
{
internalAccount(identifier_In: ["addr1", "addr2", ...]) {
results { id name identifier parentPlatform }
}
}
次のルックアップを作成します:key = identifier.toLowerCase() + "|" + parentPlatform.toUpperCase()
- 一致 → ⚠️ 警告(黄色)としてマークします:「Exists (ID: XXXXX)」— APIは重複登録せず、更新します
- サマリーバーには次のように表示します:
X new | Y already exist | Z errors
200ウォレットを超えるバッチでは、APIチェックをスキップし、プレビューに注記を表示します。
Step OC-5 — テキストプレビューを表示
🚫 HARD GATE: Step OC-4(検証)と既存ウォレットのTres APIチェックが両方とも完全に完了するまで、このプレビューを表示しないでください。APIチェックなしでプレビューを表示することは、このスキルへの違反です。
HTMLウィジェットは表示しないでください。 代わりに、ユーザーが確認できるよう、ウォレットデータをプレーンテキストのMarkdownテーブルとして表示します。
| # | Name | Address | Network | Tags | Status |
|---|------|---------|---------|------|--------|
| 1 | Treasury Hot | 0xABCD...1234 | ETHEREUM | defi | ✅ New |
| 2 | Cold Wallet | bc1q...xyz | BITCOIN | | ⚠️ Exists (ID: 12345) |
| 3 | Bad Wallet | invalid-addr | SOLANA | | ❌ Invalid address |
- サマリー行を表示します:
X new | Y already exist | Z errors - すべてのエラーを、行番号と説明とともにテーブルの下に一覧表示します:
Errors: - Row 3 (Bad Wallet): Invalid SOLANA address format - エラーがある場合は、続行する前にデータを修正して再貼り付けするようユーザーに伝えます
- 警告(既存ウォレット)のみの場合は、「アップロードする準備はできていますか?既存のウォレットは更新されます。確認するには yes と入力してください。」と尋ねます
- すべての行が有効な場合は、「N個のウォレットをTres Financeにアップロードする準備はできていますか?確認するには yes と入力してください。」と尋ねます
ユーザーが確認したら → Step OC-6に進みます。
Step OC-6 — 最終確認
ClaudeがTRES_WALLET_UPLOAD_CONFIRMED:を受け取ったら:
- JSONペイロードを解析します
- プレーンテキストで概要を提示します:
About to upload N wallets to Tres Finance: - 3 ETHEREUM wallets - 2 SOLANA wallets - 1 TEZOS wallet (will update existing) Shall I proceed? - ユーザーが明示的に確認(「yes」、「confirm」、「go ahead」)するまで待ちます
Step OC-7 — バッチアップロードを実行
TRES MCP経由でupdateBatchInternalAccountsを呼び出します。
mutation UpdateBatchInternalAccounts($internalAccounts: [InternalAccountInput]) {
updateBatchInternalAccounts(internalAccounts: $internalAccounts) {
internalAccounts {
id
name
identifier
parentPlatform
status
}
validationResults {
iaIdentifier
validationResult {
issueType
errorMessage
}
}
}
}
ウォレットごとの変数:
{
"name": "Treasury Hot",
"identifier": "0xABCD...",
"parentPlatform": "ETHEREUM",
"tags": ["defi", "treasury"],
"enforceCollectTransactions": true
}
注:オンチェーンウォレットにはplatformKeysは含まれません。
チャンク分割
バッチが100ウォレットを超える場合は、50件ずつに分割して順番に呼び出します。
結果の処理
validationResultsを解析し、issueType/errorMessageがあればユーザーに提示します- 成功数と失敗数を表示します
- 失敗がある場合は、失敗したウォレットだけを再試行するかユーザーに確認します
取引所フロー
Step EX-1 — はじめに・ガイド
統合ガイドのリンクをユーザーに表示します。
取引所に接続する前に、Tres Finance Exchange Integration Guideをご確認ください: 👉 https://help.tres.finance/article/integrating-your-exchange-accounts-with-tres-finance
次に、TRES MCPから検証済み取引所の最新リストを取得します。ハードコードしてはいけません。
query GetAllValidatedExchanges {
ledgerFilters {
allValidatedExchanges {
id
displayName
}
}
}
この処理では、サポート対象取引所の正式なリストが返されます(執筆時点では47件ですが、必ず最新情報を取得してください)。displayNameでA-Z順に並べ替えます。ask_user_input_v0を使うか、show_widgetフォーム内にインラインで配置してネイティブな<select>ドロップダウンとして提示し、TresのUIにならって、ラベルの横に「Connection Guidelines ↗」リンクを表示します。
Step EX-2 — 選択した取引所の必須フィールドを取得する
ユーザーが取引所を選択したら、その認証情報フィールドを取得します。exchangeName には id の値(小文字)を使用してください。
query ExchangeRequiredFields {
exchangeRequiredFields {
requiredFields(exchangeName: "<exchange_id_lowercase>") {
name
type
description
mapping
}
}
}
重要: mapping が https:// で始まるフィールドはスキップしてください。これらは認証情報の入力項目ではなく、連携ガイドへのリンクです。代わりに、クリック可能なリンクとして表示してください。
残りのフィールドを保存します。各フィールドは以下のとおりです。
name— 認証情報フィールドのキーdescription— ユーザーに表示するわかりやすいラベルmapping—platformKeysの構築時に使用するキー(例:platform_keys.api_key)type— 入力タイプの判定に使用します
Step EX-3 — 取引所の認証情報を収集する(会話形式)
HTML ウィジェットは表示しないでください。 代わりに、会話形式でユーザーに認証情報を尋ねます。
まず、連携ガイドのリンクを表示します。
📖 接続する前に、ガイドを確認してください:https://help.tres.finance/article/integrating-your-exchange-accounts-with-tres-finance
次に、必要な項目を明確に示しながら、1つずつ(または1回のプロンプトでまとめて)尋ねます。
To connect <Exchange Name>, I need the following:
**Account Name** (required) — a friendly name for this account in Tres
**API Key** (required)
**API Secret** (required, will be stored securely)
**Tags** (optional) — comma-separated tags
Please provide these values. Keep API secrets private — do not share them in public channels.
field.nameに「secret」、「private」、「signing」、「passphrase」のいずれかが含まれるフィールドについては、安全に保管されることを伝えてください- 任意のフィールド(例:OKX のサブアカウント)には、
(optional)と明記してください mappingがhttps://で始まるフィールドはスキップし、代わりにリンクとして表示してください
必須の確認事項(続行前に「はい/いいえ」で質問する)
認証情報を受け取る前に、次の項目を確認してください。
- 「API キーに読み取り専用の権限が設定されていることを確認しますか?(はい/いいえ)」
- 「Tres Finance の利用規約に同意しますか?(はい/いいえ)」
両方の確認が取れた場合にのみ、続行してください。
すべての認証情報と確認事項を収集したら、キュー形式で保存し、Step EX-4 に進みます。
Step EX-4 — 取引所アカウントを蓄積する
取引所の認証情報を収集した後:
- アカウントデータを解析し、保留中のキューに保存します
- 次のように確認します:
✅ <accountName> (<exchange>) added to queue - 現在のキューを簡潔なリストで表示します:
Queued accounts: 1. My Binance Account (BINANCE_EXCHANGE) - 次のように尋ねます:「別の取引所を追加しますか、それともアップロードに進みますか?」
別の取引所を追加する場合 → Step EX-1 に戻ります(キュー内のアカウントは保持されます)。 続行する場合 → Step EX-5 に進みます。
Step EX-5 — 最終確認と承認
キューにあるすべてのアカウントの概要をプレーンテキストで表示します。
Ready to connect the following exchange accounts to Tres Finance:
1. My Binance Account (BINANCE_EXCHANGE)
2. Kraken Main (KRAKEN)
Shall I proceed?
ユーザーから明示的な確認(「はい」、「確認しました」、「進めてください」など)があるまで待ちます。
Step EX-6 — 取引所アカウントの作成を実行する
キューにあるすべてのアカウントについて、TRES MCP 経由で updateBatchInternalAccounts を呼び出します。
mutation UpdateBatchInternalAccounts($internalAccounts: [InternalAccountInput]) {
updateBatchInternalAccounts(internalAccounts: $internalAccounts) {
internalAccounts {
id
name
identifier
parentPlatform
status
}
validationResults {
iaIdentifier
validationResult {
issueType
errorMessage
}
}
}
}
取引所アカウントごとの変数:
{
"name": "<accountName>",
"identifier": "<accountName>",
"parentPlatform": "<EXCHANGE_ID_UPPERCASE>",
"tags": ["<tag1>"],
"enforceCollectTransactions": true,
"platformKeys": "{\"api_key\": \"...\", \"api_secret\": \"...\"}"
}
重要:
identifier= アカウント名(取引所の場合、ブロックチェーンアドレスは不要です)platformKeys= オブジェクトではなく JSON 文字列です。フォームで収集したfield.mapping→ 値のペアから構築しますparentPlatform= 取引所のidを大文字にしたもの(例:binance_exchange→BINANCE_EXCHANGE)- 可能な場合、すべてのアカウントを1回のバッチ呼び出しで処理します
結果の処理
- アカウントごとに成功または失敗を表示します
- 失敗した場合は
issueTypeとerrorMessageを表示します - 失敗したアカウントの再試行を提案します
エラーメッセージと復旧
| 状況 | 対応方法 |
|---|---|
CSV に address 列がない | ウォレットアドレスが含まれる列をユーザーに指定してもらいます |
| ネットワーク名が不明 | 最も近い ParentPlatform 列挙値をあいまい検索し、警告バナーを表示してユーザーに確認します |
| アドレス形式が無効 | プレビューでエラーとして表示します。アップロードする前に、ユーザーがその行を修正または削除する必要があります |
| バッチ内で重複している | 両方の行をエラーとして表示します。ユーザーは一方を削除または修正する必要があります |
| ウォレットがすでに Tres に存在する | ⚠️ 警告(黄色)として表示して続行します。API が更新します |
| ファイルがなく、入力されたウォレットもない | ファイルをアップロードするか、手動入力テーブルを使用するようユーザーに促します |
| バッチ内のウォレットが 200 件を超える | 既存ウォレットの API チェックをスキップし、情報メッセージを表示します |
| MCP の変更操作でエラーが返された | ウォレットごとにエラーを表示し、再試行を提案します |
| 取引所の認証情報が拒否された | 検証エラーを表示し、認証情報を再入力するようユーザーに促します |
exchangeRequiredFields が空を返す | この取引所では手動設定が必要な場合があることをユーザーに知らせ、ガイドへのリンクを表示します |
allValidatedExchanges が空を返す | ユーザーに知らせて https://help.tres.finance へのリンクを表示する方法に切り替えます |