
MCPサーバー開発実践ガイド:Claude連携で業務効率を3倍にする実装術
お疲れ様です!IT業界で働くアライグマです!
「Claudeに社内データベースを直接参照させたいけど、どう実装すればいいの?」
「MCPサーバーって聞いたことあるけど、実際の開発手順がわからない…」
こんな悩みを抱えていませんか?
AnthropicがリリースしたModel Context Protocol(MCP)は、Claude Desktopアプリとローカルデータソースをシームレスに連携させる革新的な仕組みです。
HashiCorpがTerraform/Vault向けMCPサーバーを発表するなど、エンタープライズ領域でも急速に採用が進んでいます。
本記事では、PjMとして複数のMCPサーバー実装プロジェクトを経験した私が、TypeScript/Pythonでの具体的な開発手順からセキュリティ対策まで、実践的なノウハウを体系的に解説します。
この記事を読めば、明日から自社環境に最適なMCPサーバーを構築し、Claude活用の幅を大きく広げられるようになります。
MCPサーバーとは?Claude連携の基本概念
Model Context Protocol(MCP)は、AI assistantとローカルデータソース・ツールを標準化された方法で接続するためのオープンプロトコルです。
従来のClaude APIでは外部データへのアクセスに制約がありましたが、MCPサーバーを介することで、データベース・ファイルシステム・社内APIなど多様なリソースへの安全なアクセスが可能になります。
MCPアーキテクチャの3層構造
MCPは以下の3つのコンポーネントで構成されます。
- MCPクライアント:Claude Desktopアプリなど、AIアシスタント側のインターフェース
- MCPサーバー:データソースとクライアントを仲介するミドルウェア(本記事の実装対象)
- データソース:PostgreSQL、MongoDB、ファイルシステム、REST APIなど実際のリソース
この構造により、AIモデル自体を変更せずに、サーバー側の実装だけで機能拡張できる柔軟性が生まれます。
従来のAPI連携との決定的な違い
私が以前担当したプロジェクトでは、Claude APIに社内データを渡すために毎回手動でコンテキストを整形していました。
この運用では、データ量が増えるとトークン制限に引っかかり、必要な情報を削る判断に迫られる場面が頻発していたのです。
MCPサーバーを導入後は、Claudeが必要なタイミングで必要なデータだけを動的に取得できるようになり、問い合わせ対応時間が従来の3分の1に短縮されました。
特に、データベースの最新レコードを即座に参照できる点が、リアルタイム性が求められる業務で大きな効果を発揮しています。
MCPの標準化により、一度サーバーを実装すれば、将来的に他のAIツールでも同じインフラを再利用できる点も見逃せないメリットです。
ChatGPT/LangChainによるチャットシステム構築実践入門では、LangChainを使った類似のシステム構築手法が解説されていますが、MCPはよりシンプルな実装で同等の機能を実現できます。
Claude MCP実践ガイド:社内データベース連携で問い合わせ対応を70%高速化する戦略では、MCPサーバーを使った実際の業務改善事例を紹介しています。

開発環境構築:TypeScript/Pythonで始めるMCPサーバー実装
MCPサーバーの実装言語として、現在TypeScriptとPythonが公式にサポートされています。
どちらを選ぶかは、既存システムのスタックや開発チームのスキルセットに依存しますが、私の経験ではTypeScriptは型安全性が高く大規模開発向き、Pythonは迅速なプロトタイピングに適していると感じています。
TypeScript環境のセットアップ手順
TypeScriptでMCPサーバーを実装する場合、公式SDKの @modelcontextprotocol/sdk を使用します。
以下の手順で最小構成の開発環境を構築できます。
npm init -y
npm install @modelcontextprotocol/sdk
npm install --save-dev typescript @types/node tsx
# tsconfig.json を作成
npx tsc --init --target ES2022 --module NodeNext --moduleResolution NodeNext
この構成で、Node.js 18以降の環境であれば即座に開発を開始できます。
私のチームでは、さらに zod を追加してリクエスト/レスポンスのバリデーションを強化していますが、最初は公式SDKだけで十分です。
Python環境の構築とSDK導入
Python実装では mcp パッケージを使用します。
仮想環境を作成してから以下のコマンドでインストールします。
python -m venv venv
source venv/bin/activate # Windowsの場合: venv\Scripts\activate
pip install mcp
Python版の利点は、データサイエンス系ライブラリ(pandas、NumPyなど)との親和性が高く、データ加工処理を含むサーバーを短時間で実装できる点です。
実際、私が担当したデータ分析基盤連携プロジェクトでは、Pythonで実装したMCPサーバーが初期プロトタイプを2日で完成させる原動力になりました。
Claude Desktop設定ファイルの編集
MCPサーバーをClaude Desktopに認識させるには、設定ファイル claude_desktop_config.json を編集します。
macOSの場合は ~/Library/Application Support/Claude/ に、Windowsの場合は %APPDATA%\Claude\ に配置します。
{
"mcpServers": {
"my-database-server": {
"command": "node",
"args": ["/path/to/your/server/build/index.js"]
}
}
}
この設定により、Claude Desktop起動時に自動的にMCPサーバーが立ち上がり、常時接続状態が維持されます。
AI駆動開発完全入門 ソフトウェア開発を自動化するLLMツールの操り方で紹介されているAI駆動開発の考え方を取り入れると、この設定自動化スクリプトも含めて開発環境全体をコード管理できます。
Claude Desktop App実践ガイド:ブラウザ版から生産性を4倍にする活用術では、MCPサーバーを活用するためのClaude Desktopアプリの基本的な使い方を詳しく解説しています。

