blog.yuzu441.com

mcpサーバー自作入門

tags: ai claude typescript

claude codeがリリースされて1周年ということでいい加減周辺技術を学び始めるかと思い、第一弾としてmcpが出てきた時に流行ってたmcpで足し算をするというの探してやってみたらコードが非推奨になってたりしたので、typescirptの2026/02/21最新バージョンでやってみる

mcpの方式

mcpの通信方式は主に以下のものらしい

  • ローカルでサーバーを動かす方式
    • stdioを利用
  • リモートでサーバーを動かす方式
    • ちょっと前は http/server sent eventでやってたらしい
    • 今はstreamable httpを利用

今回はstdioを利用する

足し算をするmcp

mcpのsdkはtypescript, python, go, rustなど色々なsdkが用意されているが SDKs を見るに modelcontextprotocol/typescript-sdk だけがTier 1だということを調べてて知った。そういう理由もありtypescriptで作っていく

作り方としては Build an MCP server を参考にした。stdioで作る注意点としてログは console.log では無く console.error かloggingライブラリでファイルに書き込むのが良いらしい。

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

const server = new McpServer({
  name: 'server-time',
  version: '0.0.1',
})

server.registerTool(
  'get-calc-add',
  {
    title: 'additional calulation',
    description: '足し算を行う',
    inputSchema: z.object({
      left: z.number(),
      right: z.number(),
    }),
  },
  async ({ left, right }) => {
    return {
      content: [
        {
          type: 'text',
          text: `足し算の結果は ${left} + ${right} = ${left + right} でした`,
        },
      ],
    }
  },
)

async function main() {
  const transport = new StdioServerTransport()
  await server.connect(transport)
  console.error('server is running...')
}

main().catch((e) => {
  console.error(e)
  process.exit(1)
})

claude codeへの設定

claude codeへのmcpの設定。pnpmを利用しているのでpnpxでtsx経由でmcp serverを実行する設定をする

claude mcp add --transport stdio server-time -- pnpx tsx <project root full path>/src/index.ts

プロンプトからmcpが使われるために重要なのは上記のコードで言うと”description”の description: '足し算を行う' と書かれている部分で、descriptionの内容でaiが自動的に選択してmcpを実行してくれる

今回はデバッグ的にあえて明確「mcpで1 + 2を計算して」というとmcp経由で実行され「足し算の結果は 1 + 2 = 3 でした」と出力された。

まとめ

思ったより簡単にmcpを実現できたので、もうちょっとまともなmcp作ってみたくなった1

slash-commandは業務で使ったことあるので、次はhooksだったりskillsだったりエージェントチームあたりかな

Footnotes

  1. 題材全く思いつかないけど