Skip to content
Back to skills

Coinbase Agentkit

ASecurity

Coinbase AgentKit — build AI agents with onchain capabilities. Wallet creation/management, token transfers, swaps, contract deployment, NFT minting, and ENS registration. Framework integrations with LangChain and Vercel AI SDK. Supports Base, Ethereum, Arbitrum, and Polygon.

  • 7 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 9, 2026
ai-agentstypescriptgobashreactnodenodejstestinggitapisecurity

Works with

  • cli
  • api
  • mcp

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned June 9, 2026

npx -y skills add aomi-labs/skills --skill coinbase-agentkit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Coinbase Agentkit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Coinbase Agentkit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aomi-labs-coinbase-agentkit/badge)](https://www.skillsdirectory.com/skills/aomi-labs-coinbase-agentkit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: coinbase-agentkit
description: "Coinbase AgentKit — build AI agents with onchain capabilities. Wallet creation/management, token transfers, swaps, contract deployment, NFT minting, and ENS registration. Framework integrations with LangChain and Vercel AI SDK. Supports Base, Ethereum, Arbitrum, and Polygon."
license: Apache-2.0
metadata:
  author: 0xinit
  version: "1.0"
  chain: multichain
  category: AI Agents
tags:
  - coinbase
  - agentkit
  - cdp
  - ai-agents
  - onchain
---

# Coinbase AgentKit

AgentKit is Coinbase's open-source framework for building AI agents with onchain capabilities. It provides wallet management, 50+ built-in actions (transfers, swaps, contract deployment, NFT minting), and integrations with LangChain, Vercel AI SDK, and Model Context Protocol. Framework-agnostic and wallet-agnostic — works with CDP wallets, Viem, Privy, and ZeroDev.

Source: https://github.com/coinbase/agentkit

## What You Probably Got Wrong

> LLMs have stale training data. These are the most common mistakes.

- **`cdp-agentkit-nodejs` is deprecated** → The old `@coinbase/cdp-agentkit-core` and `@coinbase/cdp-langchain` packages are retired. The current package is `@coinbase/agentkit` with framework extensions `@coinbase/agentkit-langchain` and `@coinbase/agentkit-vercel-ai-sdk`. If you see imports from `cdp-agentkit`, you are using the deprecated SDK.
- **"CdpWalletProvider" is the class name** → It was renamed to `CdpEvmWalletProvider` in v0.1+. There is also `CdpSmartWalletProvider` for smart contract wallets and `CdpV2SolanaWalletProvider` for Solana. Using the old name will fail.
- **"AgentKit needs an OpenAI key"** → AgentKit itself is model-agnostic. It creates tools/actions that any LLM framework can call. You only need an OpenAI key if you use LangChain with `ChatOpenAI`. It works equally well with Anthropic, Google, or local models.
- **"npm install agentkit"** → The correct package is `@coinbase/agentkit`. The scoped name is required.
- **Node.js 18 is fine** → AgentKit requires Node.js v22+. Earlier versions will fail silently or throw runtime errors.
- **"AgentKit only works on Base"** → AgentKit supports any EVM network and Solana. Base has the deepest protocol integrations (Basename, Compound, Morpho), but wallet operations work on Ethereum, Arbitrum, Polygon, Optimism, and more.
- **Using `AgentKit.from()` with no config** → Default setup uses `CdpEvmWalletProvider` and requires `CDP_API_KEY_ID` and `CDP_API_KEY_SECRET` environment variables. Without them, initialization throws a cryptic error about missing credentials.
- **Hardcoding private keys** → `ViemWalletProvider` accepts a private key for local testing, but production agents must use `CdpEvmWalletProvider` or `CdpSmartWalletProvider` where keys are managed by CDP infrastructure.

## Installation

```bash
npm install @coinbase/agentkit
```

With LangChain integration:

```bash
npm install @coinbase/agentkit @coinbase/agentkit-langchain @langchain/langgraph @langchain/openai
```

With Vercel AI SDK:

```bash
npm install @coinbase/agentkit @coinbase/agentkit-vercel-ai-sdk ai @ai-sdk/openai
```

Scaffold a complete project:

```bash
npm create onchain-agent@latest
```

### Requirements

- Node.js v22+
- CDP Secret API Key (from https://portal.cdp.coinbase.com)
- TypeScript with `emitDecoratorMetadata: true` in tsconfig (for custom actions)

## CDP API Key Setup

1. Go to https://portal.cdp.coinbase.com
2. Create a project or select an existing one
3. Navigate to API Keys and create a new Secret API Key
4. Save both the Key ID and Key Secret

Set environment variables:

```bash
export CDP_API_KEY_ID="your-key-id"
export CDP_API_KEY_SECRET="your-key-secret"
```

Or use a `.env` file (never commit this):

```
CDP_API_KEY_ID=your-key-id
CDP_API_KEY_SECRET=your-key-secret
```

## Wallet Providers

AgentKit is wallet-agnostic. Choose a provider based on your security and UX requirements.

### CdpEvmWalletProvider

CDP-managed wallets. Keys are stored and signed server-side by Coinbase infrastructure. Best for production agents.

```typescript
import { CdpEvmWalletProvider } from "@coinbase/agentkit";

const wallet = await CdpEvmWalletProvider.configureWithWallet({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
  networkId: "base-sepolia",
});

console.log("Wallet address:", wallet.getAddress());
console.log("Network:", wallet.getNetwork().networkId);
```

Persist and restore wallet state across sessions:

```typescript
const exportedData = wallet.exportWallet();
const serialized = JSON.stringify(exportedData);

const restored = await CdpEvmWalletProvider.configureWithWallet({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
  cdpWalletData: JSON.parse(serialized),
});
```

### CdpSmartWalletProvider

ERC-4337 smart contract wallets with gasless transactions via paymasters. Ideal for agents that need sponsored gas.

```typescript
import { CdpSmartWalletProvider } from "@coinbase/agentkit";

const smartWallet = await CdpSmartWalletProvider.configureWithWallet({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
  networkId: "base-sepolia",
  paymasterUrl: process.env.PAYMASTER_URL,
});
```

### ViemWalletProvider

Use any viem-compatible wallet. Useful for local development and testing where you control the private key.

```typescript
import { ViemWalletProvider } from "@coinbase/agentkit";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { baseSepolia } from "viem/chains";

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const client = createWalletClient({
  account,
  chain: baseSepolia,
  transport: http(),
});

const wallet = new ViemWalletProvider(client);
```

### PrivyWalletProvider

Privy server wallets for applications that already use Privy for auth.

```typescript
import { PrivyWalletProvider } from "@coinbase/agentkit";

const wallet = await PrivyWalletProvider.configureWithWallet({
  appId: process.env.PRIVY_APP_ID,
  appSecret: process.env.PRIVY_APP_SECRET,
  networkId: "base-sepolia",
});
```

## Core: AgentKit Initialization

```typescript
import { AgentKit } from "@coinbase/agentkit";

const agentKit = await AgentKit.from({
  walletProvider: wallet,
  actionProviders: [
    walletActionProvider(),
    erc20ActionProvider(),
    cdpApiActionProvider({
      apiKeyId: process.env.CDP_API_KEY_ID,
      apiKeySecret: process.env.CDP_API_KEY_SECRET,
    }),
  ],
});
```

If no `walletProvider` or `actionProviders` are specified, AgentKit defaults to `CdpEvmWalletProvider` with `walletActionProvider`.

## Action Providers

Action providers define what an agent can do onchain. Each provider groups related actions.

### Wallet Actions

```typescript
import { walletActionProvider } from "@coinbase/agentkit";

const actions = walletActionProvider();
```

Provides: `getBalance`, `getWalletDetails`, `nativeTransfer`

### ERC20 Token Actions

```typescript
import { erc20ActionProvider } from "@coinbase/agentkit";

const actions = erc20ActionProvider();
```

Provides: `getBalance`, `transfer`, `approve`, `getAllowance`

### ERC721 NFT Actions

```typescript
import { erc721ActionProvider } from "@coinbase/agentkit";

const actions = erc721ActionProvider();
```

Provides: `mint`, `transfer`, `getBalance`

### WETH Actions

```typescript
import { wethActionProvider } from "@coinbase/agentkit";

const actions = wethActionProvider();
```

Provides: `wrapEth` (ETH to WETH)

### CDP API Actions

Requires CDP API credentials. Provides access to Coinbase's swap and faucet APIs.

```typescript
import { cdpApiActionProvider } from "@coinbase/agentkit";

const actions = cdpApiActionProvider({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
});
```

Provides: `requestFaucet`, `tradeTokens` (swap via CDP API)

### Compound Actions

```typescript
import { compoundActionProvider } from "@coinbase/agentkit";

const actions = compoundActionProvider();
```

Provides: `supply`, `withdraw`, `borrow`, `repay`, `getPortfolio`

### Morpho Actions

```typescript
import { morphoActionProvider } from "@coinbase/agentkit";

const actions = morphoActionProvider();
```

Provides: `deposit`, `withdraw`

### Pyth Price Feed Actions

```typescript
import { pythActionProvider } from "@coinbase/agentkit";

const actions = pythActionProvider();
```

Provides: `fetchPrice` (real-time price data from Pyth oracles)

### Basename Actions

Register and manage Base names (ENS equivalent on Base).

```typescript
import { basenameActionProvider } from "@coinbase/agentkit";

const actions = basenameActionProvider();
```

Provides: `registerBasename`

### Social Actions

```typescript
import { twitterActionProvider } from "@coinbase/agentkit";
import { farcasterActionProvider } from "@coinbase/agentkit";

const twitter = twitterActionProvider();
const farcaster = farcasterActionProvider();
```

Twitter provides: `postTweet`, `getAccountDetails`
Farcaster provides: `postCast`, `getAccountDetails`

### Additional Providers

| Provider | Actions |
|----------|---------|
| `openseaActionProvider` | `listNft`, `getNftBalance` |
| `superfluidActionProvider` | `createFlow`, `updateFlow`, `deleteFlow` |
| `moonwellActionProvider` | `supply`, `withdraw`, `borrow`, `repay` |
| `acrossActionProvider` | `bridgeTokens` (cross-chain bridge) |
| `defiLlamaActionProvider` | `getProtocolTvl`, `getProtocolList` |
| `jupiterActionProvider` | `swap` (Solana DEX aggregator) |
| `zeroXActionProvider` | `getQuote`, `swap` (0x aggregator) |
| `zoraActionProvider` | `createToken`, `mint` |
| `clankerActionProvider` | `deployToken` (Farcaster token deployment) |
| `wowActionProvider` | `createMemecoin`, `buyMemecoin`, `sellMemecoin` |
| `ensoActionProvider` | `routeSwap` |
| `fluidActionProvider` | `lend`, `borrow` |

## LangChain Integration

The most common integration pattern. Converts AgentKit actions into LangChain tools.

```typescript
import { AgentKit } from "@coinbase/agentkit";
import { getLangChainTools } from "@coinbase/agentkit-langchain";
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { MemorySaver } from "@langchain/langgraph";

const agentKit = await AgentKit.from({
  walletProvider: wallet,
  actionProviders: [
    walletActionProvider(),
    erc20ActionProvider(),
    cdpApiActionProvider({
      apiKeyId: process.env.CDP_API_KEY_ID,
      apiKeySecret: process.env.CDP_API_KEY_SECRET,
    }),
  ],
});

const tools = await getLangChainTools(agentKit);

const llm = new ChatOpenAI({ model: "gpt-4o" });
const memory = new MemorySaver();

const agent = createReactAgent({
  llm,
  tools,
  checkpointSaver: memory,
});

const result = await agent.invoke(
  { messages: [{ role: "user", content: "What is my wallet address?" }] },
  { configurable: { thread_id: "session-1" } }
);
```

## Vercel AI SDK Integration

```typescript
import { AgentKit } from "@coinbase/agentkit";
import { getVercelAITools } from "@coinbase/agentkit-vercel-ai-sdk";
import { openai } from "@ai-sdk/openai";
import { generateText } from "ai";

const agentKit = await AgentKit.from({ walletProvider: wallet });
const tools = await getVercelAITools(agentKit);

const { text } = await generateText({
  model: openai("gpt-4o"),
  tools,
  prompt: "Get my wallet balance on Base Sepolia",
  maxSteps: 5,
});
```

## Model Context Protocol (MCP)

AgentKit can run as an MCP server, exposing actions to any MCP-compatible client.

```bash
npm install @coinbase/agentkit-model-context-protocol
```

```typescript
import { AgentKit } from "@coinbase/agentkit";
import { getMcpTools } from "@coinbase/agentkit-model-context-protocol";

const agentKit = await AgentKit.from({ walletProvider: wallet });
const server = getMcpTools(agentKit);
server.listen();
```

## Custom Action Providers

Create domain-specific actions by extending `ActionProvider`.

Requires `emitDecoratorMetadata: true` in your `tsconfig.json`:

```json
{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  }
}
```

Define a custom action:

```typescript
import {
  ActionProvider,
  WalletProvider,
  Network,
  CreateAction,
} from "@coinbase/agentkit";
import { z } from "zod";

const CheckPriceSchema = z.object({
  tokenSymbol: z.string().describe("Token symbol to check price for"),
});

class PriceCheckerProvider extends ActionProvider<WalletProvider> {
  constructor() {
    super("price-checker", []);
  }

  @CreateAction({
    name: "check_price",
    description: "Check the current USD price of a token",
    schema: CheckPriceSchema,
  })
  async checkPrice(
    walletProvider: WalletProvider,
    params: z.infer<typeof CheckPriceSchema>
  ): Promise<string> {
    const response = await fetch(
      `https://api.coingecko.com/api/v3/simple/price?ids=${params.tokenSymbol}&vs_currencies=usd`
    );
    const data = await response.json();
    return JSON.stringify(data);
  }

  supportsNetwork(_network: Network): boolean {
    return true;
  }
}

