Skip to main content
Glama

Server Details

Search products in nearby stores. Agents can also list items for sale on a user's behalf.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
rubenayla/partle-mcp
GitHub Stars
1
Server Listing
Partle

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.9/5 across 21 of 21 tools scored.

Server CoherenceA
Disambiguation5/5

Each tool has a clearly distinct purpose. The two image upload tools (get_upload_url, upload_product_image) are explicitly differentiated by input type (local bytes vs public URL), and the convenience wrappers (mark_for_sale, mark_sold) are clearly described as specialized forms of update_inventory_item.

Naming Consistency4/5

Most tools follow a verb_noun pattern (search_products, create_product, delete_inventory_item). Minor deviations: 'add_inventory_item' uses 'add' instead of 'create' while the server has create_product and create_buy_request; 'mark_for_sale' and 'mark_sold' are verb+preposition/adjective rather than simple verb_noun. These are readable and predictable overall.

Tool Count4/5

At 21 tools, the server is slightly heavy but each tool maps to a distinct operation across multiple domains (inventory, products, search, stores, buy requests, stats, feedback). The convenience wrappers add a few extra tools but are clearly scoped. Feels a bit large but not bloated.

Completeness3/5

The inventory and product domains have full CRUD plus helpers. However, buy requests are incomplete: create_buy_request and search_wanted exist, but there is no update, delete, or 'my buy requests' listing, making it impossible to manage a posted request. Also, there is no single-item get for inventory (only list), though this is a minor gap.

Available Tools

21 tools
add_inventory_itemAInspect

Add an item to the caller's personal inventory.

Authenticated. Required OAuth scope: `inventory:write`.

One creation tool covers all lifecycle states — set ``status`` based
on the user's intent: "I bought" → ``owned``, "I want" → ``wanted``,
"I'm selling" → ``for_sale``. Either ``product_id`` (linked to an
existing Partle product) or ``name`` (freeform) must be set.

**Not idempotent** — each call creates a new row.

Args:
    name: Freeform name for items not yet linked to a Partle product.
        Either ``name`` or ``product_id`` must be set.
    product_id: Link to a canonical Partle product.
    status: Lifecycle. One of: ``owned``, ``wanted``, ``for_sale``,
        ``sold``, ``discarded``. Default ``owned``.
    quantity: How many. Fractional allowed. Default 1.
    notes: Freeform multi-line text — the dumping ground for anything
        not modeled as a column: extra URLs, comments, where stored,
        condition narrative, purpose, source, history, log entries.
        Markdown is fine. **Put extra URLs here, not in another field.**
    acquisition_price: What the user paid.
    acquisition_currency: Currency of acquisition_price.
    purchased_at: ISO date (YYYY-MM-DD) when it was acquired.
    asking_price: When status=for_sale, asking price.
    asking_currency: Currency of asking_price.
    condition: Free string — typical: ``new``, ``like_new``,
        ``good``, ``fair``, ``poor``.
    external_link: **Primary** click-through URL only (source listing,
        vendor page, manufacturer page). Exactly one. Additional URLs
        go in ``notes`` as markdown links.
    external_id: Stable identifier from the source system, used as a
        **dedup key**. Per-user unique when set — same external_id
        can't appear twice for one user. Format is up to you (e.g.
        ``aliexpress:1005004714348221``, ``amazon:order/3024.../line/1``,
        content hash). Leave null for handwritten items.
    project: Tag for grouping (e.g. "kitchen-renovation").
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    The newly-created inventory row (with embedded `product` if
    linked), or ``{"error": ...}`` on auth/validation failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
notesNo
statusNoowned
api_keyNo
projectNo
quantityNo
conditionNo
product_idNo
external_idNo
asking_priceNo
purchased_atNo
external_linkNo
asking_currencyNo
acquisition_priceNo
acquisition_currencyNo
Behavior5/5

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

The description explicitly states 'Not idempotent — each call creates a new row,' which aligns with idempotentHint=false and adds clarity. It also discloses OAuth scope requirements, the api_key override behavior, and the return/error format—all beyond what annotations provide.

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 front-loaded with a concise summary and then systematically documents each parameter in an Args block. Though long, every sentence adds value for a 15-parameter create tool, and the structure is easy to parse.

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?

This is a complex tool with 15 parameters and no output schema, but the description covers auth, status mapping, parameter constraints, dedup behavior, return value, and error cases. It leaves no critical gap for an agent to invoke it correctly.

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

Parameters5/5

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

With 0% schema description coverage, the description carries the full burden and does so exceptionally. Every parameter is explained, including nuanced rules: 'Either product_id or name must be set', 'external_link: Exactly one', 'external_id used as a dedup key', and the status values for lifecycle states.

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

Purpose5/5

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

The description opens with 'Add an item to the caller's personal inventory,' which is a specific verb+resource statement. It also says 'One creation tool covers all lifecycle states,' distinguishing this creation tool from update/delete siblings and clarifying its all-in-one role.

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?

The description gives clear context: 'One creation tool covers all lifecycle states — set status based on the user's intent' and explains the product_id/name requirement. It doesn't explicitly name alternatives for updating/deleting, but the context strongly implies when to use this tool vs modifying existing items.

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

create_buy_requestAInspect

Post a public buy request — an ad asking suppliers to reach out.

Use when the user wants others to know they're looking to buy
something. **Independent of personal inventory** — inventory is the
user's private workshop tracking; a buy request is a sales-facing
ad on the public demand feed at /wanted.

Authenticated. Required OAuth scope: ``inventory:write``.
**Not idempotent** — each call creates a new public post.

Args:
    name: Short scannable headline ("Looking for X"). Required.
    title: Deprecated spelling of ``name``, accepted so existing clients
        keep working. Pass ``name`` instead; if both are given, ``name``
        wins.
    description: Plain text long-form — specs, constraints, delivery
        preference. The supplier reads this to decide whether they
        can fulfil.
    quantity: How many units the poster wants. Default 1.
    max_price: Optional ceiling per unit.
    currency: Currency for max_price (default €).
    contact: Free-form contact (email/phone/Telegram/etc.) shown
        publicly. Optional. Without it, suppliers can only respond
        via whatever channels you separately make available.
    reference_url: Link to a sample/datasheet/manufacturer page.
    product_id: Link to a canonical Partle product if asking for a
        specific known SKU.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    The newly-created buy request, or ``{"error": ...}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
titleNo
api_keyNo
contactNo
currencyNo
quantityNo
max_priceNo
product_idNo
descriptionNo
reference_urlNo
Behavior5/5

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

The description adds substantial behavioral context beyond what annotations provide. It states authentication requirements ('Required OAuth scope: inventory:write'), explicitly explains non-idempotency ('Not idempotent — each call creates a new public post'), and details the API key override behavior including failure modes. It also describes the public nature of the post. These details meaningfully enrich the annotations, which only offer generic hints.

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 long but well-structured: a one-line summary, when-to-use, behavioral notes, Args section, and Returns. Each sentence serves a purpose, even with 10 parameters to document. No redundancy or fluff appears; the deprecated-field note and API key clarification are value-adding, not filler.

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?

