# RegiaBI apps (npm · @bicharts/chart-mcp)

AI Data Components over MCP: working what-if apps, interactive tables and maps, plus 90 chart types.

- Trust score: 78/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@bicharts/chart-mcp`: 78/100 (this document), [markdown](https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp.md), [page](https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp)

## Channel facts

- Registry: `npm`
- Package: `@bicharts/chart-mcp`
- Version: `0.6.114`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Licence could not be checked: the licence is shipped as a file inside the package, not declared as a standard (SPDX) licence identifier, so we cannot tell whether it is OSI-approved.
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 51/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 13954 tokens (~1268/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
  - Structured output schemas are declared (27% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the RegiaBI apps MCP server?

RegiaBI apps runs locally as an npm package, launched with npx -y @bicharts/chart-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add com-regiabi-chart-mcp -- npx -y @bicharts/chart-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "com-regiabi-chart-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@bicharts/chart-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-regiabi-chart-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@bicharts/chart-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add com-regiabi-chart-mcp -- npx -y @bicharts/chart-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-regiabi-chart-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@bicharts/chart-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-regiabi-chart-mcp --command npx --arg -y --arg @bicharts/chart-mcp
```

### Hermes

```yaml
mcp_servers:
  com-regiabi-chart-mcp:
    command: "npx"
    args: ["-y", "@bicharts/chart-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "com-regiabi-chart-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@bicharts/chart-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-regiabi-chart-mcp -t stdio -c npx -a -y @bicharts/chart-mcp
```

### Other