export const priceCheckerProvider = () => new PriceCheckerProvider();
```

Register with AgentKit:

```typescript
const agentKit = await AgentKit.from({
  walletProvider: wallet,
  actionProviders: [
    walletActionProvider(),
    priceCheckerProvider(),
  ],
});
```

## Network Configuration

### Switching Networks

```typescript
const wallet = await CdpEvmWalletProvider.configureWithWallet({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
  networkId: "base-mainnet",
});
```

### Common Network IDs

| Network | ID |
|---------|-----|
| Base Mainnet | `base-mainnet` |
| Base Sepolia | `base-sepolia` |
| Ethereum Mainnet | `ethereum-mainnet` |
| Ethereum Sepolia | `ethereum-sepolia` |
| Arbitrum Mainnet | `arbitrum-mainnet` |
| Polygon Mainnet | `polygon-mainnet` |
| Solana Mainnet | `solana-mainnet` |
| Solana Devnet | `solana-devnet` |

### Custom RPC (ViemWalletProvider)

```typescript
import { defineChain } from "viem";

const customChain = defineChain({
  id: 84532,
  name: "Base Sepolia",
  nativeCurrency: { name: "ETH", symbol: "ETH", decimals: 18 },
  rpcUrls: {
    default: { http: ["https://your-rpc-url.com"] },
  },
});

