mcpField
T
tres-wallets-upload

tres-wallets-upload

github.com/anthropicsその他4.8k50 回インストール2 週間前に更新
リポジトリ

tres-wallets-upload について

Tres Finance にウォレットや取引所アカウントを登録するためのエージェントスキルです。データ収集から検証、プレビュー、確認後のアップロードまでを順に案内します。

主な機能

  1. 01オンチェーンまたは取引所アカウント情報の収集
  2. 02CSV、Excel、手入力に対応
  3. 03ネットワーク、アドレス、重複の検証
  4. 04既存アカウントの照合とプレビュー
  5. 05確認済みデータの一括アップロードと結果報告

活用シーン

  1. 01表計算ファイルから複数のウォレットを登録
  2. 02Tres 内の既存ウォレットを照合して更新
  3. 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}$
BITCOINP2PKH 1...、P2SH 3...、またはBech32 bc1... — 25~62文字
SOLANABase58、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}$
STELLARGで始まる56文字
RIPPLErで始まる25~34文字
CARDANOaddr1で始まり、長さが50文字を超える
NEAR.nearで終わる、または64文字の16進数
TONEQまたはUQで始まる48文字
ALGORAND58文字の大文字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:を受け取ったら:

  1. JSONペイロードを解析します
  2. プレーンテキストで概要を提示します:
    About to upload N wallets to Tres Finance:
    - 3 ETHEREUM wallets
    - 2 SOLANA wallets
    - 1 TEZOS wallet (will update existing)
    
    Shall I proceed?
    
  3. ユーザーが明示的に確認(「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:// で始まるフィールドはスキップし、代わりにリンクとして表示してください
必須の確認事項(続行前に「はい/いいえ」で質問する)

認証情報を受け取る前に、次の項目を確認してください。

  1. 「API キーに読み取り専用の権限が設定されていることを確認しますか?(はい/いいえ)」
  2. 「Tres Finance の利用規約に同意しますか?(はい/いいえ)」

両方の確認が取れた場合にのみ、続行してください。

すべての認証情報と確認事項を収集したら、キュー形式で保存し、Step EX-4 に進みます。


Step EX-4 — 取引所アカウントを蓄積する

取引所の認証情報を収集した後:

  1. アカウントデータを解析し、保留中のキューに保存します
  2. 次のように確認します:✅ <accountName> (<exchange>) added to queue
  3. 現在のキューを簡潔なリストで表示します:
    Queued accounts:
    1. My Binance Account (BINANCE_EXCHANGE)
    
  4. 次のように尋ねます:「別の取引所を追加しますか、それともアップロードに進みますか?」

別の取引所を追加する場合 → 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 へのリンクを表示する方法に切り替えます

コメント