all-mdapi-sync-calls-must-wrap-asyncio-to-thread

All simple-salesforce mdapi.* calls (mdapi.deploy, mdapi.retrieve, mdapi.CustomObject.create, mdapi.read_metadata, etc.) are synchronous blocking operations. Calling them directly inside async MCP tool functions blocks the event loop. Every mdapi.* invocation must be wrapped in await asyncio.to_thread(conn.mdapi.method, *args, **kwargs). asyncio.to_thread supports kwargs natively.