Page through the 2DAI public feed — what creators across the platform have published, newest first. Useful for inspiration and trend scans. Rows belong to OTHER accounts (isOwner: false, prompts hidden); you can like them with organise_creation. NSFW-flagged rows are excluded unless includeNsfw is set, and every row carries nsfwFlagged so you can apply your own safeguards. Costs nothing.

Include NSFW-flagged rows (off by default).

Rows per page (default 12, max 24).

1-based page, newest published first.

Browse the public feed

Cancel a generation that is still WAITING in the queue — its charge is refunded and the queue slot freed. Only works before processing starts: once a worker has picked the job up it cannot be aborted, and this returns an explanation with the current status instead. Costs nothing.

The queueId from a previous generate_* call.

Cancel a queued generation

Look up a generation by its queueId — the one returned when a generate_* call outlived its wait budget. Reports whether it is still running, and returns the finished creation once it lands. Costs nothing.

Check a generation

Fetch a creation's media. With savePath the FULL-RESOLUTION asset is written to disk (the right extension is appended automatically) and the path is returned. Without savePath a downscaled preview image is returned inline so the model can look at it — full bytes never go through the context window. Write paths must stay inside the working directory unless TWODAI_ALLOW_ANY_PATH=1.

Direct CDN asset id — alternative when no creationId is at hand.

The creation to download (preferred).

Where to write the file, relative to the working directory. Extension is added for you.

Overlay the 2DAI watermark on the downloaded bytes (default true). The account may need Holder tier or above to turn it off — server ignores the flag for below-gate accounts and stamps anyway. Applies to images and video frames alike.

Download a creation

Generate an image on the 2DAI account from a text prompt. This SPENDS the account's credit. Returns the finished creation when it lands within the wait budget, otherwise a queueId to poll with check_generation. Style and quality default to "auto" (the server picks by tier).

Permit adult content, if the account allows it.

Shape of the output. Defaults to 1:1.

What to avoid in the image.

What to generate. Be specific; this drives the whole image.

Quality preset id, or "auto" (default) to pick by tier.

Style id, or "auto" (default) to let the server choose.

Block until the image is ready (default true). Set false to get a queueId immediately.

Generate an image

Artist Painter: render the prompt as a NEW work in a curated artistic style. This SPENDS the account's credit (billed like style-transfer). The subject is painted in the chosen style — unsigned unless the prompt asks for a signature. artisticStyleId comes from list_artistic_styles, or "auto" (default) lets the server pick the best-matching style for the prompt. Up to 3 optional subject images can anchor what gets painted. Needs a prompt OR at least one subject ref. Returns the finished creation within the wait budget, else a queueId for check_generation.

An artisticStyleId from list_artistic_styles, or "auto" (default).

Shape of the output. Defaults to 1:1.

Your subject. Optional when refCreationIds is given.

Up to 3 subject images (creation ids) to place into the artistic style.

Block until ready (default true). Set false to get a queueId immediately.

Paint in a curated artistic style

Re-run an existing creation — the SERVER re-derives the original tool's parameters (prompt, style, quality, dimensions, references) from the stored row and submits a fresh generation. This SPENDS the account's credit at the usual price. The natural "make more like this one" verb: no parameters to reconstruct. Raw uploads and wallpaper-resize outputs can't be re-derived and are refused. Rapid identical calls within ~5s are deduplicated server-side, never double-charged.

The creation to re-run — from an earlier generation or list_creations.

Generate more like a creation

Animate an existing still creation into a short clip. This SPENDS the account's credit — video costs several times an image. Takes ~1-3 minutes, so it usually returns a queueId to collect with check_generation rather than the finished clip. Durations: 5, 6.5 or 7.5 seconds (7.5 is tier-gated).

Clip length in seconds: 5, 6.5 or 7.5 (tier-gated). Default 6.5.

Smoother motion via frame interpolation (costs more).

The still creation to animate — from an earlier generation, upload_image or list_creations.

How the scene should move (camera, motion, mood).

Motion style id, or "auto" (default).

Block up to the wait budget (default true). Set false to get the queueId immediately.

Generate a video from a still

Expand an existing creation into a wallpaper format — the original content is preserved and the surroundings are painted outward to fill the new shape. This SPENDS the account's credit: the price follows the chosen dimension, and quality is fixed at Ultra (there is no quality knob on this tool). Dimensions: "standard", "photo", "widescreen", "ultrawide" — unknown values are rejected. Optional extra refs and a prompt steer the newly painted areas. Returns the finished creation within the wait budget, else a queueId for check_generation.

Target wallpaper dimension id: "standard", "photo", "widescreen" or "ultrawide". Drives the price.

