はじめに

エージェントのミント

Last updated March 27, 2026

Metaplex APIとmpl-agent-registry SDKを使用して、単一の呼び出しでオンチェーンにAIエージェントを登録します。

Summary

Metaplex APIは、エージェントメタデータを保存し、未署名のSolanaトランザクションを返すホスト型エンドポイントを提供します。そのトランザクションに署名して送信することで、エージェントを表すMPL Coreアセットが作成され、単一のアトミック操作でAgent Identity PDAが登録されます。

  • 作成 — MPL CoreアセットとAgent Identity PDAを1つのトランザクションで同時に作成。既存のアセットは不要
  • ホスト型APIhttps://api.metaplex.com がメタデータの保存を担当。ミント前の個別アップロード不要
  • 2つのSDK関数 — ワンコールフローには mintAndSubmitAgent、手動署名制御には mintAgent
  • マルチネットワーク — Solanaメインネット・devnet、Eclipse、Sonic、Fogoをサポート
  • 必要要件@metaplex-foundation/mpl-agent-registry v0.2.0+

作成するもの

Metaplex APIとmpl-agent-registry SDKを使用して作成した、Agent Identity PDAにリンクされたMPL CoreアセットであるオンチェーンAIエージェント。

クイックスタート

  1. フローの理解
  2. SDKのインストール
  3. Umiインスタンスの設定
  4. ワンコールでのミントと登録
  5. 結果の確認

How It Works

Metaplex APIを通じたエージェントのミントは、SDKによって調整される3ステップのフローです。

  1. APIコール — SDKがエージェントの詳細を https://api.metaplex.comPOST /v1/agents/mint に送信します。APIは agentMetadata をオフチェーンに保存し、未署名のSolanaトランザクションを構築します。
  2. 未署名トランザクションの返却 — APIはトランザクションに署名せずに返します。秘密鍵は環境外に出ることはありません。APIは命令セットを構築するだけです。
  3. 署名と送信 — あなた(または mintAndSubmitAgent が自動的に)キーペアでトランザクションに署名してネットワークに送信します。オンチェーンでは、これにより単一のアトミック操作でCoreアセットが作成されAgent Identity PDAが登録されます。

2つのフィールド、2つの保存先

mintAndSubmitAgent または mintAgent を呼び出す際に、2つの異なるメタデータを提供します。

フィールド保存先目的
uriオンチェーン(Coreアセットのメタデータ内)公開ホストされたJSONファイルを指します。標準的なCoreアセットのURIと同様に機能します。
agentMetadataオフチェーン(Metaplex APIが保存)エージェントの機能、サービス、信頼モデルを記述します。レジストリによって検索用にインデックスされます。

どちらもミント時に設定され、エージェントを更新せずに独立して変更することはできません。

このガイドでは、新しいCoreアセットの作成とエージェントIDの登録を1つのトランザクションで行います。既にCoreアセットをお持ちで、IDをアタッチするだけの場合は、代わりにregisterIdentityV1を使用してください。

Prerequisites

ミントの前に以下が必要です。

  • Node.js 18以降
  • 資金のあるSolanaウォレットキーペア(このウォレットがトランザクション費用を支払い、エージェントのオーナーになります)
  • CoreアセットのNFTメタデータJSON用の公開アクセス可能な uri

Installation

3つの必要なパッケージをインストールします:Agent Registry SDK、コアUmiフレームワーク、RPCクライアントとトランザクション送信者を提供するデフォルトUmiバンドル。

Terminal
npm install @metaplex-foundation/mpl-agent-registry @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults

Umi Setup

UmiはSolanaプログラムとのやり取りに使用するMetaplexのJavaScriptフレームワークです。SDK関数を呼び出す前に、RPCエンドポイントとキーペアで設定してください。

mplAgentIdentity() プラグインは、Agent Identityプログラムの命令ビルダーとアカウントデシリアライザーをUmiインスタンスに登録します。これがないと、UmiはAgent Identityプログラムの命令を構築または読み取ることができません。

setup.ts
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults';
import { keypairIdentity } from '@metaplex-foundation/umi';
import { mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry';
// 優先するRPCにUmiを向ける
const umi = createUmi('https://api.mainnet-beta.solana.com')
.use(mplAgentIdentity());
// キーペアを読み込む(このウォレットがトランザクション費用を支払い、エージェントのオーナーになる)
const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes);
umi.use(keypairIdentity(keypair));

上記の例では keypairIdentity を使用しています(生の秘密鍵をUmiに直接読み込む方法)。これはサーバーサイドスクリプトやバックエンド統合の標準的なアプローチです。Umiは環境に応じて他の2つのIDパターンもサポートしています。

