Ollamaを使用したMCPサーバーの構築と活用：詳細ガイド


## はじめに

近年、ローカル環境で動作するLLM（大規模言語モデル）の人気が高まっています。その中でもOllamaは、Llama、Mistral、Gemmaなどの最新モデルを手軽にローカルで実行できるツールとして注目されています。一方、Model Context Protocol（MCP）は、AIモデルが外部ツールやデータと標準化された方法で対話するためのオープンプロトコルです。

この記事では、OllamaとMCPサーバーを組み合わせて、複数のAIモデルを連携させた強力なシステムを構築する方法を詳しく解説します。特に「マルチモデルアドバイザー」と呼ばれる、複数のモデルの視点を一度に得られるMCPサーバーの実装に焦点を当てます。

本記事で解説するマルチモデルアドバイザーMCPサーバーのソースコードは、こちらのGitHubリポジトリで公開されています：[https://github.com/YuChenSSR/multi-ai-advisor-mcp](https://github.com/YuChenSSR/multi-ai-advisor-mcp)

## 1. 前提条件

まずは必要な環境を整えましょう：

- **Node.js** (バージョン16以上)
- **Ollama**（最新版）
- **Git**（リポジトリのクローン用）

### Node.jsのインストール

```bash
# バージョン確認（すでにインストールされている場合）
node -v

# インストールされていない場合は公式サイトからダウンロード
# https://nodejs.org/ja/download/
```

### Ollamaのインストール

```bash
# macOSの場合
brew install ollama

# Linuxの場合
curl -fsSL https://ollama.com/install.sh | sh

# Windowsの場合は公式サイトからインストーラーをダウンロード
# https://ollama.com/download/windows
```

## 2. Ollamaの準備

### Ollamaサーバーの起動

まずOllamaサーバーを起動します：

```bash
ollama serve
```

新しいターミナルを開き、以下のコマンドで必要なモデルをダウンロードします：

```bash
# 小～中規模のモデルを推奨（メモリ消費が少ない）
ollama pull gemma:2b
ollama pull llama3:1b
ollama pull mistral:7b-v0.3
```

利用可能なモデルを確認するには：

```bash
ollama list
```

## 3. MCPサーバーのインストール

マルチモデルアドバイザーMCPサーバーをインストールする方法は2つあります。

### 方法1：Smitheryを使用した自動インストール（推奨）

Smitheryは、MCPサーバーを簡単にインストールするためのツールです：

```bash
# Claude for Desktopユーザー向け
npx -y @smithery/cli install @YuChenSSR/multi-ai-advisor-mcp --client claude

# Anthropicのオンラインモデルユーザー向け
npx -y @smithery/cli install @YuChenSSR/multi-ai-advisor-mcp
```

### 方法2：手動インストール

リポジトリをクローンして手動でセットアップします：

```bash
# リポジトリのクローン
git clone https://github.com/YuChenSSR/multi-ai-advisor-mcp.git
cd multi-ai-advisor-mcp

# 依存関係のインストール
npm install

# プロジェクトのビルド
npm run build
```

## 4. MCPサーバーの設定

### 環境変数の設定

プロジェクトのルートディレクトリに `.env` ファイルを作成し、以下の内容を追加します：

```
# サーバー設定
SERVER_NAME=multi-model-advisor
SERVER_VERSION=1.0.0
DEBUG=true

# Ollama設定
OLLAMA_API_URL=http://localhost:11434
DEFAULT_MODELS=gemma:2b,llama3:1b,mistral:7b-v0.3

# 各モデルのシステムプロンプト（日本語）
GEMMA_SYSTEM_PROMPT=あなたは創造的で革新的なAIアシスタントです。常識にとらわれず、斬新な視点を提供してください。
LLAMA_SYSTEM_PROMPT=あなたは思いやりがあり共感力の高いAIアシスタントです。人間の幸福に焦点を当て、バランスの取れたアドバイスを提供します。
MISTRAL_SYSTEM_PROMPT=あなたは論理的で分析的なAIアシスタントです。ステップバイステップで考え、推論プロセスを明確に説明してください。
```

各モデルに異なる「役割」を設定することで、多様な視点を得ることができます。

## 5. MCPサーバーの起動

### ターミナルからの起動

```bash
# ビルド済みのサーバーを起動
node build/index.js
```

サーバーが正常に起動すると、以下のようなメッセージが表示されます：

```
Multi-Model Advisor MCP Server running on stdio
Using Ollama API URL: http://localhost:11434
Default models: gemma:2b,llama3:1b,mistral:7b-v0.3
Debug mode enabled
```

## 6. MCP対応クライアントとの連携

### Claude for Desktopとの連携

Claude for Desktop（Anthropicのデスクトップアプリ）を使用している場合：

1. Claude for Desktopの設定ファイルを探します：
   - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
   - Windows: `%APPDATA%\Claude\claude_desktop_config.json`

2. ファイルを編集してMCPサーバーを追加します：

```json
{
  "mcpServers": {
    "multi-model-advisor": {
      "command": "node",
      "args": ["/絶対パス/multi-ai-advisor-mcp/build/index.js"]
    }
  }
}
```

`/絶対パス/` を実際のプロジェクトディレクトリへのパスに置き換えてください。例：`/Users/username/projects/multi-ai-advisor-mcp/build/index.js`

3. Claude for Desktopを再起動します。

### VSCodeとの連携

VSCodeでMCPサーバーを利用する場合：

1. VSCodeのワークスペースに `.vscode/mcp.json` ファイルを作成します：

```json
{
  "servers": {
    "multi-model-advisor": {
      "type": "stdio",
      "command": "node",
      "args": ["/絶対パス/multi-ai-advisor-mcp/build/index.js"]
    }
  }
}
```

2. VSCodeを再起動します。

## 7. マルチモデルアドバイザーの使い方

### 利用可能なモデルの確認

Claude（または他のMCP対応クライアント）に以下のように質問します：

```
Ollamaで利用可能なモデルを教えてください
```

Claudeは `list-available-models` ツールを呼び出し、システムにインストールされているすべてのOllamaモデルとその詳細情報（パラメータサイズ、量子化レベルなど）を表示します。

### 複数モデルへのクエリ

以下のような形式でマルチモデルアドバイザーを利用します：

```
気候変動問題に対して個人ができることは何ですか？gemma:2b、llama3:1b、mistral:7b-v0.3を使用して回答してください。
```

すると、各モデルが異なる視点から回答し、Claudeがそれらを統合した包括的な回答を提供します。

### カスタムモデルセットの指定

デフォルトモデル以外を使用したい場合は、明示的に指定できます：

```
人工知能の倫理的課題について、phi:3b、mistral:7b-v0.3の視点を教えてください。
```

### 実行例

以下は、実際の実行例です：

#### 質問：
```
プログラミング初心者が最初に学ぶべき言語は何ですか？gemma:2b、llama3:1b、mistral:7b-v0.3の視点で教えてください。
```

#### 回答：
```
# 複数モデルからの回答

## GEMMA:2B の回答:
初心者には間違いなくPythonがおすすめです！シンプルな構文で読みやすく、幅広い用途に使えます。データ分析、ウェブ開発、AI、ゲーム開発など多くの分野で活用できます。また、大きなコミュニティがあるため、質問への回答やチュートリアルが豊富です。

## LLAMA3:1B の回答:
プログラミング初心者にとって最適な言語はPythonです。理由は：
1. 読みやすく書きやすい構文
2. 広範なライブラリとフレームワーク
3. 活発なコミュニティと豊富な学習リソース
4. データ分析、ウェブ開発、AI/ML、自動化など多様な用途に対応

JavaScript（ウェブ開発）やScratch（視覚的プログラミング）も初心者に優しい選択肢です。あなたの目標や興味に合わせて選びましょう。

## MISTRAL:7B-V0.3 の回答:
プログラミング初心者には、以下の理由からPythonが最適です：

1. 読みやすい構文 - 英語に近い文法で、セミコロンや波括弧が不要
2. 幅広い応用範囲 - ウェブ開発、データ分析、AI、自動化など多くの分野で利用可能
3. 豊富な学習リソース - 無料のチュートリアル、コース、書籍が多数存在
4. 強力なコミュニティ - 質問への回答を得やすい
5. 即時フィードバック - インタラクティブシェルで結果をすぐに確認できる

他の選択肢としては：
- JavaScript（ウェブ開発志向の場合）
- Scratch（視覚的プログラミングを好む場合）
- Ruby（読みやすさと生産性重視）

最終的には、あなたの目標に最も適した言語を選ぶことが重要です。
```

## 8. MCPサーバーのカスタマイズ

独自のMCPサーバーを作成したい場合、以下の手順で実装できます：

### 基本的なプロジェクト構造の作成

```bash
# ディレクトリ作成
mkdir my-ollama-mcp
cd my-ollama-mcp

# npm初期化
npm init -y

# TypeScript設定
npm install --save-dev typescript @types/node
npx tsc --init

# MCPライブラリのインストール
npm install @modelcontextprotocol/server node-fetch dotenv zod
npm install --save-dev @types/node-fetch
```

### 基本的なMCPサーバーの実装

`src/index.ts` ファイルを作成し、以下のコードを記述します：

```typescript
import { McpServer } from "@modelcontextprotocol/server";
import { StdioServerTransport } from "@modelcontextprotocol/server";
import { z } from "zod";
import fetch from "node-fetch";
import * as dotenv from 'dotenv';

// 環境変数のロード
dotenv.config();

// Ollama API URL
const OLLAMA_API_URL = process.env.OLLAMA_API_URL || "http://localhost:11434";

// サーバーインスタンスの作成
const server = new McpServer({
  name: "my-ollama-server",
  version: "1.0.0",
});

// 利用可能なモデルを一覧表示するツール
server.tool(
  "list-models",
  "Ollamaで利用可能なモデル一覧を表示",
  {},
  async () => {
    try {
      const response = await fetch(`${OLLAMA_API_URL}/api/tags`);
      
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      
      const data = await response.json() as { models: any[] };
      
      const modelInfo = data.models.map(model => {
        return `- ${model.name}`;
      }).join("\n");
      
      return {
        content: [{
          type: "text",
          text: `# Ollamaで利用可能なモデル\n\n${modelInfo}`
        }]
      };
    } catch (error) {
      return {
        isError: true,
        content: [{
          type: "text",
          text: `エラー: ${error instanceof Error ? error.message : String(error)}`
        }]
      };
    }
  }
);

