mcpField
B
bmob-mcp

bmob-mcp

github.com/bmobクラウド・DevOps446 回インストール1 週間前に更新
リポジトリ

bmob-mcp について

Bmob が公式にホストする MCP サーバーで、開発者やエージェントが IDE からプロジェクト構造を確認し、データベースやクラウドの操作を行えます。テーブル管理、クラウド関数の操作、静的サイトのデプロイ、curl 生成に対応します。エンドポイントは暗号化されていない HTTP のため、ドキュメントではローカル開発での利用を推奨しています。

主な機能

  1. 01プロジェクトのテーブルとフィールド構造の確認
  2. 02テーブル作成とレコードの追加・更新・削除
  3. 03Bmob 操作用 curl の生成
  4. 04クラウド関数のデプロイ、実行、取得
  5. 05HTML ページや静的サイトのデプロイ

活用シーン

  1. 01IDE で Bmob プロジェクトのスキーマを確認
  2. 02開発中のデータ変更をテスト
  3. 03クラウド関数をデプロイして検証
  4. 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 を呼び出して、現在のプロジェクトの実際のテーブル構造を取得してください。推測に基づいてフィールド名/型を生成することは禁止です。理由は次のとおりです。

  1. Bmob は schemaless です。add_single_data は任意の JSON を受け付けるため、誤ったフィールドはそのままデータベースに登録され、汚れたデータの原因になります。
  2. 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)
部署静态站点distfileName(例: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 返回 needLocalUploadMCP 不能传二进制,这是正常流程立刻用本地 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 / 403App 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"}}}'

参考

コメント