Corezoid Variable Manager logo

Corezoid Variable Manager

Organization
corezoid
corezoid-variable-manager

Manages Corezoid environment variables (env_var) — create, list, modify, delete, and use variables in process JSON. Activate when the user mentions "variable", "env var", "environment variable", "secret", "create variable", "list variables", "delete variable", "modify variable", "env_var", "{{env_var", or asks how to store a URL, token, API key, or any constant that should not be hardcoded in a process. Also activate when a process references {{env_var[@name]}} and the variable does not exist yet.

Overview

Publishercorezoid
Repositorycorezoid-ai-plugin
Skill namecorezoid-variable-manager
Stars
74
Forks
26
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by corezoid on GitHub. Read the source before you install it.

Installation

Install the Corezoid Variable Manager AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/corezoid/corezoid-ai-plugin/tree/main/plugins/corezoid/skills/corezoid-variable-manager
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/corezoid/corezoid-ai-plugin.git /tmp/corezoid-ai-plugin
mkdir -p .claude/skills
cp -r /tmp/corezoid-ai-plugin/plugins/corezoid/skills/corezoid-variable-manager .claude/skills/corezoid-variable-manager
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Corezoid Variable Manager in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Corezoid Variable Manager on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Corezoid Variable Manager is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Corezoid Variable Manager

How to call these tools

Every operation in this skill is an action of the single cz-variables MCP tool — the individual names below are action strings, not tools of their own:

cz-variables {"action": "list-variables"}

Arguments always go inside args; the shorthand used in the examples below — create-variable(name="payment-api-url", …) — means exactly that call. When unsure about an action's arguments, call cz-variables {"action": "<action>", "help": true} — it returns the full schema and runs nothing.

What variables are

Environment variables store constants (URLs, tokens, API keys, IDs, configuration values) that must not be hardcoded in process logic. The reference syntax {{env_var[@name]}} is resolved at runtime — changing a variable value takes effect immediately without redeploying any process.

Variables are stage-scoped: shared across all processes within a stage.


Variable types

By data type

data_typeWhen to useValue format
rawPlain string (URL, token, ID, any scalar)"https://api.example.com"
jsonStructured config, multi-field config, feature flags{"key":"value","nested":{...}}

By visibility

env_var_typeUI displayAccessible fromScopes
visibleValue shown in plain textAll node types[{"type":"*","fields":"*"}]
secretValue masked, shows only fingerprintAPI Call nodes only[{"type":"api_call","fields":"*"}]

⚠️ Secret variables are designed for tokens, passwords, and API keys. They are never returned in plain text by the API after creation — only an MD5/SHA256 fingerprint is available. Use visible for non-sensitive configuration.


Actions of cz-variables

ActionPurpose
create-variableCreate a raw + visible variable in one step
list-variablesList a stage's variables with obj_id, types, values (secrets masked)
modify-variableChange value/title/data_type or rename — dry-run + confirm-gated
delete-variablePERMANENTLY delete (no recycle bin) — dry-run + confirm-gated

Note: creating secret or json variables is not yet exposed as an action — use the direct API calls documented below for creation; manage them afterwards with the actions above.

Double-confirmation etiquette (modify / delete)

modify-variable and delete-variable are consequential: a deleted variable is gone FOREVER (env vars have NO recycle bin), a renamed one breaks every {{env_var[@old-name]}} reference, and a changed value takes effect immediately in running processes. The actions enforce a two-step gate, and you must drive it honestly:

  1. Call the action WITHOUT apply — you get a dry-run: a current → new diff (modify) or a red 🔴 PERMANENT DELETION block (delete), including a local reference scan.
  2. Show that dry-run output to the user verbatim — do not summarize away the warnings, especially the red block and the list of files that still reference the variable.
  3. Ask the user explicitly whether to proceed, and wait for their clear agreement in the conversation.
  4. Only then re-run with apply=true and the exact confirm="<short_name>#<obj_id>" from the dry-run output. Never fabricate the confirm string without steps 1–3, and never treat an earlier, unrelated "yes" as agreement for this action.