// モデルにクエリを送信するツール
server.tool(
  "query-model",
  "指定したモデルに質問を送信",
  {
    model: z.string().describe("使用するモデル名"),
    prompt: z.string().describe("モデルへの質問"),
  },
  async ({ model, prompt }) => {
    try {
      const response = await fetch(`${OLLAMA_API_URL}/api/generate`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          model: model,
          prompt: prompt,
          stream: false,
        }),
      });
      
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      
      const data = await response.json();
      
      return {
        content: [{
          type: "text",
          text: data.response
        }]
      };
    } catch (error) {
      return {
        isError: true,
        content: [{
          type: "text",
          text: `エラー: ${error instanceof Error ? error.message : String(error)}`
        }]
      };
    }
  }
);

// サーバー起動
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Ollama MCP サーバー起動中");
}

main().catch((error) => {
  console.error("エラー:", error);
  process.exit(1);
});
```

### ビルドと実行

```bash
# TypeScriptのコンパイル設定
npx tsc --init

# コンパイル
npx tsc

# 実行
node build/index.js
```

## 9. トラブルシューティング

### Ollamaの接続エラー

**問題**: `Error: fetch failed` や接続エラーが発生する

**解決策**:
- Ollamaが起動しているか確認: `ollama serve`
- APIのURLが正しいか確認: `http://localhost:11434`
- ファイアウォールやネットワーク設定を確認

