Python client
Call the client directly from any Python tool — for servers and agents that do not use FastMCP middleware.
Install
pip install lulu-adsIntegrate
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 resultThe 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.