MCP App Store
by KeenEthics
PassportCraft icon

PassportCraft

By PassportCraft LLC

Get New App Alerts

Overview

Create digital product passports from ChatGPT. Describe a product, share the documents you have, and PassportCraft creates a draft passport in your workspace and tells you what's still missing. PassportCraft is for brands, manufacturers and importers selling into the EU, and for the agencies that prepare passports for them. Battery passports are due from 18 February 2027 under the EU Battery Regulation (EU) 2023/1542, for e-bike and e-scooter batteries, industrial batteries above 2 kWh and EV batteries. Textiles and the other ESPR product groups follow as their delegated acts are adopted. Each passport is a public page for the product that opens when someone scans its QR code. When the product has a GTIN, that QR code is a GS1 Digital Link. What you can do from the chat: - Create a passport from the product details and documents you share. It always starts as a draft. - Check a draft and see which fields still need filling before it can be published. - Read your catalogue, drafts and published passports. - Attach certificates, test reports and declarations of conformity from your document library. - Add sizes and colours with their GTIN barcodes under one passport. - Record serial numbers against a battery model. - Send a finished draft for publishing approval, then check on the request. - Propose a change to a published passport for your team to approve. Things you can ask: "Create passports for the twelve styles in this line sheet." "Which of my drafts are still missing a recycled-content figure?" "Attach this mill certificate to the SKU 4471 draft." "Record these ten serial numbers against the 48 V e-bike battery." ChatGPT can't publish a passport. You read what it wrote and press Publish yourself. ChatGPT can propose changes to a public passport. The page changes only when someone in your workspace approves them. There is one exception. ChatGPT can record serial numbers against a battery model you've already published. They can appear on the public page right away, without anyone approving them. Connect your PassportCraft account to get started. No account yet? You can create one when you connect.

Tools

add_variants

ChatGPT
Add exact customer-supplied barcodes, sizes and colours to a draft textile or general passport. Do not infer missing values. Supply a size, a colour, or both for each barcode. The person reviews these assistant-supplied values before publishing. This cannot change a published passport or remove rows. Adding rows withdraws already-pending publish requests atomically. After a failed call, only an exact repeat is recognised as the same request. A replay describes the earlier outcome, not whether the rows still exist; use list_variants to establish current state.

attach_document

ChatGPT
Link a document already in the workspace library to a DRAFT passport. Get the id from list_library. Attaching to a passport the public can see is refused, because the public page serves attached documents live. If a request to publish is waiting on this passport, attaching a document that is not already on it withdraws that request, and the person has to be asked again. If this call fails, do not assume the request survived: some failures happen after it is already withdrawn. If you hold its approval_id, check with get_publish_approval; if you do not, say you cannot tell, and ask the person to look at their own list.

create_passport

ChatGPT
Use this when a person wants to create a digital product passport (DPP), a battery passport or another EU product passport for a textile, battery or general product in PassportCraft, from details they give you. Create a new product passport. It is always created as a draft — this tool cannot create anything the public can see. The answer carries edit_url, the address where the person opens the draft. A successful answer says created: true. Some failed answers come after the draft was made, so a failure alone does not show that nothing exists. Within 30 days, a request identical to an earlier one makes nothing new: it returns the product that request made, and the answer says created: false. That is not a failure: the product exists. Such a request can make a second product holding the same values only when it carries confirm_duplicate: true, which means the person was asked whether they want one and said yes. A value the person did not give, added only to make a request differ, still leaves them two copies of one product. After a failed call, only an exact repeat is recognised as the same request. A repeat that rewords any value is a new request, and can leave the person two products that look identical with nothing to tell them apart.

create_unit

ChatGPT
Record serial-numbered units against a battery model passport. A unit status must be one the regulation names; free text is refused and the refusal lists what is allowed. Asking twice for the same batch does not record it twice, and a repeat is not a failure. If these serial numbers are already on this battery model, the answer says so: they are on file, and the recording did not fail. After a failed call, only an exact repeat is recognised as the same request: the same serial numbers, in the same order, with the same statuses. Changing any of it makes it a different request. New units come back with qr_target, exactly what that battery's printed QR code encodes; list_units gives it for every unit.

get_category_schema

ChatGPT
Read the field set for a product category — names, types, which are required to publish, and what each one means. Read this BEFORE drafting, rather than guessing field names. A field can carry required_when beside required: that names another field and the values that make it apply, so a field required of one product is not required of another. Read the pair before telling a person a field is missing. Read list_custom_fields too for the workspace's own fields.

get_passport

ChatGPT
Read one product passport in full, including every field and its current status.

get_proposal

ChatGPT
Read what happened to a proposal: waiting, approved, out of date, expired, replaced or withdrawn. Out of date means it can no longer be approved as you sent it. Either someone edited a field you proposed to change, or a library file you proposed was deleted or had its access level or document type changed. The answer names each one in moved. If the person still wants the change, read the passport again, check any file in list_library, and send a new proposal. There is no reject button: a person who disagrees tells you, and a proposal nobody approves expires after seven days.