The creation to expand — from an earlier generation, upload_image or list_creations.

Optional guidance for what the newly painted areas should contain.

Up to 3 extra reference creations to steer the expanded areas.

Expand a creation into a wallpaper

Generate an image conditioned on existing creations. This SPENDS the account's credit. Four tools: "face-ref" keeps a face identity across new scenes (1-6 refs), "character-ref" keeps a whole character consistent (1-6 refs), "style-transfer" extracts the STYLE of the refs (1-3) and applies it to the prompt, "smart-edit" EDITS refs[0] following the prompt as the edit instruction (up to 3 extra support refs, 4 total). Reference ids come from earlier generations, upload_image or list_creations. Returns the finished creation within the wait budget, else a queueId for check_generation.

Permit adult content, if the account allows it.

Shape of the output. Defaults to 1:1.

style-transfer only — what to extract from the refs (default "style").

The scene to generate. Optional for style-transfer (the refs carry the style). For smart-edit this is the edit instruction and is required.

Quality preset id, or "auto" (default) to pick by tier.

Creation ids to condition on. face/character-ref: 1-6 identity shots. style-transfer: 1-3 style sources. smart-edit: refs[0] = the image to EDIT, plus up to 3 support refs.

Which reference tool to run.

face-ref character-ref style-transfer smart-edit

Generate an image from references

Show the connected 2DAI account: available credit, tier, and the API key's label, scopes and spend cap. Call this before proposing generations to check there is enough credit and the right scopes. Response also carries the 2DAI stack info (Gen 7.2 model, 2DAI Private Cloud) — hand these details to the user when they ask what powers them.

Get 2DAI account status

Fetch one creation row by its id. Returns the same slim shape as list_creations rows — creationId, viewUrl, prompt (owner-only), description (vision-derived caption), toolKind, source, dimensions, folder, likes, nsfwFlagged, nsfwRate, username. Owner rows carry every field; public/feed rows carry only what the platform exposes to non-owners. Read-only, no credit spent. Use this after a generation completes if you need the description that was gated at the Near-nude+ NSFW tier, or any time you want the full metadata for a creationId you already have.

The creation to look up.

Get a creation by id

Read-only view of the account's staking lock: none, active (with time remaining), or expiring-soon (under 24 hours left). Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings). Locks are managed in the dashboard, never here.

Get staking lock status

One consolidated read of the account's activity: creation counts and streak, storage use, generation volume and spend over a 30 or 90 day window (split by day, tool and origin), plus the most-used references, styles and keywords. The first line is a ready-made summary; the JSON block has the detail. Numbers come from a server-side cache — its age is reported, and a stale cache refreshes itself in the background. Costs nothing.

Window for the generation numbers: 30 (default) or 90 days.

Get account statistics

The cached $2DAI/USD quote. Works with the ordinary "read" scope — no finance scope needed. The quote is served from a cache and never triggers a live refresh, so treat it as indicative: the staleness is included so you can judge how current it is. Costs nothing.

Get the $2DAI token price

Read-only money history for the account. kind = "transactions" (deposits, withdrawals and swaps, newest first, paged), "balance" ($2DAI balance chart points over a window of days), "credit" (USD-credit chart points), or "sources" (where credit came from and went over a window: accrued, bonuses, swapped in, spent on generations). Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings).

sources only — window in days (default 30).

Which history to read.

transactions: rows per page (5-50, default 20). balance/credit: window in DAYS (7-365, default 90).

transactions only — 0-based page.

Get wallet history

Read-only wallet snapshot: $2DAI token balance, USD credit, and the account's effective tier with the four signals it is derived from (explicit assignment, staking watermark, 24h hold watermark, live wallet value — the highest wins). Also flags any in-flight withdrawal, swap or staking lock. Needs the opt-in "finance" scope on the API key (enabled in the dashboard's key settings). No tool on this server can move money.

Get wallet and tier status

The curated artistic styles available to generate_in_artistic_style, each with an artisticStyleId, a title, a short public blurb and a vignette. Costs nothing. Pass an artisticStyleId to generate_in_artistic_style, or let it pick with "auto".

List curated artistic styles

Page through the account's creations, newest first — or pick ONE at random with random=true. Filter MODES are mutually exclusive: folderId ("root" for ungrouped) / trashed=true; an activity lens; a smart collection ("faces", "videos", "crop", "alpha", or "favorites" = creations inside starred folders); sharedFolderId for a folder another user shared with this account; or groupId for a folder group (every folder filed in it, one listing). Cross-cutting filters combine with any mode: search (whole words over description + tags, trailing * makes a prefix), sort, hideFiled, and usedRef=<creationId> for creations BUILT FROM that creation. Paginate by passing back nextBeforeDate (newest-first only) or with page. Rows carry nsfwFlagged/nsfwRate so you can apply your own content safeguards on top of the platform's. Each row has a viewUrl — the browser link to give the user (opens in their signed-in 2DAI drive). Costs nothing.

