はじめに
エージェントのミント
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つのトランザクションで同時に作成。既存のアセットは不要
- ホスト型API —
https://api.metaplex.comがメタデータの保存を担当。ミント前の個別アップロード不要 - 2つのSDK関数 — ワンコールフローには
mintAndSubmitAgent、手動署名制御にはmintAgent - マルチネットワーク — Solanaメインネット・devnet、Eclipse、Sonic、Fogoをサポート
- 必要要件 —
@metaplex-foundation/mpl-agent-registryv0.2.0+
作成するもの
Metaplex APIとmpl-agent-registry SDKを使用して作成した、Agent Identity PDAにリンクされたMPL CoreアセットであるオンチェーンAIエージェント。
クイックスタート
How It Works
Metaplex APIを通じたエージェントのミントは、SDKによって調整される3ステップのフローです。
- APIコール — SDKがエージェントの詳細を
https://api.metaplex.comのPOST /v1/agents/mintに送信します。APIはagentMetadataをオフチェーンに保存し、未署名のSolanaトランザクションを構築します。 - 未署名トランザクションの返却 — APIはトランザクションに署名せずに返します。秘密鍵は環境外に出ることはありません。APIは命令セットを構築するだけです。
- 署名と送信 — あなた(または
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バンドル。
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プログラムの命令を構築または読み取ることができません。
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-adapters の walletAdapterIdentity | Phantom、BackpackなどのウェブdApp |
各アプローチの完全なコード例(ファイルシステムキーペアの読み込み方法やウォレットアダプターの接続方法を含む)については、Umiドキュメントのウォレットの接続を参照してください。
Mint and Submit an Agent
mintAndSubmitAgent はMetaplex APIを呼び出し、返されたトランザクションに署名し、1ステップでネットワークに送信します。ほとんどの統合にはこれを使用してください。
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 はトランザクションを送信せずに未署名のまま返します。優先手数料の追加、ハードウェアウォレットの使用、カスタムリトライロジックの統合が必要な場合に使用してください。
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のライフサイクルフックがアタッチされます。これらが確認すべきシグナルです。
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を参照してください。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
type | string | はい | スキーマ識別子。'agent' を使用してください。 |
name | string | はい | エージェントの表示名 |
description | string | はい | エージェントの機能と操作方法 |
services | AgentService[] | いいえ | エージェントが公開するサービスエンドポイント |
registrations | AgentRegistration[] | いいえ | 外部レジストリエントリへのリンク |
supportedTrust | string[] | いいえ | サポートする信頼メカニズム(例:'tee'、'reputation') |
Agent Service フィールド
services の各エントリはエージェントとのやり取りの1つの方法を説明します。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | サービスタイプ(例:'trading'、'chat'、'MCP'、'A2A') |
endpoint | string | はい | サービスにアクセスできるURL |
Supported Networks
入力オブジェクトで network の値を渡します。省略した場合は 'solana-mainnet' がデフォルトになります。選択したネットワークにUmiのRPCエンドポイントが一致していることを確認してください。
| ネットワーク | network の値 |
|---|---|
| Solanaメインネット | solana-mainnet(デフォルト) |
| Solana Devnet | solana-devnet |
| Localnet | localnet |
| Eclipseメインネット | eclipse-mainnet |
| Sonicメインネット | sonic-mainnet |
| Sonic Devnet | sonic-devnet |
| Fogoメインネット | fogo-mainnet |
| Fogoテストネット | fogo-testnet |
Devnet Testing
メインネットに移行する前にSolana devnetで統合をテストします。UmiインスタンスをdevnetのRPCに向け、network: 'solana-devnet' を渡すことで、APIがdevnetクラスターにエージェントを登録します。devnetでミントされたエージェントはメインネットとは別のアセットアドレスを持ち、メインネットのエクスプローラーには表示されません。
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をターゲットにできます。非本番環境に統合する場合に使用してください。
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バンドルチップ、優先手数料、カスタム確認ポーリングを追加する場合に適しています。
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は型付きエラーガードをエクスポートしており、汎用エラーをキャッチするのではなく、各障害モードを明示的に処理できます。
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 フィールドがすべて提供されていることを確認してください |
isAgentApiNetworkError | APIエンドポイントに到達できない | ネットワーク接続を確認し、err.cause で根本的なエラーを調べてください |
isAgentApiError | APIが2xx以外のステータスを返した | err.statusCode と err.responseBody を確認し、uri が公開アクセス可能であることを確認してください |
| ブロックハッシュ期限切れ | ブロックハッシュが期限切れになる前にトランザクションが送信されなかった | mintAgent を再度呼び出して新しいトランザクションを取得し、送信を再試行してください |
ミント後に agentIdentities が空 | トランザクション確認済みだがIDプラグインがアタッチされていない | トランザクションレシートを確認し、成功したか確認してください。サイレントに失敗した場合は、ミント全体を再試行してください |
Full Example
設定、ミント、確認を含む完全なエンドツーエンドのスニペットです。コピーしてすぐに実行できます。
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-registryv0.2.0+が必要です。
FAQ
mintAndSubmitAgent と mintAgent の違いは何ですか?
mintAndSubmitAgent は mintAgent を呼び出した後、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によるミントに追加のプロトコル手数料はありません。
