大規模言語モデル(LLM)を業務に組み込む際、「社内のデータベースやツールとどう連携させるか」という課題に直面することは珍しくありません。これまでは、各ツールが提供するAPIの仕様に合わせて個別の統合コードを書き、プロンプトエンジニアリングで無理やり繋ぎ合わせるのが一般的でした。
しかし、このアプローチには限界があります。ツールが増えるたびに開発コストが膨らみ、保守も複雑化していくからです。そこで現在、業界内で注目を集めているのが「MCP(Model Context Protocol)」という標準化のアプローチです。
本記事では、MCPプロトコルの仕組みを紐解きながら、ローカル環境でAIとSQLiteを連携させる具体的な手順や、TypeScriptを用いたサーバーの自作方法までをハンズオン形式で解説します。「AIに社内データを安全に渡す」ための新しい標準を、手を動かしながら体感してみてください。
※本記事で解説する設定手順や仕様は一般的な技術概念に基づくものです。各AIクライアントやツールの正式な名称、最新のサポート状況、詳細な連携仕様については、必ず公式サイトおよび公式ドキュメントをご確認ください。
なぜ今、Model Context Protocol(MCP)を学ぶ必要があるのか?
AIを単なるチャットボットから「自律的にタスクをこなすエージェント」へと進化させるためには、外部データへのアクセス権を与える必要があります。MCPは、この「AIと外部システムの架け橋」を標準化するために設計されたプロトコルです。
プロプライエタリな連携から「標準規格」への転換
これまでのAI外部ツール連携は、特定のプラットフォームに依存したプロプライエタリ(独自仕様)な実装が主流でした。例えば、特定のLLMプロバイダー専用のプラグインを作ったり、RAG(Retrieval-Augmented Generation)のための専用パイプラインを構築したりする必要がありました。
MCPは、この「N対N」の複雑な接続を「標準化されたインターフェース」に置き換えることを目指しています。USBポートがPCとあらゆる周辺機器を繋ぐ標準規格となったように、MCPはAIとあらゆるデータソース(データベース、ファイルシステム、社内APIなど)を繋ぐ共通言語として機能します。
MCPが解決する3つのエンジニアリング課題
専門家の視点から言えば、MCPの導入は以下の3つのエンジニアリング課題を解決するブレイクスルーとなります。
- 開発コストの削減:一度MCP準拠のサーバーを構築すれば、対応する複数のAIクライアントから再利用が可能になります。
- セキュリティ境界の明確化:AIモデル自体に直接データを持たせるのではなく、必要な時に必要なデータだけをプロトコル経由で取得するため、アクセス制御を一元管理しやすくなります。
- コンテキストの動的提供:静的なシステムプロンプトの限界を超え、ユーザーの要求に応じてリアルタイムに最新の情報をAIのコンテキストウィンドウに注入できます。
MCPの3層構造を理解する:Host、Client、Serverの役割
実際に手を動かす前に、MCPのアーキテクチャを論理的に理解しておくことが重要です。MCPは主に「Host」「Client」「Server」の3つのコンポーネントで構成されており、これらがJSON-RPCベースのメッセージを交換することで連携します。
Host:AIとの対話インターフェース
Hostは、ユーザーが直接操作するアプリケーションの最上位レイヤーです。ユーザーの入力を受け取り、AIモデルと通信して結果を表示する役割を担います。一般的に、ローカルで動作するAIチャットアプリケーションや、AI機能が統合されたエディタなどがこれに該当します。
Client:プロトコルの仲介役
Clientは、Hostの内部に組み込まれ、外部のServerとの通信をプロトコルに従って仲介する役割を持ちます。Hostが「このデータが必要だ」と判断した際、ClientがServerに対して適切なリクエスト(ツールの呼び出しやリソースの取得など)を発行します。
Server:データ・機能の提供者
Serverは、実際のデータソースや外部APIとの接続を担うバックエンドプログラムです。本記事の後半で自作するのはこの部分になります。Serverは「自分はどんなデータ(Resource)を提供できるか」「どんな機能(Tool)を実行できるか」をClientに提示し、要求に応じて結果を返します。
【準備編】ハンズオン環境の構築と必要ツールの確認
ここからは、実際にMCPの仕組みを体験するための環境を整えていきます。複雑なインフラ構築は避け、ローカル環境で完結する最小構成を目指します。
推奨環境(Node.js / Python)のセットアップ
多くのMCPサーバーはNode.jsまたはPythonで実装されています。今回のチュートリアルではNode.js環境を使用するため、以下の準備をお願いします。
- Node.js: 最新のLTSバージョン(
npmおよびnpxコマンドが使用できること) - エディタ: お使いのコードエディタ(VS Code等)
ターミナルを開き、以下のコマンドでバージョンが表示されれば準備完了です。
node -v
npx -v
AIクライアント環境の準備と設定ファイルの場所
次に、MCPプロトコルを解釈できるAIクライアント環境を用意します。MCPプロトコルをサポートするAIクライアント(例: Claude Desktopなど)の設定方法は、各ツールの公式ドキュメントで最新情報を確認してください。
多くの場合、これらのクライアントアプリケーションは専用のJSON設定ファイル(例:config.json)を読み込んで外部サーバーを認識します。OSごとの一般的な設定ファイルの配置場所は以下のようになります(※実際のパスは使用するアプリケーションの公式ドキュメントを参照してください)。
- macOS:
~/Library/Application Support/[アプリケーション名]/config.json - Windows:
%APPDATA%\[アプリケーション名]\config.json
この設定ファイルを編集することで、AIに「どのサーバーと通信すべきか」を教えることができます。
【実践1】既存のMCP ServerをAI環境に接続する
最初の成功体験として、既存のオープンソースMCPサーバーを利用し、ローカルのデータベース(SQLite)をAIに読み込ませてみましょう。
SQLite MCP Serverの導入手順
あらかじめ、テスト用のSQLiteデータベースファイル(例:test.db)を作成しておきます。次に、AIクライアントの設定ファイル(config.json等)を開き、以下のようにサーバーの定義を追記します。
MCP対応のSQLiteサーバーパッケージ(例: 公式リポジトリで提供されるもの)をnpxで実行し、AIクライアントの設定ファイルにサーバー定義を追記します。詳細なコマンドと設定形式は各クライアントの公式ドキュメントを参照してください。
設定のポイント:
commandには実行コマンド(ここではnpx)を指定します。argsには、パッケージ名とデータベースファイルへのパスを渡します。- パスは必ず絶対パスで記述してください。相対パスではプロセスが正しくファイルを認識できないケースが報告されています。
AI上で「データベースへの問い合わせ」を試す
設定ファイルを保存した後、AIクライアントアプリケーションを再起動します。再起動後、AIとのチャット画面で以下のように問いかけてみてください。
「現在接続されているデータベースのテーブル一覧を教えてください」
設定が正しく完了していれば、AIは裏側でMCPプロトコル経由でSQLiteサーバーにアクセスし、スキーマ情報を読み取って回答を生成します。さらに、「〇〇テーブルから最新の5件を取得して」といった自然言語でのSQL実行も可能になります。これが、AIと外部データがシームレスに繋がる「魔法のような体験」です。
【実践2】最小構成のMCP Serverを自作してみる(TypeScript/Node.js)
既存のサーバーを使うだけでなく、自社の独自データを扱うためにはサーバーを自作するスキルが求められます。ここではTypeScriptを用いて、最もシンプルな「現在時刻を返すツール」を提供するMCPサーバーを構築します。
MCP SDKのインストール
適当なディレクトリを作成し、プロジェクトを初期化します。
mkdir simple-mcp-server
cd simple-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
npm install -D typescript @types/node
npx tsc --init
ResourceとToolの定義・実装
index.tsというファイルを作成し、以下のコードを記述します。MCPでは、静的なデータを提供する「Resource」と、動的な処理を実行する「Tool」の2つの概念が重要です。今回はAIから呼び出せる「Tool」を定義します。
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
// サーバーの初期化
const server = new Server(
{
name: "simple-time-server",
version: "1.0.0",
},
{
capabilities: {
tools: {}, // ツール機能を有することを宣言
},
}
);
// 利用可能なツールの一覧を定義
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "get_current_time",
description: "サーバーの現在時刻を取得します",
inputSchema: {
type: "object",
properties: {},
required: [],
},
},
],
};
});
// ツールが呼び出された際の実装
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "get_current_time") {
const currentTime = new Date().toISOString();
return {
content: [
{
type: "text",
text: `現在の時刻は ${currentTime} です。`,
},
],
};
}
throw new Error("Unknown tool");
});
// 標準入出力(stdio)を用いたトランスポートの起動
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCP Server running on stdio");
}
main().catch(console.error);
ローカルでの動作確認とデバッグ
コードが書けたらコンパイルし、AIクライアントの設定ファイル(config.json等)に自作サーバーを登録します。
{
"mcpServers": {
"my-time-server": {
"command": "node",
"args": ["/絶対パス/で指定した/simple-mcp-server/dist/index.js"]
}
}
}
クライアントを再起動し、「今の時間を教えて」と質問して正確な時刻が返ってくれば成功です。
本番導入前に知っておくべきトラブルシューティングとセキュリティ
ローカルでの検証は簡単ですが、実際の業務環境に導入する際にはいくつかの壁があります。ここではよくあるつまずきポイントとセキュリティの考え方を整理します。
ログの確認方法とエラーの読み解き方
MCPサーバーの開発中、「AIがサーバーを認識しない」「ツール呼び出しが失敗する」といった課題は珍しくありません。MCPは標準入出力(stdio)を使って通信するため、console.log()で標準出力にログを吐き出すと、JSON-RPCの通信プロトコルを破壊してしまいます。
デバッグ用のログは必ず標準エラー出力(console.error())を使用してください。AIクライアント側にもログファイル(例:mcp.logなど)が生成される仕組みがあるため、通信エラーが発生した場合はまずクライアント側のログを確認して、サーバーが正しく起動しているかを切り分けることが解決の第一歩です。
認証と認可:ローカル実行とリモート実行の境界線
本記事ではローカル環境(stdio)での実行を前提としましたが、企業利用においては「社内サーバーに配置したMCPサーバーにアクセスさせたい」というニーズ(リモート実行・SSE等)が発生します。
外部のAPIキーやデータベースの認証情報を扱う場合、それらの秘匿情報はHost側(AIクライアント)に持たせるのではなく、Server側の環境変数として安全に管理すべきです。また、「AIにどこまでの操作を許可するか(Read-onlyにするか、Writeも許可するか)」という認可の境界線を設計フェーズで明確にしておくことが、セキュリティインシデントを防ぐ鍵となります。
完成:MCPが切り拓く「AIエージェント」の次のステップ
お疲れ様でした。ここまでで、MCPの概念理解から既存サーバーの接続、そして最小構成のサーバー自作までの一連のフローを体験しました。
コミュニティサーバーの活用
今回作成したのはシンプルな時刻取得ツールでしたが、この仕組みを応用すれば、「社内のJiraチケットを検索するツール」や「社内Wiki(ConfluenceやNotion)からドキュメントを読み込むリソース」など、無限の拡張が可能になります。すでにオープンソースコミュニティでは、GitHub、Slack、Google Driveなどと連携するための多様なMCPサーバーが公開されており、これらを組み合わせることで強力なAIエージェントを構築できます。
IDEや社内システムへの展開と導入事例の重要性
MCPの真の価値は、一度構築した連携の仕組みが、対応するあらゆるIDE(統合開発環境)や社内システムで横断的に利用できる点にあります。自社固有のナレッジと最新のAIモデルを標準規格で安全に結びつけることは、業務効率化における強力な競争優位性となります。
「自社の環境にどう適用すべきか」「他の企業はどのような構成で成果を出しているのか」を具体的に検討する段階に入った場合は、実際の導入事例やベストプラクティスを参照することが成功の近道です。先行企業の成功パターンから自社との類似性を見出し、より高度なAI活用への第一歩を踏み出してみてはいかがでしょうか。
コメント