Skip to main content
Glama
gabrielbelli

pelando-mcp

by gabrielbelli

pelando-mcp

CI License: BSD-2-Clause

MCP server for pelando.com.br, the Brazilian community deal board. It answers the question a price comparator structurally cannot: did the crowd believe this discount?

Pelando's temperature score goes negative when users judge a deal fake or the price inflated before the "promotion". No other Brazilian price source exposes that, and — as of August 2026 — no other MCP server exposes Pelando at all.

See PLAN.md for the full design, the reconnaissance behind it, and the source-selection decision.

What it is, and what it is not

This is a community deal reader, not a price comparator. Pelando has no product catalogue — verified four ways, see PLAN.md §2 — so the server does not pretend otherwise:

It can tell you

It cannot tell you

What users posted, at what price, from which store

What a product costs on a shelf right now

Whether the crowd upvoted or downvoted it

Every store selling product X, with prices

What the comment thread says is wrong with it

A 30/90-day price curve

Coupon codes and which store has active deals

Product specs, or anything about a product nobody posted

Coverage is exactly what the community posts. Even mainstream terms legitimately return nothing: iphone 16 pro currently has zero live promotions against ~99 archived ones. That is a real answer, not a failure.

Related MCP server: mcp-brazil-marketplaces

Tools

Tool

Purpose

search_deals

Free-text deal search. Weak matches are demoted to related, not hidden.

browse_feed

Pelando's own feeds, optionally scoped to a community (tech-lover for electronics).

get_deal

One deal by UUID or slug — a pasted /d/<slug> URL works directly.

get_deal_comments

The comment thread, where a bad posting gets corrected.

assess_deal_quality

The point of the project. The crowd's verdict, with its evidence.

search_stores

Merchant lookup: live promotion counts and top coupons.

get_store_coupons

Literal redeemable codes, with prose masquerading as codes filtered out.

list_communities

The 11 communities — the site's only taxonomy.

ping

Liveness.

assess_deal_quality

Every signal is already in payloads we fetch, so it costs at most one extra request. Real output, against a live deal:

{
  "title": "[REEMBALADO] GeForce RTX 5070 OC 12GB",
  "verdict": "crowd_rejected",
  "temperature": -229,
  "price": 4129.0,
  "store_name": "Terabyte",
  "warnings": [
    "Negative temperature (-229). On Pelando that usually means users judged the discount fake,
     the price inflated beforehand, or the listing misleading.",
    "The title declares this as 'reembalado'. Do not compare it against new-unit prices."
  ]
}

It returns a verdict with its evidence attached, never a bare score. A score invites the calling model to quote it as fact; evidence invites it to explain, and lets you disagree.

Quick start (local, venv)

Requires Python ≥ 3.12.

python3 -m venv venv
./venv/bin/pip install -e ".[dev]"
./venv/bin/pytest -m "not live"     # offline, runs against checked-in fixtures
./venv/bin/pelando-mcp              # runs the MCP server over stdio

End-to-end check against the live site:

./venv/bin/python scripts/verify_all_tools.py     # writes to data/verify/

Docker

Multi-arch images (linux/amd64, linux/arm64) are published on every push to main:

docker pull ghcr.io/gabrielbelli/pelando-mcp:latest
docker run --rm -i -v pelando-mcp-data:/data ghcr.io/gabrielbelli/pelando-mcp:latest

Or build locally:

docker compose build
docker compose run --rm pelando-mcp

A named volume holds the sqlite cache at /data/cache.sqlite.

Run this from home, not from a cloud host. Cloudflare fronts Pelando and blocks datacentre IP ranges outright — a 403 interstitial on every request, robots.txt included, no matter how honest the User-Agent is. Measured: the identical client returns 200 from a residential connection and 403 from a GitHub Actions runner. So the image is fine on a laptop, home server or NAS, and will not work on a VPS. Treat that as a constraint to respect rather than a puzzle to route around with a proxy — see Politeness.

Wiring into Claude

{
  "mcpServers": {
    "pelando": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-v", "pelando-mcp-data:/data", "ghcr.io/gabrielbelli/pelando-mcp:latest"]
    }
  }
}

