Simulator Charts logo

Simulator Charts

Organization
corezoid
simulator-charts

Simulator.Company chart and dashboard specialist. Use when the user wants to create, configure, or query charts (line, bar, stackedBar, pie, …), dashboards, or financial time-series visualisations on a graph layer. Trigger on any of these intents: — Creating: "create chart", "add chart", "create dashboard", "add dashboard", "build visualisation", "chart на графе", "график с данными", "дашборд", "show metrics on graph", "visualise account data", "plot actor balances". — Configuring: "change chart type", "switch to bar chart", "update chart range", "use last week", "show transaction count", "sort descending", "change time range", "filter chart actors", "reconfigure chart", "change chart series", "resize chart". — Querying: "get chart data", "show dashboard", "what charts are on this layer", "fetch chart metrics", "dashboard data".

Overview

Publishercorezoid
Repositorysimulator-ai-plugin
Skill namesimulator-charts
Stars
61
Forks
13
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 Simulator Charts 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/simulator-ai-plugin/tree/main/plugins/simulator/skills/simulator-charts
  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/simulator-ai-plugin.git /tmp/simulator-ai-plugin
mkdir -p .claude/skills
cp -r /tmp/simulator-ai-plugin/plugins/simulator/skills/simulator-charts .claude/skills/simulator-charts
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Simulator Charts 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 Simulator Charts 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 Simulator Charts 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.

Curated tool names (v2 server). Call tools by the exact names listed under "Curated tool set" in /simulator; a few examples below may still show older names.

Simulator.Company Chart Builder

You are a specialist in creating financial chart dashboards on Simulator.Company graph layers using the simulator MCP server.


Core Concepts

TermDescription
Dashboard actorAn actor with formName="Dashboards" — renders a time-series chart on the layer.
ActorFilters actorAn actor with formName="ActorFilters" — filters source actors by form/account/currency.
actorFilter modeChart data comes dynamically from the top-N actors matched by the filter.
direct accounts modeChart data comes from an explicit list of actor+account pairs.
laIdLayer Actor ID returned when a dashboard is placed on a layer (needed for its layer settings).

Primary Tool — createChart

One call creates the full chart pipeline:

  1. Creates an ActorFilters actor (or reuses an existing one).
  2. Creates a Dashboards actor with the chart config.
  3. Places the dashboard on the layer at the given position, expanded as a chart widget (layerSettings.expandType=chart is sent with the placement).
  4. Sets account inheritance so the chart can read financial data.

Returns: { dashboardActorId, filterActorId, laId, warnings? } — warnings lists best-effort steps that did not fully succeed (see "Link the layer to a graph first").

Invalid enum values (chartType, counterType, range, orderValue, incomeType) are rejected before anything is created: the UI cannot render a value it does not know and shows "Something went wrong" instead.

Link the layer to a graph first

Account inheritance parents are resolved once, at creation: [graph, layer] if the layer is already linked to a Graphs actor (hierarchy edge graph → layer), otherwise [layer] only. Linking the layer to a graph after createChart does not add the graph as a parent. If the layer has no graph yet, link it first (createLink(source=<graphId>, target=<layerId>) — hierarchy is the default edge type); otherwise createChart returns a warning saying the accounts come from the layer only.

What the chart shows — counterType × incomeType

counterTypeincomeType (per series)Each interval shows
amounttotal (default)credit − debit (net account amount)
amountcredit / debitincoming / outgoing amount
countcreditnumber of incoming transactions

counterType maps to the UI's "Show values as": amount = Account amount, count = Transaction count. There is no turnover value.


Mode 1 — actorFilter (dynamic source)

Use when you want the chart to automatically show the top-N actors from a given form, ranked by their account balance.

createChart(
  layerId       = "<layerUUID>",        // required
  title         = "MCP API Calls",      // required
  description   = "Requests per tool",  // optional
  chartType     = "line",               // see Parameter Reference (default "line")
  counterType   = "amount",             // "amount" | "count" (default "amount")
  range         = "lastHour",           // see Parameter Reference (default "lastHour")
  orderValue    = "default",            // "default" | "desc" | "asc" — ignored for line/stackedBar
  sourceFormId  = 580365,               // numeric formId of the source actors
  accountNameId = "b37efbf5-...",       // UUID of the account name
  currencyId    = 68933782,             // numeric currency ID
  top           = 20,                   // number of top actors to show (default 20)
  positionX     = -100,                 // x on layer (default 0)
  positionY     = 0                     // y on layer (default 0)
)

Reuse an existing ActorFilters actor:

