mcpField
C
coingecko

coingecko

github.com/sendaifunデータ・データベース130239 回インストール13 週間前に更新
リポジトリ

coingecko について

CoinGecko の Solana オンチェーン API を利用する開発者向けガイドです。トークン、プール、取引、市場データの取得に加え、価格、OHLCV、DEX 検索、高度なフィルターや API 設定、レート制限、エラー処理を扱います。

主な機能

  1. 01単一または複数アドレスでのトークン価格取得
  2. 02トークンと流動性プールの詳細取得
  3. 03トレンドプール、上位プール、最近の取引の照会
  4. 04プールの OHLCV ローソク足データ取得
  5. 05DEX 検索と高度なプールフィルター

活用シーン

  1. 01Solana トークンの価格表示の構築
  2. 02流動性プールと取引状況の分析
  3. 03テクニカル分析用の過去ローソク足取得
  4. 04流動性や取引量によるプールの絞り込み

インストール

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

$npx skills add https://github.com/sendaifun/skills --skill coingecko

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

docs/
troubleshooting.md
examples/integration/
full-client.ts
examples/ohlcv/
ohlcv-charts.ts
examples/pools/
pool-data.ts
examples/token-prices/
get-token-price.ts
examples/trades/
recent-trades.ts
resources/
api-reference.md
network-dex-ids.md
token-addresses.md
templates/
coingecko-client.ts

詳細

CoinGecko Solana API 開発ガイド

CoinGecko の Solana オンチェーン API を統合するための包括的なガイドです。1,700 以上の分散型取引所で、リアルタイムのトークン価格、DEX プールデータ、OHLCV チャート、取引履歴、市場分析にアクセスできます。

概要

CoinGecko の Solana API では、次の情報を利用できます。

  • トークン価格:コントラクトアドレスによるリアルタイム価格(単一または一括)
  • プールデータ:流動性プール情報、トレンドのプール、上位プール
  • OHLCV チャート:テクニカル分析用のローソク足データ
  • 取引履歴:任意のプールの最近の取引
  • DEX の検索:Solana 上で稼働するすべての DEX の一覧
  • 検索:トークン名、シンボル、アドレスからプールを検索
  • Megafilter:プール、トークン、DEX を対象とした高度なフィルタリング
主な機能
機能説明
250 以上のネットワークSolana を含むマルチチェーン対応
1,700 以上の DEXRaydium、Orca、Jupiter、Meteora、Pump.fun など
1,500 万以上のトークン包括的なトークンカバレッジ
リアルタイムデータ10~30 秒ごとに更新
過去データOHLCV チャートと取引履歴

クイックスタート

API キーの取得
  1. Demo API(無料):coingecko.com/en/api にアクセスします
  2. Pro API(有料):coingecko.com/en/api/pricing にアクセスします
環境設定
# .env file
COINGECKO_API_KEY=your_api_key_here
COINGECKO_API_TYPE=demo  # or 'pro'
API の設定
// Configuration for both Demo and Pro APIs
const CONFIG = {
  demo: {
    baseUrl: 'https://api.coingecko.com/api/v3/onchain',
    headerKey: 'x-cg-demo-api-key',
    rateLimit: 30, // calls per minute
  },
  pro: {
    baseUrl: 'https://pro-api.coingecko.com/api/v3/onchain',
    headerKey: 'x-cg-pro-api-key',
    rateLimit: 500, // calls per minute (varies by plan)
  },
};

const apiType = process.env.COINGECKO_API_TYPE || 'demo';
const apiKey = process.env.COINGECKO_API_KEY;

const BASE_URL = CONFIG[apiType].baseUrl;
const HEADER_KEY = CONFIG[apiType].headerKey;

// Solana network identifier
const NETWORK = 'solana';
基本的なトークン価格の取得
async function getTokenPrice(tokenAddress: string): Promise<number | null> {
  const url = `${BASE_URL}/simple/networks/${NETWORK}/token_price/${tokenAddress}`;

  const response = await fetch(url, {
    headers: {
      [HEADER_KEY]: apiKey,
      'Accept': 'application/json',
    },
  });

  if (!response.ok) {
    throw new Error(`API error: ${response.status}`);
  }

  const data = await response.json();
  return data.data?.attributes?.token_prices?.[tokenAddress] ?? null;
}

