# Mintlab > Mint NFTs from images, manage an NFT wallet, and use the marketplace on ICP. Website / ICP MCP app_url: https://mintlab.website Internet Identity derivation_origin: https://2u7me-laaaa-aaaas-qgr2q-cai.icp0.io The website, www.mintlab.website, Genesis Colony, and agents use this same canister derivation origin so the same II account reaches the same wallet. The website URL and identity derivation origin have different purposes. ## Discovery - [Declared canisters](https://mintlab.website/.well-known/ic-architecture): deployment-generated JSON, authoritative MCP access scope. - [Identity origin](https://mintlab.website/.well-known/ii-derivation-origin): canonical origin as plain text. - [Agent playbook](https://mintlab.website/agents/playbook.txt): exact workflow, Candid arguments, fees, and recovery. - [Conversation images](https://mintlab.website/agents/images.txt): attachment access, local compression, Base64/chunking. - [Troubleshooting](https://mintlab.website/agents/troubleshooting.txt) - [Terms](https://mintlab.website/terms) - [Privacy](https://mintlab.website/privacy.html) - [Human help](https://mintlab.website/help) Start with ICP MCP open_app("https://mintlab.website"). Use its app_url and derivation_origin separately. Fetch the backend's Candid interface and get_canister_api_doc (backend query getApiDoc). getAgentCapabilityGuide is a structured index. Use exact Candid signatures; check query/update annotations. ## Mint one uploaded conversation image 1. Authenticate the user's II account for the derivation origin above. 2. getAgentMintReadiness() is an authenticated UPDATE that reads the ledger once without spending ICP. Read principal, accountIdHex, balanceE8s, mainMintPriceE8s, mainMintEnabled, termsAccepted, enoughIcpForOneMint. 3. Present current terms and call acceptCurrentTerms() when the user accepts them, if not already accepted. Uploads and mints require current acceptance. 4. One paid mint needs price + 10000 e8s in the in-app account. A free mint has no ledger payment fee. Funding from another wallet adds its own transfer fee. Use ONLY the fresh accountIdHex from readiness/getUserAccountId for deposits. 5. Read the actual uploaded image with file tools. Compress locally to clean PNG/JPEG <=130000 bytes. Chat attachment IDs, sandbox paths, and private file URLs are not images that Mintlab can fetch. 6. uploadMintImageBase64(contentType, base64WithoutDataPrefix), or use the chunked protocol in agents/images.txt. Upload methods are authenticated UPDATES. Keep the same principal for upload and mint. 7. mintUserNFT(metadataWithUploadedImageUrl, null) mints ONE NFT to the caller. Use mintUserNFTAndSend only when the user requested a recipient. It returns a mint receipt plus per-NFT transfer results; delivery can fail after minting. 8. Report receipt NFT IDs and delivery failures. After a mint error/timeout, check pending payments and wallet state before retrying. ## Funding and authority The ICP deposit account is a subaccount of the backend derived from the user's app principal. It is not the principal's default ledger account. Never reuse a remembered deposit address from another identity. The ICP ledger dependency is ryjl3-tyaaa-aaaaa-aaaba-cai. It is shared infrastructure, not a Mintlab-operated canister and not declared by Mintlab's manifest. The backend checks the in-app balance and pays for authorized mints without direct MCP ledger access. To add funds, use a wallet or separately authorized ledger integration. ## Image and cycle limits PNG/JPEG only; 130000 raw bytes; 180000 data-URL characters; 16000 raw bytes per chunk, at most 10 chunks. Strip JPEG EXIF/XMP/ICC/COM. There is no server-side recompression or fetching of private attachments. Temporary uploads are public, expire after 2 hours, and are limited to 2 per principal; one chunk assembly per principal. A successful mint consumes its upload and stores permanent NFT data. Global storage caps and cooldowns bound repeated work. Discovery uses static files and small queries. Cache discovery; call readiness once per decision and refresh after funding/actions. Avoid polling, repeating uploads, creating collections, or topping up cycles merely for discovery or a main-collection mint. A connector-equipped agent still needs user authorization and file tools that can read/compress/encode attachments. URL-only browsing cannot sign transactions or extract an attachment's original bytes.