Local venv

{
  "mcpServers": {
    "pelando": {
      "command": "/absolute/path/to/pelando-mcp/venv/bin/pelando-mcp"
    }
  }
}

Configuration

Variable

Default

Purpose

PELANDO_USER_AGENT

pelando-mcp/0.1 (+repo url)

Sent on every request. See below.

PELANDO_RATE_LIMIT_RPS

1.0

Max requests/sec.

PELANDO_RATE_LIMIT_BURST

3

Token-bucket burst.

PELANDO_CACHE_PATH

/data/cache.sqlite (Docker) / data/cache.sqlite (local)

sqlite cache.

PELANDO_LOG_LEVEL

INFO

structlog level.

Politeness, and why Pelando

Pelando was chosen on compliance grounds as much as data grounds. Zoom, Buscapé, Bondfaro, Mercado Livre and Hardmob all name ClaudeBot / Claude-User / Anthropic-AI under Disallow: / — Zoom's under a heading reading "Bloqueio de Scrapers de Inteligência Artificial (Proteção do catálogo e dados de preço)". Pelando's robots.txt is Allow: /, with disallows confined to logged-in pages, and its Terms of Use carry no anti-crawler clause.

Practically, that means:

  • The User-Agent identifies us truthfully rather than impersonating Chrome. Cloudflare blocks bot UA strings — including python-httpx, our own library — but an honest self-identifying UA returns 200. If this server ever becomes a nuisance, the operator can email us instead of blocking us. Don't replace it with a browser string.

  • Cloudflare also blocks by IP range, not only by UA. Datacentre ranges get a 403 interstitial however honest the UA is, which is why this runs from a home connection and why the live contract tests are not in CI. A residential proxy would defeat that block; we don't ship one.

  • 1 req/s, concurrency 1, with aggressive sqlite caching. Measured headroom is much larger; that is not a reason to use it.

  • robots.txt is fetched at startup and paths are actually evaluated against it.

  • The merchant's own link is surfaced, never Pelando's affiliate redirect. A tool that presents itself as neutral should not silently monetise your click for a third party.

  • No login, no writes, no background polling, no bulk crawling.

Layout

src/pelando_mcp/
├── server.py        # MCPServer entry, registers tools
├── client.py        # httpx async, honest UA, token bucket, retries, robots, cache
├── api.py           # typed calls; validates params the API would silently ignore
├── models.py        # pydantic v2 — nullability mirrors observed live payloads
├── normalise.py     # condition detection + relevance filtering
├── quality.py       # the crowd-verdict heuristic
└── tools/           # MCP tool registrations
tests/
└── fixtures/        # real captured JSON + HTML for offline parser tests
scripts/
└── verify_all_tools.py

Notes

  • Data comes from an undocumented internal JSON API. It has no contract and no deprecation policy, so pytest -m live hits the real endpoints and fails on schema drift. A scraper does not break loudly — it starts returning "no deals found" and lies to you. Run it by hand every so often, from home; if the edge blocks the network it skips rather than fails, because a 403 says nothing about the schema.

  • Deal status is maintained by users and moderators, not verified against the merchant. An "active" deal can be long dead at the shop.

  • Titles are free text. [REEMBALADO], usado and open box are detected and flagged; a silent title is reported as unknown condition, never as new.

  • Prices are BRL, exclude frete unless free_shipping is true, and 0 is a real price (free games).

Licence

BSD 2-Clause — see LICENSE.

Available Tools

9 tools
assess_deal_qualityA

Judge whether the community believes a deal is genuine.

This is what Pelando has that a price comparator does not. It reads the crowd's vote (temperature, which goes NEGATIVE when users think a discount is fake or the price was inflated beforehand), the comment reactions, the poster's reputation, the deal's age and status, and any condition declared in the title.

Returns a verdict WITH its evidence attached, never a bare score — present the reasoning to the user rather than the label alone. It judges community sentiment, not merchant truth: it cannot verify that the price is real or still available.