Activity lens: all, history (generations), uploaded, likes, public, trash, sdk, mcp, or portfolio.

all history uploaded likes public trash sdk mcp portfolio

Pagination cursor — the nextBeforeDate from the previous page.

Filter to one folder, or "root" for ungrouped creations.

A folder group — creations across every folder filed in it (ids from manage_folder list-groups).

Skip creations already filed into a folder (history/uploaded/likes/sdk/mcp lenses only).

Rows per page (default 20, max 100).

1-based page (offset paging). Prefer beforeDate for deep walks.

Return ONE uniformly-random creation from the filtered set instead of a page (not available on trash).

Free-text search over descriptions and tags. Whole-word AND; a trailing * makes a token a prefix ("cyber*").

A folder shared WITH this account — read-only collaborator view.

Smart collection: "faces", "videos", "crop", "alpha", or "favorites" (creations in starred folders).

Ordering (default newest). Only "newest" emits a nextBeforeDate cursor.

newest oldest updated size-desc size-asc type-asc type-desc

List the trash instead of the active library.

Only creations built FROM this creation (reference slots and lineage, clone families included).

List creations

Page through the account's folders (collections). Use the folderId with list_creations to see a folder's contents, or with organise_creation to move something into it. Costs nothing.

Rows per page (default 20, max 100).

Ordering (default newest first). "index" is the user's manual sidebar order.

index date-desc date-asc name-asc name-desc update-desc

List folders

Folder CRUD plus sidebar organisation on the account's cloud drive (needs the "manage" scope; "list-groups" only needs "read"). "create" needs a title (optionally a groupId to create it inside a group). "rename" updates title and/or description. "delete" removes the folder — its creations detach to the drive root by default, or go to trash with trashContents=true; never a permanent delete. "set-favorite" stars/unstars a folder (starred folders feed the "favorites" smart collection). "set-poster" pins a creation as the folder cover (null clears it). "move-to-group" files the folder under a sidebar group (null detaches). Groups are the collapsible sidebar sections: "create-group" / "rename-group" take a title, "delete-group" only detaches its folders, "list-groups" shows them all.

What to do.

create rename delete set-favorite set-poster move-to-group create-group rename-group delete-group list-groups

Folder description (create/rename).

set-favorite only — true to star the folder, false to unstar.

The folder to act on (from list_folders). Not used by the *-group actions.

The sidebar group: target for move-to-group ("none" detaches), the group to rename/delete, or where "create" files the new folder.

set-poster only — the creation to pin as the folder cover, or "none" to clear it.

Title — required for create/create-group/rename-group, optional for rename.

delete only — send the folder's creations to trash instead of detaching them.

Manage folders and sidebar groups

Organise creations on the cloud drive (needs the "manage" scope). "move" needs a folderId (or "root" to ungroup). "trash" is reversible; "restore" undoes it. "like"/"unlike" SET the like state — idempotent, a repeat is harmless, and any public creation can be liked too. "batch-trash"/"batch-restore" act on up to 100 ids in one call (reversible, like their single-creation forms). "delete" is PERMANENT, stays one creation per call by design, and only works on a creation already in trash — trash it first, and only delete when the user explicitly asked for permanent removal.

What to do.

move trash restore delete like unlike batch-trash batch-restore

The creation to act on (every action except batch-*).

move only — target folder id, or "root" to detach.

batch-trash / batch-restore only — up to 100 creation ids.

Move, trash, restore, delete or like creations

Flip ONE creation's public visibility (needs the "publish" scope). Publishing puts it on the 2DAI public feed. Only the account's own AI generations can go public — raw uploads and NSFW-flagged creations are refused by the platform. Unpublish always works on a public row. Publish only when the user explicitly asked.

What to do.

The creation to act on.

Publish or unpublish a creation

Upload a local image (or base64 bytes) to the 2DAI cloud drive so it can be used as a reference for generation ("use THIS image"). Free, but the file goes through the platform's moderation pass — NSFW beyond the account's ceiling is rejected. Max 100 MB (Founder tier) — lower tiers cap earlier, the server returns 413 with the account's actual max on excess. jpeg/png/webp. Paths must stay inside the working directory unless the server was started with TWODAI_ALLOW_ANY_PATH=1.

Raw base64 image bytes — alternative to path.

MIME type when sending base64 (e.g. image/png).

Record this upload as a CROP edit of an existing creation you own — description and moderation verdict are inherited.

Record this upload as an ERASE (alpha) edit of an existing creation you own. Mutually exclusive with croppedFromCreationId.

Filename to store (defaults to the source name).

Path to the image file, relative to the working directory.

File the upload directly into this folder (must be a folder you can write to); omit to land at the drive root.

Upload an image


Check whether a PDF's redactions actually removed anything. Covering text with a black box hides it from a reader and removes nothing from the file, so the words stay extractable. This reads paint order to catch a plain drawn rectangle — which carries no redaction annotation at all and is the failure behind most published redaction leaks — and separately catches redaction marks that were never applied. Use this before a document is filed or released.

Absolute path to the PDF on this machine. Max 10 MB. Give this OR url, not both.

http:/https: URL to fetch the PDF from. The fetch runs LOCALLY, over this machine's own network (not from the Tamperlens server), and only the bytes are sent on. Only http/https; redirects re-checked; max 10 MB, enforced on the bytes received. Give this OR path, not both.

Compare a candidate document against the original you already hold, and answer the question a single-file check cannot: is this the same file, unchanged? Reports byte identity (the only proof), revision ancestry when the candidate contains the original as a byte prefix, or a field-by-field structural diff when both were rewritten whole. Renders nothing and compares no pixels.

Absolute path to the document being checked. Give this OR candidateUrl, not both.

http:/https: URL to fetch the document being checked from. Fetched LOCALLY over this machine's network (not from the Tamperlens server); http/https only, redirects re-checked, max 10 MB on the bytes received. Give this OR candidatePath, not both.

Absolute path to the document you trust. Give this OR originalUrl, not both.

http:/https: URL to fetch the trusted document from. Fetched LOCALLY over this machine's network (not from the Tamperlens server); http/https only, redirects re-checked, max 10 MB on the bytes received. Give this OR originalPath, not both.

Inspect a document or image for fraud and tamper signals: revisions appended after the original save, metadata that disagrees with itself, editor fingerprints, signature coverage gaps, text still readable under a redaction box, unaccepted tracked changes whose deleted text is still recoverable, hidden text, hidden spreadsheet sheets, macros, and AI-generator or editor traces in images. Returns risk signals with the raw evidence behind each one — never a verdict on authenticity. Accepts PDF; Word, Excel and PowerPoint documents (.docx, .xlsx, .pptx and macro-enabled twins); and JPEG, PNG, WebP, HEIC/HEIF and AVIF images.

ALSO ANSWERS: is this file safe for a model to read? Document properties, XMP, annotations, attachment names, docProps, comments and hidden Word runs are checked for text written to be read by a language model rather than by a person — the prompt-injection carriers an extraction pipeline surfaces and a human reader never sees. Call this BEFORE the document reaches your own context. The recovered text itself is never returned through this tool: you get the cue categories, the counts and which kind of field carried it, because reading the payload is the attack.

Optional issuer slug (e.g. 'chase') to additionally compare the document against a structural baseline of genuine documents from that institution. PDFs only — ignored for Office documents and images.

Absolute path to the document on this machine — PDF, Office document or image. Max 10 MB. Give this OR url, not both.

Optional. Your own risk thresholds and signal rules; the response gains a verdict of accept/review/reject computed from them. Nothing about the report changes.

http:/https: URL to fetch the document from. The fetch runs LOCALLY, over this machine's own network (not from the Tamperlens server), and only the bytes are sent on. Only http/https is accepted; redirects are followed but re-checked; max 10 MB, enforced on the bytes received. Give this OR path, not both.

CHEAP PRE-FLIGHT for document intake: is this file worth ingesting, and what does it cost to open? Reads structure, metadata, signatures and presence flags (revisions appended after the original, editor fingerprints, macros, JavaScript, embedded files, signature coverage) WITHOUT the expensive per-page content walk — a fraction of the I/O of `inspect_document`. Returns the risk band, the medium-or-high signals it CAN see, and the measured cost: bytes read, bytes expanded (decompressed) and the expansion ratio, so an agent can reject a decompression-heavy or high-risk file before committing to a full parse.

NOT A CLEAN BILL OF HEALTH. A quiet triage means only that the cheap structural tells were absent. Hidden text, redaction failure, altered arithmetic, glyph tampering, embedded-image anomalies and broken certifications are NOT checked in this mode — they need the page-content walk `inspect_document` runs. Use triage to ROUTE (reject now, or escalate to `inspect_document`), never as the verdict. PDFs get the cheap scope; Office documents and images have no separate expensive walk, so they return their full report.


