writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
cloud-functionsComplete guide for CloudBase cloud functions development - supports both Event Functions (Node.js) and HTTP Functions (multi-language Web services). Covers runtime selection, deployment, logging, invocation, scf_bootstrap, SSE, WebSocket, and HTTP access configuration.
Independent GitHub snapshot · Automated classification · Original documentation governs
Use this skill when developing, deploying, and managing CloudBase cloud functions. CloudBase supports two types of cloud functions:
Use this skill for cloud function operations when you need to:
Do NOT use for:
cloudrun-development skill)cloudrun-development skill)Choose the right function type
Understand runtime limitations
Deploy functions correctly
createFunction with type: "Event" or type: "HTTP"tcb fn deploy (Event) or tcb fn deploy --httpFn (HTTP)scf_bootstrap file in the function directoryfunctionRootPath (parent directory of function folder)Query logs properly
getFunctionLogs for log list (basic info)getFunctionLogDetail with RequestId for detailed logs| Feature | Event Function (普通云函数) | HTTP Function (HTTP 云函数) |
|---|---|---|
| Trigger | Event-driven (SDK, timer) | HTTP request |
| Entry Point | exports.main = async (event, context) => {} | Web Server (Express/Flask/Gin etc.) |
| Port | No port required | Must listen on port 9000 |
| Bootstrap | Not required | Requires scf_bootstrap |
| Connection | Short connection | Supports long connection |
| Languages | Node.js only | Node.js, Python, Go, Java |
| Protocols | N/A | HTTP, SSE, WebSocket |
| Use Cases | Event processing, scheduled tasks | Web APIs, REST services, real-time streaming |
⚠️ CRITICAL: Runtime cannot be modified after function creation
Once a cloud function is created with a specific runtime, the runtime cannot be changed. If you need a different runtime:
Supported Node.js Runtimes:
Nodejs18.15 (Default, Recommended)Nodejs16.13Nodejs14.18Nodejs12.16Nodejs10.15Nodejs8.9Runtime Selection Guidelines:
Nodejs18.15 for new projects (default, most modern)Event functions require:
Function Directory: Contains function code
index.js (or specified entry file)exports.main = async (event, context) => {}package.json with dependenciesFunction Root Path: Parent directory containing function directories
/project/cloudfunctions/myFunction/functionRootPath should be /project/cloudfunctions/Entry Point: Default is index.js with exports.main
handler parameterCreating New Functions:
Use createFunction tool (see MCP tool documentation for full parameter list):
func.runtime explicitly (defaults to Nodejs18.15)functionRootPath as parent directory of function folders (absolute path)force=true to overwrite existing functionUpdating Function Code:
Use updateFunctionCode tool:
Deployment Best Practices:
functionRootPathHTTP Functions are optimized for Web service scenarios, supporting standard HTTP request/response patterns.
Key Characteristics:
scf_bootstrap startup script⚠️ CRITICAL: HTTP Functions require scf_bootstrap file
| Requirement | Description |
|---|---|
| File name | Must be exactly scf_bootstrap (no extension) |
| Permission | Must have execute permission (chmod +x scf_bootstrap) |
| Port | Must start server on port 9000 |
| Line endings | Must use LF (Unix), not CRLF (Windows) |
Examples:
# Node.js
#!/bin/bash
node index.js
# Python
#!/bin/bash
export PYTHONPATH="./third_party:$PYTHONPATH"
/var/lang/python310/bin/python3.10 app.py
# Go
#!/bin/bash
./main
# Java
#!/bin/bash
java -jar *.jar
my-http-function/
├── scf_bootstrap # Required: startup script
├── package.json # Dependencies
└── index.js # Application code
Node.js Example (Express):
const express = require('express');
const app = express();
app.get('/', (req, res) => res.json({ message: 'Hello!' }));
app.listen(9000); // Must be port 9000
MCP Tool:
createFunction({
func: {
name: "myHttpFunction",
type: "HTTP", // Required for HTTP Function
protocolType: "HTTP", // "HTTP" (default) or "WS" (WebSocket)
timeout: 60
},
functionRootPath: "/path/to/functions",
force: false
})
CLI:
tcb fn deploy <name> --httpFn # HTTP Function
tcb fn deploy <name> --httpFn --ws # With WebSocket
⚠️ Notes:
node_modules or use layersMethod 1: HTTP API (with Access Token)
curl -L 'https://{envId}.api.tcloudbasegateway.com/v1/functions/{name}?webfn=true' \
-H 'Authorization: Bearer <TOKEN>'
⚠️ Must include webfn=true parameter
Method 2: HTTP Access Service (Custom Domain)
Use createFunctionHTTPAccess MCP tool to configure HTTP access:
createFunctionHTTPAccess({
name: "myHttpFunction",
type: "HTTP", // "HTTP" for HTTP Function
path: "/api/hello", // Trigger path
// domain: "your-domain.com" // Optional custom domain
})
# Access via default domain
curl https://{envId}.{region}.app.tcloudbase.com/{path}
# Access via custom domain
curl https://your-domain.com/{path}
| Method | Auth Required | Use Case |
|---|---|---|
HTTP API (?webfn=true) | Yes (Bearer Token) | Server-to-server |
| HTTP Access Service | Optional | Browser, public APIs |
SSE (Server-Sent Events): Enabled by default, for server-to-client streaming (AI chat, progress updates).
// Server
res.setHeader('Content-Type', 'text/event-stream');
res.write(`data: ${JSON.stringify({ content: 'Hello' })}\n\n`);
// Client
const es = new EventSource('https://your-domain/stream');
es.onmessage = (e) => console.log(JSON.parse(e.data));
WebSocket: Enable via protocolType: "WS" in createFunction. For bidirectional real-time communication.
| Limit | Value |
|---|---|
| Idle timeout | 10 - 7200 seconds |
| Max message size | 256KB |
const wss = new WebSocket.Server({ port: 9000 });
wss.on('connection', (ws) => {
ws.on('message', (msg) => ws.send(`Echo: ${msg}`));
});
Querying Logs:
Primary Method: Use getFunctionLogs and getFunctionLogDetail tools (see MCP tool documentation).
Alternative Method (Plan B): If tools unavailable, use callCloudApi:
GetFunctionLogs action:callCloudApi({
service: "tcb",
action: "GetFunctionLogs",
params: {
EnvId: "{envId}",
FunctionName: "functionName",
Offset: 0,
Limit: 10,
StartTime: "2024-01-01 00:00:00",
EndTime: "2024-01-01 23:59:59",
LogRequestId: "optional-request-id",
Qualifier: "$LATEST"
}
})
GetFunctionLogDetail action (requires LogRequestId from step 1):callCloudApi({
service: "tcb",
action: "GetFunctionLogDetail",
params: {
StartTime: "2024-01-01 00:00:00",
EndTime: "2024-01-01 23:59:59",
LogRequestId: "request-id-from-log-list"
}
})
Log Query Limitations:
Offset + Limit cannot exceed 10000StartTime and EndTime interval cannot exceed 1 dayLog Query Best Practices:
From Web Applications:
import cloudbaseSDK from "@cloudbase/js-sdk";
const cloudbase = cloudbaseSDK.init({
env: 'your-env-id',
region: 'ap-shanghai',
accessKey: 'your-access-key'
});
// Call event function
const result = await cloudbase.callFunction({
name: "functionName",
data: { /* function parameters */ }
});
From Mini Programs:
wx.cloud.callFunction({
name: "functionName",
data: { /* function parameters */ }
}).then(res => {
console.log(res.result);
});
From Node.js Backend:
const cloudbase = require("@cloudbase/node-sdk");
const app = cloudbase.init({
env: "your-env-id"
});
const result = await app.callFunction({
name: "functionName",
data: { /* function parameters */ }
});
From HTTP API:
Use CloudBase HTTP API to invoke event functions:
https://{envId}.api.tcloudbasegateway.com/v1/functions/{functionName}http-api skill for detailsHTTP Access vs HTTP API:
Creating HTTP Access:
Primary Method: Use createFunctionHTTPAccess tool (see MCP tool documentation).
Alternative Method (Plan B): If tool unavailable, use callCloudApi with CreateCloudBaseGWAPI:
callCloudApi({
service: "tcb",
action: "CreateCloudBaseGWAPI",
params: {
EnableUnion: true,
Path: "/api/users",
ServiceId: "{envId}",
Type: 6,
Name: "functionName",
AuthSwitch: 2,
PathTransmission: 2,
EnableRegion: true,
Domain: "*" // Use "*" for default domain, or custom domain name
}
})
Key Parameters:
Type: 6 - Cloud Function type (required)AuthSwitch: 2 - No auth (1 = with auth)Domain: "*" - Default domain, or specify custom domainAccess URL: https://{envId}.{region}.app.tcloudbase.com/{path} or https://{domain}/{path}
Environment Variables:
Set via func.envVariables when creating/updating:
{
envVariables: {
"DATABASE_URL": "mysql://...",
"API_KEY": "secret-key"
}
}
⚠️ CRITICAL: Environment Variable Update Constraint
When updating environment variables for existing functions:
getFunctionList with action=detail to get the function's current configurationCorrect Update Pattern:
// 1. First, get current function details
const currentFunction = await getFunctionList({
action: "detail",
name: "functionName"
});
// 2. Merge existing envVariables with new ones
const mergedEnvVariables = {
...currentFunction.EnvVariables, // Existing variables
...newEnvVariables // New/updated variables
};
// 3. Update with merged variables
await updateFunctionConfig({
funcParam: {
name: "functionName",
envVariables: mergedEnvVariables
}
});
Why This Matters:
Timeout Configuration:
Set via func.timeout (in seconds):
Timer Triggers:
Configure via func.triggers:
timer (only supported type)"0 0 2 1 * * *" - 2:00 AM on 1st of every month"0 30 9 * * * *" - 9:30 AM every dayVPC Configuration:
For accessing VPC resources:
{
vpc: {
vpcId: "vpc-xxxxx",
subnetId: "subnet-xxxxx"
}
}
Function Management:
getFunctionList - List functions or get function detailscreateFunction - Create cloud function (supports both Event and HTTP types via type parameter)
type: "Event" - Event Function (default)type: "HTTP" - HTTP FunctionprotocolType: "WS" - Enable WebSocket for HTTP FunctionupdateFunctionCode - Update function code (runtime cannot change)updateFunctionConfig - Update function configuration (⚠️ when updating envVariables, must first query and merge with existing values to avoid overwriting)Logging:
getFunctionLogs - Get function log list (basic info)getFunctionLogDetail - Get detailed log content by RequestIdcallCloudApi (Plan B) - Use GetFunctionLogs and GetFunctionLogDetail actions if direct tools unavailableHTTP Access:
createFunctionHTTPAccess - Create HTTP access for function (supports both Event and HTTP types via type parameter)callCloudApi (Plan B) - Use CreateCloudBaseGWAPI action if direct tool unavailableTriggers:
manageFunctionTriggers - Create or delete function triggersCLI Commands:
tcb fn deploy <name> - Deploy Event Functiontcb fn deploy <name> --httpFn - Deploy HTTP Functiontcb fn deploy <name> --httpFn --ws - Deploy HTTP Function with WebSockettcb fn deploy --all - Deploy all functions in configexports.main = async (event, context) => {
try {
// Function logic
return {
code: 0,
message: "Success",
data: result
};
} catch (error) {
return {
code: -1,
message: error.message,
data: null
};
}
};
exports.main = async (event, context) => {
const apiKey = process.env.API_KEY;
const dbUrl = process.env.DATABASE_URL;
// Use environment variables
};
const cloudbase = require("@cloudbase/node-sdk");
const app = cloudbase.init({
env: process.env.ENV_ID
});
exports.main = async (event, context) => {
const db = app.database();
const result = await db.collection("users").get();
return result;
};
Nodejs18.15 for new projects/health endpoint for monitoringnode_modules in package or use layers (no auto-install for HTTP Functions)| Scenario | Recommended Type |
|---|---|
| SDK/Mini Program calls | Event Function |
| Scheduled tasks (cron) | Event Function |
| REST API / Web services | HTTP Function |
| SSE streaming (AI chat) | HTTP Function |
| WebSocket real-time | HTTP Function |
| File upload/download | HTTP Function |
| Multi-language support | HTTP Function |
cloudrun-development - For container-based backend serviceshttp-api - For HTTP API invocation patternscloudbase-platform - For general CloudBase platform knowledge