Skip to content

Create an XMTP agent

Create an XMTP agent that can use the signing capabilities provided by a signer. This signer links the agent to the appropriate EOA or SCW.

Create an EOA signer

Node
import { Agent } from '@xmtp/agent-sdk';
import { createSigner, createUser } from '@xmtp/agent-sdk/user';
import { getRandomValues } from 'node:crypto';
 
// Option 1: Create a local user + signer
const user = createUser('0xprivateKey');
const signer = createSigner(user);
 
const agent = await Agent.create(signer, {
  env: 'dev', // or 'production'
  dbEncryptionKey: getRandomValues(new Uint8Array(32)), // save it for later
});

Environment variables

The XMTP Agent SDK allows you to use environment variables (process.env) for easier configuration without modifying code.

Available variables:
VariablePurposeExample
XMTP_WALLET_KEYPrivate key for walletXMTP_WALLET_KEY=0x1234...abcd
XMTP_ENVXMTP network environment (local, dev, or production)XMTP_ENV=dev or XMTP_ENV=production
XMTP_DB_ENCRYPTION_KEYDatabase encryption key for the local database (32 bytes, hex)XMTP_DB_ENCRYPTION_KEY=0xabcd...1234

Using the environment variables, you can setup your agent in just a few lines of code:

Generate random keys

Node
import { generatePrivateKey } from 'viem';
import { getRandomValues } from 'node:crypto';
 
const walletKey = generatePrivateKey();
const encryptionKeyHex = getRandomValues(new Uint8Array(32));
 
console.log('Wallet key:', walletKey);
console.log('Encryption key:', encryptionKeyHex);

Use this script to generate random XMTP keys:

yarn gen:keys

Running the command will append keys to your existing .env file.

Use environment variables

Node
// Load variables from .env file
process.loadEnvFile('.env');
 
// Create agent using environment variables
const agent = await Agent.createFromEnv();

Configuration options

Configure an XMTP client

You can configure an XMTP client with these options passed to Agent.create:

Node
/**
 * Specify which XMTP environment to connect to. (default: `dev`)
 */
env?: 'local' | 'dev' | 'production';
/**
 * Add a client app version identifier that's included with API requests.
 * Production apps are strongly encouraged to set this value.
 *
 * You can use the following format: `appVersion: 'AGENT_NAME/AGENT_VERSION'`.
 * For example, `appVersion: 'alix/2.x'`
 *
 * If you have an agent and an app, it's best to distinguish them from each other by
 * adding `-agent` and `-app` to the names. For example:
 * - Agent: `appVersion: 'alix-agent/2.x'`
 * - App: `appVersion: 'alix-app/3.x'`
 *
 * Setting this value provides telemetry that shows which agents are using the
 * XMTP client SDK. This information can help XMTP core developers provide you with agent
 * support, especially around communicating important SDK updates, including
 * deprecations and required upgrades.
 */
appVersion?: string;
/**
 * apiUrl can be used to override the `env` flag and connect to a
 * specific endpoint
 */
apiUrl?: string;
/**
 * Path to the local DB
 *
 * There are 4 value types that can be used to specify the database path:
 *
 * - `undefined` (or excluded from the client options)
 *    The database will be created in the current working directory and is based on
 *    the XMTP environment and client inbox ID.
 *    Example: `xmtp-dev-<inbox-id>.db3`
 *
 * - `null`
 *    No database will be created and all data will be lost once the client disconnects.
 *
 * - `string`
 *    The given path will be used to create the database.
 *    Example: `./my-db.db3`
 *
 * - `function`
 *    A callback function that receives the inbox ID and returns a string path.
 *    Example: `(inboxId) => string`
 */
dbPath?: string | null | ((inboxId: string) => string);
/**
 * Encryption key for the local DB
 */
dbEncryptionKey?: Uint8Array;
/**
 * Allow configuring codecs for additional content types
 */
codecs?: ContentCodec[];
/**
 * Enable structured JSON logging
 */
structuredLogging?: boolean;
/**
 * Logging level
 */
loggingLevel?: LogLevel;

Create a smart contract wallet (SCW) signer

When working with smart contract wallets, you can create an XMTP agent using the wallet's seed or private key:

Node
import { Agent } from '@xmtp/agent-sdk';
import { createSigner, createUser } from '@xmtp/agent-sdk/user';
 
const walletData = await initializeWallet('wallet.json');
/* Create the signer using viem and parse the encryption key for the local db */
const user = createUser(walletData.seed as `0x${string}`);
const signer = createSigner(user);
 
// Create agent with SCW signer
const agent = await Agent.create(signer);
 
/* Add your own business logic here */