Developers
One engine behind the product, a CLI, a GitHub Action and an MCP server, so a check that passes for your agent passes in CI, and a file generated by hand matches the pull request byte for byte.
$ uvx --from basemode-tokens basemode generate \
--file <figma-file-key> --format tailwind4 --out src/tokens
412 tokens, 2 files written to src/tokens.
$ basemode lint src --tokens src/tokens/basemode.lock.json
src/pricing/plan-card.tsx:14:22: #2563eb is already a token: use var(--action-primary).
1 hard-coded values in 212 files, 1 already tokens.
Adoption: 97% of design values come from the system (138 of 412 tokens in use).
$ claude mcp add basemode -- uvx --from basemode-tokens \
basemode mcp --tokens src/tokens/basemode.lock.jsonThree ways in
The same engine Basemode runs, from PyPI. Generate from Figma's API, a plugin export, a W3C or Tokens Studio file, or your Basemode design system. --check changes nothing and exits 1 when files are out of date, for a CI step that fails on drift.
basemode-tokens on PyPI$ FIGMA_TOKEN=… basemode generate --file KEY --format css --format swift
$ basemode generate --input tokens.json --format android
$ BASEMODE_KEY=… basemode pull --format typescript --check
$ basemode generate --file KEY --rename-references --summary pr.mdRuns on a schedule or by hand and opens or updates the one pull request. An unchanged sync leaves the repository alone, so a pull request someone closed on purpose doesn't come back every night.
arcarolabs/basemode-action1on:2 schedule: [{ cron: "0 22 * * 0-4" }]3 workflow_dispatch:4permissions: { contents: write, pull-requests: write }5jobs:6 tokens:7 runs-on: ubuntu-latest8 steps:9 - uses: actions/checkout@v410 - uses: arcarolabs/basemode-action@v111 with:12 basemode-key: ${{ secrets.BASEMODE_KEY }}13 formats: tailwind4,typescript14 path: src/tokensHosted on every plan, or local from a lock file. With a developer key it also serves your guidelines and components, stays current as designers publish, and sends report_gap requests to your team.
$ claude mcp add --transport http basemode \
https://api.basemode.io/v1/mcp \
--header "Authorization: Bearer <developer-key>"
# or, with no account, from a lock file
$ claude mcp add basemode -- uvx --from basemode-tokens \
basemode mcp --tokens src/tokens/basemode.lock.jsonReference
Commit basemode.lock.json next to the tokens: it's how a rename is told apart from one token removed and another added. Add basemode-ignore in a comment to leave a line out of lint.
Try it with sample tokens in a couple of minutes, then connect Figma, GitHub and your agents when you're ready. No card needed.