worldcoin/developer-portal/mcp
Claude Code and agent skill by worldcoin/developer-portal
- community
Checking that the SKILL.md file is still in the repository.
Build, configure, and submit World ID 4.0 apps and Mini Apps via the World developer portal. Use whenever the user wants to ship something to the World app store, set up sign-in-with-World-ID, or manage signing keys / actions for an existing app.
Install
npx vskill@latest install worldcoin/developer-portal/mcpSKILL.md
World ID developer portal MCP
This MCP authenticates with a developer-portal team API key and exposes 12 tools for the full app lifecycle. Always use get_team_context first if the user hasn't given you an app_id — it returns the team and any existing apps so you can pick or confirm.
Tool reference
| Tool | Purpose | Key inputs | |||
|---|---|---|---|---|---|
get_team_context | List the team's apps + status | (none) | |||
get_app_config | Snapshot of an app: World ID config, store metadata, mini-app settings | app_id | |||
create_app | Create a new production app | name; optional app_mode (external \ | mini-app), verification (cloud \ | on-chain), category, integration_url | |
configure_world_id | Create a managed World ID 4.0 RP for the app: KMS manager key, on-chain registration, signer wallet | app_id; optional signer_private_key (else the server generates one and returns it once) | |||
get_world_id_signing_key | Read the signer address for an app. Private key is never returned here. | app_id; optional rotate_if_unavailable | |||
rotate_world_id_signing_key | Generate a new World ID signing key. Returns the private key once. | app_id; optional signer_private_key | |||
get_world_id_registration_status | Sync the on-chain registry status for an RP | app_id | |||
retry_world_id_registration | Retry managed registration using the saved RP ID, manager key and signer; checks the contract first | app_id, environment (production or staging) | |||
create_world_id_action | Create / update a v4 action (the thing you verify against) | app_id, action; optional description, environment | |||
configure_mini_app | Update mini-app store metadata + Advanced/Permissions config | app_id; many optional fields, see below | |||
upload_app_image | Upload an app image (logo, hero, content_card, meta_tag, showcase_1/2/3) and patch the matching *_url field | app_id, image_type, one of source_url (https only, public addr, no redirects) / image_base64. Format detected from magic bytes. PNG/JPEG ≤500KB. | |||
submit_app_for_review | Submit an unverified app for review. Requires confirm_submission: true. | app_id, confirm_submission; optional changelog, is_developer_allow_listing |
Canonical flows
A. Build an external (non-mini) World ID app end-to-end
After step 2, store the returned private_key in the developer's app environment as WORLD_ID_PRIVATE_KEY (or whatever their app expects). The portal does not retain it.
B. Build a Mini App with full Advanced settings
configure_mini_app accepts store metadata, Advanced/Permissions config, and the App Store description in a single call:
If an app already has an approved version and no current draft, configure_mini_app and upload_app_image first create an unverified draft copied from the approved metadata, then apply the change. Successful responses include draft_created: true when that happens.
description_overview: string— required for review; the human-readable overview shown to users in the app store. Pass it as a plain string here; the server JSON-encodes it (withdescription_how_it_worksanddescription_connect) into the underlyingapp_metadata.descriptioncolumn for you. Don't pre-construct the JSON yourself.description_how_it_works,description_connect— optional companion sections (also stored inside the encoded description JSON).contracts: string[]— Worldchain contract addresses the mini app callspermit2_tokens: string[]— token addresses approved for Permit2 signingwhitelisted_addresses: string[]— wallets allowed to interact (pass[]to disable)associated_domains: string[]— universal-link domainscan_import_all_contacts,can_use_attestation— capability togglesmax_notifications_per_day:"0" | "1" | "2" | "unlimited"— notification cap (string-only enum so MCP clients with strict JSON schema validators accept all values;"unlimited"automatically setsis_allowed_unlimited_notifications: true)
All address arrays are validated as 0x + 40 hex chars; URLs as https://...; reject any element with an embedded comma.
C. Upload images (logo / hero / content_card / meta_tag / showcase_N)
upload_app_image accepts the bytes in two ways:
- `source_url` — public HTTPS URL the server fetches (best for URLs the user already gave you, or staging asset CDNs)
- `image_base64` — base64-encoded bytes (use for local files)
When the user gives you a local file path, base64-encode it client-side via Bash and pass through:
You don't need to specify the format — the server inspects the magic bytes and stores the file as PNG or JPEG accordingly. Anything that isn't a real PNG/JPEG (or anything >500KB) is rejected with -32602.
source_url is fetched server-side over HTTPS only, must resolve to a public address (loopback / private / link-local rejected), and redirects are not followed — if the user gives you a URL that redirects, resolve the final URL client-side first.
The server uploads the bytes to S3 and patches app_metadata.{logo_img_url|hero_image_url|content_card_image_url|meta_tag_image_url|showcase_img_urls[N]} in one call. No follow-up configure_mini_app is needed for images. Successful responses include committed: true.
If the metadata patch fails after the S3 upload (rare — typically a transient Hasura error), the server best-effort deletes the S3 object and returns -32603 with data: { committed: false }. Retries are idempotent, so just call the same tool again.
upload_app_image is rate-limited per API key: 60 uploads/minute, 500/day. Hitting the cap returns -32029 with data.retry_after_seconds.
Image bytes flow through your context as base64 — fine for typical app icons (<100KB), wasteful for very large screenshots. Prefer source_url whenever the image is already on the web.
D. Rotate a leaked signing key
Returns a fresh private_key once. Submits the on-chain updateRp transaction (primary registry, plus best-effort staging on production deployments) and updates app_metadata.signer_address. The status flips to pending until the on-chain TX confirms; poll status_endpoint to watch the transition back to registered. Self-managed RPs (e.g. legacy registrations not created via MCP) return -32004 with data.reason: "self_managed_mode" — those have to be rotated by the developer themselves.
E. Read-only inspection
Pitfalls and constraints
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingweb/api/mcp/SKILL.md
Popularity
- Repository stars
- 135
- Repository forks
- 59
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 2 Jul 2026, 4 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/worldcoin/developer-portal/mcp)