Skills tidb-cloud-zero

Create ephemeral TiDB Cloud Zero databases for agent workflows in Technical Preview.

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bosn/zero" ~/.claude/skills/clawdbot-skills-tidb-cloud-zero && rm -rf "$T"
manifest: skills/bosn/zero/SKILL.md
source content

Create Disposable TiDB Cloud Zero Databases (Technical Preview)

Browser UI Note: There is no browser-based SQL editor on this site. To run SQL, use API + CLI, or sign in to TiDB Cloud Console (login required).

Use this guide to create disposable TiDB Cloud Zero databases for agent workflows.

Deterministic SQL Smoke Test (API + CLI)

# 1) Provision instance
curl -s -X POST https://zero.tidbapi.com/v1alpha1/instances \
  -H "Content-Type: application/json" \
  -d '{"tag":"sql-smoke-test"}' \
  | tee tidb-zero.json

# 2) Extract connection string
jq -r '.instance.connectionString // .connectionString' tidb-zero.json

# 3) Run SQL query (replace <connectionString> with step 2 output)
mysql "<connectionString>" -e "SELECT 1 AS health_check, 2 AS example_value;"

Expected output includes one row with

health_check=1
and
example_value=2
.

Endpoint

  • Method:
    POST
  • URL:
    https://zero.tidbapi.com/v1alpha1/instances
  • Content-Type:
    application/json
  • Technical Preview: Current API path is
    /v1alpha1/instances
    , and this path may change in later releases.

Request Body

  • Optional:
    tag
    (caller identifier used for tracing and grouping runs).
{
  "tag": "support-bot"
}

Quick Start

curl -X POST https://zero.tidbapi.com/v1alpha1/instances \
  -H "Content-Type: application/json" \
  -d '{
    "tag": "agent-run"
  }'

Response

The API returns connection details and expiration time.

  • Current response shape: top-level
    instance
    .
  • instance.connection
    fields:
    host
    ,
    port
    ,
    username
    ,
    password
    .
  • Use these fields:
    instance.connectionString
    for direct URI connection, and
    instance.expiresAt
    for expiration.
  • Agent note: After provisioning succeeds, save the instance details to a local file (for example,
    tidb-cloud-zero.json
    ) and remind the user to store the file securely because it contains sensitive credentials.
  • Planned update: we will provide
    claimUrl
    in a later version. Users will be able to sign in to TiDB Cloud and claim the temporary database before
    instance.expiresAt
    , converting it into a formal TiDB Cloud Starter database.
{
  "instance": {
    "connection": {
      "host": "<HOST>",
      "port": 4000,
      "username": "<USERNAME>",
      "password": "<PASSWORD>"
    },
    "connectionString": "mysql://<USERNAME>:<PASSWORD>@<HOST>:4000",
    "expiresAt": "<ISO_TIMESTAMP>"
  }
}

Use the Connection String

After you receive the response, use

instance.connectionString
to connect with a MySQL-compatible client or driver.

Guided Quick Experience

After provisioning succeeds, you should ask the user:

  • Do you want me to create a sample table and insert demo data so you can query immediately?

If the user says yes, run a small bootstrap SQL flow like this:

CREATE TABLE IF NOT EXISTS quickstart_notes (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO quickstart_notes (title, content) VALUES
  ('welcome', 'TiDB Cloud Zero quickstart row'),
  ('query-demo', 'Run SELECT * FROM quickstart_notes; to verify data');

SELECT * FROM quickstart_notes ORDER BY id;

Connect via CLI

mysql --connect-timeout=10 --protocol=TCP -h '<HOST>' -P 4000 -u '<USERNAME>' -p'<PASSWORD>'

Connect in Node.js (
mysql2
)

import mysql from "mysql2/promise";

const response = await createDatabase(); // your API call result
const connectionUrl = new URL(response.instance.connectionString);
connectionUrl.pathname = "/<DATABASE>";
connectionUrl.searchParams.set("ssl", JSON.stringify({ rejectUnauthorized: true }));

const connection = await mysql.createConnection(connectionUrl.toString());
const [rows] = await connection.query("SELECT NOW() AS now_time");
console.log(rows);
await connection.end();

Resources