score = sum over inputs of weight_i * x_i, where each x_i is in [0,1]. Max 100. Results are sorted by this final score (ties by relevance). Filters (constraints) remove results; they never change scores.
No pay-to-rank. No input is purchasable. Sponsorship, if it ever exists, will never touch scores or order.
relevance weight 45: 0.55 x lexical + 0.45 x semantic. Lexical: rarity-weighted share of the job's meaningful terms found in the entry, by field: name/title/publisher 1.0, capabilities/tool names 0.9, summary only 0.75 (0.5 for one-word queries); a synonym hit counts 0.8 (word-form variants such as registry/registers count 1.0). In queries of 3+ terms, up to one term in three may be treated as incidental when most terms match: it is dropped from the denominator at 0.85x per dropped term. Each term weighs ln(1 + N/(df+1)); generic words (api, mcp, server, tool, data, search, ...) weigh 0.2x; filler words (free, best, how, ...) are ignored. Semantic: cosine similarity between the job and the entry's description/capabilities embedding (Workers AI bge-small-en-v1.5, Vectorize), mapped from [0.50, 0.70] to [0,1]. Entries without an embedding get lexical x 0.85. Thin when: never.brand_match weight 10: 1 when the job names the publisher's own brand (e.g. 'stripe' for stripe.com) and the entry is vendor-official; 0.5 when it names the publisher but vendor status is unknown; 0 otherwise. Shared-hosting subdomains (*.vercel.app etc.) never brand-match. Thin when: never.official weight 6: 1 only when vendor-official: a first-party listing, a curated vendor entry, or a registry server whose verified publisher domain matches the server's own name. Publisher domain verification alone (publisher_verified) does not count: a verified third party wrapping another vendor's API is not official. Thin when: unknown.handshake weight 8: last MCP handshake by our checker: 1 = ok within 7 days; 0.7 = reachable but requires auth; 0.5 = ok within 30 days; 0 = failed or never checked. Bundles: only one server is probed (stated in evidence). Thin when: never checked.uptime weight 5: share of our checks in the last 30 days that reached the server when there are 3+ checks; 0.5 (neutral, 'insufficient data') with 1-2 checks; 0 with none. Thin when: fewer than 3 checks.outcomes weight 8: 0 until at least 2 independent reporters; then (weighted successes + 1) / (weighted reports + 2) x min(1, reporters/4). Report weight: anonymous 0.25, contributor 0.5, signed identity 0.5 + 0.5 x reputation; flagged, operator-disclosed and search-quality reports weigh 0. Thin when: fewer than 2 independent reporters.auth_friction weight 5: none = 1; api_key or oauth = 0.5; partner approval = 0; unknown = 0.3. Thin when: unknown.effects_declared weight 4: 1 when per-tool side effects are known (declared, probed or inferred from tool names), else 0. read_only is only claimed when every server in a bundle was verified. Thin when: unknown.freshness weight 5: source says updated within 90 days = 1; within 365 days = 0.5; older = 0. Thin when: no date.pricing_known weight 4: 1 when pricing is known with a source, else 0. Thin when: unknown.good_match: best relevance >= 0.62weak_matches: best relevance >= 0.45 and < 0.62nothing_good_found: best relevance < 0.45 or no results; we say so rather than padBest pick: the highest-ranked result (by final score) whose relevance >= 0.62; its rank is returned, and if it is not #1 the response says why. flagged when the result has never been handshake-checked and has fewer than 2 independent outcome reporters.
0 until at least 2 independent reporters; then (weighted successes + 1) / (weighted reports + 2) x min(1, reporters/4). Report weight: anonymous 0.25, contributor 0.5, signed identity 0.5 + 0.5 x reputation; flagged, operator-disclosed and search-quality reports weigh 0. reputation = (matched + 1) / (compared + 2), where a report is compared when a machine handshake of the same tool exists within 48 hours of it, and matched when they agree.
agent_type and stage are logged and used to attach playbook hints; they do not change scores.
Machine-readable: /v1/methodology. Every result returns its full score breakdown with evidence, source URL and date.