get_publish_approval

ChatGPT
Read the outcome of an earlier publish request: still waiting, approved, expired, or withdrawn by a later change. Read it whenever you asked for a publish and heard nothing back. If it comes back expired and the person still wants the passport published, just ask again with request_publish. If request_publish handed you a request that was still pending with an expires_at already in the past, that is one PassportCraft could not close on its own — reading it here closes it, and then you can ask again. There is no decline button in PassportCraft. Leaving the request alone is how a person turns it down: it expires by itself seven days after it was made. A change you make to the draft also withdraws it, but only when it CHANGES something — re-sending the same values withdraws nothing. Attaching a document the draft does not already carry, or sending a new file, withdraws it too — so do not add files to a draft while a request is waiting unless the person asked you for that file.

list_custom_fields

ChatGPT
List the workspace's own fields, archived ones included. Active fields are shown on the public passport under "Additional information". Read this with get_category_schema before drafting. A person fills these fields in PassportCraft.

list_documents

ChatGPT
List the documents attached to a passport. The answer is ONE PAGE, not the whole set. If has_more is true, follow next_cursor to the end before you tell anyone that something is not there.

list_library

ChatGPT
List the files already in the workspace library, across all products. Check this BEFORE sending a file: one declaration of conformity usually covers a whole product family, so if it is already here, attach the existing file with attach_document rather than sending it again. Every copy you send spends one of the workspace’s file slots. They are managed in the document library — every file in this answer carries library_url, which opens it. Give that address to the person. The answer is ONE PAGE, not the whole set. If has_more is true, follow next_cursor to the end before you tell anyone that something is not there. That matters most here: deciding a file is absent from one page is what produces the duplicate this tool exists to prevent.

list_passports

ChatGPT
Use this when a person asks about the product passports, DPPs or battery passports in their PassportCraft workspace: which exist, which are drafts and which are published. List the product passports in this workspace. Filter by status and by category. Trashed passports are left out unless you ask for that status by name. The answer is ONE PAGE, not the whole set. If has_more is true, follow next_cursor to the end before you tell anyone that something is not there. Narrow with category or status before you walk it: every row carries the whole product, so paging a large catalogue to answer one question is slow for the person waiting.

list_unit_readings

ChatGPT
Read the dated values recorded for one battery, including their source and evidence reference. Returns one page; use next_cursor while has_more is true. Pass field to read the history of one value. Model declarations and model-value fallbacks are current values, not historical readings; use list_units for those.

list_units

ChatGPT
List the individual units recorded against a battery model passport. The answer is ONE PAGE, not the whole set. If has_more is true, follow next_cursor to the end before you tell anyone that something is not there. A model may carry thousands of serials, so DO NOT page looking for one: to check whether a single serial is recorded, pass unit_serial and let the route find it in one call. Each unit carries qr_target: exactly what that battery's printed QR code encodes. Each battery gets its own code. Hand over each battery's qr_target, never the passport's address, as the code to print on it.

list_variants

ChatGPT
List the barcode, size and colour rows on a textile or general passport. The answer is ONE PAGE, not the whole set. If has_more is true, follow next_cursor to the end before you tell anyone that something is not there. Pass gtin to find one exact customer-supplied barcode. This establishes current state; an earlier add response does not.

propose_changes

ChatGPT
Propose changes to a passport that is already public. Nothing on the public page changes until a person approves the whole proposal in PassportCraft. Hand them the review_url this returns, and tell them what you changed and why. Send the fields to change in the shape update_passport takes; send a number together with its unit. To change the file behind a field, set <field>__document_id to a document already in the library (list_library). The file must already have the field’s access level; only a person uploads files or changes their level. You cannot propose a barcode, a serial number or a custom field. A new proposal replaces the one already waiting on this passport. If the person tells you no, use withdraw_proposal. Keep the proposal_id.

request_publish

ChatGPT
Ask a person to publish this passport. Keep the approval_id this returns. This NEVER publishes, and it sends nothing outside the workspace. It puts the passport in this workspace's list of things to approve and returns a link a person opens in PassportCraft. Publishing stays a human decision. When you report back, tell the person WHAT you wrote and hand them the link — they arrive in the editor with only your marked fields to go on, so your message is the context for their decision.

update_passport

ChatGPT
Change field values on a DRAFT passport. A passport the public can already see cannot be changed by an assistant: that request is refused and returns a link for a person to open. Fields written here are marked as assistant-written and are listed to a person before they publish. Changing a draft also withdraws any pending request to publish it, and only a write that CHANGES a value counts — re-sending what you read withdraws nothing. If a person asks you to hold off on publishing, leave the request alone rather than editing the draft: it expires on its own. Keep its approval_id, so you can read get_publish_approval and tell the person what became of their request. If this call fails, do not assume the request survived: some failures happen after it is already withdrawn. If you hold its approval_id, check with get_publish_approval; if you do not, say you cannot tell, and ask the person to look at their own list.

