MCP(Model Context Protocol)は、Anthropic社が2024年11月に発表し、オープンソース化したプロトコルです。このプロトコルは、大規模言語モデルと外部ツールやデータソースとのインタラクションを実現することを目的としています。MCPを利用することで、ユーザーは大規模言語モデルの出力を手動でコピー&ペーストして実行する必要がなく、大規模言語モデルが直接ツールに指示を送り、対応するアクション(Action)を実行させることが可能になります。
OceanBase MCP Serverは、MCPプロトコルを通じて大規模言語モデルとOceanBaseデータベースとの連携機能を提供し、SQL文の実行を可能にします。適切なクライアントを使用すれば、プロジェクトのプロトタイプを迅速に構築でき、GitHub上でオープンソースとして公開されています。
Claude Codeは、Anthropic社が開発したAIプログラミングツールであり、ターミナル上で動作するスマートコーディングアシスタントです。開発者はClaude Codeを使用して、アイデアを高品質なコードに素早く変換できます。
本記事では、Claude Codeを使用して、OceanBase MCP Serverを通じてバックエンドアプリケーションを迅速に構築する方法を紹介します。
前提条件
OceanBaseデータベースのデプロイが完了し、MySQLモードのユーザーテナントが作成されていること。ユーザーテナントの作成方法の詳細については、テナントの作成を参照してください。
Python 3.11以降および対応するpipをインストールしてください。マシン上のPythonバージョンが低い場合は、Minicondaを使用して新しいPython 3.11以降の環境を作成できます。具体的な手順については、Minicondaのインストールガイドを参照してください。
使用しているOSに応じて、Gitをインストールします。ご自身のOSに合わせてダウンロード・インストールを行ってください:
Windows:https://git-scm.com/downloads/win。
macOS:https://git-scm.com/download/mac。
Linux:https://git-scm.com/downloads/linux。
Pythonパッケージマネージャーuvをインストールします。
macOS/Linuxでは、スタンドアロンスクリプトを使用してインストールできます:
curl -LsSf https://astral.sh/uv/install.sh | shWindowsプラットフォームでは、以下のスクリプトを使用します:
irm https://astral.sh/uv/install.ps1 | iexまたは、プラットフォームに依存しないpipインストール方法を使用します:
pip install uv
インストールが完了したら、
uv --versionコマンドを使用してインストールが正常に完了したかどうか確認します:pip install uv uv --versionAugment Codeのインストール:
VS Codeを開きます(まだインストールしていない場合は、公式ドキュメントを参照してインストールしてください)。
サイドバーの拡張機能アイコンをクリックします。
"Claude Code"と検索してインストールをクリックします。
Claude Codeの環境変数を設定します。
cat >> ~/.zshrc << 'EOF' export ANTHROPIC_BASE_URL=***** export ANTHROPIC_API_KEY=******* export ANTHROPIC_MODEL=******* EOF source ~/.zshrcリンクをテストします。
Anthropicモデルを選択します。
ステップ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を設定する
OceanBase MCP Serverリポジトリのクローン
次のコマンドを実行して、ソースコードをローカルにダウンロードします:
git clone https://github.com/oceanbase/awesome-oceanbase-mcp.git
ソースコードディレクトリに移動します:
cd awesome-oceanbase-mcp
依存関係のインストール
oceanbase_mcp_server ディレクトリで以下のコマンドを実行して仮想環境を作成し、依存関係をインストールします:
uv venv
source .venv/bin/activate
uv pip install .
OceanBase MCP Serverの設定
VS Codeのターミナルを開き、claude mcp add-json コマンドを実行します。
claude mcp add-json oceanbase '{ "command": "uv", "args": [ "--directory", "/path/to/your/oceanbase_mcp_server/src/oceanbase_mcp_server", "run", "oceanbase_mcp_server" ], "env": { "OB_HOST": "***", "OB_PORT": "***", "OB_USER": "***", "OB_PASSWORD": "***", "OB_DATABASE": "***" } }'/path/to/your/oceanbase_mcp_serverはoceanbase_mcp_serverフォルダの絶対パスに置き換える必要があります。OB_HOST、OB_PORT、OB_USER、OB_PASSWORD、OB_DATABASEは、ご自身のデータベースの対応する情報に置き換えてください。データベースへの接続が可能かどうか確認します。
「testデータベースにはいくつのテーブルがありますか」というプロンプトが表示されたら、Claude Codeは実行予定のSQL文を表示し、クエリ結果を出力します。
Claude Codeは現在のtestデータベース内のテーブル数を表示します。これは、OceanBaseデータベースに正常に接続できていることを示しています。
ステップ3:FastAPIを使用してRESTful APIスタイルのプロジェクトを迅速に作成する
FastAPIは、Python用のWebフレームワークであり、RESTful APIを迅速に構築できます。
テーブルを作成します。
プロンプト「customerテーブルを作成し、主キーはID、name、age、telephone、locationフィールドを含む」と入力します:
テストデータを挿入します。
プロンプト「10件のテストデータを挿入」と入力します:
FastAPIプロジェクトを作成します。
プロンプト「FastAPIプロジェクトを作成し、customerテーブルに基づくRESTful APIを生成する」と入力します。これにより、複数のファイルが自動生成されます。問題がある場合は、その後に再度修正します。
以下のコマンドを実行して依存関係をインストールします。
cd customer_api pip install -r requirements.txtFastAPIプロジェクトを起動します。
python3 main.pyテーブル内のデータを確認します。
コマンドラインで
curl http://127.0.0.1:8000/customersを実行するか、他のリクエストツールを使用して、テーブル内のデータを確認します:curl http://127.0.0.1:8000/customers [{"name":"Zhang San","age":28,"telephone":"13800138001","location":"Chaoyang District, Beijing","ID":1},{"name":"Li Si","age":32,"telephone":"13900139002","location":"Pudong New Area, Shanghai","ID":2},{"name":"Wang Wu","age":25,"telephone":"13700137003","location":"Tianhe District, Guangzhou","ID":3},{"name":"Zhao Liu","age":45,"telephone":"13600136004","location":"Nanshan District, Shenzhen","ID":4},{"name":"Chen Qi","age":38,"telephone":"13500135005","location":"Xihu District, Hangzhou","ID":5},{"name":"Liu Ba","age":29,"telephone":"13400134006","location":"Wuhou District, Chengdu","ID":6},{"name":"Zhou Jiu","age":35,"telephone":"13300133007","location":"Jiangning District, Nanjing","ID":7},{"name":"Wu Shi","age":41,"telephone":"13200132008","location":"Hongshan District, Wuhan","ID":8},{"name":"Zheng Shiyi","age":27,"telephone":"13100131009","location":"Yubei District, Chongqing","ID":9},{"name":"Ma Shier","age":33,"telephone":"13000130010","location":"Yanta District, Xi'an","ID":10}]追加、削除、変更、クエリのコードがすべて生成されました。
from sqlalchemy.orm import Session from . import models, schemas from typing import List, Optional def get_customer(db: Session, customer_id: int): return db.query(models.Customer).filter(models.Customer.ID == customer_id).first() def get_customers(db: Session, skip: int = 0, limit: int = 100): return db.query(models.Customer).offset(skip).limit(limit).all() def create_customer(db: Session, customer: schemas.CustomerCreate): db_customer = models.Customer(**customer.dict()) db.add(db_customer) db.commit() db.refresh(db_customer) return db_customer def update_customer(db: Session, customer_id: int, customer: schemas.CustomerUpdate): db_customer = db.query(models.Customer).filter(models.Customer.ID == customer_id).first() if db_customer: update_data = customer.dict(exclude_unset=True) for key, value in update_data.items(): setattr(db_customer, key, value) db.commit() db.refresh(db_customer) return db_customer def delete_customer(db: Session, customer_id: int): db_customer = db.query(models.Customer).filter(models.Customer.ID == customer_id).first() if db_customer: db.delete(db_customer) db.commit() return True return False def search_customers(db: Session, name: Optional[str] = None, location: Optional[str] = None): query = db.query(models.Customer) if name: query = query.filter(models.Customer.name.contains(name)) if location: query = query.filter(models.Customer.location.contains(location)) return query.all()