☃️

年末なのでClaudeCodeの足回りを見直してみる

に公開

はじめに

この記事はTSKaigi Advent Calendar 2025の5日目です。
今年は以前から話題になっていたTypeScriptのGo移植版であるtypescript-goが公開されたり、Node.jsのStrip TypeオプションがStableになったりと、TypeScript関連の話題には事欠かない年でしたね!

しかしながら僕としては今年は特にTypeScriptで何かを成し遂げたわけでもないのです。我々ももう何年もTypeScriptと向き合っておりますから、ネタ切れという年もあります。TSKaigiのスタッフとしても、「今年はTypeScriptに関係なくてもOK!」と免罪符をいただいておりますので、堂々とTypeScriptに関係ない話をしていこうと思います。

システムプロンプトについて

大体の方はもちろん開発に生成AIを使っていると思うのですが、果たしてどのようなものをどのように使っているのでしょうか?

僕はClaudeCodeとCursorを主に使っております。面白みがなくて申し訳ない…
今日はCursorしかなかった頃から継ぎ足してきた僕の秘伝のシステムプロンプトを公開しちゃいます。

・日本語でレスポンスすること
・常に最高のパフォーマンスを出すこと
・実装前に似たような処理がないか探し、参考にすること。特に規約はしっかり守ること。
・指示されたことだけをやること
・最大の効率を得るために、複数の独立した操作を実行する必要がある場合は、並列に実行すること
・最後に動作確認やlint, format,型チェックまで行うこと
・動作確認はウェブアプリの場合、PlaywrightMCPを使うこと
・タスク完了後、今後のタスク遂行上気をつけるべきルールを発見した場合、なるべく短く簡潔になるようにCLAUDE.local.mdを更新すること
・複雑なタスクについてはまずタスクを分解し、それぞれのタスク専用のSubagentを作成し、そのエージェントにタスクを依頼し、結果をレビューするような形で進めること

これひと昔前だったらかなりイケてたんですが、サブエージェントだのスキルだのが出て来て、かなり時代遅れなものになってしまいました。
ちなみに

複雑なタスクについてはまずタスクを分解し、それぞれのタスク専用のSubagentを作成し、そのエージェントにタスクを依頼し、結果をレビューするような形で進めること

これを守ってくれたことはありません…一応書いてる…最近はプランモードが勝手に似たような動きをしてくれてますね。

また、

タスク完了後、今後のタスク遂行上気をつけるべきルールを発見した場合、なるべく短く簡潔になるようにCLAUDE.local.mdを更新すること

これはやってくれたりくれなかったりで、僕は別で/update-knowledgeというカスタムコマンドを用意してます。多分Hookとかでタスク完了時に呼ばせると良さそう。
だけど、スキルはAIが自動で判断して呼ぶので、スキルでやった方が良さそう…

ということでスキルに起こしてみた。

---
name: update-knowledge
description: 作業完了後、今後の作業で役立つルールを発見した場合、CLAUDE.local.mdを簡潔に更新する
---

# Update Knowledge

## Instructions
作業完了後、今後の作業で役立つルールやパターンを発見した場合:

1. CLAUDE.local.mdを開く
2. 発見したルールを簡潔に追加、更新
3. 箇条書きで記述し、具体的に書く

## 例
- 「コードを正しくフォーマットする」ではなく「2スペースインデントを使用」
- 関連するルールは見出しでグループ化

ちなみに
https://code.claude.com/docs/ja/memory#claude-mdインポート

CLAUDE.local.mdは非推奨になっていて、
~/.claude/my-project-instructions.mdのようなユーザーディレクトリ配下にプロジェクトごとにファイルを分けてナレッジを貯めて、CLAUDE.mdに@~/.claude/my-project-instructions.mdのように書いてインポートして使うやり方が推奨されています。

が、これだとプロジェクトによってファイル名が違うので、共通のシステムプロンプトとしてナレッジを更新するプロンプトが書きづらくなるような気がしていて一旦放っておいてます。

最大の効率を得るために、複数の独立した操作を実行する必要がある場合は、並列に実行すること

これは結構やってくれてますが、果たしてプロンプトが効いてるのかClaudeのモデルが頭が良くて勝手にやってくれてるのかは不明。

MCPについて

とっても便利なMCP、実は起動時に自動でツール群を読み込むため、毎回とんでもない量のコンテキストを圧迫します。

コンテキストが今どんな状況かは/contextで確認出来ます。試しに起動して何もプロンプトを入れてない状態で確認してみましょう。

