bmob-mcp について
Bmob が公式にホストする MCP サーバーで、開発者やエージェントが IDE からプロジェクト構造を確認し、データベースやクラウドの操作を行えます。テーブル管理、クラウド関数の操作、静的サイトのデプロイ、curl 生成に対応します。エンドポイントは暗号化されていない HTTP のため、ドキュメントではローカル開発での利用を推奨しています。
主な機能
- 01プロジェクトのテーブルとフィールド構造の確認
- 02テーブル作成とレコードの追加・更新・削除
- 03Bmob 操作用 curl の生成
- 04クラウド関数のデプロイ、実行、取得
- 05HTML ページや静的サイトのデプロイ
活用シーン
- 01IDE で Bmob プロジェクトのスキーマを確認
- 02開発中のデータ変更をテスト
- 03クラウド関数をデプロイして検証
- 04単一 HTML ページや dist アーカイブを CDN に公開
MCP 対応
アプリケーション ID と REST API Key をヘッダーで認証する HTTP+SSE MCP サーバーを提供します。MCP クライアントはツールを使ってテーブルやレコードの管理、コード生成、クラウド関数や静的サイトの操作を行えます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ bmob/ agent-skills --skill bmob-mcpインストール後、Claude Code で/bmob-mcpを入力して読み込まれたか確認します。
詳細
Bmob MCP サーバー
Bmob 公式ホストの MCP サーバーです。エンドポイントは http://mcp.bmobapp.com/mcp、トランスポートは MCP 2024-11-05 の HTTP+SSE です。X-Bmob-Application-Id と X-Bmob-REST-API-Key の 2 つの HTTP ヘッダーで認証します。エージェントを設定すると、IDE 内で実際の Bmob プロジェクトに対するデータの追加・削除・更新・検索、schema の設計、curl のひな形生成ができます。
操作別ルーティング:MCP ツール、
generate_code、SDK/REST の使い分けを示す比較表はshared/operation-routing.mdを参照してください。
ツール数:tools/listは 12 個を返します。エージェントが呼び出すのは 11 個です(内部ツールmcp_endpoint_mcp_postを除く)。
HTTP の平文通信に関する警告:現在、MCP エンドポイントは HTTP(HTTPS ではありません)です。ローカルの開発環境でのみ使用することを推奨します。実際の Key を含む
.cursor/mcp.json/.mcp.jsonを公開 git リポジトリにコミットしないでください。
MCP と SDK skill の使い分け
| シナリオ | MCP を使用 | SDK skill を使用 |
|---|---|---|
| プロジェクト内のテーブルやフィールドの型を確認したい | ✅ get_project_tables | — |
| 新しいテーブルの設計/フィールドの追加/schema の変更 | ✅ create_table | — |
| IDE 内でデータの追加・削除・更新・検索をテストする(開発時に手動で実行) | ✅ add_single_data / update_single_data / delete_single_data | — |
| クラウド関数のソースコードをアップロード/デプロイして検証する | ✅ deploy_cloud_function;個別に実行 → invoke_cloud_function | — |
| 本番環境のクラウド関数を同期/ローカルに取得する | ✅ list_cloud_functions → get_cloud_function(エージェントがローカルファイルを作成) | — |
クラウド関数を実行/試運転する(REST POST /1/functions/<name>) | ✅ invoke_cloud_function;curl を生成 → generate_code(调用云函数) | — |
| Web サイト/静的ホスティングをワンクリックでデプロイする(単一ページの HTML または dist.zip を CDN に配置) | ✅ deploy_static_site または generate_code(部署静态站点单页 / 部署静态站点dist) | — |
| 任意の言語の curl のひな形が必要(バックアップ、移行スクリプト) | ✅ generate_code | — |
| アプリに実装してリリースするコード(本番コード)を書く | — | ✅ bmob-database-{javascript,android,ios,swift,flutter,restful} |
| ACL/権限ルールを設定する | — | ✅ bmob-acl-and-roles |
| Bmob サーバー上で実行するクラウド関数を書く | — | ✅ bmob-cloud-function-development |
インストール
以下のいずれかのスニペットを該当するツールの MCP 設定ファイルにコピーしてください。詳しくは shared/mcp-install-snippets.md を参照してください。
{
"mcpServers": {
"bmob": {
"url": "http://mcp.bmobapp.com/mcp",
"headers": {
"X-Bmob-Application-Id": "<your-application-id>",
"X-Bmob-REST-API-Key": "<your-rest-api-key>"
}
}
}
}
認証情報の場所:Bmob コンソール → アプリ → 設定/アプリキー。
必須のワークフロー
書き込み操作の前に、必ず get_project_tables を呼び出して、現在のプロジェクトの実際のテーブル構造を取得してください。推測に基づいてフィールド名/型を生成することは禁止です。理由は次のとおりです。
- Bmob は schemaless です。
add_single_dataは任意の JSON を受け付けるため、誤ったフィールドはそのままデータベースに登録され、汚れたデータの原因になります。 Pointer/Relationフィールドは{ "__type":"Pointer", "className":"X", "objectId":"..." }形式で渡す必要があります。形式が誤っていても、エラーが表示されず無視されます。
sequenceDiagram
autonumber
participant U as User
participant A as Agent
participant M as Bmob MCP
U->>A: "帮我给 Player 表加一条数据 Lily, 18 岁"
A->>M: get_project_tables (always first)
M-->>A: {Player: {name:String, age:Number, ...}}
A->>U: 确认字段对应 + 数据示例
U-->>A: 确认
A->>M: add_single_data {tableName:"Player", data:"{\"name\":\"Lily\",\"age\":18}"}
M-->>A: {createdAt:..., objectId:...}
A->>U: 写入成功,objectId=...
12 個のツールの実際の schema(エージェントが呼び出せるのは 11 個)
tools/list は合計 12 個を返します。第 12 の mcp_endpoint_mcp_post は呼び出さないでください(サーバー内部のループバック用です)。以下の 1〜11 がエージェントで使用できるツールです。
1. get_project_tables
このプロジェクトのすべてのテーブルと、それぞれのフィールド構造を取得します。headers 以外のパラメーターは不要です。すべての書き込み操作の前に、必ず一度呼び出してください。
{
"inputSchema": {
"type": "object",
"properties": {},
"title": "get_project_tablesArguments"
}
}
2. create_table
新しいデータテーブルを作成します。
{
"inputSchema": {
"type": "object",
"properties": {
"tableName": { "type": "string" },
"classNote": { "type": "string" },
"fields": { "type": "string", "description": "JSON-encoded field map" }
}
}
}
fields は JSON 文字列です。例:
{
"score": { "type": "Number", "isAutoIncre": true, "autoIncreInit": 1000, "note": "游戏分数" },
"player": { "type": "Pointer", "targetClass": "Player", "note": "玩家" },
"nickname": { "type": "String", "unique": true, "note": "昵称" }
}
type は 10 個の列挙値のいずれかです。
| type | 説明 | 追加の制約 |
|---|---|---|
String | 文字列 | unique: true で一意キーを設定できます |
Number | 整数/小数 | isAutoIncre: true と autoIncreInit: <int> で自動インクリメントを設定できます |
Bool | ブール値 | — |
Date | 日付 | — |
File | ファイル | Bmob ファイルシステムの url + filename に関連付けられます |
Geo | 地理的位置 | latitude + longitude |
Array | 配列 | — |
Object | ネストされたオブジェクト | — |
Pointer | 一対多のポインター | targetClass: "<TableName>" が必須です |
Relation | 多対多の関連付け | targetClass: "<TableName>" が必須です |
重要:createdAt / updatedAt / objectId / ACL は Bmob の組み込みフィールドです。fields で宣言しないでください。
3. add_single_data
指定したテーブルにデータを 1 行追加します。
{
"inputSchema": {
"type": "object",
"required": ["tableName", "data"],
"properties": {
"tableName": { "type": "string" },
"data": { "type": "string", "description": "JSON-encoded row" }
}
}
}
data は JSON 文字列です。例:'{"score":1337,"playerName":"bmob","cheatMode":false}'。Pointer フィールドには次の形式を使用します。
{ "player": { "__type": "Pointer", "className": "Player", "objectId": "abc123" } }
4. update_single_data
データを 1 行更新します。引数 data を使って、指定したフィールド全体を置き換えます(パッチではありません)。
{
"inputSchema": {
"type": "object",
"required": ["tableName", "objectId", "data"],
"properties": {
"tableName": { "type": "string" },
"objectId": { "type": "string" },
"data": { "type": "string" }
}
}
}
5. delete_single_data
指定した objectId の行をテーブルから削除します。取り消しできません。呼び出す前に、必ずユーザーに再確認してください。
{
"inputSchema": {
"type": "object",
"required": ["tableName", "objectId"],
"properties": {
"tableName": { "type": "string" },
"objectId": { "type": "string" }
}
}
}
6. generate_code
対応する操作の Bmob curl を生成し、クライアントが curl を任意の開発言語に翻訳できるようにします。呼び出す前に、必ず get_project_tables を呼び出してください。type は 15 個の列挙値で、それぞれの type に必要なパラメーターのサブセットは異なります。
type の値 | 必須パラメーター |
|---|---|
添加 | tableName, data |
删除 | tableName, objectId |
更新 | tableName, objectId, data |
查询一条数据 | tableName, objectId |
条件查询 | tableName, where(JSON 文字列), skip, limit, count |
注册 | data(username + password を必ず含む) |
用户名密码登录 | username, password |
手机号验证码登录 | mobilePhoneNumber, smsCode |
更新用户 | sessionToken, objectId, data |
请求短信验证码 | data(mobilePhoneNumber + template を必ず含む) |
验证短信验证码 | data(mobilePhoneNumber を必ず含む), smsCode |
调用云函数 | funcName, data(引数がない場合、data は {} にする必要があります) |
上传文件 | fileName, content_Type |
部署静态站点单页 | fileName(例:index.html。デフォルトは index.html) |
部署静态站点dist | fileName(例:dist.zip。デフォルトは dist.zip) |
完全な inputSchema:
{
"inputSchema": {
"type": "object",
"required": ["type", "objectId", "data", "tableName", "where"],
"properties": {
"type": { "type": "string" },
"objectId": { "type": "string" },
"data": { "type": "string" },
"tableName": { "type": "string" },
"where": { "type": "string" },
"skip": { "type": "integer" },
"limit": { "type": "integer" },
"count": { "type": "integer" },
"fileName": { "type": "string" },
"content_Type": { "type": "string" },
"username": { "type": "string" },
"password": { "type": "string" },
"mobilePhoneNumber": { "type": "string" },
"smsCode": { "type": "string" },
"sessionToken": { "type": "string" },
"funcName": { "type": "string" }
}
}
}
where の例:'{"age":{"$gte":18}}' は SQL の WHERE age >= 18 と同じです。where の構文全体については、REST ドキュメント #_24 を参照してください。
7. deploy_cloud_function
クラウド関数のアップロード/デプロイ:JavaScript または Java のクラウド関数のソースコードを Bmob にアップロードし、必要に応じて直ちに検証できます。
トリガー語:上传云函数、部署云函数、发布云函数、写云函数并验证。
{
"inputSchema": {
"type": "object",
"required": ["funcName", "code"],
"properties": {
"funcName": { "type": "string", "description": "云函数名称,如 rsync_img" },
"code": { "type": "string", "description": "云函数源码原文" },
"language": { "type": "integer", "description": "1=javascript, 2=java" },
"comment": { "type": "string", "description": "可选备注" },
"verify": { "type": "integer", "description": "1 表示上传成功后立即验证" },
"verify_data": { "type": "string", "description": "验证入参 JSON 字符串,默认 \"{}\"" }
}
}
}
- アップロード先:
PUT https://api.codenow.cn/1/functions/{funcName} - 検証先:
POST https://api.codenow.cn/1/functions/{funcName} - 言語:
1は JavaScript、2は Java です - 自動検証:
verify=1の場合、アップロード成功後にverify_dataを使用して関数を実行します - デプロイ成功後の呼び出し方法:レスポンスには
invokeGuide(ヘッダーを含む REST curl、各プラットフォームの SDK サンプル、skillRouting)が含まれます。ユーザーに表示する際は、URL をそのまま表示してはいけません。現在のプロジェクトの種類に応じてinvokeGuide.sdkから例を 1 つ選び、REST の場合はinvokeGuide.rest.curlを優先してください - 詳細については、MCP プロジェクトの
docs/deploy-cloud-function.mdを参照してください
8. invoke_cloud_function
クラウド関数の実行:REST API を使用してデプロイ済みのクラウド関数を呼び出し、結果を返します。
トリガー語:调用云函数、执行云函数、invoke cloud function、run cloud function。
{
"inputSchema": {
"type": "object",
"required": ["funcName"],
"properties": {
"funcName": { "type": "string", "description": "云函数名称,如 rsync_img" },
"data": { "type": "string", "description": "JSON 参数字符串,无参传 \"{}\"" }
}
}
}
- 呼び出し先:
POST https://api.codenow.cn/1/functions/{funcName} - 認証:MCP で設定された
X-Bmob-Application-Id+X-Bmob-REST-API-Keyを使用します - 引数なし:
dataは{}にする必要があります - curl のサンプルのみ必要で、自動実行しない場合は、
generate_code→调用云函数を使用してください - 詳細については、MCP プロジェクトの
docs/invoke-cloud-function.mdを参照してください
9. list_cloud_functions
オンラインのクラウド関数一覧:現在のプロジェクトにデプロイされているすべてのクラウド関数名を取得します。同期処理の最初の手順です。
トリガー語:同步云函数、同步函数、拉取云函数、下载云函数、列出云函数。
{
"inputSchema": {
"type": "object",
"properties": {},
"title": "list_cloud_functionsArguments"
}
}
- 呼び出し先:
GET https://api.codenow.cn/1/functions - 戻り値:
functions(名前の配列)、count、raw - 詳細については、MCP プロジェクトの
docs/sync-cloud-function.mdを参照してください
10. get_cloud_function
単一のクラウド関数のソースコード取得:名前を指定して、オンライン関数のソースコードとメタ情報を取得します。code はデコード済みのテキストです。
トリガー語:同步云函数、下载云函数 hello、拉取函数 rsync_img。
{
"inputSchema": {
"type": "object",
"required": ["funcName"],
"properties": {
"funcName": { "type": "string", "description": "云函数名称,如 hello" }
}
}
}
- 呼び出し先:
GET https://api.codenow.cn/1/functions/{funcName} - 戻り値:
funcName、code(テキスト)、language、languageName、suggestedFileName(例:hello.js) - ローカル同期:MCP はデータを取得するだけです。エージェントが
cloudfunctions/ディレクトリを作成し、ファイルを書き込みます(bmob-cloud-function-developmentを参照) - 詳細については、MCP プロジェクトの
docs/sync-cloud-function.mdを参照してください
11. deploy_static_site
ウェブサイト/静的ホスティングのワンクリックデプロイ:単一ページの HTML または dist 圧縮ファイルを Bmob CDN にデプロイします。
トリガー語:一键部署网站、静态托管、部署静态站点、部署网站、上传 dist、托管 HTML。
{
"inputSchema": {
"type": "object",
"required": ["fileName"],
"properties": {
"fileName": { "type": "string", "description": "仅允许 .zip / .html / .htm,如 index.html 或 dist.zip" },
"content": { "type": "string", "description": "仅单页 HTML 传文件原文。zip 不要传 content,不要 Base64。" },
"filePath": { "type": "string", "description": "本地文件路径,用于生成 curl --data-binary @路径。远程 MCP 读不到磁盘。" }
}
}
}
- 単一ページ HTML:
fileName=index.htmlとし、contentに HTML の原文を指定します。このツールが直接デプロイします - zip/大容量ファイル:MCP に zip を Base64 に変換して渡すことは禁止です(処理が遅く、macOS の
base64はデフォルトで改行を挿入するため、データが破損します)。fileNameと任意のfilePathのみを渡してください。ツールがneedLocalUpload+curlを返したら、エージェントは直ちにローカル Shell でcurl --data-binary @文件を実行する必要があります - 無効な拡張子の場合は
{"code": 158, "error": "file must be zip or html"}が返されます - 詳細については、MCP プロジェクトの
docs/deploy-static-site.mdを参照してください
12. mcp_endpoint_mcp_post
サーバー内部のループバックエンドポイントです。自発的に呼び出さないでください。
よくある質問
クロスプラットフォームの Q&A:shared/faq.md(MCP ツールの選択と mcp_endpoint_mcp_post に関する説明を含みます)。
アンチパターン
shared/anti-patterns.md を参照してください(特に、MCP を本番環境に組み込むこと、HTTP で Key を平文送信すること)。
ユースケースのレシピ
静的サイトのデプロイ:shared/recipes/static-site-deploy.md。
安全清单
- 配置文件不入 git:
.cursor/mcp.json/.mcp.json/~/.codex/config.toml若含真实 Key,必须在.gitignore排除。 -
delete_single_data与update_single_data必须二次确认:这两个工具不可逆,agent 在执行前要把目标 objectId 与数据 diff 展示给用户审视。 - 不要在
create_table.fields里写createdAt/updatedAt/objectId/ACL——这些字段 Bmob 已内置。 - 写入前一定先
get_project_tables:跳过这步会让 schemaless 的 Bmob 接受错字段,污染数据。 - 当前 MCP 端点是 HTTP 明文:Header 里的 REST API Key 在传输中可被嗅探。不要在公共 WiFi 调用。
- MCP 是开发期工具:不要把"agent → MCP"的链路嵌进生产应用,生产代码请用 SDK。
常见错误
| 表现 | 原因 | 修复 |
|---|---|---|
deploy_static_site 对 zip 返回 needLocalUpload | MCP 不能传二进制,这是正常流程 | 立刻用本地 Shell 执行返回的 curl(--data-binary),不要 Base64 |
| zip 经 MCP Base64 又慢又损坏 | 内容进了模型上下文;macOS base64 默认换行 | 不要转 Base64。deploy_static_site 只传 fileName,再跑返回的 curl |
tools/list 报 -32602 Invalid request parameters | 没有先 initialize + notifications/initialized 握手 | MCP client 默认会做,手测可参考下方诊断片段 |
| Header 401 / 403 | App ID 或 REST API Key 写错;或者 App ID 与 Key 不属于同一应用 | 控制台重取,注意"测试环境 / 生产环境"密钥不同 |
add_single_data 成功但数据不出现 | 字段名拼错(schemaless 不报错) | 先 get_project_tables 拿真实字段名 |
| Pointer 字段不生效 | 传成了字符串 objectId | 改用 {"__type":"Pointer","className":"X","objectId":"..."} |
诊断片段(手测 SSE 连接)
仅供开发者验证 MCP 服务器连通性使用,正常情况下 agent 自动处理。
# 1. 拿 session 端点
curl -s -N 'http://mcp.bmobapp.com/mcp' \
-H 'Accept: text/event-stream' \
-H 'X-Bmob-Application-Id: <id>' \
-H 'X-Bmob-REST-API-Key: <key>' &
# 2. SSE 立刻吐出第一帧 event: endpoint,里面有 session_id
# event: endpoint
# data: /mcp/messages/?session_id=xxx
# 3. POST initialize / notifications/initialized / tools/list 到该 session
curl -s -X POST 'http://mcp.bmobapp.com/mcp/messages/?session_id=xxx' \
-H 'Content-Type: application/json' \
-H 'X-Bmob-Application-Id: <id>' \
-H 'X-Bmob-REST-API-Key: <key>' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0.0.1"}}}'
参考
shared/operation-routing.md— 操作级三通道对照(MCP /generate_code/ SDK·REST)- Bmob MCP 介绍页
- shared/mcp-install-snippets.md — 五种 IDE 的配置模板
- REST API 完整文档 —
generate_code生成的 curl 形态对应这里 - 错误码字典:
bmob-error-codes