Build or update the BlueBubbles external channel plugin for Moltbot (extension package, REST...
npx skills add Sol1986/claude-skills --skill "mindstudio-To-API-custom-function-builder"
Install specific skill from multi-skill repository
# Description
Build a complete MindStudio Run Function integration for any API the user wants to connect. Use this skill whenever the user mentions MindStudio, wants to connect an API to a workflow, asks for a "Run Function", wants to call an external service from MindStudio, or says things like "I want to use X API in MindStudio", "build me a MindStudio function for X", "how do I connect X to MindStudio", or "write me a script for MindStudio". Always use this skill β do not try to wing it from memory.
# SKILL.md
name: mindstudio-To-API-custom-function-builder
description: Build a complete MindStudio Run Function integration for any API the user wants to connect. Use this skill whenever the user mentions MindStudio, wants to connect an API to a workflow, asks for a "Run Function", wants to call an external service from MindStudio, or says things like "I want to use X API in MindStudio", "build me a MindStudio function for X", "how do I connect X to MindStudio", or "write me a script for MindStudio". Always use this skill β do not try to wing it from memory.
MindStudio Function Builder
Produce a complete, ready-to-paste MindStudio custom function for any API the user wants to connect. Always output all three sections: Code Tab, Configuration Tab, and Test Data Tab.
What to gather before writing
Before writing, collect (from the conversation or by asking):
- API endpoint β the full URL to call
- HTTP method β GET, POST, etc.
- Authentication β API key header name, Bearer token, Basic auth, OAuth, or none
- Required fields β what parameters/body fields the API needs
- Optional fields β any useful optional params (like
research_effort,language,model, etc.) - Response shape β what fields come back (ask or infer from docs/examples)
- Output variables β what the user wants to store in their workflow after the call
- Execution environment β Sandbox (default, fast) or Virtual Machine (needed for npm packages)
If the user pastes API docs or a code example, extract all of the above from it directly. Only ask for what's missing.
Output Format
Always produce exactly these three sections, in this order, formatted as fenced code blocks.
Section 1 β Code Tab (JavaScript)
Rules:
- Read all user-configurable values from ai.config.*
- Read any workflow variables (set by earlier blocks or user input) from ai.vars.*
- Use ai.vars[ai.config.outputVarName] pattern for output variables so the user's config field names control where results land
- Always validate required fields and throw clear errors if missing
- Use ai.log(...) to show progress to the user during long calls
- Use await fetch(...) for HTTP calls β no imports needed in Sandbox
- Wrap the fetch in try/catch and re-throw with a readable message
- Use input not query for You.com APIs (learned fix)
- For Virtual Machine functions, export a named handler async function
Template structure:
// --- Read config ---
const apiKey = ai.config.apiKey;
const inputVal = ai.config.inputField; // or ai.vars.someVar if set by workflow
const optional = ai.config.optionalField || "default_value";
// --- Validate ---
if (!apiKey) throw new Error("Missing API key. Set it in block configuration.");
if (!inputVal) throw new Error("Missing [field]. Provide it in block configuration.");
ai.log("Calling [API name]...");
// --- Request ---
const url = "https://api.example.com/endpoint";
const res = await fetch(url, {
method: "POST", // or GET, etc.
headers: {
"Authorization": `Bearer ${apiKey}`, // adjust per API auth style
"Content-Type": "application/json"
},
body: JSON.stringify({
field: inputVal,
option: optional
})
});
if (!res.ok) {
const err = await res.text();
throw new Error(`[API name] error (${res.status}): ${err}`);
}
const data = await res.json();
ai.log("Done. Storing results...");
// --- Store outputs ---
ai.vars[ai.config.outputMain] = data.someField ?? JSON.stringify(data);
ai.vars[ai.config.outputRaw] = JSON.stringify(data);
Section 2 β Configuration Tab
Rules:
- Use "secret" type for API keys β never "text"
- Use "inputVariable" type for fields that should accept a {{variable}} from the workflow
- Use "select" type with selectOptions for fixed-choice fields (e.g. model names, effort levels)
- Use "outputVariableName" type for fields where the user names their output variables
- Group into logical sections with clear title values
- Add helpText to every item
- Never include a dropdown for something the user controls via a workflow variable
Template:
config = {
configurationSections: [
{
title: "API Settings",
items: [
{
type: "secret",
label: "API Key",
variable: "apiKey",
helpText: "Your [API name] API key. Stored securely, not transferred on remix."
},
{
type: "inputVariable",
label: "Input Field Label",
variable: "inputField",
helpText: "Description of what this input does. Use a {{variable}} from your workflow."
},
{
type: "select",
label: "Option Label",
variable: "optionalField",
helpText: "Description of this option.",
selectOptions: [
{ label: "Option A", value: "value_a" },
{ label: "Option B", value: "value_b" }
]
}
]
},
{
title: "Output",
items: [
{
type: "outputVariableName",
label: "Main Output Variable",
variable: "outputMain",
helpText: "Workflow variable where the main result will be stored."
},
{
type: "outputVariableName",
label: "Raw Response Variable",
variable: "outputRaw",
helpText: "Workflow variable for the full raw JSON response."
}
]
}
]
}
Section 3 β Test Data Tab
Rules:
- Mirror every ai.config.* variable used in the code
- Use realistic placeholder values (not "test123")
- Use the actual default output variable names the user will likely use
- Match the output variable name values to what the user typed in the Output section config fields
Template:
environment = {
vars: {
// workflow variables read via ai.vars (e.g. set by earlier blocks)
someWorkflowVar: "example value from workflow"
},
config: {
apiKey: "your-api-key-here",
inputField: "A realistic example input for this API",
optionalField: "value_a",
outputMain: "result",
outputRaw: "resultJSON"
}
}
API Authentication Patterns
| Auth type | Header / approach |
|---|---|
| API key header | "X-API-Key": apiKey |
| Bearer token | "Authorization": \Bearer ${apiKey}`` |
| Basic auth | "Authorization": "Basic " + btoa(user + ":" + pass) |
| No auth | Omit headers object or leave empty |
Execution Environment Notes
Sandbox (default β use unless told otherwise):
- Runs in <50ms
- No npm installs
- fetch, JSON, ai.* methods all available
- Python via Pyodide (no pip in Sandbox)
- Does NOT support browser/Node APIs like URLSearchParams, Buffer, process, require, crypto, fs, or path
Virtual Machine (use when npm packages needed):
- Slower (~5s+ startup)
- Full Node.js or Python
- Must export a handler function:
import * as someLib from 'some-lib';
export const handler = async () => {
// your code here
ai.vars.result = someLib.doSomething();
};
Common Mistakes to Avoid
- Never use
URLSearchParamsin Sandbox β it is not available. Build query strings manually instead:
javascript let query = "?token=" + apiKey; if (symbol) query += "&symbol=" + encodeURIComponent(symbol); const url = "https://api.example.com/endpoint" + query; - Never use
Buffer,process,require,crypto, orfsin Sandbox β these are Node.js APIs not available there - Never use
queryas a body field for You.com APIs β useinput - Never use backtick template literals to inject
{{variables}}into HTML β use<script type="application/json">instead - Never hardcode API keys in the Code Tab β always use
ai.config.apiKeywith"secret"type - Never use
ai.vars.outputName = valuewhen the output variable name is user-configured β useai.vars[ai.config.outputVarName] = value - Don't add a config dropdown for a value the user sets via a workflow variable β read it from
ai.varsinstead
After Delivering the Function
Always end with a short note explaining:
1. What each output variable contains
2. Which config fields the user needs to fill in before running
3. Any gotchas specific to this API (rate limits, required plan tier, field naming quirks, etc.)
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.