Skip to main content
Glama
jim-agent

NEAR Contract Deployer MCP Server

by jim-agent
README.md
# NEAR Contract Deployer MCP Server

An MCP (Model Context Protocol) server that enables AI assistants like Claude to deploy, initialize, and upgrade NEAR smart contracts.

## Features

- **deploy_contract**: Deploy WASM smart contracts to NEAR accounts
- **initialize_contract**: Call initialization methods after deployment
- **upgrade_contract**: Upgrade existing contracts with new code
- **get_deployment_status**: Check if an account has a contract deployed
- **estimate_deployment_cost**: Calculate storage costs before deploying

## Installation

```bash
npm install
npm run build
```

## Configuration

### Credentials

The server looks for NEAR credentials in these locations (in order):
1. `~/.near-credentials/{network}/{account_id}.json`
2. `~/.near/credentials/{network}/{account_id}.json`
3. `./.near-credentials/{network}/{account_id}.json`

You can also provide credentials directly via the `private_key` parameter.

### Generate Credentials

```bash
# For testnet
near login --networkId testnet

# For mainnet  
near login --networkId mainnet
```

## Usage with Claude Desktop

Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "near-deploy": {
      "command": "node",
      "args": ["/path/to/mcp-near-deploy/dist/index.js"]
    }
  }
}
```

## Example Conversations

### Deploying a New Contract

**User**: Deploy my contract to testnet

**Claude**: I'll help you deploy your contract. First, let me estimate the costs.

```
Tool: estimate_deployment_cost
Args: {"wasm_path": "./target/wasm32-unknown-unknown/release/my_contract.wasm"}

šŸ’° DEPLOYMENT COST ESTIMATE

šŸ“Š Cost Breakdown:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  WASM Size:       156.32 KB (160,072 bytes)
  Storage Cost:    1.600720 NEAR
  Estimated Gas:   11 TGas
  Total Estimate:  ~1.65 NEAR

šŸ’” Recommendation:
   āœ… Contract size is reasonable. Deployment should proceed smoothly.
```

Now let me deploy it:

```
Tool: deploy_contract
Args: {
  "account_id": "mycontract.testnet",
  "wasm_path": "./target/wasm32-unknown-unknown/release/my_contract.wasm",
  "network": "testnet"
}

āœ… CONTRACT DEPLOYED SUCCESSFULLY

šŸ“‹ Deployment Details:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Contract ID:     mycontract.testnet
  Network:         testnet
  WASM Size:       156.32 KB
  Storage Cost:    1.600720 NEAR
  Transaction:     7abc123...

šŸ”— Explorer: https://explorer.testnet.near.org/transactions/7abc123...

šŸ“ Next Steps:
  1. Initialize the contract using initialize_contract()
  2. Verify deployment with get_deployment_status()
```

---

### Initializing a Contract

**User**: Initialize the contract with owner set to my account

**Claude**: I'll initialize your contract with the specified owner:

```
Tool: initialize_contract
Args: {
  "contract_id": "mycontract.testnet",
  "method_name": "new",
  "args": {"owner_id": "yourname.testnet"},
  "network": "testnet"
}

āœ… CONTRACT INITIALIZED SUCCESSFULLY

šŸ“‹ Initialization Details:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Contract ID:     mycontract.testnet
  Method:          new
  Arguments:       {"owner_id": "yourname.testnet"}
  Transaction:     8def456...

šŸ”— Explorer: https://explorer.testnet.near.org/transactions/8def456...

✨ The contract is now ready to use!
```

---

### Checking Deployment Status

**User**: Is there a contract on wrap.near?

**Claude**: Let me check the deployment status:

```
Tool: get_deployment_status
Args: {"account_id": "wrap.near", "network": "mainnet"}

āœ… CONTRACT IS DEPLOYED

šŸ“‹ Deployment Status:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Contract ID:     wrap.near
  Network:         mainnet
  Code Hash:       4Fh7SHqU...
  Storage Used:    3,456,789 bytes
  Storage Cost:    34.567890 NEAR
  Balance:         1,234.567890 NEAR

šŸ”— Explorer: https://explorer.near.org/accounts/wrap.near

✨ Contract is ready to interact with!
```

---

### Upgrading a Contract

**User**: Upgrade my contract with the new version

**Claude**: I'll upgrade your contract with the new WASM and run the migration:

```
Tool: upgrade_contract
Args: {
  "contract_id": "mycontract.testnet",
  "wasm_path": "./target/wasm32-unknown-unknown/release/my_contract_v2.wasm",
  "migrate_method": "migrate",
  "network": "testnet"
}