With 10 parameters, no output schema, and no enums, the description covers all necessary context: purpose, usage, auth, idempotency, parameter meanings, API key behavior, and return format. It addresses the public-vs-private distinction and the deprecated title parameter. Given the tool's complexity, this description is complete.

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

Parameters5/5

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

Schema coverage is 0%, yet the description provides thorough per-parameter explanations in the Args block. It adds semantics like 'name: Short scannable headline', 'title: Deprecated spelling...', 'contact: shown publicly', and the API key override logic. This goes well beyond the bare schema types/defaults, making the tool far more usable.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Post a public buy request — an ad asking suppliers to reach out.' It clearly distinguishes the tool from personal inventory by noting 'Independent of personal inventory' and explaining that a buy request is a 'sales-facing ad on the public demand feed at /wanted.' This makes the purpose unambiguous and differentiates it from sibling tools like add_inventory_item.

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?

The description explicitly states when to use: 'Use when the user wants others to know they're looking to buy something.' It also contrasts with inventory ('Independent of personal inventory') to imply when not to use. However, it does not explicitly name an alternative tool, such as 'use add_inventory_item for inventory tracking,' so it stops short of the strongest alternative guidance.

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

create_productA
Idempotent
Inspect

Create a new product listing on Partle.

Authenticated. Prefer **OAuth**: connect once via the consent flow on
claude.ai (or any MCP client that supports OAuth) and the bearer token
is attached automatically — no `api_key` parameter needed. **Fallback**:
pass an `api_key` (prefix `pk_`, generate at /account) for programmatic
or non-OAuth clients.

Required OAuth scope: `products:write`.

Use when the user wants to add an item for sale. For edits to an
existing product, use `update_product` instead.

**Images.** This tool creates text fields only — no image arg. Do
**not** try to pass image bytes through a tool argument; phone-sized
payloads blow past conversation context limits.

The response includes a one-shot ``upload_url`` (signed, ~15 min TTL,
bound to this product and your authenticated user). To attach an
image from your code-execution sandbox, do **one** PUT request — no
auth headers needed, the URL itself carries the credential:

  requests.put(result["upload_url"],
               data=open("/path/to/photo.jpg", "rb").read(),
               headers={"Content-Type": "image/jpeg"})

The bytes flow Python → HTTP body → Partle, never through the
conversation. The URL works once and expires fast.

Alternative if you don't have local bytes but have a public image URL:
call ``upload_product_image(product_id, image_url=...)`` instead.

**Duplicate prevention.** Same user, same product name (case- and
whitespace-insensitive) returns 409 with `existing.id`, `existing.url`,
**and a fresh `upload_url`** for that existing product — so if the
user is just retrying with a photo, you can attach it directly to the
existing listing without having to create or pick anything new. You
can also call `update_product` to change fields. Don't retry blindly.

**Idempotency.** Pass `idempotency_key` (any unique string per logical
create — UUID or hash of the source listing) and a retry after a
network failure returns the original response instead of creating a
duplicate. Reusing a key with a different payload is a 422.

Args:
    name: Product name. Required, 1–200 chars.
    description: Long-form product description. Optional.
    price: Price in whole currency units, **not** cents (e.g. ``15.99``
        means €15.99). Max 100000. Omit for "ask the seller".
    currency: Currency symbol. Defaults to `€`. Use `$`, `£`, etc.
    url: Link to the merchant's product page. Optional but recommended.
    store_id: ID of the store this product belongs to. Omit for a
        personal listing not tied to any store.
    idempotency_key: Optional retry-safety token. Unique per logical
        create. Send the same key on retries to get the same response.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    The created product record including its new `id` and canonical
    `partle_url`. Share `partle_url` with the user. Returns
    ``{"error": ...}`` on auth, dedup, or validation failure (dedup
    also returns ``{"existing": {"id", "name", "url"}}``).
ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
nameYes
priceNo
api_keyNo
currencyNo
store_idNo
descriptionNo
idempotency_keyNo
Behavior5/5

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

The description discloses far beyond annotations: OAuth vs api_key auth, required scope products:write, one-shot signed upload_url with ~15 min TTL, duplicate 409 behavior with existing.id/url and a fresh upload_url, idempotency key semantics (422 on reuse with different payload), and exact error return shapes. This enriches the annotation hints without contradiction.

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 lengthy but structured into clear labeled sections: Auth, Use, Images, Duplicate prevention, Idempotency, Args, Returns. Every paragraph carries distinct operational value; the code example and emphasis on not passing image bytes through conversation context are necessary for correct invocation.

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?

For a complex creation tool with no output schema, this description covers all bases: authentication, parameters, return values (id, partle_url), error shapes, dedup behavior, idempotency, and the post-create image upload workflow. An agent can invoke it correctly without additional lookup.

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

Parameters5/5

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

Despite 0% schema description coverage, the Args section documents all 8 parameters with crucial constraints and nuances: name 1–200 chars, price in whole units not cents, currency default €, store_id omission for personal listings, api_key override over narrowly-scoped OAuth tokens, and idempotency_key purpose. This fully compensates for the absent schema descriptions.

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

Purpose5/5

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

The description opens with 'Create a new product listing on Partle', providing a specific verb, resource, and scope. It distinguishes from sibling tools by explicitly directing edits to update_product and noting upload_product_image for image-only workflows.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('Use when the user wants to add an item for sale') and names alternatives ('For edits to an existing product, use update_product instead'). It also covers the duplicate-case fallback to use a fresh upload_url with the existing product rather than creating a new one.

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

delete_inventory_itemA
DestructiveIdempotent
Inspect

Permanently delete an inventory row.

Authenticated. Required OAuth scope: `inventory:write`. Caller must
own the item (404 otherwise). Hard delete — no soft-delete.

Args:
    item_id: ID of the row to delete.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    ``{"deleted": true, "id": item_id}`` on success, or
    ``{"error": ...}`` on auth / not-found.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
item_idYes
Behavior5/5

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

Annotations already mark this as destructive and idempotent, but the description adds critical behavioral details: 'Hard delete — no soft-delete' (irreversible), OAuth scope requirement, ownership validation (404 otherwise), and API key fallback behavior with override semantics. This goes well beyond the annotations and fully discloses side effects.

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 concise, logically organized with clear sections (overview, auth, args, returns), and every sentence conveys essential information. There is no fluff or redundancy.

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?

Despite having no output schema, the description specifies exact return values on success and failure. It covers authentication, ownership, idempotency, and hard-delete semantics. For a delete operation with 2 parameters, this is complete and well-rounded.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full burden for parameter meaning. It explains item_id as 'ID of the row to delete' and elaborates on api_key's role, including when it is used (no OAuth token or insufficient scope) and its failure behavior. This is far more than the schema provides, which only lists types and defaults.

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

Purpose5/5

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

The description opens with 'Permanently delete an inventory row' — a specific verb ('delete'), a clear resource ('inventory row'), and a scope qualifier ('permanently'). This clearly distinguishes it from sibling tools like delete_product and delete_product_image, which target different resources.

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?

