Back to Docs
MCP

Authentication & Scopes

Personal Access Token format, scope semantics, rate limits, credit charging, and lifecycle.

Updated 2026-06-02

Personal Access Tokens (PATs)

PATs are long-lived, per-organization bearer tokens. Every MCP request carries one in the Authorization header:

plaintext
Authorization: Bearer vbl_pat_live_<32 urlsafe chars>

Token Format

ComponentExampleMeaning
Prefixvbl_pat_live_Production. Registered with GitHub secret scanning.
Prefixvbl_pat_test_Non-production environments.
Body32 URL-safe characters24 bytes of entropy from secrets.token_urlsafe().

At creation the full token is shown once. Only a SHA256 hash of the raw value is persisted — a stolen database row cannot be replayed as a token.

Lifecycle

Step

Create

Dashboard → Settings → MCP → Create token. Choose a label and scopes. Up to ten active PATs per organization.

Step

Rotate

Create a new token, swap your client config over, then revoke the old one. Tokens have no expiry — rotation is entirely on your schedule.

Step

Revoke

Any row in the Settings list can be revoked. Rejection is immediate; in-flight requests that already passed auth complete normally.

Where To Store Tokens

Use one canonical local secret: VAYBEL_PAT.

For Claude Code, prefer storing the token in Claude Code settings so it is available to both the Vaybel MCP server and the official Vaybel Skills plugin:

json
{
  "env": {
    "VAYBEL_PAT": "vbl_pat_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

Then reference it from MCP config instead of pasting the token into the config file:

json
{
  "mcpServers": {
    "vaybel": {
      "type": "http",
      "url": "https://mcp.vaybel.com/",
      "headers": {
        "Authorization": "Bearer ${VAYBEL_PAT}"
      }
    }
  }
}

Do Not Commit Tokens

Do not put raw vbl_pat_live_... values in project .mcp.json, example repos, screenshots, issue comments, or chat transcripts. Avoid putting long-lived Vaybel tokens in broad shell startup files like .zshrc unless you intentionally want every terminal process to inherit them.

Scopes

Every tool declares the scope(s) it requires. A PAT missing the scope gets missing scope as a clean tool error. The dashboard token creator selects all public scopes by default — uncheck only what you want to deny.

Read scopes

ScopeTools
brand_dna:readbrand_dna.get_brand_dna
catalog:readcatalog.list_blanks
credits:readcredits.check_credits
design:readdesign.get, design.list_designs, design.get_design, design.get_design_history
insight:readinsight.get_overview, insight.list_design_performance, insight.get_guidance
mockup:readmockup.get, mockup.list_mockups, mockup.get_mockup
listing:readlisting.get_listing, listing.list_listings, listing.get
content:readcontent.get, content.list
social_post:readsocial_post.list
trend:readtrend.list_trends, trend.get_trend_match, trend.get, trend.list_seasonal_events
optimize:readoptimize.list_providers, optimize.list_provider_products, optimize.check_duplicate, optimize.get

Write scopes

ScopeTools
brand_dna:writebrand_dna.set_brand_dna
design:writedesign.generate_design
mockup:writemockup.generate_mockup, mockup.update_mockup_selection, mockup.submit_mockup_feedback, mockup.retry_mockup
listing:writelisting.create_listing, listing.update_listing, listing.regenerate_listing_field, listing.publish_listing, listing.delete_listing
content:writecontent.generate, content.delete
social_post:writesocial_post.generate, social_post.update, social_post.publish
trend:writetrend.generate_launch_concept, trend.submit_trend_feedback
optimize:writeoptimize.optimize_product, optimize.refresh_listing

Principle of Least Privilege

A monitoring agent that polls status doesn't need any :write scope — give it the :read set and nothing more. A trend-discovery agent that proposes drafts can have all reads plus design:write + mockup:write, but not listing:write or content:write. Build narrow tokens.

Rate Limits

Rate limits apply per-PAT, per-tool, on a fixed 60-second window. Hitting one raises a clean rate limit exceeded error with retry_after_seconds.

ToolLimit
design.generate_design10 / min
mockup.generate_mockup20 / min
mockup.update_mockup_selection, mockup.submit_mockup_feedback60 / min
mockup.retry_mockup20 / min
listing.create_listing10 / min
listing.update_listing, listing.delete_listing20 / min
listing.regenerate_listing_field10 / min
listing.publish_listing5 / min
content.generate5 / min
content.delete20 / min
social_post.generate10 / min
social_post.publish10 / min
trend.generate_launch_concept10 / min
trend.submit_trend_feedback60 / min
optimize.list_provider_products30 / min
optimize.optimize_product10 / min
optimize.refresh_listing20 / min
All other public toolsNo explicit MCP-layer limit (platform-level limits still apply)

Credit balance provides the finer gating for billable tools — you'll hit insufficient credits before a rate limit on a real workload.

Credit Charging

Most tools are free. A handful charge from the same credit balance your dashboard uses — no separate developer meter.

ToolCostBilled by
design.generate_design10 creditsMCP decorator (at dispatch)
mockup.generate_mockup (quality="pro")2 credits per mockupMCP decorator (at dispatch)
mockup.generate_mockup (quality="standard")Free
listing.create_listing2 creditsMCP decorator (at dispatch)
trend.generate_launch_concept2 credits — only on first dispatchMCP decorator (at dispatch)
content.generate (format="video")40 credits (social_video)Worker (on successful completion)
content.generate (format="slideshow")12 credits (social_slideshow)Worker (on successful completion)
content.generate (format="carousel")4 credits (social_carousel)Worker (on successful completion)
content.generate (format="single")1 credit (social_single)Worker (on successful completion)

Three pre-flight gates prevent surprises:

  1. Out-of-credit calls fail fast — the tool body runs a balance check before dispatching any Celery work.
  2. Idempotent tools (generate_design, generate_mockup, create_listing, publish_listing, optimize_product, content.generate, generate_launch_concept) dedupe on retry, so a flaky-network loop doesn't double-bill.
  3. trend.generate_launch_concept short-circuits to free when the concept is already cached.

Read tools and status polls are always free.

Errors You Might See

SymptomCauseFix
401 missing bearer tokenNo Authorization headerRe-check your client config; restart after changes
401 unknown tokenRevoked or typo'd PATRevoke from Settings, create a fresh one
missing scope: ...PAT lacks the scope the tool needsRe-create the PAT with the missing scope
rate limit exceeded — retry after NsPer-tool per-PAT limit hitRespect retry_after_seconds; batch where possible
insufficient credits: requires N, available MBalance below costTop up credits, or drop quality="standard" for mockups
does not belong to this organizationCross-org UUIDEach PAT is pinned to one org — agents can't reach other orgs' designs / listings / etc.