Cargando

Sampling permite que un servidor acceda a un modelo de lenguaje como Claude a través de un cliente MCP conectado. En lugar de que el servidor llame directamente a Claude, le pide al cliente que haga la llamada en su nombre. Esto traslada la responsabilidad y el costo de la generación de texto del servidor al cliente.

El problema que resuelve Sampling

Imagina que tienes un servidor MCP con una herramienta de investigación que obtiene información de Wikipedia. Después de reunir todos esos datos, necesitas resumirlos en un informe coherente. Tienes dos opciones:

Diagrama de secuencia de la Opción 1: al servidor MCP se le da acceso directo a Claude, de modo que después de que la herramienta de investigación obtiene los resultados de Wikipedia, el propio servidor le pide a Claude que los resuma

Opción 1: Dale al servidor MCP acceso directo a Claude. El servidor necesitaría su propia clave de API, manejar la autenticación, gestionar los costos e implementar todo el código de integración con Claude. Esto funciona, pero añade una complejidad significativa.

Diagrama de secuencia de la Opción 2: el servidor MCP genera un prompt y le pregunta al cliente MCP "¿Podrías llamar a Claude por mí?", el cliente llama a Claude en nombre del servidor y devuelve los resultados de la llamada

Opción 2: Usa sampling. El servidor genera un prompt y le pregunta al cliente "¿Podrías llamar a Claude por mí?". El cliente, que ya tiene una conexión con Claude, hace la llamada y devuelve los resultados.

Cómo funciona Sampling

El flujo es sencillo:

  • El servidor completa su trabajo (como obtener artículos de Wikipedia)
  • El servidor crea un prompt solicitando la generación de texto
  • El servidor envía una solicitud de sampling al cliente
  • El cliente llama a Claude con el prompt proporcionado
  • El cliente devuelve el texto generado al servidor
  • El servidor usa el texto generado en su respuesta

Beneficios de Sampling

  • Reduce la complejidad del servidor: El servidor no necesita integrarse directamente con modelos de lenguaje
  • Traslada la carga de costos: El cliente paga por el uso de tokens, no el servidor
  • No se necesitan claves de API: El servidor no necesita credenciales para Claude
  • Perfecto para servidores públicos: No quieres que un servidor público acumule costos de IA por cada usuario

Implementación

Configurar sampling requiere código en ambos lados:

Lado del servidor

En tu función de herramienta, usa la función create_message para solicitar la generación de texto:

python
@mcp.tool()
async def summarize(text_to_summarize: str, ctx: Context):
    prompt = f"""
    Please summarize the following text:
    {text_to_summarize}
    """

    result = await ctx.session.create_message(
        messages=[
            SamplingMessage(
                role="user",
                content=TextContent(
                    type="text",
                    text=prompt
                )
            )
        ],
        max_tokens=4000,
        system_prompt="You are a helpful research assistant",
    )

    if result.content.type == "text":
        return result.content.text
    else:
        raise ValueError("Sampling failed")

Lado del cliente

Crea un callback de sampling que maneje las solicitudes del servidor:

python
async def sampling_callback(
    context: RequestContext, params: CreateMessageRequestParams
):
    # Llama a Claude usando el SDK de Anthropic
    text = await chat(params.messages)

    return CreateMessageResult(
        role="assistant",
        model=model,
        content=TextContent(type="text", text=text),
    )

Luego pasa este callback al inicializar tu sesión de cliente:

python
async with ClientSession(
    read,
    write,
    sampling_callback=sampling_callback
) as session:
    await session.initialize()

Cuándo usar Sampling

Sampling es más valioso cuando se construyen servidores MCP de acceso público. No quieres que usuarios aleatorios generen texto ilimitado a tu costa. Al usar sampling, cada cliente paga por su propio uso de IA mientras sigue beneficiándose de la funcionalidad de tu servidor.

Esta técnica básicamente traslada la complejidad de la integración de IA de tu servidor al cliente, que a menudo ya cuenta con las conexiones y credenciales necesarias.