この手順でできること
- MCP サーバーの最小の作り(ツールの定義と、標準入出力での接続)が分かる
- Claude Code に MCP サーバーを登録して、ツールを呼び出してもらう
用意するもの
- Node.js 20 以上
- Claude Code が使えること(ログイン済み)
手順
一、プロジェクトを作り、SDK を入れる
MCP の公式の TypeScript SDK と、入力の形を定義する zod を入れます。
mkdir moji-counter && cd moji-counter npm init -y npm pkg set type=module npm install @modelcontextprotocol/sdk zod二、ツールを1つ持つ MCP サーバーを書く
生成 AI は文字数を数えるのが苦手なので、プログラムで正確に数えるツールにします。ツールには名前・説明・入力の形を付けます。Claude は説明を読んで、いつ使うかを判断します。
Claude Code とは標準入出力(stdio)でつなぎます。
server.js import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { z } from 'zod'; const server = new McpServer({ name: 'moji-counter', version: '1.0.0' }); server.registerTool( 'count_characters', { title: '文字数を数える', description: '日本語を含む文章の文字数を正確に数える。改行と空白を除いた文字数も返す。文字数の指定がある文章を書いたときの確認に使う。', inputSchema: { text: z.string().describe('数えたい文章') }, }, async ({ text }) => { const all = [...text].length; const withoutSpaces = [...text.replace(/\s/g, '')].length; return { content: [{ type: 'text', text: `文字数: ${all}(改行・空白を除くと ${withoutSpaces})` }] }; }, ); await server.connect(new StdioServerTransport());三、Claude Code に登録する
claude mcp add で登録します。-- の後ろが、サーバーを起動するコマンドです。既定では、このプロジェクトであなただけが使える設定(local)になります。チームで共有したいときは --scope project を付けると、.mcp.json に保存されます。
claude mcp add moji-counter -- node "$(pwd)/server.js"四、Claude Code から使ってもらう
Claude Code を起動し、文字数を数えるよう頼みます。初めてツールを使うときは、実行してよいかの確認が出るので許可します。
claude > 「生成AIで業務を変える」という文の文字数を、moji-counter のツールで数えて
うまくいったかの確かめ方
- Claude Code の中で /mcp を実行すると、moji-counter が connected と表示される
- mcp__moji-counter__count_characters のツールが呼ばれ、「文字数: 11(改行・空白を除くと 11)」が返る(試したときの実際の結果です)
つまずきどころ
- サーバーのパスは絶対パスで登録します。相対パスだと、Claude Code を別の場所で起動したときに見つかりません。
- stdio のサーバーでは、標準出力にログを書かないでください。通信が壊れます。ログは標準エラー出力(console.error)に書きます。
- ツールの説明(description)は、Claude がツールを選ぶ手がかりです。いつ使うのかを具体的に書きます。
後片付け
- claude mcp remove moji-counter で登録を外し、フォルダを削除します。