公開されている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の導入コマンドは次のとおりです。
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と引数の型注釈は、そのままツールの説明とスキーマとして使われます。
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 { 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を渡すだけの汎用ツールにしています。
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出典
- Model Context Protocol「Build an MCP server(Quickstart)」https://modelcontextprotocol.io/quickstart/server
- Model Context Protocol「Server concepts(Resources / Tools / Prompts)」https://modelcontextprotocol.io/docs/learn/server-concepts
- Anthropic「Claude Code — MCP」https://code.claude.com/docs/en/mcp