Connection guide · Open to everyone

InkFE MCP connector

Use your AI app to find a business-card template, personalize it, review both sides and continue to Shopify checkout with your artwork attached.

Getting access

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.

Choose your app

Claude web · Verified

  1. Add a custom remote connector using the endpoint below.
  2. Complete InkFE sign-in, review permissions and allow the connection.
  3. Start a new chat and enable InkFE. If the tool list is stale, refresh the connector tools, then turn InkFE off and on in that chat.
  4. Ask to see business-card templates. Open the labelled front and back proof links if your app does not display the images inline.

Works end to end: design, both proofs, approval and Shopify checkout. Changing the artwork creates a new version that needs your approval again.

Muse web · Verified

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.

Other apps

Any AI app that supports remote MCP connectors can connect with the same endpoint. ChatGPT support is coming soon.

Endpoint

  • URL: https://www.inkfe.com/api/mcp
  • Protocol: MCP over Streamable HTTP (stateless)
  • Server name: inkfe-print, version 0.1.0

Send 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.

Authentication

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.

Flow

  1. Discover. Call list_business_card_templates. Show the buyer the preview images and the fields each template needs; use search_products and get_product for any other print product.
  2. Collect. Help the buyer pick a template and gather a value for every required field. Logo fields take a public https PNG or JPEG URL; QR fields take the https URL the code should open.
  3. Design. create_business_card_design applies the values (and logo) to the template, fits the text, renders front and back previews, and returns a design token. Show the buyer both previews before moving on.
  4. Quote and checkout. Once the buyer approves the previews and chooses every product option, call get_quote. Show the pack, subtotal, production estimate and unknown charges. After explicit artwork approval, call approve_design_proof with both side-review confirmations. Pass its approvalId and the separately confirmed quoteToken to create_checkout. Expired or changed terms require a new quote and confirmation. Shopify checkout confirms shipping, tax, discounts, delivery availability and the final payable total.

Try a first order

Use your own business details. These prompts keep product choices, artwork approval and payment as separate decisions.

  1. “Show me InkFE business-card templates. I want one pack of 100 with Square corners. Show the current price and anything still unknown.”
  2. “Use the template I selected. Ask me for each required printed field, then show both sides and any fit warnings. Stop for my review.”
  3. “Change the job title to Operations Manager and show both revised proofs. Do not reuse my previous artwork approval.”
  4. After actually reviewing the proofs: “I approve both sides and the selected print options. Show me a current quote before checkout.”
  5. After confirming that quote: “Prepare Shopify checkout using the checkout email I provide. I will review final charges and pay there.”

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.

If something stops working

  • Connection unavailable: restart the connection from your AI app. Do not resubmit an old consent page. For Inspector, keep the registered localhost callback exact; localhost and 127.0.0.1 are different callback addresses.
  • Tools missing: refresh the connector's tools and start a new chat. Do not invent capabilities the tool list does not show.
  • Proof link expired: ask the agent to refresh the same design's proofs. Links last five minutes; refreshing does not change the artwork, renew a design token or grant approval.
  • Quote expired or changed: request a new quote and confirm its terms. Changed artwork or print options also needs new proof approval. Never accept changed terms automatically.
  • Checkout interrupted: return to its existing link. A tool retry must use the same approval, buyer and purchase details. An uncertain cart outcome needs recovery, not a replacement order.
  • Repeated authentication errors: stop and contact support with the tool name and error code. Do not paste credentials, loosen permissions or turn a failed sign-in into guest access.

Tools

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_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

revoke_guest_session

End this guest session. Existing orders and artwork are unaffected.

Input

  • guestToken (private string). The session credential to revoke.

Returns

{ revoked: true }

Error codes

rate_limited, connector_unavailable

search_products

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.

Input

  • 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.

Returns

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.

Error codes

connector_unavailable, internal_error

get_product

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.

Input

  • 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.

Returns

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.

Error codes

product_unavailable, connector_unavailable, internal_error

get_quote

Quote one supported business-card pack using current Shopify pricing. Valid for 10 minutes; no price lock or delivery guarantee.

Input

  • 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.

Returns

