Skip to main content
Glama

Moxlade — Upwork buyer intelligence

Whether the client actually pays

get_buyer_quality
Read-onlyIdempotent

Whether the client behind a posting actually pays, and how much of that we can honestly claim to know. Call it before spending connects.

upwork_id is the posting's id. ask is your intended HOURLY rate; give it and you also get how many of their past hourly contracts cleared it. It does not affect the fixed-price model, whose threshold is fixed.

READ coverage FIRST: how many of their contracts the answer used, beside their own public counters. A small sample of a big history is a sample, not a summary — when coverage.thin is true, say so when you relay it.

models is keyed by contract type, 'fixed' and 'hourly'; primary names the one this posting's engagement type selects. Each entry answers the single yes/no question written out in its own asks sentence, at its threshold: p is the probability, prior the population base rate for that same question, and lift is p / prior — 1.0 is average, BELOW 1 means knowing about this client is worse news than knowing nothing. p is NULL, never 0, when known is false: "never paid that" and "no record" are different.

tier = WHICH EVIDENCE it rests on: 'own-history' their own past contracts, 'cohort' what the freelancers they hired charge, 'both', 'none'. cohort.anchor = WHOSE RATE the cohort median is: 'paid' what this client actually paid them, 'listed' those freelancers' own asking rates (only when we hold no paid rate for any hire), 'none'. How p is computed stays private; what these fields mean does not. The answer repeats the value sets in legend; describe_fields("get_buyer_quality") documents every field here.

Feed-scoped: answers for postings this corpus has shown you — your own search results and saved-search matches. Any other id is refused, with how to bring it into reach.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
askNoyour intended hourly rate in USD. Must not be negative.
upwork_idYesa posting id as search_jobs returns it. Not a URL, and without the leading '~'.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
noteNoPresent when no buyer is linked.
foundNoFalse when the corpus holds no such posting.
tasteNoWhat this buyer tends to hire — see Taste. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened.
legendNoWhat the closed-value fields mean, carried WITH the answer: the four verdict values and their cut points, the four tier values, and the anchor values. Here because a tool description is truncated by some clients and outputSchema is a validation contract the spec does not ask clients to show a model — the response is the only channel with neither limit.
modelsNoOne entry per contract type, keyed 'fixed' and 'hourly', each answering one question about their next contract. The estimation method stays withheld; the vocabulary is documented — see ModelAnswer. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened.
recordNoTheir contract history as the corpus holds it — see Record. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened.
primaryNoThe headline judgement, naming which contract type it is about — the same vocabulary as ModelAnswer.model. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened.
coverageNoThe denominator behind everything above. A verdict without it is a claim you cannot check.
upwork_idNoThe posting.
ask_vs_recordNoGiven your `ask`, how many of their past hourly contracts cleared it — see AskVsRecord. The most useful line before quoting. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened. Present with `known: false` when you passed no `ask` — that object is the answer "you did not ask", not missing data.
identity_knownNoA company NAME resolved — exactly what get_buyer.company being non-null means. The two tools cannot disagree.
rate_by_categoryNoWhat their past contracts cleared, by category — see RateByCategory. Absent — not null — when `found` is false, or when `buyer_record_known` is false; `note` says which of the two happened.
buyer_record_knownNoA buyer is linked to this posting, so a contract history is computable. Does NOT mean we know who they are.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnly/idempotent annotations: it explains that p is NULL rather than 0 when unknown, that coverage.thin changes how results should be relayed, that tier/cohort.anchor indicate the evidence basis, and that computation of p is intentionally private. This gives the agent honest expectations about the answer's reliability and limits.

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 densely informative, and each sentence carries a distinct piece of semantics. It is front-loaded with the core purpose and usage trigger, then systematically walks through output fields, edge cases, and scope constraints. The structure uses code-formatted labels and clear paragraphs, making a complex model navigable.

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 complexity of the response — probability, prior, lift, coverage, tiers, cohort anchors, NULL semantics, and feed scoping — the description covers every important behavior an agent would need to invoke it correctly and interpret results. It also points to describe_fields for further documentation, making it effectively complete for this tool's risk profile.

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?

Even though the schema already describes both parameters at 100% coverage, the description adds crucial behavioral meaning: upwork_id must be the posting id as returned by search_jobs, and ask affects only the hourly model's threshold while the fixed-price threshold is fixed. These semantics would be hard to infer correctly from the schema alone.

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 what the tool reveals — whether the client behind a posting actually pays and how much of that can honestly be known — and frames it as a pre-connect check. This is far more specific than the tool name or title alone and gives an agent a clear decision-relevant mental model.

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 a clear trigger ('Call it before spending connects') and a strong exclusion ('Feed-scoped... Any other id is refused'), which tells the agent when this tool works and when it will not. It does not explicitly name an alternative tool to use in those other cases, 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.6/5.0
Disambiguation5/5

Each tool maps to a distinct resource or action: search, filter validation, saved-search management, buyer lookup, buyer quality, job scoring, market rates, and account/plan introspection. The get_* tools are cleanly separated by complements such as get_job vs get_job_score and get_buyer vs get_buyer_quality, so an agent should not struggle to pick the right one.

Naming Consistency5/5

All tool names consistently use snake_case verb_noun or verb_adjective_noun patterns, such as search_jobs, check_prefilter, delete_saved_search, and get_buyer_quality. There are no camelCase names, vague verb-only names, or mixed conventions.

Tool Count5/5

At 15 tools, the server sits exactly within the ideal range and each tool earns its place in the workflow. The set covers discovery, enrichment, saved-search lifecycle, and account introspection without obvious redundancy.

Completeness4/5

The core workflow is well covered: search, prefilter validation, job detail, scoring, buyer identity, payment quality, saved-search create/list/delete, and plan/activity visibility. The main gap is the lack of an update operation for an existing saved search, such as changing its filter or attaching a webhook later; this is a minor workaround rather than a blocking dead end.

Resources