mcpField
S
search-domain-validator

search-domain-validator

github.com/shipshitdev開発38146 回インストール2 日前に更新
リポジトリ

search-domain-validator について

ドメイン形式の検証、登録可能性の確認、キーワード検索を実装する開発スキルです。フォーム検証や候補提示の機能に向け、既存プロジェクトの実装パターンを調べてから進めます。

主な機能

  1. 01RFC 1035・RFC 1123に準拠した検証
  2. 02ドメインAPIによる空き状況確認
  3. 03キーワードから候補を生成
  4. 04候補ドメインの一括確認
  5. 05既存プロジェクトの実装規約に準拠

活用シーン

  1. 01フォームのドメイン入力を検証
  2. 02ドメインの登録可否を確認
  3. 03キーワードから空きドメインを検索
  4. 04アプリにドメイン候補提示を追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/shipshitdev/skills --skill search-domain-validator

インストール後、Claude Code で/search-domain-validatorを入力して読み込まれたか確認します。

同梱ファイルplugin.json

詳細

ドメイン名検索・検証

概要

このスキルでは、ドメイン名の形式を検証し、ドメインの空き状況を確認して、キーワードに基づいて利用可能なドメイン名を検索できます。ドメイン検証ロジックを実装し、ドメインの空き状況を確認する API と連携して、ドメイン検索機能を提供します。

このスキルを使用するタイミング

次のような場合に、このスキルが自動的に有効になります。

  • ドメイン名の形式や構文を検証する必要がある
  • ドメインを登録できるかどうか確認したい
  • キーワードに基づいて利用可能なドメイン名を検索する必要がある
  • フォームやアプリケーションでドメインを検証する必要がある
  • ドメイン名が RFC 標準に準拠しているか確認する必要がある
  • ドメイン候補の提案機能を実装したい

プロジェクトコンテキストの確認

ドメイン検証に関するガイダンスを提供する前に、プロジェクトのコンテキストを確認してください。

  1. プロジェクトのドキュメントを確認する:

    • 既存のドメイン検証ロジックを確認する
    • フォーム検証のパターンを確認する
    • API 連携のパターンを調べる
    • 環境変数の使用状況を確認する
  2. 既存のパターンを特定する:

    • 使用中の検証ライブラリを確認する
    • API クライアントのパターンを確認する
    • エラー処理の方法を確認する
    • ドメイン関連のユーティリティを確認する
  3. プロジェクト固有のスキルを使用する:

    • [project]-domain-validator スキルを確認する
    • プロジェクト固有の検証パターンを確認する
    • プロジェクトの検証標準に従う

主な機能

1. ドメイン形式の検証

RFC 1035 および RFC 1123 標準に従ってドメイン名を検証します。

ドメイン名のルール:

  • 長さ:合計 1~253 文字
  • ラベル:それぞれ最大 63 文字
  • 使用できる文字:英字(a-z、A-Z)、数字(0-9)、ハイフン(-)
  • ラベルの先頭または末尾にハイフンを使用することはできません
  • TLD(トップレベルドメイン)が必要です
  • 連続したハイフンは使用できません

検証の実装:

// TypeScript/JavaScript domain validation
function isValidDomain(domain: string): boolean {
  if (!domain || domain.length > 253) {
    return false;
  }

  // RFC 1035 compliant regex
  const domainRegex = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
  
  if (!domainRegex.test(domain)) {
    return false;
  }

  // Check label length (max 63 chars)
  const labels = domain.split('.');
  for (const label of labels) {
    if (label.length > 63 || label.length === 0) {
      return false;
    }
    // Labels cannot start or end with hyphen
    if (label.startsWith('-') || label.endsWith('-')) {
      return false;
    }
  }

  return true;
}

Python による検証:

import re

def is_valid_domain(domain: str) -> bool:
    """Validate domain name format according to RFC 1035 and RFC 1123."""
    if not domain or len(domain) > 253:
        return False
    
    # RFC 1035 compliant regex
    domain_pattern = r'^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$'
    
    if not re.match(domain_pattern, domain, re.IGNORECASE):
        return False
    
    # Check label length (max 63 chars)
    labels = domain.split('.')
    for label in labels:
        if len(label) > 63 or len(label) == 0:
            return False
        # Labels cannot start or end with hyphen
        if label.startswith('-') or label.endswith('-'):
            return False
    
    return True

NestJS による検証:

import { IsString, Matches, MaxLength, ValidateIf } from 'class-validator';

export class DomainDto {
  @IsString()
  @MaxLength(253)
  @Matches(
    /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i,
    {
      message: 'Invalid domain name format',
    }
  )
  domain: string;
}
2. ドメインの空き状況の確認

ドメインの空き状況を確認する API を使用して、ドメインを登録できるかどうかを確認します。

一般的なドメイン空き状況確認 API:

  • Namecheap API
  • GoDaddy API
  • Name.com API
  • WHOIS 検索(基本的な確認用)

Namecheap API との連携:

// Namecheap domain availability check
async function checkDomainAvailability(domain: string): Promise<boolean> {
  const apiUser = process.env.NAMECHEAP_API_USER;
  const apiKey = process.env.NAMECHEAP_API_KEY;
  const clientIp = process.env.NAMECHEAP_CLIENT_IP;
  
  const url = `https://api.namecheap.com/xml.response?ApiUser=${apiUser}&ApiKey=${apiKey}&UserName=${apiUser}&Command=namecheap.domains.check&ClientIp=${clientIp}&DomainList=${domain}`;
  
  try {
    const response = await fetch(url);
    const xml = await response.text();
    
    // Parse XML response
    // Available domains return <DomainCheckResult Domain="example.com" Available="true"/>
    return xml.includes('Available="true"');
  } catch (error) {
    console.error('Error checking domain availability:', error);
    throw error;
  }
}

