【Ollama】MCP対応Tool Calling設定ガイド

1. 問題の概要

OllamaでローカルLLMを実行している際、外部ツール(天気情報、ファイル検索、計算など)を活用した高度なAIエージェントを作成したい場合があります。しかし、単純なAPI呼び出しだけでは、モデルが適切なタイミングでツールを呼び出し、その結果を会話に組み込む「Tool Calling」機能を実装するのは困難です。特に、複数のツールを統合管理するMCP(Model Context Protocol)サーバーと連携させる際、以下のような問題が発生します:

  • モデルがツールを認識せず、通常の応答のみを返す
  • MCPサーバーからのツール定義をOllamaモデルに正しく渡せない
  • ストリーミング応答時にツール呼び出しが不安定になる
  • 複数のMCPサーバーを同時に利用する設定が複雑

2. 結論

OllamaのTool Calling機能をMCPサーバーと連携させるには、以下の3つの方法があります:

  1. Ollama公式APItoolsパラメータにMCPサーバーから取得したツール定義を直接渡す
  2. jonigl-mcp-client-for-ollama:専用のMCPクライアントを使用してOllamaとMCPサーバーを橋渡しする
  3. OpenAI互換ブリッジ:ポート11435を経由してOpenAI形式でツール呼び出しを行う

特に、Llama3.2/3.3やQwen2.5/3シリーズなどの対応モデルでは、MCP連携により天気取得、ファイル操作、Web検索などの外部ツールを活用したエージェント構築が可能になります。

3. 具体的な手順

3.1 前提条件の確認

まず、Ollamaがインストールされ、Tool Callingに対応したモデルが利用可能か確認します。

# Ollamaのインストール確認
ollama --version

# Tool Calling対応モデルのプル(例:Llama3.2)
ollama pull llama3.2:3b

# またはQwen2.5
ollama pull qwen2.5:7b

3.2 方法1:Ollama公式APIを使用した基本設定

Pythonスクリプトから直接Ollama APIを呼び出し、ツール定義を渡す方法です。

import ollama

# ツール定義(MCPサーバーから取得した形式)
tools = [{
    'type': 'function',
    'function': {
        'name': 'get_current_weather',
        'description': 'Get the current weather for a city',
        'parameters': {
            'type': 'object',
            'properties': {
                'city': {
                    'type': 'string',
                    'description': 'The name of the city',
                },
            },
            'required': ['city'],
        },
    },
}]

# Tool Callingの実行
response = ollama.chat(
    model='llama3.2',
    messages=[
        {'role': 'user', 'content': 'What is the weather in Tokyo?'}
    ],
    tools=tools,
    stream=False
)

# ツール呼び出しの確認
if 'tool_calls' in response['message']:
    print(f"Tool called: {response['message']['tool_calls']}")

3.3 方法2:jonigl-mcp-client-for-ollamaを使用したMCP連携

専用のMCPクライアントを使用すると、複数のMCPサーバーを簡単に管理できます。

# jonigl-mcp-client-for-ollamaのインストール
pip install ollmcp

# 単一のMCPサーバーに接続
ollmcp --mcp-server /path/to/weather.py --model llama3.2:3b

# 複数のMCPサーバーに接続
ollmcp 
  --mcp-server /path/to/weather.py 
  --mcp-server /path/to/file_search.py 
  --model qwen2.5:7b 
  --host http://localhost:11434

3.4 方法3:FastMCPを使用した高度な連携

FastMCPライブラリを使用して、非同期でMCPサーバーと連携する例です。

# client_ollama.py
import json
import ollama
from fastmcp import Client as MCPClient
import asyncio

# 設定
OLLAMA_MODEL = "llama3.2"
MCP_SERVER_URL = "http://127.0.0.1:8080/mcp"