get-crypto-price

Get Crypto Price

Get real-time price, 24-hour change percentage, trading volume, and market cap for any cryptocurrency by symbol or name.

Cryptocurrency symbol or name (e.g. BTC or Bitcoin)

Get Crypto Price

get-historical-analysis

Get Historical Analysis

Get historical price data for a cryptocurrency with trend analysis including period high/low, price change percentage, and volatility metrics over a customizable timeframe.

Number of days of historical data to retrieve (1-30)

Data interval: m1=1min, m5=5min, m15=15min, m30=30min, h1=1hr, h2=2hr, h6=6hr, h12=12hr, d1=daily

Get Historical Analysis

get-market-analysis

Get Market Analysis

Get detailed market analysis for a cryptocurrency including the top 5 exchanges by volume, price per exchange, and volume distribution percentages.

Get Market Analysis

get-top-assets

Get Top Assets

Get the top cryptocurrencies ranked by market cap, with real-time price, 24-hour change percentage, and market cap for each asset.

Number of top assets to return, ranked by market cap (1-50)

Get Top Assets


analyze

Analyzes a memory snapshot using built-in rules to detect leaks, fragmentation, excessive allocations, and anti-patterns. Returns findings with severity, description, and optional code suggestions.

Path to 'after' snapshot for comparison

Path to 'before' snapshot for comparison

Snapshot ID or path to analyze

Path to snapshot file

Working directory for resolving relative paths

Takes two memory snapshots of a .NET process with a delay between them for comparison. Useful for detecting memory leaks by comparing before/after state. Provide a pid. Returns the ids and paths of both snapshots.

Not implemented; a process id is required

Seconds to wait between before and after snapshots (default: 10)

Process ID to snapshot

Process name, used only to apply the profiling exclusion list

Lists all active analysis rules with their ID, title, severity, and category. Rules can be configured via .memorylens.json in the project root.

Lists running .NET processes suitable for memory profiling, discovered from their diagnostic IPC endpoints. Excludes IDE, tooling, and MCP server processes to prevent interference.

Optional filter to match process name

snapshot

Takes a memory snapshot of a running .NET process. Provide a pid. Returns a snapshot id to pass to analyze.

Seconds to wait before taking snapshot

Process ID to snapshot


List available transcript languages for a YouTube video. Use this before retrying with a specific language code.

YouTube video URL or ID

Extract a timestamped transcript from a YouTube video. Use this when the user needs quotes, chapter-like notes, or time-coded references.

**Parameters:**
- `url` (string, required): YouTube video URL or ID.
- `lang` (string, optional): Language code for transcripts. If omitted, the best available caption track is used.

Enable automatic paragraph breaks, default `false`

Optional language code for transcripts (e.g. 'en', 'uk', 'ja', 'ru', 'zh')

YouTube video URL or ID

Alias of `get_transcripts` for compatibility with other YouTube transcript MCP servers. Extract and process transcripts from a YouTube video.

**Parameters:**
- `url` (string, required): YouTube video URL or ID.
- `lang` (string, optional): Language code for transcripts. If omitted, the best available caption track is used.
- `enableParagraphs` (boolean, optional, default false): Enable automatic paragraph breaks.

**IMPORTANT:** If the user does *not* specify a language *code*, **DO NOT** include the `lang` parameter in the tool call.

YouTube video URL or ID

Extract and process transcripts from a YouTube video.

**Parameters:**
- `url` (string, required): YouTube video URL or ID.
- `lang` (string, optional): Language code for transcripts (e.g. 'en', 'uk', 'ja', 'ru', 'zh'). If omitted, the best available caption track is used.
- `enableParagraphs` (boolean, optional, default false): Enable automatic paragraph breaks.

**IMPORTANT:** If the user does *not* specify a language *code*, **DO NOT** include the `lang` parameter in the tool call. Do not guess the language or use parts of the user query as the language code.

YouTube video URL or ID

Fetch basic YouTube video metadata and available transcript languages without returning the full transcript.

YouTube video URL or ID


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.

Path to a CSV file (header row required).

Inline CSV text (alternative to csv_path).

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 fidelity with no guessing.

Known type (DAX/semantic-model callers have it); omit to infer from values.

Column description from the model → modelDesc.

Format string from the model (e.g. "$#,##0") → modelFormat.

Known measure/dimension role; omit to apply the numeric-non-identifier heuristic. A semantic-model caller should set this.

Rows as positional arrays aligned to columns, OR objects keyed by column name.

Per-column human DESCRIPTION — gives the model semantic context the bare column name lacks.

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.

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.

