MCP(Model Context Protocol)は、Anthropic社が2024年11月に発表し、オープンソース化したプロトコルです。大規模言語モデルと外部ツールやデータソースとの連携を実現することを目的としています。MCPを利用することで、ユーザーは大規模言語モデルの出力を手動でコピーして実行する必要がなく、モデルが直接ツールに指示を出して対応するアクションを実行させることができます。
OceanBase MCP Serverは、MCPプロトコルを通じて大規模言語モデルとOceanBaseの連携を提供し、SQL文を実行できるようにします。適切なクライアントを利用することでプロジェクトのプロトタイプを迅速に構築でき、GitHub上でオープンソースとして公開されています。
Clineは、MCPプロトコルをサポートするオープンソースのAIコーディングアシスタントです。
本記事では、Clineを使用して、OceanBase MCP Serverを通じてバックエンドアプリケーションを迅速に構築する方法を紹介します。
前提条件
- ご利用の環境に、利用可能なトランザクション型(MySQL)クラスタインスタンスが存在します。
テナントの作成は、テナントの作成を参照して完了してください。その後、以下の手順を実行します。
ご利用の環境に、使用可能なMySQL互換モードのテナント、MySQLデータベース、およびデータベースアカウントが既に存在し、データベースアカウントに読み書き権限が付与されていること。作成が必要な場合は、詳細については アカウントの作成および データベースの作成(MySQL専用)をご参照ください。
プロジェクト管理者またはインスタンス管理者ロールを持ち、プロジェクト内のインスタンスに対する読み書き操作を実行できます。権限がない場合は、組織管理者に連絡して権限の追加を依頼してください。
Python 3.11以降のバージョンおよび対応するpipをインストールしています。マシンのPythonバージョンが低い場合は、Minicondaを使用して新しいPython 3.11以降の環境を作成できます。詳細については、Minicondaインストールガイドをご参照ください。
使用しているOSに応じて、Gitをインストールしています。
Pythonパッケージマネージャーuvをインストールしています。インストール完了後、
uv --versionコマンドを使用してインストールが成功したかどうか確認できます:pip install uv uv --versionClineをインストールしています:
- Visual Studio Code IDEを使用している場合は、
拡張機能バーで検索し、Clineプラグインをインストールします。プラグイン名はClineです。インストール完了後、設定アイコンをクリックし、Clineの大規模言語モデルAPIを設定します:
- IDEを使用していない場合は、Clineインストールガイドをご参照ください。ダウンロード先は Clineです。
- Visual Studio Code IDEを使用している場合は、
ステップ1:データベース接続情報を取得する
ドロップダウンリストから、ID クラスタインスタンスを選択。
概要 ページに移動します。
接続をクリックし、接続文字列を取得 を選択します。
ポップアップウィンドウで、パブリックネットワークを使用 を選択します。
アクセスアドレスを取得し、現在のブラウザのIPアドレスを追加 を選択します。
データベース関連情報を入力し、**接続文字列をコピー**します。
ステップ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-generate です。

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は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を使用して、RESTful APIスタイルのプロジェクトを迅速に作成できます。FastAPIは、PythonでRESTful APIを迅速に構築できるWebフレームワークです。
customerテーブルを作成する
ダイアログボックスに次のプロンプトを入力します:
customerテーブルを作成してください。主キーはIDで、name、age、telephone、locationの各フィールドを含めてください。SQL文を確認した後、実行ボタンをクリックしてクエリを実行します。テストデータを挿入する
ダイアログボックスに次のプロンプトを入力します:
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実行結果は次のとおりです:
[{"telephone":"138***8001","id":1,"name":"Zhang San","location":"Beijing","age":25},{"telephone":"138***8002","id":2,"name":"Li Si","location":"Shanghai","age":30},{"telephone":"138***8003","id":3,"name":"Wang Wu","location":"Guangzhou","age":22},{"telephone":"138***8004","id":4,"name":"Zhao Liu","location":"Shenzhen","age":28},{"telephone":"138***8005","id":5,"name":"Qian Qi","location":"Hangzhou","age":35},{"telephone":"138***8006","id":6,"name":"Sun Ba","location":"Nanjing","age":40},{"telephone":"138***8007","id":7,"name":"Zhou Jiu","location":"Chengdu","age":27},{"telephone":"138***8008","id":8,"name":"Wu Shi","location":"Wuhan","age":33},{"telephone":"138***8009","id":9,"name":"Zheng Shiyi","location":"Xi'an","age":29},{"telephone":"138***8010","id":10,"name":"Wang Shier","location":"Chongqing","age":31}]これにより、追加、削除、更新、検索のための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"}