実践例:社内データベース連携MCPサーバーの構築手順
ここからは、実際にPostgreSQLデータベースと連携するMCPサーバーの実装例を紹介します。
この実装パターンは、社内の顧客管理システムや在庫管理システムなど、幅広い業務システムに応用できます。
データベース接続とツール定義
MCPサーバーでは、Claudeから呼び出せる「ツール」を定義します。
以下はTypeScriptでPostgreSQLクエリを実行するツールの実装例です。
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { Pool } from "pg";
const pool = new Pool({
host: process.env.DB_HOST,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
});
const server = new Server({
name: "postgres-mcp-server",
version: "1.0.0",
}, {
capabilities: {
tools: {},
},
});
server.setRequestHandler("tools/list", async () => ({
tools: [{
name: "query_database",
description: "Execute SQL query on PostgreSQL database",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "SQL query to execute" },
},
required: ["query"],
},
}],
}));
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "query_database") {
const result = await pool.query(request.params.arguments.query);
return { content: [{ type: "text", text: JSON.stringify(result.rows) }] };
}
throw new Error("Unknown tool");
});
このコードでは、環境変数からデータベース接続情報を読み込み、Claudeからのクエリリクエストを処理しています。
実運用では、SQLインジェクション対策として、プリペアドステートメントやクエリホワイトリストの実装が必須です。
LangChain 1.0実践ガイド:エージェント中心設計で開発効率を2倍にする実装術では、エージェント開発の設計パターンを学べます。
エラーハンドリングとログ出力
私が過去に経験した失敗例として、エラーハンドリングを軽視したことで、データベース接続エラー時にClaude側で何が起きているか把握できず、トラブルシューティングに半日を費やしたことがあります。
以下のように、詳細なエラー情報とログを実装することを強く推奨します。
server.setRequestHandler("tools/call", async (request) => {
try {
console.error("[MCP] Tool called: " + request.params.name);
if (request.params.name === "query_database") {
const query = request.params.arguments.query;
console.error("[MCP] Executing query: " + query);
const result = await pool.query(query);
return { content: [{ type: "text", text: JSON.stringify(result.rows) }] };
}
} catch (error) {
console.error("[MCP] Error:", error);
return {
content: [{ type: "text", text: "Error: " + error.message }],
isError: true,
};
}
});
ログは標準エラー出力(stderr)に出力することで、Claude Desktopのログビューアで確認できます。
インフラエンジニアの教科書で解説されているログ管理のベストプラクティスを参考に、本番環境では構造化ログ(JSON形式)への移行も検討すべきです。

HashiCorpのTerraform/Vault MCPサーバーから学ぶ設計パターン
2025年10月、HashiCorpがTerraformとVault向けのMCPサーバーを公式リリースしました。
このエンタープライズグレードの実装から、実践的な設計パターンを学ぶことができます。
マルチツール構成の実装戦略
HashiCorpのMCPサーバーは、単一のサーバーで複数のツール(Terraformプラン実行、Vaultシークレット取得など)を提供しています。
この設計により、関連する機能を一つのサーバーにまとめ、管理コストを削減できます。
私のチームでも、当初は機能ごとに別々のMCPサーバーを立てていましたが、Claude Desktop設定の複雑化とメンテナンス負荷の増大に悩まされました。
マルチツール構成に移行後は、設定ファイルの行数が60%削減され、新メンバーのオンボーディング時間も大幅に短縮されています。
認証・認可の実装パターン
Vault MCPサーバーでは、トークンベースの認証を実装しています。
MCPプロトコル自体には認証機構が含まれていないため、サーバー側で独自に実装する必要があります。
以下は、環境変数から認証トークンを読み込む簡易実装例です。
const AUTH_TOKEN = process.env.MCP_AUTH_TOKEN;
server.setRequestHandler("tools/call", async (request) => {
const providedToken = request.params.arguments._authToken;
if (providedToken !== AUTH_TOKEN) {
throw new Error("Authentication failed");
}
// 実際の処理...
});
本番環境では、OAuth 2.0やJWTを使った堅牢な認証機構の導入を検討すべきです。
設定の外部化とシークレット管理
HashiCorpの実装では、データベース接続情報やAPIキーなどの機密情報を環境変数で管理しています。
私の経験では、さらに .env ファイルと dotenv ライブラリを組み合わせることで、開発環境と本番環境の設定を明確に分離できました。
# .env.example(リポジトリにコミット)
DB_HOST=localhost
DB_NAME=your_database
DB_USER=your_user
DB_PASSWORD=your_password
MCP_AUTH_TOKEN=your_secret_token
# .env(.gitignoreに追加、実際の値を記載)
DB_HOST=production-db.example.com
DB_NAME=prod_db
DB_USER=prod_user
DB_PASSWORD=actual_secret_password
MCP_AUTH_TOKEN=actual_secret_token
この運用により、誤って機密情報をGitにコミットするリスクを大幅に低減できます。
実践Terraform AWSにおけるシステム設計とベストプラクティスでは、Terraformを使ったインフラ設定管理の手法が詳しく解説されており、MCPサーバーのデプロイ自動化にも応用できます。
AIコーディングアシスタント戦国時代!Cursor、Claude、Copilot… 結局どれが最強?徹底比較では、Claude以外のAIツールとの比較も行っており、開発環境選定の参考になります。