Columns that are the PRIMARY series/breakdown (the PBI 'Group by' well); the backend leads the visualization with these.

Columns to treat as MEASURES (the PBI 'Values' well — fields the chart aggregates). Numeric non-identifier columns are measures by default.

MEASURE columns that must NOT be summed (a ratio/average/rate — use mean, never stack). Usually auto-detected; this is an authoritative override.

How much detail to compute/share: 0 names only, 10 +counts, 20 +detailed stats (default), 30 +obfuscated sample rows.

Assess data shape

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. Requires a trial or paid BIC account (license env vars / credentials file). 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.

Preferred chart type by name (honored unless the data shape disqualifies it).

Path to a CSV file (header row required).

Inline CSV text (alternative to csv_path).

Column description from the model → modelDesc.

Format string from the model (e.g. "$#,##0") → modelFormat.

CSS font family for the chart's own text — titles, axis labels, tick labels, legends (e.g. 'Segoe UI' or a stack like 'Segoe UI, Arial, sans-serif'). Pass this ONLY when the user has named a font or you are matching a stated house style — do NOT infer one from the data, the project, or your own preference. Omitting it is a proven no-op: the engine picks. Applies to whichever renderer is chosen (D3, Plotly, matplotlib and Vega each get an equivalent instruction), and an unavailable family falls back to a web-safe stack rather than failing.

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 analytics and the chart is only the display.

Include the full code in the response (default true) — governs BOTH the text block and structuredContent.code. Set false when you only want it written to out_dir.

Project source language: with no concrete `renderer`, the backend auto-picks a renderer WITHIN this language (javascript/typescript → D3/Vega, python → Plotly/matplotlib). Omit to AUTO-DETECT from the working dir.

How much of the data the user wants to SEE. ASK THEM — do not infer it from the data or from your own preference; it is a question about what they want, and they can answer it in one word. 'High' = every observation drawn as its own mark (scatter, beeswarm, strip). 'Medium' = every row used, but shown as a distribution (box, violin, histogram). 'Low' = one mark per category (bars, cards, pies). Omit ONLY if the user has genuinely expressed no preference — omitting it is a proven no-op and the engine decides. This is a strong nudge, not a filter: it reorders charts that already fit, and an explicit chart_type still wins.

Model code; empty = backend default.

Optional directory to write chart.js/py, a data.sample.json, and (if preview_html) preview.html.

Also emit a standalone D3 preview (needs out_dir). Default false — the code is meant to be merged, not run as an index.html.

