Spaceship MCP kết nối trợ lý AI của bạn (chẳng hạn như Claude) với tài khoản Spaceship của bạn. Thông qua đó, trợ lý có thể kiểm tra và đăng ký tên miền, quản lý liên hệ tên miền, đồng thời đọc hoặc chỉnh sửa bản ghi DNS thay mặt bạn — bạn chỉ cần yêu cầu bằng ngôn ngữ thông thường, và trợ lý sẽ gọi đúng công cụ.
Bạn cần có tài khoản Spaceship. Spaceship MCP có tại https://mcp.spaceship.com/mcp.
Cách bạn kết nối phụ thuộc vào trợ lý AI của bạn:
Claude (web và desktop) — mở Settings, chọn Connectors, tìm Spaceship trong thư mục connectors và thêm nó. Claude của Anthropic hiện là ứng dụng khách mà chúng tôi đã xác minh Spaceship MCP hoạt động cùng.
NB: Mặc dù việc đăng ký tên miền qua Spaceship MCP nhìn chung được hỗ trợ đầy đủ, khả năng này hiện vẫn chưa khả dụng cụ thể thông qua connector Claude. Tìm kiếm, tra cứu tên miền, quản lý liên hệ và quản lý bản ghi DNS đã khả dụng và được xác minh là hoạt động với Claude ngay hôm nay.
Các ứng dụng khách MCP khác — thêm máy chủ MCP từ xa và trỏ nó tới https://mcp.spaceship.com/mcp. Các ứng dụng khách khác có thể hoạt động, nhưng chúng tôi chưa xác minh chúng.
Khi bạn kết nối, bạn sẽ được yêu cầu đăng nhập vào Spaceship và cấp cho trợ lý quyền truy cập vào tài khoản của bạn. Trợ lý có thể sử dụng công cụ nào phụ thuộc vào quyền truy cập bạn phê duyệt — nếu một công cụ bị từ chối vì chưa được cấp quyền truy cập, hãy kết nối lại và phê duyệt quyền mà công cụ đó cần.
Công cụ: contacts_save
Chức năng: Lưu chi tiết liên hệ và nhận ID liên hệ
Công cụ: contacts_get
Chức năng: Đọc một liên hệ đã lưu theo ID của liên hệ đó
Công cụ: contacts_list
Chức năng: Liệt kê tất cả liên hệ đã lưu để tìm và dùng lại một liên hệ
Công cụ: domains_list
Chức năng: Liệt kê các tên miền của bạn hoặc tra cứu một tên miền
Công cụ: domains_check_availability
Chức năng: Kiểm tra xem tên miền có sẵn để đăng ký hay không
Công cụ: domain_register
Chức năng: Đăng ký (mua) một tên miền — sẽ tốn tiền
Công cụ: domain_set_contacts
Chức năng: Gán liên hệ cho tên miền bạn sở hữu
Công cụ: domain_set_nameservers
Chức năng: Chuyển một tên miền sang nameserver cơ bản hoặc tùy chỉnh
Công cụ: dns_records_get
Chức năng: Đọc bản ghi DNS cho một tên miền
Công cụ: dns_records_save
Chức năng: Thêm bản ghi DNS hoặc cập nhật TTL của chúng
Công cụ: dns_records_delete
Chức năng: Xóa bản ghi DNS
Công cụ: async_operation_get
Chức năng: Kiểm tra trạng thái của một thao tác chạy lâu
Bất cứ nơi nào cần liên hệ (domain_register, domain_set_contacts), mỗi vai trò nhận một contactId chuỗi — không bao giờ là chi tiết liên hệ nội tuyến. Hãy lưu liên hệ trước bằng contacts_save (trả về contactId của liên hệ), sau đó truyền id đó ở nơi chấp nhận liên hệ. Không có tính năng tự động lưu nội tuyến; một vai trò không thể nhận một đối tượng liên hệ đầy đủ. Bạn cũng có thể dùng lại một contactId từ kết quả contacts_list hoặc từ kết quả domains_list mà bạn đọc được.
Một contactId là một chuỗi gồm 27–32 ký tự chữ và số. Chỉ cần truyền lại nó ở nơi chấp nhận liên hệ.
Một số công cụ được thiết kế để dùng cùng nhau: đầu ra của công cụ này trở thành đầu vào của công cụ tiếp theo.
contacts_save — lưu các liên hệ người đăng ký, quản trị, kỹ thuật và thanh toán (nếu bạn chưa có id của họ) và giữ lại contactId được trả về cho từng liên hệ. Các liên hệ phải tồn tại trước khi bạn có thể đăng ký.
domains_check_availability — kiểm tra (các) tên bạn muốn. Chỉ tiếp tục khi result là available. Mỗi tên khả dụng bao gồm price bằng USD để đăng ký tên đó (cả tiêu chuẩn lẫn cao cấp), hoặc priceUnavailableReason khi không thể xác định, cùng với minRegisterPeriodInYears và maxRegisterPeriodInYears — thời hạn mà TLD cho phép. Lưu ý price bao gồm price.pricedYears năm, đây là thời hạn ngắn nhất mà TLD cho phép và không phải lúc nào cũng là 1.
domain_register (xem trước) — gọi với confirmationToken chưa được đặt để nhận status: confirmation_required, một confirmationToken mới và price sẽ được tính phí. Không có khoản nào được tính. Văn bản phản hồi của công cụ là một xác nhận đầy đủ — thời hạn, bảng phân tích giá, tự động gia hạn, quyền riêng tư WHOIS, nguồn thanh toán và các liên hệ người đăng ký/quản trị/kỹ thuật/thanh toán — hãy hiển thị nguyên văn cho người dùng. Chọn years trong khoảng từ minRegisterPeriodInYears đến maxRegisterPeriodInYears từ bước 2 — giá trị ngoài phạm vi sẽ bị từ chối ngay. Truyền từng vai trò liên hệ dưới dạng contactId mà bạn đã lưu ở bước 1.
domain_register (chấp nhận/từ chối) — sau khi người dùng đồng ý, hãy gọi lại với chính xác cùng các đối số cộng với confirmationToken đó và confirmationResponse: "accept". Việc này sẽ tính phí vào phương thức thanh toán mặc định của tài khoản và không thể hoàn tác. Công cụ trả về ngay với status: pending và một operationId — việc đăng ký sẽ hoàn tất ở chế độ nền. Để hủy thay thế, hãy gọi lại với cùng confirmationToken và confirmationResponse: "decline" — sẽ không có khoản nào được tính. Token hết hạn sau một thời gian ngắn và gắn với chính xác các đối số và mức giá mà nó được cấp cho; nếu thiếu, hết hạn hoặc không còn khớp, lệnh gọi sẽ trả về một xác nhận hoàn toàn mới thay vì lỗi — tuyệt đối không tính phí. Nếu không thể xác định giá ở một trong hai lệnh gọi, công cụ sẽ trả về status: price_unavailable thay thế và không có khoản nào được tính.
async_operation_get — truyền operationId từ bước 4 để kiểm tra tiến trình. Lặp lại cho đến khi status trở thành success hoặc failed.
contacts_save ──▶ domains_check_availability ──▶ domain_register ──▶ domain_register ──▶ async_operation_get(các id contactId) (khả dụng? + giá + (token chưa đặt: (token + (pending →min/maxRegisterPeriod) xác nhận, accept: operationId, success/failed)confirmationToken, pending)không tính phí)
domain_set_contacts — gán liên hệ cho tên miền bằng contactId (hãy lưu chúng bằng contacts_save trước nếu cần). Việc này hoàn tất ngay lập tức và trả về verificationStatus: verification nghĩa là người đăng ký phải xác nhận địa chỉ email của họ trước khi thay đổi được áp dụng hoàn toàn (một email sẽ được gửi cho họ), success nghĩa là đã được xác nhận, và null nghĩa là không cần xác nhận cho tên miền đó.
domains_list — tìm tên miền và xem nameservers hiện tại của nó ({ provider, hosts }).
domain_set_nameservers — chuyển nó sang nameserver mặc định của Spaceship với provider: "basic" (không có hosts), hoặc trỏ nó đến nameserver riêng của bạn với provider: "custom" và danh sách 2–12 hosts. Công cụ trả về { provider, hosts } kết quả, và một lệnh gọi domains_list tiếp theo sẽ phản ánh thay đổi. Việc áp dụng lại trạng thái mà tên miền đã ở sẵn sẽ trả về lỗi xác thực thay vì không làm gì — hãy coi đó là điều được mong đợi, không phải lỗi cần thử lại.
domains_list — tìm tên miền bạn muốn quản lý (hoặc truyền trực tiếp tên của nó nếu bạn biết).
dns_records_get — đọc các bản ghi hiện tại của tên miền.
dns_records_save hoặc dns_records_delete — thêm, cập nhật hoặc xóa bản ghi. Các bản ghi được trả về bởi dns_records_get có cùng cấu trúc mà các công cụ lưu và xóa chấp nhận (xóa chỉ bỏ qua ttl), vì vậy trợ lý có thể đọc, điều chỉnh và ghi lại. Việc khớp không phân biệt chữ hoa chữ thường ngoại trừ bản ghi TXT, vốn phân biệt chữ hoa chữ thường.
domains_list — duyệt qua tất cả tên miền của bạn theo trang với sắp xếp, hoặc lấy một tên miền duy nhất theo tên. Mỗi tên miền bao gồm ngày hết hạn, cài đặt tự động gia hạn, trạng thái, nameserver, bảo vệ quyền riêng tư và các ID liên hệ được gán.
contacts_list — duyệt qua tất cả liên hệ đã lưu trên tài khoản của bạn để tìm và dùng lại một liên hệ hiện có (theo ID liên hệ của nó) thay vì tạo bản sao.
contacts_get — tra cứu chi tiết đằng sau bất kỳ ID liên hệ nào bạn thấy trên một tên miền hoặc trong kết quả contacts_list.
Mỗi công cụ trả về kết quả dưới dạng JSON có cấu trúc. Các thao tác chạy lâu (hiện tại chỉ có domain_register) trả về tham chiếu thao tác để thăm dò bằng async_operation_get; tất cả công cụ khác hoàn tất ngay lập tức.
Liên hệ là những người hoặc tổ chức gắn với một đăng ký tên miền (người đăng ký, quản trị, kỹ thuật, thanh toán). Một liên hệ được tham chiếu ở mọi nơi bằng contact ID của nó — một chuỗi không trong suốt.
contacts_save — Lưu liên hệLưu chi tiết liên hệ và trả về ID liên hệ được tạo. Việc xác thực một số trường (chẳng hạn như stateProvince và postalCode) phụ thuộc vào quốc gia được chọn.
Tham số: firstName
Bắt buộc: Có
Kiểu & ràng buộc: Chuỗi, 1–64 ký tự. Có thể bao gồm dấu gạch nối và dấu nháy đơn.
Tham số: lastName
Bắt buộc: Có
Kiểu & ràng buộc: Chuỗi, 1–64 ký tự. Có thể bao gồm dấu gạch nối và dấu nháy đơn.
Tham số: email
Bắt buộc: Có
Kiểu & ràng buộc: Địa chỉ email hợp lệ, tối đa 254 ký tự.
Tham số: address1
Bắt buộc: Có
Kiểu & ràng buộc: Dòng địa chỉ 1. Chuỗi, 1–128 ký tự.
Tham số: city
Bắt buộc: Có
Kiểu & ràng buộc: Chuỗi, 1–64 ký tự.
Tham số: country
Bắt buộc: Có
Kiểu & ràng buộc: Mã quốc gia gồm hai chữ cái (ISO 3166-1 alpha-2), ví dụ: US.
Tham số: phone
Bắt buộc: Có
Kiểu & ràng buộc: Định dạng quốc tế +CountryCode.Number, ví dụ: +1.2025551234. Tối đa 32 ký tự.
Tham số: organization
Bắt buộc: Không
Kiểu & ràng buộc: Tên tổ chức/công ty. 1–128 ký tự.
Tham số: address2
Bắt buộc: Không
Kiểu & ràng buộc: Dòng địa chỉ 2. 1–128 ký tự.
Tham số: stateProvince
Bắt buộc: Không
Kiểu & ràng buộc: Tên bang/tỉnh, 1–64 ký tự. Có thể bắt buộc tùy theo quốc gia.
Tham số: postalCode
Bắt buộc: Không
Kiểu & ràng buộc: 1–16 ký tự. Có thể bắt buộc tùy theo quốc gia.
Tham số: phoneExt
Bắt buộc: Không
Kiểu & ràng buộc: Số máy lẻ điện thoại, 1–16 ký tự.
Tham số: fax
Bắt buộc: Không
Loại & ràng buộc: Số fax, cùng định dạng +CountryCode.Number, tối đa 32 ký tự.
Tham số: faxExt
Bắt buộc: Không
Loại & ràng buộc: Phần mở rộng fax, 1–16 ký tự.
Tham số: taxNumber
Bắt buộc: Không
Loại & ràng buộc: Mã số thuế, 1–32 ký tự.
Trả về
{ "contactId": "..." }
contactId (27–32 ký tự chữ và số) là giá trị bạn truyền cho domain_register, domain_set_contacts và contacts_get.
contacts_get — Lấy liên hệĐọc chi tiết của một liên hệ đã lưu theo ID liên hệ của nó. ID liên hệ đến từ contacts_save, contacts_list hoặc trường contacts trong kết quả của domains_list.
Tham số: contactId
Bắt buộc: Có
Loại & ràng buộc: ID liên hệ, 27–32 ký tự chữ và số.
Trả về — { contact } với:
Trường: firstName, lastName, email, address1, city, country, phone, postalCode
Loại: Chuỗi
Trường: organization, address2, stateProvince, phoneExt, fax, faxExt, taxNumber
Loại: Chuỗi hoặc null
contacts_list — Liệt kê liên hệLiệt kê tất cả liên hệ đã lưu trong tài khoản của bạn, ताकि bạn có thể tìm và dùng lại một liên hệ hiện có (theo ID liên hệ của nó) thay vì tạo bản sao hoặc phải tìm trong các tên miền của mình. Danh sách được phân trang và có thể sắp xếp, nhất quán với domains_list.
Tham số: take
Bắt buộc: Không
Loại & ràng buộc: Số mục trên mỗi trang, 1–100. Mặc định 10.
Tham số: skip
Bắt buộc: Không
Loại & ràng buộc: Số mục cần bỏ qua, từ 0 trở lên. Mặc định 0.
Tham số: orderBy
Bắt buộc: Không
Loại & ràng buộc: Tối đa 8 khóa sắp xếp: name, email, organization; thêm tiền tố - để sắp xếp giảm dần (ví dụ -name).
Trả về — { items, total } trong đó total là số liên hệ duy nhất trong tài khoản (loại trùng theo ID liên hệ, không phải kích thước trang), và mỗi mục chứa đủ thông tin để phân biệt các liên hệ mà không cần gọi tiếp theo. Nếu tài khoản có các mục trùng lặp cho cùng một ID liên hệ, chúng sẽ được gộp thành một, vì vậy total đếm các liên hệ riêng biệt thay vì các hàng thô phía máy chủ:
Trường: contactId
Loại: Chuỗi (27–32 ký tự chữ và số). Truyền cho contacts_get, domain_register hoặc domain_set_contacts.
Trường: name
Loại: Chuỗi — tên của liên hệ.
Trường: email
Loại: Chuỗi hoặc null khi liên hệ không có email trong hồ sơ.
Trường: organization
Loại: Chuỗi hoặc null khi liên hệ không có tổ chức trong hồ sơ.
{"items": [{ "contactId": "1anq5bsl9haBy21rOV9aeDWrARBsV", "name": "Ada Lovelace", "email": "ada@example.com", "organization": "Analytical Engines" }],"total": 1}
Các đầu vào tên miền (domain/domainName) chấp nhận Unicode (IDN) hoặc ASCII (A-label) — theo cách nào thì công cụ cũng tự động chuẩn hóa tên sang punycode trước khi sử dụng. domains_check_availability và domain_register còn yêu cầu TLD mà Spaceship hỗ trợ đăng ký: tên miền có TLD không được hỗ trợ sẽ được coi là không khả dụng thay vì được kiểm tra hoặc tính phí. Các công cụ tên miền khác (domains_list, domain_set_contacts, domain_set_nameservers) và các công cụ DNS chỉ chuẩn hóa tên và không bao giờ từ chối dựa trên hỗ trợ TLD.
domains_list — Liệt kê tên miềnTruy xuất danh sách tên miền của bạn có phân trang. Truyền domain để thay vào đó lấy một tên miền duy nhất theo tên (khi đó phân trang và sắp xếp sẽ bị bỏ qua, và kết quả sẽ bao gồm một note cho biết điều đó nếu chúng đã được cung cấp).
Tham số: domain
Bắt buộc: Không
Loại & ràng buộc: Tên miền đầy đủ để lấy một tên miền duy nhất. Chấp nhận Unicode (IDN) hoặc ASCII (A-label) — tự động chuẩn hóa sang punycode.
Tham số: take
Bắt buộc: Không
Loại & ràng buộc: Số mục trên mỗi trang, 1–100. Mặc định 10.
Tham số: skip
Bắt buộc: Không
Loại & ràng buộc: Số mục cần bỏ qua, từ 0 trở lên. Mặc định 0.
Tham số: orderBy
Bắt buộc: Không
Loại & ràng buộc: Tối đa 8 khóa sắp xếp: name, unicodeName, registrationDate, expirationDate; thêm tiền tố - để sắp xếp giảm dần (ví dụ -expirationDate).
Trả về — { items, total } trong đó mỗi mục mô tả một tên miền:
Trường: name / unicodeName
Ý nghĩa: Tên miền ở dạng ASCII và Unicode.
Trường: isPremium
Ý nghĩa: Tên miền có phải là tên premium hay không.
Trường: autoRenew
Ý nghĩa: Tự động gia hạn có được bật hay không.
Trường: registrationDate / expirationDate
Ý nghĩa: Dấu thời gian đăng ký và hết hạn.
Trường: lifecycleStatus
Ý nghĩa: creating, registered, grace1, grace2 hoặc redemption.
Trường: verificationStatus
Ý nghĩa: verification, success, failed hoặc null khi không áp dụng.
Trường: eppStatuses
Ý nghĩa: Mã trạng thái registry (ví dụ: khóa chuyển nhượng).
Trường: suspensions
Ý nghĩa: Các trạng thái tạm ngưng đang hoạt động, mỗi trạng thái có một reasonCode.
Trường: privacyProtection
Ý nghĩa: { level: "public" | "high", contactForm: boolean }.
Trường: nameservers
Ý nghĩa: { provider: "basic" | "custom", hosts: [...] }.
Trường: contacts
Ý nghĩa: ID liên hệ: registrant, cộng với admin/tech/billing (có thể là null) và attributes (danh sách ID liên hệ thuộc tính mở rộng hoặc null). Có thể đọc qua contacts_get.
Spaceship MCP điền mọi trường ở trên — bao gồm contacts, eppStatuses, suspensions, verificationStatus, nameservers, một autoRenew thực, và một unicodeName riêng biệt khi tên miền có trường đó — cho cả danh sách nhiều mục và truy xuất một tên miền.
domains_check_availability — Kiểm tra tính khả dụng của tên miềnKiểm tra xem một hoặc nhiều tên miền có sẵn để đăng ký hay không. Sử dụng endpoint tên miền đơn cho một tên và endpoint hàng loạt cho nhiều tên. Tên miền có TLD không được hỗ trợ đăng ký sẽ hoàn toàn không được gửi tới bước kiểm tra khả dụng — nó được trả về ngay lập tức là tldNotSupported.
Tham số: domains
Bắt buộc: Có
Loại & ràng buộc: 1–20 tên miền đầy đủ. Mỗi tên chấp nhận Unicode (IDN) hoặc ASCII (A-label) — tự động chuẩn hóa sang punycode.
Trả về — { results }, một mục cho mỗi tên được yêu cầu:
Trường: domain
Ý nghĩa: Tên đã được kiểm tra.
Trường: result
Ý nghĩa: available, taken, invalidDomainName, tldNotSupported hoặc unexpectedError.
Trường: premiumPricing
Ý nghĩa: Đối với tên premium: danh sách { operation, price, currency } trong đó operation là register, transfer, renew hoặc restore. Trống đối với tên thông thường.
Trường: price
Ý nghĩa: Đối với các tên available (tiêu chuẩn và premium): giá USD để đăng ký tên miền trong thời hạn ngắn nhất mà TLD cho phép — { amount, currency: "USD", pricedYears?, pricePerYear?, icannFee?, isPremium }. amount là tổng số tiền phải trả cho toàn bộ thời hạn đó; pricedYears cho biết số năm mà giá này bao gồm. Không báo giá trước giảm giá hoặc giá "was". icannFee là phí ICANN (USD) đã được bao gồm trong amount, được trả về riêng để có thể giải thích chi tiết; nó chỉ xuất hiện khi TLD có tính phí.
Trường: pricePerYear
Ý nghĩa: Bên trong price: amount chia cho pricedYears, để luôn có sẵn con số theo năm để so sánh. Khi pricedYears là 1 thì đó là giá thực cho một năm; lớn hơn 1 thì đó là giá trung bình mỗi năm của cả thời hạn, không phải thời hạn mà bạn có thể mua.
Trường: minRegisterPeriodInYears / maxRegisterPeriodInYears
Ý nghĩa: Đối với các tên available: thời hạn đăng ký ngắn nhất và dài nhất mà TLD đó thực sự cho phép, dưới dạng hai số đơn giản. Dùng chúng để chọn years hợp lệ cho domain_register. Cả hai đều bị bỏ qua khi không thể xác định thời hạn được phép.
Trường: priceUnavailableReason
Ý nghĩa: Xuất hiện thay cho price khi không thể xác định giá cho một tên khả dụng. Bản thân việc kiểm tra vẫn thành công.
Chỉ các tên khả dụng mới có giá; kết quả taken/không hợp lệ không có cả price lẫn priceUnavailableReason.
Hầu hết TLD cho phép một năm, nhưng một số thì không..ai, chẳng hạn, có thời hạn tối thiểu là hai năm. Với những trường hợp đó, price.amount là tổng cho thời hạn tối thiểu — không phải giá một năm mà bạn có thể áp dụng — và price.pricedYears cho biết điều đó:
{"domain": "example.ai","result": "available","premiumPricing": [],"price": { "amount": 159.96, "currency": "USD", "pricedYears": 2, "pricePerYear": 79.98, "isPremium": false },"minRegisterPeriodInYears": 2,"maxRegisterPeriodInYears": 10}
pricePerYear có mặt ở đây — 159.96 chia cho hai năm mà nó bao gồm sẽ ra 79.98. Đây là tổng chia cho thời hạn, không phải mức giá bạn có thể trả cho một năm riêng lẻ (không thể mua đăng ký .ai trong một năm). Luôn hiển thị amount cùng với pricedYears ("$159.96 cho 2 năm"), không bao giờ chỉ hiển thị riêng amount. Với TLD thông thường, pricedYears là 1 và pricePerYear bằng amount.
domain_register — Đăng ký tên miềnĐăng ký (mua) một tên miền. Thao tác này sẽ tính phí vào phương thức thanh toán mặc định của tài khoản bạn và không thể hoàn tác. Trình tự được khuyến nghị: domains_check_availability → domain_register. Tên miền có TLD không được hỗ trợ đăng ký sẽ bị từ chối ngay lập tức — trước mọi bước kiểm tra khả dụng, định giá hoặc tính phí.
years phải nằm trong khoảng được phép riêng của TLD. Giới hạn 1–10 bên dưới là giới hạn ngoài cùng cho tất cả TLD; mỗi TLD có phạm vi hẹp hơn. .ai cho phép 2–10, .co và .io cho phép 1–5, .sg cho phép 1–2, .fr chính xác là 1. Giá trị years nằm ngoài phạm vi đó sẽ bị từ chối với lỗi xác thực nêu rõ phạm vi được phép — trước mọi bước kiểm tra khả dụng, định giá hoặc tính phí — và giá trị này không được âm thầm điều chỉnh cho bạn:
.ai domains cannot be registered for 1 year: this TLD allows 2–10 years. Call domains_check_availability for this domain to see its allowed registration period.
Trước tiên hãy đọc minRegisterPeriodInYears/maxRegisterPeriodInYears từ domains_check_availability rồi chọn một giá trị years nằm trong khoảng đó. Cùng một bước kiểm tra sẽ được chạy lại ở lệnh xác nhận (confirmationResponse: "accept"), vì vậy không thể bỏ qua bằng cách xác nhận.
Xác nhận hai bước trước khi tính phí. Gọi lần đầu với confirmationToken chưa được đặt: công cụ sẽ định giá lại tên miền mới nhất, tạo xác nhận đầy đủ — thời hạn, bảng phân tích giá (bao gồm mọi phí ICANN và việc tên miền có phải premium hay không), tự động gia hạn, quyền riêng tư WHOIS, nguồn thanh toán và các liên hệ registrant/admin/tech/billing (liên hệ giống hệt registrant sẽ được hiển thị là "same as registrant") — rồi trả về status: "confirmation_required" cùng với price đó và một confirmationToken mới. Không có gì được đăng ký hoặc bị tính phí trong lần gọi này. Xác nhận đầy đủ là văn bản phản hồi của công cụ; hãy hiển thị nguyên trạng cho người dùng. Khi họ đồng ý, hãy gọi lại với chính xác cùng các đối số cộng thêm confirmationToken này và confirmationResponse: "accept" để gửi giao dịch mua, hoặc confirmationResponse: "decline" để hủy — sẽ không có khoản phí nào khi từ chối. Token được gắn với chính xác các đối số này và mức giá đã báo, đồng thời hết hạn sau một thời gian ngắn: token bị thiếu, hết hạn, bị sửa đổi hoặc không còn khớp trong lệnh xác nhận sẽ chỉ đơn giản trả về một xác nhận hoàn toàn mới với token mới — không bao giờ là lỗi, không bao giờ bị tính phí. Nếu không thể xác định giá ở bất kỳ lần gọi nào, công cụ sẽ trả về status: "price_unavailable" thay vì token và không bao giờ tính phí; hãy thử lại sau. Lệnh đã xác nhận sẽ trả về ngay lập tức với status: "pending" và một operationId — việc đăng ký sẽ hoàn tất ở nền; kiểm tra bằng async_operation_get.
Tham số: domain
Bắt buộc: Có
Loại & ràng buộc: Tên miền đầy đủ để đăng ký, ví dụ example.com. Chấp nhận Unicode (IDN) hoặc ASCII (A-label) — tự động chuẩn hóa sang punycode.
Tham số: years
Bắt buộc: Có
Loại & ràng buộc: Thời hạn đăng ký tính theo năm. 1–10 là giới hạn ngoài cùng; phạm vi được chấp nhận là phạm vi riêng của TLD — xem minRegisterPeriodInYears/maxRegisterPeriodInYears từ domains_check_availability. Các giá trị ngoài phạm vi sẽ bị từ chối, không được điều chỉnh.
Tham số: autoRenew
Bắt buộc: Có
Loại & ràng buộc: Boolean. Khi true, tên miền sẽ tự động gia hạn khi hết hạn bằng phương thức thanh toán mặc định của tài khoản.
Tham số: privacy.level
Bắt buộc: Có
Loại & ràng buộc: high ẩn thông tin liên hệ của registrant khỏi WHOIS công khai; public sẽ công bố chúng.
Tham số: privacy.userConsent
Bắt buộc: Có
Loại & ràng buộc: Boolean. Phải xác nhận rằng bạn đồng ý với cài đặt quyền riêng tư đã chọn.
Tham số: contacts.registrant
Bắt buộc: Có
Loại & ràng buộc: contactId dạng chuỗi (27–32 ký tự chữ và số), từ contacts_save.
Tham số: contacts.admin
Bắt buộc: Có
Loại & ràng buộc: contactId dạng chuỗi (27–32 ký tự chữ và số), từ contacts_save.
Tham số: contacts.tech
Bắt buộc: Có
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số), từ contacts_save.
Tham số: contacts.billing
Bắt buộc: Có
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số), từ contacts_save.
Tham số: contacts.attributes
Bắt buộc: Không
Loại & ràng buộc: Mảng ID liên hệ thuộc tính mở rộng (tối đa 5); chỉ bắt buộc với một số TLD nhất định, nếu không thì bỏ qua hoặc dùng null.
Tham số: confirmationToken
Bắt buộc: Không
Loại & ràng buộc: Chuỗi, tối đa 4096 ký tự. Mã token do máy chủ cấp, được trả về từ một lệnh gọi domain_register trước đó cho chính xác các đối số này. Bỏ qua ở lệnh gọi đầu tiên cho một lần thử đăng ký mới. Hết hạn sau một thời gian ngắn và gắn với chính xác các đối số và mức giá mà nó được cấp cho — gửi lại nguyên trạng, cùng với confirmationResponse, để xử lý nó.
Tham số: confirmationResponse
Bắt buộc: Có điều kiện
Loại & ràng buộc: "accept" hoặc "decline". Chỉ có ý nghĩa khi đi cùng một confirmationToken hợp lệ. "accept" gửi đăng ký (có tính phí) được hiển thị trong xác nhận đó; "decline" hủy mà không tính phí. Bỏ qua ở lệnh gọi đầu tiên.
Trả về — sau lệnh gọi đầu tiên (chưa tính phí):
{"domain": "example.com","years": 1,"status": "confirmation_required","price": {"amount": 9.08,"currency": "USD","pricedYears": 1,"pricePerYear": 9.08,"icannFee": 0.2,"isPremium": false},"confirmationToken": "v1.eyJ2IjoxLCJwIjoi...aWQiOjF9.9F3q7z_5c8Vb...","note": "Nothing has been charged yet. Show the confirmation to the user and, once they agree, call domain_register again with this confirmationToken and confirmationResponse=\"accept\" to complete the purchase, or confirmationResponse=\"decline\" to cancel."}
Cùng với JSON này, văn bản phản hồi của công cụ là toàn bộ nội dung xác nhận để hiển thị cho người dùng — nội dung này nhắc lại tên miền, thời hạn và giá ở trên, cộng với các dòng cho Auto-renew: on/off, WHOIS privacy: on/off, Payment source: Spaceship account funds, và từng liên hệ registrant/admin/tech/billing (tên, email, quốc gia — một liên hệ trùng với registrant sẽ hiển thị là "same as registrant"), sau đó là hướng dẫn cho lệnh gọi tiếp theo. Với thời hạn nhiều năm, price.amount là tổng cho toàn bộ thời hạn và price.pricePerYear là tổng đó chia cho thời hạn — ví dụ: years: 5 trên .com trả về { "amount": 48.52, "pricedYears": 5, "pricePerYear": 9.70 }, và example.ai với years: 2 trả về { "amount": 159.96, "pricedYears": 2, "pricePerYear": 79.98 }.
Trả về — sau confirmationResponse: "accept" (đã gửi đăng ký):
{"domain": "example.com","years": 1,"status": "pending","operationId": "...","price": {"amount": 9.08,"currency": "USD","pricedYears": 1,"pricePerYear": 9.08,"icannFee": 0.2,"isPremium": false},"note": "Registration of example.com submitted. Ask again, or call async_operation_get with this operationId, to check status."}
Trả về — sau confirmationResponse: "decline" (chưa tính phí):
{"domain": "example.com","years": 1,"status": "cancelled","price": { "amount": 9.08, "currency": "USD", "pricedYears": 1, "pricePerYear": 9.08, "icannFee": 0.2, "isPremium": false },"note": "Registration of example.com was not submitted because the purchase was not confirmed."}
Trả về — nếu không thể xác định giá, ở một trong hai lệnh gọi:
{"domain": "example.com","years": 1,"status": "price_unavailable","priceUnavailableReason": "Price is currently unavailable for this domain.","note": "Registration of example.com could not be priced right now, so nothing was confirmed or charged. Try again shortly."}
status có thể là:
Trạng thái: confirmation_required
Ý nghĩa: Xem trước — chưa tính phí. Hiển thị văn bản phản hồi cho người dùng, sau đó gọi lại với confirmationToken và confirmationResponse này. Cũng được trả về, với một token mới, khi confirmationToken đã gửi bị thiếu, hết hạn, bị can thiệp hoặc không còn khớp với đối số/giá hiện tại — không bao giờ là lỗi.
Trạng thái: cancelled
Ý nghĩa: Giao dịch mua đã bị từ chối (confirmationResponse: "decline"), nên không có gì được gửi đi.
Trạng thái: pending
Ý nghĩa: Đã gửi; cơ quan đăng ký đang hoàn tất ở chế độ nền. Thăm dò async_operation_get với operationId.
Trạng thái: price_unavailable
Ý nghĩa: Không thể xác định giá, nên không có token nào được cấp và không có khoản nào bị tính phí. Hãy thử lại sau.
operationId là một chuỗi phẳng — truyền nó cho async_operation_get, công cụ này sẽ báo liệu việc đăng ký cuối cùng thành công hay thất bại. price hiển thị tại confirmation_required chính xác là số tiền sẽ được tính khi confirmationResponse: "accept" — price.amount là tổng cho toàn bộ thời hạn đó và price.pricedYears cho biết thời hạn, vì vậy luôn hiển thị cả hai cùng nhau. Khi TLD có phí ICANN, price.amount đã bao gồm phí đó và price.icannFee cho biết số tiền phí để có thể giải thích.
domain_set_contacts — Đặt liên hệ tên miềnThay đổi các liên hệ được gán cho tên miền bạn sở hữu. Hoàn tất ngay lập tức (không có thao tác nào để thăm dò).
Tham số: domainName
Bắt buộc: Có
Loại & ràng buộc: Tên miền đủ điều kiện đầy đủ. Chấp nhận Unicode (IDN) hoặc ASCII (A-label) — tự động chuẩn hóa sang punycode.
Tham số: registrant
Bắt buộc: Có
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số), từ contacts_save.
Tham số: admin
Bắt buộc: Không
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số) hoặc null.
Tham số: tech
Bắt buộc: Không
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số) hoặc null.
Tham số: billing
Bắt buộc: Không
Loại & ràng buộc: contactId chuỗi (27–32 ký tự chữ và số) hoặc null.
Tham số: attributes
Bắt buộc: Không
Loại & ràng buộc: Mảng ID liên hệ thuộc tính mở rộng (tối đa 5); chỉ bắt buộc với một số TLD nhất định, nếu không thì bỏ qua hoặc dùng null.
Trả về
{ "verificationStatus": "verification" }
Giá trị verificationStatus được trả về phản ánh việc xác minh email theo ICANN RAA: verification — registrant phải xác nhận địa chỉ email của họ (một email xác nhận sẽ được gửi); success — đã xác nhận; null — xác minh RAA không áp dụng cho tên miền này.
domain_set_nameservers — Đặt máy chủ tên miềnThay đổi nameserver ở cấp registrar của một tên miền. Hoàn tất ngay lập tức (không có thao tác nào để thăm dò). Thay đổi này sẽ được phản ánh bởi domains_list sau đó.
Tham số: domainName
Bắt buộc: Có
Loại & ràng buộc: Tên miền đủ điều kiện đầy đủ. Chấp nhận Unicode (IDN) hoặc ASCII (A-label) — tự động chuẩn hóa sang punycode.
Tham số: provider
Bắt buộc: Có
Loại & ràng buộc: basic (nameserver mặc định của Spaceship) hoặc custom (máy chủ của riêng bạn).
Tham số: hosts
Bắt buộc: Có điều kiện
Loại & ràng buộc: Bắt buộc khi provider là custom: 2–12 hostname nameserver (mỗi hostname là một FQDN hợp lệ, 4–255 ký tự). Phải bỏ qua khi provider là basic.
Trả về
{ "provider": "custom", "hosts": ["ns1.example.com", "ns2.example.com"] }
Áp dụng lại trạng thái mà tên miền đã ở sẵn (ví dụ: đặt basic khi nó đã là basic) sẽ trả về lỗi xác thực thay vì thành công không thay đổi gì — hãy coi đó là kết quả dự kiến, không phải lỗi cần thử lại.
Giá trị domainName mà các công cụ này nhận vào chấp nhận Unicode (IDN) hoặc ASCII (A-label) và được tự động chuẩn hóa sang punycode; hỗ trợ TLD không được thực thi ở đây.
dns_records_get — Lấy bản ghi DNSTruy xuất danh sách phân trang các bản ghi tài nguyên DNS cho một tên miền.
Tham số: domainName
Bắt buộc: Có
Loại & ràng buộc: Tên miền có các bản ghi cần lấy.
Tham số: take
Bắt buộc: Không
Loại & ràng buộc: Số mục trên mỗi trang, 1–500. Mặc định là 100.
Tham số: skip
Bắt buộc: Không
Loại & ràng buộc: Số mục cần bỏ qua, từ 0 trở lên. Mặc định là 0.
Tham số: orderBy
Bắt buộc: Không
Loại & ràng buộc: Tối đa 8 khóa sắp xếp: type, -type, name, -name.
Trả về — { items, total }. Mỗi mục là một bản ghi như được mô tả trong Hình dạng bản ghi, cộng với trường group tùy chọn cho biết bản ghi đến từ đâu (custom — do bạn tạo, product — được quản lý bởi một sản phẩm Spaceship, personalNs — nameserver cá nhân).
dns_records_save — Lưu bản ghi DNSThêm bản ghi DNS tùy chỉnh hoặc cập nhật TTL của các bản ghi hiện có. Các bản ghi được đối sánh không phân biệt chữ hoa chữ thường, ngoại trừ bản ghi TXT (phân biệt chữ hoa chữ thường).
Tham số: domainName
Bắt buộc: Có
Loại & ràng buộc: Tên miền có các bản ghi cần cập nhật.
Tham số: records
Bắt buộc: Có
Loại & ràng buộc: 1–500 bản ghi — xem Hình dạng bản ghi. Mỗi bản ghi có thể bao gồm ttl tùy chọn.
Tham số: force
Bắt buộc: Không
Loại & ràng buộc: Boolean. Bỏ qua bước kiểm tra giải quyết xung đột và buộc cập nhật zone.
Trả về — { "saved": <number> }, số lượng bản ghi đã gửi. Phản hồi thành công nghĩa là tất cả bản ghi đã được chấp nhận; nếu bất kỳ bản ghi nào thất bại, toàn bộ lệnh gọi sẽ trả về lỗi thay vì thành công.
dns_records_delete — Xóa bản ghi DNSXóa các bản ghi DNS tùy chỉnh. Không thể hoàn tác việc xóa. Các bản ghi được đối sánh không phân biệt chữ hoa chữ thường, ngoại trừ bản ghi TXT (phân biệt chữ hoa chữ thường).
Tham số: domainName
Bắt buộc: Có
Loại & ràng buộc: Tên miền có các bản ghi cần xóa.
Tham số: records
Bắt buộc: Có
Loại & ràng buộc: 1–500 bản ghi xác định các bản ghi hiện có — cùng hình dạng như khi lưu, nhưng không có ttl.
Trả về — { "deleted": <number> }, số lượng bản ghi đã gửi. Nếu bất kỳ bản ghi nào không thể đối sánh, toàn bộ lệnh gọi sẽ thất bại và không có gì bị xóa.
Mỗi bản ghi có:
type — một trong 13 loại được hỗ trợ bên dưới.
name — tên bản ghi không bao gồm tên miền: dùng @ cho chính tên miền đó (apex) và * cho ký tự đại diện.
ttl (chỉ khi lưu, tùy chọn) — thời gian lưu đệm tính bằng giây, 60–3600.
Các trường theo từng loại:
Loại: A
Trường: address — địa chỉ IPv4.
Loại: AAAA
Trường: address — địa chỉ IPv6.
Loại: CNAME
Trường: cname — tên miền chuẩn tắc (tối đa 253 ký tự).
Loại: ALIAS
Trường: aliasName — tên miền chuẩn tắc; hành vi giống CNAME cho apex, nơi CNAME không được phép.
Loại: NS
Trường: nameserver — tên nameserver.
Loại: PTR
Trường: pointer — tên miền cho địa chỉ IP đã cho.
Loại: TXT
Trường: value — giá trị văn bản (đối sánh phân biệt chữ hoa chữ thường).
Loại: MX
Trường: exchange — máy chủ thư; preference — độ ưu tiên (0–65535, số thấp được ưu tiên hơn).
Loại: CAA
Trường: flag — 0 hoặc 128 (bit quan trọng); tag — issue, issuewild, hoặc iodef; value — mã định danh CA với các tham số tùy chọn.
Loại: SRV
Trường: service (ví dụ: _sip); protocol (ví dụ: _tcp); priority và weight (0–65535); port (1–65535); target — tên miền máy chủ.
Loại: TLSA
Trường: usage, selector, matching (mỗi trường 0–255); port — * hoặc _<1–65535>; protocol (ví dụ: _tcp); associationData — hàm băm chứng chỉ hoặc dữ liệu.
Loại: HTTPS
Trường: svcPriority (0–65535; 0 = AliasMode); targetName — FQDN hoặc .; tùy chọn port (* hoặc _<1–65535>), scheme (phải là _https khi port được đặt), svcParams.
Loại: SVCB
Trường: svcPriority (0–65535; 0 = AliasMode); targetName — FQDN hoặc .; tùy chọn port, scheme (ví dụ: _tcp), svcParams.
async_operation_get — Lấy trạng thái thao tác bất đồng bộKiểm tra một thao tác chạy lâu được khởi động bởi công cụ khác (hiện tại là domain_register). Gọi công cụ này với operationId được đặt thành operationId mà công cụ đó đã trả về, và lặp lại cho đến khi status là success hoặc failed.
Tham số: operationId
Bắt buộc: Có
Kiểu & ràng buộc: Chuỗi chữ và số, tối đa 36 ký tự, được trả về bởi công cụ đã khởi động thao tác.
Trả về
Trường: operationId
Ý nghĩa: Thao tác đang được thăm dò.
Trường: status
Ý nghĩa: pending, success, hoặc failed.
Trường: type
Ý nghĩa: Loại thao tác, hoặc null.
Trường: details
Ý nghĩa: Chi tiết bổ sung về thao tác, hoặc null.
Trường: createdAt / modifiedAt
Ý nghĩa: Thời điểm thao tác được tạo / cập nhật lần cuối (modifiedAt có thể là null).
Khi một lệnh gọi thất bại, công cụ trả về lỗi với mã và detail dễ hiểu cho con người giải thích điều gì đã xảy ra lỗi — ví dụ như đầu vào không hợp lệ (tên miền hoặc ID liên hệ sai định dạng), tên miền hoặc liên hệ không tồn tại, hoặc xung đột với trạng thái hiện tại. Nếu một công cụ bị từ chối vì trợ lý chưa được cấp quyền truy cập vào công cụ đó, hãy kết nối lại Spaceship MCP và phê duyệt quyền truy cập mà nó yêu cầu.