- Sign in (OAuth): apps such as ChatGPT and Claude open a Print.App page where you paste the key and allow access. The app never sees the key: it gets its own access, tied to that key.
- Send the key: developer tools and your own code send
Authorization: Bearer sk_…with every request.
Connect a client
- ChatGPT
- Claude
- Claude Code
- Cursor
- VS Code
- Claude API
- Codex
- OpenAI API
- In ChatGPT, add a custom MCP server (it is in developer mode; see OpenAI’s Connecting custom MCP servers in ChatGPT for where it is on your plan).
- Name it Print.App, enter the URL
https://api.print.app/mcp, and choose OAuth as the authentication. - ChatGPT opens the Print.App connect page. Paste a secret key of your store and click Allow access.
POST and keeps no sessions.
How signing in works
Clients find the sign-in on their own: a request without credentials gets a401 that points to https://api.print.app/.well-known/oauth-protected-resource/mcp, and from there to the authorization server’s metadata at https://api.print.app/.well-known/oauth-authorization-server. It supports dynamic client registration and client ID metadata documents, PKCE (S256) and refresh tokens. Access lasts an hour and the client renews it on its own; it stops within a minute of the key it was approved with being revoked.
Redirect URIs must be https addresses, as ChatGPT’s and Claude’s are. Apps that sign in through a local address (http://localhost:…) can’t register; send the key as a header from those instead.
What an agent can do
Each tool calls the REST API with your key, so the same rules, limits and errors apply. Tools that only read are marked read-only; tools that can delete are marked destructive, so clients that ask before running those will ask.
update_design also sets what a design uses (its connectors, resource profiles and PDF profile) and its own settings over the store’s.
The server also offers one prompt, set_up_connector (Set up a connector), for clients that list MCP prompts: it takes a product page and a goal, and writes out the steps below for the agent.
How an agent builds a design
create_designat the trim size, with bleed and a safe margin.upload_filefor logos, photos and SVG graphics.get_design_contentto read the page size and safe area, thenedit_designwith a batch of operations: text, shapes, graphics, photo frames, QR codes, calendars. The batch saves as one change, or not at all.preview_designreturns images of the pages, so the agent can look at its work and fix what it sees with anotheredit_design.set_product_designsto sell it on a store product, orcreate_editor_linkto share it.
How an agent sets up a connector
inspect_product_pagereads the product page of your store: each option control with a selector that finds it and the choices it sends, the Print Options fields with their roles, and the designs the product opens.get_designandpreview_designshow the design’s pages.test_connectorplays the connector, before it is saved, against the design for every choice: what the page sends, which mapping matches, what the editor does, with images of the pages each choice shows. It reports what stands in the way: a selector that finds nothing, choices without a mapping, pages the design doesn’t have, a design that isn’t on the product, another connector fighting this one.manage_connectorsaves it and attaches it to the designs (createwithdesignIds), andtest_connectorruns once more with its id.
Things to know
- Page content can only be edited on accounts that use the new editor. Others get
editor_not_supported. - SVG graphics go in as files. The firewall in front of the API refuses requests that carry markup, so an agent should upload an SVG with
upload_fileand place it as anasset, not write SVG into an operation. It stays vector in print. A tool call with SVG or HTML in its arguments fails with an HTTP403before it reaches the server, so the client reports a connection error rather than a tool error. - Fonts must be families your account has.
list_fontslists them;manage_fontimports any Google font. - Previews are redrawn each time a design is saved. They are for checking a layout; the PDF is made from the design itself.
- Settings that run code in your store (custom JS and CSS), send data elsewhere (webhook addresses) or delete customers’ projects can’t be changed through the MCP or the API, and the editor in use is read-only: change those in the dashboard.
update_settingsis marked destructive, so clients ask before running it. - Product pages are read as your server sends them, and only pages of your own store. Options a theme builds in JavaScript after the page loads aren’t seen; a store behind a password answers with its password page (give
test_connectorthe choices asvaluesinstead).