背景と目的

最近「MCPサーバー」という言葉をよく耳にしますよね。
色々な解説を読んでみるのですが、結局「MCPって何?どうやって動かすの?」というのがよくわかりませんでした。

なので、理解のため、自前で作って動かしてみることにしました。
今回はローカルに最小サーバーを立てて、AIチャット(GitHub Copilot Chat)から呼んでみるところまでやってみました。

MCPサーバーとは

MCPは、Model Context Protocol の略です。イメージ的には、AI Chatに専用のAPIを追加すると考えるとわかりやすいです。
簡単に言うと

  • AI Chat からの自然言語でリクエストを受け取る
  • 処理して結果を返す

ための仕組みです。

ローカルMCPサーバーを作る

環境

  • macOS 13.7.4
  • Node.js v22
  • npm v10
  • VSCode + GitHub Copilot Chat (プレビュー機能でMCP対応済み)

セットアップ

まずは新しいディレクトリを作り、MCP SDK等をインストールします。

mkdir mcp-sample
cd mcp-sample
npm init -y
npm install zod
npm install @modelcontextprotocol/sdk

👉 何をしているか?
・@modelcontextprotocol/sdk は MCP サーバーを書くための公式SDKです。
これを入れると Server クラスを使ってサーバーを起動できます。
・zodは、型チェックができるライブラリです(これを入れないとエラーになる)

設定ファイルとコード

MCPサーバーをチャットから使えるようにするために、mcp.json という設定ファイルを作成します。

{
    "servers": {
        "my-mcp-server": {
            "command": "node",
            "args": ["${workspaceFolder}/index.js"],
        }
    }
}

👉 何をしているか?
GitHub Copilot Chatがこのファイルを読み込んで MCPサーバーを起動します。

次に、「文字列をそのまま返す」だけの処理のindex.js を作成します。

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {z} from 'zod';

// MCP サーバーを作成
const server = new McpServer({
  name: 'My MCP Server',
  version: '1.0.0',
});

// greet ツールを登録
server.registerTool(
  'greet',
  {
    title: 'Greet Tool',
    description: 'Echoes the input text',
    inputSchema: {text: z.string()} // zodで入力の型を定義
  },
  async ({text}) => {
    // 受け取ったテキストをそのまま返す
    return {content: [{ type: 'text', text }]};
  }
);

// GitHub Copilot Chatとの通信
const transport = new StdioServerTransport();
await server.connect(transport);

👉 何をしているか?
new McpServer() でMCPサーバーのインスタンスを作成
registerToolで、greetコマンドを登録(処理内容は、文字入力をそのまま返す)
・zodを使いインプットのパラメータ(text)が、文字列であることを定義
StdioServerTransportで、GitHub Copilot Chatとローカル通信する

実行してみる

ローカルにMCPサーバーを起動します。

node index.js

AIチャットから呼び出す

VS CodeのGitHub Copilot Chatを開いて、入力します。

チャット欄に返ってきた結果:

👉 何をしているか?
#greetは、index.jsで定義した「greetツール」を呼び出すコマンド
{ "text": "hello" } を入力に渡す
・greetツールで処理して、helloを返している

「AIチャットのコマンドで入力 → MCPサーバーの処理 → 結果が返る」という流れになっています。

今回理解できたこと

  • MCPサーバーの役割:Copilot Chat に「自作コマンド」を追加できる仕組み
  • 最小構成:mcp.json + index.js で十分動かせる
  • 通信の流れ:GitHub Copilot Chat ⇔ MCPサーバーが「リクエスト・レスポンス形式」でやり取りする

まずは「文字を返すだけ」でも、MCPサーバーがどういう流れで動いているのかが理解できました。

次のステップ

文字を返すだけでは実用性がないですが、応用としては下記のことなどができるかと思います。

  • 外部APIと連携
  • 例: 天気予報APIを叩いて「今日の天気」をCopilot Chatに返す

  • DBへのアクセス
  • 例: ローカルのSQLite/PostgreSQLに問い合わせて結果を返す

また、外部公開されているMCPサーバーの情報を設定ファイルに登録すると、そのMCPサーバーが提供するツール一覧が呼び出せるようになります。
今後は、外部MCPサーバーの利用や、APIやDBと組み合わせて、より実用的なMCPツールを試していきたいと思います。