The description provides explicit context for when to use the tool: 'Authenticated. Required OAuth scope: inventory:write. Caller must own the item (404 otherwise).' It also warns about hard delete vs soft-delete. It does not explicitly name alternative tools, but the usage context is clear. No misleading guidance.

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

delete_productA
DestructiveIdempotent
Inspect

Permanently delete a product listing and all its images. Destructive.

Authenticated. OAuth (scope `products:write`) preferred; `api_key` fallback.

Use only when the user explicitly asks to remove a listing they own.
Cannot be undone — there is no soft-delete or trash bin. Idempotent:
deleting a product that no longer exists returns an error, not duplicate
side effects.

Caller must own the product.

Args:
    product_id: ID of the product to delete. Get from `get_my_products`.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    ``{"deleted": True, "product_id": int}`` on success, or
    ``{"error": ...}`` on auth/ownership failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
product_idYes
Behavior5/5

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

Beyond the annotations, the description discloses extensive behavioral details: permanent deletion with no soft-delete, idempotent behavior on missing products, authentication requirements, OAuth scope fallback, api_key override behavior, and ownership validation. This far exceeds what annotations alone convey.

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 well-structured with clear sections for purpose, caveats, arguments, and return values. Every sentence adds essential information, and there is no redundant filler. The front-loaded warning and usage conditions are immediately actionable.

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 destructive nature of the tool and the absence of an output schema, the description is remarkably complete. It covers when to use, prerequisites, authentication nuances, parameter origins and behavior, and precise return values. No critical information is missing.

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

Parameters5/5

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

Despite zero schema description coverage, the description fully explains both parameters: product_id should be obtained from get_my_products, and api_key is optional with detailed override semantics and failure behavior. It also describes the return format for success and error cases, compensating completely for the sparse schema.

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

Purpose5/5

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

The description states 'Permanently delete a product listing and all its images' with a clear verb and resource, and the 'Destructive' warning reinforces the action. It distinguishes well from sibling tools like delete_inventory_item and delete_product_image by specifying the product listing scope.

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

Usage Guidelines5/5

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

The description explicitly limits usage: 'Use only when the user explicitly asks to remove a listing they own.' It also provides critical context by noting the deletion is permanent and cannot be undone, and states the ownership prerequisite. This gives clear guidance on when the tool should be invoked.

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

delete_product_imageA
DestructiveIdempotent
Inspect

Remove a specific image from a product. Destructive, idempotent.

Authenticated. OAuth (scope `products:write`) preferred; `api_key` fallback.

Use when an image was uploaded by mistake or the merchant updated their
listing. The product itself is preserved — only the image record and its
file are removed. To remove the product entirely use `delete_product`.

Args:
    product_id: ID of the product the image belongs to.
    image_id: ID of the image to delete. Visible in the `images` array of
        `get_product` responses.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    ``{"deleted": True, "product_id": int, "image_id": int}`` on success,
    or ``{"error": ...}`` on auth/ownership failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
image_idYes
product_idYes
Behavior5/5

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

Annotations already state destructiveHint=true and idempotentHint=true, and the description aligns with these ('Destructive, idempotent.'). It adds context about what gets destroyed (image record and its file), that the product is preserved, and covers auth details (OAuth scope `products:write`, `api_key` fallback, and invalid token behavior). This exceeds the annotation baseline.

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 efficiently structured: purpose first, then usage context, then parameter docs, then return value. Every sentence adds value, and the Args/Returns sections make it easy to scan. It is detailed without being bloated.

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?

The description covers all necessary context for a destructive mutation: purpose, safety implications, auth requirements, parameter relationships, return format, and error conditions. Even without an output schema, the described return value is sufficient. This is a complete, self-contained description.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden. It thoroughly explains each parameter: `product_id` (ID of the product), `image_id` (visible in `get_product` responses), and `api_key` (optional, with detailed override and failure semantics). This fully compensates for the lack of schema descriptions.

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

Purpose5/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: 'Remove a specific image from a product.' It clearly distinguishes from the sibling `delete_product` by explicitly stating when to use it and noting the product itself is preserved. This is far beyond a vague statement.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Use when an image was uploaded by mistake or the merchant updated their listing.' It also provides a direct alternative: 'To remove the product entirely use `delete_product`.' This is clear, actionable guidance with no ambiguity.

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

get_my_inventoryA
Read-only
Inspect

List the caller's personal inventory items.

Authenticated. Required OAuth scope: `inventory:read` (or pass an
`api_key` for legacy/programmatic clients).

Use this when the user asks "what do I own?", "what's on my
wishlist?", "what am I selling?", etc. The returned rows include
every status by default; pass `status` to filter.

Args:
    status: Filter by lifecycle. One of: ``owned``, ``wanted``,
        ``for_sale``, ``sold``, ``discarded``. Omit for all.
    product_id: Filter to rows linked to a specific Partle product.
    project: Exact-match filter on the project tag.
    q: Substring search on `name` and `notes` (case-insensitive).
    limit: Page size, 1–200. Default 50.
    offset: Pagination offset. Default 0.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    ``{"items": [...], "count": int}`` where each item carries
    status, quantity, name (or linked product), notes, prices, etc.
    On auth failure: ``{"error": ...}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
qNo
limitNo
offsetNo
statusNo
api_keyNo
projectNo
product_idNo
Behavior5/5

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

The description adds substantial context beyond the readOnlyHint annotation: it discloses OAuth scope requirements, api_key fallback behavior, override semantics, invalid token handling, and error responses. This provides a complete safety and behavior profile.

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 well-structured and every line earns its place. It is front-loaded with purpose, then auth, usage, parameters, and return format, with no redundant or filler content.

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?

The description covers the return format (items and count), auth failure behavior, pagination, and parameter semantics. Given the tool's complexity and lack of output schema, this is complete and actionable.

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

Parameters5/5

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

Though schema description coverage is 0%, the description thoroughly explains all 7 parameters: status (with enum values), product_id, project, q, limit, offset, and api_key (with detailed use cases). This fully compensates for the lack of schema descriptions.

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

Purpose5/5

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

The description clearly states 'List the caller's personal inventory items' with a specific verb and resource, and it distinguishes from sibling tools like get_my_products (which lists products) and get_product. The scope is well-defined as 'caller's personal'.

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?

The description explicitly says 'Use this when the user asks...' with concrete examples, providing clear context. However, it does not explicitly mention alternatives or when-not-to-use, so it misses the mark for a full 5.

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

get_my_productsA
Read-only
Inspect

List products created by the authenticated user.

Authenticated. OAuth (scope `products:read`) preferred; `api_key` fallback.

Use when the user asks "what have I listed?" or before bulk operations
like updating prices across multiple of their products. Distinct from
`search_products`, which searches the public catalog without owner
scoping.

Read-only.

Args:
    limit: Max results (1–200, default 50).
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    A list of products in the same shape as `search_products`. Returns
    ``[{"error": ...}]`` on auth failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
api_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses authentication requirements (OAuth preferred, api_key fallback), scope-specific behavior (key overrides insufficient OAuth scope), error handling (invalid key still fails), and return format (list of products, error array on auth failure). This is rich behavioral context not found in the annotation.

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 well-structured with clear sections (summary, auth, usage, args, returns). Every sentence adds value, from the concrete use cases to the detailed parameter semantics. Despite its length, it remains concise and front-loaded with the primary purpose.

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?

