Skip to main content
Developers

UEFN Marketplace for Developers

Build with the REST API, automate uploads, or let AI assistants manage your account through MCP. One developer token powers both surfaces.

Overview

The UEFN Marketplace developer platform has two surfaces, both authenticated with the same token from Dashboard → Developer. Pick whichever fits your workflow — you don't need both.

Build custom scripts and automations

Batch-upload asset packs from CI/CD pipelines

Integrate with external tools (Make, Zapier, etc.)

Manage listings programmatically

Standard HTTP — works in any language

Let AI assistants (Claude, Cursor, etc.) act on your behalf

Manage Creator Studio: boards, cards, sprints, wiki, Verse

No HTTP requests — AI calls tools via structured protocol

Hosted (always-on) or local process — your choice

Upload assets by describing what you want in chat

Shared token: Generate one token at Dashboard → Developer. It works for both the REST API (Authorization: Bearer smcp_...) and the MCP server (UEFN_API_TOKEN=smcp_...). The two integrations are independent — you don't need to use both.

REST API v1

UEFN Marketplace REST API

A standard HTTP/JSON API for building custom tools, automating asset uploads, and integrating UEFN Marketplace into your own scripts and workflows.

REST API vs MCP — which should I use?

Both are powered by the same developer token. They serve different use cases — see the overview for the at-a-glance comparison, or jump straight to the MCP section.

Quick start

1. Generate a token

Go to Dashboard → Developer and click New Token. Copy it — it starts with smcp_ and is shown once.

2. Verify it works

curl https://uefnmarketplace.com/api/v1/me \
  -H "Authorization: Bearer smcp_..."

3. Start building

All endpoints live under /api/v1. The machine-readable spec is at /api/v1/openapi.json.

Authentication

Authorization header (all requests)

Authorization: Bearer smcp_YOUR_TOKEN_HERE

Generated in Dashboard → Developer. Scoped, revocable at any time.

Full example

curl https://uefnmarketplace.com/api/v1/me \
  -H "Authorization: Bearer smcp_YOUR_TOKEN_HERE"

# → 200 OK
{
  "id": "...",
  "username": "your-username",
  "is_seller": true,
  ...
}

Token scopes

All new tokens receive the full default scope set below. You can revoke tokens at any time from Dashboard → Developer.

profile:readRead your profile
profile:writeUpdate your profile
assets:readList and read your assets
assets:writeCreate, update, delete, and upload assets
tokens:readList your tokens via the API
tokens:revokeRevoke tokens via the API

Endpoints

Base URL: https://uefnmarketplace.com/api/v1

Platform

GET
https://uefnmarketplace.com/api/v1/health

Public health check — no auth required. Returns platform status.

Profile

GET
https://uefnmarketplace.com/api/v1/me

Read your profile (username, bio, seller status, social links, subscription tier).

profile:read
PATCH
https://uefnmarketplace.com/api/v1/me

Update editable profile fields (display_name, bio, website).

profile:write

Assets — listing management

GET
https://uefnmarketplace.com/api/v1/assets

List your asset listings. Filter by status, paginate with limit and offset.

assets:read
POST
https://uefnmarketplace.com/api/v1/assets

Create a new draft asset listing. Returns the asset id needed for upload steps.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/batch

Batch-create up to 25 draft assets in one call. Returns per-item success/failure (207).

assets:write
GET
https://uefnmarketplace.com/api/v1/assets/:id

Get full asset details including images, tags, and category.

assets:read
PATCH
https://uefnmarketplace.com/api/v1/assets/:id

Update metadata, pricing, visibility, tags, or schedule.

assets:write
DELETE
https://uefnmarketplace.com/api/v1/assets/:id

Permanently delete a draft asset. Only status=draft can be deleted.

assets:write

Assets — upload lifecycle

Four-step workflow: get signed URL → PUT binary → confirm → submit

POST
https://uefnmarketplace.com/api/v1/assets/:id/upload-url

Generate a short-lived signed URL for uploading the asset file (ZIP, etc.).

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/confirm-file

Record the uploaded file path and size on the asset. Required before submit.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/images/upload-url

Generate a signed URL for uploading a gallery image (jpg, png, webp).

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/confirm-image

Register an uploaded image in the asset gallery. First image becomes the thumbnail.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/submit

Submit a draft or rejected asset for moderation review. Asset must have an uploaded file.

assets:write

Token management

GET
https://uefnmarketplace.com/api/v1/tokens

List all your developer tokens (names, prefixes, last used at).

tokens:read
DELETE
https://uefnmarketplace.com/api/v1/tokens?id=:uuid

Revoke a specific token by its UUID. The token stops working immediately.

tokens:revoke

Full upload walkthrough

Complete workflow for creating an asset listing and uploading its file and cover image. All four upload steps are required before submitting for review.

Step 1 — Create the draft listing

POST https://uefnmarketplace.com/api/v1/assets
Authorization: Bearer smcp_YOUR_TOKEN

{
  "title": "Epic Forest Pack",
  "slug": "epic-forest-pack",
  "description": "High-quality forest assets for UEFN maps.",
  "pricing_type": "fixed",
  "price": 9.99,
  "visibility": "public",
  "tags": ["nature", "forest", "UEFN"]
}

