公開されているMCPサーバーを一通り試したものの、自社の業務データや社内APIをそのままClaudeから呼びたくなって、独自のMCPサーバーを自作する方法を探している方は多いはずです。結論から言えば、MCPサーバーの自作は公式SDKを使えば1ファイルから始められ、Pythonならmcp[cli]、TypeScriptなら@modelcontextprotocol/serverを入れて、ツールを1つ定義し、標準入出力(stdio)で起動するだけで動きます。この記事では、MCPサーバーとは何か、自作に必要な環境、Python・TypeScript両方での実装手順、作ったサーバーをClaude Desktop/Claude Codeへ接続する方法、そして筆者がサイト制作のQAに使う独自ツールの作り方まで、公式SDKのコード例つきでまとめます。

この記事の要点

  • MCPサーバーの自作は公式SDK(Python: mcp[cli] / TypeScript: @modelcontextprotocol/server)で行い、ツールを定義してstdioで起動するだけで最小構成が動きます。
  • MCPサーバーはResources・Tools・Promptsの3種類を提供でき、独自ツール(自社API・社内データ・定型処理)をAIから呼び出せるようになります。
  • 作ったサーバーはclaude_desktop_config.jsonのmcpServersに登録するか、Claude Codeのclaude mcp addで接続します。

01MCPサーバーとは|自作すると何ができるか

MCPサーバーとは、AIアプリケーション(Claude Desktopやエディタなどのホスト)に対して、ツールやデータを標準化された方法で提供する小さなプログラムです。MCP(Model Context Protocol)はAnthropicが公開したオープンな規格で、これに沿ってサーバーを書くと、Claudeが自社の関数やデータソースを直接呼び出せるようになります。自作する最大の利点は、公開されている汎用のMCPサーバーでは届かない、自社のAPI・社内ファイル・独自の定型処理をそのままAIの手足にできる点です。MCPの基礎はMCPとは?仕組みと使い方を図解で整理しています。

MCPサーバーで提供できる3種類の機能

MCPサーバーが提供できる機能は、公式ドキュメントで3種類に整理されています。自作でよく使うのは、AIから関数を呼び出せるToolsです。

種類 内容 自作での使いどころ
Resources クライアントが読み取れるファイル状のデータ(APIレスポンスやファイル内容) 社内ドキュメントやログをAIに読ませる
Tools LLMが呼び出せる関数(ユーザー承認つき) 自社APIの実行・データ取得・定型処理
Prompts 特定タスク向けの定型テンプレート 社内で決まった依頼文をひな形化

どんなときに自作を選ぶのか?

自作を選ぶのは、公開されているMCPサーバーに「やりたい処理がない」ときです。たとえば自社の在庫APIを叩く、社内のマークダウン群を検索する、独自フォーマットのCSVを集計する、といった処理は汎用サーバーには含まれません。こうした自社固有の処理を1つのツールとして切り出せば、Claudeにその名前で呼ばせられます。用途別の既製サーバーはweb制作におすすめのMCPサーバー厳選5選で紹介しています。

02自作の前に必要な環境とSDK

自作に必要なものは、使う言語のランタイムと公式SDKだけです。筆者が確認した公式クイックスタートでは、PythonとTypeScriptの手順が示されています。まずはどちらか一方で、ツールを1つだけ持つサーバーを作るのがおすすめです。

PythonとTypeScriptで必要なもの

Pythonの場合はパッケージ管理にuvを使い、mcp[cli]を導入します。TypeScriptの場合はNode.js環境で@modelcontextprotocol/serverとzodを入れます。SDKの導入コマンドは次のとおりです。

# Python(uvでプロジェクト作成→SDK追加)
uv init weather && cd weather
uv venv
uv add “mcp[cli]”

# TypeScript(npmプロジェクト→SDK追加)
npm init -y
npm install @modelcontextprotocol/server zod
npm install -D @types/node typescript

通信は標準入出力(stdio)が基本

自作サーバーの多くは、HTTPポートを開くのではなく、標準入出力(stdio)を通じてJSON-RPCメッセージをやり取りします。ローカルで安全に動かせるのが利点で、Claude Desktopのようなホストがサーバーをサブプロセスとして起動し、stdio越しに会話する仕組みです。この記事のコード例もstdioで統一しています。

03PythonでMCPサーバーを自作する手順

ここからは、Pythonで最小のMCPサーバーを作ります。やることは、サーバーを初期化し、@mcp.tool()で関数をツールとして登録し、stdioで起動する、の3つだけです。

ツールを1つ定義して起動する

公式のクイックスタートに沿うと、次のような形になります。MCPServerでインスタンスを作り、関数に@mcp.tool()を付けるだけで、その関数がAIから呼べるツールになります。docstringと引数の型注釈は、そのままツールの説明とスキーマとして使われます。

from mcp.server import MCPServer

mcp = MCPServer(“weather”)

@mcp.tool()
async def get_alerts(state: str) -> str:
    “””指定した米国州の気象警報を取得します。
    Args:
        state: 2文字の州コード(例: CA, NY)
    “””
    # ここで自社APIやデータソースを呼ぶ
    return “警報データ…”