ParametersJSON Schema
NameRequiredDescriptionDefault
id_or_slugYes
include_commentsNo

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and largely meets it: it lists the inputs it fuses (temperature, comment reactions, poster reputation, deal age/status, title conditions), discloses that temperature can go negative, and defines the output contract (verdict with evidence, never a bare score). It omits failure modes, auth/permission needs, and any rate-limit or caching behavior.

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?

Front-loaded with the core purpose in the first sentence, then layers scope, mechanism and output contract. It is somewhat prose-heavy across three short paragraphs, but each sentence adds usable information rather than restating the name.

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

Completeness4/5

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

For a 2-parameter analytical tool with no output schema and no annotations, the description covers purpose, evidence sources, output shape and limitations adequately. The remaining gap is parameter-level detail, which is the one area callers would still have to guess at.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the two undocumented parameters, and it does not: 'id_or_slug' format and 'include_comments' are never mentioned, leaving it unclear how the boolean toggles the comment-reaction signal it describes. The mention of 'comment reactions' as an input loosely implies comments matter, but no real parameter guidance is given.

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 verb+resource ('Judge whether the community believes a deal is genuine') and is easily distinguished from siblings like get_deal, get_deal_comments and search_deals, which retrieve raw data rather than render a sentiment verdict. The description also pins the scope of judgment (community belief, not merchant truth).

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?

Gives clear context for when this tool is the right one ('This is what Pelando has that a price comparator does not') and draws an explicit boundary around what it will not do ('cannot verify that the price is real or still available'). It stops short of naming sibling tools or routing conditions (e.g. use get_deal for raw facts), so it is strong but not fully explicit.

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

browse_feedB

Browse Pelando's own feeds, optionally scoped to one community.

community must be one of the 11 canonical slugs — there is no finer taxonomy on the site. For electronics use tech-lover or mundo-gamer. An unknown slug is rejected here rather than sent, because the API silently ignores it and returns the global feed instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
feedNohottest
limitNo
communityNo
include_expiredNo

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses error-handling behavior: unknown slugs are rejected at this layer because the upstream API silently ignores them and returns the global feed. But it says nothing about auth requirements, rate limits, result shape, or how limit/include_expired behave.

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?

Front-loaded with the action, followed by parameter guidance in three tight sentences with no filler. The community discussion is somewhat long relative to the rest of the tool's surface, but every sentence carries information.

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

Completeness3/5

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

For a four-parameter tool with no annotations and no output schema, the coverage is uneven: community is well covered while limit, include_expired, and the return structure are not. An agent can invoke it, but not with full confidence about limits or result shape.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It does so only for `community` (11 canonical slugs, examples, rejection behavior); `limit`, `include_expired`, and `feed` receive no semantic explanation beyond their names/enums. Partial compensation of one of four parameters warrants a 3.

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

Purpose4/5

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

