
Research
Shai-Hulud Descends to Hades: Miasma Worm Campaign Spreads with New PyPI Wave
Socket found 37 malicious PyPI wheels that abuse Python startup hooks to launch a Bun-powered credential stealer tied to Mini Shai-Hulud/Miasma.
@phantom/openclaw-plugin
Advanced tools
OpenClaw plugin that bridges tool calls to Phantom's MCP server for wallet operations.
⚠️ PREVIEW DISCLAIMER
This OpenClaw plugin is currently in preview and may break or change at any time without notice.
Always use a separate Phantom account specifically for testing with AI agents. These accounts should not contain significant assets.
Phantom makes no guarantees whatsoever around anything your agent may do using this plugin. Use at your own risk.
Direct integration with Phantom wallet for OpenClaw agents. This plugin wraps the Phantom MCP Server to provide seamless wallet operations including address retrieval, message signing, transaction signing, token transfers, and token swaps.
The Phantom OpenClaw Plugin provides native integration with Phantom wallet functionality. Instead of being a generic MCP bridge, it directly integrates the Phantom MCP Server tools as OpenClaw tools, providing a seamless experience for AI agents.
Get up and running in under 5 minutes:
Step 1: Get your App ID from phantom.com/portal
http://localhost:8080/callback as a redirect URLStep 2: Install the plugin
openclaw plugins install @phantom/openclaw-plugin
Step 3: Configure in ~/.openclaw/openclaw.json
{
"plugins": {
"enabled": true,
"entries": {
"phantom-openclaw-plugin": {
"enabled": true,
"config": {
"PHANTOM_APP_ID": "your_app_id_from_portal"
}
}
}
}
}
Step 4: Restart OpenClaw
Step 5: Test with your agent
Ask: "What are my Phantom wallet addresses?"
⚠️ Important: Use the same email address for both the Phantom Portal and OpenClaw authentication!
See Prerequisites below for detailed setup instructions.
@phantom/mcp-server for reliable wallet operationsBefore using this plugin, you must obtain an App ID from the Phantom Portal:
http://localhost:8080/callback as a redirect URLImportant: The email you use to sign in to the Phantom Portal must match the email you use when authenticating with the plugin. If these don't match, authentication will fail.
openclaw plugins install @phantom/openclaw-plugin
Configure the plugin in your OpenClaw configuration file (~/.openclaw/openclaw.json):
{
"plugins": {
"enabled": true,
"entries": {
"phantom-openclaw-plugin": {
"enabled": true,
"config": {
"PHANTOM_APP_ID": "your_app_id_from_portal"
}
}
}
}
}
PHANTOM_APP_ID (required): Your App ID from the Phantom PortalPHANTOM_CLIENT_SECRET (optional): Client secret for confidential clientsPHANTOM_CALLBACK_PORT (optional): OAuth callback port (default: 8080)PHANTOM_MCP_DEBUG (optional): Enable debug logging (set to "1")Note: Most users only need to provide PHANTOM_APP_ID. The other options are for advanced use cases.
DCR 404 During StartupIf startup fails with Failed to register OAuth client and status code 404, OpenClaw likely did not provide a valid PHANTOM_APP_ID to the plugin.
Verify your config is nested exactly at:
plugins.entries["phantom-openclaw-plugin"].config.PHANTOM_APP_ID
PHANTOM_APP_ID values are issued from phantom.com/portal.
The plugin exposes the following tools from the Phantom MCP Server:
get_wallet_addressesRetrieve wallet addresses for all supported blockchain chains.
Parameters:
derivationIndex (number, optional): Derivation index for the wallet (default: 0)Example:
{
"derivationIndex": 0
}
sign_messageSign an arbitrary message with the Phantom wallet.
Parameters:
message (string, required): The message to signnetworkId (string, required): Network identifier (e.g., "solana:mainnet", "eip155:1")derivationIndex (number, optional): Derivation index for the wallet (default: 0)Example:
{
"message": "Hello, Phantom!",
"networkId": "solana:mainnet",
"derivationIndex": 0
}
sign_transactionSign a blockchain transaction.
Parameters:
transaction (string, required): The transaction to sign (format depends on chain: base64url for Solana, RLP-encoded hex for Ethereum)networkId (string, required): Network identifier (e.g., "solana:mainnet", "eip155:1" for Ethereum mainnet)derivationIndex (number, optional): Derivation index for the wallet (default: 0)account (string, optional): Specific account address to use for simulation/signingExample:
{
"transaction": "base64url-encoded-transaction-data",
"networkId": "solana:mainnet",
"derivationIndex": 0
}
transfer_tokensTransfer SOL or SPL tokens on Solana. Builds, signs, and sends the transaction immediately.
Parameters:
networkId (string, required): Solana network identifier (e.g., "solana:mainnet", "solana:devnet")to (string, required): Recipient Solana addressamount (string, required): Transfer amount (e.g., "0.1" or "1000000")amountUnit (string, optional): Unit type - "ui" for human-readable (SOL/token units) or "base" for atomic units (lamports). Default: "ui"tokenMint (string, optional): SPL token mint address. Omit for SOL transfersdecimals (number, optional): Token decimals (optional for SPL tokens)derivationIndex (number, optional): Derivation index for the wallet (default: 0)createAssociatedTokenAccount (boolean, optional): Create destination ATA if missing (default: true)Example (SOL Transfer):
{
"networkId": "solana:mainnet",
"to": "H8FpYTgx4Uy9aF9Nk9fCTqKKFLYQ9KfC6UJhMkMDzCBh",
"amount": "0.1",
"amountUnit": "ui"
}
Example (SPL Token Transfer):
{
"networkId": "solana:devnet",
"to": "H8FpYTgx4Uy9aF9Nk9fCTqKKFLYQ9KfC6UJhMkMDzCBh",
"tokenMint": "So11111111111111111111111111111111111111112",
"amount": "1.5",
"amountUnit": "ui"
}
⚠️ Warning: This tool submits transactions immediately and irreversibly.
buy_tokenFetch a Solana swap quote from Phantom's quotes API. Optionally execute the swap immediately.
Parameters:
networkId (string, optional): Solana network identifier (default: "solana:mainnet")sellTokenIsNative (boolean, optional): Set true to sell native SOL (default: true if sellTokenMint not provided)sellTokenMint (string, optional): Mint address of the token to sell (omit if selling native SOL)buyTokenIsNative (boolean, optional): Set true to buy native SOL (default: false)buyTokenMint (string, optional): Mint address of the token to buy (omit if buying native SOL)amount (string, required): Sell amount (e.g., "0.5" or "500000000")amountUnit (string, optional): Unit type - "ui" for token units or "base" for atomic units. Default: "base"slippageTolerance (number, optional): Slippage tolerance in percent (0-100)execute (boolean, optional): If true, signs and sends the transaction immediately. Default: falsederivationIndex (number, optional): Derivation index for the wallet (default: 0)quoteApiUrl (string, optional): Phantom-compatible quotes API override for debugging only. Leave unset for normal use. Do not point this to Jupiter endpoints like https://lite-api.jup.ag/swap/v1/quote.Quote API Guardrail:
quoteApiUrl unset unless the user explicitly asks to debug quote endpoint behavior.Example:
{
"networkId": "solana:mainnet",
"sellTokenIsNative": true,
"buyTokenMint": "So11111111111111111111111111111111111111112",
"amount": "0.5",
"amountUnit": "ui",
"slippageTolerance": 1,
"execute": true
}
⚠️ Warning: When execute: true, this tool submits transactions immediately and irreversibly.
Network identifiers follow the CAIP-2/CAIP-10 format. Here are the supported networks:
solana:mainnetsolana:devnetsolana:testneteip155:1eip155:11155111eip155:137eip155:80002eip155:8453eip155:84532eip155:42161eip155:421614bip122:000000000019d6689c085ae165831e93sui:mainnetsui:testnetOn first use, the plugin will automatically initiate the Phantom OAuth flow:
https://connect.phantom.appSessions are stored securely in ~/.phantom-mcp/session.json with restricted permissions and persist across restarts. The plugin uses stamper keypair authentication which doesn't expire.
User: What are my wallet addresses?
Agent: Let me check your Phantom wallet addresses.
[Calls get_wallet_addresses]
User: Sign this message: "Verify ownership of my wallet"
Agent: I'll sign that message for you using your Phantom wallet.
[Calls sign_message with the message]
User: Sign this Solana transaction: [transaction data]
Agent: I'll sign that transaction with your Phantom wallet.
[Calls sign_transaction with the transaction data]
phantom-openclaw-plugin/
├── src/
│ ├── index.ts # Plugin entry point
│ ├── session.ts # Session management wrapper
│ ├── client/
│ │ └── types.ts # OpenClaw API types
│ └── tools/
│ └── register-tools.ts # Tool registration logic
├── skills/
│ └── phantom-wallet/ # Wallet operations skill
└── openclaw.plugin.json # Plugin manifest
For contributors or those testing unreleased versions.
Clone and build the plugin:
# From the phantom-connect-sdk repository root
yarn install
yarn workspace @phantom/mcp-server build
yarn workspace @phantom/openclaw-plugin build
Install locally into OpenClaw:
openclaw plugins install -l ./packages/phantom-openclaw-plugin
Configure in ~/.openclaw/openclaw.json:
{
"plugins": {
"enabled": true,
"entries": {
"phantom-openclaw-plugin": {
"enabled": true,
"config": {
"PHANTOM_APP_ID": "your_app_id_from_portal"
}
}
}
}
}
Verify installation:
openclaw plugins list
Test with an agent:
openclaw chat
> What are my Phantom wallet addresses?
# Build the plugin
yarn build
# Development mode with watch
yarn dev
# Type checking
yarn check-types
# Linting
yarn lint
# Format code
yarn prettier
openclaw.jsondist/ directory exists)@phantom/mcp-server are builtrm -rf ~/.phantom-mcp/session.jsonContributions are welcome! Please ensure:
yarn prettier)yarn build)yarn check-types)MIT
For issues or questions:
FAQs
OpenClaw plugin that bridges tool calls to Phantom's MCP server for wallet operations.
The npm package @phantom/openclaw-plugin receives a total of 17 weekly downloads. As such, @phantom/openclaw-plugin popularity was classified as not popular.
We found that @phantom/openclaw-plugin demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
Socket found 37 malicious PyPI wheels that abuse Python startup hooks to launch a Bun-powered credential stealer tied to Mini Shai-Hulud/Miasma.

Security News
RubyGems and Bundler 4.0.13 introduced an opt-in cooldown feature that delays newly published gems during dependency resolution.

Security News
pnpm 11.5 now recognizes npm staged publish approvals in release metadata, preventing those releases from being mistaken for lower-trust package publishes.