# 1ly Mcp Server

> MCP server for 1ly.store — buy/sell APIs and launch tokens on Bags.fm with USDC & $1LY.

- **Type:** MCP server
- **Install:** `agentstack add mcp-1lystore-1ly-mcp-server`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [1lystore](https://agentstack.voostack.com/s/1lystore)
- **Installs:** 0
- **Category:** [Integrations](https://agentstack.voostack.com/c/integrations)
- **Latest version:** 0.1.7
- **License:** MIT
- **Upstream author:** [1lystore](https://github.com/1lystore)
- **Source:** https://github.com/1lystore/1ly-mcp-server
- **Website:** https://docs.1ly.store

## Install

```sh
agentstack add mcp-1lystore-1ly-mcp-server
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# @1ly/mcp-server

MCP server for [1ly.store](https://1ly.store) — Enable AI agents to discover, pay for, and sell APIs using crypto.

## Overview

This MCP server gives AI agents the ability to:

- **Buy** — Search, discover, and pay for APIs/resources with automatic crypto payments (x402 protocol)
- **Sell** — Create a store, list paid API endpoints or resources, and accept payments
- **Launch Tokens** — Create and trade tokens on Bags.fm, and claim fee shares

**Supported Networks:** Solana (mainnet), Base (mainnet)
**Payment Currency:** USDC and $1LY (Solana only)

## What is this?
This MCP server enables AI agents (Claude, GPT, Cursor, and more) to:

- Create a store on 1ly.store
- Accept payments for your APIs/resources using 1ly as the payment layer
- Create paid links that any x402‑compatible agent can call and pay automatically
- List paid links on the 1ly marketplace for instant agent discovery
- Search for APIs and services on 1ly.store
- Get details about pricing, reviews, and usage
- Call paid APIs with automatic crypto payments (x402 protocol) securely
- Leave reviews after purchases (optional but recommended)
- Launch tokens on Bags.fm, trade solana tokens, and claim fees

---

## Quick Start

**Wallet path rule:** wallet files must be located in your home directory (recommended) or `/tmp`. Paths outside those locations are rejected for security. `~/` is supported and expands to your home directory when running directly from the terminal.
**Important:** Claude Desktop and Cursor config JSON do **not** expand `~`. Always use absolute paths in JSON config files (e.g. `/Users/yourname/.1ly/wallets/solana.json`).

### 1. Install and Run

#### Option A: Raw Wallet (default)

```bash
# Solana wallet
ONELY_WALLET_SOLANA_KEY="~/.1ly/wallets/solana.json" npx @1ly/mcp-server

# OR Base/EVM wallet
ONELY_WALLET_EVM_KEY="~/.1ly/wallets/evm.key" npx @1ly/mcp-server

# OR both wallets
ONELY_WALLET_SOLANA_KEY="~/.1ly/wallets/solana.json" \
ONELY_WALLET_EVM_KEY="~/.1ly/wallets/evm.key" \
npx @1ly/mcp-server
```

#### Option B: Coinbase Agentic Wallet (Base only)

```bash
ONELY_WALLET_PROVIDER="coinbase" npx @1ly/mcp-server
```

> When using Agentic Wallet, you **do not** pass raw private keys.  
> Make sure the Coinbase Agentic Wallet app is running and authenticated.

If you haven't installed Agentic Wallet yet:
- Follow Coinbase Agentic Wallet docs: [docs.cdp.coinbase.com/agentic-wallet/welcome](https://docs.cdp.coinbase.com/agentic-wallet/welcome)
- Quick install:
```bash
npx skills add coinbase/agentic-wallet-skills
npx awal show
```

#### Option C: DCP Local (recommended for secure signing)

```bash
# Start DCP locally
dcp init
npx @dcprotocol/server

# Run MCP (auto-detects DCP at localhost:8420)
npx @1ly/mcp-server
```

#### Option D: DCP Remote (relay)

```bash
# Pairing outputs these values
DCP_VAULT_ID="vault_..." \
DCP_RELAY_URL="wss://relay.dcp.1ly.store" \
DCP_VAULT_HPKE_PUBLIC_KEY="base64..." \
npx @1ly/mcp-server
```

### 2. Verify Setup

```bash
ONELY_WALLET_SOLANA_KEY="~/.1ly/wallets/solana.json" npx @1ly/mcp-server --self-test
```
---

## Configuration

### HTTP Mode (Cloud MCP)

Run MCP over HTTP (for cloud hosting or `mcp.1ly.store`):

```bash
# HTTP transport
MCP_TRANSPORT=http npx @1ly/mcp-server

# Custom host/port
MCP_TRANSPORT=http MCP_HTTP_HOST=0.0.0.0 MCP_HTTP_PORT=3000 npx @1ly/mcp-server
```

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `ONELY_WALLET_SOLANA_KEY` | No | Path to Solana keypair JSON file, or inline JSON array |
| `ONELY_WALLET_EVM_KEY` | No | Path to EVM private key file, or inline hex key (with or without `0x`) |
| `ONELY_API_KEY` | No | API key for seller tools. Auto-loaded after `1ly_create_store` |
| `ONELY_BUDGET_PER_CALL` | No | Max USD per API call (default: `1.00`) |
| `ONELY_BUDGET_DAILY` | No | Daily USD spending limit (default: `50.00`) |
| `ONELY_BUDGET_STATE_FILE` | No | Path to local budget state file (default: `~/.1ly-mcp-budget.json`) |
| `ONELY_NETWORK` | No | Preferred network: `solana` or `base` (default: `solana`) |
| `ONELY_SOLANA_RPC_URL` | No | Solana RPC URL (default: `https://api.mainnet-beta.solana.com`) |
| `ONELY_API_BASE` | No | API base URL (default: `https://1ly.store`) |
| `ONELY_WALLET_PROVIDER` | No | `raw` (default) or `coinbase` (Agentic Wallet, Base-only) |
| `ONELY_SOLANA_DRY_RUN` | No | Set to `1` to simulate Solana transactions without broadcasting. No real payments. For testing only. |
| `MCP_TRANSPORT` | No | `http` to run HTTP MCP server (default: stdio) |
| `MCP_HTTP_HOST` | No | Host for HTTP MCP server (default: `0.0.0.0`) |
| `MCP_HTTP_PORT` | No | Port for HTTP MCP server (default: `3000`) |
| `DCP_VAULT_ID` | No | Vault ID for DCP relay (remote mode) |
| `DCP_RELAY_URL` | No | Relay URL (e.g., `wss://relay.dcp.1ly.store`) |
| `DCP_RELAY_TOKEN` | No | Pairing token for relay (if required) |
| `DCP_VAULT_HPKE_PUBLIC_KEY` | No | Base64 HPKE public key for the vault (remote mode) |
| `DCP_RELAY_PLAINTEXT` | No | Set to `1` to disable HPKE (dev only) |

*A wallet is required only for **paid** calls. For free search/details you can run without a wallet.*
Use **one** of: `ONELY_WALLET_SOLANA_KEY`, `ONELY_WALLET_EVM_KEY`, or `ONELY_WALLET_PROVIDER=coinbase`.

### Claude Desktop Configuration

Add to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "1ly": {
      "command": "npx",
      "args": ["@1ly/mcp-server"],
      "env": {
        "ONELY_WALLET_SOLANA_KEY": "/Users/yourname/.1ly/wallets/solana.json",
        "ONELY_BUDGET_PER_CALL": "1.00",
        "ONELY_BUDGET_DAILY": "50.00"
      }
    }
  }
}
```

> **Note:** Replace `/Users/yourname` with your actual home directory. On Linux use `/home/yourname`. `~` does not work in Claude Desktop config.

Base/EVM wallet configuration

```json
{
  "mcpServers": {
    "1ly": {
      "command": "npx",
      "args": ["@1ly/mcp-server"],
      "env": {
        "ONELY_WALLET_EVM_KEY": "/Users/yourname/.1ly/wallets/evm.key",
        "ONELY_BUDGET_PER_CALL": "1.00",
        "ONELY_BUDGET_DAILY": "50.00"
      }
    }
  }
}
```

### Cursor One-Click Install

[](https://cursor.com/en-US/install-mcp?name=1ly&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyJAMWx5L21jcC1zZXJ2ZXIiXSwiZW52Ijp7Ik9ORUxZX1dBTExFVF9TT0xBTkFfS0VZIjoiL2Fic29sdXRlL3BhdGgvdG8vc29sYW5hLmpzb24iLCJPTkVMWV9CVURHRVRfUEVSX0NBTEwiOiIxLjAwIiwiT05FTFlfQlVER0VUX0RBSUxZIjoiNTAuMDAifX0%3D)

Cursor uses `.cursor/mcp.json`. If you prefer manual setup, use:
```json
{
  "mcpServers": {
    "1ly": {
      "command": "npx",
      "args": ["@1ly/mcp-server"],
      "env": {
        "ONELY_WALLET_SOLANA_KEY": "/absolute/path/to/solana.json",
        "ONELY_BUDGET_PER_CALL": "1.00",
        "ONELY_BUDGET_DAILY": "50.00"
      }
    }
  }
}
```

Both Solana + Base wallets

```json
{
  "mcpServers": {
    "1ly": {
      "command": "npx",
      "args": ["@1ly/mcp-server"],
      "env": {
        "ONELY_WALLET_SOLANA_KEY": "~/.1ly/wallets/solana.json",
        "ONELY_WALLET_EVM_KEY": "~/.1ly/wallets/evm.key",
        "ONELY_BUDGET_PER_CALL": "1.00",
        "ONELY_BUDGET_DAILY": "50.00"
      }
    }
  }
}
```

---

## Tools Reference

### Buyer Tools

Wallet **required only for paid calls** (`1ly_call`). Search/details work without a wallet.

#### `1ly_search`

Search for APIs on 1ly.store marketplace.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `query` | string | **Yes** | Search term (e.g., "weather api") |
| `type` | string | No | Filter: `"api"` or `"standard"` |
| `maxPrice` | number | No | Maximum price in USD |
| `minPrice` | number | No | Minimum price in USD |
| `limit` | number | No | Results to return (default: 10, max: 50) |

```json
{
  "query": "weather api",
  "type": "api",
  "maxPrice": 0.10
}
```

**Returns:**
```json
{
  "ok": true,
  "data": {
    "results": [
      {
        "title": "Real-time Weather",
        "endpoint": "/api/link/joe/weather",
        "price": "$0.010000000000000000 USDC",
        "type": "api",
        "seller": "Joe's APIs",
        "stats": { "buyers": 150, "rating": "95%" }
      }
    ],
    "total": 42,
    "showing": 10
  }
}
```

---

#### `1ly_get_details`

Get detailed information about a specific API.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `endpoint` | string | **Yes** | API endpoint (e.g., `"joe/weather"`) |

```json
{
  "endpoint": "joe/weather"
}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "endpoint": "/api/link/joe/weather",
    "fullUrl": "https://1ly.store/api/link/joe/weather",
    "link": {
      "title": "Real-time Weather",
      "description": "Global weather data",
      "slug": "weather",
      "price": "0.010000000000000000",
      "currency": "USDC"
    },
    "paymentInfo": { "networks": ["solana", "base"] },
    "reviews": {
      "stats": { "total": 50, "positive": 48 },
      "recent": [{ "positive": true, "comment": "Fast!" }]
    }
  }
}
```

---

#### `1ly_call`

Call a paid API with automatic crypto payment.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `endpoint` | string | **Yes** | API endpoint (e.g., `"joe/weather"`) |
| `method` | string | No | HTTP method: `GET`, `POST`, `PUT`, `DELETE`, `PATCH` (default: `GET`) |
| `body` | object | No | Request body for POST/PUT/PATCH |
| `headers` | object | No | Additional headers |

```json
{
  "endpoint": "joe/weather",
  "method": "POST",
  "body": { "city": "NYC" }
}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "data": {
      "temp": 72,
      "conditions": "sunny"
    },
    "_1ly": {
      "purchaseId": "abc123",
      "txHash": "tx_hash_here",
      "reviewUrl": "https://1ly.store/api/review/abc123",
      "reviewToken": "xyz789"
    }
  }
}
```

> **Note:** The `_1ly` object contains tokens needed for `1ly_review`. Save these if you want to leave a review.  
> For free APIs, `_1ly` may be `{ "note": "No payment required (free API)" }`.

**Agentic Wallet (Base only):**
- Set `ONELY_WALLET_PROVIDER=coinbase`.
- Ensure Coinbase Agentic Wallet is installed, running, and authenticated.
- Local private keys are not required.

---

#### `1ly_review`

Leave a review after a successful purchase.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `purchaseId` | string | **Yes** | From `_1ly.purchaseId` in `1ly_call` response |
| `reviewToken` | string | **Yes** | From `_1ly.reviewToken` in `1ly_call` response |
| `positive` | boolean | **Yes** | `true` for positive, `false` for negative |
| `comment` | string | No | Review comment (max 500 chars) |

```json
{
  "purchaseId": "abc123",
  "reviewToken": "xyz789",
  "positive": true,
  "comment": "Fast and accurate!"
}
```

**Returns:**
```json
{
  "ok": true,
  "data": {
    "success": true,
    "reviewId": "rev_456",
    "message": "Positive review submitted!"
  }
}
```

---

### Seller Tools (Accept Payments)

These tools require an **API key**. There are two ways to get one:

**Option A — Via MCP tool (agent does it for you):**
Run `1ly_create_store` and the key is automatically saved locally.

**Option B — Via UI (no wallet needed):**
1. Go to [1ly.store](https://1ly.store) and sign in
2. Open Settings → enable **Developer Mode**
3. Create an API key from the dashboard
4. Set it as `ONELY_API_KEY` in your MCP config

#### `1ly_create_store`

Create a new store and get an API key. **Run this once.** The API key is automatically saved locally.

> **Note:** Creating a store requires a raw wallet key (Solana or EVM). Agentic Wallet does not support store creation yet.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `username` | string | No | Store username (3-20 chars, auto-generated if omitted) |
| `displayName` | string | No | Display name (max 50 chars) |
| `avatarUrl` | string | No | Avatar URL |

```json
{
  "username": "myagent",
  "displayName": "My Agent Store"
}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "success": true,
    "data": {
      "store": {
        "username": "myagent",
        "displayName": "My Agent Store",
        "storeUrl": "https://1ly.store/myagent",
        "createdBy": "agent",
        "avatarUrl": null
      },
      "apiKey": "1ly_live_...",
      "apiKeyPrefix": "1ly_live_..."
    },
    "meta": {
      "savedKeyPath": "~/Library/Application Support/1ly/onely_api_key.json"
    }
  }
}
```

> **API Key Storage:**
> - macOS: `~/Library/Application Support/1ly/onely_api_key.json`
> - Linux: `~/.config/1ly/onely_api_key.json`
> - Windows: `%APPDATA%\1ly\onely_api_key.json`

---

#### `1ly_create_link`

Create a new API link (paid or free).

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `title` | string | **Yes** | Link title (max 200 chars) |
| `url` | string | **Yes** | Target URL (your API endpoint) |
| `price` | string | No | Price in USD (e.g., `"0.10"`). Omit for free |
| `description` | string | No | Description (max 500 chars) |
| `slug` | string | No | Custom slug (3-64 chars, lowercase, hyphens allowed) |
| `currency` | string | No | Always `"USDC"` |
| `isPublic` | boolean | No | List publicly (default: `true`) |
| `isStealth` | boolean | No | Hide from search (default: `false`) |
| `webhookUrl` | string | No | Optional webhook URL for purchase events |

```json
{
  "title": "Premium Weather API",
  "url": "https://api.example.com/weather",
  "price": "0.05",
  "description": "Real-time weather data",
  "webhookUrl": "https://example.com/webhooks/1ly"
}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "success": true,
    "data": {
      "id": "uuid-here",
      "slug": "premium-weather-api",
      "fullUrl": "https://1ly.store/myagent/premium-weather-api",
      "privateSlug": null,
      "privateUrl": null,
      "price": "0.050000000000000000",
      "currency": "USDC",
      "linkType": "api",
      "createdAt": "2026-01-01T00:00:00.000Z"
    }
  }
}
```

---

#### `1ly_list_links`

List all your API links.

*No parameters.*

```json
{}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "success": true,
    "data": {
      "links": [
        {
          "id": "uuid-here",
          "url": "https://api.example.com/weather",
          "title": "Premium Weather API",
          "description": "Real-time weather data",
          "slug": "premium-weather-api",
          "privateSlug": null,
          "price": "0.050000000000000000",
          "currency": "USDC",
          "isPaid": true,
          "isPublic": true,
          "isActive": true,
          "linkType": "api",
          "isStealth": false,
          "createdAt": "2026-01-01T00:00:00.000Z",
          "updatedAt": "2026-01-01T00:00:00.000Z"
        }
      ]
    }
  }
}
```

---

#### `1ly_update_link`

Update an existing API link.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string (UUID) | **Yes** | Link ID |
| `title` | string | No | New title |
| `url` | string | No | New target URL |
| `price` | string | No | New price |
| `description` | string | No | New description |
| `slug` | string | No | New slug |
| `isPublic` | boolean | No | Update visibility |
| `isStealth` | boolean | No | Update stealth mode |
| `webhookUrl` | string | No | Update webhook URL (set to `null` to clear) |

```json
{
  "id": "uuid-here",
  "price": "0.10"
}
```

**Returns (example):**
```json
{
  "ok": true,
  "data": {
    "success": true,
    "data": {
      "id": "uuid-here",
      "profileId": "profile-id",
      "url": "https://api.example.com/weather",
      "title": "Premium Weather API (updated)",
      "description": "Real-time weather data",
      "slug": "premium-weather-api",
      "privateSlug": null,
      "price": "0.100000000000000000",
      "currenc

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [1lystore](https://github.com/1lystore)
- **Source:** [1lystore/1ly-mcp-server](https://github.com/1lystore/1ly-mcp-server)
- **License:** MIT
- **Homepage:** https://docs.1ly.store

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.7 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.7** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-1lystore-1ly-mcp-server
- Seller: https://agentstack.voostack.com/s/1lystore
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
