Register a Dynamics 365 Dataverse custom API (not a plugin step) to expose a reusable business operation as a bound or unbound OData action callable from Power Automate and external clients
In the Power Apps maker portal or via the Dataverse API, create a Custom API record specifying the unique name, binding type (entity-bound or global), allowed custom processing step types, and whether it is a function or action
Define Custom API Request Parameter records for each input parameter, specifying name, type (String, Integer, EntityReference, etc.), and whether it is optional
Define Custom API Response Property records for each output field the API should return
Register a plugin assembly and plugin type as the main operation plugin step for the Custom API, implementing IPlugin and reading parameters from the ExecutionContext.InputParameters collection
Call the Custom API from an external client via POST /api/data/vX.X/{CustomAPIUniqueName} (unbound) or POST /api/data/vX.X/{entitysetname}({id})/Microsoft.Dynamics.CRM.{CustomAPIUniqueName} (bound) with a JSON body containing the request parameters
Known gotchas
Custom APIs marked as 'function' must be idempotent and are called via GET with parameters as query string; 'action' types use POST — choosing the wrong type causes the Dataverse router to reject the request
Plugin steps for Custom APIs run synchronously in the main operation stage only; there is no pre/post-operation stage concept as with standard plugin steps on entity messages
The plugin must explicitly populate OutputParameters on the execution context; if the response properties are not set, the API returns an empty response body without error
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