Serveur MCP

Syftly

io.github.Lodewijkheemskerk/syftly
Outils développeur Recherche et exploration Public et accessible MCP 2026-07-28

Ce que fait ce MCP

Ranks AI tools and APIs for tasks such as transcription, TTS, web search, scraping, OCR, and document extraction.

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.
Schéma d’entrée
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': "The question in natural language, e.g. 'best transcription API for Dutch'."}, 'category': {'enum': ['transcription', 'tts', 'web-search', 'scraping', 'ocr'], 'type': 'string', 'description': 'Optional category id to disambiguate the question; omit to let Syftly detect it.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', 'required': ['query', 'slug', 'category', 'routing', 'summary', 'confidence', 'updated', 'recommendation', 'providers', 'sources'], 'properties': {'slug': {'type': 'string'}, 'query': {'type': 'string', 'description': 'The human question (page H1).'}, 'routing': {'enum': ['matched', 'none', 'ambiguous'], 'type': 'string', '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."}, 'sources': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'url', 'date'], 'properties': {'url': {'type': 'string', 'format': 'uri'}, 'date': {'type': 'string', 'description': 'ISO date.'}, 'title': {'type': 'string'}}}}, 'summary': {'type': 'string', 'description': 'Citeable summary, 40-80 words, reused verbatim across all views. On a no-match, the plain-language message.'}, 'updated': {'type': 'string', 'description': 'ISO date.'}, 'category': {'type': 'string', 'description': "e.g. 'transcription'; '' on a no-match."}, 'providers': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'provider', 'price', 'metrics', 'strengths', 'weaknesses', 'source', 'source_date'], 'properties': {'name': {'type': 'string', 'description': "The callable offering, e.g. 'Deepgram Nova-3'."}, 'price': {'type': 'object', 'required': ['value', 'unit'], 'properties': {'unit': {'type': 'string', 'description': "e.g. '$/min', '$/1000min'."}, 'value': {'type': ['number', 'null']}, 'comparable': {'type': 'boolean', 'description': 'false = token-/credit-priced, not directly comparable (excluded from the price axis).'}}}, 'source': {'type': 'string', 'description': "Where this row's facts come from."}, 'metrics': {'type': 'object', 'description': "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.", 'additionalProperties': {'type': ['number', 'boolean', 'string', 'null']}}, 'provider': {'type': 'string', 'description': "The company behind it, e.g. 'Deepgram'."}, 'strengths': {'type': 'string'}, 'weaknesses': {'type': 'string'}, 'source_date': {'type': 'string', 'description': 'ISO date of the source.'}, 'model_family': {'type': 'string', 'description': 'Filter attribute, not a row of its own.'}}}}, 'categories': {'type': 'array', 'items': {'type': 'object', 'required': ['category', 'label'], 'properties': {'label': {'type': 'string', 'description': "Human label, e.g. 'Web search'."}, 'category': {'type': 'string', 'description': "Supported category id, e.g. 'web-search'."}}}, 'description': "Present only when routing !== 'matched': the supported categories so the caller can re-ask in scope."}, 'confidence': {'enum': ['light estimate', 'hard tested'], 'type': 'string', 'description': 'Confidence/depth label.'}, 'recommendation': {'type': 'object', 'required': ['default', 'axes'], 'properties': {'axes': {'type': 'object', 'description': 'Decision-axis -> recommended offering. Carries EVERY matched axis: filters + all ordering axes, each naming its own computed winner.', 'additionalProperties': {'type': 'string'}}, 'default': {'type': 'string', 'description': "Name of the recommended offering ('' on a no-match)."}, 'primary': {'type': 'string', '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.'}}}}, 'additionalProperties': False}
Ajouté
find_best_tool
17 September 2026 12:43