アプローチ方法最適な用途
生のキーペア(この例)keypairIdentity + createKeypairFromSecretKeyサーバーサイドスクリプト、バックエンド
ファイルシステムウォレットcreateSignerFromKeypair + signerIdentity(JSONキーファイル使用)ローカル開発とCLIツール
ブラウザウォレットアダプターumi-signer-wallet-adapterswalletAdapterIdentityPhantom、BackpackなどのウェブdApp

各アプローチの完全なコード例(ファイルシステムキーペアの読み込み方法やウォレットアダプターの接続方法を含む)については、Umiドキュメントのウォレットの接続を参照してください。

Mint and Submit an Agent

mintAndSubmitAgent はMetaplex APIを呼び出し、返されたトランザクションに署名し、1ステップでネットワークに送信します。ほとんどの統合にはこれを使用してください。

mintAndSubmitAgent.ts
1import { mintAndSubmitAgent, mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry'
2import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
3import { keypairIdentity } from '@metaplex-foundation/umi'
4
5const umi = createUmi('https://api.mainnet-beta.solana.com')
6 .use(mplAgentIdentity())
7
8const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
9umi.use(keypairIdentity(keypair))
10
11const result = await mintAndSubmitAgent(umi, {}, {
12 wallet: umi.identity.publicKey,
13 name: 'My AI Agent',
14 uri: 'https://example.com/agent-metadata.json', // Core asset NFT metadata URI
15 agentMetadata: { // Stored off-chain by the Metaplex API
16 type: 'agent',
17 name: 'My AI Agent',
18 description: 'An autonomous trading agent',
19 services: [
20 { name: 'trading', endpoint: 'https://myagent.ai/trade' },
21 ],
22 registrations: [],
23 supportedTrust: [],
24 },
25})
26
27console.log('Asset address:', result.assetAddress)
28console.log('Transaction signature:', result.signature)
29
30// Asset address: <base58 address>
31// Transaction signature: <base58 signature>

Mint an Agent with Manual Signing

mintAgent はトランザクションを送信せずに未署名のまま返します。優先手数料の追加、ハードウェアウォレットの使用、カスタムリトライロジックの統合が必要な場合に使用してください。

mintAgent.ts
1import {
2 mintAgent,
3 signAndSendAgentTransaction,
4 mplAgentIdentity,
5} from '@metaplex-foundation/mpl-agent-registry'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7import { keypairIdentity } from '@metaplex-foundation/umi'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com')
10 .use(mplAgentIdentity())
11
12const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
13umi.use(keypairIdentity(keypair))
14
15// Step 1: Call the API — returns the unsigned transaction and the pre-computed asset address
16const mintResult = await mintAgent(umi, {}, {
17 wallet: umi.identity.publicKey,
18 name: 'My AI Agent',
19 uri: 'https://example.com/agent-metadata.json',
20 agentMetadata: {
21 type: 'agent',
22 name: 'My AI Agent',
23 description: 'An autonomous trading agent',
24 services: [
25 { name: 'trading', endpoint: 'https://myagent.ai/trade' },
26 { name: 'analysis', endpoint: 'https://myagent.ai/analyze' },
27 ],
28 registrations: [
29 { agentId: 'agent-123', agentRegistry: 'my-registry' },
30 ],
31 supportedTrust: ['tee'],
32 },
33})
34
35console.log('Asset address:', mintResult.assetAddress)
36
37// Step 2: Sign and send using the SDK helper
38const signature = await signAndSendAgentTransaction(umi, mintResult)
39console.log('Confirmed signature:', signature)
40
41// Asset address: <base58 address>
42// Confirmed signature: <base58 signature>

Verify the Result

ミント後、CoreアセットをフェッチしてAgentIdentityプラグインを確認することで、エージェントIDが登録されたことを確認します。登録が成功すると、Transfer、Update、Executeのライフサイクルフックがアタッチされます。これらが確認すべきシグナルです。

verifyRegistration.ts
1import { fetchAsset } from '@metaplex-foundation/mpl-core'
2import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
3import { publicKey } from '@metaplex-foundation/umi'
4import { mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry'
5
6const umi = createUmi('https://api.mainnet-beta.solana.com')
7 .use(mplAgentIdentity())
8
9// Replace with the assetAddress returned by mintAndSubmitAgent or mintAgent
10const assetAddress = publicKey('YOUR_ASSET_ADDRESS')
11const assetData = await fetchAsset(umi, assetAddress)
12const agentIdentity = assetData.agentIdentities?.[0]
13
14console.log('Registration URI:', agentIdentity?.uri)
15console.log('Transfer hook active:', agentIdentity?.lifecycleChecks?.transfer)
16console.log('Update hook active:', agentIdentity?.lifecycleChecks?.update)
17console.log('Execute hook active:', agentIdentity?.lifecycleChecks?.execute)
18
19// Registration URI: https://example.com/agent-metadata.json
20// Transfer hook active: { __kind: 'Listen' }
21// Update hook active: { __kind: 'Listen' }
22// Execute hook active: { __kind: 'Listen' }

agentIdentities が undefined または空の場合、IDは登録されていません。トランザクションがサイレントに失敗したか、確認されなかった可能性があります。再試行する前に、オンチェーンでトランザクション署名を確認してください。

Agent Metadata Fields

agentMetadata オブジェクトはMetaplex APIに送信され、エージェントレコードとともにオフチェーンに保存されます。Coreアセットの uri(NFTメタデータファイル)とは別物です。詳細はHow It Worksを参照してください。

フィールド必須説明
typestringはいスキーマ識別子。'agent' を使用してください。
namestringはいエージェントの表示名
descriptionstringはいエージェントの機能と操作方法
servicesAgentService[]いいえエージェントが公開するサービスエンドポイント
registrationsAgentRegistration[]いいえ外部レジストリエントリへのリンク
supportedTruststring[]いいえサポートする信頼メカニズム(例:'tee''reputation'

Agent Service フィールド

services の各エントリはエージェントとのやり取りの1つの方法を説明します。

フィールド必須説明
namestringはいサービスタイプ(例:'trading''chat''MCP''A2A'
endpointstringはいサービスにアクセスできるURL

Supported Networks

入力オブジェクトで network の値を渡します。省略した場合は 'solana-mainnet' がデフォルトになります。選択したネットワークにUmiのRPCエンドポイントが一致していることを確認してください。

ネットワークnetwork の値
Solanaメインネットsolana-mainnet(デフォルト)
Solana Devnetsolana-devnet
Localnetlocalnet
Eclipseメインネットeclipse-mainnet
Sonicメインネットsonic-mainnet
Sonic Devnetsonic-devnet
Fogoメインネットfogo-mainnet
Fogoテストネットfogo-testnet

Devnet Testing

メインネットに移行する前にSolana devnetで統合をテストします。UmiインスタンスをdevnetのRPCに向け、network: 'solana-devnet' を渡すことで、APIがdevnetクラスターにエージェントを登録します。devnetでミントされたエージェントはメインネットとは別のアセットアドレスを持ち、メインネットのエクスプローラーには表示されません。

devnetTest.ts
1import { mintAndSubmitAgent, mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry'
2import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
3import { keypairIdentity } from '@metaplex-foundation/umi'
4
5const umi = createUmi('https://api.devnet.solana.com')
6 .use(mplAgentIdentity())
7
8const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
9umi.use(keypairIdentity(keypair))
10
11const result = await mintAndSubmitAgent(umi, {}, {
12 wallet: umi.identity.publicKey,
13 network: 'solana-devnet',
14 name: 'Test Agent',
15 uri: 'https://example.com/test-metadata.json',
16 agentMetadata: {
17 type: 'agent',
18 name: 'Test Agent',
19 description: 'A test agent on devnet',
20 services: [],
21 registrations: [],
22 supportedTrust: [],
23 },
24})
25
26console.log('Asset address:', result.assetAddress)
27console.log('Transaction signature:', result.signature)
28
29// Asset address: <base58 address>
30// Transaction signature: <base58 signature>

Custom API Base URL

設定引数(mintAgent または mintAndSubmitAgent の2番目のパラメーター)に baseUrl を渡すことで、ステージングまたはセルフホスト型APIをターゲットにできます。非本番環境に統合する場合に使用してください。

customApiUrl.ts
1import { mintAgent, mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry'
2import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
3import { keypairIdentity } from '@metaplex-foundation/umi'
4
5const umi = createUmi('https://api.mainnet-beta.solana.com')
6 .use(mplAgentIdentity())
7
8const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
9umi.use(keypairIdentity(keypair))
10
11const result = await mintAgent(
12 umi,
13 { baseUrl: 'https://staging-api.metaplex.com' },
14 {
15 wallet: umi.identity.publicKey,
16 name: 'My Agent',
17 uri: 'https://example.com/metadata.json',
18 agentMetadata: {
19 type: 'agent',
20 name: 'My Agent',
21 description: 'Agent targeting staging API',
22 services: [],
23 registrations: [],
24 supportedTrust: [],
25 },
26 }
27)
28
29console.log('Asset address:', result.assetAddress)
30
31// Asset address: <base58 address>

Custom Transaction Sender

mintAndSubmitAgent の4番目の引数として txSender 関数を渡すことで、独自の署名・送信インフラを使用できます。Jitoバンドルチップ、優先手数料、カスタム確認ポーリングを追加する場合に適しています。

customSender.ts
1import { mintAndSubmitAgent, mplAgentIdentity } from '@metaplex-foundation/mpl-agent-registry'
2import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
3import { keypairIdentity } from '@metaplex-foundation/umi'
4
5const umi = createUmi('https://api.mainnet-beta.solana.com')
6 .use(mplAgentIdentity())
7
8const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
9umi.use(keypairIdentity(keypair))
10
11const result = await mintAndSubmitAgent(
12 umi,
13 {},
14 {
15 wallet: umi.identity.publicKey,
16 name: 'My Agent',
17 uri: 'https://example.com/metadata.json',
18 agentMetadata: {
19 type: 'agent',
20 name: 'My Agent',
21 description: 'Agent with custom transaction sender',
22 services: [],
23 registrations: [],
24 supportedTrust: [],
25 },
26 },
27 {
28 txSender: async (tx) => {
29 const signed = await umi.identity.signTransaction(tx)
30 return myCustomSend(signed)
31 },
32 }
33)
34
35console.log('Asset address:', result.assetAddress)
36console.log('Transaction signature:', result.signature)
37
38// Asset address: <base58 address>
39// Transaction signature: <base58 signature>

Error Handling

SDKは型付きエラーガードをエクスポートしており、汎用エラーをキャッチするのではなく、各障害モードを明示的に処理できます。

errorHandling.ts
1import {
2 mintAgent,
3 isAgentApiError,
4 isAgentApiNetworkError,
5 isAgentValidationError,
6 mplAgentIdentity,
7} from '@metaplex-foundation/mpl-agent-registry'
8import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
9import { keypairIdentity } from '@metaplex-foundation/umi'
10
11const umi = createUmi('https://api.mainnet-beta.solana.com')
12 .use(mplAgentIdentity())
13
14const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
15umi.use(keypairIdentity(keypair))
16
17const input = {
18 wallet: umi.identity.publicKey,
19 name: 'My Agent',
20 uri: 'https://example.com/metadata.json',
21 agentMetadata: {
22 type: 'agent',
23 name: 'My Agent',
24 description: 'An autonomous agent',
25 services: [],
26 registrations: [],
27 supportedTrust: [],
28 },
29}
30
31try {
32 const result = await mintAgent(umi, {}, input)
33} catch (err) {
34 if (isAgentValidationError(err)) {
35 // Client-side validation failed before the API was called
36 console.error(`Validation error on field "${err.field}": ${err.message}`)
37 } else if (isAgentApiNetworkError(err)) {
38 // Could not reach the API endpoint
39 console.error('Network error:', err.message, err.cause)
40 } else if (isAgentApiError(err)) {
41 // API responded with a non-2xx status
42 console.error(`API error (${err.statusCode}): ${err.message}`)
43 console.error('Response body:', err.responseBody)
44 } else {
45 throw err
46 }
47}

Common Errors

最も頻繁な障害モードとその解決方法です。

エラー原因対処法
isAgentValidationError必須の入力フィールドが欠落または不正な形式err.field を確認し、必須の agentMetadata フィールドがすべて提供されていることを確認してください
isAgentApiNetworkErrorAPIエンドポイントに到達できないネットワーク接続を確認し、err.cause で根本的なエラーを調べてください
isAgentApiErrorAPIが2xx以外のステータスを返したerr.statusCodeerr.responseBody を確認し、uri が公開アクセス可能であることを確認してください
ブロックハッシュ期限切れブロックハッシュが期限切れになる前にトランザクションが送信されなかったmintAgent を再度呼び出して新しいトランザクションを取得し、送信を再試行してください
ミント後に agentIdentities が空トランザクション確認済みだがIDプラグインがアタッチされていないトランザクションレシートを確認し、成功したか確認してください。サイレントに失敗した場合は、ミント全体を再試行してください

Full Example

設定、ミント、確認を含む完全なエンドツーエンドのスニペットです。コピーしてすぐに実行できます。

fullExample.ts
1import {
2 mintAndSubmitAgent,
3 mplAgentIdentity,
4} from '@metaplex-foundation/mpl-agent-registry'
5import { fetchAsset } from '@metaplex-foundation/mpl-core'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7import { keypairIdentity } from '@metaplex-foundation/umi'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com')
10 .use(mplAgentIdentity())
11
12const keypair = umi.eddsa.createKeypairFromSecretKey(mySecretKeyBytes)
13umi.use(keypairIdentity(keypair))
14
15// 1. Mint the agent
16const result = await mintAndSubmitAgent(umi, {}, {
17 wallet: umi.identity.publicKey,
18 name: 'My AI Agent',
19 uri: 'https://example.com/agent-metadata.json',
20 agentMetadata: {
21 type: 'agent',
22 name: 'My AI Agent',
23 description: 'An autonomous trading agent',
24 services: [
25 { name: 'trading', endpoint: 'https://myagent.ai/trade' },
26 ],
27 registrations: [],
28 supportedTrust: [],
29 },
30})
31
32console.log('Asset address:', result.assetAddress)
33console.log('Tx signature:', result.signature)
34
35// 2. Verify the agent identity was registered
36const assetData = await fetchAsset(umi, result.assetAddress)
37const agentIdentity = assetData.agentIdentities?.[0]
38
39console.log('Registered:', agentIdentity !== undefined)
40console.log('Registration URI:', agentIdentity?.uri)
41
42// Asset address: <base58 address>
43// Tx signature: <base58 signature>
44// Registered: true
45// Registration URI: https://example.com/agent-metadata.json

Notes

  • mintAndSubmitAgent は呼び出しのたびに新しいCoreアセットを作成します。重複排除はありません。同じ入力で2回呼び出すと、2つの別々のエージェントが2つの異なるアセットアドレスに作成されます。
  • uri フィールドはCoreアセットのオンチェーンメタデータに保存され、公開アクセス可能なJSONドキュメントを指す必要があります。ホスト済みのメタデータURIがない場合は、まずファイルをArweaveや他の永続ストレージプロバイダーにアップロードしてください。
  • 新しいCoreアセットを作成せずに既存のCoreアセットにエージェントIDをアタッチするには、代わりにregisterIdentityV1を使用してください。
  • Metaplex APIのベースURLはデフォルトで https://api.metaplex.com です。APIキーは不要です。
  • ミントには標準のSolanaトランザクション手数料とCoreアセットアカウントおよびAgent Identity PDAのレント代がかかります。
  • @metaplex-foundation/mpl-agent-registry v0.2.0+が必要です。

FAQ

mintAndSubmitAgentmintAgent の違いは何ですか?

mintAndSubmitAgentmintAgent を呼び出した後、1ステップでトランザクションに署名して送信するラッパーです。手動の署名制御、カスタムトランザクション送信者、または送信前にトランザクションを検査する必要がある場合は、mintAgent を直接使用してください。

Metaplex APIを経由したミントと registerIdentityV1 を直接使用することの違いは何ですか?

Metaplex APIのフロー(mintAgent / mintAndSubmitAgent)は、単一のトランザクションでCoreアセットエージェントIDの両方を作成します。既存のCoreアセットは不要です。registerIdentityV1のアプローチは、既に所有しているMPL CoreアセットにIDプラグインをアタッチします。

uri フィールドと agentMetadata の違いは何ですか?

uri はCoreアセットのオンチェーンメタデータに直接保存されます。通常のNFTと同様に、公開ホストされたJSONファイルを指す必要があります。agentMetadata オブジェクトはMetaplex APIに送信され、エージェントレコードとともにオフチェーンに保存されます。どちらもミント時に設定されます。詳細はHow It Worksを参照してください。

mintAndSubmitAgent を呼び出す前にCoreアセットを作成する必要がありますか?

いいえ。APIはCoreアセットの作成とエージェントIDの登録を同時に行います。必要なのはウォレットアドレス、エージェント名、メタデータURI、agentMetadata オブジェクトだけです。

メインネットに移行する前にdevnetでテストできますか?

はい。入力に network: 'solana-devnet' を渡し、Umiインスタンスを https://api.devnet.solana.com に向けてください。

APIがトランザクションを返したが、送信がオンチェーンで失敗した場合はどうなりますか?

オンチェーンのトランザクション失敗は、CoreアセットとエージェントIDが登録されていないことを意味します。mintAgent を再度呼び出して新しいブロックハッシュで新しいトランザクションを取得し、再試行してください。

Metaplex APIはどのネットワークをサポートしていますか?

Solanaメインネット、Solana Devnet、Localnet、Eclipseメインネット、Sonicメインネット、Sonic Devnet、Fogoメインネット、Fogoテストネット。渡す正確な値についてはSupported Networksを参照してください。

エージェントのミントにはいくらかかりますか?

ミントには標準のSolanaトランザクション手数料とCoreアセットアカウントおよびAgent Identity PDAのレント代がかかります。Metaplex APIによるミントに追加のプロトコル手数料はありません。

Previous
Skill