{ 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.

Error codes

product_unavailable, variant_unavailable, quote_unavailable, connector_unavailable, internal_error

list_business_card_templates

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.

Input

No arguments.

Returns

{ templates: [{ templateId, name, orientation, widthInches, heightInches, previewUrls: { front, back }, hasBack, fields: [{ attribute, label, side, inputType, required, sampleValue, maxLines? }], productHandle }] }

Error codes

connector_unavailable, internal_error

create_business_card_design

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.

Input

  • 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.

Returns

{ 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.

Error codes

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_business_card_design

Revise an authorized design into a new immutable design ID using the same published template. Prior approval never transfers to the revision.

Input

  • 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.

Returns

A new designToken/designId, proof hashes, both preview images, signed preview links and warnings. Review and approve the new revision.

Error codes

access_denied, design_token_expired, unknown_template, design_request_conflict, design_in_progress, design_failed

refresh_design_proof

Refresh links and return both saved preview images for the same authorized revision. Never rerenders or extends design expiry.

Input

  • 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.

Returns

Design identity, proof hashes, warnings, original expiry, 300-second links and both saved image blocks. Refresh is not approval.

Error codes

access_denied, design_token_expired, design_not_found, proof_changed, proof_unavailable

approve_design_proof

Record the AI app's report of explicit customer approval of both sides and print options. Artwork approval is separate from payment consent.

Input

  • 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.

Returns

{ approvalId, proofHash, configurationHash, approvedAt, expiresAt, evidence: agent_reported, designId, printedSides, instructions }. Repeating identical approval preserves its id and expiry.

Error codes

proof_required, proof_changed, proof_expired, proof_unavailable, access_denied, quote_expired, quote_changed, connector_unavailable

create_checkout

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.

Input

  • 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.

Returns

{ approvalId, quoteId, quotedSubtotal, checkoutUrl, cartId, designAssetId, lineItem: { productTitle, variantTitle, packPrice, currency, selectedOptions }, instructions }

Error codes

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

Error envelope

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
}
CodeMeaning
design_request_invalid / design_request_conflictUse a bounded stable requestId. Reuse it only with identical inputs; intentional changes need a new id.
design_in_progress / design_failedRetry 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_unavailableCheckout 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_changedRequest a new get_quote result and renewed buyer confirmation. Checkout never substitutes changed terms automatically.
quote_unavailableThe product, quantity mode or production rules are unsupported in this journey. Use the product page.
connector_unavailableThe connector is temporarily unavailable. Retry later.
internal_errorAn unexpected error on our side. Retry the call; contact support if it persists.
product_unavailableThe handle is unknown or the product is not sold publicly. details.handle echoes the request.
unknown_templateThe templateId is not in the connector's template list.
missing_required_fieldsOne or more required fields were blank. details.attributes lists them.
unknown_fieldA field key the template does not have (or logoUrl was given for a template with no logo field). details.attribute names it.
value_too_longA value does not fit its layer even at the smallest allowed size. details.attribute names it.
unsupported_charactersA value contains characters the template font cannot print. details.attribute names it.
logo_required / logo_fetch_failed / logo_unsupportedThe 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_foundThe design token is malformed, older than seven days, or its stored design no longer exists.
access_deniedThis caller lacks permission, the design belongs to a different integration, or the design has been claimed by a customer.
variant_unavailableNo purchasable variant matches selectedOptions. details.selectedOptions and details.availableOptions echo the request and the product's real options.
rate_limitedThe rate limit for this key or design was exceeded. details.retryAfterSeconds says when to retry.
storage_failed / cart_create_failedThe 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_requiredAn approval belongs to one purchase. Changed details conflict; in-progress or uncertain outcomes must reuse that purchase. Contact support if recovery remains unavailable.

Rate limits and timeouts

  • 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.
  • Exceeding a limit returns rate_limited with details.retryAfterSeconds.
  • Operations also share a global 60-per-minute limit. Guest startup/revocation and anonymous catalog reads each share a 20-per-minute public budget.
  • Requests time out after 300 seconds.
  • search_products queries are limited to 160 characters and 20 results.
  • Logo images must be publicly reachable over https, PNG or JPEG, at most 10 MiB, and between 32 and 8000 pixels on each side.

Data handling

  • A design token is valid for seven days; that expiry does not delete artwork. Preview URLs expire after five minutes; the saved images can also appear inline when the AI app supports image content.
  • The policy for unpaid, unsaved guest drafts is 30 days from the design request. Saved, checkout-linked and unresolved purchase artwork is protected by separate retention rules. Token expiry is not deletion.
  • When a checkout is created, the print-ready artwork is attached to the cart and retained with the resulting order for production and reorders, exactly as for designs made on inkfe.com.
  • The buyer's email is used to start the checkout; shipping and payment details are collected by Shopify. Do not send card details or verification codes to your AI chat. Printed contact details may belong to someone other than the buyer.
  • Logo images are fetched once from the URL you provide and stored only as part of the design.

Support

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.