The description states a specific verb and resource ('Browse Pelando's own feeds') and adds scoping detail ('optionally scoped to one community'). It does not explicitly contrast itself with the sibling search_deals, so the browse-vs-search distinction is left to inference.

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

Usage Guidelines3/5

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

It gives real guidance on the community parameter (use one of 11 canonical slugs, use `tech-lover`/`mundo-gamer` for electronics), which implies when this tool is appropriate. However, it never states when to prefer browse_feed over search_deals or list_communities, so alternative selection is not addressed.

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

get_dealB

Fetch one deal by UUID or by slug.

A slug works directly, so a URL the user pasted (pelando.com.br/d/<slug>) can be handed over with just the last path segment.

ParametersJSON Schema
NameRequiredDescriptionDefault
id_or_slugYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it mostly doesn't. It never says what a 'deal' response contains, whether a missing deal errors or returns empty, or if there are auth/rate-limit considerations. The only disclosed behavior is input-shape flexibility, which is closer to parameter guidance.

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?

Two short paragraphs, the core action front-loaded, and one concrete example that earns its place by resolving the URL case. No filler.

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

Completeness3/5

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

With no output schema and no annotations, the description should ideally sketch what comes back so an agent can plan next steps (e.g. whether comments or quality assessment are worth calling). It covers input handling well but leaves the return contract entirely unspecified.

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?

Schema coverage is 0% — the schema says only 'Id Or Slug' as a bare string — so the description must compensate, and it does: it explains that both UUID and slug are accepted and shows how to extract the slug from a pasted URL. That is real semantic value the schema lacks, though it doesn't specify format expectations (e.g. UUID casing) or error handling for a bad value.

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

Purpose4/5

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

States a specific verb ('Fetch') and resource ('one deal') and names the two accepted identifier forms (UUID or slug), which cleanly separates it from the plural sibling search_deals. It does not explicitly name that sibling, so the differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

Usage is implied: use this when you already have an identifier for a single deal. The slug/URL paragraph is genuinely helpful for invoking it, but there is no statement of when to prefer this over search_deals or browse_feed, and no mention of failure behavior when the identifier doesn't resolve.

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

get_deal_commentsB

Read a deal's comment thread — where the crowd corrects a bad posting.

The thread is the only place a fake discount gets explained; there is no report or flag field in Pelando's data. Note the upstream endpoint has no pagination and returns the whole tree at once, so limit truncates locally and truncated tells you when that happened.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
id_or_slugYes

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and discloses important behavior: the upstream endpoint has no pagination, returns the whole tree at once, and the local limit truncates results. It also mentions a truncated indicator, which helps the agent interpret output, though it omits auth, rate limits, and broader return structure.

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 appropriately sized and front-loads the purpose in the first clause. The second sentence adds useful context about why the thread matters, and the third covers pagination behavior without excessive padding.

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

Completeness3/5

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

Given no annotations and no output schema, the description should do more, but it does cover the critical non-pagination behavior and truncated output signal. It still leaves the return shape, comment structure, and identifier format largely to inference.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for both parameters. It explains limit well—local truncation rather than server-side pagination—but gives no explicit semantics for the required id_or_slug parameter beyond the general phrase 'a deal's comment thread.'

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

Purpose4/5

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

The description clearly states the verb and resource: 'Read a deal's comment thread.' It distinguishes the tool from generic deal-fetching siblings by focusing on the comment thread and its role in correcting bad postings, though it does not explicitly name sibling alternatives.

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

Usage Guidelines3/5

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

Usage is implied rather than explicit: the thread is framed as the place to investigate fake discounts and corrections because no report/flag field exists. However, the description gives no direct when-to-use instruction or comparison against tools like get_deal or assess_deal_quality.

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

get_store_couponsA

Fetch a store's coupon codes.

only_valid_codes drops entries whose code is prose rather than a redeemable code — the field has been seen holding instructions like "Resgatar cupom abaixo do produto".

Coupons expire silently. Every code is reported with the date it was posted so its age is visible; none of them is guaranteed to still work.

ParametersJSON Schema
NameRequiredDescriptionDefault
storeYes
only_valid_codesNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does real work here: it warns that coupons expire silently, that no code is guaranteed to work, and that each code carries its posting date so freshness is visible. It does not cover auth, rate limits, or pagination, but the data-reliability disclosure is unusually candid.

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?

Three tight sentences, front-loaded with the purpose, then the filter semantics, then the expiry caveat. Nothing is redundant and each sentence earns its place; the quoted bad value is illustrative rather than filler.

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

Completeness4/5

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

For a two-parameter read tool with no output schema, the description covers purpose, the non-obvious flag, and return-data caveats well enough to call it correctly. The only gap is the expected format of the `store` argument, which is minor.

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?

Schema description coverage is 0%, so the description must compensate, and it does for only_valid_codes: it explains the filter drops prose entries and gives a concrete example of the junk value seen. The `store` parameter is left unexplained, but its meaning is self-evident.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Fetch a store's coupon codes', which is unambiguous. Coupons are a distinct resource from the deal/store/community siblings, so an agent can separate it, though no sibling is named or contrasted explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: fetch coupons when you want a store's coupon codes. There is no statement of when to prefer this over search_deals or get_deal, and no prerequisites or exclusions. The only_valid_codes explanation hints at a filter decision but does not frame when to use the tool.

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

list_communitiesA

List Pelando's 11 communities — the site's only browse taxonomy.

There is no category system beside this: deals carry a bare numeric categoryId with no label anywhere in the data. tech-lover and mundo-gamer are the electronics ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does add real behavioral value: it warns that categoryId is a bare numeric with no label anywhere in the data, which prevents a doomed lookup attempt. However, it says nothing about the `refresh` flag's effect, caching, network cost, or return shape, so it is only partially transparent.

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?

Three short sentences, front-loaded with the core action and count, with each sentence carrying distinct information (count, taxonomy gap, example names). The example community names are slightly decorative but do aid recognition.

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

Completeness3/5

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

There is no output schema or annotation coverage, and the description omits both the return format and the `refresh` semantics. What it does supply — the count, the taxonomy caveat, and sample names — is genuinely useful for a small list tool, but a fully self-sufficient definition would cover the one parameter.

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

Parameters2/5

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

The single `refresh` parameter has 0% schema description coverage and is not mentioned at all in the description. The reader cannot tell whether refresh forces a network fetch, invalidates a cache, or changes the payload, so meaning is missing at both levels.

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?

It names a specific verb and resource ('List Pelando's 11 communities') and even fixes the cardinality, so an agent knows exactly what comes back. It also distinguishes the tool from any category-style lookup by stating this is the site's only browse taxonomy. No sibling does anything similar, so it is unambiguous.

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

Usage Guidelines3/5

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

By calling this 'the site's only browse taxonomy' the description implies the tool is the entry point for discovering communities, but it never states when to prefer it over siblings like browse_feed or search_deals, nor any prerequisites. Usage is inferable rather than explicit.

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

pingA

Liveness check. Returns server name, version, and runtime config.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the return payload, which is genuinely useful, but says nothing about side effects, latency, or failure modes — acceptable for a trivial read-only ping, hence a middling 3.

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?

Two terse sentences, zero waste, with the purpose front-loaded before the return-value detail. Nothing could be cut without losing information.

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

Completeness4/5

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

For a parameterless health-check tool with no output schema, declaring the returned fields is exactly the information an agent needs. Only the absence of any 'when to use' context keeps it short of a 5.

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 tool takes zero parameters, and the schema is empty with 100% coverage. There is nothing for the description to disambiguate, so the baseline of 4 applies.

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

Purpose4/5

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

States a specific operation (liveness check) and enumerates the returned payload (server name, version, runtime config). This clearly distinguishes it from the deal/feed/store siblings, though it doesn't name an alternative explicitly.

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

Usage Guidelines3/5

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

"Liveness check" implies use for health/availability verification, but the description never states when to reach for it versus, say, discovering tools, nor any conditions or exclusions.

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

search_dealsA

Search deals that Pelando users have posted.

Returns community postings, NOT a catalogue: one merchant per posting, free-text titles, and only products someone chose to post. There is no product database behind this — even mainstream terms can legitimately return nothing.

Pelando's search is token-based and loose ("iphone 16 pro" matches "iPhone 14 Pro ... 16"), so each result carries a relevance block. With drop_irrelevant the weak matches are moved to related rather than deleted, so nothing is hidden from you.

Only include_expired and sort are server-side. Every other filter is applied locally after fetching, so a narrow filter with a small size may return few rows even when more exist upstream.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNopromotion
pageNo
sizeNo
sortNotemperature
queryYes
storeNo
max_priceNo
drop_irrelevantNo
include_expiredNo
min_temperatureNo
free_shipping_onlyNo

TDQS

A4.6/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden and does so well: loose token-based matching, the `relevance` block, that `drop_irrelevant` relocates weak matches to `related` rather than deleting them, and the critical server-side (`include_expired`, `sort`) versus locally-applied filter split. These are exactly the non-obvious behaviors an agent needs.

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?

Four short paragraphs, front-loaded with the highest-value caveat (no catalogue behind it), then matching behavior, then the server/local filter trap. Every sentence carries information an agent would otherwise get wrong; nothing is filler.

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

Completeness4/5

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

For a 11-param, no-annotation, no-output-schema tool, the description covers the essentials — result character, empty-result legitimacy, `relevance`/`related` shape, and filter execution. It stops short of explaining pagination interplay and what `temperature` means, which leaves minor gaps.

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?

Schema coverage is 0% across 11 params, so the description must compensate; it adds real meaning for the non-obvious ones (`drop_irrelevant`, `include_expired`, `sort`, `size`) and the server-vs-local execution model. It leaves `kind`, `store`, `max_price`, `min_temperature`, and `free_shipping_only` to inference from their names, so compensation is partial but substantive.

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 verb and resource ('Search deals that Pelando users have posted') and immediately characterizes the corpus ('community postings, NOT a catalogue'), which is the decisive fact distinguishing it from get_deal or browse_feed. An agent can tell what it retrieves without opening the schema.

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

Usage Guidelines4/5

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

It gives strong usage-shaping context — that mainstream terms can legitimately return nothing, and that most filters run locally so a narrow filter plus small `size` may under-return — but it never explicitly names alternatives (get_deal, browse_feed, assess_deal_quality) or states when-not-to-use it. Clear context, no explicit routing.

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

search_storesA

Look up a merchant: its live activity counts and its top coupons.

Matching is loose and substring-based upstream — "amazon" also returns "Amaro" — so results are ranked here by how closely the name matches, but the caller should still check the name before acting on the first row.

promotion_count tells you how many active promotions a store has, but there is no endpoint anywhere that lists them. To see a store's deals, search a product term and filter by store.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
include_couponsNo

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses loose substring matching, that results are re-ranked by name similarity, and the important caveat that promotion_count has no listing endpoint anywhere. It omits auth/permission needs, rate limits, and pagination behavior, keeping it short of 5.

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?

Three tight paragraphs, front-loaded with purpose and then escalating to caveats; every sentence carries information. The bold/backtick formatting is slightly heavy but does not waste space.

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

Completeness4/5

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

With no output schema and no annotations, the description compensates by naming returned fields (promotion_count, top coupons) and warning about match accuracy and the promotions dead-end. The main gap is the undocumented limit and include_coupons parameters, which leaves an agent guessing on pagination and coupon inclusion.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description must compensate and largely does not: query matching is loosely described, but limit and include_coupons are never explained, including what include_coupons=false suppresses. Only the query parameter gets meaningful elucidation.

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

Purpose4/5

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

The description gives a concrete verb and resource ("Look up a merchant") and states what comes back ("live activity counts and its top coupons"), which is more than a restatement of the name. It partially differentiates from siblings by pointing to the alternate path ("search a product term and filter by store") for deals, though it never names search_deals or get_store_coupons directly.

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?

Provides actionable usage guidance: verify the returned name before acting on the first row, and use product-term search when the goal is deals. It lacks an explicit "when not to use this / use X instead" routing statement naming the sibling tools, so it stops short of a 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.0.1
    • First observedassess_deal_quality
    • First observedbrowse_feed
    • First observedget_deal
    • First observedget_deal_comments
    • First observedget_store_coupons
    • First observedlist_communities
    • First observedping
    • First observedsearch_deals
    • First observedsearch_stores

TDQS

A4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct action+resource: search_deals vs browse_feed are separated by query-based vs community-feed retrieval, search_stores vs get_store_coupons split merchant lookup from coupon codes, and get_deal/get_deal_comments/assess_deal_quality are clearly layered. Descriptions explicitly state boundaries and upstream limitations, leaving little room for misselection.

Naming Consistency5/5

Uniform snake_case verb_noun pattern throughout (search_deals, browse_feed, get_deal, get_deal_comments, assess_deal_quality, search_stores, get_store_coupons, list_communities, ping). Verbs are used consistently and predictably for their intent.

Tool Count5/5

Nine tools is well within the ideal 3-15 range and each one maps to a distinct capability (search, browse, fetch, comments, quality, stores, coupons, taxonomy, liveness). No filler or redundant tools.

Completeness4/5

The read-only deal-consumption surface is thorough: discovery (search/browse), retrieval (deal/comments), trust assessment, stores, coupons, and taxonomy are all covered. Minor gaps exist—no direct store-deals listing (only a documented workaround) and no pagination for comments beyond local truncation—but agents can work around these.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

Appeared in Searches