Evalúe la calidad de los datos de los servidores MCP ejecutando un conjunto estandarizado de consultas de prueba y calificando los resultados según su actualidad, cobertura y precisión objetiva. La mayoría de las comparaciones de servidores MCP se centran en la latencia y el tiempo de actividad, pero ignoran la calidad de los datos devueltos, lo que afecta directamente el resultado de LLM. Este tutorial crea un arnés de puntuación que prueba un servidor MCP de búsqueda frente a un conjunto seleccionado de consultas con respuestas correctas conocidas y luego genera un informe de calidad. Utilizamos el punto final MCP de Scavio como servidor bajo prueba.
Requisitos previos
- Python 3.8+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Un conjunto de consultas de prueba con resultados esperados conocidos
Guia paso a paso
Paso 1: Definir el conjunto de datos de evaluación
Cree una lista de consultas de prueba combinadas con atributos esperados, como el recuento mínimo de resultados y los dominios requeridos.
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
EVAL_SET = [
{'query': 'python 3.13 release date', 'expected_domain': 'python.org', 'min_results': 3},
{'query': 'react 19 new features', 'expected_domain': 'react.dev', 'min_results': 3},
{'query': 'nvidia h200 price', 'expected_domain': 'nvidia.com', 'min_results': 2},
{'query': 'fastapi latest version', 'expected_domain': 'fastapi.tiangolo.com', 'min_results': 3},
]Paso 2: Ejecutar consultas y recopilar resultados
Envíe cada consulta de evaluación a través de la API de Scavio y registre los resultados sin procesar para calificarlos.
def run_eval_query(test_case: dict) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': test_case['query']}, timeout=15)
resp.raise_for_status()
results = resp.json().get('organic_results', [])
return {
'query': test_case['query'],
'results': results,
'expected_domain': test_case['expected_domain'],
'min_results': test_case['min_results'],
}Paso 3: Califica cada respuesta
Puntuación en tres dimensiones: cobertura (el recuento de resultados cumple con el mínimo), autoridad (el dominio esperado aparece en los primeros resultados) y actualidad (los resultados contienen fechas del año actual).
def score_response(eval_result: dict) -> dict:
results = eval_result['results']
coverage = 1.0 if len(results) >= eval_result['min_results'] else len(results) / eval_result['min_results']
domain_found = any(eval_result['expected_domain'] in r.get('link', '') for r in results[:5])
authority = 1.0 if domain_found else 0.0
year_mentions = sum(1 for r in results[:5] if '2026' in r.get('snippet', '') or '2025' in r.get('snippet', ''))
freshness = min(year_mentions / 3, 1.0)
return {
'query': eval_result['query'],
'coverage': round(coverage, 2),
'authority': authority,
'freshness': round(freshness, 2),
'composite': round((coverage + authority + freshness) / 3, 2),
}Paso 4: Generar el informe de calidad
Ejecute la evaluación completa e imprima un informe resumido con puntuaciones por consulta y una puntuación de calidad agregada.
def run_evaluation():
scores = []
for test in EVAL_SET:
result = run_eval_query(test)
score = score_response(result)
scores.append(score)
print(f'{score["query"][:40]:<42} C={score["coverage"]} A={score["authority"]} F={score["freshness"]} => {score["composite"]}')
avg = round(sum(s['composite'] for s in scores) / len(scores), 2)
print(f'\nAggregate quality score: {avg}/1.00')
return scores
run_evaluation()Ejemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def eval_query(query, expected_domain):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': query}, timeout=15).json()
results = data.get('organic_results', [])
found = any(expected_domain in r.get('link', '') for r in results[:5])
return {'query': query, 'count': len(results), 'authority': found}
print(eval_query('python 3.13 release date', 'python.org'))Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function evalQuery(query, expectedDomain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query})
});
const results = (await r.json()).organic_results || [];
const found = results.slice(0, 5).some(r => r.link?.includes(expectedDomain));
return {query, count: results.length, authority: found};
}
evalQuery('python 3.13 release date', 'python.org').then(console.log);Salida esperada
A quality report scoring each MCP server test query on coverage, authority, and freshness, with an aggregate composite score out of 1.00.