Server facts the tools rely on (verified live): modify is PARTIAL — omitted fields keep their value, so modifying a secret's title does not require (or touch) its value; env_var_type (visible/secret) can NOT be changed after creation — the server silently ignores such attempts; delete requires project_id + stage_id and is irreversible.


Using variables in process JSON

Once a variable exists, reference it with {{env_var[@short-name]}} anywhere a value is expected.

API Call node — URL field

json
{
  "type": "api",
  "url": "{{env_var[@payment-api-url]}}/charge",
  "method": "POST",
  "extra_headers": {},
  "max_threads": 5,
  "err_node_id": "<error_node_id>"
}

API Call node — header field

json
{
  "type": "api",
  "url": "{{env_var[@payment-api-url]}}/charge",
  "method": "POST",
  "extra_headers": {},
  "max_threads": 5,
  "extra": { "Authorization": "Bearer {{env_var[@payment-api-token]}}" },
  "extra_type": { "Authorization": "string" },
  "err_node_id": "<error_node_id>"
}

Set Parameters node

json
{
  "type": "set_param",
  "extra": {
    "baseUrl": "{{env_var[@service-url]}}",
    "token":   "{{env_var[@service-token]}}"
  },
  "extra_type": {
    "baseUrl": "string",
    "token":   "string"
  },
  "err_node_id": "<error_node_id>"
}

Call a Process node — passing variable as parameter

json
{
  "type": "api_rpc",
  "conv_id": "@target-process",
  "extra": { "endpoint": "{{env_var[@service-endpoint]}}" },
  "extra_type": { "endpoint": "string" },
  "err_node_id": "<error_node_id>"
}

Condition node (go_if_const)

Variable references work in condition expressions as both the left-hand value and the comparison value:

json
{
  "type": "go_if_const",
  "conditions": [
    {
      "fun": "equal",
      "arg": "{{env_var[@feature-flag]}}",
      "val": "enabled"
    }
  ],
  "to_node_id": "<next_node_id>"
}

Code node — variables must be pre-loaded via set_param

Variables are not directly accessible inside api_code JavaScript. First assign them to task fields using a set_param node upstream, then read via data.* in code:

javascript
// In set_param upstream: "apiUrl": "{{env_var[@my-api-url]}}"
var url = data.apiUrl + "/endpoint";

Naming rules

  • Only lowercase letters [a-z], digits [0-9], and hyphens -
  • Name and description must be at least 3 characters
  • Must be unique within the stage
  • Good: stripe-secret-key, payment-api-url, db-host-prod
  • Bad: URL, TOKEN, x, My_Var

Local cache files

Two files store variable information locally. Check both before creating a new variable:

FileCreated byContains
_ENV_VARS_.jsonpull-folder (ZIP export from Corezoid)All variables in the stage
.processes/variables.jsonthe create-variable actionOnly variables created in this session

If neither file exists, run pull-folder or call the list API (see below) to get the current state.


Workflow: Create a visible raw variable (MCP tool)

Step 1 — Check if variable already exists

Read _ENV_VARS_.json (or .processes/variables.json) and search for the short_name. If found, reuse it — do not create a duplicate.

Step 2 — Create the variable

Call cz-variables with action: "create-variable" and these args:

  • name: the short_name (kebab-case, e.g. stripe-api-key)
  • description: human-readable label (min 3 chars), used as title in the API
  • value: the actual value
cz-variables {"action": "create-variable", "args": {
  "name": "payment-api-url",
  "description": "Payment Service Base URL",
  "value": "https://api.payments.example.com"
}}

The action creates the variable in Corezoid and appends it to .processes/variables.json.

Step 3 — Reference in process JSON

Use {{env_var[@payment-api-url]}} wherever this value is needed.