// Usage
const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
const price = await getTokenPrice(USDC);
console.log(`USDC Price: $${price}`);

API エンドポイントリファレンス

シンプルなトークン価格

コントラクトアドレスでトークン価格を取得します。

エンドポイント:GET /simple/networks/{network}/token_price/{addresses}

パラメーター:

パラメーター型必須説明
networkstringはいネットワーク ID(solana)
addressesstringはいカンマ区切りのトークンアドレス(Demo は最大 30 件、Pro は最大 100 件)
include_market_capbooleanいいえ時価総額データを含めます
include_24hr_volbooleanいいえ24 時間の取引高を含めます
include_24hr_price_changebooleanいいえ24 時間の価格変動率を含めます
async function getTokenPrices(addresses: string[]): Promise<Record<string, TokenPriceData>> {
  const addressList = addresses.join(',');
  const url = `${BASE_URL}/simple/networks/${NETWORK}/token_price/${addressList}`;

  const params = new URLSearchParams({
    include_market_cap: 'true',
    include_24hr_vol: 'true',
    include_24hr_price_change: 'true',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes || {};
}

アドレスによるトークンデータ

トークンの詳細情報を取得します。

エンドポイント:GET /networks/{network}/tokens/{address}

パラメーター:

パラメーター型必須説明
networkstringはいネットワーク ID
addressstringはいトークンのコントラクトアドレス
includestringいいえ流動性データ用に top_pools を含めます
interface TokenData {
  address: string;
  name: string;
  symbol: string;
  decimals: number;
  image_url: string;
  price_usd: string;
  fdv_usd: string;
  market_cap_usd: string;
  total_supply: string;
  volume_usd: {
    h24: string;
  };
  price_change_percentage: {
    h24: string;
  };
}

async function getTokenData(address: string): Promise<TokenData> {
  const url = `${BASE_URL}/networks/${NETWORK}/tokens/${address}?include=top_pools`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes;
}

複数トークンのデータ

複数のトークンを一括取得します。

エンドポイント:GET /networks/{network}/tokens/multi/{addresses}

async function getMultipleTokens(addresses: string[]): Promise<TokenData[]> {
  const addressList = addresses.join(',');
  const url = `${BASE_URL}/networks/${NETWORK}/tokens/multi/${addressList}`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

アドレスによるプールデータ

プールの詳細情報を取得します。

エンドポイント:GET /networks/{network}/pools/{address}

パラメーター:

パラメーター型必須説明
includestringいいえbase_token、quote_token、dex
include_volume_breakdownbooleanいいえ期間別の取引高の内訳
interface PoolData {
  address: string;
  name: string;
  pool_created_at: string;
  base_token_price_usd: string;
  quote_token_price_usd: string;
  base_token_price_native_currency: string;
  fdv_usd: string;
  market_cap_usd: string;
  reserve_in_usd: string;
  price_change_percentage: {
    m5: string;
    h1: string;
    h6: string;
    h24: string;
  };
  transactions: {
    m5: { buys: number; sells: number };
    h1: { buys: number; sells: number };
    h24: { buys: number; sells: number };
  };
  volume_usd: {
    m5: string;
    h1: string;
    h6: string;
    h24: string;
  };
}

async function getPoolData(poolAddress: string): Promise<PoolData> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes;
}

トレンドのプール

全ネットワーク、またはネットワークで絞り込んだトレンドのプールを取得します。

エンドポイント:GET /networks/trending_pools

パラメーター:

パラメーター型デフォルト説明
includestringbase_token含める属性
pageinteger1ページ番号
durationstring24h5m、1h、6h、24h
async function getTrendingPools(duration: '5m' | '1h' | '6h' | '24h' = '24h'): Promise<PoolData[]> {
  const url = `${BASE_URL}/networks/trending_pools`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex,network',
    duration,
    page: '1',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Filter for Solana pools
async function getSolanaTrendingPools(): Promise<PoolData[]> {
  const allPools = await getTrendingPools();
  return allPools.filter(pool => pool.network === 'solana');
}

ネットワーク上位のプール

Solana 上の取引高上位のプールを取得します。

エンドポイント:GET /networks/{network}/pools

async function getTopPools(page: number = 1): Promise<PoolData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex',
    page: page.toString(),
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

プールの検索

トークン名、シンボル、アドレスからプールを検索します。

エンドポイント:GET /search/pools

パラメーター:

パラメーター型説明
querystring検索語(名前、シンボル、アドレス)
networkstringネットワークで絞り込み
pageintegerページ番号
async function searchPools(query: string): Promise<PoolData[]> {
  const url = `${BASE_URL}/search/pools`;

  const params = new URLSearchParams({
    query,
    network: NETWORK,
    include: 'base_token,quote_token,dex',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Search for SOL pools
const solPools = await searchPools('SOL');

プールの OHLCV チャート

テクニカル分析用のローソク足データを取得します。

エンドポイント:GET /networks/{network}/pools/{pool_address}/ohlcv/{timeframe}

時間足:day、hour、minute

パラメーター:

パラメーター型説明
aggregateintegerローソク足の集計(分足の場合は 1、5、15、時間足の場合は 1、4、12)
before_timestampintegerページネーション用の Unix タイムスタンプ
limitintegerローソク足の数(最大 1000)
currencystringusd または token
interface OHLCVData {
  timestamp: number;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

async function getPoolOHLCV(
  poolAddress: string,
  timeframe: 'day' | 'hour' | 'minute' = 'hour',
  aggregate: number = 1,
  limit: number = 100
): Promise<OHLCVData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}/ohlcv/${timeframe}`;

  const params = new URLSearchParams({
    aggregate: aggregate.toString(),
    limit: limit.toString(),
    currency: 'usd',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();

  return data.data?.attributes?.ohlcv_list?.map((candle: number[]) => ({
    timestamp: candle[0],
    open: candle[1],
    high: candle[2],
    low: candle[3],
    close: candle[4],
    volume: candle[5],
  })) || [];
}

// Get hourly candles
const hourlyCandles = await getPoolOHLCV(poolAddress, 'hour', 1, 24);

// Get 5-minute candles
const fiveMinCandles = await getPoolOHLCV(poolAddress, 'minute', 5, 100);

最近の取引

プールの最近の取引を取得します。

エンドポイント:GET /networks/{network}/pools/{pool_address}/trades

interface TradeData {
  block_number: number;
  block_timestamp: string;
  tx_hash: string;
  tx_from_address: string;
  from_token_amount: string;
  to_token_amount: string;
  price_from_in_currency_token: string;
  price_to_in_currency_token: string;
  price_from_in_usd: string;
  price_to_in_usd: string;
  kind: 'buy' | 'sell';
  volume_in_usd: string;
}

async function getRecentTrades(poolAddress: string): Promise<TradeData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}/trades`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

Solana 上の DEX 一覧

Solana 上のすべての分散型取引所を取得します。

エンドポイント:GET /networks/{network}/dexes

interface DexData {
  id: string;
  name: string;
}

async function getSolanaDexes(): Promise<DexData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/dexes`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => ({
    id: item.id,
    name: item.attributes.name,
  })) || [];
}

Megafilter(高度なフィルタリング)

ネットワーク、DEX、トークンをまたいでプールを高度にフィルタリングします。

エンドポイント:GET /pools/megafilter

パラメーター:

パラメーター型説明
networksstringネットワークでフィルタリング
dexesstringDEX でフィルタリング
sortstring並び順(例:pool_created_at_desc)
min_reserve_in_usdnumber最小流動性
min_h24_volume_usdnumber24 時間の最小取引高
async function getMegafilterPools(options: {
  dexes?: string[];
  minLiquidity?: number;
  minVolume?: number;
  sort?: string;
}): Promise<PoolData[]> {
  const url = `${BASE_URL}/pools/megafilter`;

  const params = new URLSearchParams({
    networks: NETWORK,
    page: '1',
  });

  if (options.dexes) {
    params.set('dexes', options.dexes.join(','));
  }
  if (options.minLiquidity) {
    params.set('min_reserve_in_usd', options.minLiquidity.toString());
  }
  if (options.minVolume) {
    params.set('min_h24_volume_usd', options.minVolume.toString());
  }
  if (options.sort) {
    params.set('sort', options.sort);
  }

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Get newest Pump.fun pools
const pumpfunPools = await getMegafilterPools({
  dexes: ['pump-fun'],
  sort: 'pool_created_at_desc',
});

// Get high-volume Raydium pools
const raydiumPools = await getMegafilterPools({
  dexes: ['raydium'],
  minVolume: 100000,
  minLiquidity: 50000,
});

よく使われる Solana DEX 識別子

DEXID説明
RaydiumraydiumSolana を代表する AMM
Orcaorca使いやすい DEX
Jupiterjupiterプールを備えたアグリゲーター
Meteorameteoraダイナミック AMM
Pump.funpump-funミームコインのローンチパッド
OpenBookopenbookオーダーブック型 DEX
Lifinitylifinityプロアクティブ・マーケットメーカー
Phoenixphoenixオンチェーンのオーダーブック

よく使われるトークンアドレス

トークンアドレス
USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
SOL(ラップド)So11111111111111111111111111111111111111112
JUPJUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
BONKDezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263
WIFEKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm
PYTHHZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3
RAY4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R
ORCAorcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE

レート制限

プラン呼び出し回数/分リクエストあたりの最大アドレス数
Demo(無料)3030
Analyst50050
Lite50050
Pro1,000100
Enterpriseカスタムカスタム
レート制限への対処
class RateLimiter {
  private calls: number[] = [];
  private maxCalls: number;
  private windowMs: number = 60000; // 1 minute

  constructor(maxCallsPerMinute: number) {
    this.maxCalls = maxCallsPerMinute;
  }

  async waitForSlot(): Promise<void> {
    const now = Date.now();
    this.calls = this.calls.filter(t => now - t < this.windowMs);

    if (this.calls.length >= this.maxCalls) {
      const oldestCall = this.calls[0];
      const waitTime = this.windowMs - (now - oldestCall);
      await new Promise(resolve => setTimeout(resolve, waitTime));
    }

    this.calls.push(Date.now());
  }
}

// Usage
const rateLimiter = new RateLimiter(30); // Demo API

async function fetchWithRateLimit(url: string): Promise<any> {
  await rateLimiter.waitForSlot();
  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });
  return response.json();
}

エラー処理

async function safeApiCall<T>(url: string): Promise<T | null> {
  try {
    const response = await fetch(url, {
      headers: { [HEADER_KEY]: apiKey },
    });

    if (response.status === 401) {
      throw new Error('Invalid API key');
    }
    if (response.status === 429) {
      throw new Error('Rate limit exceeded - wait before retrying');
    }
    if (response.status === 404) {
      console.warn('Resource not found');
      return null;
    }
    if (!response.ok) {
      throw new Error(`API error: ${response.status}`);
    }

    return response.json();
  } catch (error) {
    console.error('CoinGecko API error:', error);
    throw error;
  }
}
よくあるエラーコード
コード意味解決策
401API キーが無効ですAPI キーを確認してください
429レート制限を超過しました待ってから再試行するか、プランをアップグレードしてください
404リソースが見つかりませんアドレス/ネットワーク ID を確認してください
500+サーバーエラー指数バックオフで再試行してください

ベストプラクティス

セキュリティ
  • API キーを git にコミットしないでください
  • 環境変数を使用してください
  • キーを定期的にローテーションしてください
  • 開発環境と本番環境では別々のキーを使用してください
パフォーマンス
  • 可能な場合はトークンのリクエストをまとめてください
  • 頻繁にアクセスするデータをキャッシュしてください
  • OHLCV には適切な時間足を使用してください
  • レート制限に備えてリクエストキューを実装してください
データ品質
  • 時価総額データを確認してください(未検証の場合は null のことがあります)
  • 価格を信頼する前にプールの流動性を確認してください
  • 価格分析には複数の時間足を使用してください
  • アクティビティを把握するために、最終取引のタイムスタンプを監視してください

リソース


スキルの構成

coingecko/
├── SKILL.md                      # This file
├── resources/
│   ├── api-reference.md          # Complete API endpoint reference
│   ├── network-dex-ids.md        # Solana network and DEX identifiers
│   └── token-addresses.md        # Common Solana token addresses
├── examples/
│   ├── token-prices/
│   │   └── get-token-price.ts    # Token price examples
│   ├── pools/
│   │   └── pool-data.ts          # Pool data examples
│   ├── ohlcv/
│   │   └── ohlcv-charts.ts       # OHLCV chart examples
│   ├── trades/
│   │   └── recent-trades.ts      # Trade history examples
│   └── integration/
│       └── full-client.ts        # Complete client example
├── templates/
│   └── coingecko-client.ts       # Production-ready client template
└── docs/
    └── troubleshooting.md        # Common issues and solutions

コメント