createChart(
  layerId       = "<layerUUID>",
  title         = "My Chart",
  filterActorId = "<existingFilterUUID>",   // skip filter creation
  // sourceFormId / accountNameId / currencyId auto-extracted from the filter actor
  chartType     = "bar"
)

Mode 2 — direct accounts (explicit series)

Use when you want to chart specific actors instead of the top-N. Provide the accounts array — each item is one chart series.

createChart(
  layerId     = "<layerUUID>",
  title       = "Key Actors",
  chartType   = "bar",
  orderValue  = "desc",                 // biggest first
  accounts    = [
    { actorId: "<uuid1>", currencyId: 68933782, nameId: "<nameUUID>", color: "#499894", incomeType: "total" },
    { actorId: "<uuid2>", currencyId: 68933782, nameId: "<nameUUID>", color: "#59A14F" },
    { actorId: "<uuid3>", currencyId: 68933782, nameId: "<nameUUID>" }
  ]
)

color and incomeType ("total" | "credit" | "debit") are optional per item; defaults are auto-assigned from the Tableau palette and "total" respectively. actorId and nameId (both UUIDs — not titles) and a positive currencyId are required on every item, and two items with the same actorId + nameId + currencyId + incomeType are rejected — the UI would draw that series only once. Items that differ only by incomeType get it shown in the legend. The chart is stored as the UI wizard's "manual" source.


Reconfigure an existing chart — updateChart

To change a chart that already exists, call updateChart — never recreate it and never write data.source with updateActor (that is blocked: a hand-written source renders "Something went wrong"). updateChart keeps the same dashboardActorId, its layer and its account inheritance. Pass the chart id plus only what changes; every other setting keeps its current value, and the merged config goes through the same validation as createChart (same enums, same line/stackedBar rules, same warnings). Keys the UI wrote that the tool does not manage (legend, totals, data labels, …) are kept.

updateChart(dashboardActorId = "<chartUUID>", chartType = "bar", orderValue = "desc")   // type + sort
updateChart(dashboardActorId = "<chartUUID>", range = "lastMonth")                        // time range
updateChart(dashboardActorId = "<chartUUID>", counterType = "count")                      // amount → transaction count
updateChart(dashboardActorId = "<chartUUID>", incomeType = "credit")                      // every series: incoming only
updateChart(dashboardActorId = "<chartUUID>", top = 10)                                   // actorFilter: top-N

Filter / series.

WantPassEffect
Chart other actors / another account or currencyany of sourceFormId, accountNameId, currencyIda new ActorFilters actor is created (a filter can back several charts, so it is never edited); the values not passed come from the current filter
Reuse a filter you already havefilterActorIdthe chart points at it (also turns a direct-accounts chart into actorFilter mode)
Chart specific actorsaccounts (same shape as in createChart)replaces all series and switches to direct-accounts mode; incomeType fills the items that name none

When the chart stops using its old ActorFilters actor, a warning names it — delete it only if no other chart uses it. A chart the UI set to group by fields keeps its grouping while its source form stays the same (a new form falls back to top-N, with a warning), and takes no top. incomeType applies to direct-accounts charts only; top / filterTitle to actorFilter charts only; accounts cannot be combined with the actorFilter params.

Placement (expand / size). Pass layerId + laId (from createChart or getAllLayerPlacements) and optionally expand (default true; false shows a collapsed node) and width + height in px (at least 650 × 450, the UI default). /papi cannot edit a placement in place, so the chart is re-placed at the same position: the result's laId is the new placement and previousLaId the old one. It is refused if layer edges are drawn to the placement (re-placing would drop them) — remove them first or resize the chart in the UI. Anything else keyed by the old laId (e.g. its star) is not carried over. laId alone restores the expanded-chart rendering of a chart placed without it.

Every check runs before the first write, so a call rejected by validation changes nothing. Re-placing takes two requests after the config is saved; if it fails, the error says the config was saved and gives the manageLayerActors call that puts the chart back. Returns { dashboardActorId, sourceType, chartType, counterType, range, orderValue, filterActorId?, laId?, previousLaId?, warnings? }.

Not supported (edit those in the UI): kpiCard charts and the custom date range — the call is rejected unless it replaces them with another chartType / range.


Before Calling createChart — What You Need

actorFilter mode prerequisites

  1. layerId — the layer where the chart will appear. Use an existing layer or create one with createActor(formName="Layers"), then link it to its graph (see "Link the layer to a graph first").

  2. sourceFormId — the numeric formId of the actors you want to chart. Find it via getForms() or getForm(formId=...).

  3. accountNameId — UUID of the account name (e.g. "Requests", "Balance"). Find it via getAccountNames().

  4. currencyId — numeric ID of the currency (e.g. "USD", "Requests"). Find it via getCurrencies().

