≪ Today I learned.
RSS購読
    公開日
    タグ
    Programming , AI
    著者
    ダーシノ

    MCPサーバをつくって学ぶ

    最近、AIアシスタントの文脈で「MCP」や「MCPサーバー」という用語を聞くようになった。

    MCP(Model Cotext Protocol)とは?

    Model Context Protocolとは、AIとアプリケーションとの間で情報を効率的にやり取りするためのプロトコル。 簡単に説明すると、AIが自分の作ったアプリケーションを操作できるように、データを提供したり、機能を公開したりして、扱いやすくするための方法を定義したもの(プロトコル)。

    MCPを使うことで、AIがアプリケーションのコンテキストを理解できるようになる。 たとえば、いままで手動でデータを貼り付けたり、プロンプトを書いてコンテキストを補っていたりしたものが、AIが直接アプリケーションから取得できるようになる。

    MCPサーバー

    主に3つの機能を提供する。

    MCPクライアント

    MCPをサポートし、MCPサーバと通信するためのアプリケーションのこと。たとえばClaude DesktopやGitHub Copilot、Clineなどだ。

    基本的にクライアントはエディタなどにお任せするので、自分たちで実装する機会は少ないかもしれない。

    MCPサーバーをつくる

    Model Cotext ProtocolというOrganizationで各言語をサポートしたSDKが公開されている。イチから自分で実装するのも良いが、現時点ではSDKを使うのが無難そう。

    必要なパッケージのインストール

    今回はNode.js + TypeScriptで最小構成のMCPサーバを開発するので、以下のパッケージをインストールする。

    npm i @modelcontextprotocol/sdk
    npm i -D typescript @types/node
    // package.json
    {
      ...,
      "scripts": {
        "build": "tsc --outDir build",
      },
      ...,
    }

    MCPサーバを実装する

    サーバーの現在時刻を取得する簡単なMCPサーバーを実装する。

    // src/index.ts
    import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
    import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
    
    const server = new McpServer({
      name: 'server-time',
      version: '0.0.1',
      capabilities: {
        resources: {},
        tools: {},
      },
    })
    
    server.tool(
      'get-server-time',
      'サーバーの現在時刻を取得します。',
      {},
      async () => {
        return {
          content: [
            {
              type: 'text',
              text: `サーバーの現在時刻は ${new Date().toLocaleString()} です。`,
            },
          ],
        }
      },
    )
    
    async function main() {
      const transport = new StdioServerTransport()
      await server.connect(transport)
      console.log('Server is running...')
    }
    
    main().catch((error) => {
      console.error('Error starting server:', error)
      process.exit(1)
    })

    MCPサーバーをつかう

    次にVSCode + GitHub CopilotからMCPサーバーを使う。

    別のディレクトリを作成し、.vscode/mcp.jsonに先ほど実装したMCPサーバーのパスを設定する。

    // ./vscode/mcp.json
    {
      "servers": {
        "mcp-server-time": {
          "command": "node", // 場合によっては絶対パスで指定する
          "args": [
            "/ABSOLUTE/PATH/TO/PARENT/FOLDER/lab-mcp/build/index.js"
          ],
        }
      }
    }

    その後、VSCodeのインラインで▷Start | 1 cached toolsと表示されているところをクリックして、サーバーを起動する。

    次にGitHub Copilot Chatを開き、Agentモードに切り替える。

    GitHub Copilot Chatでモードを切り替えている。Ask/Edit/Agentの選択肢があり、Agentが選択されている

    その後、レンチのアイコンをクリックし、MCPサーバーが使える状態になっているか確認する。

    MCPサーバの一覧が表示されている。MCP Server: mcp-server-time get-server-timeが有効になっている。

    あとはChatで「現在のサーバー時刻を取得し、それをファイル名に設定してください。ファイルの中にはconsole.log('test')とだけ実装してください。」のような指示をすると、MCPサーバーを呼び出し現在の時刻を取得してくれる。

    GitHub Copilot Chatがget-server-timeを使用してよいか確認している。

    すべての処理が終わり、現在時刻をファイル名にしたファイルが作成されている。