### メモリ不足エラー

**問題**: 大きなモデルを使用時にメモリ不足エラーが発生

**解決策**:
- より小さなモデルを使用: `llama3:1b` など
- メモリを増設
- 同時に実行するモデル数を減らす

### モデルが見つからないエラー

**問題**: `model 'xxx' not found` エラーが発生

**解決策**:
- 正しいモデル名でpull: `ollama pull xxx`
- `ollama list` で利用可能なモデルを確認
- モデル名の大文字小文字やバージョンが正しいか確認

## 10. まとめ

OllamaとMCPを組み合わせることで、ローカル環境で動作する強力なAIシステムを構築できます。マルチモデルアドバイザーを使用することで、複数のAIモデルからの視点を一度に得ることができ、より包括的な回答や多様な観点を入手できます。

このアプローチにより、ローカルLLMの利点（プライバシー、コスト、カスタマイズ性）を活かしつつ、複数モデルの知見を組み合わせた高度なAI体験が実現できます。

MCPの標準化されたインターフェースは、AIモデル間の相互運用性を高め、複雑なAIアプリケーションの開発をシンプルにします。今後もOllamaやMCPエコシステムは進化を続けるでしょうから、最新の開発動向にも注目していきましょう。

OllamaとMCPサーバーを使った実験を通じて、AIの可能性をさらに広げてください。複数の視点からの回答を得ることで、より深い洞察と革新的なアイデアを発見できるかもしれません。

---

参考リンク：
- [Ollama公式サイト](https://ollama.com)
- [Model Context Protocol (MCP)公式ドキュメント](https://context.ai/)
- [マルチモデルアドバイザーMCP GitHubリポジトリ](https://github.com/YuChenSSR/multi-ai-advisor-mcp)