QGIS・Claude・MCPで誰でも簡単に自然言語で地理情報解析ができる！！！

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/aa4be915-5a82-4c6e-a96e-35c73eaa4e67.gif)

こんにちは！

最近、**AIエージェント**の活用が**GIS（地理空間情報）界隈**でもかなり注目されていて、僕もCursorやらClineやら色々使ってみていますが、今回は**Claude**の話です！！

最近、「Claude Desktop」と**MCP（Model Control Protocol）**、そしてBlenderを連携させて、自然言語でモデルを作っていた人がいて、めちゃバズってましたね。

https://x.com/Shimayus/status/1900740735609225651

我々のようなエンジニアだと自然言語で「ソースコードを操作する」のは見慣れたもんかと思うんですが、GUIのソフトウェアをここまでしっかり操作できるようになるのは衝撃でしたねー。

というのを見ていて「**これならQGISもいけるんじゃね！？！？**」って思ったらそこそこいけたのでその辺りを紹介していきます！

## MCPって？

MCPは「Model Control Protocol」の略で、AIモデル（例えばClaude 3.7 Sonnet）とデスクトップアプリケーションを連携させるためのプロトコルです。

- [Model Context Protocol (MCP)](https://docs.anthropic.com/en/docs/agents-and-tools/mcp)

「MCPはAIアプリケーション向けの「USB-C」のような役割を果たします」といった説明がされており、周辺ツールとの標準的な接続方法を提供されています。

### MCPの主な特徴

公式サイト（[Why MCP?](https://modelcontextprotocol.io/introduction#why-mcp%3F)）には以下のようなことが書かれています。

- LLMが直接活用できる、充実した事前構築済み連携機能のコレクション
- 異なるLLMプロバイダーやベンダー間を柔軟に切り替えられる機能
- ユーザー自身のインフラ内でデータを安全に保護するためのベストプラクティス

実際、公式が公開している[Model Context Protocol servers](https://github.com/modelcontextprotocol/servers)には色々なMCPサーバーがありますし、仕様がオープンなため自作することもできます。コミュニティ隈も盛り上がっていますねー！

### MCPのアーキテクチャ

MCPは基本的にクライアント - サーバーアーキテクチャに従っており、主要なコンポーネントは以下の通りです：

1. **MCP ホスト**：Claude Desktop、IDE、AIツールなど、MCPを通じてデータにアクセスしたいプログラム。
1. **MCP クライアント**：サーバーとの1:1の接続を維持するプロトコルクライアント。
1. **MCP サーバー**：Model Context Protocolを通じて特定の機能を提供する軽量プログラム。
1. **ローカルデータソース**：MCPサーバーが安全にアクセスできるコンピューターのファイル、データベース、サービス。
1. **リモートサービス**：MCPサーバーが接続できるインターネット上の外部システム（APIなど）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/44bfeac4-e294-4a63-aa8b-498f1f0d2c25.png)
（[General architecture](https://modelcontextprotocol.io/introduction#general-architecture)）

## QGISって？GISって？

**GIS（Geographic Information System）**とは「**地理空間情報**」を取り扱うためのソフトウェアです。
建物・道路・川など地球上には様々な情報が溢れていますが、コンピュータ上でそれらを組み合わせたり、分析を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/200c944c-b0f6-4473-8309-ef6023ee6e56.png)
（[PLATEAU TOPIC 1｜3D都市モデルでできること[1/2]｜デジタル地図とGIS](https://www.mlit.go.jp/plateau/learning/tpc01-1/)）

**[QGIS](https://www.qgis.org/)は、オープンソースのデスクトップGIS**です。
位置情報データの作成、編集、分析、可視化などを行うための多数の機能を備えており、誰でも自由にインストール・利用できます。
Windows、Mac、LinuxといったさまざまなOSで利用することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/f3ccd34a-d198-4a95-a1db-6cf4ffa61818.png)

詳しくは[誰でも自由に使えるGISソフトウェア「QGIS」の特徴や魅力をご紹介](https://qgis.mierune.co.jp/posts/howto_1_about_qgis)などをご覧ください！

## QGISとMCP

アーキテクチャの説明にもある通り、MCPでの通信にはサーバーとクライアントが必要です。

幸いにも、[qgis_mcp](https://github.com/jjsantos01/qgis_mcp)というQGISプラグイン（MCPサーバー）が存在したので、今回はこちらを利用させていただきます！

以下のような手順で、QGISの操作が実行されます。

1. QGISプラグインをQGISにインストールする
    - これがMCPサーバーの役割を果たします
1. プラグインを実行する
    - MCPサーバーが9876ポートで立ち上がる
1. Claude Desktopの設定を行い、クライアントからコマンドが実行されるようにする
1. Claude Desktop（MCPクライアント）から「**今ひらいてる〇〇レイヤの色を変えて**」みたいなプロンプトを入力する
1. クライアントは、MCPサーバーへのリクエストが必要か判断する
1. 必要なコマンドが選定され、`send_command()`メソッドを通じてMCPサーバーにリクエストが送られる
1. MCPサーバーはコマンドを受け取り、実行する

ではやってみましょう！

## QGIS + Claude + MCPのセットアップ

今回のセットアップには以下のものを使用しました！

- macOS Sonoma 14.4.1
- QGIS 3.42.0-Münster
- Claude for Mac 0.8.1

各種ソフトウェアのインストールなどの手順は省きます！

セットアップの手順は以下の通りです：

### QGISプラグインのインストール

基本的には[README](https://github.com/jjsantos01/qgis_mcp)に従います。

まずはPythonのパッケージマネージャーなどの機能を持つ`uv`をインストールしましょう。
（macOS以外の方は適宜読み替えてください。）

```bash
brew install uv
```

インストール後リポジトリをクローンするなり、zipでダウンロードするなりして、とにかくローカルに落としてきます。

フォルダの中に`qgis_mcp_plugin`というフォルダがあるので、これをzip圧縮します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/4d24686b-7028-4a41-b859-0b7862bafea9.png)

QGISを起動すると最上段に「プラグイン」メニューがあるので「プラグインの管理とインストール」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/f961b727-ebf7-47bb-a24a-1c6dfa004721.png)

「ZIPからインストール」を選択し、先ほど圧縮したzipファイルを選択して「インストール」しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/aaf41198-541b-400c-add8-826248fb528f.png)

そうすると、プラグインの一覧で「MCP」などで検索をかけるとインストールしたプラグインが出てくるので、チェックしておきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/e606fd84-8fcf-4f3b-8c5e-fb498f41700e.png)

すると、わかりづらいですが、「QGIS MCP」と記載されたボタンが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/dd9c770d-82a6-4e72-8877-96253a981ff9.png)


ボタンを押すとサーバーが起動します。起動すると、ステータスバーに「Server: Running on port 9876」というメッセージが表示されます。これでQGIS側のMCPサーバーが稼働した状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/60d752b5-3595-4d80-a09e-1b74d2f6202d.png)