if __name__ == “__main__”:
    mcp.run(transport=”stdio”)

作ったサーバーはどう起動するのか?

起動はuv run weather.pyです。実行するとサーバーは待機状態に入り、MCPホストからのメッセージを待ちます。この時点ではまだClaudeとはつながっていません。ターミナルでエラーなく起動できることを確認できたら、次のステップでホストに登録します。関数の中身を自社の処理に差し替えれば、それがそのまま独自ツールになります。

04TypeScriptでMCPサーバーを自作する手順

TypeScriptでも考え方は同じで、McpServerを作り、registerToolでツールを登録し、StdioServerTransportで接続します。入力スキーマはzodで書きます。

registerToolでツールを登録する

公式クイックスタートのTypeScript版は、次のような構造です。registerToolの第2引数で説明と入力スキーマを定義し、第3引数のハンドラーでcontent配列を返します。zodの.describe()を使うと、各引数の意味をAIに伝えられます。

import { McpServer } from “@modelcontextprotocol/server”;
import { StdioServerTransport } from “@modelcontextprotocol/server/stdio”;
import { z } from “zod”;

const server = new McpServer({ name: “weather”, version: “1.0.0” });

server.registerTool(
  “get_forecast”,
  {
    description: “指定した緯度経度の天気予報を取得します”,
    inputSchema: z.object({
      latitude: z.number().min(-90).max(90).describe(“緯度”),
      longitude: z.number().min(-180).max(180).describe(“経度”),
    }),
  },
  async ({ latitude, longitude }) => {
    // ここで自社APIを呼ぶ
    return { content: [{ type: “text”, text: “予報…” }] };
  }
);

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
}
main();

ビルドして実行する

tsconfig.jsonで出力先をbuildに設定し、package.jsonに"type": "module"とビルドスクリプトを足してから、npm run buildでコンパイルします。生成されたbuild/index.jsがサーバー本体になり、これをホストから起動します。TypeScriptは型でツールの入出力を固められるため、引数の取り違えを実装時に防ぎやすいのが利点です。

05作ったサーバーをClaude Desktop/Claude Codeにつなぐ方法

サーバーが起動できたら、ホストに登録して初めてClaudeから呼べます。Claude Desktopなら設定ファイル、Claude Codeならコマンドで登録します。

Claude Desktopのclaude_desktop_config.jsonに書く

Claude Desktopでは、設定ファイルclaude_desktop_config.json(macOSは~/Library/Application Support/Claude/配下)を開き、mcpServersキーにサーバーを追加します。Python版なら次のように、uvにプロジェクトの絶対パスを渡して起動させます。

{
  “mcpServers”: {
    “weather”: {
      “command”: “uv”,
      “args”: [“–directory”, “/ABSOLUTE/PATH/TO/weather”, “run”, “weather.py”]
    }
  }
}

設定を保存したらClaude Desktopを再起動します。ツールのアイコンが表示され、そこに自作ツールが並べば接続成功です。commandが見つからない場合は、which uvで得たuvの絶対パスを指定します。

Claude Codeはclaude mcp addで登録する

ターミナルで使うClaude Codeの場合は、claude mcp addコマンドで登録するのが簡単です。サーバー名と起動コマンドを渡すと、設定ファイルへの追記まで面倒を見てくれます。登録後は/mcpで接続状態を確認できます。既製サーバーを含めた接続例は日本特化のMCPサーバー6選も参考になります。正確なオプションは公式ドキュメントで確認してください。

06サイト制作・自社ツール開発でどう使うか【実践】

ここからは、筆者がサイト制作の作業をClaude Codeで回している立場から、自作MCPサーバーの当てどころを具体的に書きます。題材は、公開直後のページが正しく表示されているかを確認する、デプロイ後のQAです。

デプロイ確認用の自作ツールを作る

サイトを公開したあと、指定URLがHTTP 200で返るか、<title>が期待どおりかを、AIとの会話の中でそのまま確認したい場面があります。これを1つのツールにしておくと、Claudeに「このURLを確認して」と頼むだけで結果が返ります。次はPythonでの最小例です。認証情報やクライアント名は書かず、URLを渡すだけの汎用ツールにしています。

import httpx, re
from mcp.server import MCPServer

mcp = MCPServer(“site-qa”)

@mcp.tool()
async def check_url(url: str) -> str:
    “””URLのHTTPステータスとtitleを返します。
    Args:
        url: 確認したいページのURL
    “””
    async with httpx.AsyncClient(follow_redirects=True) as c:
        r = await c.get(url, timeout=10)
    m = re.search(r”<title>(.*?)</title>”, r.text, re.S)
    title = m.group(1).strip() if m else “(title無し)”
    return f”status={r.status_code} title={title}”

if __name__ == “__main__”:
    mcp.run(transport=”stdio”)

このサーバーをclaude mcp addで登録すれば、記事や制作ページを公開したあとに、Claudeへ「公開したURLをcheck_urlで確認して」と頼むだけで、ステータスとタイトルが会話の中に返ります。ブラウザを開いて目視する往復が減り、公開直後の確認が一手で済みます。

自社の定型処理をツール化する発想

同じ作り方で、社内マークダウンを全文検索するsearch_kb、CSVを決まった軸で集計するsummarize_csv、といった定型処理もツールにできます。ポイントは、1ツール=1つの明確な仕事に絞ることです。docstringに「いつ使うツールか」を具体的に書くほど、Claudeが適切な場面で呼んでくれます。認証が要る処理は、キーをコードに直書きせず環境変数から読むようにして、設定ファイルには秘密情報を残さない作りにします。

07既製の公開MCPサーバーとの違い【比較表】

自作は万能ではなく、既製の公開MCPサーバーで足りるならそちらが早いです。両者の違いを、選ぶときに気になる観点で並べます。

観点 既製の公開MCPサーバー 自作MCPサーバー 実務での意味
導入の速さ 登録するだけですぐ使える 実装が必要(最小1ファイル) 汎用処理は既製が速い
対応範囲 作者が用意した機能に限られる 自社API・社内データ・独自処理に対応 固有業務は自作でしか届かない
メンテナンス 作者の更新に依存 自分で保守(仕様変更に追従できる) 止められない処理は自作が安心
秘密情報の扱い 第三者コードに渡る場合がある 自分の管理下(環境変数で保持) 機密データは自作が扱いやすい

自作にするとアウトプットはどう変わると想定されるか?

自作ツールを持たせると、Claudeの回答が「一般論の説明」から「自社データに基づく具体的な結果」に変わると想定されます。たとえば在庫APIをツール化すれば、在庫の一般的な考え方ではなく、いまの実在庫を踏まえた回答になります。これは筆者の実測値ではなく、ツールが自社データを返す仕様からの想定です。汎用処理しか要らないなら既製で十分で、無理に自作する必要はありません。

08自作でつまずきやすいポイント

実際に自作して詰まった箇所を挙げます。多くは接続と起動まわりです。まずcommandに指定したuvやNodeが、Claudeから見えるパスにあるかを確認します。設定ファイルのcommandが見つからないときは、which uvで得た絶対パスに書き換えると通ることが多いです。

stdioに余計な出力をしない

stdioで通信するサーバーでは、標準出力(stdout)にJSON-RPC以外の文字を出すと通信が壊れます。デバッグのprintは標準エラー出力(stderr)に出すか、外します。TypeScriptならconsole.logではなくconsole.errorを使います。設定を変えたあとはホストの再起動が要る点も、見落としやすい前提です。

絶対パスと再起動を最初に疑う

「ツールが出てこない」ときの原因は、ほとんどが絶対パスの誤りかホスト未再起動です。設定を保存したらClaude Desktopを完全に終了して開き直し、それでも出なければargsのパスを1文字ずつ確認します。プラグインとして配布まで考えるならClaude Codeプラグインの使い方もあわせて設計してください。

FAQよくある質問

MCPサーバーの自作にプログラミングは必須ですか?

最小構成でも関数を1つ書くため、簡単なプログラミングは必要です。ただしPythonなら@mcp.tool()を付けた関数1つ、TypeScriptならregisterTool1つから始められ、公式SDKが通信部分を引き受けます。既存のコードに型注釈とdocstringを足す感覚で作れます。

PythonとTypeScriptのどちらで作るべきですか?

既存の資産に合わせるのが基本です。データ処理やスクリプトが多いならPython、フロントやNode資産が多いならTypeScriptが自然です。どちらも公式SDKがあり、stdioで起動してホストに登録する流れは共通なので、慣れた言語で始めて問題ありません。

作ったMCPサーバーはClaude以外でも使えますか?

使えます。MCPはオープンな規格で、対応するホストであればClaude Desktop以外のクライアントからも接続できます。サーバー側はホストを問わず同じ実装で動くため、1つ作れば複数のホストで再利用できます。

MCPサーバーの自作に料金はかかりますか?

SDK自体はオープンソースで、サーバーを動かすこと自体に追加料金はありません。かかるのは、ツールの中から呼ぶ外部API(有料APIなど)の費用や、Claudeの利用料金です。ローカルで動かす分にはサーバーの追加コストは発生しません。

HTTPで公開するサーバーも作れますか?

作れます。この記事ではローカルで安全なstdioを中心に紹介しましたが、MCPはリモート接続にも対応します。社内ネットワークや複数人での共有が必要なら、リモート対応のトランスポートを検討します。まずはstdioで動かし、必要に応じて広げるのが安全です。

10まとめ:まず1ツールから作る

MCPサーバーを自作するかは、「公開されているサーバーに、やりたい処理があるか」で決まります。汎用処理で足りるなら既製を登録するのが速く、自社API・社内データ・独自の定型処理を呼びたいなら自作の出番です。まずはPythonかTypeScriptで、ツールを1つだけ持つサーバーを作り、uv runやnpm run buildでローカル起動を確認してから、Claude DesktopのmcpServersかClaude Codeのclaude mcp addで接続するのが、失敗しない進め方です。基礎の仕組みはMCPとは?仕組みと使い方を図解、既製サーバーの選び方はweb制作におすすめのMCPサーバー厳選5選で確認してください。

11出典