MCP(Model Context Protocol)は、Anthropic社が2024年11月に発表し、オープンソース化したプロトコルです。大規模言語モデル(LLM)が外部のツールやデータソースと直接やり取りできるよう設計されています。MCPを使えば、ユーザーがLLMの出力をコピー&ペーストして手動で実行する必要はなく、LLMからツールへ直接指示を送り、そのままアクションを実行させることが可能になります。
OceanBase MCP Serverは、MCPプロトコルを介して大規模言語モデルとOceanBaseデータベースを連携させ、SQL文の実行を可能にするサーバーです。GitHubでオープンソースとして公開されており、対応するクライアントを利用すれば、プロジェクトのプロトタイプを素早く構築できます。
Clineは、MCPプロトコルに対応したオープンソースのAIコーディングアシスタントです。
本記事では、ClineとOceanBase MCP Serverを組み合わせ、バックエンドアプリケーションを迅速に構築する手順を紹介します。
前提条件
OceanBaseデータベースのデプロイが完了し、MySQLモードのユーザーテナントが作成されていること。テナント作成の詳細については、テナントの作成を参照してください。
Python 3.11以降のバージョンと対応するpipをインストールします。お使いのマシンにインストールされているPythonのバージョンが古い場合は、Minicondaを使用してPython 3.11以降の新しい環境を作成することができます。詳細はMinicondaインストールガイドを参照してください。
お使いのオペレーティングシステムに応じて、Gitをインストールします。
Pythonパッケージマネージャーのuvをインストールします。インストール完了後、
uv --versionコマンドでインストールが成功したかを確認できます。pip install uv uv --versionClineをインストールします。
Visual Studio Code IDEをご利用の場合、拡張機能で
Clineプラグインを検索してインストールします。インストールが完了したら、設定アイコンをクリックし、Clineに大規模言語モデルのAPIを設定してください。IDEをご利用でない場合は、Clineインストールガイドを参考に、Cline公式サイトからダウンロードしてください。
ステップ1:データベース接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者に連絡し、対応するデータベース接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータの説明:
$host:OceanBaseデータベースへの接続IPアドレスです。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)経由で接続する場合はODPのアドレスを、直接接続する場合はOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースの接続ポートです。ODP経由の接続ではデフォルトで2883が使用されますが、ODPのデプロイ時にカスタマイズ可能です。直接接続の場合はデフォルトで2881が使用され、OceanBaseデータベースのデプロイ時にカスタマイズできます。$database_name:アクセスするデータベースの名前です。注意
テナントに接続するユーザーは、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントへの接続アカウントです。ODP経由で接続する場合の一般的な形式はユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続の場合はユーザー名@テナント名となります。$password:アカウントのパスワードです。
接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
ステップ2:OceanBase MCP Serverを設定する
ここでは、Visual Studio Codeを使用する場合を例に、OceanBase MCP Serverの設定方法を説明します。
OceanBase MCP Serverリポジトリのクローン
下記のコマンドを実行して、ソースコードをローカルにダウンロードします。
git clone https://github.com/oceanbase/mcp-oceanbase.git
ソースコードのディレクトリに移動します。
cd mcp-oceanbase
依存関係のインストール
mcp-oceanbaseディレクトリで下記のコマンドを実行して仮想環境を作成し、依存関係をインストールします。
uv venv
source .venv/bin/activate
uv pip install .
Visual Studio Codeの作業ディレクトリを作成
ローカルにVisual Studio Codeの作業ディレクトリを手動で作成し、Visual Studio Codeで開きます。今後Clineが生成するファイルはこのディレクトリに配置されます。
ClineプラグインでOceanBase MCP Serverを設定する
サイドバーにあるClineのアイコンをクリックして、Clineのダイアログボックスを開きます。
MCP Serversの追加と設定
MCP Serversのアイコンをクリックします。OceanBase MCP Serverを手動で設定します。
設定ファイルに情報を入力します。
前のステップで開いた
cline_mcp_settings.jsonファイルに、以下の設定情報を入力し、ファイルを保存します。/path/to/your/mcp-oceanbase/src/oceanbase_mcp_serverフォルダの絶対パスに、OB_HOST、OB_PORT、OB_USER、OB_PASSWORD、OB_DATABASEをご自身のデータベースの対応する情報に置き換える必要があります。設定ファイルの例は以下の通りです。
{ "mcpServers": { "oceanbase": { "command": "uv", "args": [ "--directory", "/path/to/your/mcp-oceanbase/src/oceanbase_mcp_server", "run", "oceanbase_mcp_server" ], "env": { "OB_HOST": "***", "OB_PORT": "***", "OB_USER": "***", "OB_PASSWORD": "***", "OB_DATABASE": "***" } } } }設定が成功すると、
使用可能のステータスが表示され、MCP toolsとresourcesの情報が表示されます。トグルスイッチをクリックして、Clineで利用できるようにします。
MCP Serverのテスト
Clineダイアログボックスに、次のプロンプトを入力します:testデータベースにはいくつのテーブルがありますか?。Clineクライアントが実行予定のSQL文を表示します。内容を確認し、問題がなければ実行ボタンをクリックします。
Clineに現在のtestデータベース内のテーブル名が表示されれば、OceanBaseデータベースに正常に接続できていることを示します。
FastAPIを使用してRESTful APIスタイルのプロジェクトを迅速に作成する
FastAPIは、PythonでRESTful APIを迅速に構築できるWebフレームワークです。ここでは、customerテーブルを作成し、テストデータを挿入したうえで、FastAPIプロジェクトを自動生成します。
customerテーブルの作成
ダイアログボックスに次のプロンプトを入力します:
customerテーブルを作成してください。主キーはIDで、name、age、telephone、locationの各フィールドを含めてください。SQL文を確認し、問題がなければ実行ボタンをクリックします。テストデータの挿入
ダイアログボックスに次のプロンプトを入力します:
customerテーブルに10件のデータを挿入してください。SQL文を確認し、問題がなければ実行ボタンをクリックします。挿入が成功すると、実行結果が表示されます。
FastAPIプロジェクトの作成
ダイアログボックスに次のプロンプトを入力します:
FastAPIプロジェクトを作成し、customerテーブルに基づいたRESTful APIを生成してください。SQL文を確認し、問題がなければ実行ボタンをクリックします。このステップでは3つのファイルが自動生成されます。AIが生成する内容は完全ではない場合があるため、初めて使用する際は
すべて受け入れるを選択し、後からニーズに合わせて修正することを推奨します。仮想環境の作成と依存関係のインストール
以下のコマンドを実行し、現在のディレクトリで
uvパッケージ管理ツールを使って仮想環境を作成し、依存パッケージをインストールします。uv venv source .venv/bin/activate uv pip install -r requirements.txtFastAPIプロジェクトの起動
以下のコマンドを実行して、FastAPIプロジェクトを起動します。
uvicorn main:app --reloadテーブル内のデータの確認
コマンドラインで以下のコマンドを実行するか、他のリクエストツールを使用して、テーブル内のデータを確認します。
curl http://127.0.0.1:8000/customers返された結果により、追加、削除、変更、検索のためのRESTful APIが正常に生成されたことが確認できます。
from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.orm import Session from models import Customer from database import SessionLocal, engine from pydantic import BaseModel app = FastAPI() # データベースの依存関係 def get_db(): db = SessionLocal() try: yield db finally: db.close() # リクエストモデル class CustomerCreate(BaseModel): name: str age: int telephone: str location: str # レスポンスモデル class CustomerResponse(CustomerCreate): id: int class Config: from_attributes = True @app.post("/customers/") def create_customer(customer: CustomerCreate, db: Session = Depends(get_db)): db_customer = Customer(**customer.model_dump()) db.add(db_customer) db.commit() db.refresh(db_customer) return db_customer @app.get("/customers/{customer_id}") def read_customer(customer_id: int, db: Session = Depends(get_db)): customer = db.query(Customer).filter(Customer.id == customer_id).first() if customer is None: raise HTTPException(status_code=404, detail="Customer not found") return customer @app.get("/customers/") def read_customers(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)): return db.query(Customer).offset(skip).limit(limit).all() @app.put("/customers/{customer_id}") def update_customer(customer_id: int, customer: CustomerCreate, db: Session = Depends(get_db)): db_customer = db.query(Customer).filter(Customer.id == customer_id).first() if db_customer is None: raise HTTPException(status_code=404, detail="Customer not found") for field, value in customer.model_dump().items(): setattr(db_customer, field, value) db.commit() db.refresh(db_customer) return db_customer @app.delete("/customers/{customer_id}") def delete_customer(customer_id: int, db: Session = Depends(get_db)): customer = db.query(Customer).filter(Customer.id == customer_id).first() if customer is None: raise HTTPException(status_code=404, detail="Customer not found") db.delete(customer) db.commit() return {"message": "Customer deleted successfully"}