Esty Plant Upload Tool

2026-03-18 · Project · #Automation

Selling plants online creates a surprising amount of repetitive work. Before a listing is ready, I have to sort the incoming photos, identify what the plant likely is, decide which shop section it belongs to, write the listing title and description, generate search tags, create the draft in Etsy, and finally upload the photos in the right order. None of those steps are individually difficult, but together they create a lot of friction.

The Esty Plant Upload Tool is my attempt to compress that workflow into one system. The current implementation is an MCP server written in TypeScript and Node.js. Instead of being a one-off script, it exposes a small set of focused tools that an AI client can call to move a batch of plant photos from “unsorted images” to “reviewable Etsy draft.”

What the project does

The project has four main jobs.

  • sort_plant_photos classifies plant photos with vision, then copies or moves them into category folders. When the model is not confident enough, the file is routed into a needs-review folder instead of pretending certainty.
  • prepare_plant_listing_metadata analyzes one listing’s photo set and produces structured listing data: title, description, tags, category, section title, notable features, visible condition notes, care notes, and explicit assumptions.
  • create_etsy_draft_listing takes that generated metadata, creates a draft listing through the Etsy API, uploads the photos in order, and optionally assigns the listing to a matching shop section.
  • get_etsy_shop_setup fetches the current store configuration so I can inspect sections, shipping profiles, and processing-profile data before wiring the automation to a live shop.

The result is not just an uploader. It is a workflow bridge between photo organization, AI-assisted copy generation, and Etsy’s listing APIs.

Why I built it this way

The manual workflow has two different kinds of work mixed together. One is mechanical work: moving files, filling in fields, uploading images, looking up IDs, and clicking through the Etsy draft flow. The other is judgment work: deciding what the plant is, how confident that identification is, what wording is safe to claim from the photos, and whether a generated listing actually looks right.

I did not want a black-box automation that hides uncertainty. I wanted the tool to remove the repetitive steps while still making room for review. That led to a few design decisions that matter more than the headline feature list.

  • Vision classification returns a confidence score, so the workflow can route uncertain images into a review bucket.
  • Listing metadata is generated as structured JSON with Zod schemas, not as loose prose that has to be cleaned up later.
  • The listing generator keeps an assumptions field so uncertain details stay visible instead of being baked into the final copy as facts.
  • Draft creation supports dry_run, which lets me inspect the generated payload before touching Etsy.
  • The Etsy integration supports both legacy shipping-profile mode and processing-profile mode, because real shop setups are rarely as tidy as a fresh greenfield integration.

Implementation notes

Under the hood, the project uses OpenAI vision to interpret the photos and the Responses API’s structured output support to keep the model output parseable. That choice matters: this is not a chat-first tool. It is a typed pipeline where the model is responsible for perception and first-draft generation, but the rest of the system still behaves like regular software.

On the Etsy side, the server wraps OAuth token refresh, listing creation, image upload, section lookup, section creation, and section assignment. Those pieces are deliberately kept separate from the vision layer. The AI model decides what the listing should say; the Etsy service is responsible for reliably turning that into API calls.

I also liked MCP as the interface layer because it keeps the project flexible. The server can plug into an AI-assisted workflow without becoming tightly coupled to a single UI. That makes it easier to reuse the project as a local tool, a Copilot-style assistant backend, or a thin automation service in a broader seller workflow.

What I learned

This project reinforced a pattern I keep coming back to in applied AI work: the useful part is not replacing the whole workflow, it is shrinking the amount of boring work around the decision points.

The most valuable behavior here is not “AI writes an Etsy listing.” The more valuable behavior is that the system can organize a messy photo batch, produce a reasonable first draft, preserve uncertainty, and hand me something reviewable. That is a much better fit for a real seller workflow than pretending the model is always right.

It also reminded me that e-commerce integrations are mostly about edge cases. API credentials expire, shop settings vary, required IDs live in awkward places, and listing requirements evolve over time. The more the software can surface those constraints explicitly, the less fragile the workflow becomes.

Overall, this project turned a repetitive listing process into a faster review-and-publish loop. That was the real goal from the beginning.

GitHub repo