# → 201 Created
{ "id": "asset-uuid", "status": "draft", ... }

Step 2 — Upload the asset file

Get a signed URL, PUT the file, then confirm

# 2a. Get a signed upload URL (valid for ~1 hour)
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/upload-url
{ "filename": "epic-forest-pack-v1.zip" }
# Response: { "signed_url": "https://...", "storage_path": "..." }

# 2b. PUT the file binary directly to storage (no Authorization header)
curl -X PUT "<signed_url>" \
  --upload-file epic-forest-pack-v1.zip \
  -H "Content-Type: application/zip"

# 2c. Record the file on the asset
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/confirm-file
{ "storage_path": "...", "file_size": 4294967 }
# → { "success": true }

Step 3 — Upload gallery images (optional but recommended)

Repeat for each image. The first image becomes the primary thumbnail.

# 3a. Get a signed URL for the image
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/images/upload-url
{ "filename": "preview.jpg" }
# Response: { "signed_url": "...", "storage_path": "...", "public_url": "https://..." }

# 3b. PUT the image binary
curl -X PUT "<signed_url>" \
  --upload-file preview.jpg \
  -H "Content-Type: image/jpeg"

# 3c. Register the image in the gallery
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/confirm-image
{ "public_url": "https://..." }
# → { "id": "img-uuid", "is_primary": true, ... }

Step 4 — Submit for review

POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/submit

# → 200 OK
{ "success": true, "status": "pending" }
# Asset is now in the moderation queue.

Error codes

401 UNAUTHORIZEDMissing, invalid, expired, or revoked token.
403 FORBIDDENToken does not have the required scope.
404 NOT_FOUNDResource does not exist or does not belong to you.
409 CONFLICTSlug already taken (create) or status prevents the action (submit requires draft/rejected, delete requires draft).
422 NO_FILETried to submit an asset that has no uploaded file.
429 RATE_LIMITEDToo many requests — back off and retry.
500 SERVER_ERRORInternal error — retry or contact support at uefnmarketplace.com/contact.

Want to use an AI assistant instead of writing HTTP requests?

The MCP server lets Claude, Cursor, VS Code Copilot, and any MCP-compatible AI assistant call tools on your behalf — no HTTP required. It uses the same developer token and supports asset uploads plus the full Creator Studio (boards, Verse snippets, sprints, wiki, and more).

Jump to MCP setup
Model Context Protocol

UEFN Marketplace MCP Server

Let AI assistants — Claude, Cursor, VS Code Copilot — read and write your UEFN Marketplace account through structured tool calls. No HTTP requests, no copy-pasting data. Just describe what you want in chat.

What is MCP?

MCP (Model Context Protocol) is an open standard by Anthropic that lets AI assistants securely call external tools. Instead of you copy-pasting data into chat, the AI calls a tool, gets structured JSON back, and acts on it — all in one conversation.

How it works:

AI assistant (Claude, Cursor, …)
        │  tool calls
        ▼
UEFN Marketplace MCP Server   ← this product
        │  Supabase SDK / REST
        ▼
UEFN Marketplace (your account, projects, assets)

MCP vs REST API: The REST API is for scripts and custom integrations that make direct HTTP calls. The MCP server is for AI assistants that need to reason, decide, and act autonomously. Both use the same developer token. See the REST API section →

Step 1 — Get your developer token

Go to Dashboard → Developer and click New Token.

The token starts with smcp_ and is shown only once. Copy it before closing the dialog.

The same token works for both the MCP server and the REST API. You only ever need one.

Step 2a — Hosted MCP (recommended)

Recommended
Always-on · No install · Hosted on Vercel

The MCP server runs permanently at https://uefnmarketplace.com/api/mcp, hosted inside the UEFN Marketplace Next.js application on Vercel. Nothing to install, nothing to keep updated.

Claude Desktop — remote HTTP

Settings → Developer → Edit Config (claude_desktop_config.json)

{
  "mcpServers": {
    "uefn-marketplace": {
      "type": "http",
      "url": "https://uefnmarketplace.com/api/mcp",
      "headers": {
        "Authorization": "Bearer smcp_YOUR_TOKEN_HERE"
      }
    }
  }
}

Cursor / VS Code — remote HTTP

.cursor/mcp.json or VS Code settings.json

{
  "mcp": {
    "servers": {
      "uefn-marketplace": {
        "type": "http",
        "url": "https://uefnmarketplace.com/api/mcp",
        "headers": {
          "Authorization": "Bearer smcp_YOUR_TOKEN_HERE"
        }
      }
    }
  }
}

Verify the hosted server

Run this curl to confirm the endpoint is up and your token is valid:

curl -X POST https://uefnmarketplace.com/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer smcp_YOUR_TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'

# → {"jsonrpc":"2.0","id":1,"result":{}}

Or ask your AI to call the health_check tool. It confirms DB connectivity and your authenticated user ID.

Step 2b — Local MCP (full Creator Studio tools)