Workflow: Create a secret variable (direct API)

Use when storing tokens, passwords, API keys — values that must be masked in the UI.

POST {corezoid_url}/api/2/json
Authorization: Simulator {access_token}
Content-Type: application/json

{
  "ops": [{
    "type":         "create",
    "obj":          "env_var",
    "obj_type":     0,
    "status":       "active",
    "data_type":    "raw",
    "env_var_type": "secret",
    "title":        "Stripe Secret Key",
    "short_name":   "stripe-secret-key",
    "description":  "",
    "value":        "sk_live_...",
    "company_id":   "<WORKSPACE_ID>",
    "project_id":   <PROJECT_ID>,
    "stage_id":     <STAGE_ID>,
    "scopes":       [{"type": "api_call", "fields": "*"}]
  }]
}

Response: { "obj_id": 2192, "proc": "ok", "fingerprints": [...] }

The value is never returned after creation. Store it securely before calling this API.


Workflow: Create a JSON variable (direct API)

Use when a variable holds a structured config object or array.

POST {corezoid_url}/api/2/json
Authorization: Simulator {access_token}
Content-Type: application/json

{
  "ops": [{
    "type":         "create",
    "obj":          "env_var",
    "obj_type":     0,
    "status":       "active",
    "data_type":    "json",
    "env_var_type": "visible",
    "title":        "Service Config",
    "short_name":   "service-config",
    "description":  "",
    "value":        "{\"host\":\"db.example.com\",\"port\":5432,\"name\":\"prod\"}",
    "company_id":   "<WORKSPACE_ID>",
    "project_id":   <PROJECT_ID>,
    "stage_id":     <STAGE_ID>,
    "scopes":       [{"type": "*", "fields": "*"}]
  }]
}

The value field must be a JSON string (the JSON content encoded as a string). A secret JSON variable uses "env_var_type": "secret" and "scopes": [{"type": "api_call", "fields": "*"}].


Workflow: List variables (direct API)

POST {corezoid_url}/api/2/json
Authorization: Simulator {access_token}
Content-Type: application/json

{
  "ops": [{
    "type":       "list",
    "obj":        "env_var",
    "sort":       "date",
    "order":      "asc",
    "id":         "<WORKSPACE_ID>",
    "company_id": "<WORKSPACE_ID>",
    "project_id": <PROJECT_ID>,
    "stage_id":   <STAGE_ID>
  }]
}

Response fields per variable:

FieldDescription
obj_idNumeric ID (needed for modify/delete)
short_nameThe @name used in {{env_var[@name]}}
titleHuman-readable display label
data_typeraw or json
env_var_typevisible or secret
valueActual value (empty for secret after creation)
fingerprintsMD5 + SHA256 hashes — use to detect value changes
scopesAccess scope rules
create_time / change_timeUnix timestamps
uuidVariable UUID

Workflow: Modify a variable (direct API)

Modify updates all mutable fields in one call. Always send the full payload — partial updates are not supported.

POST {corezoid_url}/api/2/json
Authorization: Simulator {access_token}
Content-Type: application/json

{
  "ops": [{
    "type":         "modify",
    "obj":          "env_var",
    "obj_id":       <VAR_OBJ_ID>,
    "data_type":    "raw",
    "env_var_type": "visible",
    "title":        "Updated Display Title",
    "short_name":   "new-short-name",
    "description":  "",
    "value":        "new-value",
    "company_id":   "<WORKSPACE_ID>",
    "project_id":   <PROJECT_ID>,
    "stage_id":     <STAGE_ID>,
    "scopes":       [{"type": "*", "fields": "*"}]
  }]
}

⚠️ Changing short_name invalidates all {{env_var[@old-name]}} references across every process in the stage. After renaming, grep all .conv.json files for the old name and update them, then push-process each affected file.


Workflow: Delete a variable (direct API)