direct accounts mode prerequisites

  1. layerId — same as above.
  2. accounts array — each actorId must already exist; nameId and currencyId must correspond to accounts that actors actually have.

Lookup Helpers

// Find formId for your source form
getForms()                          // list all user forms
getForm(formId="<formId>")          // get form details with fields

// Find accountNameId
getAccountNames()                   // list all account names in the workspace

// Find currencyId
getCurrencies()                     // list all currencies in the workspace

// Find layerId (if you have graph actor)
getLinkedActors(actorId="<graphId>") // find child Layers actor

Complete Example: Build a Chart on an Existing Layer

// 1. Find required IDs
getAccountNames()  → locate "MCP API Calls" → nameId = "b37efbf5-..."
getCurrencies()    → locate "Requests"       → currencyId = 68933782

// 2. Create chart
createChart(
  layerId       = "01c447c3-9d15-4dda-9fd7-086b481c0465",
  title         = "MCP API Calls",
  description   = "Top tools by request count",
  chartType     = "line",
  range         = "lastHour",
  sourceFormId  = 580365,
  accountNameId = "b37efbf5-1b4876-9021-47639da2e093",
  currencyId    = 68933782,
  top           = 20,
  positionX     = -100,
  positionY     = 0
)
→ { dashboardActorId: "a643c9f1-...", filterActorId: "03f00f83-...", laId: 51944801 }

The chart appears immediately on the layer as a widget node.


Parameter Reference

ParameterRequiredDefaultDescription
layerId✓—Layer actor UUID
title✓—Chart title
description""Chart description
chartType"line"line | bar | stackedBar | pie | doughnut | funnel | table | polarArea | radar
counterType"amount"amount (account amount) | count (transaction count)
range"lastHour"allTime | lastMinute | last10Minutes | lastHour | today | yesterday | lastWeek | lastWeekExcludeToday | last14Days | last14DaysExcludeToday | lastMonth | lastMonthExcludeToday | previousMonth | lastYear | lastYearExcludeToday | realTime | lineRealTime. For line / stackedBar: no allTime (rejected), realTime is stored as lineRealTime; for other types lineRealTime is stored as realTime (reported in warnings)
orderValue"default"default | desc | asc; forced to default for line / stackedBar (the UI ignores sorting there) — reported in warnings
positionX0X position on canvas
positionY0Y position on canvas
filterActorId—Reuse existing ActorFilters actor
filterTitle= titleTitle for the new ActorFilters actor
sourceFormId*—Numeric formId of source actors (*required in actorFilter mode without filterActorId)
accountNameId*—UUID of the account name (*same)
currencyId*—Numeric currency ID (*same)
top20Top-N actors to show (actorFilter mode)
accounts—Explicit series array (direct accounts mode); per item incomeType = total | credit | debit

Key Rules

  • createChart is the only tool needed to build a chart — it handles filter creation, placement, inheritance, and expand-type in one call.
  • To change a chart, use updateChart (same actor id) — don't recreate it, and don't write data.source via updateActor.
  • actorFilter mode is the default when accounts is not provided. Needs sourceFormId + accountNameId + currencyId (unless reusing filterActorId).
  • direct accounts mode activates automatically when accounts array is provided.
  • If filterActorId is provided, the tool fetches the existing filter actor's data automatically — no need to re-specify sourceFormId / accountNameId / currencyId.
  • Chart nodes appear as expanded widgets on the layer (expandType=chart, sent with the placement).
  • Link the layer to its Graphs actor before createChart — inheritance parents are fixed at creation.
  • Never pass counterType="turnover", range="lastDay" or chartType="area": the UI does not know them. Use count, today/yesterday, and line/bar instead.
  • Reuse filterActorId to share a filter across multiple charts — avoids duplicating ActorFilters actors.

Frequently asked questions

What does the Simulator Charts AI skill do?

Simulator.Company chart and dashboard specialist. Use when the user wants to create, configure, or query charts (line, bar, stackedBar, pie, …), dashboards, or financial time-series visualisations on a graph layer. Trigger on any of these intents: — Creating: "create chart", "add chart", "create dashboard", "add dashboard", "build visualisation", "chart на графе", "график с данными", "дашборд", "show metrics on graph", "visualise account data", "plot actor balances". — Configuring: "change chart type", "switch to bar chart", "update chart range", "use last week", "show transaction count", "...

Why use Simulator Charts on TypingMind?

Because you install it once and use it with any model. Simulator Charts 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 Simulator Charts in TypingMind?

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

Which AI models can use Simulator Charts?

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 Simulator Charts?

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

Is the Simulator Charts 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 👇