@mcp_server.tool()
@meta_api_tool
async def list_account_pages(ad_account_id: str, meta_access_token: Optional[str] = None) -> str:
if not ad_account_id:
return _json({"error": "No account ID provided"})
if ad_account_id == "me":
try:
payload = await make_api_request("me/accounts", meta_access_token, {"fields": _PAGE_FIELDS, "page_size": 200})
if isinstance(payload, dict) and isinstance(payload.get("data"), list):
for page in payload["data"]:
if isinstance(page, dict):
page["source"] = "me/accounts"
page["confidence"] = "primary_documented"
return _json(payload)
except Exception as exc: # noqa: BLE001
return _json({"error": "Failed to get user pages", "details": str(exc)})
normalized_account_id = _normalize_ad_account_id(ad_account_id)
try:
discovery = await _collect_account_page_candidates(normalized_account_id, meta_access_token)
pages = discovery.get("pages", [])
if pages:
return _json(
{
"data": pages,
"total_pages_found": len(pages),
"source_counts": discovery.get("source_counts", {}),
"failed_sources": discovery.get("failures", []),
}
)
return _json(
{
"data": [],
"message": "No pages found associated with this account",
"source_counts": discovery.get("source_counts", {}),
"failed_sources": discovery.get("failures", []),
"suggestion": (
"Connect a Facebook page to this ad account or provide facebook_page_id manually. "
"Primary documented edges were checked before fallbacks."
),
}
)
except Exception as exc: # noqa: BLE001
return _json({"error": "Failed to get account pages", "details": str(exc)})