āœ… CONTRACT UPGRADED SUCCESSFULLY

šŸ“‹ Upgrade Details:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Contract ID:     mycontract.testnet
  Network:         testnet
  New WASM Size:   162.45 KB
  Storage Cost:    1.624500 NEAR
  Deploy TX:       9ghi789...
  Migration TX:    0jkl012...

šŸ”— Explorer: https://explorer.testnet.near.org/transactions/9ghi789...

✨ Migration completed successfully!
```

---

### Cost Estimation

**User**: How much will it cost to deploy a 500KB contract?

**Claude**: Let me calculate the deployment cost:

```
Tool: estimate_deployment_cost
Args: {"wasm_size_bytes": 512000}

šŸ’° DEPLOYMENT COST ESTIMATE

šŸ“Š Cost Breakdown:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  WASM Size:       500.00 KB (512,000 bytes)
  
  Storage Cost:    5.120000 NEAR
                   (5120000000000000000000000 yoctoNEAR)
  
  Estimated Gas:   15 TGas
  Gas Cost:        ~0.001500 NEAR
  
  ─────────────────────────────────
  Total Estimate:  5.121500 NEAR

šŸ’” Recommendation:
   šŸ’ø Storage cost is significant. Ensure account has sufficient NEAR balance.

šŸ“ Notes:
   • Storage costs are exact (1 byte = 0.00001 NEAR)
   • Gas costs may vary based on network conditions
   • Add ~10% buffer for safety
```

## API Reference

### deploy_contract

Deploy a WASM smart contract to a NEAR account.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| account_id | string | āœ… | NEAR account to deploy to |
| wasm_path | string | āŒ* | Path to WASM file |
| wasm_base64 | string | āŒ* | Base64-encoded WASM |
| network | string | āŒ | "mainnet" or "testnet" (default: testnet) |
| private_key | string | āŒ | Signing key (ed25519:xxx format) |

*Either wasm_path or wasm_base64 required

### initialize_contract

Call an initialization method on a deployed contract.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| contract_id | string | āœ… | Contract account ID |
| method_name | string | āœ… | Init method name |
| args | object | āŒ | Method arguments |
| deposit | string | āŒ | NEAR to attach (e.g., "1.5") |
| gas | string | āŒ | Gas limit in TGas (default: 100) |
| network | string | āŒ | "mainnet" or "testnet" |
| private_key | string | āŒ | Signing key |

### upgrade_contract

Upgrade an existing contract with new WASM code.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| contract_id | string | āœ… | Contract to upgrade |
| wasm_path | string | āŒ* | Path to new WASM file |
| wasm_base64 | string | āŒ* | Base64-encoded new WASM |
| migrate_method | string | āŒ | Migration method to call |
| migrate_args | object | āŒ | Migration arguments |
| network | string | āŒ | "mainnet" or "testnet" |
| private_key | string | āŒ | Signing key |

### get_deployment_status

Check if an account has a contract deployed.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| account_id | string | āœ… | Account to check |
| network | string | āŒ | "mainnet" or "testnet" (default: mainnet) |

### estimate_deployment_cost

Calculate storage costs for deployment.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| wasm_path | string | āŒ* | Path to WASM file |
| wasm_base64 | string | āŒ* | Base64-encoded WASM |
| wasm_size_bytes | number | āŒ* | Direct size in bytes |

*At least one required

## Networks

- **Mainnet**: Production network (`mainnet`)
- **Testnet**: Development network (`testnet`)

Default network is `testnet` for safety.

## Security Notes

- Never share or commit private keys
- Use environment variables or credential files for keys
- Test on testnet before mainnet deployments
- Review contract code before deploying

## License

MIT

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct phase in the contract lifecycle: deploy creates, initialize configures, upgrade replaces, status checks, and cost estimates. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (deploy_contract, initialize_contract, upgrade_contract, get_deployment_status, estimate_deployment_cost). The pattern is uniform and predictable.

Tool Count5/5

With 5 tools, the server is well-scoped for its purpose of managing NEAR contract deployments. Each tool is necessary and there is no redundancy or bloat.

Completeness5/5

The server covers the full deployment lifecycle: estimation, deployment, initialization, upgrading, and status checking. There are no obvious gaps for its stated purpose, as contract interaction beyond deployment is out of scope.

Maintenance

ActivityInactive
ResponsivenessNo issues