Svelte MCP × typescript-eslint 連携

AI 時代の Svelte 5 開発では、Svelte MCPeslint-plugin-sveltetypescript-eslint の三点セットで品質保証を構築するのが 2026 年時点のベストプラクティスです。それぞれ異なる層で動作し、重複することなく互いを補完します。

この記事では、三者の役割分担、具体的なフル構成 eslint.config.js、Claude Code や Cursor との統合方法、CI/CD 連携、よくあるトラブルシューティングを解説します。

前提記事

この記事は ESLint と Prettier の基本的なセットアップを知っている前提で書かれています。未読の場合は先に ESLint + Prettier 設定 を読んでください。

この記事で学べること

  • Svelte MCP、eslint-plugin-svelte、typescript-eslint の役割分担
  • 2026 年 4 月時点の安定性と実用判断
  • フル構成の eslint.config.js(業務プロジェクト向け)
  • Claude Code / Cursor / AGENTS.md との統合
  • CI/CD での活用と pre-commit フック
  • トラブルシューティング

三点セットの役割分担

三つのツールはそれぞれ異なる層で動作します。一言でまとめると:

  • Svelte MCP は「AI がコードを書く 時」の品質保証
  • eslint-plugin-svelte は「人間が保存・push する 時」の静的解析
  • typescript-eslint は「TypeScript 固有の問題」の検出

詳細な役割比較

項目Svelte MCPeslint-plugin-sveltetypescript-eslint
主目的AI 生成コードの Svelte 5 準拠保証Svelte 構文の静的解析TypeScript 構文の静的解析
実行タイミングAI との対話時保存時・CI保存時・CI
代表的な機能svelte-autofixerget-documentation非推奨構文検出、a11y型情報ベースのルール
内部で使うパーサsvelte-eslint-parsersvelte-eslint-parser@typescript-eslint/parser
動作する場所AI エージェント(Claude Code、Cursor)エディタ、CIエディタ、CI

検出能力の重複とユニーク領域

同じコード問題でも、複数のツールが検出できる領域と、片方しか検出できない領域があります。これを理解しておくと「どこまでを何に任せるか」の設計判断ができます。

重複領域: $: 反応的宣言、<slot /> 構文、export let プロパティ、on:click など Svelte 4 のレガシー構文は、ESLint と MCP 両方で検出できます。この領域は「二重の安全網」として機能します。

ESLint のみ検出: 未使用変数、any の使用、a11y 違反、認知的複雑度、import 順序、命名規則など、汎用的な品質問題は ESLint の独壇場です。

MCP のみ検出: $state.eager のような最新ルーン、公式ドキュメントとの整合性、AI 生成時のコンテキスト保持、Svelte 4 → 5 移行支援は MCP が強みを発揮する領域です。

重複は問題ではなく冗長性

「同じ問題を二つのツールで検出するのは非効率では?」と思うかもしれません。しかし実務では、人間が保存時に気づけなかった問題を CI で拾う、AI が書いたコードを ESLint が再検証するなど、冗長性こそが品質保証の本質 です。片方のツールの誤検知・見落としをもう片方がカバーします。

2026 年 4 月時点の安定性評価

三点セットそれぞれの安定性を整理します。

ツールバージョン安定性評価
eslint-plugin-svelte3.17.x★★★★★Svelte 5 Runes 全対応。実務利用可
svelte-eslint-parser1.6.x★★★★★$state.eager 含む最新ルーン対応
typescript-eslint8.x★★★★★ESLint 9 flat config 完全対応
Svelte MCP★★★★☆公式提供、日々機能追加中
どこまで実務投入できるか

2026 年 4 月時点で、三点セットいずれも 業務プロジェクトへの投入に耐える安定性 に達しています。ただし eslint-plugin-svelte は patch リリース頻度が高いため、バージョン固定運用を推奨します(後述)。

フル構成の eslint.config.js

業務プロジェクト向けのフル構成を示します。基本の ESLint + Prettier 設定 に、typescript-eslint の型情報ベースルールと Svelte MCP との整合性設定を加えたものです。

// eslint.config.js
import js from '@eslint/js';
import ts from 'typescript-eslint';
import svelte from 'eslint-plugin-svelte';
import prettier from 'eslint-config-prettier';
import globals from 'globals';
import svelteConfig from './svelte.config.js';

export default ts.config(
  // 1. JavaScript 標準ルール
  js.configs.recommended,

  // 2. TypeScript の型情報ベース推奨ルール(strictRecommended)
  ...ts.configs.strictTypeChecked,
  ...ts.configs.stylisticTypeChecked,

  // 3. Svelte 推奨ルール
  ...svelte.configs.recommended,

  // 4. Prettier 衝突回避(必ず最後)
  prettier,
  ...svelte.configs.prettier,

  // 5. グローバル変数の宣言
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node
      },
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname
      }
    }
  },

  // 6. .svelte / .svelte.ts / .svelte.js 固有設定
  {
    files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
    languageOptions: {
      parserOptions: {
        projectService: true,
        extraFileExtensions: ['.svelte'],
        parser: ts.parser,
        svelteConfig
      }
    }
  },

  // 7. プロジェクト固有ルールのカスタマイズ
  {
    rules: {
      // TypeScript
      '@typescript-eslint/no-explicit-any': 'error',
      '@typescript-eslint/consistent-type-imports': [
        'error',
        { prefer: 'type-imports', fixStyle: 'separate-type-imports' }
      ],
      '@typescript-eslint/no-unused-vars': [
        'error',
        { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }
      ],

      // Svelte 5 Runes 関連
      'svelte/no-at-html-tags': 'error',
      'svelte/valid-compile': 'error',
      'svelte/no-reactive-literals': 'error',
      'svelte/prefer-style-directive': 'warn',

      // Svelte a11y
      'svelte/a11y-missing-attribute': 'error',
      'svelte/a11y-no-redundant-roles': 'error'
    }
  },

  // 8. 除外パターン
  {
    ignores: [
      'build/',
      '.svelte-kit/',
      'dist/',
      'node_modules/',
      '.eslintcache',
      'pnpm-lock.yaml'
    ]
  }
);

重要な設定ポイント

projectService: true と tsconfigRootDir

projectService: true は typescript-eslint v8 以降の推奨方式で、プロジェクト全体の TypeScript 設定を自動検出します。これにより型情報ベースのルール(strictTypeChecked)が高速かつ正確に動作します。

tsconfigRootDir: import.meta.dirname は、モノレポや複雑な構造のプロジェクトで tsconfig の基点を明示するための設定です。

parserOptions.svelteConfig が必須

.svelte および .svelte.ts / .svelte.js ファイルでは、必ず parserOptions.svelteConfig を指定してください。これがないと Runes が未定義シンボル扱いされます。

// NG
{
  files: ['**/*.svelte'],
  languageOptions: {
    parserOptions: { parser: ts.parser }
  }
}

// OK
import svelteConfig from './svelte.config.js';
// ...
{
  files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
  languageOptions: {
    parserOptions: {
      parser: ts.parser,
      svelteConfig  // ← これ
    }
  }
}

strictTypeChecked と stylisticTypeChecked の採用

typescript-eslint には複数のプリセットがあります。業務利用では以下の組み合わせが推奨されます。

プリセット内容推奨度
recommended最低限のルール学習用
recommendedTypeChecked型情報ベースの基本ルール小規模プロジェクト
strict厳格なルール(型情報なし)中規模
strictTypeChecked厳格なルール(型情報あり)業務推奨
stylisticTypeCheckedスタイル系ルール併用推奨

svelte-autofixer と ESLint の役割切り分けルール

プロジェクト固有ルールの設定では、MCP と ESLint の重複を意識的に設計します。

