Install pyatlan via pip install pyatlan; instantiate an AtlanClient using your Atlan workspace URL and a personal access token (PAT) obtained from the Atlan Profile > API Tokens page
Build a search query using FluentSearch with conditions such as .where(Asset.TYPE_NAME.eq('Table')) and .where(Asset.STATUS.eq(EntityStatus.ACTIVE)); chain .page_size(100) for efficient batch retrieval and call .execute() to get an AssetStream
Iterate over the result stream and for each asset build an update payload: call the asset type class (e.g., Table.updater(qualified_name=..., name=...)) then set attributes like .user_description or custom metadata via .set_custom_metadata(attr_id='...', value='...')
Accumulate updates in a Batch object (client.asset.save(assets)) using the MERGE strategy to preserve existing custom metadata fields not included in your update payload; submit the batch when it reaches your chosen threshold (e.g., 100 assets)
Confirm the updates by re-fetching a sample of assets and inspecting the modified fields, or check the Atlan audit log for the updated asset's qualified name to verify the change timestamp
Known gotchas
Atlan's REST API requires deep knowledge of internal payload structures; the SDK encodes these correctly, so use the pyatlan SDK rather than raw HTTP calls unless you have a specific unsupported operation
Custom metadata attribute IDs are internal UUIDs, not human-readable names; look up attribute IDs via client.custom_metadata_cache.get_attr_id_for_name() before setting custom metadata values programmatically
Batch.save with the OVERWRITE strategy replaces all custom metadata on each asset including fields you did not intend to modify; use MERGE for partial updates and IGNORE to skip custom metadata entirely when only updating core asset attributes
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp