Partle

xyz.rubenayla.partle由 partle.rubenayla.xyz 发布官方发布者v1.2.0更新于 Oct 25, 2026

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

已验证Streamable HTTP可网页运行效率与工作流商业与电商

概览

AI 生成的概览

Partle 是一个面向市集平台的远程 MCP 服务器:助手可以搜索商品和店铺、浏览公开求购信息,并管理商品刊登和私人物品清单。

可以做什么
搜索并读取公开目录:按名称、价格、标签或店铺查找商品,查看商品完整记录、店铺及其详情,以及平台汇总数据。浏览公开求购信息,并与目录商品交叉比对以推荐匹配项。创建、更新和删除自己的商品刊登,并添加或移除商品图片。维护私人物品清单,涵盖已拥有、想要、在售和已售状态,并可将物品标记为在售或已售。发布公开求购信息,读取和修改账户设置与用户名,并管理 API 密钥和已连接的应用。
适用场景
适合让助手代为逛市集:查找商品和店铺、查看价格和刊登链接,或了解尚未满足的需求。也适合希望用对话方式管理刊登和私人物品清单的卖家。
运行要求
通过 streamable HTTP 连接的远程端点;读取公开目录无需配置或凭据。写入操作和读取私人物品清单需要 OAuth 授权,涉及 products:write、inventory:write 或 security:write 等范围,或在账户中生成 api_key 参数(pk_ 前缀)。另有本地 stdio 包,转发到公开 REST API。公开请求按 IP 限制为每小时 100 次。
安装前请注意
写入工具会改动公开数据:create_product、update_product 和 create_buy_request 会发布内容,而 delete_product、delete_product_image 和 delete_inventory_item 是永久硬删除,没有回收站。创建和轮换 API 密钥时密钥只返回一次,且权限比受限的 OAuth 令牌更广;撤销密钥或已连接应用会立即切断使用方访问。账户设置和用户名修改受限,用户名一经设定便无法更改。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Partle,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/xyz.rubenayla.partle%2Fmarketplace/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "partle": {
      "type": "http",
      "url": "https://partle.rubenayla.xyz/mcp/"
    }
  }
}

README

Partle Marketplace MCP Server

[Verified on MseeP]

Model Context Protocol server for the Partle marketplace — let your AI shop here: search products and stores, get prices and purchase links, or ask it to add a listing for you, all without leaving your assistant.

Live product and store coverage is available through the get_stats tool. Public catalogue reads need no auth. Writes and private inventory reads need OAuth or a pk_… API key.

Two ways to run it

Remote (recommended — zero setup)

Point your MCP client at:

https://partle.rubenayla.xyz/mcp/

That's it. Streamable HTTP transport, MCP spec 2025-06-18. Per-client install instructions: /documentation/mcp-setup/.

Local stdio (for clients that prefer installable servers, or for Glama / Smithery scoring)

bash
pip install partle-mcppartle-mcp

Or with uvx (no install):

bash
uvx partle-mcp

Or with Docker:

bash
docker run --rm -i ghcr.io/rubenayla/partle-mcp

The stdio package proxies to the public REST API at https://partle.rubenayla.xyz, so you don't need a database or local backend.

Claude Desktop / Claude Code (stdio)
json
{  "mcpServers": {    "partle": {      "command": "uvx",      "args": ["partle-mcp"]    }  }}

Tools (20 total)

Read (no auth)

ToolPurpose
search_productsSearch the catalog by name, price range, tags, store. Supports cross-language semantic search.
get_productFull record for one product by ID.
search_storesSearch/list stores by name or address.
get_storeFull record for one store by ID.
get_statsPlatform-wide totals.
search_wantedBrowse public buy requests at /wanted — things people are looking to buy but haven't found. Cross-reference against search_products to offer matches.

Write (authenticated)

Two ways to authenticate, in preference order:

  1. OAuth (recommended) — when you add Partle as a custom connector in claude.ai or any MCP client that supports OAuth, the client walks you through a one-click consent screen and attaches a bearer token automatically. Scopes: products:read, products:write, inventory:read, inventory:write. Revoke at /account → Connected apps. RFC 9728 metadata at /.well-known/oauth-protected-resource; RFC 7591 dynamic client registration at /oauth/register.
  2. API key (fallback) — pass an api_key parameter to any write tool. Generate at /account → API Keys. Use this when your client doesn't support OAuth (raw scripts, programmatic agents).

Products — public catalog listings.

ToolPurpose
create_productAdd a new listing. Set verified=false when an AI is proposing on behalf of an unconfirmed human.
update_productEdit a listing you own.
delete_productRemove a listing you own.
upload_product_imageAttach an image (base64 or URL).
delete_product_imageRemove an image from a product.
get_my_productsList products you've created.

The remote HTTP server also offers get_upload_url (re-fetches a signed upload URL for an existing product). Not exposed in this stdio package — use the remote server if you need it.

Inventory — private workshop tracking (owned / wanted / for_sale / sold / discarded). Private to the owner; does not appear on the public /wanted feed.

ToolPurpose
get_my_inventoryList your inventory items. Filterable by status, project, free text.
add_inventory_itemAdd a row in any lifecycle state.
update_inventory_itemPatch any field.
delete_inventory_itemPermanently remove a row.
mark_for_saleConvenience: flip an owned item to for_sale and set an asking price.
mark_soldConvenience: flip a for_sale item to sold.

Buy requests — public demand-side posts on /wanted. Independent of personal inventory.

ToolPurpose
create_buy_requestPost a public buy request (name, description, quantity, optional max_price and contact).

Feedback