{
  rules: {
    // MCP が得意な領域(Svelte 5 固有)は warn に留めて、MCP での修正を推奨
    'svelte/prefer-style-directive': 'warn',

    // ESLint が得意な領域(汎用品質)は error で強制
    '@typescript-eslint/no-explicit-any': 'error',
    '@typescript-eslint/no-unused-vars': 'error'
  }
}

この設計にすることで、保存時の赤線は「ESLint でしか直せないもの」に絞られ、Svelte 5 構文の移行は AI(Claude Code 等)経由で MCP に任せる、という役割分担が自然に確立します。

Claude Code / Cursor との統合

AGENTS.md / CLAUDE.md での設定

Claude Code(CLAUDE.md)や Cursor(AGENTS.md または .cursorrules)で、以下のように MCP と ESLint の役割を明記しておくと、AI が一貫した挙動を取れます。

## コード品質チェック

このプロジェクトは以下の三点セットで品質保証しています:

1. **Svelte MCP**: AI にコード生成・修正を依頼する際、必ず `svelte-autofixer` で検証すること
2. **eslint-plugin-svelte**: 保存時・CI で自動実行される
3. **typescript-eslint**: `@typescript-eslint/no-explicit-any` は error。any 使用時は必ず理由をコメントで明記

### 優先順位
- Svelte 固有のレガシー構文(`$:``<slot />``export let``on:click`)の検出で MCP と ESLint が衝突した場合は MCP を優先
- その他は ESLint のルールを優先

VS Code / Cursor 設定

.vscode/settings.json で、MCP と ESLint の両方が気持ちよく動く設定例:

{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "[svelte]": {
    "editor.defaultFormatter": "svelte.svelte-vscode"
  },
  "eslint.validate": [
    "javascript",
    "typescript",
    "svelte"
  ],
  "svelte.enable-ts-plugin": true,
  "typescript.tsdk": "node_modules/typescript/lib"
}
TypeScript の SDK を揃える

typescript.tsdknode_modules/typescript/lib を指定することで、エディタと ESLint で 同じ TypeScript バージョン を参照させます。これがないとエディタと CI で挙動が食い違うことがあります。

CI/CD 統合

典型的な CI パイプラインは以下のようになります。

GitHub Actions の例

.github/workflows/ci.yml:

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  lint-and-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup pnpm
        uses: pnpm/action-setup@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: pnpm

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Run svelte-check
        run: pnpm check

      - name: Run ESLint
        run: pnpm lint

      - name: Run Prettier check
        run: pnpm exec prettier --check .
AI レビューとの組み合わせ

GitHub Actions で Claude や他の AI エージェントをワークフローに組み込み、PR のコード変更を svelte-autofixer で検証させる構成も可能です。ESLint で拾えない「AI がうっかり Svelte 4 構文を書いた」ケースをマージ前に検出できます。詳細は 開発環境との統合 の「CI/CD 統合」セクションを参照してください。

pre-commit フック

husky + lint-staged の組み合わせで、コミット前に三点セットを走らせます。

.husky/pre-commit:

pnpm exec lint-staged

package.json:

{
  "lint-staged": {
    "*.{ts,js,svelte}": [
      "prettier --write",
      "eslint --fix"
    ],
    "*.{md,json,yml,yaml}": [
      "prettier --write"
    ]
  }
}
svelte-check は pre-commit で実行しない

svelte-check は全ファイルを走査するため実行が重く、pre-commit には向きません。CI のみで実行するのが現実的です。

バージョン固定運用

eslint-plugin-sveltesvelte-eslint-parser はリリース頻度が高く、patch アップデートで挙動が微妙に変わることがあります。業務プロジェクトでは package.json でバージョンを固定し、明示的なアップグレードタイミングをコントロールすることを推奨します。

{
  "devDependencies": {
    "eslint-plugin-svelte": "3.17.0",
    "svelte-eslint-parser": "1.6.0",
    "typescript-eslint": "8.20.0",
    "eslint-config-prettier": "10.0.1"
  }
}