⚠️ Before deleting, verify no process references {{env_var[@short-name]}}. push-process validates env_var references and will fail if the variable is missing.

bash
# Check which processes reference this variable
grep -r "env_var\[@variable-name\]" . --include="*.conv.json"
POST {corezoid_url}/api/2/json
Authorization: Simulator {access_token}
Content-Type: application/json

{
  "ops": [{
    "type":       "delete",
    "obj":        "env_var",
    "obj_id":     <VAR_OBJ_ID>,
    "company_id": "<WORKSPACE_ID>",
    "project_id": <PROJECT_ID>,
    "stage_id":   <STAGE_ID>
  }]
}

Resolving environment values

When calling the create-variable / modify-variable / delete-variable / list-variables actions you do not need to look up stage_id or project_id — MCP resolves both from the <id>_<name>.stage.json marker at the workspace root.

For direct /api/2/json calls (the raw workflows below) you need the values explicitly:

ValueWhere to find it
company_idworkspace_id field in current Folder in ~/.corezoid/config.json
stage_idobj_id in <id>_<name>.stage.json at the workspace root
project_idparent_id in the same <id>_<name>.stage.json
API URLcorezoid_url field in current Folder
Access tokenaccess_token field in current Folder
obj_id of variableList API response, or _ENV_VARS_.json

If the marker file is missing, run the corezoid-init skill.


Runtime behaviour

  • Variables are resolved before the node executes — the {{env_var[@name]}} token is replaced with the live value at the moment the task reaches that node
  • Updating a variable value takes effect immediately — no process redeploy needed
  • push-process validates all {{env_var[@name]}} references: if the variable does not exist in the stage, deployment fails with an error

Common pitfalls

MistakeCorrect approach
{{env_var[payment-url]}} — missing @{{env_var[@payment-url]}} — @ is required
{{env_var[@Payment-URL]}} — uppercase{{env_var[@payment-url]}} — always lowercase
Storing secrets as visible variablesUse env_var_type: "secret" for tokens and passwords
Trying to read a secret variable in a Code nodeSecret variables are only accessible from api (API Call) nodes
Duplicate variable creationAlways read _ENV_VARS_.json or call the list API first
Renaming short_name without updating process filesGrep all .conv.json, update references, push each changed process
Deleting a variable used by active processespush-process will fail; remove all references first
Passing large JSON config as raw stringUse data_type: json for structured values

Reference Documents

PathWhen to read
${CLAUDE_PLUGIN_ROOT}/docs/variables-guide.mdNaming rules and usage examples (quick reference)
${CLAUDE_PLUGIN_ROOT}/docs/nodes/set-parameters-node.mdHow set_param feeds variables into task data for Code nodes
${CLAUDE_PLUGIN_ROOT}/docs/nodes/api-call-node.mdHow variables are used in URL, headers, and body fields
${CLAUDE_PLUGIN_ROOT}/docs/process/process-json-validation.mdHow push-process validates {{env_var[@name]}} references

Frequently asked questions

What does the Corezoid Variable Manager AI skill do?

Manages Corezoid environment variables (env_var) — create, list, modify, delete, and use variables in process JSON. Activate when the user mentions "variable", "env var", "environment variable", "secret", "create variable", "list variables", "delete variable", "modify variable", "env_var", "{{env_var", or asks how to store a URL, token, API key, or any constant that should not be hardcoded in a process. Also activate when a process references {{env_var[@name]}} and the variable does not exist yet.

Why use Corezoid Variable Manager on TypingMind?

Because you install it once and use it with any model. Corezoid Variable Manager is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Corezoid Variable Manager in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/corezoid/corezoid-ai-plugin/tree/main/plugins/corezoid/skills/corezoid-variable-manager. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Corezoid Variable Manager?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Corezoid Variable Manager?

As many as you like. As long as a model supports skills, you can use Corezoid Variable Manager with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Corezoid Variable Manager AI skill free?

Yes. It is published on GitHub by corezoid under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