Directory to auto-detect the project language from (default: the MCP server's working directory).

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', 'render citations as a chord diagram', 'log scale on revenue', 'annotate the peak'.

LLM pass structure; empty = backend heuristic.

Force a specific renderer (overrides `language`). Omit to use `language`/auto-detection; 'VISUAL'/'' = let the backend choose.

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 returning a chart that silently dropped it.

'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 row being present (a row-per-entity table, a point per location).

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 strips the export clause before compiling - so this is a convenience, never a compatibility choice.

MCP server build stamp — the bundle actually serving this call.

The chart type the backend produced.

The render() source. Omitted when include_code is false.

The backend's own one-line description of what it built.

Ties this generation to the server-side log — quote it in any support request.

Credits billed, when the server reported them.

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 files.data.

Absolute paths written, when out_dir was given.

Column joined to the geometry; null for a basemap-only point map.

False means no bundled geometry matched this kind: the map will draw no land.

Geometry asset kind — pass the matching geometry as options.geo.

Regions in the data with no geometry match.

column kind hasGeometry unmatched unmatchedExamples

Region/basemap wiring; null for non-geo charts.

Rows placed by a largest-match tie-break rather than an exact one.

placed total precision unplaced unplacedExamples ambiguousRows

Point-geocoding outcome; null when the chart geocodes no points.

Host contract version the code targets; a host on a different MAJOR may not interoperate.

Renderer/language of the code (D3, PYTHON, …).

D3 plugin PACKAGES this code calls (e.g. ["d3-sankey"]) — install and Object.assign onto the same d3 you pass the host, or the chart throws mid-render. Empty for core-only d3 and for non-D3 languages.

Server-side version number of this generation.

Present when the chart drawn is NOT the chart requested: names the requested type, the reason it was overruled, and what was drawn instead. Surface it to the user verbatim — never suppress it because the chart rendered fine.

chartName language version creditCost correlationId requiredD3Plugins geo geoPoint hostContract build

Generate chart code

The AUTHORITATIVE list of chart types that can render this dataset — the server's own eligibility engine (ChartFilter.GetCharts), 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 + RANKED by the picker's chart-type×renderer weights (best first), 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. REQUIRES an active license (BIC_LICENSEE + BIC_LICENSE_KEY): eligibility IS the engine, so programmatic access to it is licensed. Free within a generous hourly allowance; beyond it a call may draw usage credits, so avoid calling it in a tight loop. The refusal names what to set.

Path to a CSV file (header row required).

Inline CSV text (alternative to csv_path).

Column description from the model → modelDesc.

Format string from the model (e.g. "$#,##0") → modelFormat.

Viewport height px (default 600).

Project source language → the server ranks across that language's renderers (javascript/typescript = D3/Vega, python = Plotly/matplotlib). Omit to AUTO-DETECT from the working dir; `renderer` (if given) overrides this.

How much of the data the user wants to SEE — ASK THEM, do not infer. 'High' = every observation as its own mark, 'Medium' = every row shown as a distribution, 'Low' = one mark per category. Ranks this list the same way a generation would, so what you see here is what you will get. Omit if they have expressed no preference.

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 use `language`/auto-detection.

Show only the top-N ranked results. Omit for all.

Viewport width px (default 800) — affects small-viewport / facet-budget gates.

List eligible chart types


Typed multistream TSB/2 bundles with a dedicated integrity ledger. action 'create' packs streams given as 'DOMAIN=PATH' entries — stasis is the order-blind lane, flux the order-sensitive lane (the two rails, never conflated); 'append' atomically extends by rebuilding the directory and ledger; 'list' shows typed stream metadata WITHOUT materializing payloads; 'extract' writes one stream (index, or a unique domain); 'verify' checks the final LEDGER against every payload and aux section. Exact transport; the ledger is a corruption checksum, not cryptography.

the bundle file (all actions but create)

extract: select by unique domain instead of index

'DOMAIN=PATH' entries for the order-sensitive lane

overwrite an existing output

extract: stream index (default 0)

create: bundle to write · extract: stream output file

'DOMAIN=PATH' entries for the order-blind lane

Check that this OHAM install decodes correctly: reports the binary path and version, and decodes a container carried inside the binary against a digest fixed at build time. Run this FIRST if any other tool returns an unexpected hash — it separates a broken install from a real finding. Returns JSON; verdict is OHAM_DOCTOR_OK or OHAM_DOCTOR_FAIL.

Cut frames into their own standalone .tsb — no re-encode, records carried byte-for-byte. One tick makes a full-quality still. ticks accepts '300', '50,300,900', '0..120' (end-exclusive), or 'all'. NOTE: the output's ticks are RENUMBERED FROM 0 — excerpting tick 300 gives a file whose only frame is tick 0, so read it back with tick 0, not 300. The source ticks are not recorded in the output; keep that mapping yourself if you need it. Refuses to overwrite an existing output unless force is set, and never allows input == output.

overwrite an existing output file

path to the source .tsb

path to write; must not exist unless force

'300' | '50,300,900' | '0..120' | 'all'

Translate a sealed container BACK to legacy media, chosen by the output extension: .png poster (EXACT), a directory of png frames (EXACT), .wav from an audiopcm .tsb2 object (EXACT — byte-identical to the stored payload, digest-gated), .mp4/.gif through a DISCOVERED external encoder ($OHAM_FFMPEG, then PATH). The lossy legs NAME the re-encode in the receipt (EXACT_FRAMES_TO_LOSSY_LEGACY_ENCODER + the encoder version) — never silent; an absent encoder is a typed refusal that says what to install. Read-side only: sealing stays the service's.

overwrite an existing output

override the output frame rate, e.g. '30:1' (default: the container's own)

a .tsb container, or a .tsb2 audiopcm object for wav

the rung to decode (0 = native)

out.png | frames_dir/ | out.wav | out.mp4 | out.gif

one tick ('300') or a range ('0..120'); default: poster tick 0, moving = all

Inspect a .tsb sealed container: dimensions (inner.w/h), frame count (inner.frames), level count (inner.segs), record sizes, section digests, structural verdict. Returns JSON. Refuses STRUCTURALLY invalid files with the reason (bad magic, sections that do not tile, trailing bytes). It does NOT validate record payloads — a container whose pixels are corrupt still reports STRUCTURE_OK here. To check payload integrity call oham_verify, or decode with oham_unseal, which is what actually rejects a damaged record.

path to the .tsb

Exact typed TSB/2 objects — byte custody for ANY file (domains: blobfile, modelbin, textutf8, tablecsv, geojson, dnaascii, audiopcm, etchtape, ...). action 'store' seals a file as an exact typed object; 'inspect' reads the typed directory WITHOUT materializing the payload; 'verify' checks structure + the stored SHA-256 payload digest; 'restore' writes the exact payload back byte-identical (digest-gated); 'range' reads an exact byte range to a file; 'stream' reads one bounded chunk and returns the resume cursor (next_offset). Transport and restore are EXACT; no semantic decode happens here. Verification is a corruption checksum, not cryptography.

store inspect verify restore range stream

stream: bytes per chunk (0 = the safe 64 KiB default)

store: the typed domain (default blobfile); a mismatched payload REFUSES — e.g. etchtape takes only whole 8-byte events

store: the source file to seal

overwrite an existing output

range: byte count

the .tsb2 object (all actions but store)

range: byte offset · stream: resume cursor (default 0)

store: object path to write · restore/range/stream: payload output file

Start here. Everything OHAM does in copy-paste commands, each with the exact hash that proves it worked. OHAM stores video/images as exact integer addresses in sealed .tsb files — any frame readable at any moment at the same cost, every conversion reversible, decoding fully local.

Convert wire forms losslessly: 'v2' compresses (~55% size), 'v1' restores byte-identically. Every record is verified to round-trip BEFORE the output file exists. To find a file's CURRENT form, call oham_info and read `version` (1 or 2) and `records_deflated`. Note that the round-trip check proves the BYTES survive, not that the payload is valid — a corrupt container repacks cleanly; use oham_verify for integrity. Refuses to overwrite an existing output unless force is set, and never allows input == output.

overwrite an existing output file

target wire form

path to the source .tsb

path to write; must not exist unless force

Seal a picture (png/jpg/...) into a .tsb container through the public converter. This is the WRITE side and it needs no token and no endpoint — the service picks block size, tile count and mode from the image's own dimensions and reports what it chose. The response is kept only if it passes the container law. Reading the result back needs no service at all.

override the endpoint (default: the public converter)

overwrite an existing output file

path to the source picture

path to write the .tsb; must not exist unless force

Start, stop, or query a local range-request file server (what the OHAM web player streams from). action 'start' serves root on port (default 8207) and keeps it running across tool calls; 'status' reports whether one is running and where; 'stop' ends it. Refuses to start if the port is already taken, rather than reporting a URL that belongs to someone else. Only one server per session; it dies when this server does.

Make, read, or append lawful etch tapes: JSONL events packed as 8-byte etch words on the frozen layout [t:16|lane:4|word_id:20|tidx:15|leaf:8|rail:1]. action 'make' packs an input JSONL file (one {"t":N,"lane":N,"word_id":N,"tidx":N,"leaf":N,"rail":N} per line — t required, the rest default 0) into a tape; 'read' decodes a tape back to events (limit bounds the returned count); 'append' extends a tape staged+atomic. Out-of-range values refuse with the ROW and FIELD named. Store a tape typed with oham_object action 'store', domain 'etchtape'.

make: overwrite an existing output

JSONL events file (make, append)

read: return at most this many events

the tape to write (make)

the tape file (read, append)

Verified, bounded network transfer of exact bytes. action 'pull' fetches a URL with strict HTTP ranges + resume and gates the result on a final SHA-256 you supply (sha256, or a trusted manifest file); 'fetch' is the container-aware verified fetch for an evd-carrying .tsb — records striped across the primary and every mirror, EACH record verified against its own stored digest as it lands, and a record that fails on one source is refetched from another with the bad source NAMED. Transport verification only: bytes against a digest / the container's own lane — it authenticates no one (corruption checksum, not cryptography).

overwrite an existing output

pull: a trusted local manifest file naming the digest

fetch: additional record sources

file to write

pull: the expected final digest (hex)

the primary source URL

Decode a frame (or just a window of it) to an image. tick = frame number; level 0 = full size, each level halves both axes; window = [x0,y0,x1,y1] pixels at that level reads ONLY that rectangle (cost is the window's, not the frame's). Returns the PNG inline (default) or writes to out_path.

path to the .tsb

write the PNG here instead of returning it inline

frame number; see inner.frames from oham_info for the count

x0,y0,x1,y1 — omit for the whole frame

Re-check OHAM's claims by BYTE COMPARISON, offline: the receiver against a digest fixed at build time, a windowed read against that rectangle of the full decode, the rung grid, excerpt-verbatim, the wire round trip, and a corrupt container refused. With no argument it checks a container carried inside the binary; pass clip to run the same laws against your file — this is the payload integrity check oham_info does NOT do. Returns JSON; verdict is OHAM_VERIFY_GREEN or OHAM_VERIFY_RED.

path to a .tsb to verify instead of the built-in one