{
  "status": "live-control-plane",
  "endpoint": "/mcp",
  "protocolVersion": "2026-07-28",
  "authorization": "X-Nymwell-Key (scoped agent key) or Sites authenticated identity; public discovery tools need no key",
  "providerExecution": "configured by DOMAIN_PROVIDER and BILLING_PROVIDER; see nymwell_status",
  "securityModel": "least privilege + server-side organization isolation + staged writes + immutable audit evidence",
  "tools": [
    {
      "name": "nymwell_status",
      "description": "Read Nymwell backend, database and provider-adapter readiness.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "list_domains",
      "description": "List domains visible to the signed-in Nymwell organization.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "list_dns_records",
      "description": "List DNS records for a managed domain. refresh: true first pulls the records from the registrar (including ones changed outside Nymwell).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "refresh": {
            "type": "boolean"
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_invoices",
      "description": "List invoice metadata for the signed-in Nymwell organization.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "list_members",
      "description": "List members and roles for the signed-in Nymwell organization.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "list_audit_events",
      "description": "Read recent immutable audit evidence for the signed-in Nymwell organization.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "stage_dns_change",
      "description": "Prepare DNS changes (create, update, delete) for review. Nothing is written until an owner or admin approves; then Nymwell applies them at the registrar in order. For update and delete, pass record_id from list_dns_records when a name has more than one record of that type.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "properties": {
                "operation": {
                  "enum": [
                    "create",
                    "update",
                    "delete"
                  ]
                },
                "type": {
                  "enum": [
                    "A",
                    "AAAA",
                    "CNAME",
                    "MX",
                    "TXT",
                    "CAA",
                    "SRV",
                    "NS"
                  ]
                },
                "name": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                },
                "ttl": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 2147483647
                },
                "priority": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 65535
                },
                "record_id": {
                  "type": "string",
                  "description": "The record to update or delete, from list_dns_records"
                }
              },
              "required": [
                "operation",
                "type",
                "name",
                "value"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "domain",
          "changes"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "search_domains",
      "description": "Check which domain names can be registered and what they cost, from the registrar itself (not DNS or RDAP). Pass exact domains, or a name plus endings. Prices are USD for the minimum term; get_quote gives the exact price for a chosen term. No sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 20
          },
          "name": {
            "type": "string",
            "description": "A name without an ending, e.g. orbitnotes"
          },
          "tlds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "description": "Endings to try with name, e.g. [\"com\",\"ai\",\"dev\"]"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "screen_domains",
      "description": "Fast first pass over many names: is there a registration record, since when, with which registrar, is it parked for sale. Uses public RDAP and DNS, so it works before any registrar is configured. It is NOT availability: no_record still has to be confirmed with search_domains or get_quote. No sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 20
          },
          "name": {
            "type": "string",
            "description": "A name without an ending, e.g. noren"
          },
          "tlds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "description": "Endings to try with name; defaults to com, ai, dev, app, io, co, tw"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "get_quote",
      "description": "Lock the exact price for one domain: action \"register\" (default) for an available name, \"renew\" for a domain this organization holds, or \"transfer\" to bring one from another registrar (adds one year; the owner then submits the auth code in the console). Valid for 40 minutes; purchase_domain charges exactly this.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "years": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          },
          "action": {
            "enum": [
              "register",
              "renew",
              "transfer"
            ]
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "purchase_domain",
      "description": "Start paying for a quote (registration, renewal or transfer). Returns a checkout_url: give it to the person, who pays once; paying is their approval. The registrar call (and, for a registration, the DNS records you pass) then runs on its own. Poll get_order for the result. An agent never pays by itself.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quote_id": {
            "type": "string"
          },
          "dns": {
            "type": "object",
            "description": "Records to create right after registration: a preset from list_dns_presets, optional records, or both.",
            "properties": {
              "preset": {
                "type": "string"
              },
              "target": {
                "type": "string",
                "description": "Hostname the preset points www at, when the preset needs one"
              },
              "records": {
                "type": "array",
                "maxItems": 20,
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "enum": [
                        "A",
                        "AAAA",
                        "CNAME",
                        "MX",
                        "TXT",
                        "SRV",
                        "NS"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "value": {
                      "type": "string"
                    },
                    "ttl": {
                      "type": "integer",
                      "minimum": 300
                    },
                    "priority": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 65535
                    }
                  },
                  "required": [
                    "type",
                    "name",
                    "value"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "additionalProperties": false
          },
          "idempotency_key": {
            "type": "string",
            "maxLength": 120
          },
          "accept_trademark_notice": {
            "type": "boolean",
            "description": "true only after the person has read the trademark notice get_quote returned"
          },
          "tld_requirements": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Extra registry fields some country endings need (see get_tld_info)"
          },
          "locale": {
            "enum": [
              "en",
              "zh-tw"
            ],
            "description": "Language of the page the person returns to after paying"
          }
        },
        "required": [
          "quote_id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_order",
      "description": "Read where a purchase is: awaiting_payment, registering, registered, needs_attention or failed_refunded, with the DNS records that were created.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "order_id": {
            "type": "string"
          }
        },
        "required": [
          "order_id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_dns_presets",
      "description": "List the DNS presets purchase_domain and apply_dns_preset accept (Vercel, Netlify, GitHub Pages, Cloudflare Pages, Agent Lab Deploy, Google Workspace email). No sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "apply_dns_preset",
      "description": "Prepare DNS records for a domain this organization already manages. It creates a change set a person approves in the console; nothing is written before that.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "preset": {
            "type": "string"
          },
          "target": {
            "type": "string"
          }
        },
        "required": [
          "domain",
          "preset"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "suggest_domains",
      "description": "Names the registrar can sell now that fit a keyword, with prices (registration inventory only). No sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "keyword": {
            "type": "string",
            "maxLength": 63
          },
          "tlds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20
          }
        },
        "required": [
          "keyword"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_tld_info",
      "description": "What an ending costs (registration, renewal, transfer) and its rules: allowed terms, days left to renew after expiry, WHOIS privacy, DNSSEC, HSTS preload. No sign-in needed.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tlds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 10
          }
        },
        "required": [
          "tlds"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_domain",
      "description": "Live state of a domain this organization holds through Nymwell: expiry, renewal price, transfer lock, WHOIS privacy, registry locks, nameservers, contact verification and any transfer in progress.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_auto_renew",
      "description": "Record whether this domain should be renewed. No money moves; Nymwell reminds the workspace 30 and 7 days before expiry, and every renewal is a checkout the person pays. The registrar's own auto-renew always stays off.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "domain",
          "enabled"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_domain_settings",
      "description": "Prepare a WHOIS privacy or transfer lock change. An owner or admin approves it in the console before the registrar is touched.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "privacy_enabled": {
            "type": "boolean"
          },
          "transfer_lock": {
            "type": "boolean"
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_nameservers",
      "description": "Prepare a nameserver change: 2 to 13 hostnames, or \"default\" to return to Nymwell DNS. Pointing elsewhere means the records in Nymwell stop applying. Needs approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "nameservers": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 2,
                "maxItems": 13
              },
              {
                "const": "default"
              }
            ]
          }
        },
        "required": [
          "domain",
          "nameservers"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_contacts",
      "description": "Prepare a contact change. registrant is required (it is the legal holder); admin, tech and billing are optional. A new registrant must confirm by email within 15 days or the domain stops resolving. Needs approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "contacts": {
            "type": "object",
            "properties": {
              "registrant": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "companyName": {
                    "type": "string"
                  },
                  "address1": {
                    "type": "string"
                  },
                  "address2": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string",
                    "description": "Two-letter code"
                  },
                  "email": {
                    "type": "string"
                  },
                  "phone": {
                    "type": "string",
                    "description": "Like +886.912345678"
                  },
                  "fax": {
                    "type": "string"
                  }
                },
                "required": [
                  "firstName",
                  "lastName",
                  "address1",
                  "city",
                  "country",
                  "email",
                  "phone"
                ],
                "additionalProperties": false
              },
              "admin": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "companyName": {
                    "type": "string"
                  },
                  "address1": {
                    "type": "string"
                  },
                  "address2": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string",
                    "description": "Two-letter code"
                  },
                  "email": {
                    "type": "string"
                  },
                  "phone": {
                    "type": "string",
                    "description": "Like +886.912345678"
                  },
                  "fax": {
                    "type": "string"
                  }
                },
                "required": [
                  "firstName",
                  "lastName",
                  "address1",
                  "city",
                  "country",
                  "email",
                  "phone"
                ],
                "additionalProperties": false
              },
              "tech": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "companyName": {
                    "type": "string"
                  },
                  "address1": {
                    "type": "string"
                  },
                  "address2": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string",
                    "description": "Two-letter code"
                  },
                  "email": {
                    "type": "string"
                  },
                  "phone": {
                    "type": "string",
                    "description": "Like +886.912345678"
                  },
                  "fax": {
                    "type": "string"
                  }
                },
                "required": [
                  "firstName",
                  "lastName",
                  "address1",
                  "city",
                  "country",
                  "email",
                  "phone"
                ],
                "additionalProperties": false
              },
              "billing": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "companyName": {
                    "type": "string"
                  },
                  "address1": {
                    "type": "string"
                  },
                  "address2": {
                    "type": "string"
                  },
                  "city": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "zip": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string",
                    "description": "Two-letter code"
                  },
                  "email": {
                    "type": "string"
                  },
                  "phone": {
                    "type": "string",
                    "description": "Like +886.912345678"
                  },
                  "fax": {
                    "type": "string"
                  }
                },
                "required": [
                  "firstName",
                  "lastName",
                  "address1",
                  "city",
                  "country",
                  "email",
                  "phone"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "registrant"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "domain",
          "contacts"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "request_auth_code",
      "description": "Prepare unlocking a domain and revealing its transfer auth code, to move it to another registrar. After approval the code is shown once to the approving person; an agent never sees it. Not possible within 60 days of a registration or transfer.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cancel_registration",
      "description": "Prepare cancelling a registration made in the last few days (the registry's add grace period, about 5 days). Once approved the domain is deleted and the payment refunded.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          }
        },
        "required": [
          "domain"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_domain_services",
      "description": "Read DNSSEC DS records, URL forwarding, email forwarding or branded (vanity) nameservers for a domain, live from the registrar.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "service": {
            "enum": [
              "dnssec",
              "url_forwarding",
              "email_forwarding",
              "vanity_nameservers"
            ]
          }
        },
        "required": [
          "domain",
          "service"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "change_domain_service",
      "description": "Prepare a DNSSEC, URL forwarding, email forwarding or vanity nameserver change. Needs approval. data: dnssec {key_tag, algorithm, digest_type, digest} (delete: digest); url_forwarding {host, forwards_to, type: masked|redirect|302, title?, meta?} (delete: host); email_forwarding {email_box, email_to} (delete: email_box); vanity_nameservers {hostname, ips} (delete: hostname).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "service": {
            "enum": [
              "dnssec",
              "url_forwarding",
              "email_forwarding",
              "vanity_nameservers"
            ]
          },
          "operation": {
            "enum": [
              "create",
              "update",
              "delete"
            ]
          },
          "data": {
            "type": "object"
          }
        },
        "required": [
          "domain",
          "service",
          "operation",
          "data"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_transfers",
      "description": "Transfers into Nymwell for this organization and where each one is.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "cancel_transfer",
      "description": "Prepare cancelling a transfer: direction \"in\" stops one coming to Nymwell (the payment is refunded), \"out\" stops a domain leaving for another registrar. Needs approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "direction": {
            "enum": [
              "in",
              "out"
            ]
          }
        },
        "required": [
          "domain",
          "direction"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_unverified_contacts",
      "description": "Registrant emails still waiting for ICANN verification on this organization's domains, with the deadline. A domain whose registrant misses it stops resolving.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "list_approvals",
      "description": "Changes waiting for a person to approve, and the ones already decided. Approving is done by a person in the console, never through MCP.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "resend_contact_verification",
      "description": "Send the ICANN verification email again for one verification_id from list_unverified_contacts.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "verification_id": {
            "type": "string"
          }
        },
        "required": [
          "verification_id"
        ],
        "additionalProperties": false
      }
    }
  ]
}