```json
{
  "mcpServers": {
    "com-regiabi-chart-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@bicharts/chart-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 78, +12)

- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → pass
- [functional] Package version: 0.6.113 → 0.6.114

### 2026-11-04 (score 66, −12)

- [security regression] Known CVEs: pass → unverified
- [security regression] Stability: pass → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Dependency health: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.6.111 → 0.6.113
- [functional] Package version: 0.6.111 → 0.6.112

### 2026-11-03 (score 78, +27)

- [security improvement] Malware scan: unverified → pass
- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → pass

### 2026-11-02 (score 51, −27)

- [security regression] Known CVEs: pass → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Dependency health: pass → unverified
- [functional] Package version: 0.6.108 → 0.6.111
- [functional] Package version: 0.6.93 → 0.6.110
- [functional] Package version: 0.6.108 → 0.6.109

### 2026-11-01 (score 78, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-31 (score 63, −15)

- [security regression] Malware scan: pass → unverified
- [functional regression] Security disclosure: fail → unverified
- [functional] Package version: 0.6.105 → 0.6.108
- [functional] Package version: 0.6.105 → 0.6.107

### 2026-10-29 (score 78, +1)

- [security] Stability: 0.97 → pass

### 2026-10-28 (score 77, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (11)

### `assess_data_shape` (~552 tokens)

Assess data shape

Profile a dataset locally (no data leaves the machine): per-column types, cardinality, ranges, measure/dimension roles, temporal/ordinal detection, and cross-column signals (nesting, shared values, association). This is the same measurement engine the BIC Power BI visual uses before generating a chart.

Input parameters:

- `csv_path` (string): Path to a CSV file (header row required).
- `csv_text` (string): Inline CSV text (alternative to csv_path).
- `culture` (string): The caller's language and region as a BCP 47 tag such as 'de-DE', 'fr' or 'ja-JP'. Default 'en-US'. It is the language the chart's own text is written in (titles, axis labels, legends, notes), and it…
- `data` (object): A pre-typed {columns, rows} table — the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidel…
- `descriptions` (object): Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.
- `dimensions` (array): Columns to treat as DIMENSIONS (a PBI category/axis well — fields to group/break by). Use for numeric codes/years that should NOT be aggregated.
- `formats` (object): Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.
- `group_by` (array): Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.
- `measures` (array): Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.
- `non_additive` (array): MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.
- `privacy_level` (string): How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.

### `get_guide` (~156 tokens)

Read the build guide

How to build an app with these charts, from the guide this package ships. Local and free: no network, no credentials. topic 'fabric-app' (the default) is what a Microsoft Fabric App on the Rayfin data app template needs: what to pull, generating, wiring in React, the Fabric App section and the time-savers. 'all' is the whole guide, including Blazor. 'chart-shapes' lists every chart type with the columns, limits and renderers it needs. 'settings' lists the choices a person can make about a chart, with their options and defaults.

Input parameters:

- `topic` (string): 'fabric-app' (default), 'all', 'chart-shapes', or 'settings'.

### `list_eligible_charts` (~1572 tokens)

List eligible chart types

The AUTHORITATIVE list of chart types (maps, tables a reader works with and app widgets included) that can render this dataset — the server's own eligibility engine, NOT a local guess. Profiles the data locally, then sends that profile to the backend. NO LLM in the loop, but this is a NETWORK call and it is METERED — see the licensing note below. By default the tool DETECTS the project's language (JS/TS vs Python from the working dir) and returns the charts for THAT language, SCOPED and ordered by how well each type fits this data (best first; `order: 'variety'` favors newer and less-common types instead), each tagged with its source language and renderer. Pass `language` ('javascript'|'python') to force it, or `renderer` ('D3'/'PLOTLY'/…) to rank one specific renderer, or renderer '' for the full renderer-agnostic eligibility across ALL renderers (also ranked, by chart type alone, with no renderer/language tag). If the language can't be auto-detected and none is given, the tool asks you to specify one. Needs an account: eligibility IS the engine, so programmatic access to it is licensed. With nothing configured, the first call opens a browser sign-in, waits for it and then answers (a license key in the environment is the alternative for a machine with no browser). Free within a generous hourly allowance; beyond it each call draws usage credits. The reply carries a text block and a structured table: one row per chart type with its rank, name, preview flag, fit verdict, description, language and renderer. Rows flagged alsoWorthALook are a few picks from below the top fits, drawn so an offer can include something different; the fit order itself never changes.

Input parameters:

- `chart_style` (string): The user's own preference for which family of charts the list covers, as they've stated it. 'traditional' lists only the familiar forms (bar, stacked and grouped bar, line, area, pie, donut, card, ga…
- `csv_path` (string): Path to a CSV file (header row required).
- `csv_text` (string): Inline CSV text (alternative to csv_path).
- `culture` (string): The caller's language and region as a BCP 47 tag such as 'de-DE', 'fr' or 'ja-JP'. Default 'en-US'. It is the language the chart's own text is written in (titles, axis labels, legends, notes), and it…
- `data` (object): A pre-typed {columns, rows} table — the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidel…
- `descriptions` (object): Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.
- `dimensions` (array): Columns to treat as DIMENSIONS (a PBI category/axis well — fields to group/break by). Use for numeric codes/years that should NOT be aggregated.
- `formats` (object): Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.
- `group_by` (array): Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.
- `height` (number): Viewport height px (default 600).
- `language` (string): Project source language → the server ranks across that language's renderers (javascript/typescript = D3, python = Plotly/matplotlib). Omit to AUTO-DETECT from the working dir; `renderer` (if given) o…
- `level_of_detail` (string): The user's own preference for how much of the data to see, as they've stated it. 'High' = every observation as its own mark, 'Medium' = every row shown as a distribution, 'Low' = one mark per categor…
- `measures` (array): Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.
- `name_filter` (string): Show only chart types matching this text (the same matcher the Power BI and Excel chart-type lists use). Three tiers, first non-empty one wins outright: the term starting a WORD in the name ('gan' ->…
- `name_filter_match` (string): How name_filter matches a name. 'loose' (the default) ignores accents, case, spaces and punctuation, so 'barchart' finds Bar chart. 'exact' folds accents and case and collapses repeated spaces, and n…
- `non_additive` (array): MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.
- `order` (string): How the list is ordered. 'fit' (the default) = by how well each chart type fits THIS data, nothing else - use it to choose a chart for a question. 'variety' = the picker's selection order, which favo…
- `privacy_level` (string): How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.
- `project_dir` (string): Directory to auto-detect the project language from (default: the folder setup_fabric_app used, else the working directory or the one project folder directly inside it).
- `renderer` (string): Force a specific renderer (overrides `language`): a concrete renderer ranks that renderer's charts; '' = the full renderer-agnostic eligibility (all renderers, ranked by chart type alone). Omit to us…
- `top` (number): Show only the top-N ranked results. Omit for all.
- `width` (number): Viewport width px (default 800) — affects small-viewport / facet-budget gates.

Output parameters:

- `charts` (array): One row per chart type, in the order issued.
- `eligibleCount` (number): How many chart types can render this data before any name_filter or top.
- `filter`: The name_filter applied, or null.
- `metering` (string): What this call cost, in the words the text block states it in.
- `order` (string): The order the rows are in: by fit to this data, or the picker's selection order.
- `shown` (number): How many rows this answer carries.

### `generate_chart` (~2888 tokens)

Generate chart code

Generate ready-to-render chart code for a dataset via the BIC backend: the data shape is profiled locally, the backend picks a suitable chart type (or honors chart_type), and returns code that has passed the backend's eligibility gates and quality checks. Needs a trial or paid account: with nothing configured, the first call opens a browser sign-in, waits for it and then finishes the chart (a license key in the environment or ~/.bic/credentials.json is the alternative for a machine with no browser). The returned D3 code is a portable render(container, data, options) function meant to be MERGED into your own app; an integration contract describes exactly how to call it. A standalone HTML preview and file output are optional. The arguments chart_style, level_of_detail and culture are the person's choices, and the guide's 'settings' topic lists every choice a person can make with its options.

Input parameters:

- `chart_style` (string): Narrows the charts considered to one family: 'traditional' = the familiar forms (bar, stacked and grouped bar, line, area, pie, donut, card, gauge), 'non_traditional' = every other chart type. A char…
- `chart_type` (string): Preferred chart type by name (honored unless the data shape disqualifies it). A form the person described (a map, bars) counts as named: pass the listed type of that form.
- `chart_variety` (number): How much variety the person asks for: the probability, from 0 to 1, that the choice among the charts that fit this data is nudged toward a less conventional one, when the engine runs its planning pas…
- `compactness` (string): How roomy the person wants the chart: 'spacious' = roomier margins and more aggressive aggregation of a high-cardinality column, 'balanced' = standard margins and label density, 'compact' = tighter m…
- `csv_path` (string): Path to a CSV file (header row required).
- `csv_text` (string): Inline CSV text (alternative to csv_path).
- `culture` (string): The caller's language and region as a BCP 47 tag such as 'de-DE', 'fr' or 'ja-JP'. Default 'en-US'. It is the language the chart's own text is written in (titles, axis labels, legends, notes), and it…
- `data` (object): A pre-typed {columns, rows} table — the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidel…
- `data_labels` (string): Whether the person wants the value printed on each mark: 'include' asks for the labels, 'exclude' for none. Per-mark labels are suppressed when more than 30 marks would carry one. Unset: the engine d…
- `date_grain` (string): The time grain the person asks for on the time axis: day, week, month, quarter, year or decade. It is passed on as a strong request, and a different bucket the engine plans is rewritten to it when th…
- `derived_measures` (string): Whether the person allows derived measures (ratios, z-scores, percent change, rank, index): 'discourage' keeps the chart to the raw columns (aggregations and sorts still apply); 'encourage' keeps the…
- `descriptions` (object): Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.
- `dimensions` (array): Columns to treat as DIMENSIONS (a PBI category/axis well — fields to group/break by). Use for numeric codes/years that should NOT be aggregated.
- `direction_of_good` (object): Which way is good for each measure the chart judges, by its column name as sent: { "Bookings": "higher", "Cost": "lower" }. The person's own answer; unset when they haven't given one, and the engine…
- `font_family` (string): The font family the person names for the chart's own text (titles, axis labels, tick labels, legends), or the one their house style says: a family such as 'Segoe UI' or a stack such as 'Segoe UI, Ari…
- `forbid_derived_columns` (boolean): True = show only fields present in the data (plus required_columns) — no per-capita, share-of-total, index, rank or z-score columns the engine would otherwise add. Use when your app owns the analytic…
- `formats` (object): Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.
- `group_by` (array): Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.
- `group_others` (boolean): Whether the person allows the categories beyond a limit to be grouped into one 'Others' bucket. True is the same as unset: under a limit the rest is grouped and the total stays whole; with no limit t…
- `height` (number)
- `in_chart_caption` (boolean): Whether the person asks for a one-line subtitle under the chart title naming the chart type, any derived measure used and any non-default aggregation. Unset or false: none.
- `include_code` (boolean): Include the full code in the response — governs BOTH the text block and structuredContent.code. Default: true, or FALSE when out_dir is given (the code is then already on disk, and a large chart's co…
- `industry` (string): The industry the person names for the data, one of the listed values. A recognized metric name is used only when the columns are that industry's inputs for it. Unset: no industry context is added.
- `language` (string): Project source language: with no concrete `renderer`, javascript/typescript generates D3 (the renderer @bicharts/chart-host draws) and python lets the backend auto-pick within Plotly/matplotlib. Omit…
- `legend_placement` (string): Where the person wants the legend: 'outside' = in the chart margin, 'inside' = within the plot area where it overlaps the data least, 'none' = no standalone legend (the chart's own labels carry the n…
- `level_of_detail` (string): The user's own preference for how much of the data to see, as they've stated it; it isn't a property of the data. 'High' = every observation drawn as its own mark (scatter, beeswarm, strip). 'Medium'…
- `limit_count` (integer): How many groups or categories the person asks to keep, from 1 to 10000. The engine keeps exactly that many by the measure, and its own Top-N, 'Other'-cap and cardinality rules yield to it. Unset: no…
- `limit_to` (string): The subset the person asks for, passed on as an authoritative instruction to limit to or focus on exactly it: 'latest', 'top' (top / greatest), 'bottom' (bottom / smallest), 'most_common' or 'outlier…
- `measures` (array): Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.
- `model` (string): Model code; empty = backend default.
- `non_additive` (array): MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.
- `others_label` (string): The name the person gives the 'Others' bucket, at most 40 characters; quotes, backticks and control characters are removed and longer text is cut. Unset: 'Other'. Not sent when group_others is false.
- `out_dir` (string): Optional directory to write chart.js/py, a data.sample.json, and (if preview_html) preview.html.
- `overlay` (string): The analytical layer the person asks for: 'moving_avg' = moving average, 'trend_line' = trend / regression line, 'anomaly' = anomaly highlights, 'confidence_band' = confidence band, 'forecast' = fore…
- `preview_html` (boolean): Also emit a standalone D3 preview (needs out_dir). Default false — the code is meant to be merged, not run as an index.html.
- `privacy_level` (string): How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.
- `project_dir` (string): Directory to auto-detect the project language from (default: the folder setup_fabric_app used, else the working directory or the one project folder directly inside it).
- `prompt` (string): Freeform guidance for the generation — the same 'user commentary' lane the Power BI visual uses. Steer encoding/axes/emphasis in plain language, e.g. 'put Year on the x-axis, color by Division', 'ren…
- `reasoning_mode` (string): LLM pass structure; empty = backend heuristic.
- `renderer` (string): Force a specific renderer (overrides `language`). Omit to use `language`/auto-detection; 'VISUAL'/'' = let the backend choose.
- `required_columns` (array): Fields that MUST be visible in the output, each as its own column/channel. AUTHORITATIVE and VERIFIED: if the generated code never references one, the server regenerates automatically rather than ret…
- `rows_policy` (string): 'auto' (default) = the engine decides how to summarize. 'all' = render EXACTLY one mark/row per source row, with no Top-N, no 'Other' rollup and no sampling. Use 'all' when your app depends on every…
- `show_title` (boolean): Whether the person wants a title inside the chart: true asks for a concise one, false asks for none. A yes or no, not the title's text. Unset: one narrower than 400 px or shorter than 300 px gets non…
- `width` (number)
- `wrap` (string): Code form: 'none' (default) = the raw render() function to merge; 'esm' = same code plus `export { render };` so the file can be `import`ed. Both forms are accepted everywhere - @bicharts/chart-host…

Output parameters:

- `binding` (object): How `data` was built from your rows. Hand all three to @bicharts/chart-host - <BicChartGroup geo point destination> or createChartGroup(columns, rows, { geo, point, destination }) - and it builds the…
- `build` (string): MCP server build stamp — the bundle actually serving this call.
- `capabilities` (object): What the server declares the host may do with this chart, beside chartName. Absent when the chart has no capability: a chart type that declares none, a language other than D3, or an older server.
- `chartName` (string): The chart type the backend produced.
- `code` (string): The render() source. Omitted when include_code is false.
- `codeSummary` (string): The backend's own one-line description of what it built.
- `correlationId` (string): Ties this generation to the server-side log; it is what a support request quotes.
- `creditCost` (number|null): Credits billed, when the server reported them.
- `data`: The render payload {columns, rows, …} to hand render() — INCLUDING any __geoIso__/__geoLat__/__geoLon__ columns the caller cannot reconstruct. Present only when out_dir was NOT given; otherwise read…
- `dropLines` (object): A 3D scatter's optional hover drop lines (a line from a hovered point to each back wall). requested: on, because the request asked; on/off: the user's answer, already applied to the generated compone…
- `files` (object): Absolute paths written, when out_dir was given.
- `geo`: Region/basemap wiring; null for non-geo charts.
- `geoPoint`: Point-geocoding outcome (a route's ORIGIN end when geoPointDest is present). `placed` counts only rows with a coordinate: neither an unplaced nor an ambiguous name is plotted. Null when the chart geo…
- `geoPointDest` (object): A route's DESTINATION end (an origin-destination flow map), geocoded apart from geoPoint, which is then the origin. `placed` counts only rows with a destination coordinate: neither an unplaced nor an…
- `hostContract` (string): Host contract version the code targets; a host on a different MAJOR may not interoperate.
- `improvementSuggestion` (string): Present when the server has a note on how this chart was made: for example, that it is the standard version of the chart type because the tailored one didn't pass a quality check. It is meant for the…
- `integrationContract` (string): HOW TO RUN THIS CHART IN YOUR APP - the same integration contract the text block carries, here because a host that shows the model only this structured result would otherwise never see it: the payloa…
- `language` (string): Renderer/language of the code (D3, PYTHON, …).
- `optionsRead` (array): The option names THIS chart's code reads (sorted). A chart honors nothing it does not read, so a live restyle - host.setOptions({...}), never a regeneration - can only move these. Some are the host's…
- `outputHash` (string): The server's identity for this exact code: the same code always carries the same hash, which names the delivered code in a support request or a later report. Absent when the server sent none.
- `recoveredAfterMs` (number): Present when the response stream was cut after the server accepted the request and this chart was then fetched back by its correlation: milliseconds from the start of the call to delivery. creditCost…
- `requiredD3Plugins` (array): D3 plugin PACKAGES this code calls (e.g. ["d3-sankey"]) — install them and pass the host ONE d3 that carries them, built with assembleD3(d3, { ...plugins }) from @bicharts/chart-host (assigning onto…
- `settings` (object): WHICH SETTINGS APPLIED to this chart and where each value came from, so a person can be told what was assumed. Present on every generation.
- `userTextCut` (object): Present when the prompt was longer than a RegiaBI plan reads (1000 characters; an account that brings its own model has no limit), so its tail never reached the model. Absent otherwise.
- `version` (number): Server-side version number of this generation.
- `warningMessage` (string): Present when what was drawn differs from what was requested: a chart type that was overruled (it names the requested type, the reason and what was drawn instead), or an ask this data couldn't honor i…

### `preview_request` (~2797 tokens)

Preview what a request sends

Shows exactly what a chart generation would send to the BIC backend for these arguments - the measured shape of your data (column names, types, counts, ranges), the settings, and whether any sample rows travel - with the credentials removed. SENDS NOTHING and needs no license: it is local and free. Takes the same arguments as a generation. It answers 'what data leaves my machine?'; the eligibility list sends a subset of the same shape.

Input parameters:

- `chart_style` (string): Narrows the charts considered to one family: 'traditional' = the familiar forms (bar, stacked and grouped bar, line, area, pie, donut, card, gauge), 'non_traditional' = every other chart type. A char…
- `chart_type` (string): Preferred chart type by name (honored unless the data shape disqualifies it). A form the person described (a map, bars) counts as named: pass the listed type of that form.
- `chart_variety` (number): How much variety the person asks for: the probability, from 0 to 1, that the choice among the charts that fit this data is nudged toward a less conventional one, when the engine runs its planning pas…
- `compactness` (string): How roomy the person wants the chart: 'spacious' = roomier margins and more aggressive aggregation of a high-cardinality column, 'balanced' = standard margins and label density, 'compact' = tighter m…
- `csv_path` (string): Path to a CSV file (header row required).
- `csv_text` (string): Inline CSV text (alternative to csv_path).
- `culture` (string): The caller's language and region as a BCP 47 tag such as 'de-DE', 'fr' or 'ja-JP'. Default 'en-US'. It is the language the chart's own text is written in (titles, axis labels, legends, notes), and it…
- `data` (object): A pre-typed {columns, rows} table — the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidel…
- `data_labels` (string): Whether the person wants the value printed on each mark: 'include' asks for the labels, 'exclude' for none. Per-mark labels are suppressed when more than 30 marks would carry one. Unset: the engine d…
- `date_grain` (string): The time grain the person asks for on the time axis: day, week, month, quarter, year or decade. It is passed on as a strong request, and a different bucket the engine plans is rewritten to it when th…
- `derived_measures` (string): Whether the person allows derived measures (ratios, z-scores, percent change, rank, index): 'discourage' keeps the chart to the raw columns (aggregations and sorts still apply); 'encourage' keeps the…
- `descriptions` (object): Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.
- `dimensions` (array): Columns to treat as DIMENSIONS (a PBI category/axis well — fields to group/break by). Use for numeric codes/years that should NOT be aggregated.
- `direction_of_good` (object): Which way is good for each measure the chart judges, by its column name as sent: { "Bookings": "higher", "Cost": "lower" }. The person's own answer; unset when they haven't given one, and the engine…
- `font_family` (string): The font family the person names for the chart's own text (titles, axis labels, tick labels, legends), or the one their house style says: a family such as 'Segoe UI' or a stack such as 'Segoe UI, Ari…
- `forbid_derived_columns` (boolean): True = show only fields present in the data (plus required_columns) — no per-capita, share-of-total, index, rank or z-score columns the engine would otherwise add. Use when your app owns the analytic…
- `formats` (object): Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.
- `group_by` (array): Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.
- `group_others` (boolean): Whether the person allows the categories beyond a limit to be grouped into one 'Others' bucket. True is the same as unset: under a limit the rest is grouped and the total stays whole; with no limit t…
- `height` (number)
- `in_chart_caption` (boolean): Whether the person asks for a one-line subtitle under the chart title naming the chart type, any derived measure used and any non-default aggregation. Unset or false: none.
- `include_code` (boolean): Include the full code in the response — governs BOTH the text block and structuredContent.code. Default: true, or FALSE when out_dir is given (the code is then already on disk, and a large chart's co…
- `industry` (string): The industry the person names for the data, one of the listed values. A recognized metric name is used only when the columns are that industry's inputs for it. Unset: no industry context is added.
- `language` (string): Project source language: with no concrete `renderer`, javascript/typescript generates D3 (the renderer @bicharts/chart-host draws) and python lets the backend auto-pick within Plotly/matplotlib. Omit…
- `legend_placement` (string): Where the person wants the legend: 'outside' = in the chart margin, 'inside' = within the plot area where it overlaps the data least, 'none' = no standalone legend (the chart's own labels carry the n…
- `level_of_detail` (string): The user's own preference for how much of the data to see, as they've stated it; it isn't a property of the data. 'High' = every observation drawn as its own mark (scatter, beeswarm, strip). 'Medium'…
- `limit_count` (integer): How many groups or categories the person asks to keep, from 1 to 10000. The engine keeps exactly that many by the measure, and its own Top-N, 'Other'-cap and cardinality rules yield to it. Unset: no…
- `limit_to` (string): The subset the person asks for, passed on as an authoritative instruction to limit to or focus on exactly it: 'latest', 'top' (top / greatest), 'bottom' (bottom / smallest), 'most_common' or 'outlier…
- `measures` (array): Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.
- `model` (string): Model code; empty = backend default.
- `non_additive` (array): MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.
- `others_label` (string): The name the person gives the 'Others' bucket, at most 40 characters; quotes, backticks and control characters are removed and longer text is cut. Unset: 'Other'. Not sent when group_others is false.
- `out_dir` (string): Optional directory to write chart.js/py, a data.sample.json, and (if preview_html) preview.html.
- `overlay` (string): The analytical layer the person asks for: 'moving_avg' = moving average, 'trend_line' = trend / regression line, 'anomaly' = anomaly highlights, 'confidence_band' = confidence band, 'forecast' = fore…
- `preview_html` (boolean): Also emit a standalone D3 preview (needs out_dir). Default false — the code is meant to be merged, not run as an index.html.
- `privacy_level` (string): How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.
- `project_dir` (string): Directory to auto-detect the project language from (default: the folder setup_fabric_app used, else the working directory or the one project folder directly inside it).
- `prompt` (string): Freeform guidance for the generation — the same 'user commentary' lane the Power BI visual uses. Steer encoding/axes/emphasis in plain language, e.g. 'put Year on the x-axis, color by Division', 'ren…
- `reasoning_mode` (string): LLM pass structure; empty = backend heuristic.
- `renderer` (string): Force a specific renderer (overrides `language`). Omit to use `language`/auto-detection; 'VISUAL'/'' = let the backend choose.
- `required_columns` (array): Fields that MUST be visible in the output, each as its own column/channel. AUTHORITATIVE and VERIFIED: if the generated code never references one, the server regenerates automatically rather than ret…
- `rows_policy` (string): 'auto' (default) = the engine decides how to summarize. 'all' = render EXACTLY one mark/row per source row, with no Top-N, no 'Other' rollup and no sampling. Use 'all' when your app depends on every…
- `show_title` (boolean): Whether the person wants a title inside the chart: true asks for a concise one, false asks for none. A yes or no, not the title's text. Unset: one narrower than 400 px or shorter than 300 px gets non…
- `width` (number)
- `wrap` (string): Code form: 'none' (default) = the raw render() function to merge; 'esm' = same code plus `export { render };` so the file can be `import`ed. Both forms are accepted everywhere - @bicharts/chart-host…

### `check_request` (~2741 tokens)

Check a chart request against the data

Checks a chart request against this data before anything is generated. Takes the same arguments as a generation - the chart type and every setting (date grain, limit, overlay, required columns, rows policy, data labels and the rest) - and answers, in the server's own words, each ask this data can't honor and why: a channel the data doesn't have, too little of one for the ask, or a name the catalog doesn't know. When the chart type itself is denied, it also lists up to five chart types that fit this data, best fit first. An OK names the asks it checked. Profiles the data locally and sends that profile, as a generation would; no sample rows travel. NO LLM in the loop and no generation credits are spent, but this is a NETWORK call and it is METERED like the eligibility list: free within a generous hourly allowance, then usage credits per call. Needs an account: with nothing configured, the first call opens a browser sign-in (a license key in the environment is the alternative). The reply carries a text block and a structured result: the verdict (OK or DENY), the asks checked, each finding with its kind and reason, and the alternatives.

Input parameters:

- `chart_style` (string): Narrows the charts considered to one family: 'traditional' = the familiar forms (bar, stacked and grouped bar, line, area, pie, donut, card, gauge), 'non_traditional' = every other chart type. A char…
- `chart_type` (string): Preferred chart type by name (honored unless the data shape disqualifies it). A form the person described (a map, bars) counts as named: pass the listed type of that form.
- `chart_variety` (number): How much variety the person asks for: the probability, from 0 to 1, that the choice among the charts that fit this data is nudged toward a less conventional one, when the engine runs its planning pas…
- `compactness` (string): How roomy the person wants the chart: 'spacious' = roomier margins and more aggressive aggregation of a high-cardinality column, 'balanced' = standard margins and label density, 'compact' = tighter m…
- `csv_path` (string): Path to a CSV file (header row required).
- `csv_text` (string): Inline CSV text (alternative to csv_path).
- `culture` (string): The caller's language and region as a BCP 47 tag such as 'de-DE', 'fr' or 'ja-JP'. Default 'en-US'. It is the language the chart's own text is written in (titles, axis labels, legends, notes), and it…
- `data` (object): A pre-typed {columns, rows} table — the shape a Fabric DAX query / dataframe already has. Alternative to csv_path/csv_text; when columns carry isMeasure/format/description the shape matches PBI fidel…
- `data_labels` (string): Whether the person wants the value printed on each mark: 'include' asks for the labels, 'exclude' for none. Per-mark labels are suppressed when more than 30 marks would carry one. Unset: the engine d…
- `date_grain` (string): The time grain the person asks for on the time axis: day, week, month, quarter, year or decade. It is passed on as a strong request, and a different bucket the engine plans is rewritten to it when th…
- `derived_measures` (string): Whether the person allows derived measures (ratios, z-scores, percent change, rank, index): 'discourage' keeps the chart to the raw columns (aggregations and sorts still apply); 'encourage' keeps the…
- `descriptions` (object): Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.
- `dimensions` (array): Columns to treat as DIMENSIONS (a PBI category/axis well — fields to group/break by). Use for numeric codes/years that should NOT be aggregated.
- `direction_of_good` (object): Which way is good for each measure the chart judges, by its column name as sent: { "Bookings": "higher", "Cost": "lower" }. The person's own answer; unset when they haven't given one, and the engine…
- `font_family` (string): The font family the person names for the chart's own text (titles, axis labels, tick labels, legends), or the one their house style says: a family such as 'Segoe UI' or a stack such as 'Segoe UI, Ari…
- `forbid_derived_columns` (boolean): True = show only fields present in the data (plus required_columns) — no per-capita, share-of-total, index, rank or z-score columns the engine would otherwise add. Use when your app owns the analytic…
- `formats` (object): Per-column number/date FORMAT STRING (e.g. {"Revenue":"$#,##0","Margin":"0.0%"}). PBI supplies these from its model; a CSV can't, so provide them to steer number formatting.
- `group_by` (array): Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.
- `group_others` (boolean): Whether the person allows the categories beyond a limit to be grouped into one 'Others' bucket. True is the same as unset: under a limit the rest is grouped and the total stays whole; with no limit t…
- `height` (number)
- `in_chart_caption` (boolean): Whether the person asks for a one-line subtitle under the chart title naming the chart type, any derived measure used and any non-default aggregation. Unset or false: none.
- `industry` (string): The industry the person names for the data, one of the listed values. A recognized metric name is used only when the columns are that industry's inputs for it. Unset: no industry context is added.
- `language` (string): Project source language: with no concrete `renderer`, javascript/typescript generates D3 (the renderer @bicharts/chart-host draws) and python lets the backend auto-pick within Plotly/matplotlib. Omit…
- `legend_placement` (string): Where the person wants the legend: 'outside' = in the chart margin, 'inside' = within the plot area where it overlaps the data least, 'none' = no standalone legend (the chart's own labels carry the n…
- `level_of_detail` (string): The user's own preference for how much of the data to see, as they've stated it; it isn't a property of the data. 'High' = every observation drawn as its own mark (scatter, beeswarm, strip). 'Medium'…
- `limit_count` (integer): How many groups or categories the person asks to keep, from 1 to 10000. The engine keeps exactly that many by the measure, and its own Top-N, 'Other'-cap and cardinality rules yield to it. Unset: no…
- `limit_to` (string): The subset the person asks for, passed on as an authoritative instruction to limit to or focus on exactly it: 'latest', 'top' (top / greatest), 'bottom' (bottom / smallest), 'most_common' or 'outlier…
- `measures` (array): Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.
- `model` (string): Model code; empty = backend default.
- `non_additive` (array): MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.
- `others_label` (string): The name the person gives the 'Others' bucket, at most 40 characters; quotes, backticks and control characters are removed and longer text is cut. Unset: 'Other'. Not sent when group_others is false.
- `overlay` (string): The analytical layer the person asks for: 'moving_avg' = moving average, 'trend_line' = trend / regression line, 'anomaly' = anomaly highlights, 'confidence_band' = confidence band, 'forecast' = fore…
- `privacy_level` (string): How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.
- `project_dir` (string): Directory to auto-detect the project language from (default: the folder setup_fabric_app used, else the working directory or the one project folder directly inside it).
- `prompt` (string): Freeform guidance for the generation — the same 'user commentary' lane the Power BI visual uses. Steer encoding/axes/emphasis in plain language, e.g. 'put Year on the x-axis, color by Division', 'ren…
- `reasoning_mode` (string): LLM pass structure; empty = backend heuristic.
- `renderer` (string): Force a specific renderer (overrides `language`). Omit to use `language`/auto-detection; 'VISUAL'/'' = let the backend choose.
- `required_columns` (array): Fields that MUST be visible in the output, each as its own column/channel. AUTHORITATIVE and VERIFIED: if the generated code never references one, the server regenerates automatically rather than ret…
- `rows_policy` (string): 'auto' (default) = the engine decides how to summarize. 'all' = render EXACTLY one mark/row per source row, with no Top-N, no 'Other' rollup and no sampling. Use 'all' when your app depends on every…
- `show_title` (boolean): Whether the person wants a title inside the chart: true asks for a concise one, false asks for none. A yes or no, not the title's text. Unset: one narrower than 400 px or shorter than 300 px gets non…
- `width` (number)

Output parameters:

- `alternatives` (array): Up to five chart types that fit this data, best fit first; present only when the chart type itself was denied.
- `checkedAsks` (array): Every ask the request carried that the check evaluated, by argument name.
- `enabled` (boolean): Whether the service ran the check. False: the check is off on this service, or the service has none, and nothing was checked (errorCode says which).
- `errorCode` (string): REQUEST_CHECK_OFF (the check is off on this service), REQUEST_CHECK_UNAVAILABLE (the service has no check), or the service's code for a licence, meter or sign-in refusal.
- `errorMessage` (string): The service's sentence for a refusal, or why nothing was checked.
- `findings` (array): What this data can't honor, absent findings first, then threshold, then unknown.
- `metering` (string): What this call cost, in the words the text block states it in.
- `verdict` (string): OK = this data can honor every ask checked. DENY = at least one finding. Absent when nothing was checked.

### `check_chart` (~527 tokens)

Check a generated chart locally

Verify a generated chart locally before deploying: draws the chart.js that generate_chart wrote, headless, against its data - the rows query_semantic_model saved, a CSV, or the rows it was generated for - through @bicharts/chart-host, and reports in plain words: the marks drawn by kind, anything thrown (with the line), whether it came out blank, anything drawn outside its frame, and whether a click on a mark reaches onSelect with source rows. Takes seconds; local and free (no network, no credentials, nothing sent). Run it after each generate_chart instead of deploying to see whether a chart works, and check at the size the panel will give it: by default it reads minChartWidth and minChartHeight off the app's BicChartPanel around the chart (else the size it was generated for); pass width and height only for another size. A WARNING line is a label cut off at that size even at a narrow font's width; the reply says whether more room fixes it. The app's own legend and frame fit is NOT run in the check, so a label it flags may already be handled in the app. Never edit the generated chart code by hand to clear a finding: regenerate it (generate_chart, with a prompt describing the fix) or report it. It does not judge colors or real font widths.

Input parameters:

- `chart` (string): The chart's folder name under the project's src/charts (the out_dir given to generate_chart), e.g. "region-map".
- `chart_path` (string): Or the path of the chart.js generate_chart wrote, or the folder it is in.
- `csv_path` (string): Or a CSV with the chart's columns.
- `data_name` (string): The name given to query_semantic_model: checks on the rows it saved (.bic/data/<name>.csv). Default: a saved file named like the chart's folder, else the rows the chart was generated for.
- `height` (number): The height in px to check at (default: the minChartHeight of the app's BicChartPanel around this chart, else the height it was generated for, else 600).
- `project_dir` (string): The app's folder. Defaults to the folder setup_fabric_app used, else the working directory or the one project folder inside it.
- `width` (number): The width in px to check at (default: the minChartWidth of the app's BicChartPanel around this chart, else the width it was generated for, else 800).

### `check_app` (~951 tokens)

Check the whole app before deploying

Check how the app uses the chart library, before every deploy and after check_chart: reads the app's own source (never the files generate_chart and setup_fabric_app wrote) and reports, each with file, line and the library call to use instead: hand-written selection glue (a toggle, a second-click guard, a remount to clear) where useBicFilter + selects does it; each chart's filter wiring - the page filter its clicks set and the filters its query or component follows (filtered query, highlight only or none) - with a chart filtered by the filter it sets, a treatAs column the model's relationships can't carry to the panel, or to one of its measures (read from the tables each measure's expression reads) (read from the project's schema cache, .schema/models/*/model.sqlite), a total that isn't the sum of the parts the page shows (a rounding measure at the total), a click filter keyed coarser than the marks that set it, a chart carrying write markers whose query drops rows the write form can target, several charts sharing one click filter, a chart no page filter reaches, and a panel whose filtered query it isn't given; a "vs" measure in the app's .dax queries that is never blank (BLANK() - 1 is -1), and a card that names a window ("2019 to 2025") over a query with no bound on it; a write that stores a placeholder name ("unknown") when no one is signed in or a time from the browser's clock, a Rayfin entity that takes any name on create or lets any row be updated again (rayfin/data), a name shown (createdBy) its policy doesn't check against the caller's token, a write that resolves before its reload lands (so its button comes back on over the old rows), reloads applied out of order, a list that can't tell loading from empty, a form default read once, a due date with no lower bound, a read of every row on every open, a panel with no Retry, a write that only a chart pick can aim (no searchable picker), a list for a picked owner filtered on another owner field than the form save…

Input parameters:

- `check_npm` (boolean): Compare the stack with npm's latest (default true).
- `draw_charts` (boolean): Also draw every chart under src/charts (default true).
- `project_dir` (string): The app's folder. Defaults to the folder setup_fabric_app used, else the working directory or the one project folder inside it.

### `setup_fabric_app` (~459 tokens)

Set up a Fabric App for these charts

Run once in a Microsoft Fabric App scaffolded from Rayfin's data app template, before the first chart: installs @bicharts/chart-host (at this server's version) and d3, adds src/lib/bic-chart-options.ts (the app's Fabric theme as chart options) and src/components/bic-chart-panel.tsx (a chart box that measures itself and shows the query's loading, error and empty states) and .agents/skills/regiabi-charts/SKILL.md (also written to .claude/skills/, where Claude Code reads it), ignores .bic/, and puts every @microsoft/rayfin-* package on npm's latest, the release `rayfin init` installs (run it before rayfin init; every package.json range it changes is listed, and the reply names the Rayfin version installed). Never overwrites a file; the one template file it edits - a vi.mock that fixes the template's own validate-visual test under ESM - is named in the reply, as is the one line of src/main.tsx it points at src/lib/bic-css-theme.ts (the theme without bundling Vega). With features: ["notes"] and/or ["scenarios"] (once Rayfin's data service is on), it also adds finished notes-on-marks and saved-scenario files - the Rayfin entities, registered in rayfin/data/schema.ts, a hook each, a notes dialog and a scenarios panel - built on chart-host's useBicFilter / useBicControls; write none of that by hand. Replies with a worked example that renders a generated chart from a live query.

Input parameters:

- `features` (array): Also add finished files for readers' notes on chart marks ("notes") and saved settings of a chart's own controls ("scenarios", e.g. a What-if chart's rate). Needs Rayfin's data service on (rayfin/dat…
- `project_dir` (string): The Fabric App project folder. Defaults to the working directory, or the one Fabric App folder directly inside it.
- `skip_install` (boolean): Add the files only; don't run npm install.

### `query_semantic_model` (~400 tokens)

Query the semantic model for a chart

In a Microsoft Fabric App built on Rayfin's data app template: runs one chart's DAX query through the project's own tooling - its semantic model's Rayfin connector (rayfin/rayfin.yml), or on the template's older layout its `fabric-app-data` CLI - renames the `Table[Column]` and `[Measure]` headers to plain names (the names the chart.component.tsx that generate_chart writes will match on live rows), saves EVERY row as CSV, reads each column's role, format and description from the model, and profiles the result. Replaces the query, rename, save and profile steps with one call, and returns the arguments to pass to list_eligible_charts and generate_chart. Write the query at the chart's grain (one row per country for a country map). Local: the data goes only where the project's own tooling already sends it, and nothing reaches the chart server.

Input parameters:

- `alias` (string): The semantic model's connector name in rayfin/rayfin.yml (the template's older layout: its alias in fabric.yaml) - the same name the app passes as connection. Needed only when more than one is declar…
- `dax` (string): The chart's DAX query (EVALUATE ...). Or pass dax_file.
- `dax_file` (string): Path to a .dax file holding the query, instead of dax.
- `name` (string, required): A file name for this chart's data, e.g. "region-map" (saved as <name>.csv).
- `out_dir` (string): Where to save the CSV. Defaults to <project_dir>/.bic/data.
- `project_dir` (string): The Fabric App project folder (holds rayfin/rayfin.yml, or fabric.yaml, and node_modules). Defaults to the folder setup_fabric_app used, else the working directory or the one Fabric App folder direct…

### `suggest_charts` (~417 tokens)

Suggest charts for a semantic model

Which charts suit this data? Answers 'what are good chart types for this dataset / model', 'what can I chart here', 'recommend some charts' for a semantic model in a Microsoft Fabric App built on Rayfin's data app template, in ONE call, from the model's real rows: reads its tables, columns, measures and relationships through the project's own tooling (its Rayfin connector, or the older layout's `fabric-app-data` CLI), finds its natural views (measures by place, flows between places, measures over time, measures by category), queries each at its grain, keeps the measures that vary there, and asks the server's eligibility engine what fits each view. Replies view by view with the real counts (rows, places, periods, categories) and the chart types that fit, and saves each view's rows and DAX under .bic/data so generate_chart can build any of them next. Pass `views` to ask about your own groupings. Answer the person from this reply rather than from general knowledge. One eligibility call per view: metered like list_eligible_charts (free within an hourly allowance, usage credits beyond it) and needs the same licence. For one table you already hold, use list_eligible_charts.

Input parameters:

- `alias` (string): The semantic model's connector name in rayfin/rayfin.yml (the template's older layout: its alias in fabric.yaml) - the same name the app passes as connection. Needed only when more than one is declar…
- `project_dir` (string): The Fabric App project folder (holds rayfin/rayfin.yml, or fabric.yaml, and node_modules). Defaults to the folder setup_fabric_app used, else the working directory or the one Fabric App folder direct…
- `top` (integer): How many fitting chart types to name per view (default 6).
- `views` (array): Groupings to ask about instead of the model's own. Omit to let the model's structure decide.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp#diagnostics

## Score history

- 2026-11-05: 78
- 2026-11-04: 66
- 2026-11-03: 78
- 2026-11-02: 51
- 2026-11-01: 78
- 2026-10-31: 63
- 2026-10-30: 78
- 2026-10-29: 78
- 2026-10-28: 77
- 2026-10-27: 62
- 2026-10-26: 76
- 2026-10-25: 76
- 2026-10-24: 75
- 2026-10-23: 49
- 2026-10-22: 75
- 2026-10-21: 63
- 2026-10-20: 59
- 2026-10-19: 73
- 2026-10-18: 73
- 2026-10-17: 72
- 2026-10-16: 72
- 2026-10-15: 71
- 2026-10-14: 36
- 2026-10-13: 36
- 2026-10-12: 36
- 2026-10-11: 36
- 2026-10-04: 62
- 2026-10-03: 35
- 2026-10-02: 46
- 2026-10-01: 45

## Common questions

### What is the RegiaBI apps MCP server?

RegiaBI apps is an MCP server listed in the public MCP registry as com.regiabi/chart-mcp. AI Data Components over MCP: working what-if apps, interactive tables and maps, plus 90 chart types. This page covers its npm package (@bicharts/chart-mcp).

### Is the RegiaBI apps MCP server safe to use?

RegiaBI apps scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the RegiaBI apps MCP server expose?

RegiaBI apps exposes 11 tools: assess_data_shape, get_guide, list_eligible_charts, generate_chart, preview_request, and 6 more. Their descriptions and schemas cost roughly 13,460 tokens of context every time the server is loaded.

### Is the RegiaBI apps MCP server still maintained?

RegiaBI apps is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- npm package: https://www.npmjs.com/package/@bicharts/chart-mcp
- Socket report: https://socket.dev/npm/package/@bicharts/chart-mcp
- Repository: https://github.com/codexguy/regiabi-plugins
- Website: https://bizintelligencechampions.com/regiabi/developers?loc=mcpreg
- Changelog RSS feed: https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-regiabi-chart-mcp/bicharts-chart-mcp
