Skip to main content

Connect to MetaMask using JavaScript

Get started with MetaMask SDK in your JavaScript dapp. You can set up the SDK in the following ways:

JavaScript SDK Quickstart

Prerequisites

  • Node.js version 19 or later installed.
  • A package manager installed, such as npm, Yarn, pnpm, or bun.
  • MetaMask installed in your browser or on mobile.

Set up using a template

  1. Download the MetaMask SDK JavaScript template:

    npx degit MetaMask/metamask-sdk-examples/quickstarts/javascript metamask-javascript

    degit is a tool that enables cloning only the directory structure from a GitHub repository, without retrieving the entire repository.

  2. Navigate into the repository:

    cd metamask-javascript
    GitHub clone instead of degit?

    Clone the MetaMask SDK examples repository and navigate into the quickstarts/javascript directory:

    git clone https://github.com/MetaMask/metamask-sdk-examples
    cd metamask-sdk-examples/quickstarts/javascript

    Note: this will download the entire repository.

  3. Install dependencies:

    pnpm install
  4. Run the project:

    pnpm dev

You've successfully set up MetaMask SDK.

Set up manually

1. Install the SDK

Install the SDK in an existing JavaScript project:

npm install @metamask/sdk

2. Initialize the SDK

The following are examples of using the SDK in various JavaScript environments:

import { MetaMaskSDK } from '@metamask/sdk'

const MMSDK = new MetaMaskSDK({
dappMetadata: {
name: 'Example JavaScript dapp',
url: window.location.href,
// iconUrl: "https://mydapp.com/icon.png" // Optional
},
infuraAPIKey: process.env.INFURA_API_KEY,
})

These examples configure the SDK with the following options:

  • dappMetadata - Ensures trust by showing your dapp's name, url, and iconUrl during connection.

  • infuraAPIKey - Enables read-only RPC and load‑balancing.

3. Connect and use provider

Connect to MetaMask and get the provider for RPC requests:

const provider = MMSDK.getProvider()

const accounts = await MMSDK.connect()
console.log('Connected account:', accounts[0])

const result = await provider.request({
method: 'eth_accounts',
params: [],
})
console.log('eth_accounts result:', result)

MMSDK.connect() handles cross-platform connection (desktop and mobile), including deeplinking.

Use provider.request() for arbitrary JSON-RPC requests like eth_chainId or eth_getBalance, or for batching requests via metamask_batch.

Common SDK methods at a glance

MethodDescription
connect()Triggers wallet connection flow
connectAndSign({ msg: '...' })Connects and prompts user to sign a message
getProvider()Returns the provider object for RPC requests
provider.request({ method, params })Calls any Ethereum JSON‑RPC method
Batched RPCUse metamask_batch to group multiple JSON-RPC requests

Usage example

// 1. Connect and get accounts
const accounts = await MMSDK.connect()

// 2. Connect and sign in one step
const signResult = await MMSDK.connectAndSign({
msg: 'Sign in to Dapp',
})

// 3. Get provider for RPC requests
const provider = MMSDK.getProvider()

// 4. Make an RPC request
const result = await provider.request({
method: 'eth_accounts',
params: [],
})

// 5. Batch multiple RPC requests
const batchResults = await provider.request({
method: 'metamask_batch',
params: [{ method: 'eth_accounts' }, { method: 'eth_chainId' }],
})

Live example