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.
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
smcp_ and is shown once.2. Verify it works
curl https://uefnmarketplace.com/api/v1/me \
-H "Authorization: Bearer smcp_..."3. Start building
/api/v1. The machine-readable spec is at /api/v1/openapi.json.Authentication
Authorization header (all requests)
Authorization: Bearer smcp_YOUR_TOKEN_HEREGenerated 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
Tokens created in the dashboard get profile:read, assets:read and assets:write. The other scopes are honoured by the API but not yet grantable from the dashboard; sign in and call those endpoints with your session JWT. You can revoke tokens at any time from Dashboard → Developer.
profile:readRead your profileprofile:writeUpdate your profileassets:readList and read your assetsassets:writeCreate, update, delete, and upload assetstokens:readList your tokens via the APItokens:revokeRevoke tokens via the APIEndpoints
Base URL: https://uefnmarketplace.com/api/v1
Platform
https://uefnmarketplace.com/api/v1/healthPublic health check — no auth required. Returns platform status.
Profile
https://uefnmarketplace.com/api/v1/meRead your profile (username, bio, seller status, social links, subscription tier).
https://uefnmarketplace.com/api/v1/meUpdate editable profile fields (display name, bio, website, socials, hire details, country).
Assets — listing management
https://uefnmarketplace.com/api/v1/assetsList your asset listings. Filter by status (draft, pending, scheduled, published, rejected, changes_requested, archived), paginate with limit and offset.
https://uefnmarketplace.com/api/v1/assetsCreate a new draft listing (approved sellers only). Returns the asset id needed for upload steps.
https://uefnmarketplace.com/api/v1/assets/batchBatch-create up to 25 draft assets in one call. Returns per-item success/failure (207).
https://uefnmarketplace.com/api/v1/assets/:idGet full asset details including images, tags, and category.
https://uefnmarketplace.com/api/v1/assets/:idUpdate metadata, pricing, visibility, tags, or schedule.
https://uefnmarketplace.com/api/v1/assets/:idPermanently delete a draft asset. Only status=draft can be deleted.
Assets — upload lifecycle
Four-step workflow: get signed URL → PUT binary → confirm → submit
https://uefnmarketplace.com/api/v1/assets/:id/upload-urlGenerate a short-lived signed URL for uploading the asset file (ZIP, etc.). Not available on a published listing — new files for live listings go through version review in the seller dashboard.
https://uefnmarketplace.com/api/v1/assets/:id/confirm-fileRecord the uploaded file on the asset, using the storage_path upload-url returned. Required before submit.
https://uefnmarketplace.com/api/v1/assets/:id/images/upload-urlGenerate a signed URL for uploading a gallery image. Upload WebP — the site serves gallery images as WebP.
https://uefnmarketplace.com/api/v1/assets/:id/confirm-imageRegister an uploaded image (the public_url upload-url returned) in the gallery. First image becomes the thumbnail.
https://uefnmarketplace.com/api/v1/assets/:id/submitSubmit a draft, rejected or changes-requested asset for review. Asset must have an uploaded file. A future scheduled_publish_at makes it scheduled; it enters review at that time.
Token management
https://uefnmarketplace.com/api/v1/tokensList all your developer tokens (names, prefixes, last used at).
https://uefnmarketplace.com/api/v1/tokens?id=:uuidRevoke a specific token by its UUID. The token stops working immediately.
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": "Modular forest pack — trees, rocks, and foliage for UEFN maps.",
"pricing_type": "fixed",
"price": 9.99,
"visibility": "public",
"tags": ["nature", "forest", "UEFN"]
}
# → 201 Created
{ "id": "asset-uuid", "slug": "epic-forest-pack", "status": "draft", "tags": [...], ... }Step 2 — Upload the asset file
Get a signed URL, PUT the file, then confirm
# 2a. Get a signed upload URL (valid for 2 hours)
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.webp" }
# Response: { "signed_url": "...", "storage_path": "...", "public_url": "https://..." }
# 3b. PUT the image binary
curl -X PUT "<signed_url>" \
--upload-file preview.webp \
-H "Content-Type: image/webp"
# 3c. Register the image in the gallery
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/confirm-image
{ "public_url": "https://..." }
# → 201 { "success": true, "image_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, "id": "asset-uuid", "status": "pending" }
# Asset is now in the moderation queue.Error codes
401 UNAUTHORIZEDMissing, invalid, expired, or revoked token.400 INVALID_INPUTA field failed validation — the message names it.403 FORBIDDENToken lacks the required scope, or the account is suspended.403 NOT_A_SELLER / ACCOUNT_RESTRICTEDOnly approved, unrestricted sellers can create listings.404 NOT_FOUNDResource does not exist or does not belong to you.409 CONFLICTSlug already taken.409 INVALID_STATUS / NOT_DRAFTStatus prevents the action (submit needs draft, rejected or changes_requested; delete needs draft).409 LISTING_IS_LIVEThe listing is published; upload a new version from the seller dashboard instead.409 PAYOUTS_REQUIRED / PRECONDITION_FAILEDConnect payouts before a paid listing goes live, or the change needs a plan feature.422 NO_FILETried to submit an asset that has no uploaded file.429 RATE_LIMITEDToo many requests — back off and retry.500 INTERNAL_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 setupUEFN 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)
The MCP server runs permanently at https://uefnmarketplace.com/api/mcp, served by the UEFN Marketplace site itself. 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 accepted:
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":"tools/call","params":{"name":"health_check"}}'
# → result.content[0].text reports "ok": true and your user id
# A bad token returns HTTP 401. (ping, initialize and tools/list answer without a token.)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.
Install — download and build (Node 18+)
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.jsClaude Desktop — local process
{
"mcpServers": {
"uefn-studio": {
"command": "node",
"args": ["/path/to/uefn-studio-mcp-server/dist/index.js"],
"env": {
"UEFN_API_TOKEN": "smcp_YOUR_TOKEN_HERE"
}
}
}
}Cursor / VS Code — local process
{
"mcp": {
"servers": {
"uefn-studio": {
"type": "stdio",
"command": "node",
"args": ["/path/to/uefn-studio-mcp-server/dist/index.js"],
"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.
| Tool | Hosted MCP | Local 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 | ✅ | ✅ |
| submit_asset | ✅ | ✅ |
| get_seller_profile / get_seller_stats / … | — | ✅ |
| 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 | — | ✅ |
The listing tools behave identically on both: the local server calls the same hosted REST API, so every listing passes the same review checks.
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:
create_asset→ creates draft, returns asset UUIDget_asset_upload_url→ gets signed URL for the ZIP- HTTP PUT to the signed URL (the AI handles this automatically)
confirm_asset_file→ records the fileget_image_upload_url→ gets signed URL for the image- HTTP PUT the image to the signed URL
confirm_image→ adds the image to the gallerysubmit_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.
| Variable | When to use |
|---|---|
| UEFN_API_TOKEN | Recommended — token from Dashboard → Developer. Auto-refreshes. |
| SUPABASE_USER_JWT | Advanced; your Supabase JWT. Expires hourly, must be manually refreshed. |
| SUPABASE_SERVICE_ROLE_KEY | Admin 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 exact URL shown on this page (no www) — www redirects to it, and some clients break OAuth discovery on a 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 an API route of the site and is always available as long as uefnmarketplace.com is up. ping needs no token; if a tool call returns 401, your token is invalid or revoked. 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.
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.