MCP.Market

chartlink MCP server

online · 100% uptime
by oscarleoo·io.github.oscarleoo/chartlink·v0.1.2

Charts and tables for AI agents with live-updating embed links. No account: signup returns a key.

A98/100grade A
What users say
No reviews yet
Be the first
Safety scan
A98/100

full report

Adoption
Growing

0 stars45 downloads/wk

Reviews

Write one

Nobody has reviewed chartlink yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

chartlink tools (27, 11 write)

write = sends, deletes, buys or posts
  • clear_data_sourceFree

    Stops scheduled fetches; the chart keeps its current data.

  • create_assetwrite actionFree

    Creates a draft. The response includes a low-res PNG preview INLINE — look at it, then iterate with update_asset. Nothing is public until publish_asset, or until you pass publish: true here (one call instead of two, once the chart is final). A success means the config validated AND rendered. Style comes from the defaults and your brand, if any — only set config fields the story needs. data = {columns: [{id,type,...}], rows: [[...], ...]} (row-major, matching column order). LIMITS: keep each call under ~100 KB of rows (asset cap 2 MB) — for larger datasets create with a few rows and attach set_data_source, or append chunks via replace_asset_data.

  • create_brandwrite actionFree

    A brand styles every asset that references it — and the workspace default brand styles everything created without an explicit brand. Create one, then render any asset with brand: "<slug>" to see it applied. Style only: brands can never inject data or text content.

  • create_checkout_linkwrite actionFree

    Returns a URL that opens straight into Paddle checkout: no login, no account. It can only add credits to THIS workspace, so it is safe to share. Credits arrive seconds after payment (get_billing).

  • create_edit_linkwrite actionFree

    Returns a URL opening the visual tweak panel for ONE chart (text, colors, spacing, label nudges) with no login. PUBLISH FIRST: the editor saves and republishes a published chart, it cannot publish a draft. Scope: view, tweak, and republish that chart only — never delete, never spend credits, nothing else in the workspace. OFFER THIS whenever the human's request is aesthetic fine-tuning: handing over the wheel beats a nudge-by-nudge back-and-forth. The secret is shown once; links don't expire and can be revoked with revoke_edit_link.

  • delete_assetwrite actionFree

    Embeds go dark. Restorable via the REST API (POST /api/assets/{id}/restore).

  • duplicate_assetFree

    New id, new embed URLs. Useful for rebranding a chart for another audience.

  • fetch_data_sourcewrite actionFree

    Runs one fetch on top of the schedule. Returns {ok, rows, published, error}.

  • get_assetFree

    Full asset envelope. includePreview=true also returns an inline PNG of the current draft.

  • get_billingFree

    Hosting is free (unlimited badged charts, live updates included). One credit makes one chart premium forever: 2400px, SVG, your own branding, no badge. Updates are never metered.

  • get_spec_schemaFree

    Returns the JSON Schema for the type's config, the data schema, two worked examples (minimal + rich), and `defaults` — the complete config in force when nothing is set (every font, padding, color), which a brand and then the chart's own config merge over. Read this before your first create_asset of a given type; read a baseline value from defaults instead of guessing it.

  • list_asset_typesFree

    Chart/table types you can create, with links to per-type schemas.

  • list_assetsFree

    Filterable list; rows elide config/data. Use get_asset for full bodies.

  • list_brandsFree

    Style-only token sets applied under your config. Pass a slug as `brand` on create_asset.

  • list_geographiesFree

    countries, us-states, us-states-pr (with Puerto Rico), us-counties, us-zip3, us-zips-<st> (one state's ZIP codes), and every country's states/provinces as <alpha-2>-regions (de-regions, ru-regions…). Pass id to get one geography's full region list — codes (ISO 3166-2 like DE-BY), names and aliases — and read it BEFORE naming regions in your data: unknown regions fail loudly. Set chart.geography to the id; chart.bounds crops.

  • list_templatesFree

    Templates are named by the NEED they answer (need, asks, tags), each with urls.png (show it to your human) and `columns`: the column ids your data must supply. Pass q with what the person asked for — "map of brazil's states", "ranked bars with flags", "change between two years" — and the list comes back ranked; take the first. Then create_asset with template: <id> and your data — the whole design comes along. Any chart id you were shown works as a template too, not only these.

  • publish_assetwrite actionFree

    Makes the draft live. Returns urls: paste urls.embedIframe on iframe platforms; on Substack insert urls.png as an image and link it to urls.page. Pinned history: urls.png + '?v=N'.

  • replace_asset_dataFree

    THE core flow for refreshing numbers. publish defaults to auto: a published asset republishes immediately (every embed/PNG updates); a draft stays draft. Set publish=false to stage instead. LIMITS: an asset holds up to 2 MB of data, but keep each tool call under ~100 KB of rows — for larger datasets chunk with mode: "append" (publish: "false" on every chunk but the last), or skip inline entirely with set_data_source (the server fetches a URL, up to the full 2 MB).

  • revoke_edit_linkFree

    The URL stops working immediately. List links (prefixes + tokenIds) via GET /assets/{id}/edit-links.

  • set_data_sourceFree

    The chart refetches this URL (CSV or JSON) hourly/daily/weekly, replaces its rows, and republishes itself if published — refreshes are free, updates are never metered. Columns stay as defined on the asset: CSV headers / JSON object keys match column ids or labels case-insensitively, with spaces, underscores and hyphens interchangeable (births_per_woman matches a column labeled 'Births per woman'). Fetches once immediately and returns that outcome — check fetch.ok and fix fetch.error before moving on. get_asset shows dataSource + dataSourceState when a source is attached. Clear with clear_data_source.

  • signupwrite actionFree

    Creates a workspace and returns its API key (shown ONCE — keep it). Works on a keyless connection; every other tool needs the key. Then put the key where your client keeps it (plugin api_key setting, the Authorization header, or CHARTLINK_API_KEY for the npx bridge) and reconnect.

  • submit_feedbackwrite actionFree

    If a capability is missing, a schema fights you, or docs are wrong: record it here so the owner can fix it. One report per distinct issue, with a real description — reports get fixed same-day when they say what you tried, what you expected, and what happened (title-only reports can't be acted on).

  • unpublish_assetFree

    Embeds and PNGs return 410 until republished.

  • update_assetwrite actionFree

    configPatch is DEEP-MERGED: objects merge recursively, arrays replace wholesale, null clears a key — send only what changes. To REMOVE keys (drop document.aspect, delete one of texts[]) pass `config` instead: it REPLACES the whole config (get_asset returns the current one to edit). `data` (if given) replaces rows wholesale. Requires expectedVersion from the last envelope; on 409 re-merge onto the returned `current`. Updating does NOT publish by default — pass publish: true to publish in the same call, or call publish_asset separately.

  • update_brandwrite actionFree

    Deep-merges tokens (objects merge, arrays replace, null clears). Drafts restyle immediately; published assets pick the change up on their next publish. Requires expectedVersion from list_brands.

  • upgrade_to_premiumFree

    Same URLs, instantly rebranded: badge removed, 2400px PNG and SVG unlocked, custom branding applies. Idempotent for already-premium charts.

  • whoamiFree

    Returns key name + workspace. Call this first — non-destructive auth check. Everything you write is stamped createdBy/updatedBy = key name.

Public scan report

scanner v0.1.10 · 2026-10-03 · same rubric, same numbers if you re-run it

no findings
  • Code scan2 source files scanned25/25
  • Live reliabilityremote reachable in 176ms (auth required)20/20
  • –Tool poisoningtools not inspected (endpoint requires auth); not countedn/a
  • Auth qualityOAuth resource metadata advertised on 40115/15
  • Maintenancelast push 11 days ago15/15
  • Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Overall 98/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

How chartlink compares

Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.

Safety score
98/100
higher than 99% of 48,255 servers
Tools
27
the typical server has 7
Tools that change things
41%
typical: 0%. Fewer write tools means less an agent can break
Uptime
100%
of our recent checks; the typical remote server answers 100%
Response time
531 ms
faster than 27% of 30,031 servers
Downloads a week
45
more than 37% of 12,191 servers with a package

What its tools let an agent do: 13 read · 4 create · 7 change · 2 delete · 1 send or post

Install chartlink in Claude Code, Cursor or VS Code

claude mcp add --transport http chartlink https://chartlink.app/mcp
Add to Cursor

What the publisher says

From the chartlink repository's README, as published. We do not edit it. Read it on GitHub

chartlink for agents

chartlink makes charts, maps and tables with live-updating embed links. An agent drafts a chart from one message, looks at the preview, publishes it, and hands back an embed that updates when the numbers do. No accounts: the API key is the workspace.

This repo is how agents connect.

Claude Code plugin

/plugin marketplace add oscarleoo/chartlink-agents
/plugin install chartlink@chartlink

The plugin adds the chartlink MCP server and a skill that teaches the create → preview → publish loop. Ask Claude to "set up chartlink" and it gets its own key (POST /api/signup, no account) and tells you where to paste it.

Cursor

The repo root is a Cursor plugin: .cursor-plugin/plugin.json, mcp.json (the chartlink server over HTTP, key from the CHARTLINKAPIKEY environment variable) and the same skill. Install from cursor.directory or add the server by hand:

{ "mcpServers": { "chartlink": { "url": "https://chartlink.app/mcp", "headers": { "X-API-Key": "viz_..." } } } }

Any MCP client (HTTP)

URL:    https://chartlink.app/mcp
Header: Authorization: Bearer viz_...

Get a key with curl -X POST https://chartlink.app/api/signup. The key is shown once.

Clients that only speak stdio

npx chartlink-mcp

with CHARTLINKAPIKEY=viz_... in the environment. It bridges stdio to the HTTP server above; nothing runs locally but the bridge. Source in packages/chartlink-mcp.

Plain REST

Everything is documented for agents at https://chartlink.app/llms.txt and as OpenAPI at https://chartlink.app/api/openapi.json.

Listing kit

listing/ holds the text and image used on every directory chartlink is listed in.

Keeping this repo honest

node scripts/check.mjs compares LISTING.md and SKILL.md with the live server: the MCP tool inventory (tools/list works without a key) and the chart-type list from llms.txt. Run it before a release; it exits 1 on drift.

Nothing above is checked by us. What we check is on the safety report.

chartlink: common questions

Is chartlink MCP server safe?
Yes, by our scan: it is graded A (98/100). Read the chartlink safety report
How do I install chartlink?
It runs remotely at chartlink.app. Add it to Claude Code, Cursor, VS Code or Claude Desktop with the snippets above, or call it through the mcp.market gateway without installing anything.
Does chartlink need an API key?
No key to paste: it signs you in with OAuth when your client connects.
Is chartlink maintained?
The last commit was 43 days ago (2026-09-22). The latest release is v0.1.2.
Is chartlink up?
100% of our last 28 checks got an answer. We check remote servers about four times a day.
How does chartlink compare with other MCP servers?
safety score 98/100 (higher than 99% of 48,255 servers); tools 27 (the typical server has 7); tools that change things 41% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.