const client = createWalletClient({
  account,
  chain: customChain,
  transport: http("https://your-rpc-url.com"),
});
```

## Security Model

### API Key Scoping

CDP API keys can be scoped to specific actions. In the CDP portal:
- Create separate keys for testnet vs mainnet
- Limit spending per key with rate limits
- Rotate keys regularly — old keys can be revoked instantly

### Wallet Export

CDP wallets can export private keys for migration, but this should be rare:

```typescript
const exportedWallet = wallet.exportWallet();
```

Once exported, the key material leaves CDP infrastructure. Handle with extreme care.

### Production Checklist

1. Use `CdpEvmWalletProvider` or `CdpSmartWalletProvider` (not Viem with raw keys)
2. Set spending limits on CDP API keys
3. Use separate API keys for testnet and mainnet
4. Store `CDP_API_KEY_SECRET` in a secrets manager (not `.env` in production)
5. Enable webhook notifications for wallet activity
6. Implement transaction approval logic before signing high-value transactions
7. Use `CdpSmartWalletProvider` with paymasters for gasless UX

## Testnet Faucet

Request testnet tokens via the CDP faucet action:

```typescript
import { cdpApiActionProvider } from "@coinbase/agentkit";

const cdpActions = cdpApiActionProvider({
  apiKeyId: process.env.CDP_API_KEY_ID,
  apiKeySecret: process.env.CDP_API_KEY_SECRET,
});
```

The `requestFaucet` action is available on Base Sepolia and Ethereum Sepolia.

## Quickstart: Scaffold a New Agent

The fastest way to start:

```bash
npm create onchain-agent@latest
cd my-onchain-agent
cp .env.example .env
# Fill in CDP_API_KEY_ID, CDP_API_KEY_SECRET, OPENAI_API_KEY
npm install
npm run dev
```

This creates a chatbot agent with wallet access, token operations, and LangChain integration out of the box.

## Common Patterns

### Check Balance Before Transfer

```typescript
const agentKit = await AgentKit.from({
  walletProvider: wallet,
  actionProviders: [walletActionProvider(), erc20ActionProvider()],
});

const tools = await getLangChainTools(agentKit);
const agent = createReactAgent({ llm, tools });

const result = await agent.invoke({
  messages: [{
    role: "user",
    content: "Check my ETH balance, and if I have more than 0.01 ETH, send 0.005 ETH to 0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
  }],
});
```

### Multi-Action Agent

```typescript
const agentKit = await AgentKit.from({
  walletProvider: wallet,
  actionProviders: [
    walletActionProvider(),
    erc20ActionProvider(),
    erc721ActionProvider(),
    wethActionProvider(),
    cdpApiActionProvider({
      apiKeyId: process.env.CDP_API_KEY_ID,
      apiKeySecret: process.env.CDP_API_KEY_SECRET,
    }),
    compoundActionProvider(),
    pythActionProvider(),
    basenameActionProvider(),
  ],
});
```

## Version History

| Version | Change |
|---------|--------|
| 0.2.x | Added Solana support, ZeroDev, Privy providers |
| 0.1.x | New architecture: `CdpEvmWalletProvider`, action provider system, framework extensions |
| Pre-0.1 | Legacy `@coinbase/cdp-agentkit-core` (deprecated) |

Last verified: February 2026 against `@coinbase/agentkit` v0.2.x

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.