Nostr Signer

Approve Nostr signatures with your own browser signer without exposing a private key.

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
76%
Naming quality
85%
Poisoning risk
100%
Permission match
90%
Protocol compliance
100%

Findings (8)

  • LOWTool 'get_setup_url' description lacks action verbin get_setup_url
  • LOWTool 'get_public_key' description lacks action verbin get_public_key
  • LOWTool 'get_grynvault_account_dashboard' name length outside 3-30 rangein get_grynvault_account_dashboard
  • LOWTool 'approve_grynvault_browser_handoff' name length outside 3-30 rangein approve_grynvault_browser_handoff
  • LOWTool 'prepare_grynvault_supporter_invoice' name length outside 3-30 rangein prepare_grynvault_supporter_invoice
  • LOWTool 'create_grynvault_supporter_invoice' name length outside 3-30 rangein create_grynvault_supporter_invoice
  • LOWTool 'prepare_grynvault_nip05_invoice' name length outside 3-30 rangein prepare_grynvault_nip05_invoice
  • LOWTool 'get_setup_url' suggests web access but openWorldHint=falsein get_setup_url

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,268Tokens (tool definitions)
~854 BTypical response size
Moderate attention impact (1.77% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "nostr-signer": {
      "url": "https://signer.frontiercrown.com/mcp"
    }
  }
}

Remote endpoints

https://signer.frontiercrown.com/mcpstreamable-http

What it can do

Tool inventory

Tools (17)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_setup_url

Return the loopback-only page used to connect a NIP-07 browser extension or an advanced NIP-46 signer.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_signer_status

Check whether a user-controlled NIP-07 or NIP-46 signer is connected.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡begin_nostrconnect_pairing(relays)

Advanced fallback: create a nostrconnect:// URI for the user to scan or open in a remote signer. Never accepts an nsec.

Input Schema

{
  "type": "object",
  "properties": {
    "relays": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 500
      },
      "maxItems": 8
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪connect_bunker(connection_uri)

Connect a bunker:// URI only when the user knowingly supplied it. Prefer the local setup page so connection secrets are not placed in chat. Never accepts an nsec.

Input Schema

{
  "type": "object",
  "properties": {
    "connection_uri": {
      "type": "string",
      "maxLength": 8192
    }
  },
  "required": [
    "connection_uri"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_public_key

Return the public key exposed by the currently paired signer.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢prepare_note(content)

Prepare and bind an exact unsigned kind:1 note for user review. This does not sign or publish.

Input Schema

{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "minLength": 1,
      "maxLength": 65536
    }
  },
  "required": [
    "content"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢prepare_event(event)

Validate and bind an exact unsigned Nostr event for user review. This does not sign or publish. Show the user every field before requesting a signature.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535
        },
        "created_at": {
          "type": "integer",
          "minimum": 0
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 4096
            },
            "minItems": 1,
            "maxItems": 16
          },
          "maxItems": 128
        },
        "content": {
          "type": "string",
          "maxLength": 65536
        }
      },
      "required": [
        "kind",
        "created_at",
        "tags",
        "content"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "event"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪sign_event(intent_id, confirm_signature)

Ask the paired signer to approve and sign the exact event bound to a fresh intent. Requires explicit user intent and never publishes.

Input Schema

{
  "type": "object",
  "properties": {
    "intent_id": {
      "type": "string",
      "format": "uuid"
    },
    "confirm_signature": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user explicitly approved this action."
    }
  },
  "required": [
    "intent_id",
    "confirm_signature"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴publish_event(intent_id, confirm_publish, relays)

Publish a previously verified signed event to configured relays. Requires separate explicit user intent.

Input Schema

{
  "type": "object",
  "properties": {
    "intent_id": {
      "type": "string",
      "format": "uuid"
    },
    "confirm_publish": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user explicitly approved this action."
    },
    "relays": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 500
      },
      "maxItems": 8
    }
  },
  "required": [
    "intent_id",
    "confirm_publish"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢query_events(relays, authors, kinds, limit, since)

Read a bounded set of verified public profile or note events from selected relays.

Input Schema

{
  "type": "object",
  "properties": {
    "relays": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 500
      },
      "maxItems": 8
    },
    "authors": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[0-9a-f]{64}$"
      },
      "maxItems": 20
    },
    "kinds": {
      "type": "array",
      "items": {
        "type": "number",
        "enum": [
          0,
          1
        ]
      },
      "maxItems": 2
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "since": {
      "type": "integer",
      "minimum": 0
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴disconnect_signer(confirm_disconnect)

Forget the in-memory signer session and all prepared events.

Input Schema

{
  "type": "object",
  "properties": {
    "confirm_disconnect": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user explicitly approved this action."
    }
  },
  "required": [
    "confirm_disconnect"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_grynvault_account_dashboard(confirm_account_access)

Read the connected Nostr identity's Grynvault supporter, payment, and NIP-05 dashboard using a short-lived signed authorization. This does not create an invoice or change settlement.

Input Schema

{
  "type": "object",
  "properties": {
    "confirm_account_access": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user approved signing a read-only Grynvault account request."
    }
  },
  "required": [
    "confirm_account_access"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡approve_grynvault_browser_handoff(code, confirm_browser_sign_in)

Sign a short-lived, read-only Grynvault account handoff code so the browser tab that created it can receive its own dashboard. This does not create an invoice, publish a Nostr event, change settlement, or grant wallet custody.

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "minLength": 12,
      "maxLength": 20,
      "description": "The one-time code displayed by the Grynvault portal, for example ABCD-EFGH-JKLM."
    },
    "confirm_browser_sign_in": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user asked to sign the displayed Grynvault browser code."
    }
  },
  "required": [
    "code",
    "confirm_browser_sign_in"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢prepare_grynvault_supporter_invoice(plan, donation_sats)

Prepare an exact, short-lived signed-authorization request for a one-time donation of 21 to 1,000,000 sats or the fixed 2,100-sat 30-day membership. Does not sign, create, pay, or settle an invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "enum": [
        "basic_once",
        "member_monthly"
      ]
    },
    "donation_sats": {
      "type": "integer",
      "minimum": 21,
      "maximum": 1000000
    }
  },
  "required": [
    "plan"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡create_grynvault_supporter_invoice(operation_id, confirm_invoice_creation)

After separate explicit user confirmation, sign the prepared authorization and create exactly one pending Grynvault supporter invoice. Does not pay it and never treats a redirect as settlement.

Input Schema

{
  "type": "object",
  "properties": {
    "operation_id": {
      "type": "string",
      "format": "uuid"
    },
    "confirm_invoice_creation": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user explicitly approved this action."
    }
  },
  "required": [
    "operation_id",
    "confirm_invoice_creation"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢prepare_grynvault_nip05_invoice(name)

Check and normalize a [email protected] identifier, then prepare its exact 2,000-sat invoice authorization. Does not sign, reserve the name, create, pay, or settle an invoice.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "pattern": "^[A-Za-z0-9_-]+$"
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡create_grynvault_nip05_invoice(operation_id, confirm_invoice_creation)

After separate explicit user confirmation, sign the prepared authorization and create exactly one pending 2,000-sat [email protected] invoice. Does not pay, settle, activate, or prove identity.

Input Schema

{
  "type": "object",
  "properties": {
    "operation_id": {
      "type": "string",
      "format": "uuid"
    },
    "confirm_invoice_creation": {
      "type": "boolean",
      "const": true,
      "description": "Must be true only after the user explicitly approved this action."
    }
  },
  "required": [
    "operation_id",
    "confirm_invoice_creation"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools