Skip to main content
Glama

find_best_tool

Given a natural-language question about which AI tool or API is best for a task (currently transcription, text-to-speech, web search, scraping & browser and ocr & document extraction), return Syftly's ranked recommendation: a citeable summary, a provider table with prices and trade-offs, dated sources, and a confidence label. Ask in plain English about price, accuracy, language or capability trade-offs — e.g. 'best OCR API for scanned PDFs' or 'best web scraping API for JavaScript-heavy sites'. Optionally pass "category" to disambiguate; otherwise it is detected from the question.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesThe question in natural language, e.g. 'best transcription API for Dutch'.
categoryNoOptional category id to disambiguate the question; omit to let Syftly detect it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugYes
queryYesThe human question (page H1).
routingYesHonest routing outcome: 'matched' = answered from a real category; 'none' = no category matched (out-of-scope/gibberish) — an honest no-match, not a fabricated answer; 'ambiguous' = fit 2+ categories. 'none'/'ambiguous' carry `categories` and no real recommendation/providers.
sourcesYes
summaryYesCiteable summary, 40-80 words, reused verbatim across all views. On a no-match, the plain-language message.
updatedYesISO date.
categoryYese.g. 'transcription'; '' on a no-match.
providersYes
categoriesNoPresent only when routing !== 'matched': the supported categories so the caller can re-ask in scope.
confidenceYesConfidence/depth label.
recommendationYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed31 schema fields changed
    • removedOutput schema / properties / bronnen
      Removed value: -{
      -  "items": {
      -    "properties": {
      -      "datum": {
      -        "description": "ISO date.",
      -        "type": "string"
      -      },
      -      "titel": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "format": "uri",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "titel",
      -      "url",
      -      "datum"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • addedOutput schema / properties / categories
      Added value: +{
      +  "description": "Present only when routing !== 'matched': the supported categories so the caller can re-ask in scope.",
      +  "items": {
      +    "properties": {
      +      "category": {
      +        "description": "Supported category id, e.g. 'web-search'.",
      +        "type": "string"
      +      },
      +      "label": {
      +        "description": "Human label, e.g. 'Web search'.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "category",
      +      "label"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / category / description
      Previous value: -"e.g. 'transcription'."New value: +"e.g. 'transcription'; '' on a no-match."
    • addedOutput schema / properties / confidence
      Added value: +{
      +  "description": "Confidence/depth label.",
      +  "enum": [
      +    "light estimate",
      +    "hard tested"
      +  ],
      +  "type": "string"
      +}
    • removedOutput schema / properties / hap
      Removed value: -{
      -  "description": "Citeerbare kern, 40-80 words, reused verbatim across all views (ADR 0002).",
      -  "type": "string"
      -}
    • removedOutput schema / properties / laatst_bijgewerkt
      Removed value: -{
      -  "description": "ISO date.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / providers / items / properties / bron
      Removed value: -{
      -  "description": "Herkomst of this row's facts (ADR 0007/0008).",
      -  "type": "string"
      -}
    • removedOutput schema / properties / providers / items / properties / bron_datum
      Removed value: -{
      -  "description": "ISO date of the source.",
      -  "type": "string"
      -}
    • changedOutput schema / properties / providers / items / properties / metrics / description
      Previous value: -"Open category-specific decision-axis fields (ADR 0010). Values are number, boolean, string or null (null = an honest gap, no Tier-1 source). Number metrics back min/max axes; boolean metrics back filter axes."New value: +"Open category-specific decision-axis fields. Keys are stable data identifiers (e.g. 'wer', 'latency_ms'); values are number, boolean, string or null (null = an honest gap). Number metrics back min/max axes; boolean metrics back filter axes."
    • removedOutput schema / properties / providers / items / properties / modelFamilie
      Removed value: -{
      -  "description": "Filter-as, not a row of its own (ADR 0006).",
      -  "type": "string"
      -}
    • addedOutput schema / properties / providers / items / properties / model_family
      Added value: +{
      +  "description": "Filter attribute, not a row of its own.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / providers / items / properties / naam
      Removed value: -{
      -  "description": "The callable offering, e.g. 'Deepgram Nova-3'.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / providers / items / properties / name
      Added value: +{
      +  "description": "The callable offering, e.g. 'Deepgram Nova-3'.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / providers / items / properties / price
      Added value: +{
      +  "properties": {
      +    "comparable": {
      +      "description": "false = token-/credit-priced, not directly comparable (excluded from the price axis).",
      +      "type": "boolean"
      +    },
      +    "unit": {
      +      "description": "e.g. '$/min', '$/1000min'.",
      +      "type": "string"
      +    },
      +    "value": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "value",
      +    "unit"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / providers / items / properties / prijs
      Removed value: -{
      -  "properties": {
      -    "eenheid": {
      -      "description": "e.g. '$/min', '$/1000min'.",
      -      "type": "string"
      -    },
      -    "vergelijkbaar": {
      -      "description": "false = token-/credit-priced, not directly comparable (ADR 0009).",
      -      "type": "boolean"
      -    },
      -    "waarde": {
      -      "type": [
      -        "number",
      -        "null"
      -      ]
      -    }
      -  },
      -  "required": [
      -    "waarde",
      -    "eenheid"
      -  ],
      -  "type": "object"
      -}
    • addedOutput schema / properties / providers / items / properties / source
      Added value: +{
      +  "description": "Where this row's facts come from.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / providers / items / properties / source_date
      Added value: +{
      +  "description": "ISO date of the source.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / providers / items / properties / sterk
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / providers / items / properties / strengths
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / providers / items / properties / weaknesses
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / providers / items / properties / zwak
      Removed value: -{
      -  "type": "string"
      -}
    • changedOutput schema / properties / providers / items / required
      Previous value: -[
      -  "naam",
      -  "provider",
      -  "prijs",
      -  "metrics",
      -  "sterk",
      -  "zwak",
      -  "bron",
      -  "bron_datum"
      -]New value: +[
      +  "name",
      +  "provider",
      +  "price",
      +  "metrics",
      +  "strengths",
      +  "weaknesses",
      +  "source",
      +  "source_date"
      +]
    • changedOutput schema / properties / recommendation / properties / axes / description
      Previous value: -"Decision-as -> recommended aanbod."New value: +"Decision-axis -> recommended offering. Carries EVERY matched axis: filters + all ordering axes, each naming its own computed winner."
    • changedOutput schema / properties / recommendation / properties / default / description
      Previous value: -"Naam of the recommended Provider-aanbod."New value: +"Name of the recommended offering ('' on a no-match)."
    • addedOutput schema / properties / recommendation / properties / primary
      Added value: +{
      +  "description": "The axis key whose winner became `default` when 2+ ordering axes conflict with no composite tiebreak — the earliest-in-query axis. Absent for single-axis/composite-resolved answers.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / routing
      Added value: +{
      +  "description": "Honest routing outcome: 'matched' = answered from a real category; 'none' = no category matched (out-of-scope/gibberish) — an honest no-match, not a fabricated answer; 'ambiguous' = fit 2+ categories. 'none'/'ambiguous' carry `categories` and no real recommendation/providers.",
      +  "enum": [
      +    "matched",
      +    "none",
      +    "ambiguous"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / sources
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "date": {
      +        "description": "ISO date.",
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "format": "uri",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "title",
      +      "url",
      +      "date"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / summary
      Added value: +{
      +  "description": "Citeable summary, 40-80 words, reused verbatim across all views. On a no-match, the plain-language message.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / updated
      Added value: +{
      +  "description": "ISO date.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / zekerheidslabel
      Removed value: -{
      -  "description": "Confidence/depth label (ADR 0001).",
      -  "enum": [
      -    "light estimate",
      -    "hard tested"
      -  ],
      -  "type": "string"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "slug",
      -  "category",
      -  "hap",
      -  "zekerheidslabel",
      -  "laatst_bijgewerkt",
      -  "recommendation",
      -  "providers",
      -  "bronnen"
      -]New value: +[
      +  "query",
      +  "slug",
      +  "category",
      +  "routing",
      +  "summary",
      +  "confidence",
      +  "updated",
      +  "recommendation",
      +  "providers",
      +  "sources"
      +]
  2. First observed

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so well: it explains that the tool returns a ranked recommendation, citeable summary, provider table with prices/trade-offs, dated sources, and a confidence label. It also discloses that category detection is automatic unless the optional category parameter is passed. It stops short of describing edge-case behavior (e.g., unsupported categories or unknown questions), but the core runtime behavior is transparent.

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 a single compact paragraph with three purposeful sentences: what it does and returns, how to phrase queries with examples, and how the optional category parameter behaves. Every sentence earns its place, and the most important information is front-loaded.

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?

Given that an output schema exists, the description does not need to explain return values in detail, but it still names the key output components. It also covers the input style, supported categories, and category-detection behavior. It could add caveats about unsupported domains or failure modes, but overall it is sufficiently complete for a tool of this complexity.

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 input schema already covers both parameters with 100% coverage, giving the baseline of 3. The description adds meaningful context beyond the schema: it clarifies that the query should be in plain English and can mention price, accuracy, language, or capability trade-offs, and it explains the purpose of the optional category parameter as a disambiguator with automatic detection when omitted.

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 a specific purpose: given a natural-language question about choosing an AI tool/API, it returns a ranked recommendation with a cited summary, provider table, dated sources, and confidence label. It also enumerates the supported categories and gives concrete examples, making the tool's function unambiguous even without siblings.

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 tells the user when to use the tool ('Given a natural-language question about which AI tool or API is best...') and instructs them to ask in plain English about trade-offs like price, accuracy, language, or capability. It does not state when not to use it or mention alternatives, but with no sibling tools provided, this is a minor gap.

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.

Resources