The local MCP server gives you the complete Creator Studio suite — Kanban boards, Verse snippets, sprints, milestones, labels, island codes, wiki pages, and more — in addition to asset uploads. Run it as a local process that your AI connects to via stdio.

Option A — npx (easiest, no install)

UEFN_API_TOKEN=smcp_xxxxx npx -y @uefnmarketplace/studio-mcp-server

Option B — Download ZIP

curl -L "https://uefnmarketplace.com/downloads/uefn-studio-mcp-server.zip" -o uefn-studio-mcp-server.zip
unzip uefn-studio-mcp-server.zip
cd uefn-studio-mcp-server
npm ci && npm run build
UEFN_API_TOKEN=smcp_xxxxx node dist/index.js

Claude Desktop — local process

{
  "mcpServers": {
    "uefn-studio": {
      "command": "npx",
      "args": ["-y", "@uefnmarketplace/studio-mcp-server"],
      "env": {
        "UEFN_API_TOKEN": "smcp_YOUR_TOKEN_HERE"
      }
    }
  }
}

Cursor / VS Code — local process

{
  "mcp": {
    "servers": {
      "uefn-studio": {
        "type": "stdio",
        "command": "npx",
        "args": ["-y", "@uefnmarketplace/studio-mcp-server"],
        "env": {
          "UEFN_API_TOKEN": "smcp_YOUR_TOKEN_HERE"
        }
      }
    }
  }
}

Hosted vs Local — tool parity

Both servers use the same authentication. The hosted server covers asset management and upload. The local server adds the full Creator Studio suite.

ToolHosted MCPLocal MCP
health_check
get_my_profile
list_categories
list_my_assets
get_asset
create_asset
update_asset
delete_asset
get_asset_upload_url
confirm_asset_file
get_image_upload_url
confirm_image / add_asset_image
submit_asset
list_projects / get_project / …
create_board / list_boards / …
create_card / move_card / …
create_sprint / start_sprint / …
create_wiki_page / …
create_verse_snippet / …
create_island_code / …
create_milestone / …
create_label / add_label_to_card / …
export_project / import_project

† Hosted MCP uses confirm_image; Local MCP uses add_asset_image. Both accept asset_id + public_url.

Uploading assets via MCP

You can upload assets entirely from your AI assistant. The workflow is identical on both hosted and local MCP — just tell your AI assistant what you want:

Example prompt

“Create a new asset called ‘Epic Forest Pack’, price it at $9.99, upload the file at ./forest-pack.zip, upload the preview image at ./preview.jpg, then submit it for review.”

The AI will call in sequence:

  1. create_asset → creates draft, returns asset UUID
  2. get_asset_upload_url → gets signed URL for the ZIP
  3. HTTP PUT to the signed URL (the AI handles this automatically)
  4. confirm_asset_file → records the file
  5. get_image_upload_url → gets signed URL for the image
  6. HTTP PUT the image to the signed URL
  7. confirm_image (hosted) or add_asset_image (local)
  8. submit_asset → moves to “pending” review

File access note:The AI assistant needs access to your local file system to PUT the file binary to the signed URL. Claude Desktop and Cursor both support this. If your AI can't access local files, use the REST API instead.

Authentication

Set UEFN_API_TOKEN to your developer token (starts with smcp_). That is the only credential you need.

VariableWhen to use
UEFN_API_TOKENRecommended — token from Dashboard → Developer. Auto-refreshes.
SUPABASE_USER_JWTAdvanced; your Supabase JWT. Expires hourly, must be manually refreshed.
SUPABASE_SERVICE_ROLE_KEYAdmin automation only — bypasses row-level security. Use with extreme care.

How it works: Your UEFN_API_TOKEN is exchanged for a short-lived Supabase JWT server-side. All reads/writes go through RLS as your user. Tokens auto-refresh every hour in the background.

Troubleshooting

“Invalid API key” or “Unauthorized”

Your token has expired or was revoked. Generate a new one in Dashboard → Developer and restart your AI assistant.

Local server exits immediately

Make sure UEFN_API_TOKEN is in the env block of your MCP config — not in your shell. Restart your AI assistant after changing the config.

“Invalid OAuth error response” (Cursor / VS Code)

Remote MCP clients probe OAuth discovery URLs before connecting. The site returns JSON 401 for those paths so the client falls back to your Authorization: Bearer smcp_... header. Use the www hostname in your config (shown below) — the apex domain redirects and some clients break OAuth discovery on redirect.

Hosted server not responding

curl -X POST https://uefnmarketplace.com/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
# Should return: {"jsonrpc":"2.0","id":1,"result":{}}

The hosted server is deployed as a Next.js API route on Vercel and is always available as long as uefnmarketplace.com is up. If you get a 401, your token is invalid. If you get a 404, double-check the URL.

AI can't find the tools

Ask your AI to call health_check. If tools aren't listed, the MCP server isn't connected. Check that your config JSON is valid and that you've restarted the AI assistant after editing it.

v1

Building a script or automation instead?

The REST API at /api/v1 is the right tool for CI/CD pipelines, custom scripts, Make/Zapier automations, and any integration that makes direct HTTP requests. Same token, no AI required.

Jump to REST API