### Claude Desktopの設定

Claude for Macを起動し、メニューバーからClaudeアイコンをクリックして「設定」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/d5ba536f-ea39-4dc7-9d72-2e17655fefa0.png)

「開発者」タブを選択し、「設定を編集」をクリックします。
するとFinderなどが開き、「claude_desktop_config.json」がハイライトされると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/25bbc602-bfcc-40f4-adbd-f26bfb0fa71b.png)

JSONファイルを開き、以下のように追加します。


```json
{
	"mcpServers": {
		"qgis": {
			"command": "uv",
			"args": [
				"--directory",
				"/<PATH_TO_YOUR_DIRECTORY>/qgis_mcp/src/qgis_mcp",
				"run",
				"qgis_mcp_server.py"
			]
		}
	}
}
```

※（`args`は絶対パスじゃないと動作しないケースが多いので、絶対パスを指定しておきましょう。自分でデバッグできる方はこの限りではありません。）

設定を保存し、Claude Desktopを再起動します。

チャット欄のトンカチマークをクリックしたときに、利用可能なMCPツールが増えていれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/79cbe4fb-8d22-4b6a-b9b0-d1b178ecd851.png)

これだけの設定で、Claude Desktopから自然言語でQGISを操作することができるようになりました！！！

## 日本語でQGISを操作してる

まず、Claudeからこんな指示を出してみました。

```
「ランダムポイント」という名称のポイントレイヤーを作成し、キャンバス内に100個ほどポイントを生成してください。
```

MCPによる通信を実行しますかてきな内容を聞かれますが、全て許可。

色々なクライアントのコマンドを実行していき、たまにエラーが出ると勝手に修正したりします。

最終的に、このような出力をしてくれました！！
また、QGISの方もちゃんと「ランダムポイント」レイヤーが作成されていますね！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/c6d90ef4-6a29-4cdc-a83a-2bc391b36b16.png)

ちょっとみづらいのでポイントの色を変えてみましょう。

```
生成したポイントのスタイルを、緑色にしてください。
```

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/7ae250a9-3b4c-4991-a989-c1dd72ca680c.png)

いい感じですねー！！

最後に、ちょっとGISっぽく以下のように投げてみました。

```
ポイントに対して10mのバッファを発生させてください。
```

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/f8344d6e-dde4-44cc-9333-a74b29b0482c.png)

ちゃんと、ポイントに対して10mのバッファポリゴンが生成されてました！！！

とてもいい感じですね！！！

## 今後の展望

ということでMCPを利用して日本語でQGISを操作するということをやってみましたが、当然課題もありそうでした。

例えば
```
「ランダムポイント」レイヤのid=26から最近傍のポイントを抽出し、そのポイントのidを教えてください。
```
のようなプロンプトを投げると、実行するコマンドがずっとエラーを返し、最終的には文字数オーバーで落ちてしまったりしました。

ただ、この辺りについてClaudeにPyQGISの知識が足りない、QGISのプロセッシングの知識が足りない、というだけなので、今後どうとでもなっていきそうな気がします。
（QGISのPython APIであるPyQGISを生成し、実行しにいっているようでした。）

今までは専門的な知識を持った人しか利用できなかったGIS・地理空間情報ですが、自然言語で簡単に分析の指示が出せるようになると、できることがものすごく広がりそうです！！！

僕らとしても、もっともっと利用のハードルを下げるためにプラグインの整備などなどやっていきたいなーと思いました！！