Skip to content
Open
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Each skill is a self-contained directory with a `SKILL.md` (used by Claude Code
| [btc](./btc/) | `btc/btc.ts` | Bitcoin L1 — check balances, estimate fees, list UTXOs, transfer BTC, and classify UTXOs as cardinal (safe to spend), ordinal (inscriptions), or rune (rune tokens). Uses Unisat API. |
| [mempool-watch](./mempool-watch/) | `mempool-watch/mempool-watch.ts` | Bitcoin mempool monitoring — check transaction confirmation status, retrieve address transaction history, and inspect current mempool state via mempool.space. |
| [ordinals](./ordinals/) | `ordinals/ordinals.ts` | Bitcoin ordinals — get Taproot address, estimate inscription fees, create inscriptions via the two-step commit/reveal pattern, transfer inscriptions, and fetch inscription content. |
| [ordinals-marketplace](./ordinals-marketplace/) | doc-only (`SKILL.md`) | BTC ordinals marketplace via Magic Eden — browse active listings, list inscriptions for sale via PSBT flow, submit signed listings, buy inscriptions, and cancel active listings. BTC ordinals only. Mainnet-only. |
| [runes](./runes/) | `runes/runes.ts` | Bitcoin runes — check rune balances, list rune-bearing UTXOs, and transfer runes with Runestone OP_RETURN encoding. Uses Unisat API. |
| [souldinals](./souldinals/) | `souldinals/souldinals.ts` | Souldinals collection management — inscribe soul.md as a child inscription under a genesis parent, list and load soul inscriptions from the wallet, and display parsed soul traits. |
| [signing](./signing/) | `signing/signing.ts` | Message signing and verification — SIP-018 structured data (on-chain verifiable), Stacks plain-text (SIWS-compatible), Bitcoin BIP-137 message signing, and BIP-340 Schnorr for Taproot multisig. |
Expand Down
1 change: 1 addition & 0 deletions arxiv-research/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ metadata:
user-invocable: "false"
arguments: "fetch | compile | list"
entry: "arxiv-research/arxiv-research.ts"
mcp-tools: "arxiv_search, arxiv_compile_digest, arxiv_list_digests"
requires: ""
tags: "read-only"
---
Expand Down
1 change: 1 addition & 0 deletions bitflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "get-ticker | get-tokens | get-hodlmm-pools | get-hodlmm-bins | get-hodlmm-position-bins | get-swap-targets | get-quote | get-routes | swap | add-liquidity-simple | withdraw-liquidity-simple | get-keeper-contract | create-order | get-order | cancel-order | get-keeper-user"
entry: "bitflow/bitflow.ts"
requires: "wallet"
mcp-tools: "bitflow_get_ticker, bitflow_get_tokens, bitflow_get_swap_targets, bitflow_get_quote, bitflow_get_routes, bitflow_swap, bitflow_get_keeper_contract, bitflow_create_order, bitflow_get_order, bitflow_cancel_order, bitflow_get_keeper_user"
tags: "l2, defi, write, mainnet-only, requires-funds"
---

Expand Down
1 change: 1 addition & 0 deletions bounty-scanner/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "scan | match | claim | status | my-bounties | detail"
entry: "bounty-scanner/bounty-scanner.ts"
requires: "wallet, signing"
mcp-tools: "bounty_list, bounty_get, bounty_match, bounty_claim, bounty_status, bounty_my_claims, bounty_stats"
tags: "l2, write, infrastructure"
---

Expand Down
1 change: 1 addition & 0 deletions credentials/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "add | get | list | delete | rotate-password"
entry: "credentials/credentials.ts"
requires: ""
mcp-tools: "credentials_list, credentials_get, credentials_set, credentials_delete, credentials_unlock"
tags: "infrastructure, sensitive"
---

Expand Down
1 change: 1 addition & 0 deletions dual-stacking/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "check-status | enroll | opt-out | get-rewards"
entry: "dual-stacking/dual-stacking.ts"
requires: "wallet"
mcp-tools: "dual_stacking_status, dual_stacking_get_rewards, dual_stacking_enroll, dual_stacking_opt_out"
tags: "l2, write, requires-funds, defi"
---

Expand Down
1 change: 1 addition & 0 deletions identity/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "register | get | set-uri | set-metadata | set-approval | set-wallet | unset-wallet | transfer | get-metadata | get-last-id"
entry: "identity/identity.ts"
requires: "wallet"
mcp-tools: "register_identity, get_identity, identity_get_last_id, identity_get, identity_get_metadata, identity_register, identity_set_uri, identity_set_metadata, identity_set_approval, identity_set_wallet, identity_unset_wallet, identity_transfer"
tags: "l2, write"
---

Expand Down
2 changes: 2 additions & 0 deletions maximumsats-wot/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ metadata:
tags: "read-only"
---

> **Deprecated:** This skill has been consolidated into [`wot`](../wot/SKILL.md). Use the `wot` skill for all Web of Trust operations. This skill will not receive further updates.

# maximumsats-wot

Query the MaximumSats Web of Trust (WoT) for Nostr pubkeys. Provides trust scoring (0–100), sybil detection, personalized follow recommendations, and trust path analysis. Backed by 52K+ pubkeys and 2.4M+ trust edges.
Expand Down
2 changes: 2 additions & 0 deletions nostr-wot/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ metadata:
tags: "read-only"
---

> **Deprecated:** This skill has been consolidated into [`wot`](../wot/SKILL.md). Use the `wot` skill for all Web of Trust operations. This skill will not receive further updates.

# Nostr Web of Trust Skill

Pre-transaction counterparty risk assessment using Nostr Web of Trust scores. Accepts hex pubkeys or `npub1...` bech32 addresses.
Expand Down
81 changes: 81 additions & 0 deletions ordinals-marketplace/AGENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
name: ordinals-marketplace-agent
skill: ordinals-marketplace
description: Agent instructions for BTC ordinals marketplace operations via Magic Eden — browse listings, list inscriptions for sale, buy, and cancel listings using the PSBT-based flow.
---

# Ordinals Marketplace Agent

This agent handles BTC ordinals buying and selling on the Magic Eden marketplace (`api-mainnet.magiceden.dev/v2/ord/btc`). Operations use a PSBT-based flow: Magic Eden generates a transaction that the agent signs and then broadcasts. All operations are Bitcoin mainnet-only.

**BTC ordinals only.** This skill does not cover Solana or other chains.

## Prerequisites

- Wallet must be unlocked for all write operations — use `wallet_unlock` first
- Active wallet must have Taproot (P2TR) addresses for listing and cancellation; SegWit (P2WPKH) address for funding purchases
- BTC balance required: purchase price + miner fee for buys; miner fee only for cancellations
- `ordinals_get_listings` requires no wallet — it is a public read operation
- Operations will fail on testnet; only invoke on mainnet

## Decision Logic

| Goal | Tool |
|------|------|
| Browse active ordinals listings on Magic Eden | `ordinals_get_listings` — filter by collection, price range, or sort order |
| List an inscription for sale (step 1 of 2) | `ordinals_list_for_sale` — returns PSBT to sign |
| Finalize a listing after signing the PSBT (step 2 of 2) | `ordinals_list_for_sale_submit` — pass signed PSBT |
| Buy a listed inscription (get buyer PSBT) | `ordinals_buy` — returns PSBT to sign then broadcast |
| Cancel an active listing | `ordinals_cancel_listing` — returns cancellation PSBT to sign then broadcast |

## Safety Checks

- Verify inscription ownership before listing: use `get_ordinal_utxos` or `get_inscriptions_by_address` to confirm the inscription is in the wallet's Taproot address
- Check BTC balance before buying: use `get_btc_balance` and compare against listing price plus estimated fee
- Do not use ordinal UTXOs as fee inputs in unrelated transactions while a listing is active — the listing PSBT references that specific UTXO
- Confirm the listing is still active before buying: `ordinals_get_listings` with the collection or check `ordinals_buy` response for `status: "not_listed"`
- For the cancel flow, the signed PSBT must be broadcast promptly — stale PSBTs may be rejected

## Error Handling

| Error message | Cause | Fix |
|--------------|-------|-----|
| "Magic Eden ordinals marketplace is only available on mainnet." | Running on testnet | Switch to mainnet network config |
| "Wallet is not unlocked. Use wallet_unlock first." | Write operation without active session | Run `wallet_unlock` with password |
| "Taproot address not available. Unlock your wallet first." | Wallet session missing P2TR keys | Unlock a managed wallet (not env-var-based mnemonic) |
| "Bitcoin SegWit address not available. Unlock your wallet first." | SegWit keys missing | Same as above — unlock a managed wallet |
| "Magic Eden API 429: ..." | Rate limit exceeded | Wait and retry; set `MAGIC_EDEN_API_KEY` env var for higher limits |
| "Magic Eden API 400: ..." | Invalid inscription ID or missing listing | Verify inscription ID format (`txid...iN`) and that it is currently listed |
| "Inscription ... does not appear to be listed for sale" | Inscription not listed or delisted | Confirm listing via `ordinals_get_listings` with collection filter |
| "Magic Eden API 500: ..." | Magic Eden server error | Retry after a short wait |

## Output Handling

- `ordinals_get_listings`: `listings` array contains inscription details and `listedPrice` in satoshis; use `inscriptionId` for subsequent buy/cancel operations
- `ordinals_list_for_sale`: extract `psbtBase64` and pass to `psbt_sign`; also save `inscriptionId` for the submit step
- `ordinals_list_for_sale_submit`: `status: "listed"` confirms the listing is live on Magic Eden
- `ordinals_buy`: extract `psbtBase64` and pass to `psbt_sign`, then pass signed result to `psbt_broadcast`; `priceSats` confirms the final purchase price
- `ordinals_cancel_listing`: extract `psbtBase64`, sign with `psbt_sign`, broadcast with `psbt_broadcast`; after confirmation the inscription is delisted

## Example Invocations

```
# Browse recent listings for a collection
ordinals_get_listings({ collection: "nodemonkes", sortBy: "recentlyListed", limit: 20 })

# List an inscription for 500,000 sats (step 1)
ordinals_list_for_sale({ inscriptionId: "abc123...i0", priceSats: 500000 })
# → sign psbtBase64 with psbt_sign
# → submit signed PSBT (step 2)
ordinals_list_for_sale_submit({ inscriptionId: "abc123...i0", signedPsbt: "<signed-psbt-base64>" })

# Buy a listed inscription
ordinals_buy({ inscriptionId: "abc123...i0" })
# → sign psbtBase64 with psbt_sign
# → broadcast with psbt_broadcast

# Cancel an active listing
ordinals_cancel_listing({ inscriptionId: "abc123...i0" })
# → sign psbtBase64 with psbt_sign
# → broadcast with psbt_broadcast
```
139 changes: 139 additions & 0 deletions ordinals-marketplace/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
---
name: ordinals-marketplace
description: "BTC ordinals marketplace operations via Magic Eden — browse active listings, list inscriptions for sale via PSBT flow, submit signed listings, buy inscriptions, and cancel active listings. BTC ordinals only (not Solana). Mainnet-only."
metadata:
author: "whoabuddy"
author-agent: "Trustless Indra"
user-invocable: "false"
arguments: "get-listings | list-for-sale | list-for-sale-submit | buy | cancel-listing"
entry: "ordinals-marketplace/SKILL.md"
mcp-tools: "ordinals_get_listings, ordinals_list_for_sale, ordinals_list_for_sale_submit, ordinals_buy, ordinals_cancel_listing"
requires: "wallet"
tags: "l1, write, mainnet-only, requires-funds"
---

# Ordinals Marketplace Skill

Browse and trade Bitcoin ordinals/inscriptions on the Magic Eden marketplace via the Magic Eden BTC ordinals API (`api-mainnet.magiceden.dev/v2/ord/btc`).

**Important:** This skill covers BTC ordinals only. Magic Eden operates separate marketplaces for different chains; this skill exclusively uses the Bitcoin ordinals API. All operations are mainnet-only — the API does not support testnet.

This is an MCP-tool skill. Agents invoke the underlying MCP tools directly rather than a standalone CLI script. Write operations use the Magic Eden PSBT-based listing flow: Magic Eden generates a PSBT which the seller or buyer signs and then broadcasts.

## Prerequisites

- Wallet must be unlocked for all write operations (`list-for-sale`, `buy`, `cancel-listing`)
- `get-listings` is public and requires no wallet
- Active wallet must have Taproot keys (P2TR address) — managed wallets satisfy this
- BTC balance required for purchasing and cancellations (miner fee for cancel; purchase price + fee for buy)
- Set `MAGIC_EDEN_API_KEY` environment variable for a dedicated authenticated rate limit (optional but recommended for high-volume use; without it, the unauthenticated shared limit applies: 30 QPM)

## Subcommands

### get-listings

Browse active BTC ordinals listings on Magic Eden. No wallet required.

MCP tool: `ordinals_get_listings`

Options:
- `collection` (optional) — Magic Eden collection symbol to filter by (e.g. `nodemonkes`, `bitcoin-puppets`)
- `minPriceSats` (optional) — Minimum listing price in satoshis
- `maxPriceSats` (optional) — Maximum listing price in satoshis
- `limit` (optional) — Number of results (default 20, max 100)
- `offset` (optional) — Pagination offset (default 0)
- `sortBy` (optional) — `priceAsc`, `priceDesc`, or `recentlyListed` (default)

Returns active listings with inscription details, seller address, and price in satoshis.

### list-for-sale

List a wallet inscription for sale on Magic Eden using the PSBT listing flow. Step 1 of 2.

MCP tool: `ordinals_list_for_sale`

Options:
- `inscriptionId` (required) — Inscription ID in txid+index format, e.g. `abc123...i0`
- `priceSats` (required) — Listing price in satoshis
- `receiverAddress` (optional) — BTC address to receive payment (defaults to wallet's Taproot address)

Returns a `psbtBase64` for signing. The inscription is not moved; the signed PSBT authorizes the sale to any buyer.

Next step: sign the returned PSBT using `psbt_sign`, then call `list-for-sale-submit`.

### list-for-sale-submit

Submit a signed listing PSBT to Magic Eden to publish the listing. Step 2 of 2.

MCP tool: `ordinals_list_for_sale_submit`

Options:
- `inscriptionId` (required) — The inscription ID being listed
- `signedPsbt` (required) — The signed PSBT in base64 format (from `psbt_sign`)

Returns `{ "status": "listed" }` on success.

### buy

Buy a listed BTC ordinal inscription from Magic Eden. Multi-step PSBT flow.

MCP tool: `ordinals_buy`

Options:
- `inscriptionId` (required) — Inscription ID to purchase, e.g. `abc123...i0`
- `buyerAddress` (optional) — BTC address to receive the inscription (defaults to wallet's Taproot address)
- `buyerPaymentAddress` (optional) — BTC address to fund the purchase (defaults to wallet's SegWit address)
- `feeRate` (optional) — Fee rate in sat/vB (uses `halfHourFee` network default if omitted)

Returns a `psbtBase64` combining the seller's listing and buyer's payment inputs.

Next step: sign the PSBT with `psbt_sign`, then broadcast with `psbt_broadcast`.

### cancel-listing

Cancel an active Magic Eden listing for an inscription you own.

MCP tool: `ordinals_cancel_listing`

Options:
- `inscriptionId` (required) — Inscription ID of the active listing to cancel, e.g. `abc123...i0`
- `sellerAddress` (optional) — BTC Taproot address that owns the listing (defaults to wallet's Taproot address)

Returns a `psbtBase64` for the cancellation transaction.

Next step: sign the PSBT with `psbt_sign`, then broadcast with `psbt_broadcast` to finalize the cancellation.

## Multi-Step Flows

### Listing Flow

```
1. ordinals_list_for_sale (get listing PSBT)
2. psbt_sign (sign the psbtBase64)
3. ordinals_list_for_sale_submit (publish listing)
```

### Buy Flow

```
1. ordinals_get_listings (find inscription and price)
2. ordinals_buy (get buyer PSBT)
3. psbt_sign (sign the psbtBase64)
4. psbt_broadcast (broadcast to complete purchase)
```

### Cancel Flow

```
1. ordinals_cancel_listing (get cancellation PSBT)
2. psbt_sign (sign the psbtBase64)
3. psbt_broadcast (broadcast to cancel listing)
```

## Notes

- All write operations require mainnet — the API returns an error on testnet
- Magic Eden's BTC ordinals API (`api-mainnet.magiceden.dev/v2/ord/btc`) is the backend for all operations
- The inscription must be in the wallet's Taproot (P2TR / bc1p...) address for listing and cancellation
- Payment for purchases comes from the SegWit (P2WPKH / bc1q...) address
- If `MAGIC_EDEN_API_KEY` is not set, the shared unauthenticated rate limit (30 QPM) applies
1 change: 1 addition & 0 deletions ordinals-p2p/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "list-trades | get-trade | create-offer | counter | transfer | cancel | psbt-swap | my-trades | agents"
entry: "ordinals-p2p/ordinals-p2p.ts"
requires: "wallet"
mcp-tools: "psbt_decode, psbt_sign, psbt_broadcast, psbt_create_ordinal_buy, ordinals_p2p_list_trades, ordinals_p2p_get_trade, ordinals_p2p_my_trades, ordinals_p2p_agents, ordinals_p2p_create_offer, ordinals_p2p_counter, ordinals_p2p_transfer, ordinals_p2p_cancel, ordinals_p2p_psbt_swap, taproot_get_pubkey, taproot_verify_cosig, taproot_multisig_guide"
tags: "l1, l2, write, requires-funds, defi"
---

Expand Down
1 change: 1 addition & 0 deletions ordinals/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "get-taproot-address | estimate-fee | inscribe | inscribe-reveal | get-inscription | transfer-inscription"
entry: "ordinals/ordinals.ts"
requires: "wallet"
mcp-tools: "get_taproot_address, estimate_inscription_fee, inscribe, inscribe_reveal, get_inscription, inscribe_child, inscribe_child_reveal, estimate_child_inscription_fee"
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ordinals/SKILL.md now lists child-inscription MCP tools (estimate_child_inscription_fee, inscribe_child, inscribe_child_reveal) under metadata.mcp-tools, but this skill’s documented subcommands don’t cover child inscriptions and there is a dedicated child-inscription skill for those tools. Consider removing the child-inscription tools from this skill’s mcp-tools list (or explicitly documenting/adding arguments/subcommands if ordinals is intended to cover them).

Suggested change
mcp-tools: "get_taproot_address, estimate_inscription_fee, inscribe, inscribe_reveal, get_inscription, inscribe_child, inscribe_child_reveal, estimate_child_inscription_fee"
mcp-tools: "get_taproot_address, estimate_inscription_fee, inscribe, inscribe_reveal, get_inscription"

Copilot uses AI. Check for mistakes.
tags: "l1, write, requires-funds"
---

Expand Down
1 change: 1 addition & 0 deletions reputation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "give-feedback | revoke-feedback | append-response | approve-client | get-summary | read-feedback | read-all-feedback | get-clients | get-feedback-count | get-approved-limit | get-last-index"
entry: "reputation/reputation.ts"
requires: "wallet"
mcp-tools: "give_feedback, get_reputation, reputation_append_response, reputation_approve_client, reputation_get_approved_limit, reputation_get_clients, reputation_get_feedback_count, reputation_get_last_index, reputation_get_summary, reputation_give_feedback, reputation_read_all_feedback, reputation_read_feedback, reputation_revoke_feedback"
tags: "l2, write"
---

Expand Down
1 change: 1 addition & 0 deletions runes/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "balance | utxos | transfer"
entry: "runes/runes.ts"
requires: "wallet"
mcp-tools: "runes_list_etchings, runes_get_etching, runes_get_holders, runes_get_activity, runes_get_address_balances, runes_get_address_activity, get_rune_balances, get_rune_utxos, transfer_rune"
tags: "l1, write, requires-funds"
---

Expand Down
1 change: 1 addition & 0 deletions settings/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "set-hiro-api-key | get-hiro-api-key | delete-hiro-api-key | set-stacks-api-url | get-stacks-api-url | delete-stacks-api-url | get-server-version | check-relay-health"
entry: "settings/settings.ts"
requires: ""
mcp-tools: "set_hiro_api_key, get_hiro_api_key, delete_hiro_api_key, set_stacks_api_url, get_stacks_api_url, delete_stacks_api_url, get_server_version, check_relay_health, recover_sponsor_nonce, nonce_health, nonce_fill_gap"
tags: "infrastructure"
---

Expand Down
1 change: 1 addition & 0 deletions signing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ metadata:
arguments: "sip018-sign | sip018-verify | sip018-hash | stacks-sign | stacks-verify | btc-sign | btc-verify | schnorr-sign-digest | schnorr-verify-digest | nostr-sign-event"
entry: "signing/signing.ts"
requires: "wallet"
mcp-tools: "stacks_sign_message, stacks_verify_message, btc_sign_message, btc_verify_message, schnorr_sign_digest, schnorr_verify_digest, nostr_sign_event, sip018_hash, sip018_sign, sip018_verify"
tags: "l2, l1"
---

Expand Down
Loading
Loading