GoDaddy API との連携:

// GoDaddy domain availability check
async function checkGoDaddyAvailability(domain: string): Promise<boolean> {
  const apiKey = process.env.GODADDY_API_KEY;
  const apiSecret = process.env.GODADDY_API_SECRET;
  
  const url = `https://api.godaddy.com/v1/domains/available?domain=${domain}`;
  
  try {
    const response = await fetch(url, {
      headers: {
        'Authorization': `sso-key ${apiKey}:${apiSecret}`,
        'Content-Type': 'application/json',
      },
    });
    
    const data = await response.json();
    return data.available === true;
  } catch (error) {
    console.error('Error checking domain availability:', error);
    throw error;
  }
}

NestJS サービスの例:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';

@Injectable()
export class DomainService {
  constructor(private httpService: HttpService) {}

  async checkAvailability(domain: string): Promise<boolean> {
    const apiKey = process.env.DOMAIN_API_KEY;
    const apiSecret = process.env.DOMAIN_API_SECRET;
    
    try {
      const response = await firstValueFrom(
        this.httpService.get(`https://api.example.com/domains/check`, {
          params: { domain },
          headers: {
            'Authorization': `Bearer ${apiKey}`,
          },
        })
      );
      
      return response.data.available;
    } catch (error) {
      throw new Error(`Failed to check domain availability: ${error.message}`);
    }
  }
}
3. ドメイン検索機能

キーワードに基づいて利用可能なドメイン名を検索し、候補や代替案を生成します。

ドメイン候補の生成アルゴリズム:

function generateDomainSuggestions(keyword: string, tlds: string[] = ['com', 'io', 'net', 'org']): string[] {
  const suggestions: string[] = [];
  const sanitized = keyword.toLowerCase().replace(/[^a-z0-9-]/g, '');
  
  // Direct combinations
  for (const tld of tlds) {
    suggestions.push(`${sanitized}.${tld}`);
  }
  
  // Common prefixes
  const prefixes = ['get', 'try', 'use', 'my', 'the'];
  for (const prefix of prefixes) {
    for (const tld of tlds) {
      suggestions.push(`${prefix}${sanitized}.${tld}`);
    }
  }
  
  // Common suffixes
  const suffixes = ['app', 'hub', 'ly', 'fy', 'io'];
  for (const suffix of suffixes) {
    for (const tld of tlds) {
      suggestions.push(`${sanitized}${suffix}.${tld}`);
    }
  }
  
  return suggestions;
}

一括で空き状況を確認:

async function searchAvailableDomains(keyword: string): Promise<string[]> {
  const suggestions = generateDomainSuggestions(keyword);
  const availableDomains: string[] = [];
  
  // Check availability for all suggestions (with rate limiting)
  for (const domain of suggestions) {
    try {
      const isAvailable = await checkDomainAvailability(domain);
      if (isAvailable) {
        availableDomains.push(domain);
      }
      // Rate limiting delay
      await new Promise(resolve => setTimeout(resolve, 100));
    } catch (error) {
      console.error(`Error checking ${domain}:`, error);
    }
  }
  
  return availableDomains;
}

ベストプラクティス

検証
  • 空き状況を確認する前に、必ずドメイン形式を検証する
  • エッジケース(国際化ドメイン名、サブドメイン)に対応する
  • 無効なドメインに対して、わかりやすいエラーメッセージを表示する
  • 必要に応じて、TLD を個別に検証する
API 連携
  • API 認証情報は環境変数に保存する
  • API のスロットリングを避けるために、レート制限を実装する
  • API エラーを適切に処理する
  • 適切な場合は、空き状況の確認結果をキャッシュする
  • API 呼び出しには適切なタイムアウトを設定する
ユーザーエクスペリエンス
  • リアルタイムで検証結果をフィードバックする
  • ユーザーの入力に応じてドメイン候補を表示する
  • 空き状況を明確に表示する
  • 別の TLD の候補も提示する
  • 空き状況の確認中はローディング状態を表示する
セキュリティ
  • API キーをクライアント側のコードに決して公開しない
  • すべてのユーザー入力を検証してサニタイズする
  • 適切なエラー処理を実装する
  • すべての API 通信に HTTPS を使用する
  • API プロバイダーのセキュリティガイドラインに従う

ユーザーリクエストの例

例 1:「このドメインを検証してください:example.com」

  • 形式検証を使用して、ドメインが RFC 標準に準拠しているか確認します
  • 無効な場合は、具体的なエラーの詳細とともに検証結果を返します

例 2:「example.com が利用可能か確認してください」

  • まずドメイン形式を検証します
  • ドメインの利用可否 API を呼び出します
  • 利用可否の状態を返します

例 3:「キーワード 'techstartup' で利用可能なドメインを検索してください」

  • キーワードに基づいてドメイン候補を生成します
  • 各候補の利用可否を確認します
  • 価格情報がある場合は、利用可能なドメインの一覧とともに返します

例 4:「このフォームにドメイン検証を実装してください」

  • フォームコンポーネントにドメイン検証を追加します
  • リアルタイム検証を統合します
  • 無効なドメインについてユーザーにフィードバックを提供します

よく使われるドメイン TLD

汎用 TLD:

  • .com、.net、.org、.info、.biz

新しい gTLD:

  • .app、.dev、.io、.ai、.tech、.online、.xyz

国別コード TLD:

  • .us、.uk、.ca、.au、.de、.fr、.jp

ドメイン検索を実装する際は、ユーザーの状況や業界に関連する、よく使われる TLD を含めることを検討してください。

コメント