コンテンツにスキップ

MCPサーバーを作成する

MCPサーバーを作って、ローカルLLM環境からMCPサーバーを呼び出してみる。

この長大なシステムを構築すると、以下の流れで1+1の結果を知ることができる。

MCPサーバーとは

Introduction - Model Context Protocol

MCP(Model Context Protocol) はLLMとツールをつなぐプロトコルである。

MCPサーバーはLLMの手足になる。

今回は整数と整数の足し算を行って返事するMCPサーバーを作成する。

Clineとは

GitHub - cline/cline: Autonomous coding agent right in your IDE, capable of creating/editing files, executing commands, using the browser, and more with your permission every step of the way.

ClineとはAIエージェントである。VSCode向けの拡張機能として提供されており、Ollamaと簡単に連携できる。

ローカルLLM環境を構築する

LLM環境がない場合、以下の記事でローカルLLM環境を構築することができる。

ローカルLLM環境を構築する

OllamaにGemma 3をインストールする

今回はLLMにgemma3:27bを使うことにする。

docker-compose.ymlのあるディレクトリ上で、以下のコマンドを実行する。

1
2
3
4
$ docker exec -it ollama ollama run gemma3:27b

# 終わったら以下を入力してプロンプトを抜ける
>>> /bye

大容量のダウンロードになるので注意する。(17GBらしい)

VSCodeにClineをインストールする

VSCodeの拡張機能のペインからClineを検索し、インストールする。

MCPサーバーを作成する

PythonでMCPサーバーを作成する。

1
2
.
└── server.py

FastMCPというパッケージを使うと簡単にMCPサーバーを作成できる。

GitHub - jlowin/fastmcp: 🚀 The fast, Pythonic way to build MCP servers and clients

Pythonの仮想環境を作成し、FastMCPをインストールする。

1
2
3
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install fastmcp

server.pyにMCPサーバーとしてのコードを書く。

server.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from typing import Annotated

from fastmcp import FastMCP
from pydantic import Field

mcp = FastMCP("Example MCP Server")


@mcp.tool
def sum(
    a: Annotated[int, Field(description="整数")],
    b: Annotated[int, Field(description="整数")],
) -> int:
    return a + b


if __name__ == "__main__":
    mcp.run(transport="http", host="0.0.0.0", port=8000, path="/mcp")

コードを書き終えたら以下のコマンドを実行して、サーバーを起動する。

1
$ python server.py

MCPサーバーを登録する

Clineの拡張機能からMCPサーバーを登録する。

以下のようにVSCodeのClineのペインを選択し、Settingsを選択する。

以下のように API Configurationで設定を行う。

API ProviderOllamaModelにGemma 3を指定し、Doneのボタンを押下する。

もし日本語が好きなら、以下のようにGeneral SettingsにあるPreferred LanguageからJapanese - 日本語を設定することができる。

Note

ただし設定しても無視されることがある。

以下のように MCP Serversを選択し、Installedタブを選択する。

以下のようにConfigure MCP Serversを選択し、JSONを記述する。

cline_mcp_settings.json
1
2
3
4
5
6
7
8
{
  "mcpServers": {
    "example_mcp_server": {
      "url": "http://127.0.0.1:8000/mcp",
      "type": "streamableHttp"
    }
  }
}

LLMに1+1を計算させる

準備が整ったので、Clineの対話画面から以下のように指示を出す。

以下のようにLLMの返答を確認し、問題なさそうであればApproveを選択する。

結果を確認する。

なんと1+1は2という結果を得ることができた。

学び

大切なのは1+1の結果ではなく、MCPサーバーを用意してLLMに好きなものを生やせるということである。

1+1を計算する処理を書き換えれば対話でデータベースを更新するとか、バグを報告するとか、モーターを動かすとか、何でもできるのだ。

既にすごい人たちによって色んなMCPサーバーが開発されているから、それらを利用することもできる。

メモ

cline_mcp_settings.jsonの書き方は情報が少ないように感じた。

Cline公式のドキュメントから 今回使ったMCPサーバーへの転送プロトコルであるStreamable HTTPに関して説明を見つけることができなかった。

MCPサーバーの設定については以下のページで説明されているが、載っているのは標準入出力を使ってローカルで転送するSTDIOとHTTPでネットワーク越しに転送できるが古い方式のSSEだけである。

Configuring MCP Servers - Cline

しかし以下のIssueによると、ClineはStreamable HTTPに対応しているようである。

Cline does not work with StreamableHttpTransport based MCP servers · Issue #3315 · cline/cline

メモ2

前回の記事でインストールしたgpt-oss:20bを使おうとしてもUnexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output.というエラーが出るので、今回はgemma3:27bをインストールすることにした。