The description covers auth, usage, parameter semantics, and return shape. With two params and an output schema present, all critical aspects are addressed. It fully compensates for the low schema coverage and provides complete contextual guidance.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden. It explains `limit` range (1–200, default 50) and `api_key` format (`pk_*`), generation location, fallback behavior, override semantics, and when to omit it. This adds substantial meaning beyond the bare schema properties.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List products created by the authenticated user.' It clearly scopes to the authenticated user's products and explicitly distinguishes itself from the sibling tool `search_products`, which searches the public catalog without owner scoping.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: 'Use when the user asks "what have I listed?" or before bulk operations like updating prices across multiple of their products.' It also directly contrasts with `search_products`, providing a clear alternative and when-not-to-use context.

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

get_productA
Read-only
Inspect

Get the full record for a single product by its numeric ID.

Use after `search_products` returns a candidate the user is interested in,
when you need fields not in the search summary (full description, all
images, sold status, expiration). Don't loop `get_product` over many search
results — re-search with tighter filters instead.

Read-only. No authentication.

Args:
    product_id: Integer `id` from a `search_products` result, or visible in
        a Partle product page URL (`/p/<id>-<slug>`).

Returns:
    A single product object with all fields, including the canonical
    `partle_url` to share with the user. Returns ``{"error": ...}`` if the
    ID does not exist.
ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYes
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds extra context: 'No authentication,' the error return for missing IDs, and the warning about not looping. It doesn't contradict annotations and provides useful behavioral details beyond the basic safety profile.

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 well-organized with distinct paragraphs for usage, arguments, and returns. Every sentence adds value, and the core purpose is front-loaded. It is appropriately sized for the tool's complexity.

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?

With no output schema, the description explains what the return object contains (all fields, canonical `partle_url`) and the error format. It also covers authentication, sourcing the ID, and performance constraints, making it complete for an agent to invoke correctly.

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

Parameters5/5

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

The input schema only specifies `product_id` as an integer with a title, providing no description. The description compensates fully by explaining where the ID comes from (search result or URL segment) and giving the URL format example, which is critical for correct usage.

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

Purpose5/5

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

The description clearly states 'Get the full record for a single product by its numeric ID,' specifying both the action and the resource. It also distinguishes itself from sibling tools by contrasting with `search_products` summary results.

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

Usage Guidelines5/5

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

Explicitly says to use after `search_products` when full fields are needed, and gives a clear don't: 'Don't loop get_product over many search results — re-search with tighter filters instead.' This is exemplary when/when-not guidance.

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

get_statsA
Read-only
Inspect

Get top-level Partle platform statistics.

Use for size questions ("how big is Partle?", "how many stores does
Partle cover?"). Aggregate counts only — no per-product or per-store
data; use `search_products` / `search_stores` for that.

Read-only. No authentication. Cheap, but rarely changes — long-running
agents should cache the result.

Returns:
    ``{"total_products": int, "total_stores": int, "description": str}``.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds key behavioral context: no authentication required, cheap operation, data rarely changes, and explicit return shape. This goes beyond annotations to inform the agent about side-effect freedom, cost, and cacheability without contradiction.

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 well-structured: purpose, usage context, exclusions with alternatives, operational notes, and return format. Every sentence delivers value with no redundancy, and the most important info is front-loaded.

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 simplicity (no parameters) and absence of an output schema, the description fully compensates by documenting the return format, usage intent, limitations, and caching guidance. Nothing essential is missing for an agent to invoke and interpret this tool correctly.

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

Parameters5/5

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

There are zero parameters, so schema coverage is trivially 100% and no parameter explanation is needed. The description still adds value by specifying the exact return fields (total_products, total_stores, description), which is behaviorally relevant for a parameterless call.

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

Purpose5/5

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

The description clearly states that this tool retrieves top-level Partle platform statistics (total products, total stores), which is specific and distinct from siblings. It explicitly contrasts with search_products/search_stores, making its scope unambiguous.

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

Usage Guidelines5/5

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

Explicitly provides when to use the tool ('how big is Partle?', 'how many stores?'), what it is not for (aggregate counts only, no per-product/per-store data), and points to alternatives. Also advises caching due to infrequent updates, which is actionable usage guidance.

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

get_storeA
Read-only
Inspect

Get the full record for a single store by its numeric ID.

Use after `search_stores` to retrieve fields not in the search summary
(full address, owner profile, contact details). For a list of *products*
in that store, call `search_products(store_id=…)` instead — this tool
returns store metadata only.

Read-only. No authentication.

Args:
    store_id: Integer `id` from a `search_stores` result.

Returns:
    A single store object with all fields. Returns ``{"error": ...}`` if
    the ID does not exist.
ParametersJSON Schema
NameRequiredDescriptionDefault
store_idYes
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds that the tool is read-only with no authentication and explains error handling when the ID does not exist. It also clarifies it returns store metadata only, providing useful behavioral context.

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 concise and well-structured with clear sections: purpose, usage, read-only note, args, and returns. Every sentence adds value without unnecessary verbosity.

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?

For a simple get-by-id tool with no output schema, the description fully covers return format, error behavior, and usage context. It also mentions alternatives, making it complete for an agent to select and invoke correctly.

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

Parameters4/5

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

The schema only says store_id is an integer, with 0% description coverage. The tool description compensates by explaining it as the 'Integer id from a search_stores result,' which connects it to the search workflow and clarifies expected format.

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

Purpose5/5

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

The description states 'Get the full record for a single store by its numeric ID,' which clearly identifies the verb, resource, and scope. It also distinguishes itself from sibling tools like search_stores (which returns summaries) and search_products (which returns products).

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

Usage Guidelines5/5

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

Explicitly says 'Use after search_stores to retrieve fields not in the search summary' and provides a specific alternative: 'For a list of products in that store, call search_products(store_id=…) instead.' This is a clear when-to-use and when-not-to-use guidance.

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

get_upload_urlA
Idempotent
Inspect

Mint a one-shot signed upload URL for a product you own.

Authenticated. OAuth (scope `products:write`) preferred; `api_key` fallback.

Use this when you have **local image bytes** (a file the user attached,
bytes you generated/downloaded in your sandbox) and you want to attach
them to a product that already exists. Common cases:

- `create_product` returned 409 (duplicate name) — the listing already
  exists; this tool gives you an upload URL for it without creating
  anything new.
- You're adding a 2nd, 3rd, … photo to a product.

The returned URL is valid for ~15 min, single product, signed with
your authenticated identity. From your sandbox, do **one PUT**:

  requests.put(result["upload_url"],
               data=open("/path/to/photo.jpg", "rb").read(),
               headers={"Content-Type": "image/jpeg"})

No auth header on that PUT — the URL is the credential.

If you have a public URL (not local bytes), use
`upload_product_image(product_id, image_url=...)` instead.

Args:
    product_id: Product to attach the future image to. You must own it.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    ``{"upload_url": str, "upload_expires_in": int}``, or
    ``{"error": ...}`` on auth/ownership failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
product_idYes
Behavior5/5

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

Even though annotations exist (idempotentHint true, readOnlyHint false, destructiveHint false), the description adds substantial behavioral context: URL validity (~15 min), one-PUT requirement, no auth header on PUT, ownership validation, OAuth scope override logic, and error return shape. This goes well beyond what annotations alone convey.

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 well-organized with clear sections (usage cases, auth, code example, args, returns). It is lengthy but every section adds necessary operational detail. The first sentence immediately states the core action, and the code snippet is directly actionable.

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 (auth modes, ownership, signed URL behavior, PUT instructions, return format), the description covers all essential aspects. It explains the returned JSON structure, error cases, and prerequisites, making it complete even without an output schema.

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

Parameters5/5

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

Schema coverage is 0%, and the description fully compensates. product_id is explained with an ownership requirement. api_key is explained in detail: when to use, when to omit, and how it overrides ambient tokens. The code example also clarifies how the returned upload_url is consumed.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Mint a one-shot signed upload URL for a product you own.' It specifies the exact verb (mint/upload URL), resource (product), and scope (owned by caller). It also distinguishes itself from the sibling tool upload_product_image by contrasting local bytes vs. public URL.

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

Usage Guidelines5/5

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

Explicit usage guidance is provided: 'Use this when you have local image bytes' and 'If you have a public URL, use upload_product_image instead.' It also gives concrete common cases (e.g., create_product returned 409) and explains authentication preferences and fallback behavior, covering when to use and when not to.

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

mark_for_saleA
Idempotent
Inspect

Move an inventory item to status=for_sale and set listing fields.

Convenience wrapper over `update_inventory_item` that matches a
natural user request ("list my drill for sale at 30€"). Sets all
three columns (`status`, `asking_price`, `asking_currency`, and
optionally `condition`) atomically.

Authenticated. Required OAuth scope: `inventory:write`. Caller must
own the item.

Args:
    item_id: ID of the inventory row.
    asking_price: How much you're asking for it. Whole units, not
        cents. Required.
    asking_currency: Currency. Default `€`.
    condition: Free string describing the item's condition (e.g.
        ``like_new``, ``good``). Optional.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    The updated inventory row, or ``{"error": ...}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
