MCP(Model Context Protocol)は、Anthropic社が2024年11月に発表し、オープンソース化したプロトコルです。大規模言語モデルと外部ツールやデータソースとの連携を実現することを目的としています。MCPを利用することで、ユーザーは大規模言語モデルの出力を手動でコピーして実行する必要がなく、モデルが直接ツールに指示を出して対応するアクションを実行させることができます。
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インストールガイドを参照してください。
お使いのOSに応じて、Gitをインストールしていること。
Pythonパッケージマネージャーuvをインストールしていること。インストール完了後、
uv --versionコマンドを実行してインストールが成功したかどうか確認できます:pip install uv uv --versionClineをインストールしていること。
Visual Studio Code IDEを使用している場合は、拡張機能タブでClineプラグインを検索してインストールします。プラグイン名は
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リポジトリのクローン
以下のコマンドを実行して、ソースコードをローカルにダウンロードします:
```shell
git clone https://github.com/oceanbase/mcp-oceanbase.git
```
ソースコードディレクトリに移動します:
```shell
cd mcp-oceanbase
```
依存関係のインストール
mcp-oceanbase ディレクトリで以下のコマンドを実行して仮想環境を作成し、依存関係をインストールします:
```shell
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 はご自身のデータベースの対応する情報に置き換えてください。
設定ファイルの例:
```json
{
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データベースへの接続が正常に確立されていることを意味します。
!6](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/cloud/integrations/AI/cline-10.png)
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.txt
- FastAPIプロジェクトを起動する
以下のコマンドを実行して、FastAPIプロジェクトを起動します:
uvicorn main:app --reload
- テーブル内のデータを確認する
コマンドラインで以下のコマンドを実行するか、他のリクエストツールを使用して、テーブル内のデータを確認します:
curl http://127.0.0.1:8000/customers
実行結果は次のとおりです:
```json
[{"telephone":"11111111101","id":1,"name":"張三","location":"北京","age":25},{"telephone":"11111111102","id":2,"name":"李四","location":"上海","age":30},{"telephone":"11111111103","id":3,"name":"王五","location":"廣州","age":22},{"telephone":"11111111104","id":4,"name":"趙六","location":"深圳","age":28},{"telephone":"11111111105","id":5,"name":"錢七","location":"杭州","age":35},{"telephone":"11111111106","id":6,"name":"孫八","location":"南京","age":40},{"telephone":"11111111107","id":7,"name":"周九","location":"成都","age":27},{"telephone":"11111111108","id":8,"name":"吳十","location":"武漢","age":33},{"telephone":"11111111109","id":9,"name":"鄭十一","location":"西安","age":29},{"telephone":"11111111110","id":10,"name":"王十二","location":"重慶","age":31}]
```
これにより、追加、削除、変更、検索のためのRESTful APIが正常に生成されたことが確認できます:
```python
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"}
```