start_guest_session
Start a unique guest session when public guest access is enabled. No InkFE account needed.
Input
No arguments.
Returns
{ guestToken, expiresAt, instructions }Error codes
rate_limited, connector_unavailable
Connection guide · Open to everyone
Use your AI app to find a business-card template, personalize it, review both sides and continue to Shopify checkout with your artwork attached.
Anyone can connect; there is no invitation or waitlist. Add InkFE to your AI app as a custom connector (remote MCP server) using the endpoint below. Guests can design and start checkout without an account. To save a design to your InkFE account, sign in with your InkFE login when your app asks and review the requested permissions. Your app handles the OAuth connection. Questions: orders@inkfe.com.
Your app needs remote MCP over Streamable HTTP; signing in also needs compatible OAuth. InkFE is listed on the official MCP Registry as com.inkfe/print.
You pay on InkFE's secure Shopify checkout. Review both artwork sides in your AI app, then review the final charges and pay in Shopify.
InkFE currently sells to shipping addresses in the United States. Quotes are in US dollars; Shopify confirms shipping, tax and the final total. InkFE is operated by InkFE, LLC.
Works end to end: design, both proofs, approval and Shopify checkout. Changing the artwork creates a new version that needs your approval again.
Add InkFE as a custom connector using the endpoint below, then ask for business cards. Design, proof review, approval and Shopify checkout all work. Never paste passwords or card details into the chat.
If a request seems stuck, ask your assistant to check its last result before trying again.
Any AI app that supports remote MCP connectors can connect with the same endpoint. ChatGPT support is coming soon.
https://www.inkfe.com/api/mcpinkfe-print, version 0.1.0Send each JSON-RPC 2.0 request as a POST with Content-Type: application/json and Accept: application/json, text/event-stream. Handle the negotiated protocol's JSON or server-sent event response. The server is stateless; no persistent session id is required.
Builder example for clients that accept this configuration format; your client handles OAuth discovery and keeps its tokens private:
{
"mcpServers": {
"inkfe": {
"type": "http",
"url": "https://www.inkfe.com/api/mcp"
}
}
}POST https://www.inkfe.com/api/mcp
Authorization: Bearer <access token managed by your client>
Content-Type: application/json
Accept: application/json, text/event-stream
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"your-client","version":"1.0"}}}Use the live tools/list schemas and returned instructions as the source of truth. Guest tools and write tools depend on the endpoint's enabled capabilities. Generated client notes can become stale; get_product never substitutes for get_quote.
Customer connections use InkFE-owned OAuth with Shopify-backed sign-in. The AI app gets a revocable grant for the permissions you approve, not your Shopify login credentials. Account-owned designs require that same verified customer on later calls. Manage or revoke connections at AI connections.
When guest access is enabled, compatible clients can browse without signing in. Call start_guest_session and pass its private guestToken with design and checkout calls. Guest credentials expire after seven days; revoke_guest_session ends access sooner. This does not delete artwork.
Signed-in customers create account-owned designs directly; they do not need a guest session. Guests can verify ownership through the returned private save link. Once saved, the design belongs to that account and guest access to it ends.
Invalid supplied credentials receive 401 Unauthorized. Reconnect through your app if the connection has expired or was revoked. Builders must keep tokens in the client's secure credential storage, out of prompts, logs and URLs. Provisioned integration keys are a separate operator-managed capability, not customer identity.
Use your own business details. These prompts keep product choices, artwork approval and payment as separate decisions.
For other products: “Find InkFE postcards and explain which design or upload steps are supported. Give me the product page for anything this connector cannot complete.” Catalog discovery is broader than the current business-card design journey.
Tools return JSON in a text content block; design and proof tools also return image blocks. Arguments are validated against the schema advertised by tools/list; invalid arguments return an isError result describing the problem.
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_business_card_templates","arguments":{}}}HTTP/1.1 200 OK
Content-Type: text/event-stream
event: message
data: {"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"{ \"templates\": [ ... ] }"}]}}Start a unique guest session when public guest access is enabled. No InkFE account needed.
No arguments.
{ guestToken, expiresAt, instructions }rate_limited, connector_unavailable
End this guest session. Existing orders and artwork are unaffected.
guestToken (private string). The session credential to revoke.{ revoked: true }rate_limited, connector_unavailable
Free-text search over the public InkFE catalog. Use it to find products other than template business cards, or to confirm a handle before calling get_product.
query (string, 1-160 characters). Matched against product titles, types and tags.limit (integer 1-20, default 10). Maximum number of products returned.productType / templateCompatibleOnly / availableOnly (optional string / boolean / boolean). Filter by exact product type, supported template journey or current availability. Catalog visibility does not mean a product supports agent design.Products include handles, titles, price ranges, options, URLs and artwork workflow support. Filters can return fewer matches than the candidate limit; an empty result is not an exhaustive inventory statement.connector_unavailable, internal_error
Describes one public product: options with their roles, every purchasable variant with its pack price, whether a back side is printed, and the trim size when known.
handle (string, 1-255 characters). The product handle exactly as returned by search_products or list_business_card_templates.selectedOptions (optional array of { name, value }, up to 8 entries). Partial or complete choices. Returns missing/invalid options, compatible choices and the exact variant when resolved. Never silently substitute a choice.Product, dimensions, options and variants, plus configuration status, quantity rules, artwork workflow, source freshness and policy links. A resolved variant is catalog information, not a purchase quote; call get_quote.product_unavailable, connector_unavailable, internal_error
Quote one supported business-card pack using current Shopify pricing. Valid for 10 minutes; no price lock or delivery guarantee.
handle (string, 1-255 characters). The supported product handle from get_product.selectedOptions (array of { name, value }, 1-8 entries). Complete, exact buyer selections. Unavailable combinations are rejected.lineQuantity (positive integer, optional, default 1). Only one pack is supported. The Quantity option determines the number of printed cards.{ quoteId, quoteToken, productTitle, configuration, variantId, quantity, subtotal: { amount, currency }, shipping, tax, discounts, total, delivery, issuedAt, expiresAt, instructions }. Shipping, tax, discounts and total are unknown until Shopify checkout. Delivery is unconfirmed; productionBusinessDays is an estimate or null.product_unavailable, variant_unavailable, quote_unavailable, connector_unavailable, internal_error
The starting point for a business card. Lists the Classic templates a buyer can personalise, with preview images, physical size, the product to buy and the fields each template needs.
No arguments.
{ templates: [{ templateId, name, orientation, widthInches, heightInches, previewUrls: { front, back }, hasBack, fields: [{ attribute, label, side, inputType, required, sampleValue, maxLines? }], productHandle }] }connector_unavailable, internal_error
Applies the buyer's field values (and logo, if the template needs one) to a template, fits the text to its printable area, renders both sides as preview images, and returns a design token to redeem with create_checkout.
guestToken (private string, guest sessions only). Required for guest design and checkout when guest access is enabled. Omit for customer OAuth or provisioned integrations. Never display it or put it in a URL.requestId (string, 8-128 letters, digits, hyphens or underscores). Use a new id for each intentional design. Reuse the same id and inputs after a timeout; completed requests return the saved design.templateId (positive integer). The templateId from list_business_card_templates identifying which Classic business card to design.fields (object, string values, at most 64 keys / 2000 characters each). Every field from the template's `fields` list, keyed by `attribute`, is required. A blank or missing value fails with missing_required_fields.logoUrl (https URL, at most 2048 characters, optional). A public PNG or JPEG image, required only when the template has an imageUrl field.{ designToken, proof (artifact and saved-image hashes), saveUrl (private browser ownership link), designId, templateId, revisionId, expiresAt, previews: [{ side, url, expiresInSeconds: 300, width?, height? }], warnings: [{ attribute, layerId, code: "text_shrunk", fromFontSize, toFontSize }], nextStep }, plus the same two preview images attached as PNG image content blocks.design_request_invalid, design_request_conflict, design_in_progress, design_failed, unknown_template, missing_required_fields, unknown_field, value_too_long, unsupported_characters, logo_required, logo_fetch_failed, logo_unsupported, rate_limited, connector_unavailable, internal_error
Revise an authorized design into a new immutable design ID using the same published template. Prior approval never transfers to the revision.
guestToken (private string, guest sessions only). Required for guest design and checkout when guest access is enabled. Omit for customer OAuth or provisioned integrations. Never display it or put it in a URL.requestId (string, 8-128 letters, digits, hyphens or underscores). New id for this intentional revision; reuse for retries.designToken (string, 1-4096 characters). The existing design capability from this session or the verified owner.fields (object, same limits as create_business_card_design). Complete replacement values, not a partial patch.logoUrl (https URL, optional). Supply again when the template needs a logo.A new designToken/designId, proof hashes, both preview images, signed preview links and warnings. Review and approve the new revision.access_denied, design_token_expired, unknown_template, design_request_conflict, design_in_progress, design_failed
Refresh links and return both saved preview images for the same authorized revision. Never rerenders or extends design expiry.
guestToken (private string, guest sessions only). Required for guest design and checkout when guest access is enabled. Omit for customer OAuth or provisioned integrations. Never display it or put it in a URL.designToken (string, 1-4096 characters). The unexpired design capability.Design identity, proof hashes, warnings, original expiry, 300-second links and both saved image blocks. Refresh is not approval.access_denied, design_token_expired, design_not_found, proof_changed, proof_unavailable
Record the AI app's report of explicit customer approval of both sides and print options. Artwork approval is separate from payment consent.
guestToken (private string, guest sessions only). Required for guest design and checkout when guest access is enabled. Omit for customer OAuth or provisioned integrations. Never display it or put it in a URL.designToken (string, 1-4096 characters). The exact design the customer reviewed.quoteToken (string, 1-8192 characters). A current quote for the exact print options.frontReviewed / backReviewed / artworkApproved (three required booleans, all true). Only report true after showing both previews and warnings and receiving explicit customer approval.{ approvalId, proofHash, configurationHash, approvedAt, expiresAt, evidence: agent_reported, designId, printedSides, instructions }. Repeating identical approval preserves its id and expiry.proof_required, proof_changed, proof_expired, proof_unavailable, access_denied, quote_expired, quote_changed, connector_unavailable
Revalidates the accepted quote and turns a design token from create_business_card_design plus the buyer's chosen pack options and email into a Shopify checkout URL, with the print-ready artwork attached to the line item.
guestToken (private string, guest sessions only). Required for guest design and checkout when guest access is enabled. Omit for customer OAuth or provisioned integrations. Never display it or put it in a URL.approvalId (UUID). Recorded proof approval for this design and print configuration, returned by approve_design_proof.quoteToken (string, 1-8192 characters). Required token from get_quote, after the buyer confirms the pack and commercial terms. Expired or changed terms need a new quote and confirmation.designToken (string, 1-4096 characters). The designToken returned by create_business_card_design for the design the buyer approved.selectedOptions (array of { name, value }, 1-8 entries, unique names, each 1-255 characters). Every customer-facing option get_product lists for the business card product, keyed by option name with the buyer's chosen value exactly as listed.buyer ({ email, name? }). Use the checkout email explicitly supplied for this purchase; ask if missing. Never infer buyer details from printed artwork. Name is optional, at most 120 characters. Email does not prove ownership.confirmUpdatedQuote (literal true, optional). Only after explicit confirmation of changed commercial terms on an existing purchase. Reuses that purchase and never replaces an uncertain cart. Omit for ordinary retries.{ approvalId, quoteId, quotedSubtotal, checkoutUrl, cartId, designAssetId, lineItem: { productTitle, variantTitle, packPrice, currency, selectedOptions }, instructions }proof_required, proof_changed, proof_expired, proof_unavailable, quote_required, quote_invalid, quote_expired, quote_changed, quote_unavailable, design_token_invalid, design_token_expired, design_not_found, unknown_template, product_unavailable, variant_unavailable, rate_limited, storage_failed, cart_create_failed, checkout_conflict, checkout_in_progress, checkout_recovery_required, connector_unavailable, internal_error
A failed tool call is still HTTP 200 and a JSON-RPC result: the result has isError: true and its single text block is a JSON envelope with a stable code, a human-readable message and optional details.
{
"content": [
{
"type": "text",
"text": "{\"error\":{\"code\":\"product_unavailable\",\"message\":\"This product is not available for purchase.\",\"details\":{\"handle\":\"unknown-handle\"}}}"
}
],
"isError": true
}| Code | Meaning |
|---|---|
| design_request_invalid / design_request_conflict | Use a bounded stable requestId. Reuse it only with identical inputs; intentional changes need a new id. |
| design_in_progress / design_failed | Retry the same id while processing or after a timeout. A confirmed failed request needs its cause fixed before an intentional new request. Persistent interrupted work needs support. |
| proof_required / proof_changed / proof_expired / proof_unavailable | Checkout needs approval for the exact saved artwork and print options. Refresh unavailable previews; review changed or expired artwork again. |
| quote_required / quote_invalid / quote_expired / quote_changed | Request a new get_quote result and renewed buyer confirmation. Checkout never substitutes changed terms automatically. |
| quote_unavailable | The product, quantity mode or production rules are unsupported in this journey. Use the product page. |
| connector_unavailable | The connector is temporarily unavailable. Retry later. |
| internal_error | An unexpected error on our side. Retry the call; contact support if it persists. |
| product_unavailable | The handle is unknown or the product is not sold publicly. details.handle echoes the request. |
| unknown_template | The templateId is not in the connector's template list. |
| missing_required_fields | One or more required fields were blank. details.attributes lists them. |
| unknown_field | A field key the template does not have (or logoUrl was given for a template with no logo field). details.attribute names it. |
| value_too_long | A value does not fit its layer even at the smallest allowed size. details.attribute names it. |
| unsupported_characters | A value contains characters the template font cannot print. details.attribute names it. |
| logo_required / logo_fetch_failed / logo_unsupported | The template needs a logo, the logo URL could not be fetched (https only, 10 MiB cap), or the image is not a readable PNG or JPEG between 32 and 8000 pixels on each side. |
| design_token_invalid / design_token_expired / design_not_found | The design token is malformed, older than seven days, or its stored design no longer exists. |
| access_denied | This caller lacks permission, the design belongs to a different integration, or the design has been claimed by a customer. |
| variant_unavailable | No purchasable variant matches selectedOptions. details.selectedOptions and details.availableOptions echo the request and the product's real options. |
| rate_limited | The rate limit for this key or design was exceeded. details.retryAfterSeconds says when to retry. |
| storage_failed / cart_create_failed | The artwork upload or cart request failed. Its outcome may be uncertain. Retry the same approval and purchase details; never create another purchase automatically. |
| checkout_conflict / checkout_in_progress / checkout_recovery_required | An approval belongs to one purchase. Changed details conflict; in-progress or uncertain outcomes must reuse that purchase. Contact support if recovery remains unavailable. |
create_business_card_design: 20 calls per minute per integration or guest session.create_checkout: 3 calls per hour per design, with additional upload limits. One approval maps to one purchase attempt. Reuse the returned checkoutUrl; identical retries recover the same cart and artwork. Changed buyer details conflict, and uncertain outcomes stop for recovery.rate_limited with details.retryAfterSeconds.search_products queries are limited to 160 characters and 20 results.Questions about connecting, the template list or an order placed through the connector: orders@inkfe.com. Include the tool name and error code from the response; never include access, guest, design or quote tokens, signed preview URLs, or private checkout links.
To report a security issue, email the same address with "Security" in the subject line.
Read our privacy policy, terms of service, returns and refunds policy or contact InkFE. Your AI app also has its own data-handling terms.