1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeを本気で使い倒して気づいたこと——デザイン代替・MCP設計・Codexとの比較まで

1
Last updated at Posted at 2026-06-07

はじめに

「AIアシスト開発」という言葉が定着して久しいが、2026年に入ってからその使われ方が明らかに変わってきた。単にコードを補完させるだけでなく、UIデザインの初稿を生成させたり、データベースのMCPサーバーと繋いで自律的にクエリを書かせたりと、開発ワークフロー全体に組み込まれるようになってきている。

今回は直近のトレンドを軸に、Claude Codeを中心としたAIアシスト開発の現実を整理してみる。理想論ではなく、実際に運用してみて引っかかったことや、ツール選択の判断軸として参考になった知見をまとめた。


FigmaよりClaudeでデザインする人が増えている

Hacker Newsで話題になっていたのが「I design with Claude more than Figma now」という投稿だ。これは一部のパワーユーザーに限った話ではなく、特にプロトタイプ段階では実際に起きている変化だと感じる。

Figmaは「完成品を作る」ツールで、コンポーネントの整合性管理や共同編集に強みがある。一方、Claude(とくにClaudeのHTMLレンダリング能力)は**「アイデアを素早く形にする」フェーズで圧倒的に速い**。

Zennでも「Claude Codeで仕様書をMarkdownとHTMLで書き比べた」という記事が出ていたが、HTMLで仕様書を書いたほうがClaudeの出力品質が上がるという知見は面白い。Anthropicの技術ブログ「Using Claude Code: The unreasonable effectiveness of HTML」でも触れられているように、HTMLはUIの意図を構造的に伝えやすく、Claudeのコンテキスト理解と相性がいい。

実務での活用イメージ:

<!-- こういう仕様書HTMLをClaudeに渡すと精度が上がる -->
<section id="user-profile">
  <h2>ユーザープロフィール画面</h2>
  <ul>
    <li>アバター画像(丸形、64px)</li>
    <li>表示名(最大20文字、編集可)</li>
    <li>自己紹介文(最大140文字、任意)</li>
  </ul>
  <note>モバイルファーストで実装。Tailwind CSS使用。</note>
</section>

Markdownで同じ内容を書くよりも、要素の階層関係と制約が明確になる。「なんとなくHTMLのほうが賢そうに答える」という感覚の正体はここにある。


MCPサーバーにexecute_sqlを渡してはいけない理由

dev.toで「Preventing context bloat and agent loops in database MCP servers」という記事が公開されており、MCP設計のアンチパターンとして参考になった。

要点はシンプルで、汎用的なexecute_sqlツールをエージェントに渡すのは危険だということだ。

理由は二つある:

  1. コンテキスト爆発:エージェントが探索的にSQLを実行すると、巨大な結果セットがコンテキストに積み上がっていく。数回のループで10万行のレスポンスがコンテキストに乗ることも珍しくない。

  2. エージェントループ:「何を実行すべきか」の判断を毎回エージェントに委ねると、同じクエリを繰り返したり、エラーを無限に修正しようとするループに陥りやすい。

対策として有効なのは、目的に特化したツールを定義することだ:

# 汎用ツール(避けるべき)
@mcp.tool()
def execute_sql(query: str) -> list[dict]:
    return db.execute(query)

# 目的特化ツール(推奨)
@mcp.tool()
def get_user_count_by_plan(plan: str, limit: int = 10) -> dict:
    """プラン別ユーザー数を取得。limitは最大100。"""
    result = db.execute(
        "SELECT COUNT(*) as cnt FROM users WHERE plan = ? LIMIT ?",
        [plan, min(limit, 100)]
    )
    return {"plan": plan, "count": result[0]["cnt"]}

これはMCPに限らず、LLMにツールを渡す設計全般に言える原則だ。「何でもできる」ツールは、エージェントが迷子になる原因になる。ツールの責任範囲を絞ることで、コンテキストの消費も動作の予測可能性も改善する。


Claude CodeとCodexの設計思想の違い

Zennで「Claude CodeとCodexを使い比べて見えた設計思想の違い」という記事が注目を集めていた。筆者はClaude Code一本で来たエンジニアがOpus 4.7の品質に不満を感じてCodexに試乗し、その振る舞いの違いから設計哲学を考察したものだ。

観察されていた違いを簡単に整理すると:

観点 Claude Code Codex
ファイル操作の積極性 積極的に複数ファイルを横断 指示されたファイルに集中
エラー時の振る舞い 自律的に修正を試みる ユーザーに確認を返す
コンテキスト管理 長い会話でも継続 セッションをコンパクトに保つ

どちらが「良い」かは用途によるが、自律性が高い = 意図しない変更が起きやすいというトレードオフは常に存在する。Claude Codeで大規模なリファクタを依頼すると、関連ファイルを勝手に書き換えることがある。これが「賢い」とも「怖い」とも感じる人がいるのはそういう理由だ。

実務的な使い分けとしては、仕様が固まっている実装タスクはClaude Code、既存コードへの局所的な変更はCodex、という判断軸が一つの答えになりそうだ。


Rustのエラーハンドリングで地味に踏む罠

Zennに「Rustでエラー原因をsourceとDisplayの両方に書いてはいけない理由」という記事も出ていた。Rustのエラー設計ではthiserrorを使うことが多いが、このパターンに気をつける必要がある:

// NG: DisplayとsourceにどちらもDB接続エラーを含めている
#[derive(Error, Debug)]
#[error("DB接続に失敗しました: {0}")] // ← ここにsourceの内容を書いてしまっている
pub struct AppError(#[source] DbError);

// OK: DisplayはAppError自身の説明に留める
#[derive(Error, Debug)]
#[error("DB接続に失敗しました")]
pub struct AppError(#[source] DbError);

anyhowなどのエラーレポーターはsource()チェーンを自動で辿ってすべての原因を表示する。Displayにも同じ内容を書くとエラーメッセージが二重に出力される。地味だが、ログ調査時に混乱する原因になる。


まとめ

AIアシスト開発は「便利なオートコンプリート」の時代を完全に抜けた。デザインの初稿生成、仕様書フォーマットの工夫、MCPサーバーの設計指針、ツール選択の哲学——それぞれ実運用の文脈で具体的な知見が蓄積されてきている。

特にMCPのツール設計は、これからLLMを業務システムに繋ぐ人が必ず直面するテーマだ。「とりあえず汎用SQLツールを渡す」という最初の一手を踏み留まれるかどうかで、後の運用コストが大きく変わる。

ツールが増えるほど、判断の質が問われる局面も増える。今のうちに設計の勘所を押さえておくのが、この時期の正しい投資だと思う。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?