The payment side is narrower than the storage side: createPaymentInstruction and updatePaymentInstruction state support for USDC with 6 decimals on Base and Base Sepolia only. Semantic search is opt-in per file — queryVectors reaches a group's files after vectorizeFile has run on them, not the whole account. Local uploads are fenced to the directories listAllowedDirectories returns, which is worth checking before pointing uploadFile at a path.
A Pinata account front end covering 35 tools, spanning IPFS uploads and gateway reads, file groups, x402 payment instructions, EIP-712 signatures and vector search.
- Files end to end: uploadFile takes either a file:// URI or base64 content, searchFiles filters by name, CID or MIME type, getFileById returns the detail, updateFile edits the name and key-value pairs, and deleteFile removes it.
- Links sized to the audience: createLink returns a gateway URL for a public file and a temporary download link for a private one, createPrivateDownloadLink issues the timed link directly, and fetchFromGateway returns the content itself.
- Grouping as the unit of organisation: createGroup, listGroups, getGroup, updateGroup and deleteGroup, with addFileToGroup and removeFileFromGroup moving files between them.
- Content already on IPFS: pinByCid pins an existing CID into the account with optional host_nodes and metadata, queryPinRequests reports where each request stands, and cancelPinRequest drops a pending one.
- Paid access to a CID: createPaymentInstruction sets an amount in USDC and a pay_to address, addCidToPaymentInstruction and removeCidFromPaymentInstruction control what it covers, and listPaymentInstructions, getPaymentInstruction, listPaymentInstructionCids, updatePaymentInstruction and deletePaymentInstruction handle the rest.
- Provenance and semantic lookup: addSignature attaches an EIP-712 signature to a CID with getSignature and deleteSignature alongside it, while vectorizeFile, queryVectors and deleteFileVectors give a group a text query that matches on meaning.
- Uploads that do not go through the client: createSignedUploadUrl issues a URL constrained by allow_mime_types, max_file_size and an expiry, so a browser can upload without holding the API key.
A Pinata account and a working Pinata JWT — testAuthentication is the call that confirms it. Uploads from the local machine read only the directories that listAllowedDirectories reports, and a payment instruction needs an address to pay to.
One command — npx -y pinata-mcp