アップグレード時は以下のチェックリストで確認します。

  1. CHANGELOG.md で breaking changes がないか確認
  2. ローカルで pnpm lint を実行し、新しい警告が出ていないか確認
  3. CI でフルパイプラインを走らせる
  4. svelte-autofixer のルールとの整合性を確認

トラブルシューティング

.svelte.ts が解析されない

flat config の files パターンに **/*.svelte.ts を明示的に含める必要があります。

{
  files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
  // ...
}

Runes が未定義シンボルとして検出される

parserOptions.svelteConfig の設定漏れが原因です。svelte.config.js を読み込んで parserOptions に渡してください(前述)。

typescript-eslint が非常に遅い

型情報ベースのルール(*TypeChecked)は遅い傾向があります。以下を試してください。

{
  languageOptions: {
    parserOptions: {
      projectService: true,      // v8 推奨方式(v7 以前の project: '...' より高速)
      tsconfigRootDir: import.meta.dirname
    }
  }
}

また、CI では eslint --cache を使用してください。

pnpm eslint . --cache --cache-location .eslintcache

MCP と ESLint で挙動が違う

基本的に MCP を優先 してください。MCP は公式ドキュメントと同期しているため、最新の Svelte 仕様に対してより正確です。ESLint プラグインは追随が遅れることがあります。

矛盾を検出したら、eslint-plugin-svelte の該当ルールを無効化するか、MCP を信用して ESLint の警告を // eslint-disable-next-line でローカル無効化します。

<script lang="ts">
  let count = $state(0);
  // MCP 推奨の書き方だが、ESLint のスタイル系ルールと衝突する場合の例
  // eslint-disable-next-line svelte/prefer-style-directive
  let doubled = $derived(count * 2);
</script>

<button onclick={() => count++}>{count}</button>
<p>{doubled}</p>

eslint.config.jsrules で該当ルール自体を 'off' にする方法もあります。プロジェクト全体で MCP を優先したい場合はこちらが現実的です。

{
  rules: {
    'svelte/prefer-style-directive': 'off'  // MCP が推奨する書き方を許容
  }
}

ESLint プラグインのメジャーアップデート

eslint-plugin-svelte の major バージョンアップ時は breaking changes が多く、ルール名や挙動が変わることがあります。必ず以下を確認:

  1. 公式リリースノート を熟読
  2. プロジェクト全体で pnpm lint を走らせて、新しい違反が出ないか確認
  3. svelte-autofixer との整合性を再確認

役割分担チートシート

最後に、三点セットの役割分担を 1 枚にまとめます。

シチュエーション使うツール
AI にコード生成を依頼するSvelte MCP
AI にリファクタリングを依頼するSvelte MCP + get-documentation
Svelte 4 → 5 の移行Svelte MCP(svelte-autofixer が最強)
未使用変数・import 順序の統一ESLint (typescript-eslint)
any の禁止ESLint (typescript-eslint)
a11y 違反の検出ESLint (eslint-plugin-svelte)
型エラーの検出svelte-check
コードフォーマットPrettier
PR のブロッカーとしての最終チェックCI 上の ESLint + svelte-check

まとめ

Svelte MCP × eslint-plugin-svelte × typescript-eslint の三点セットは、AI 時代の Svelte 5 開発における品質保証の完成形の一つです。それぞれ異なる層で動作し、冗長性によって互いの弱点をカバーします。

  • Svelte MCP は AI 対話時の Svelte 5 準拠保証
  • eslint-plugin-svelte は保存時・CI 時の静的解析
  • typescript-eslint は TypeScript 固有の問題検出
  • 役割分担を意識した設定 で、エディタの赤線を意味のあるものに絞る
  • バージョン固定運用 で安定した開発体験を維持
  • CI での二重チェック で PR 品質を担保

2026 年時点で全て実務投入可能な安定性に達しています。

次のステップ