Spaceship MCP는 AI 어시스턴트(예: Claude)를 Spaceship 계정에 연결합니다. 이를 통해 어시스턴트는 도메인을 확인하고 등록하며, 도메인 연락처를 관리하고, 사용자를 대신해 DNS 레코드를 읽거나 편집할 수 있습니다 — 사용자는 자연어로 요청만 하면 되고, 어시스턴트가 적절한 도구를 호출합니다.
Spaceship 계정이 필요합니다. Spaceship MCP는 https://mcp.spaceship.com/mcp에서 사용할 수 있습니다.
연결 방법은 AI assistant에 따라 다릅니다:
Claude (웹 및 데스크톱) — Settings를 열고 Connectors를 선택한 다음, 커넥터 디렉터리에서 Spaceship을 찾아 추가하세요. Anthropic의 Claude는 현재 Spaceship MCP와 작동하는 것이 확인된 클라이언트입니다.
참고: Spaceship MCP를 통한 도메인 등록은 전반적으로 완전히 지원되지만, 이 기능은 아직 Claude 커넥터를 통해서는 사용할 수 없습니다. 검색, 도메인 조회, 연락처 관리 및 DNS 레코드 관리는 이미 사용 가능하며 현재 Claude에서 작동이 확인되었습니다.
기타 MCP 클라이언트 — 원격 MCP 서버를 추가하고 https://mcp.spaceship.com/mcp를 가리키도록 설정하세요. 다른 클라이언트도 작동할 수 있지만 아직 확인되지는 않았습니다.
연결하면 Spaceship에 로그인하고 어시스턴트에 계정 액세스 권한을 부여하라는 요청을 받게 됩니다. 어시스턴트가 사용할 수 있는 도구는 승인한 액세스 권한에 따라 달라집니다 — 액세스 권한이 부여되지 않아 도구가 거부되면 다시 연결하고 필요한 액세스를 승인하세요.
도구: contacts_save
기능: 연락처 세부정보를 저장하고 연락처 ID 받기
도구: contacts_get
기능: ID로 저장된 연락처 읽기
도구: contacts_list
기능: 저장된 모든 연락처를 나열하여 하나를 찾아 재사용
도구: domains_list
기능: 도메인 목록 보기 또는 단일 도메인 조회
도구: domains_check_availability
기능: 도메인 등록 가능 여부 확인
도구: domain_register
기능: 도메인 등록(구매) — 비용이 청구됨
도구: domain_set_contacts
기능: 소유한 도메인에 연락처 할당
도구: domain_set_nameservers
기능: 도메인을 기본 또는 사용자 지정 네임서버로 전환
도구: dns_records_get
기능: 도메인의 DNS 레코드를 읽습니다
도구: dns_records_save
기능: DNS 레코드를 추가하거나 TTL을 업데이트합니다
도구: dns_records_delete
기능: DNS 레코드를 삭제합니다
도구: async_operation_get
기능: 장시간 실행 작업의 상태를 확인합니다
연락처가 필요한 곳(domain_register, domain_set_contacts)에서는 각 역할이 contactId 문자열을 받으며, 인라인 연락처 세부 정보는 절대 받지 않습니다. 먼저 contacts_save로 연락처를 저장하고(이때 contactId가 반환됨), 그다음 연락처를 받을 수 있는 곳에 해당 ID를 전달하세요. 인라인 자동 저장은 없으며, 역할에는 전체 연락처 객체를 전달할 수 없습니다. contactId를 contacts_list 결과나 domains_list 결과에서 읽어 재사용할 수도 있습니다.
contactId는 영숫자 27–32자로 이루어진 문자열입니다. 연락처를 받을 수 있는 곳에 그대로 다시 전달하면 됩니다.
여러 도구는 함께 사용하도록 설계되어 있습니다. 하나의 출력이 다음 입력이 됩니다.
contacts_save — 등록자, 관리자, 기술, 청구 연락처를 저장하고(아직 해당 ID가 없는 경우) 각 연락처에 대해 반환된 contactId를 보관합니다. 등록하려면 먼저 연락처가 존재해야 합니다.
domains_check_availability — 원하는 이름을 확인합니다. result가 available일 때만 진행하세요. 사용 가능한 각 이름에는 등록 비용인 USD price(일반 및 프리미엄 모두) 또는 확인할 수 없는 경우 priceUnavailableReason가 포함되며, 추가로 minRegisterPeriodInYears 및 maxRegisterPeriodInYears — 해당 TLD가 허용하는 기간도 포함됩니다. price는 price.pricedYears년을 포함하며, 이는 TLD가 허용하는 가장 짧은 기간으로 항상 1은 아닙니다.
domain_register (미리보기) — confirmationToken을 설정하지 않은 상태로 호출하면 status: confirmation_required, 새로운 confirmationToken, 그리고 청구될 price를 받습니다. 아무것도 청구되지 않습니다. 도구의 응답 텍스트는 기간, 가격 내역, 자동 갱신, WHOIS 개인정보 보호, 결제 수단, 등록자/관리자/기술/청구 연락처를 포함한 완전한 확인 내용이므로 사용자에게 그대로 보여주세요. years는 2단계의 minRegisterPeriodInYears와 maxRegisterPeriodInYears 사이에서 선택하세요 — 범위를 벗어난 값은 즉시 거부됩니다. 각 연락처 역할은 1단계에서 저장한 contactId로 전달하세요.
domain_register (수락/거절) — 사용자가 동의한 후, 정확히 동일한 인수에 해당 confirmationToken과 confirmationResponse: "accept"를 추가하여 다시 호출하세요. 그러면 계정의 기본 결제 수단으로 청구되며 되돌릴 수 없습니다. 즉시 status: pending 및 operationId를 반환하며 — 등록은 백그라운드에서 완료됩니다. 대신 취소하려면 동일한 confirmationToken과 confirmationResponse: "decline"로 다시 호출하세요 — 아무것도 청구되지 않습니다. 토큰은 짧은 시간 후 만료되며 발급된 정확한 인수와 가격에 바인딩됩니다. 누락되었거나 만료되었거나 더 이상 일치하지 않으면, 호출은 오류 대신 완전히 새로운 확인을 반환하며 — 절대 청구되지 않습니다. 두 호출 중 어느 쪽에서든 가격을 확인할 수 없으면 도구는 대신 status: price_unavailable를 반환하며 아무것도 청구되지 않습니다.
async_operation_get — 진행 상황을 확인하려면 4단계의 operationId를 전달하세요. status가 success 또는 failed가 될 때까지 반복하세요.
contacts_save ──▶ domains_check_availability ──▶ domain_register ──▶ domain_register ──▶ async_operation_get(contactId ids) (사용 가능? + 가격 + (token 미설정: (token + (pending →min/maxRegisterPeriod) 확인, accept: operationId, success/failed)confirmationToken, pending)청구 없음)
domain_set_contacts — contactId로 도메인에 연락처를 할당합니다(필요한 경우 먼저 contacts_save로 저장). 이 작업은 즉시 완료되며 verificationStatus를 반환합니다: verification은 변경 사항이 완전히 적용되기 전에 등록자가 이메일 주소를 확인해야 함을 의미합니다(이메일이 발송됨), success는 이미 확인되었음을 의미하고, null은 해당 도메인에 확인이 필요 없음을 의미합니다.
domains_list — 도메인을 찾아 현재 nameservers ({ provider, hosts })를 확인합니다.
domain_set_nameservers — provider: "basic"으로 Spaceship의 기본 네임서버로 전환하거나(hosts 없음), provider: "custom"과 2–12개의 hosts 목록으로 사용자 지정 네임서버를 지정할 수 있습니다. 결과 { provider, hosts }를 반환하며, 이후 domains_list에 변경 사항이 반영됩니다. 도메인이 이미 있는 상태를 다시 적용하면 no-op 대신 유효성 검사 오류가 반환됩니다 — 이는 재시도 실패가 아니라 예상된 동작으로 처리하세요.
domains_list — 관리하려는 도메인을 찾습니다(이름을 알고 있다면 직접 전달해도 됩니다).
dns_records_get — 도메인의 현재 레코드를 읽습니다.
dns_records_save 또는 dns_records_delete — 레코드를 추가, 업데이트 또는 제거합니다. dns_records_get가 반환하는 레코드는 저장 및 삭제 도구가 허용하는 것과 동일한 형태를 가집니다(삭제는 ttl만 생략). 따라서 어시스턴트는 읽고, 조정하고, 다시 쓸 수 있습니다. 일치는 TXT 레코드를 제외하고 대소문자를 구분하지 않으며, TXT 레코드는 대소문자를 구분합니다.
domains_list — 정렬과 함께 모든 도메인을 페이지별로 확인하거나, 이름으로 단일 도메인을 가져옵니다. 각 도메인에는 만료일, 자동 갱신 설정, 상태, 네임서버, 개인정보 보호 및 할당된 연락처 ID가 포함됩니다.
contacts_list — 계정에 저장된 모든 연락처를 페이지별로 확인하여 기존 연락처를 찾아 재사용합니다(연락처 ID 기준). 중복 생성 대신 사용할 수 있습니다.
contacts_get — 도메인에서 보거나 contacts_list 결과에서 본 연락처 ID의 세부정보를 조회합니다.
모든 도구는 결과를 구조화된 JSON으로 반환합니다. 장기 실행 작업(현재는 domain_register만 해당)은 async_operation_get로 폴링할 작업 참조를 반환하며, 다른 모든 도구는 즉시 완료됩니다.
연락처는 도메인 등록에 연결된 개인 또는 조직(등록자, 관리자, 기술, 청구)입니다. 연락처는 어디서나 contact ID로 참조됩니다 — 불투명한 문자열입니다.
contacts_save — 연락처 저장연락처 세부정보를 저장하고 생성된 연락처 ID를 반환합니다. 일부 필드(예: stateProvince 및 postalCode)의 유효성 검사는 선택한 국가에 따라 달라집니다.
매개변수: firstName
필수 여부: 예
유형 및 제약 조건: 문자열, 1–64자. 하이픈과 아포스트로피를 포함할 수 있습니다.
매개변수: lastName
필수 여부: 예
유형 및 제약 조건: 문자열, 1–64자. 하이픈과 아포스트로피를 포함할 수 있습니다.
매개변수: email
필수 여부: 예
유형 및 제약 조건: 유효한 이메일 주소, 최대 254자.
매개변수: address1
필수 여부: 예
유형 및 제약 조건: 주소 줄 1. 문자열, 1–128자.
매개변수: city
필수 여부: 예
유형 및 제약 조건: 문자열, 1–64자.
매개변수: country
필수 여부: 예
유형 및 제약 조건: 두 글자 국가 코드(ISO 3166-1 alpha-2), 예: US.
매개변수: phone
필수 여부: 예
유형 및 제약 조건: 국제 형식 +CountryCode.Number, 예: +1.2025551234. 최대 32자.
매개변수: organization
필수 여부: 아니요
유형 및 제약 조건: 조직/회사 이름. 1–128자.
매개변수: address2
필수 여부: 아니요
유형 및 제약 조건: 주소 줄 2. 1–128자.
매개변수: stateProvince
필수 여부: 아니요
유형 및 제약 조건: 주/도 이름, 1–64자. 국가에 따라 필수일 수 있습니다.
매개변수: postalCode
필수 여부: 아니요
유형 및 제약 조건: 1–16자. 국가에 따라 필수일 수 있습니다.
매개변수: phoneExt
필수 여부: 아니요
유형 및 제약 조건: 전화 내선번호, 1–16자.
매개변수: fax
필수: 아니요
유형 및 제약 조건: 팩스 번호, +CountryCode.Number와 동일한 형식, 최대 32자.
매개변수: faxExt
필수: 아니요
유형 및 제약 조건: 팩스 내선, 1–16자.
매개변수: taxNumber
필수: 아니요
유형 및 제약 조건: 세금 번호, 1–32자.
반환값
{ "contactId": "..." }
contactId(27–32자의 영숫자)는 domain_register, domain_set_contacts 및 contacts_get에 전달하는 값입니다.
contacts_get — 연락처 가져오기연락처 ID로 저장된 연락처의 세부 정보를 읽습니다. 연락처 ID는 contacts_save, contacts_list 또는 domains_list 결과의 contacts 필드에서 가져옵니다.
매개변수: contactId
필수: 예
유형 및 제약 조건: 연락처 ID, 27–32자의 영숫자.
반환값 — { contact }, 포함 항목:
필드: firstName, lastName, email, address1, city, country, phone, postalCode
유형: 문자열
필드: organization, address2, stateProvince, phoneExt, fax, faxExt, taxNumber
유형: 문자열 또는 null
contacts_list — 연락처 목록계정에 저장된 모든 연락처를 나열하므로, 중복을 만들거나 도메인 목록을 뒤지는 대신 기존 연락처(연락처 ID 기준)를 찾아 재사용할 수 있습니다. 목록은 페이지 처리 및 정렬이 가능하며 domains_list와 일관됩니다.
매개변수: take
필수: 아니요
유형 및 제약 조건: 페이지당 항목 수, 1–100. 기본값 10.
매개변수: skip
필수: 아니요
유형 및 제약 조건: 건너뛸 항목 수, 0 이상. 기본값 0.
매개변수: orderBy
필수: 아니요
유형 및 제약 조건: 최대 8개의 정렬 키: name, email, organization; 내림차순은 - 접두사 사용(예: -name).
반환값 — { items, total }, 여기서 total은 계정의 고유 연락처 수(페이지 크기가 아니라 연락처 ID 기준으로 중복 제거됨)이며, 각 항목에는 추가 호출 없이 연락처를 구분할 수 있을 만큼의 정보가 포함됩니다. 계정에 동일한 연락처 ID의 중복 항목이 있으면 하나로 합쳐지므로 total은 원시 서버 측 행 수가 아니라 고유 연락처 수를 셉니다:
필드: contactId
유형: 문자열(27–32자 영숫자). contacts_get, domain_register 또는 domain_set_contacts에 전달합니다.
필드: name
유형: 문자열 — 연락처 이름.
필드: email
유형: 문자열 또는 null(연락처에 기록된 이메일이 없는 경우).
필드: organization
유형: 문자열 또는 null(연락처에 기록된 조직이 없는 경우).
{"items": [{ "contactId": "1anq5bsl9haBy21rOV9aeDWrARBsV", "name": "Ada Lovelace", "email": "ada@example.com", "organization": "Analytical Engines" }],"total": 1}
도메인 이름 입력(domain/domainName)은 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 — 어느 경우든 도구가 사용 전에 이름을 자동으로 punycode로 정규화합니다. domains_check_availability 및 domain_register는 추가로 Spaceship이 등록을 지원하는 TLD를 요구합니다. TLD가 지원되지 않는 도메인은 확인되거나 과금되지 않고 사용 불가로 처리됩니다. 다른 도메인 도구(domains_list, domain_set_contacts, domain_set_nameservers)와 DNS 도구는 이름만 정규화하며 TLD 지원 여부로 거부하지 않습니다.
domains_list — 도메인 목록도메인의 페이지 처리된 목록을 가져옵니다. 대신 이름으로 단일 도메인을 가져오려면 domain을 전달하세요(이 경우 페이지 처리와 정렬은 무시되며, 제공된 경우 결과에 이를 알리는 note가 포함됩니다).
매개변수: domain
필수: 아니요
유형 및 제약 조건: 단일 도메인을 가져오기 위한 정규화된 전체 도메인 이름. 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 — 자동으로 punycode로 정규화됩니다.
매개변수: take
필수: 아니요
유형 및 제약 조건: 페이지당 항목 수, 1–100. 기본값 10.
매개변수: skip
필수: 아니요
유형 및 제약 조건: 건너뛸 항목 수, 0 이상. 기본값 0.
매개변수: orderBy
필수: 아니요
유형 및 제약 조건: 최대 8개의 정렬 키: name, unicodeName, registrationDate, expirationDate; 내림차순은 - 접두사 사용(예: -expirationDate).
반환값 — { items, total }, 여기서 각 항목은 하나의 도메인을 설명합니다:
필드: name / unicodeName
의미: ASCII 및 유니코드 형식의 도메인 이름.
필드: isPremium
의미: 도메인이 프리미엄 이름인지 여부.
필드: autoRenew
의미: 자동 갱신이 활성화되어 있는지 여부.
필드: registrationDate / expirationDate
의미: 등록 및 만료 타임스탬프.
필드: lifecycleStatus
의미: creating, registered, grace1, grace2 또는 redemption.
필드: verificationStatus
의미: verification, success, failed 또는 해당되지 않을 때 null.
필드: eppStatuses
의미: 레지스트리 상태 코드(예: 이전 잠금).
필드: suspensions
의미: 활성 정지 목록이며, 각 항목에는 reasonCode가 포함됩니다.
필드: privacyProtection
의미: { level: "public" | "high", contactForm: boolean }.
필드: nameservers
의미: { provider: "basic" | "custom", hosts: [...] }.
필드: contacts
의미: 연락처 ID: registrant 및 admin/tech/billing(null일 수 있음), 그리고 attributes(확장 속성 연락처 ID 목록 또는 null). contacts_get으로 읽을 수 있습니다.
Spaceship MCP는 위의 모든 필드 — contacts, eppStatuses, suspensions, verificationStatus, nameservers, 실제 autoRenew, 그리고 도메인에 해당 값이 있을 경우 별도의 unicodeName까지 — 다중 항목 목록과 단일 도메인 조회 모두에 대해 채웁니다.
domains_check_availability — 도메인 등록 가능 여부 확인하나 이상의 도메인 이름이 등록 가능한지 확인합니다. 이름이 하나면 단일 도메인 엔드포인트를, 여러 개면 대량 엔드포인트를 사용합니다. TLD가 등록 지원 대상이 아닌 도메인은 등록 가능 여부 확인으로 전송되지 않으며 — 즉시 tldNotSupported로 반환됩니다.
매개변수: domains
필수: 예
유형 및 제약 조건: 1–20개의 정규화된 전체 도메인 이름. 각각 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 — 자동으로 punycode로 정규화됩니다.
반환값 — { results }, 요청된 이름마다 하나의 항목:
필드: domain
의미: 확인된 이름.
필드: result
의미: available, taken, invalidDomainName, tldNotSupported 또는 unexpectedError.
필드: premiumPricing
의미: 프리미엄 이름의 경우: { operation, price, currency } 목록이며, 여기서 operation은 register, transfer, renew 또는 restore입니다. 일반 이름의 경우 비어 있습니다.
필드: price
의미: available 이름(일반 및 프리미엄)의 경우: 해당 TLD가 허용하는 가장 짧은 기간 동안 도메인을 등록하는 USD 가격 — { amount, currency: "USD", pricedYears?, pricePerYear?, icannFee?, isPremium }. amount는 해당 전체 기간에 대해 지불할 총액이며, pricedYears는 몇 년이 포함되는지 나타냅니다. 할인 전 가격이나 "기존가"는 제공되지 않습니다. icannFee는 이미 포함된 ICANN 수수료(USD)로 amount에 포함되어 있으며, 내역 설명을 위해 별도로 반환됩니다. 이 값은 해당 TLD에 수수료가 있을 때만 표시됩니다.
필드: pricePerYear
의미: price 내부에서: amount를 pricedYears로 나눈 값이므로, 비교를 위한 연간 수치가 항상 제공됩니다. pricedYears가 1이면 실제 1년 가격이고, 그보다 크면 구매 가능한 기간이 아니라 해당 기간의 연평균 가격입니다.
필드: minRegisterPeriodInYears / maxRegisterPeriodInYears
의미: available 이름의 경우: 해당 TLD가 실제로 허용하는 가장 짧은 등록 기간과 가장 긴 등록 기간을 두 개의 일반 숫자로 나타냅니다. 이를 사용해 years에 대해 유효한 domain_register 값을 선택하세요. 허용 기간을 확인할 수 없는 경우 둘 다 생략됩니다.
필드: priceUnavailableReason
의미: 등록 가능한 이름의 가격을 확인할 수 없을 때 price 대신 표시됩니다. 확인 자체는 여전히 성공합니다.
가격은 등록 가능한 이름에만 제공됩니다. taken/유효하지 않은 결과에는 price도 priceUnavailableReason도 포함되지 않습니다.
대부분의 TLD는 1년을 허용하지만, 그렇지 않은 경우도 있습니다..ai는 예를 들어 최소 2년입니다. 이런 경우 price.amount는 최소 기간의 총액이며 — 실제로 구매할 수 있는 1년 가격이 아닙니다 — 그리고 price.pricedYears가 이를 나타냅니다:
{"domain": "example.ai","result": "available","premiumPricing": [],"price": { "amount": 159.96, "currency": "USD", "pricedYears": 2, "pricePerYear": 79.98, "isPremium": false },"minRegisterPeriodInYears": 2,"maxRegisterPeriodInYears": 10}
pricePerYear는 여기에도 있습니다 — 159.96를 포함된 2년으로 나누면 79.98이 됩니다. 이는 총액을 기간으로 나눈 값이지, 단일 연도에 대해 지불할 수 있는 가격이 아닙니다(1년 .ai 등록은 구매할 수 없습니다). 항상 amount를 pricedYears와 함께("2년간 $159.96") 표시하고, amount만 단독으로 표시하지 마세요. 일반적인 TLD의 경우 pricedYears는 1이고 pricePerYear는 amount와 같습니다.
domain_register — 도메인 등록도메인을 등록(구매)합니다. 이 작업은 계정의 기본 결제 수단으로 청구되며 되돌릴 수 없습니다. 권장 순서: domains_check_availability → domain_register. TLD가 등록 지원 대상이 아닌 도메인은 등록 가능 여부 확인, 가격 산정 또는 청구 전에 즉시 거부됩니다.
years는 해당 TLD 자체의 허용 기간 범위 내에 있어야 합니다. 아래의 1–10 범위는 모든 TLD를 통틀어 적용되는 외곽 한계이며, 각 TLD의 실제 범위는 더 좁습니다. .ai는 2–10, .co와 .io는 1–5, .sg는 1–2, .fr는 정확히 1년만 허용합니다. 이 범위를 벗어난 years 값은 허용 범위를 명시하는 유효성 검사 오류와 함께 거부되며 — 등록 가능 여부 확인, 가격 산정 또는 청구 전에 — 사용자를 위해 조용히 조정되지 않습니다:
.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.
먼저 domains_check_availability에서 minRegisterPeriodInYears/maxRegisterPeriodInYears를 읽고, 그 범위 안의 years를 선택하세요. 동일한 검사는 확인(confirmationResponse: "accept") 호출에서도 다시 실행되므로, 확인으로 우회할 수 없습니다.
청구 전 2단계 확인. 먼저 confirmationToken을 설정하지 않은 상태로 호출하세요. 그러면 도구가 도메인의 최신 가격을 산정하고, 기간, 가격 내역(ICANN 수수료 포함 여부 및 도메인이 프리미엄인지 여부), 자동 갱신, WHOIS 개인정보 보호, 결제 수단, 그리고 등록자/admin/tech/billing 연락처(등록자와 동일한 연락처는 "same as registrant"로 표시됨)를 포함한 전체 확인 정보를 구성한 뒤, 해당 price와 새 confirmationToken과 함께 status: "confirmation_required"를 반환합니다. 이 호출에서는 등록도 청구도 이루어지지 않습니다. 전체 확인 내용은 도구의 응답 텍스트이므로, 사용자에게 그대로 보여주세요. 사용자가 동의하면 정확히 동일한 인수에 이 confirmationToken과 confirmationResponse: "accept"를 추가해 다시 호출하여 구매를 제출하거나, confirmationResponse: "decline"를 사용해 취소하세요 — 거부 시에는 청구되지 않습니다. 이 토큰은 정확히 해당 인수와 제시된 가격에 바인딩되며 짧은 시간 후 만료됩니다. 확인 호출에서 토큰이 없거나, 만료되었거나, 변조되었거나, 더 이상 일치하지 않으면 오류나 청구 없이 항상 새 토큰이 포함된 완전히 새로운 확인 정보가 반환됩니다. 어느 호출에서든 가격을 확인할 수 없으면 도구는 토큰 대신 status: "price_unavailable"를 반환하며 청구하지 않습니다. 나중에 다시 시도하세요. 확인된 호출은 즉시 status: "pending"와 operationId를 반환합니다 — 등록은 백그라운드에서 완료되며, async_operation_get으로 확인할 수 있습니다.
매개변수: domain
필수: 예
유형 및 제약 조건: 등록할 정규화된 전체 도메인 이름(예: example.com). 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 — 자동으로 punycode로 정규화됩니다.
매개변수: years
필수: 예
유형 및 제약 조건: 등록 기간(년). 1–10은 외곽 범위이며, 실제 허용 범위는 해당 TLD의 고유 범위입니다 — domains_check_availability의 minRegisterPeriodInYears/maxRegisterPeriodInYears를 참조하세요. 범위를 벗어난 값은 조정되지 않고 거부됩니다.
매개변수: autoRenew
필수: 예
유형 및 제약 조건: 불리언. true이면 도메인은 만료 시 계정의 기본 결제 수단을 사용해 자동으로 갱신됩니다.
매개변수: privacy.level
필수: 예
유형 및 제약 조건: high는 등록자의 연락처 세부 정보를 공개 WHOIS에서 숨기고, public은 이를 공개합니다.
매개변수: privacy.userConsent
필수: 예
유형 및 제약 조건: 불리언. 선택한 개인정보 보호 설정에 동의함을 확인해야 합니다.
매개변수: contacts.registrant
필수: 예
유형 및 제약 조건: contactId 문자열(27–32자 영숫자), 출처: contacts_save.
매개변수: contacts.admin
필수: 예
유형 및 제약 조건: contactId 문자열(27–32자 영숫자), 출처: contacts_save.
매개변수: contacts.tech
필수 여부: 예
유형 및 제약 조건: contactId 문자열(영숫자 27–32자), contacts_save에서 가져옵니다.
매개변수: contacts.billing
필수 여부: 예
유형 및 제약 조건: contactId 문자열(영숫자 27–32자), contacts_save에서 가져옵니다.
매개변수: contacts.attributes
필수 여부: 아니요
유형 및 제약 조건: 확장 속성 연락처 ID 배열(최대 5개)입니다. 특정 TLD에만 필요하며, 그 외에는 생략하거나 null을 사용하세요.
매개변수: confirmationToken
필수 여부: 아니요
유형 및 제약 조건: 문자열, 최대 4096자. 이전 domain_register 호출에서 정확히 이 인수들에 대해 서버가 발급해 반환한 토큰입니다. 새 등록 시도의 첫 호출에서는 생략하세요. 짧은 시간 후 만료되며, 발급 당시의 정확한 인수와 가격에 바인딩됩니다 — 이를 처리하려면 confirmationResponse와 함께 변경 없이 다시 전송하세요.
매개변수: confirmationResponse
필수 여부: 조건부
유형 및 제약 조건: "accept" 또는 "decline"입니다. 유효한 confirmationToken과 함께 있을 때만 의미가 있습니다. "accept"는 해당 확인에 표시된 등록(요금 청구됨)을 제출하고, "decline"는 요금 청구 없이 이를 취소합니다. 첫 호출에서는 생략하세요.
반환값 — 첫 번째 호출 후(요금 청구 없음):
{"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": "아직 요금이 청구되지 않았습니다. 사용자에게 확인 내용을 보여주고, 사용자가 동의하면 이 confirmationToken 및 confirmationResponse=\"accept\"와 함께 domain_register를 다시 호출하여 구매를 완료하거나, confirmationResponse=\"decline\"으로 취소하세요."}
이 JSON과 함께, 도구 응답의 텍스트는 사용자에게 보여줄 전체 확인 내용입니다 — 위의 도메인, 기간, 가격을 다시 명시하고, Auto-renew: on/off, WHOIS privacy: on/off, Payment source: Spaceship account funds에 대한 줄과 각 등록자/관리자/기술/청구 연락처(이름, 이메일, 국가 — 등록자와 일치하는 연락처는 "same as registrant"로 표시됨), 그리고 다음 호출에 대한 안내가 포함됩니다. 다년 기간의 경우 price.amount는 전체 기간의 총액이고 price.pricePerYear는 그 총액을 기간으로 나눈 값입니다 — 예: years: 5로 .com을 사용하면 { "amount": 48.52, "pricedYears": 5, "pricePerYear": 9.70 }이 반환되고, example.ai에 years: 2를 사용하면 { "amount": 159.96, "pricedYears": 2, "pricePerYear": 79.98 }이 반환됩니다.
반환값 — confirmationResponse: "accept" 후(등록 제출됨):
{"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": "example.com 등록이 제출되었습니다. 다시 문의하거나, 이 operationId로 async_operation_get을 호출하여 상태를 확인하세요."}
반환값 — confirmationResponse: "decline" 후(요금 청구 없음):
{"domain": "example.com","years": 1,"status": "cancelled","price": { "amount": 9.08, "currency": "USD", "pricedYears": 1, "pricePerYear": 9.08, "icannFee": 0.2, "isPremium": false },"note": "구매가 확인되지 않았기 때문에 example.com 등록은 제출되지 않았습니다."}
반환값 — 가격을 확인할 수 없는 경우, 어느 호출에서든:
{"domain": "example.com","years": 1,"status": "price_unavailable","priceUnavailableReason": "이 도메인의 가격은 현재 사용할 수 없습니다.","note": "현재 example.com 등록의 가격을 산정할 수 없어 아무것도 확인되거나 청구되지 않았습니다. 잠시 후 다시 시도하세요."}
status는 다음 중 하나일 수 있습니다:
상태: confirmation_required
의미: 미리보기 — 요금이 청구되지 않았습니다. 응답 텍스트를 사용자에게 보여준 다음, 이 confirmationToken과 confirmationResponse로 다시 호출하세요. 제출된 confirmationToken이 누락되었거나, 만료되었거나, 변조되었거나, 더 이상 현재 인수/가격과 일치하지 않는 경우에도 새 토큰과 함께 반환되며, 이는 오류가 아닙니다.
상태: cancelled
의미: 구매가 거절되었으므로(confirmationResponse: "decline") 아무것도 제출되지 않았습니다.
상태: pending
의미: 제출되었습니다. 레지스트리가 백그라운드에서 마무리 중입니다. async_operation_get을 operationId와 함께 폴링하세요.
상태: price_unavailable
의미: 가격을 확인할 수 없어 토큰이 발급되지 않았고 아무 요금도 청구되지 않았습니다. 나중에 다시 시도하세요.
operationId는 평면 문자열입니다 — 이를 async_operation_get에 전달하면 등록이 최종적으로 성공했는지 실패했는지 보고합니다. price가 confirmation_required에서 표시하는 값은 confirmationResponse: "accept" 시 정확히 청구될 금액입니다 — price.amount는 전체 기간의 총액이고 price.pricedYears는 기간을 나타내므로, 항상 둘을 함께 표시하세요. TLD에 ICANN 수수료가 있는 경우 price.amount에는 이미 포함되어 있으며 price.icannFee는 설명할 수 있도록 수수료 금액을 나타냅니다.
domain_set_contacts — 도메인 연락처 설정소유한 도메인에 할당된 연락처를 변경합니다. 즉시 완료됩니다(폴링할 작업 없음).
매개변수: domainName
필수 여부: 예
유형 및 제약 조건: 정규화된 도메인 이름입니다. 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 자동으로 punycode로 정규화됩니다.
매개변수: registrant
필수 여부: 예
유형 및 제약 조건: contactId 문자열(영숫자 27–32자), contacts_save에서 가져옵니다.
매개변수: admin
필수 여부: 아니요
유형 및 제약 조건: contactId 문자열(영숫자 27–32자) 또는 null.
매개변수: tech
필수 여부: 아니요
유형 및 제약 조건: contactId 문자열(영숫자 27–32자) 또는 null.
매개변수: billing
필수 여부: 아니요
유형 및 제약 조건: contactId 문자열(영숫자 27–32자) 또는 null.
매개변수: attributes
필수 여부: 아니요
유형 및 제약 조건: 확장 속성 연락처 ID 배열(최대 5개)입니다. 특정 TLD에만 필요하며, 그 외에는 생략하거나 null을 사용하세요.
반환값
{ "verificationStatus": "verification" }
반환된 verificationStatus는 ICANN RAA 이메일 인증 상태를 반영합니다: verification — 등록자가 이메일 주소를 확인해야 합니다(확인 이메일이 전송됨); success — 이미 확인됨; null — 이 도메인에는 RAA 인증이 적용되지 않습니다.
domain_set_nameservers — 도메인 네임서버 설정도메인의 등록기관 수준 네임서버를 변경합니다. 즉시 완료됩니다(폴링할 작업 없음). 변경 사항은 이후 domains_list에 반영됩니다.
매개변수: domainName
필수 여부: 예
유형 및 제약 조건: 정규화된 도메인 이름입니다. 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 자동으로 punycode로 정규화됩니다.
매개변수: provider
필수 여부: 예
유형 및 제약 조건: basic(Spaceship의 기본 네임서버) 또는 custom(사용자 소유 호스트)입니다.
매개변수: hosts
필수 여부: 조건부
유형 및 제약 조건: provider가 custom일 때 필수: 네임서버 호스트명 2–12개(각각 유효한 FQDN, 4–255자). provider가 basic일 때는 생략해야 합니다.
반환값
{ "provider": "custom", "hosts": ["ns1.example.com", "ns2.example.com"] }
도메인이 이미 해당 상태인 설정을 다시 적용하는 경우(예: 이미 basic인데 basic으로 설정) 아무 작업도 하지 않는 성공이 아니라 유효성 검사 오류가 반환됩니다 — 이를 재시도해야 할 실패가 아니라 예상된 결과로 처리하세요.
이 도구들이 받는 domainName은 유니코드(IDN) 또는 ASCII(A-label)를 허용하며 자동으로 punycode로 정규화됩니다. 여기서는 TLD 지원 여부를 강제하지 않습니다.
dns_records_get — DNS 레코드 가져오기도메인의 DNS 리소스 레코드에 대한 페이지네이션된 목록을 가져옵니다.
매개변수: domainName
필수 여부: 예
유형 및 제약 조건: 레코드를 가져올 도메인입니다.
매개변수: take
필수 여부: 아니요
유형 및 제약 조건: 페이지당 항목 수, 1–500. 기본값은 100입니다.
매개변수: skip
필수 여부: 아니요
유형 및 제약 조건: 건너뛸 항목 수, 0 이상. 기본값은 0입니다.
매개변수: orderBy
필수 여부: 아니요
유형 및 제약 조건: 최대 8개의 정렬 키: type, -type, name, -name.
반환값 — { items, total }. 각 항목은 레코드 형태에 설명된 레코드이며, 레코드의 출처를 나타내는 선택적 group 필드가 추가될 수 있습니다(custom — 사용자가 생성, product — Spaceship 제품이 관리, personalNs — 개인 네임서버).
dns_records_save — DNS 레코드 저장사용자 지정 DNS 레코드를 추가하거나 기존 레코드의 TTL을 업데이트합니다. 레코드는 TXT 레코드(대소문자 구분)를 제외하고 대소문자를 구분하지 않고 일치합니다.
매개변수: domainName
필수 여부: 예
유형 및 제약 조건: 레코드를 업데이트할 도메인입니다.
매개변수: records
필수 여부: 예
유형 및 제약 조건: 1–500개의 레코드 — 레코드 형태를 참조하세요. 각 레코드에는 선택적 ttl이 포함될 수 있습니다.
매개변수: force
필수 여부: 아니요
유형 및 제약 조건: 불리언. 충돌 해결 검사를 건너뛰고 영역 업데이트를 강제로 수행합니다.
반환값 — { "saved": <number> }, 제출된 레코드 수입니다. 성공 응답은 모든 레코드가 수락되었음을 의미하며, 하나라도 실패하면 전체 호출이 대신 오류를 반환합니다.
dns_records_delete — DNS 레코드 삭제사용자 지정 DNS 레코드를 삭제합니다. 삭제는 되돌릴 수 없습니다. 레코드는 TXT 레코드(대소문자 구분)를 제외하고 대소문자를 구분하지 않고 일치합니다.
매개변수: domainName
필수 여부: 예
유형 및 제약 조건: 레코드를 삭제할 도메인입니다.
매개변수: records
필수 여부: 예
유형 및 제약 조건: 기존 레코드를 식별하는 1–500개의 레코드 — 저장과 동일한 형태이지만 ttl은 제외합니다.
반환값 — { "deleted": <number> }, 제출된 레코드 수입니다. 하나라도 일치하는 레코드를 찾을 수 없으면 전체 호출이 실패하고 아무것도 삭제되지 않습니다.
모든 레코드에는 다음이 있습니다:
type — 아래의 지원되는 13개 유형 중 하나입니다.
name — 도메인을 제외한 레코드 이름: 도메인 자체(apex)에는 @를, 와일드카드에는 *를 사용하세요.
ttl(저장 전용, 선택 사항) — 초 단위 캐시 시간, 60–3600.
유형별 필드:
유형: A
필드: address — IPv4 주소.
유형: AAAA
필드: address — IPv6 주소.
유형: CNAME
필드: cname — 정식 도메인 이름(최대 253자).
유형: ALIAS
필드: aliasName — 정식 도메인 이름. CNAME이 허용되지 않는 apex에서 CNAME과 유사하게 동작합니다.
유형: NS
필드: nameserver — 네임서버 이름.
유형: PTR
필드: pointer — 지정된 IP 주소에 대한 도메인 이름.
유형: TXT
필드: value — 텍스트 값(대소문자 구분하여 일치).
유형: MX
필드: exchange — 메일 서버; preference — 우선순위(0–65535, 낮을수록 우선).
유형: CAA
필드: flag — 0 또는 128(critical bit); tag — issue, issuewild 또는 iodef; value — 선택적 매개변수가 있는 CA 식별자.
유형: SRV
필드: service(예: _sip); protocol(예: _tcp); priority 및 weight(0–65535); port(1–65535); target — 서버 도메인 이름.
유형: TLSA
필드: usage, selector, matching (각각 0–255); port — * 또는 _<1–65535>; protocol (예: _tcp); associationData — 인증서 해시 또는 데이터.
유형: HTTPS
필드: svcPriority (0–65535; 0 = AliasMode); targetName — FQDN 또는 .; 선택 사항 port (* 또는 _<1–65535>), scheme (_https는 port가 설정된 경우여야 함), svcParams.
유형: SVCB
필드: svcPriority (0–65535; 0 = AliasMode); targetName — FQDN 또는 .; 선택 사항 port, scheme (예: _tcp), svcParams.
async_operation_get — 비동기 작업 상태 가져오기다른 도구가 시작한 장기 실행 작업(현재는 domain_register)을 확인합니다. 해당 도구가 반환한 operationId로 operationId를 설정해 호출하고, status가 success 또는 failed가 될 때까지 반복합니다.
매개변수: operationId
필수 여부: 예
유형 및 제약 조건: 영숫자 문자열, 최대 36자, 작업을 시작한 도구가 반환합니다.
반환값
필드: operationId
의미: 폴링되는 작업입니다.
필드: status
의미: pending, success 또는 failed.
필드: type
의미: 작업 유형 또는 null.
필드: details
의미: 작업에 대한 추가 세부정보 또는 null.
필드: createdAt / modifiedAt
의미: 작업이 생성된 시각 / 마지막으로 업데이트된 시각(modifiedAt는 null일 수 있음).
호출이 실패하면 도구는 코드와 사람이 읽을 수 있는 detail을 포함한 오류를 반환하여 무엇이 잘못되었는지 설명합니다. 예를 들어 잘못된 입력(형식이 잘못된 도메인 이름 또는 연락처 ID), 존재하지 않는 도메인 또는 연락처, 또는 현재 상태와의 충돌 등이 있습니다. 도구에 대한 액세스 권한이 어시스턴트에 부여되지 않아 도구가 거부된 경우, Spaceship MCP를 다시 연결하고 요청하는 액세스를 승인하세요.