Skip to main content
Glama

cyclesite-mcp-server

publish_listing

DestructiveIdempotent

Publish a Cyclesite listing on the user's behalf. Multi-step: first call (no draftId) returns a phone-friendly photo upload URL; once 3+ photos are uploaded, the next call returns either step:'live' (listing is free, no payment needed) or step:'payment_required' with a Stripe Checkout URL. Idempotent — keep calling with the same draftId until step:'live'. Requires OAuth scope listings:publish. Example flow: user says 'sell my Trek Domane' → call publish_listing → assistant directs user to upload URL → user uploads → call again → step:'live' → seller receives a confirmation email with a 24h undo link.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cityNoUK city.
yearNo
brandNo
modelNo
titleNoListing title (10-160 chars).
draftIdNoReturned by a previous call. Omit on first call.
isEbikeNoTrue for an electric bike.
categoryNo
groupsetNo
priceGbpNo
willShipNo
conditionNo
frameSizeNo
motorBrandNoE-bike motor make, e.g. "Bosch", "Shimano", "Bafang".
motorModelNoE-bike motor model, e.g. "Performance Line CX".
descriptionNoListing description (30-5000 chars).
frameSerialNoFrame/serial number — runs a stolen-bike check before publish.
knownIssuesNo
batteryCyclesNoCharge cycles as the seller reports them.
itemConditionNoWhether the bike is new (never ridden) or used. Defaults to used.
motorPositionNo
ebikeBatteryWhNoBattery capacity in watt-hours (100-3000).
rangeEstimateMilesNoRange the seller claims on one charge, in miles.
batteryHealthPercentNoBattery health as the seller reports it, 0-100.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
stepYes
draftIdNo
messageYes
listingUrlNo
paymentUrlNo
photosNeededNo
listingFeeGbpNoPrice in GBP.
photoUploadUrlNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • addedInput schema / properties / batteryCycles
      Added value: +{
      +  "description": "Charge cycles as the seller reports them.",
      +  "type": "number"
      +}
    • addedInput schema / properties / batteryHealthPercent
      Added value: +{
      +  "description": "Battery health as the seller reports it, 0-100.",
      +  "type": "number"
      +}
    • addedInput schema / properties / ebikeBatteryWh
      Added value: +{
      +  "description": "Battery capacity in watt-hours (100-3000).",
      +  "type": "number"
      +}
    • addedInput schema / properties / isEbike
      Added value: +{
      +  "description": "True for an electric bike.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / itemCondition
      Added value: +{
      +  "description": "Whether the bike is new (never ridden) or used. Defaults to used.",
      +  "enum": [
      +    "new",
      +    "used"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / motorBrand
      Added value: +{
      +  "description": "E-bike motor make, e.g. \"Bosch\", \"Shimano\", \"Bafang\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / motorModel
      Added value: +{
      +  "description": "E-bike motor model, e.g. \"Performance Line CX\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / motorPosition
      Added value: +{
      +  "enum": [
      +    "Mid-drive",
      +    "Rear hub",
      +    "Front hub"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / rangeEstimateMiles
      Added value: +{
      +  "description": "Range the seller claims on one charge, in miles.",
      +  "type": "number"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / category / enum
      Previous value: -[
      -  "road",
      -  "mtb",
      -  "gravel",
      -  "hybrid",
      -  "ebike",
      -  "kids",
      -  "bmx",
      -  "folding",
      -  "city",
      -  "touring",
      -  "triathlon",
      -  "track",
      -  "cyclocross",
      -  "cargo",
      -  "other"
      -]New value: +[
      +  "road",
      +  "mtb",
      +  "gravel",
      +  "hybrid",
      +  "ebike",
      +  "kids",
      +  "bmx",
      +  "folding",
      +  "city",
      +  "touring",
      +  "triathlon",
      +  "track",
      +  "cyclocross",
      +  "cargo",
      +  "adaptive",
      +  "other"
      +]
  3. First observed

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses the multi-step statefulness, photo upload requirement, Stripe payment path, idempotent retry behavior, OAuth scope, and 24-hour undo email. This significantly exceeds what readOnlyHint/openWorldHint/idempotentHint/destructiveHint already communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, step flow, idempotency, auth, and a concrete example. The most important information is front-loaded and the example flow is illustrative without being redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity — 24 parameters, multi-step behavior, output schema, and many siblings — the description is remarkably complete. It covers the full user journey, auth requirement, retry semantics, payment branching, and post-publish undo, so an agent can invoke it correctly without external help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies draftId's lifecycle (omit on first call, reuse until step:'live') and the photo-count prerequisite, which adds meaning beyond the schema. However, with only 54% schema coverage and 24 parameters, it does not compensate for the many undocumented fields such as year, brand, model, priceGbp, or groupset.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Publish a Cyclesite listing on the user's behalf.' It clearly conveys a multi-step publish operation and differentiates itself from read-only siblings through its live/payment flow, though it never explicitly names a sibling like draft_listing for contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete when-to-use context via the example flow ('user says sell my Trek Domane → call publish_listing') and states the OAuth prerequisite. It does not explicitly say when not to use it or mention alternatives, but the sequential call guidance ('keep calling with the same draftId until step:"live"') is useful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources