mcpField
A
api-filtering-sorting

api-filtering-sorting

github.com/secondsky開発242427 回インストール5 週間前に更新
リポジトリ

api-filtering-sorting について

API 開発者向けに、フィルタリングとソートの設計方法をまとめたスキルです。演算子、フィールドの許可リスト、入力検証、クエリの安全対策を扱います。

主な機能

  1. 01一致・範囲フィルター演算子
  2. 02複数フィールドのソート構文
  3. 03フィールド許可リストと入力検証
  4. 04クエリ複雑度とインジェクション対策

活用シーン

  1. 01商品 API へのフィルター追加
  2. 02複数フィールドによる結果のソート
  3. 03ユーザー指定クエリフィールドの制限

インストール

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

$npx skills add https://github.com/secondsky/claude-skills --skill api-filtering-sorting

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

詳細

API のフィルタリングとソート

複雑なクエリを効率的に処理できる、柔軟なフィルタリングとソートのシステムを構築します。

クエリパラメータの構文

GET /products?category=electronics&price[gte]=100&price[lte]=500&sort=-price,name

実装(Node.js)

const allowedFilters = ['category', 'status', 'price', 'createdAt'];
const allowedSorts = ['name', 'price', 'createdAt'];

app.get('/products', async (req, res) => {
  const filter = {};
  const sort = {};

  // Parse filters
  for (const [key, value] of Object.entries(req.query)) {
    if (key === 'sort') continue;

    const match = key.match(/^(\w+)\[(\w+)\]$/);
    if (match) {
      const [, field, operator] = match;
      if (!allowedFilters.includes(field)) continue;
      filter[field] = { [`$${operator}`]: parseValue(value) };
    } else if (allowedFilters.includes(key)) {
      filter[key] = value;
    }
  }

  // Parse sort
  if (req.query.sort) {
    for (const field of req.query.sort.split(',')) {
      const direction = field.startsWith('-') ? -1 : 1;
      const name = field.replace(/^-/, '');
      if (allowedSorts.includes(name)) sort[name] = direction;
    }
  }

  const products = await Product.find(filter).sort(sort);
  res.json({ data: products });
});

function parseValue(value) {
  if (value === 'true') return true;
  if (value === 'false') return false;
  if (!isNaN(value)) return Number(value);
  return value;
}

フィルター演算子

演算子意味例
eq等しい?status=active
ne等しくない?status[ne]=deleted
gt/gteより大きい?price[gte]=100
lt/lteより小さい?price[lte]=500
in配列に含まれる?status[in]=active,pending
like含む?name[like]=phone

セキュリティ

  • 許可するフィルターフィールドをホワイトリストに登録します
  • フィールドごとに入力型を検証します
  • 頻繁にフィルタリングされる列にインデックスを付けます
  • クエリの複雑さを制限します
  • SQL/NoSQL インジェクションを防止します

ベストプラクティス

  • 一般的な演算子をサポートします
  • フィルターの選択肢リストをキャッシュします
  • クエリのパフォーマンスを監視します
  • 適切なデフォルト値を設定します

コメント