CloudBase function runtime guide for building, deploying, and debugging your own Event Functions or HTTP Functions. This skill should be used when users need application runtime code on CloudBase, not when they are merely calling CloudBase official platform APIs.
If this environment only installed the current skill, start from the CloudBase main entry and use the published cloudbase/references/... paths for sibling skills.
https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/SKILL.mdhttps://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/cloud-functions/SKILL.mdKeep local references/... paths for files that ship with the current skill directory. When this file points to a sibling skill such as auth-tool-cloudbase or web-development, use the standalone fallback URL shown next to that reference.
Cross-cutting protocols (required for public exposure and code changes):
https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/cloudbase-platform/references/protocols/change-safety-protocol.mdhttps://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/cloudbase-platform/references/protocols/deployment-gate.mdscf_bootstrap, function triggers, or function gateway exposure.manageFunctions, queryFunctions, manageGateway, or legacy function-tool names.callCloudApi as a fallback for logs or gateway setup.DATABASE_URL / mysql2 / pg / Redis) instead of CloudBase native SDK → also read references/vpc-and-tcp-database.md../references.md./references/vpc-and-tcp-database.md../auth-tool-cloudbase/SKILL.md (standalone fallback: https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/auth-tool-cloudbase/SKILL.md)../cloudbase-wechat-integration/SKILL.md (standalone fallback: https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/cloudbase-wechat-integration/SKILL.md; official docs: https://docs.cloudbase.net/integration/introduce/index.md)../ai-model-nodejs/SKILL.md (standalone fallback: https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/ai-model-nodejs/SKILL.md)../cloudrun-development/SKILL.md (standalone fallback: https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/cloudrun-development/SKILL.md)../http-api-cloudbase/SKILL.md (standalone fallback: https://cnb.cool/tencent/cloud/cloudbase/cloudbase-skills/-/git/raw/main/skills/cloudbase/references/http-api-cloudbase/SKILL.md)cloudbase-wechat-integration for the business contract and this skill only for function operations.db.collection(...).get/add/update only for confirmed NoSQL collections, and app.rdb().from(...) for CloudBase PG tables. Functions add deployment complexity, CORS configuration, and HTTP gateway binding that the SDK eliminates entirely.exports.main(event, context)) with HTTP Function code shape (req / res on port 9000).db.collection("name").add(...) will create a missing document-database collection automatically. Collection creation is a separate management step.scf_bootstrap, listen on port 9000, and include dependencies.EXCEED_AUTHORITY. Note: anonymous login is disabled by default for new environments — if the function needs public access without authentication, configure the security rule to allow all callers rather than relying on anonymous login.scf_bootstrap Node.js binary path with the function runtime (e.g. using /var/lang/node18/bin/node but setting runtime: "Nodejs16.13").:latest instead of a unique tag; or confusing the request-driven port-9000 image model with a long-lived CloudRun container that listens on the injected PORT.manageFunctions covers SCF image deploy (Stage B) via runtime: "CustomImage" + imageConfig, but the CloudApp custom build → TCR push (Stage A) is a raw Tencent Cloud API path — confirm action names and parameters from official docs before any callCloudApi fallback.cloudbase-platform/references/protocols/change-safety-protocol.md).cloudbase-platform/references/protocols/deployment-gate.md.DATABASE_URL / mysql2 / pg / Redis) without vpc.vpcId + vpc.subnetId — create/update succeeds, then runtime cannot reach the private DB. Native app.rdb() / app.database() does not need this.vpc-xxxxx placeholders or copied samples). Resolve real IDs from the DB console, an existing resource detail, callCloudApi, or the user; stop if still unknown. See references/vpc-and-tcp-database.md.Use this skill when developing, deploying, and operating CloudBase cloud functions. CloudBase has two different programming models:
scf_bootstrap + zip); when they need custom system libraries or an arbitrary runtime they can instead run from a container image (Runtime: CustomImage, deployed from TCR — see ./references/http-functions-custom-image.md).exports.main = async (event, context) => {}.req / res on port 9000.http module unless the user explicitly asks for Express, Koa, NestJS, or another framework.Runtime: CustomImage) from a TCR image. The container still listens on the fixed port 9000. See ./references/http-functions-custom-image.md. This is distinct from a CloudRun container, which listens on the injected PORT and runs long-lived.Use these rules whenever you are writing the function code itself:
exports.main(event, context). That is the Event Function contract.9000.http.createServer((req, res) => { ... }) by default so the runtime contract stays explicit.http module, do not assume Express-style helpers exist. req.body, req.query, and req.params are not provided for you.require(...), no "type": "module" in package.json) unless you explicitly want ES Modules."type": "module" + import ...), do not mix in CommonJS-only globals or APIs such as require(...), module.exports, or bare __dirname. In ESM, derive file paths from import.meta.url with fileURLToPath(...) only when needed.http module, parse req.url yourself with new URL(...), collect the request body from the stream, and only then call JSON.parse. Empty bodies should be handled explicitly instead of assuming JSON is always present.res.writeHead(...) and res.end(...), including Content-Type such as application/json; charset=utf-8 for JSON APIs.OPTIONS preflight with 200 and CORS headersAccess-Control-Allow-Origin: * (or specific origin) on all responsesAccess-Control-Allow-Methods: GET, POST, OPTIONS as neededAccess-Control-Allow-Headers: Content-Type for JSON requests404, and known paths with unsupported methods should normally return 405.| Question | Choose |
|---|---|
| Triggered by SDK calls or timers? | Event Function |
| Needs browser-facing HTTP endpoint? | HTTP Function |
| Needs SSE or WebSocket service? | HTTP Function |
| Needs custom system libraries / arbitrary runtime, but still SCF request-driven + scale-to-zero? | HTTP Function with Runtime: CustomImage (deploy from a TCR image) |
| Needs long-lived container runtime or custom system environment? | CloudRun |
| Only needs HTTP access for an existing Event Function? | Event Function + gateway access |
Choose the correct runtime model first
exports.main(event, context)9000Use the converged MCP entrances
queryFunctions, queryGatewaymanageFunctions, manageGatewayWrite code and deploy, do not stop at local files
manageFunctions(action="createFunction") for creationmanageFunctions(action="updateFunctionCode") for code updatesmanageFunctions(action="updateFunctionConfig") for config updates (timeout, memorySize, envVariables)manageFunctions(action="createFunction") with func.runtime="CustomImage" and imageConfig (imageUri with tag; registryId for enterprise TCR); iterate later with manageFunctions(action="updateFunctionCode") + imageConfig. No functionRootPath is needed because the code lives in the image. See ./references/http-functions-custom-image.md.functionRootPath as the directory that directly contains function folders (e.g., cloudfunctions/ or functions/), NOT the project root and NOT the function subdirectory itselfmanageFunctions and queryFunctions instead of CLI commandsmanageFunctions(action="updateFunctionConfig") individually for each function — MCP does not have a --all batch parameter like CLIPrefer doc-first fallbacks
callCloudApi, first check the official docs or knowledge-base entry for that actionRead the right detailed reference
./references/event-functions.md./references/http-functions.mdRuntime: CustomImage, TCR image pipeline) -> ./references/http-functions-custom-image.md./references/operations-and-config.mddb.collection("feedback").add(...) only inserts into an existing collection; it does not auto-create feedback when absent.| Feature | Event Function | HTTP Function |
|---|---|---|
| Primary trigger | SDK call, timer, event | HTTP request |
| Entry shape | exports.main(event, context) | web server with req / res |
| Port | No port | Must listen on 9000 |
scf_bootstrap | Not required | Required |
| Dependencies | Auto-installed from package.json | Must be packaged with function code |
| Best for | serverless handlers, scheduled jobs | APIs, SSE, WebSocket, browser-facing services |
cloudfunctions/hello-event/index.js
exports.main = async (event, context) => {
return {
ok: true,
message: "hello from event function",
event,
};
};cloudfunctions/hello-event/package.json
{
"name": "hello-event",
"version": "1.0.0"
}cloudfunctions/hello-http/index.js
const http = require("http");
const { URL } = require("url");
// CORS headers — default to * for simple cross-origin APIs
const CORS_HEADERS = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
};
function sendJson(res, statusCode, data) {
res.writeHead(statusCode, {
"Content-Type": "application/json; charset=utf-8",
...CORS_HEADERS,
});
res.end(JSON.stringify(data));
}
function sendOptions(res) {
res.writeHead(204, CORS_HEADERS);
res.end();
}
function readJsonBody(req) {
return new Promise((resolve, reject) => {
let raw = "";
req.on("data", (chunk) => { raw += chunk; });
req.on("end", () => {
if (!raw) { resolve({}); return; }
try { resolve(JSON.parse(raw)); } catch (e) { resolve({}); }
});
req.on("error", reject);
});
}
const server = http.createServer(async (req, res) => {
// Handle CORS preflight
if (req.method === "OPTIONS") {
return sendOptions(res);
}
const url = new URL(req.url || "/", "http://127.0.0.1");
if (req.method === "GET" && url.pathname === "/") {
sendJson(res, 200, { ok: true, message: "hello from http function" });
} else if (req.method === "POST" && url.pathname === "/") {
const body = await readJsonBody(req);
sendJson(res, 200, { received: body });
} else {
sendJson(res, 404, { error: "Not Found" });
}
});
server.listen(9000);For a more complete example with routing, method checks, and error handling, see ./references/http-functions.md.
cloudfunctions/hello-http/scf_bootstrap
#!/bin/bash
/var/lang/node18/bin/node index.jsThe scf_bootstrap binary path must match the runtime — see the full mapping table in ./references/http-functions.md.
cloudfunctions/hello-http/package.json
{
"name": "hello-http",
"version": "1.0.0"
}queryFunctions(action="listFunctions"|"getFunctionDetail")manageFunctions(action="createFunction")manageFunctions(action="updateFunctionCode")manageFunctions(action="updateFunctionConfig")Query function logs — use the queryFunctions tool:
queryFunctions(action="listFunctionLogs", functionName="xxx") — list execution logs of a specific functionqueryFunctions(action="getFunctionLogDetail", requestId="xxx") — fetch the detail of one log entryqueryFunctions vs queryLogs:
queryFunctions queries execution logs of a single cloud function and requires functionNamequeryLogs searches CLS (cross-service log aggregation) using CLS query syntaxExamples:
// List recent logs for cloud function "my-function"
queryFunctions(action="listFunctionLogs", functionName="my-function", limit=10)
// Inspect the log detail for a specific request id
queryFunctions(action="getFunctionLogDetail", requestId="abc-123")
// Cross-service error search via CLS
queryLogs(action="searchLogs", queryString='(src:app OR src:system) AND log:"ERROR"', service="tcb")queryLogs queryString follows CLS syntax (see https://cloud.tencent.com/document/api/876/128127). The examples below are starting points; adapt them to the concrete log content of your query:
(src:app OR src:system) AND log:"START RequestId"| select request_id, max(status_code) as status where ((request_id='xxxx' AND retry_num=0) AND retry_num=0) AND status_code!=202 group by request_id, retry_nummodule:databasemodule:database AND eventType:(MongoSlowQuery) — MongoSlowQuery is the document-database slow-query eventmodule:rdbmodule:rdb AND eventType:(MysqlFreeze OR MysqlRecover OR MysqlSlowQuery) — MysqlFreeze = freeze, MysqlRecover = recover, MysqlSlowQuery = slow querymodule:workflowmodule:modelmodule:authmodule:llm AND logType:llm-traceloglogType:accesslogmodule:app AND eventType:(AppProdPub OR AppProdDel) — AppProdPub = app publish, AppProdDel = app deleteIf these are unavailable, read ./references/operations-and-config.md before any callCloudApi fallback
queryGateway(action="getRoute") / listRoutes / listCustomDomainsmanageGateway(action="createRoute") — for HTTP functions pass upstreamResourceType="WEB_SCF"; for Event functions pass upstreamResourceType="SCF". Omit domain to use the environment default (IsDefault)manageGateway(action="updateRoute") / deleteRoute / bindCustomDomain / deleteCustomDomaincallCloudApi (CreateCloudBaseGWAPI, etc.)cloudrun-development -> container services, long-lived runtimes, Agent hostinghttp-api-cloudbase -> raw CloudBase HTTP API invocation patternscloudbase-platform -> general CloudBase platform decisionsops-inspector -> AIOps-style inspection and log search across servicesAll packaged reference files (required for skill lint reachability):
3dcff8b
Also appears in
since Jul 28, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.