> /context 
  ⎿  
      Context Usage
     ⛀ ⛁ ⛁ ⛁ ⛁   claude-opus-4-5-20251101 · 61k/200k tokens (30%)
     ⛁ ⛁ ⛁ ⛀ ⛀ 
     ⛶ ⛶ ⛶ ⛶ ⛶   ⛁ System prompt: 2.9k tokens (1.5%)
     ⛶ ⛶ ⛶ ⛶ ⛶   ⛁ System tools: 15.0k tokens (7.5%)
     ⛶ ⛶ ⛶ ⛶ ⛶   ⛁ MCP tools: 39.4k tokens (19.7%)
                 ⛁ Memory files: 3.4k tokens (1.7%)
                 ⛁ Messages: 8 tokens (0.0%)
                 ⛶ Free space: 139k (69.6%)

     MCP tools · /mcp
     └ mcp__github__add_issue_comment (github): 640 tokens
     └ mcp__github__add_pull_request_review_comment (github): 947 tokens
     └ mcp__github__create_branch (github): 638 tokens
     └ mcp__github__create_issue (github): 713 tokens
     └ mcp__github__create_or_update_file (github): 720 tokens
     └ mcp__github__create_pull_request (github): 719 tokens
     └ mcp__github__create_pull_request_review (github): 1.1k tokens
     // 省略 //
     └ mcp__playwright__browser_hover (playwright): 636 tokens
     └ mcp__playwright__browser_select_option (playwright): 684 tokens
     └ mcp__playwright__browser_tabs (playwright): 652 tokens
     └ mcp__playwright__browser_wait_for (playwright): 650 tokens

     Memory files · /memory
     └ User (/Users/yodaka/.claude/CLAUDE.md): 313 tokens
     └ Project (/Users/yodaka/Desktop/project/CLAUDE.md): 1.7k tokens
     └ Project (/Users/yodaka/Desktop/project/.claude/CLAUDE.md): 83 tokens
     └ Local (/Users/yodaka/Desktop/project/CLAUDE.local.md): 1.3k tokens

     SlashCommand Tool · 0 commands
     └ Total: 864 tokens

MCP toolsだけで39.4k tokens (19.7%)使用されています。まだ何もやらせてないのに!

ちなみに、今は外したんですが、間違ってグローバルのmcp設定にmastraのドキュメントのMCP入れてて、毎回とんでもない量のトークンを使用されちゃってました。
mastraが必要なプロジェクトを開いたときだけ読み込まれるように、プロジェクトごとのMCP設定に入れるようにしましょう。

しかし、起動するだけで30%もコンテキストが、、

そんなあなたに「Code execution with MCP」という方法があります。
https://www.anthropic.com/engineering/code-execution-with-mcp

端的に言うと、MCPのツールを読み込んで直接使うのではなく、MCPをコールして必要な結果だけをもらうコードをAIに書かせて間接的にMCPを使用するというやり方のようです。

とはいえ大量のMCPツールをコードに変換するのは大変そう…
と思い、MCPをSkillにうまく変換するためにいろいろ試してみたものの、今の所まだ頑張ってコード書かないとダメそう…(いろいろやったんですがアドベントカレンダーの都合上時間切れに…)

ちなみにこれはパッと読んだ感じかなり良さそうでした。
https://zenn.dev/bm_sms/articles/modular_mcp_context_optimize

settingについて

~/.claude/settings.jsonに色々設定を書けます。
コンテキストを減らすための機能ON/OFFや、モデルや挙動などもいろいろ設定できます。
https://code.claude.com/docs/ja/settings#環境変数

  "env": {
    "CLAUDE_CODE_AUTO_CONNECT_IDE": "false",
    "CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL": "true",
    "CLAUDE_CODE_IDE_SKIP_VALID_CHECK": "true",
    "CLAUDE_CODE_ENABLE_TELEMETRY": "false",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "true",
    "DISABLE_ERROR_REPORTING": "true",
    "DISABLE_TELEMETRY": "true",
    "DISABLE_MICROCOMPACT": "true",
    "CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR": "true"
  },

僕はIDEからClaudeCodeを使わないので、この辺を切って不要なコンテキストを入れないようにしています。(効果があるかはよくわかっていない)
ちなみにCLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIRとかはClaudeがバックとフロントで別々のリポジトリ操作してる時にディレクトリ間違えてコマンド打ってるみたいなのをまぁまぁ防げるのでおすすめ。

終わりに

これを書いている途中でCloudflareが落ちて、Claude Codeのドキュメントにアクセスできなくなったので、これでおしまいとします…笑
来年もTSKaigiやりますので是非に!!
みなさん良いお年を!!

Discussion