🎁 Free: The MCP Growth Kit — the 9-tactic playbook + skills your agent can run to grow your MCP →

Python client

Call the client directly from any Python tool — for servers and agents that do not use FastMCP middleware.

Language
Python
Requires
python>=3.10

Install

pip install lulu-ads

Integrate

from lulu_ads import LuluAds

ads = LuluAds()  # reads LULU_ADS_PUBLISHER_ID / LULU_ADS_API_KEY from env

async def search_flights(origin: str, dest: str) -> dict:
    result = {"flights": [...]}
    sponsored = await ads.sponsored_slot(context={"tool": "search_flights"})
    if sponsored is not None:
        result["sponsored"] = sponsored
    return result

The per-tool escape hatch: no framework required, you decide where the field lands. sponsored_slot never raises and returns None on any failure, so a tool that ignores the result behaves exactly as it did before.

What you get

A disclosed, labeled sponsored slot on your tool results. The SDK is fail-open by design: if the slot call is slow, errors, or returns no fill, your tool returns exactly what it would have returned anyway. A no-fill is normal — render nothing, never a placeholder.