Operator question, 2026-09-22: can content be CRUDed over a real URL, REST and bulk, and what is best for an agent. Measured answer: an agent today can CREATE one row (Tool.PublishToList over /mcp/jsonrpc) and ADVANCE it (Tool.AdvanceListItem). There is no read, no update, no delete and no bulk. To read a list an agent must fetch the HTML page and scrape it, which happened three times in this very session. THE SHAPE TO BORROW is SharePoint's own and needs no teaching: GET /sites/S/_api/web/lists/getbytitle('Tasks')/items with dollar-select, dollar-filter, dollar-top and dollar-orderby, POST to create, PATCH and DELETE on items(id), POST to GetItems with a CAML View Query. Note the CAML engine is ALREADY BUILT AND TESTED and nothing uses it - SPF.2 records exactly that. FOR BULK the best primitive already exists and merely has no HTTP door: ProvisioningDelta through IProvisioningApplier is declarative, validated and IDEMPOTENT PER KEY, which beats SharePoint's dollar-batch for an agent because a re-send after a timeout is safe rather than duplicating. That property matters most precisely when a call times out and the caller cannot tell whether it landed. Build one list-data service and expose it twice - as the _api routes and as the MCP tools - so both doors share an implementation rather than drifting apart.