item_idYes
conditionNo
asking_priceYes
asking_currencyNo
Behavior5/5

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

Discloses atomic setting of multiple columns, authentication requirements (OAuth scope inventory:write, caller must own item), and nuanced api_key behavior (overrides narrow OAuth token, invalid tokens still fail). Annotations only indicate readOnly=false and idempotentHint=true, so the description adds substantial behavioral context beyond annotations.

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?

Well-structured with purpose statement, context paragraph, args list, and returns. Every sentence provides useful information, and the description is front-loaded with the core action. Length is justified by the tool's complexity.

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 5 parameters and no output schema, the description covers auth, ownership, atomicity, currency default, api_key edge cases, and the return format (updated row or error). Provides everything an agent needs to invoke and interpret results.

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

Parameters5/5

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

Schema coverage is 0%, but the description explains every parameter: item_id (inventory row ID), asking_price (whole units not cents, required), asking_currency (default €), condition (free string, optional), and api_key (optional, with detailed override behavior). This adds meaning the schema lacks.

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

Purpose5/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: 'Move an inventory item to status=for_sale and set listing fields.' It clearly distinguishes itself from the sibling tool by identifying as a 'Convenience wrapper over update_inventory_item' that matches a natural user request.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool: it matches a natural user request like 'list my drill for sale at 30€' and is a convenience wrapper over update_inventory_item, implying the alternative for general updates. Also specifies required OAuth scope and ownership condition.

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

mark_soldA
Idempotent
Inspect

Mark an inventory item as sold (status=sold).

Convenience wrapper over `update_inventory_item` for the natural
"I sold the drill" request.

Authenticated. Required OAuth scope: `inventory:write`. Caller must
own the item.

Args:
    item_id: ID of the inventory row.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    The updated inventory row, or ``{"error": ...}``.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
item_idYes
Behavior5/5

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

The description goes beyond annotations by detailing authentication requirements (OAuth scope), ownership checks, and the behavior of the optional api_key, including that an explicitly passed key overrides an ambient token lacking scope. It also discloses the return value ('The updated inventory row, or {"error": ...}'). Annotations already indicate it's a write (readOnlyHint=false) and idempotent; the description adds valuable context without contradicting them.

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 well-structured with clear sections (main description, convenience wrapper note, auth, args, returns). Every sentence serves a purpose, and the length is justified by the need to explain auth nuances. The core purpose is front-loaded in the first line, making it easy to grasp quickly.

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?

With no output schema, the description explicitly covers return values. It also addresses authentication, parameter meanings, ownership, and error scenarios. Given the tool's simplicity (2 parameters, single action), the description is complete and does not leave important gaps. It also distinguishes from an obvious sibling (update_inventory_item), covering the contextual relationship.

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

Parameters5/5

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

Despite schema description coverage being 0%, the description fully compensates by explaining both parameters. item_id is defined as 'ID of the inventory row.' The api_key is explained in detail, including its format (`pk_*`), where to generate it, when it's used (when no OAuth token or when the token lacks scope), and its override behavior. This adds significant meaning beyond the raw schema types.

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

Purpose5/5

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

The description clearly states the action: 'Mark an inventory item as sold (status=sold).' It explicitly names the resource (inventory item) and the effect (status=sold). It also distinguishes itself from siblings by calling out being a 'Convenience wrapper over update_inventory_item' for the natural 'I sold the drill' request, which clarifies its specific role relative to similar tools like mark_for_sale and update_inventory_item.

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

Usage Guidelines5/5

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

The description provides explicit usage context: it's a convenience wrapper for the common 'I sold the drill' request, implying use when you want to mark an item sold rather than update other fields. It also states prerequisites: 'Authenticated. Required OAuth scope: inventory:write. Caller must own the item.' This gives clear guidance on when the tool is appropriate and what conditions must be met.

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

search_productsA
Read-only
Inspect

Search Partle's product catalog by name or description.

CRITICAL SEARCH INSTRUCTION: Reason from the job to the product class first, 
then search with a descriptive product phrase (e.g. including substrate, material, 
or size class). DO NOT blindly search using the user's raw conversational words. 
Transform questions like 'what do I need to attach a mirror to a brick wall?' 
into a product phrase like 'heavy duty masonry wall anchor'.

Two distinct modes:

- **Default (no flags)** — fast keyword search. ~100ms. Acts like a normal
  "dumb" search box: matches the literal words you typed against product
  names and descriptions, with stemming. Good for queries where the user
  knows the product's likely name ("BC547", "Arduino Uno", "Bosch
  drill"). Returns noisy/wrong results on cross-language or attribute
  queries ("compost bin" matches Spanish "composta", not real composters).