ToolPurpose
submit_feedbackSend freeform feedback about your integration experience.

Public REST API

Same data, also reachable as plain HTTP for clients without MCP support:

  • GET /v1/public/products?q=cerrojo&limit=10 — search products
  • GET /v1/public/stores?q=Madrid&limit=10 — search stores
  • GET /v1/public/wanted?q=bolt&limit=10 — list open public buy requests
  • GET /v1/public/stats — platform totals
  • POST /v1/public/feedback — submit feedback

Base URL: https://partle.rubenayla.xyz. Rate-limited to 100 req/hour per IP.

Full docs: /documentation/ · OpenAPI: /openapi.json · Discovery: /.well-known/mcp.json.

Example

You: "Use Partle to find a drill under €50."

Claude: (calls search_products(query="drill", max_price=50))

Returns Blackspur 13pc High Speed Drill Bit Set at €4.99 (Lenehans, IE), Flotec Drill Pump 225 GPH at €17.14 (Kooyman Megastore, NL), and a few more — each with a partle_url to view the listing.

More examples in the setup guide.

License

Apache-2.0 — see LICENSE.

来源:README.md,提交 5e669b3

工具

30

search_products

Search products

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:

输入参数tagslimitquery必填offsetsort_bysemanticstore_idhas_pricemax_pricemin_pricesuper_search

get_product

Get product details

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.

输入参数product_id必填

search_stores

Search stores

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.

输入参数limitquery

get_store

Get store details

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.

输入参数store_id必填

get_stats

Get platform stats

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}``.

无需输入参数。

search_wanted

Search buy requests (public demand feed)

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.

输入参数limitqueryoffset

create_buy_request

Create buy request

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. 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": ...}``.

输入参数nameapi_keycontactcurrencyquantitymax_priceproduct_iddescriptionreference_url

submit_feedback

Submit feedback

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 regardle

输入参数api_keyfeedback必填

create_product

Create product

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

输入参数urlname必填priceapi_keycurrencystore_iddescriptionlisting_typeidempotency_key

update_product

Update product

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.

输入参数urlnamepriceapi_keycurrencyproduct_id必填description

delete_product

Delete product

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.

输入参数api_keyproduct_id必填

delete_product_image

Delete product image

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.

输入参数api_keyimage_id必填product_id必填

get_my_products

List my products

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.

输入参数limitapi_key

get_upload_url

Get image upload URL

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.

输入参数api_keyproduct_id必填

upload_product_image

Upload product image

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 ``{"

输入参数api_keyimage_url必填product_id必填

get_my_inventory

Get my inventory

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": ...}``.

输入参数qlimitoffsetstatusapi_keyprojectproduct_id

add_inventory_item

Add inventory item

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.../li

输入参数namenotesstatusapi_keyprojectquantityconditionproduct_idexternal_idasking_pricepurchased_atexternal_link另有 3 个

update_inventory_item

Update inventory item

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.

输入参数namenotesstatusapi_keyitem_id必填projectquantityconditionproduct_idexternal_idasking_pricepurchased_at另有 4 个

delete_inventory_item

Delete inventory item

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.

输入参数api_keyitem_id必填

mark_for_sale

Mark inventory item for sale

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": ...}``.

输入参数api_keyitem_id必填conditionasking_price必填asking_currency

mark_sold

Mark inventory item sold

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": ...}``.

输入参数api_keyitem_id必填

get_account_settings

Read account settings

Read your account ID, email, username and theme. Requires OAuth account:read. Passwords and key secrets are never returned. No other account can be selected. A null theme means no account preference has been set; the browser keeps its local choice.

无需输入参数。

update_account_settings

Change account theme

Set your account theme to light, dark, or system. Requires OAuth account:write. The website applies it on login, reload or return to its tab. This only changes the theme; passwords, roles and sign-in providers cannot be changed.

输入参数theme必填

set_account_username

Set account username

Set your username once, only if unset. Requires OAuth account:write. Use 3–20 letters, digits, underscores or dashes. Existing usernames cannot be changed. Ask the user which public username they want before setting it.

输入参数username必填

list_account_api_keys

List account API keys

List your key IDs, labels, prefixes and dates, never secrets. Requires OAuth security:read.

无需输入参数。

create_account_api_key

Create account API key

Create a full-access catalog/inventory API key. Requires OAuth security:write. The secret is returned ONCE. Store it securely; never include it in a public message or logs. This grants broader catalog/inventory access than a limited OAuth token. It cannot manage account settings or credentials through MCP. Each call creates a new key; do not retry blindly after a lost response.

输入参数label

rotate_account_api_key

Prepare account API key rotation

Create a replacement for your key, keeping the old key ACTIVE. Requires OAuth security:write. Returns the replacement secret ONCE with its new ID. Install it in the consumer, test it, then call revoke_account_api_key with previous_key_id. Do not revoke until the replacement is working. Each call creates a key; do not retry blindly after a lost response. Never publish the secret.

输入参数key_id必填

revoke_account_api_key

Revoke account API key

Immediately revoke one of your API keys. Requires OAuth security:write. Consumers using the key will lose access. For rotation, first install and test the replacement returned by rotate_account_api_key.

输入参数key_id必填

list_connected_apps

List connected apps

List apps with active access to your account and their permissions. Requires OAuth security:read.

无需输入参数。

revoke_connected_app

Disconnect account app

Revoke an app's access AND refresh tokens for your account. Requires OAuth security:write. This disconnects the app immediately. Revoking your own calling app also works, but subsequent requests will fail until you reconnect with consent.

输入参数client_id必填

版本历史

1
  1. v1.2.0最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分