セキュリティとエラーハンドリング:本番運用で押さえるべきポイント
MCPサーバーは、Claude Desktopからローカルリソースへのアクセスゲートウェイとなるため、セキュリティ設計が極めて重要です。
私が過去に担当したプロジェクトで実際に発生したインシデントと、その対策を共有します。
SQLインジェクション対策の実装
データベース連携MCPサーバーで最も警戒すべきは、SQLインジェクション攻撃です。
Claudeが生成したクエリをそのまま実行すると、意図しないデータ漏洩や破壊のリスクがあります。
私のチームでは、以下の3段階の防御策を実装しています。
- プリペアドステートメント:パラメータ化クエリを使用し、ユーザー入力を直接SQL文に埋め込まない
- クエリホワイトリスト:実行可能なクエリパターンを事前定義し、それ以外を拒否
- 読み取り専用権限:データベースユーザーにSELECT権限のみを付与し、UPDATE/DELETEを禁止
以下は、プリペアドステートメントを使った安全な実装例です。
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "get_customer") {
const customerId = request.params.arguments.customer_id;
const result = await pool.query(
"SELECT * FROM customers WHERE id = $1",
[customerId]
);
return { content: [{ type: "text", text: JSON.stringify(result.rows) }] };
}
});
この実装により、Claudeが生成した入力値が悪意あるSQL文を含んでいても、パラメータとして安全に処理されます。
レート制限とリソース保護
MCPサーバーが高頻度でデータベースにアクセスすると、本番システムのパフォーマンスに影響を与える可能性があります。
私が経験した事例では、Claudeが大量のクエリを連続実行し、データベースの接続プールを枯渇させてしまいました。
対策として、以下のレート制限を実装しました。
import { RateLimiter } from "limiter";
const limiter = new RateLimiter({ tokensPerInterval: 10, interval: "minute" });
server.setRequestHandler("tools/call", async (request) => {
const remainingRequests = await limiter.removeTokens(1);
if (remainingRequests < 0) {
throw new Error("Rate limit exceeded. Please try again later.");
}
// 実際の処理...
});
この実装により、1分間に10リクエストまでに制限し、安全なウェブアプリケーションの作り方(徳丸本)で解説されているWebアプリケーションセキュリティの原則を適用してシステム全体の安定性を確保できます。
下のグラフは、実装パターン別の開発工数を示しています。
基本的なTypeScript/Python実装は10時間以内で完了しますが、データベース連携やマルチツール実装では倍以上の時間が必要になることがわかります。

詳細なログとモニタリング
本番運用では、誰がいつどのツールを呼び出したかを記録することが重要です。
私のチームでは、以下の情報を構造化ログとして出力しています。
console.error(JSON.stringify({
timestamp: new Date().toISOString(),
level: "INFO",
tool: request.params.name,
arguments: request.params.arguments,
result: "success",
}));
このログをCloudWatch LogsやDatadogなどの監視サービスに転送することで、異常なアクセスパターンを早期に検知できます。
LangChainとLangGraphによるRAG・AIエージェント[実践]入門では、AIエージェントのモニタリング手法が詳しく解説されており、MCPサーバーの運用監視にも応用できる知見が豊富です。
データベースセキュリティはどこまでやるべき?PjMが語る対策範囲と実践的アプローチでは、データベース連携時のセキュリティ設計について詳しく解説しています。

まとめ
本記事では、MCPサーバー開発の実践的な手法を、基本概念から本番運用のセキュリティ対策まで体系的に解説しました。
重要なポイントを振り返ります。
- MCPはClaude Desktopとローカルリソースを標準化された方法で接続するプロトコル
- TypeScriptは型安全性が高く大規模開発向き、Pythonは迅速なプロトタイピングに適している
- データベース連携では、プリペアドステートメントとクエリホワイトリストでSQLインジェクションを防ぐ
- HashiCorpの実装から学べるマルチツール構成と認証パターンは実用性が高い
- レート制限と詳細なログ出力により、本番環境の安定性とセキュリティを確保できる
MCPサーバーを活用することで、Claudeの能力を社内システムと直接統合し、業務効率を飛躍的に向上させられます。
まずは小規模なプロトタイプから始め、段階的に機能を拡張していくアプローチをお勧めします。
あなたのチームでも、明日からMCPサーバー開発に着手してみてはいかがでしょうか。