- **`super_search=True`** — slow, high-quality. ~1–2s. Run when the user
  describes what they want rather than naming it: cross-language
  ("Schraubenzieher Set" → real screwdriver sets even without German
  catalog entries), attribute-style ("small metal part with a flat
  head"), or any case where the default returns junk. Embeds the query
  with voyage-3-large, takes the cosine top-50 over the corpus (with an
  exact-name precision boost for part numbers), then a cross-encoder
  reranks them.

The two modes are mutually exclusive in practice — pick one based on
whether the user knows the product's name or is describing it.

Use this when the user asks to find a specific product or browse products
matching a query. Prefer over `search_stores` when the intent is product-led
("find a drill") rather than store-led. Use `get_product` afterwards if the
user wants full details for one specific result.

Read-only. No authentication. Rate-limited to 100 requests/hour per IP.

Args:
    query: Free-text search term. In default mode, treated as keywords
        (each word matched against product text). In `super_search=True`,
        treated as a natural-language description.
    min_price: Lower bound on price in EUR. Omit for no lower bound.
        Null-priced rows are NOT excluded by this filter — pass
        `has_price=True` if you need only priced listings.
    max_price: Upper bound on price in EUR. Omit for no upper bound.
        Tip — narrow by budget: `min_price=10, max_price=50,
        sort_by="price_asc", has_price=True`. Products without a listed
        price (a large fraction of the scraped catalog) sort last under
        either price ordering and are kept in results unless `has_price`
        filters them out.
    tags: Comma-separated tag filter (e.g. "electronics,bluetooth"). Tags
        are AND-ed together.
    store_id: Restrict results to a single store. Use the integer `id` from
        `search_stores` results.
    sort_by: One of `price_asc`, `price_desc`, `name_asc`, `newest`,
        `oldest`. Omit to use the default search-relevance ranking.
    has_price: When True, exclude products without a listed price (~most
        of the scraped catalog). Use this for competitive pricing or
        budget-bounded shopping. When False, return only null-priced
        listings (rarely useful). Omit to include both.
    semantic: Legacy flag. Pure vector ordering, ~250ms. Mostly
        superseded by `super_search=True` (which uses the same vector
        retrieval plus a cross-encoder rerank for materially better
        ordering at the cost of another ~700ms). Keep using it only if
        you specifically want vector retrieval *without* the rerank.
    super_search: **Enable for natural-language / "describe what I
        want" queries.** ~1–2s. Embeds the query with voyage-3-large,
        takes the cosine top-50 (with a precision boost for exact-name
        matches like part numbers / SKUs), then a cross-encoder reranks
        them. Use whenever the user is describing rather than naming —
        cross-language ("Schraubenzieher Set"), attribute-style
        ("small black metal bracket"), or any case where the default
        keyword path returns junk. Don't combine with cheap
        browse-style queries where the user typed an exact product
        name — keyword default is faster there.

        On `relevance_score` here: better than the bi-encoder cosine,
        but still not a "did I find what the user wanted" gauge.
        Behavior to expect: gibberish or fully-off-topic queries cap
        around 0.35; loosely-related catalogue clusters can score 0.7+
        even when no item truly matches (a "ceramic vase" query in a
        catalog with no vases but many ceramic flowerpots will still
        score high). **Read the product names** before claiming a
        match. The score is most useful as a relative signal within
        one result set — a sharp drop between rank N and N+1 marks
        where the catalog stops being useful for this query.
    limit: Max results (1–100, default 20). Larger limits are slower and
        consume rate budget faster.
    offset: Skip this many results before returning. Use for pagination
        (offset += limit on each follow-up call).

Returns:
    A list of products. Each includes `id`, `name`, `price`, `currency`,
    `url`, `description`, `store` (id/name/address), `tags`, `images`, a
    canonical `partle_url`, and `relevance_score` (cosine similarity 0–1
    between the query and the product's embedding when a query was
    provided; `None` otherwise). **Always share `partle_url` with the
    user so they can view the listing.**

    Caveat on `relevance_score`: it is monotonic *within a single search
    result set* (useful for spotting a big drop-off between rank 3 and
    rank 4), but its absolute value is not well-calibrated across
    queries — most results land in 0.55–0.80 regardless of whether the
    catalog has truly relevant items. Don't infer "this is a great
    match" from a 0.75 score alone.
ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
limitNo
queryYes
offsetNo
sort_byNo
semanticNo
store_idNo
has_priceNo
max_priceNo
min_priceNo
super_searchNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations (readOnlyHint, openWorldHint). It states 'Read-only. No authentication. Rate-limited to 100 requests/hour per IP.' It also discloses performance characteristics (~100ms vs 1-2s), mode-specific behaviors, and caveats about `relevance_score` being poorly calibrated. There is no contradiction with annotations.

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?

Although long, the description is exceptionally well-structured with clear sections (CRITICAL SEARCH INSTRUCTION, modes, parameter args, returns), bolded key points, and bullet-style formatting. Every sentence adds value, given the tool's complexity. The front-loaded critical instruction and mode selection guide make it easy for an agent to parse the essentials quickly.

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?

The description fully covers the tool's behavior, including return value structure, output caveats, rate limits, mode selection, and parameter interactions. There is an output schema, but the description still explains `relevance_score` pitfalls and how to present results. For a complex tool with 11 parameters and two search modes, this is complete.

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

Parameters5/5

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

With 0% schema description coverage, the description carries the full burden of explaining parameters. It provides detailed semantics for all 11 parameters, including null-priced behavior for min_price/max_price, AND semantics for tags, sorting details, the special meaning of `has_price`, and the full distinction between `semantic`, `super_search`, and default mode. The `query` parameter is thoroughly explained in both modes. This far exceeds the baseline.

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

Purpose5/5

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

The description opens with a clear verb+resource statement: 'Search Partle's product catalog by name or description.' It explicitly distinguishes from siblings by saying 'Prefer over `search_stores` when the intent is product-led' and references `get_product` for follow-up detail. This fully clarifies what the tool does and how it differs from related tools.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'Use this when the user asks to find a specific product or browse products matching a query.' It also contrasts with `search_stores` and `get_product`, and gives detailed instructions on choosing between default keyword mode and `super_search=True` based on whether the user names a product or describes it. This is exemplary usage guidance.

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

search_storesA
Read-only
Inspect

Search or list stores in the Partle marketplace.

Use for store-led questions ("what hardware shops are in Madrid?") rather
than product-led ones (use `search_products` for that). Pass no query to
browse the whole catalog.

Read-only. No authentication. Rate-limited to 100 requests/hour per IP.

Args:
    query: Free-text search over store name and address. Omit to list
        all stores in default order.
    limit: Max results (1–50, default 20).

Returns:
    A list of stores with `id`, `name`, `address`, `lat`/`lon` (when
    geocoded), `homepage`, `type`, and `product_count` (active listings
    in the store — useful for competitive-landscape sizing without a
    separate `search_products` round-trip). Pass `id` to
    `search_products(store_id=…)` to filter the product catalog by that
    store.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses 'No authentication' and 'Rate-limited to 100 requests/hour per IP,' adding crucial operational context. It also explains output details like `product_count` and integration with `search_products`, far exceeding annotation-only info.

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 well-structured with clear sections (purpose, usage, read-only/rate-limit, args, returns). Every sentence adds value, including the example query and the rationale for `product_count`. No wasted words.

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 two parameters, an output schema (which the description complements with return field details), and sibling tools, the description covers purpose, usage, parameters, returns, limitations, and integration. It is fully sufficient for an agent to select and invoke correctly.

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

Parameters5/5

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

With schema description coverage at 0%, the description fully compensates by explaining `query` (free-text over name/address, omit to list all) and `limit` (1–50, default 20). It also explains how to use the returned `id` with `search_products`, enriching parameter meaning significantly.

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

Purpose5/5

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

The description opens with 'Search or list stores in the Partle marketplace,' specifying a clear verb and resource. It explicitly distinguishes from product-led searches by naming `search_products` as the alternative, making it distinct among siblings.

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

Usage Guidelines5/5

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

It provides explicit when-to-use guidance ('store-led questions') vs. when-not ('use search_products for that'), and covers how to browse the whole catalog by omitting query. This is a model example of usage context.

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

search_wantedA
Read-only
Inspect

Browse public buy requests — what users are looking to buy but haven't found through normal supply.

The demand side of Partle. Use this when an agent wants to **offer
matches** (cross-reference open requests against `search_products`
and surface hits) or just survey unmet demand. Every result is a
public posting — users put these up specifically so suppliers can
reach them.

Buy requests are independent of personal inventory (which is private):
these are sales-facing ads, not workshop tracking notes.

Read-only. No authentication. Rate-limited 100 req/hour per IP.

Args:
    query: Free-text filter over name + description (case-insensitive
        substring). Omit to list everything, newest first.
    limit: Max results (1–100, default 20).
    offset: Pagination offset.

Returns:
    A list of open buy requests. Each includes ``id``, ``name`` (plus a
    deprecated ``title`` mirror of it),
    ``description`` (markdown — read the full text for specs and
    constraints), ``quantity``, ``max_price`` + ``currency`` (if the
    poster set a ceiling), ``contact`` (if they left an
    email/phone/handle), ``reference_url`` (sample or datasheet link
    if any), ``posted_by`` (display name), and ``created_at``.

    If the poster left a ``contact`` value, that's how a supplier
    should respond — Partle doesn't broker the conversation.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
Behavior5/5

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

Annotations already state readOnlyHint and openWorldHint, but the description adds substantial context: rate limiting (100 req/hour per IP), no authentication, independence from private inventory, and that Partle does not broker conversations (contact is via the poster's provided info). This goes well beyond the annotations and paints a complete behavioral picture.

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 well-structured with a clear lead sentence, followed by usage context, behavioral notes, parameter details, and a return-value breakdown. Every sentence adds value; there is no redundancy or fluff. It is appropriately detailed for the tool's complexity without being bloated.

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?

The tool has three parameters and an output schema, and the description covers all three parameters thoroughly, describes the return format and fields (including deprecated title mirror and markdown description), and notes important caveats like contact handling and rate limits. It leaves no meaningful gray areas for an agent trying to decide when and how to call it.

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

Parameters5/5

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

The input schema has zero description coverage, so the description carries full responsibility. It explains query as 'Free-text filter over name + description (case-insensitive substring), omit to list everything,' and provides ranges/defaults for limit (1–100, default 20) and offset. This is exactly the type of enrichment that helps an agent invoke the tool correctly.

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

Purpose5/5

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

The description opens with a specific verb-resource pairing: 'Browse public buy requests' and elaborates that these are user-posted requests for items not found through normal supply. It differentiates from siblings by calling it 'the demand side of Partle' and explicitly contrasts it with 'search_products' and personal inventory, making its distinct role unmistakable.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: 'Use this when an agent wants to offer matches (cross-reference open requests against search_products and surface hits) or just survey unmet demand.' It also clarifies what these requests are (public postings intended for suppliers) and what they are not (private workshop inventory), effectively steering the agent toward correct selection.

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

submit_feedbackAInspect

Report a problem with the Partle marketplace API/MCP itself.

Authenticated. Prefer **OAuth**: connect once via the consent flow and the
bearer token is attached automatically. **Fallback**: pass an `api_key`
(prefix `pk_`, generate at /account). Required OAuth scope: `feedback:write`.
Feedback is attributed to your account so reports are trustworthy and the
channel can't be flooded anonymously.

Scope — what this is for:
- A Partle tool description is unclear or its parameters are surprising.
- A Partle response is broken, malformed, or missing fields.
- The Partle catalog is missing a category of products you'd expect.
- Search relevance is off for a specific class of queries on Partle.

Scope — what this is **NOT** for:
- General complaints about tasks Partle isn't designed to do (Partle is
  a local-marketplace search/listing API — not a news API, an HTML
  hosting service, a portfolio-rebalancing app, a stock brokerage, or
  a generic dashboard SaaS).
- Venting that an invented API key was rejected (Partle keys must be
  `pk_<hex>`; generate one at /account — don't fabricate them).
- Asking the maintainers to do work the user requested but you can't
  do. If you can't fulfil a user request, tell the user — don't submit
  feedback about it here.

Don't loop — each call adds a row and pages the maintainer. Resubmitting
the same text within 24h is de-duplicated (returns the existing id).

Args:
    feedback: Freeform text up to 5000 characters. Be specific — name
        the tool, the input that was confusing, and what you expected.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    ``{"id": int, "message": "Thanks for the feedback!"}`` on success, or
    ``{"error": ...}`` on auth, rate-limit, or validation failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
feedbackYes
Behavior5/5

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

The description discloses authentication requirements (OAuth consent flow, fallback api_key, required scope feedback:write), attribution to the account, 24-hour de-duplication, and that each call pages the maintainer. Annotations are generic (no readOnly/idempotent/destructive hints), so this detail adds substantial value without contradiction.

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

Conciseness4/5

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

The description is long but well-organized with bolded scope headers, bullets, and separate Args/Returns sections. The primary purpose is front-loaded, though some details like the pk_ prefix are repeated unnecessarily, preventing a perfect score.

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?

Without an output schema, the Returns section documents both success and error shapes, making the tool fully self-contained. Combined with auth, scope, parameter, and de-duplication details, no critical usage aspect is missing.

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

Parameters5/5

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

The input schema provides only field names and types, so the description fully compensates. It explains the 5000-character limit for feedback, what to include, and the api_key fallback/override behavior, including the pk_ prefix and precedence rules.

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

Purpose5/5

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

The description immediately states 'Report a problem with the Partle marketplace API/MCP itself', identifying the specific verb, resource, and scope. This clearly differentiates it from sibling marketplace tools like search_products or add_inventory_item.

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

Usage Guidelines5/5

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

Dedicated 'Scope — what this is for' and 'what this is NOT for' sections explicitly list acceptable and unacceptable use cases, and even instruct to tell the user directly instead of submitting feedback for unfulfillable requests. This is unusually explicit guidance.

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

update_inventory_itemA
Idempotent
Inspect

Patch an existing inventory item. Only provided fields change.

Authenticated. Required OAuth scope: `inventory:write`. Caller must
own the item (404 otherwise — we don't leak existence).

Idempotent: calling twice with the same input yields the same final
state. For lifecycle convenience, see `mark_for_sale` and
`mark_sold` which set the right combination of fields atomically.

Args:
    item_id: ID of the inventory row to update. Get from
        `get_my_inventory` or `add_inventory_item`'s return value.
    (every other param matches `add_inventory_item`; omit any field
    you don't want changed.)
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless.

Returns:
    The updated inventory row, or ``{"error": ...}`` on auth /
    not-found / validation failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
notesNo
statusNo
api_keyNo
item_idYes
projectNo
quantityNo
conditionNo
product_idNo
external_idNo
asking_priceNo
purchased_atNo
external_linkNo
asking_currencyNo
acquisition_priceNo
acquisition_currencyNo
Behavior5/5

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

The description discloses authenticated access with required scope, 404 non-ownership behavior (no existence leak), idempotency ('calling twice with same input yields same final state'), and the api_key override semantics. These add context beyond the annotations and cover important behavioral nuances.

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 well-organized with a leading summary, then authentication, idempotency, lifecycle notes, argument explanations, and return value. Each section earns its place and adds non-obvious information. The bullet-like Args section is easy to scan.

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?

Despite having 16 parameters and no output schema, the description covers return values ('The updated inventory row, or {"error": ...} on auth / not-found / validation failure'), error cases, and field-source guidance. It is complete enough for an agent to invoke this tool correctly.

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

Parameters4/5

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

With 0% schema description coverage, the description meaningfully compensates by explaining item_id (source and role) and api_key (when to use). It also cross-references add_inventory_item for all other fields, which is helpful for matching semantics. It doesn't individually explain every parameter, but the cross-reference is a clear pointer.

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

Purpose5/5

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

The description clearly states 'Patch an existing inventory item. Only provided fields change.' This specifies the verb (patch), the resource (inventory item), and the partial-update semantics. It also distinguishes itself from lifecycle tools by pointing to mark_for_sale and mark_sold.

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

Usage Guidelines5/5

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

It explicitly says 'For lifecycle convenience, see mark_for_sale and mark_sold which set the right combination of fields atomically,' giving direct alternatives. It also instructs how to obtain item_id from get_my_inventory or add_inventory_item, and clarifies the API key fallback when OAuth scope is insufficient.

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

update_productA
Idempotent
Inspect

Update an existing product listing. Only provided fields are changed.

Authenticated. OAuth (scope `products:write`) preferred; `api_key` accepted
as fallback.

Only fields you pass are changed; omitted fields are preserved.
Idempotent — calling twice with the same input yields the same final
state. For creating a new listing, use `create_product` instead.

Caller must own the product. Trying to update someone else's product
returns an error.

Args:
    product_id: ID of the product to update. Get from `create_product`'s
        return value, `get_my_products`, or `search_products`.
    name: New product name. Omit to leave unchanged.
    description: New description. Omit to leave unchanged.
    price: New price in whole currency units (e.g. 15.99 = €15.99). Max
        100000. Omit to leave unchanged.
    currency: New currency symbol. Omit to leave unchanged.
    url: New merchant URL. Omit to leave unchanged.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    The updated product record (full, not just the changed fields), or
    ``{"error": ...}`` on auth/ownership/validation failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
nameNo
priceNo
api_keyNo
currencyNo
product_idYes
descriptionNo
Behavior5/5

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

Beyond the idempotentHint annotation, the description details idempotency with 'calling twice with the same input yields the same final state,' partial update semantics, auth fallback behavior, and error conditions. No contradictions with annotations.

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?

Well-organized with clear sections (summary, auth, behavior, args, returns). The opening sentence is purposeful, and each section adds necessary information without redundancy.

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?

Covers auth, ownership, idempotency, field preservation, return value format, and error types. No output schema exists, but the description explains what the tool returns, making it complete for an agent.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining every parameter, including how to obtain product_id, price units and max value, and api_key usage and precedence.

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

Purpose5/5

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

Description clearly states the tool updates an existing product listing and notes that only provided fields are changed. It distinguishes itself from create_product, a sibling tool for creating new listings.

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

Usage Guidelines5/5

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

Explicitly gives the alternative for creating new products, provides auth requirements and fallback behavior, and states the ownership prerequisite. This gives clear when-to-use and when-not-to-use guidance.

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

upload_product_imageA
DestructiveIdempotent
Inspect

Attach an image to an existing product by giving Partle a public URL to download the image from.

Authenticated. OAuth (scope `products:write`) preferred; `api_key` fallback.

**When to use this tool**: the image is already hosted at a public URL
(a scraped product page, an Imgur link, a CDN URL the user provided).
Partle's server fetches it and stores it.

**When NOT to use this tool**: you have local image bytes (a file the
user attached, or bytes you generated/downloaded in your sandbox).
Sending those bytes through a tool argument blows past conversation
context limits — phone-photo-sized payloads can be 6+ MB of base64.
Instead, in your code-execution sandbox, POST the file directly to the
HTTP endpoint with multipart encoding:

  requests.post(
      "https://partle.rubenayla.xyz/v1/external/products/{product_id}/images",
      files={"file": open("/path/to/photo.jpg", "rb")},
      headers={"X-API-Key": "pk_..."},
  )

Or, to create the listing and attach an image in one HTTP request:

  requests.post(
      "https://partle.rubenayla.xyz/v1/external/products",
      data={"metadata": json.dumps({"name": ..., "price": ...})},
      files={"image": open("/path/to/photo.jpg", "rb")},
      headers={"X-API-Key": "pk_..."},
  )

Args:
    product_id: ID of the product to attach the image to.
    image_url: Publicly fetchable URL of the image. Server fetches it
        and stores it.
    api_key: Optional API key (`pk_*`, generate at /account).
        Used when there is no OAuth token, and also when the OAuth
        token lacks the required scope — an explicitly passed key
        overrides an ambient token that is scoped too narrowly.
        An invalid or revoked token still fails regardless. Omit when using OAuth.

Returns:
    The created `ProductImage` record with its `id` (use for deletion)
    and storage path, or ``{"error": ...}`` on validation/auth failure.
ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNo
image_urlYes
product_idYes
Behavior5/5

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

Discloses authentication requirements (OAuth scope, api_key fallback), server-side fetch behavior, and API key override semantics that go well beyond the annotations. No contradiction with readOnlyHint or destructiveHint.

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?

Well-structured with clear headings and code examples. While lengthy, every sentence adds value—no filler or redundant repetition would affect usability.

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?

Covers purpose, usage conditions, alternative paths, authentication, parameter semantics, and return values. The absence of an output schema is fully compensated by the detailed returns explanation. Suitable for correct invocation.

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

Parameters5/5

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

Despite 0% schema coverage, the description provides detailed explanations for all three parameters, including the purpose of api_key, how it interacts with OAuth tokens, and the return format for product_id and image_url.

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

Purpose5/5

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

States a specific action (attach an image to an existing product) with the mechanism (via public URL) and clearly distinguishes from siblings like delete_product_image or get_upload_url.

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

Usage Guidelines5/5

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

Explicitly provides 'When to use' and 'When NOT to use' sections, including specific alternative approaches (direct HTTP POST with multipart encoding) and the rationale (context limits).

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

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.