async def load_mcp_tools():
    """MCPサーバーから利用可能なツールを取得"""
    try:
        async with MCPClient(MCP_SERVER_URL) as mcp:
            tools_list = await mcp.list_tools()
            # MCP形式からOllama形式に変換
            ollama_tools = []
            for tool in tools_list:
                ollama_tools.append({
                    'type': 'function',
                    'function': {
                        'name': tool['name'],
                        'description': tool['description'],
                        'parameters': tool['parameters']
                    }
                })
            return ollama_tools
    except Exception as e:
        print(f"MCPサーバー接続エラー: {e}")
        return []

async def main():
    # MCPツールをロード
    tools = await load_mcp_tools()
    
    if tools:
        # OllamaでTool Callingを実行
        response = ollama.chat(
            model=OLLAMA_MODEL,
            messages=[
                {'role': 'user', 'content': '東京の天気と、ドキュメントフォルダ内のテキストファイルを検索して'}
            ],
            tools=tools,
            stream=False
        )
        print(json.dumps(response, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    asyncio.run(main())

4. よくある関連エラーと対処法

4.1 モデルがツールを呼び出さない

問題:ツール定義を渡しているのに、モデルが通常の応答のみを返す。
解決策

  • モデルがTool Callingに対応しているか確認(Llama3.x, Qwen2.5/3, DeepSeekなど)
  • ツール定義の形式が正しいか確認(type, function, parametersの構造)
  • 「respond」ツールを追加して、モデルに完了の合図を与える(Redditコミュニティで報告されている改善策)

4.2 ストリーミング時の不具合

問題stream=True設定時にツール呼び出しが不安定になる。
解決策

  • ストリーミングを無効にしてテスト(stream=False
  • OpenAI互換ブリッジを使用し、ポート11435経由で接続
  • ツール呼び出し専用の非ストリーミングエンドポイントを別途用意

4.3 MCPサーバー接続エラー

問題:MCPサーバーに接続できない、またはツールリストを取得できない。
解決策

  • MCPサーバーが正しく起動しているか確認(python weather.pyなど)
  • ポート番号とURLが正しいか確認(通常はhttp://127.0.0.1:8080/mcp
  • ファイアウォールやネットワーク設定を確認

4.4 ツール実行結果の統合問題

問題:ツールを呼び出したが、結果を会話にうまく組み込めない。
解決策

# ツール実行結果を会話に追加する例
messages = [
    {'role': 'user', 'content': 'What is the temperature in New York?'},
    {
        'role': 'assistant',
        'tool_calls': [{
            'type': 'function',
            'function': {
                'index': 0,
                'name': 'get_temperature',
                'arguments': {'city': 'New York'}
            }
        }]
    },
    {'role': 'tool', 'tool_name': 'get_temperature', 'content': '22°C'}
]

# 続きの会話で結果を参照
response = ollama.chat(
    model='qwen3',
    messages=messages,
    stream=False
)

5. AIを快適に動かすためのおすすめ環境

ローカルLLMや画像生成AIでエラーを減らし、高速に処理するには、VRAM容量が最も重要です。

6. まとめ

OllamaでのMCP対応Tool Calling設定は、以下のポイントを押さえることで確実に動作します:

  1. 対応モデルの選択:Llama3.2/3.3、Qwen2.5/3、DeepSeekなどTool Callingをサポートしたモデルを使用
  2. 適切な連携方法の選択
    • シンプルな連携:Ollama公式API + toolsパラメータ
    • 複数MCPサーバー:jonigl-mcp-client-for-ollama
    • 高度な制御:FastMCP + 非同期処理
  3. ツール定義の形式変換:MCPサーバーからのツール定義をOllama形式に正しく変換
  4. エラーハンドリング:ストリーミング問題には非ストリーミングモードやOpenAIブリッジを検討

MCPサーバーとOllamaを連携させることで、天気情報の取得、ファイル検索、データベース操作など、多様な外部ツールを活用した高度なAIエージェントをローカル環境で構築できます。特に、複数の専門ツールを組み合わせることで、単一のLLMでは実現できない複雑なタスクを自動化することが可能になります。

🔧 快適な開発環境のために

本記事の手順をスムーズに進めるために、以下のスペックを推奨します。

この記事は役に立ちましたか?