upload_document

ChatGPT
Send a file you were given — a supplier declaration, a specification sheet, a photograph of a care label — into the workspace library and attach it to a DRAFT passport, in one step. Put the bytes in content_base64. READ THIS BEFORE SENDING ANYTHING. You do not transfer this file — you TYPE it, character by character, as part of this call. MEASURED ON A REAL CONNECTION: about 22 bytes of file a second. A 15 KB photograph took eight minutes. 30 KB takes over twenty. 1 MB would take half a day. The 3 MB the server would accept is unreachable through this door, and a smaller limit would not help — the RATE is the cost, not the size. SO THE PERSON UPLOADS IT, NOT YOU, FOR EVERYTHING EXCEPT A SMALL PICTURE. They already have the file. A passport you read ON ITS OWN carries add_photo_url and add_document_url — give them the one that fits. A passport in a LIST does not carry them, because nobody adds a file to a hundred products at once: read that one passport and the addresses come with it. DO NOT BUILD EITHER ADDRESS YOURSELF: they open the right part of the editor, and an address you assemble opens the wrong one. Each takes about 4 MB, re-encodes nothing, and is done in seconds. Name the file you mean. That is the FIRST thing to offer, not the fallback. IF YOU DO SEND IT YOURSELF, SAY SO FIRST AND SAY HOW LONG. A person watching a chat sit still for eight minutes cannot tell working from broken, and several have assumed it was broken. Tell them roughly how long it will take and let them choose the faster way. AIM FOR UNDER 30 KB, and treat that as the number to act on rather than as a preference. A photograph at about 640 pixels on its longest edge, saved as JPEG at quality 70, lands under 30 KB for ordinary product shots and at about 47 KB for a densely detailed one — measured. Check the size ONCE. If it is over 30 KB, halve the longest edge and send that without checking again. Do not hunt for the smallest possible file; the search costs more time than the bytes it saves. This copy is a working image, not the one a public page deserves — when a brand wants a good photograph on the published product, a person uploads it in the app at full size. NEVER re-encode anything a person will need to READ — a supplier declaration, a specification sheet, a photograph of a care label. Shrinking those destroys the small print, and what we store is meant to be the evidence they can open later, not a copy we degraded. Send such a file as it came; if it is too large for this channel, do not send a worse version — a person can add it themselves in the editor, where the limit is about 4 MB and nothing is re-encoded. Give them this passport’s add_document_url, and say which file you mean. If you DO re-encode a photograph, say image/jpeg, or the upload is refused for not being the type it claims; naming the file .jpg as well is a courtesy to whoever reads the library later. A PICTURE INSIDE A FILE THEY GAVE YOU — a product photograph printed in a datasheet — is worth OFFERING, because they have the datasheet and do not have the picture. This is the ONE exception to never re-encoding a specification sheet, and it is narrow: you are taking the photograph out of it, not shrinking the sheet. The sheet itself still goes as it came, or not at all. Offer it; do not do it unasked. If they say yes, send it yourself with this tool, so it is recorded as yours and named to whoever publishes. Do NOT hand it to them to upload: a file a person uploads is taken as theirs, and this one is not. Send ONLY the picture itself, cropped to it — never a whole page. A page of a datasheet is a page of small print, and shrinking that to fit destroys the thing that makes it worth keeping, which the rule above forbids. Send it as type: image, or it is filed as paperwork and nobody finds it among the photos. Say where it came from and do not present it as the manufacturer’s own photograph — pulling a picture out of a document often redraws it rather than copying it, so it can differ from the original in ways neither of you can see. And say what it is FOR: a wo…

validate_passport

ChatGPT
Use this when a person asks what is still missing on a passport, what blocks publishing, or whether a passport is ready. List what is still missing or wrong on a passport. Use this before asking a person to publish, so the request you hand them is one they can act on.

withdraw_proposal

ChatGPT
Withdraw a proposal that is still waiting, when the person tells you they do not want it. It leaves their list at once. Withdrawing one that is no longer waiting changes nothing and tells you its state.

add_variants

Claude

attach_document

Claude

create_passport

Claude

create_unit

Claude

get_category_schema

Claude

get_passport

Claude

get_proposal

Claude

get_publish_approval

Claude

list_custom_fields

Claude

list_documents

Claude

list_library

Claude

list_passports

Claude

list_unit_readings

Claude

list_units

Claude

list_variants

Claude

propose_changes

Claude

request_publish

Claude

update_passport

Claude

upload_document

Claude

validate_passport

Claude

withdraw_proposal

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps