| Direct mode | Provider mode | |
|---|---|---|
| Who uses the agents | Your own team | Your customers' people |
| MCP users and roles | One list for the workspace | Separate for each customer (a tenant) |
| Company-wide credentials | One set per platform | One set per customer and platform |
| Platform visibility | One setting per platform | Your default, which each customer can override |
| How users are added | Invited from the dashboard | Created by your product through the Management API, or from the dashboard |
https://api.makini.io/mgmt. Request a token with your application's Client ID and Client Secret, using the client_credentials grant:mcp:provider:manage scope, which covers every route on this page. Tokens last an hour, and a client_credentials response includes no refresh token, so request a new one when it expires. See Access tokens.externalId is your own ID for the customer, such as your account ID, and it must be unique within your application. name is optional.{
"providerTenant": {
"id": "7f0c1d7e-4b1a-4f3e-9f55-2a8f1c0d9b12",
"clientId": "<your Client ID>",
"externalId": "acct_4821",
"name": "Northwind Utilities",
"userCount": 0,
"createdAt": "2026-09-25T10:00:00Z",
"updatedAt": "2026-09-25T10:00:00Z"
}
}{"mcpUser": {…}} with the user's id, roleId and roleName. Leave out roleId to give the user the tenant's default role.{
"id": "5d1f0c1e-…",
"token": "eyJhbGciOi...",
"tokenEndpoint": "https://…/token",
"agentClientId": "…",
"resource": "https://mcp.makini.io/<clientId>"
}verify_platform_authentication for a platform the user hasn't connected, it gets a Makini Link URL. Show that URL to the user. They open it, sign in to their system once, and the agent carries on.token is a long-lived OAuth refresh token for one MCP user. Makini returns it once and doesn't store it, so keep it in your secret store.refresh_token grant at the tokenEndpoint, using the agentClientId from the same response. No client secret is needed:access_token as a Bearer token to your MCP server, https://mcp.makini.io/<clientId>, from any MCP client library. Redeem again whenever the access token expires. The refresh token itself doesn't change.id is what you list and revoke it by.{"state": "connected", "connectionId": "…"} when the customer's company-wide credentials cover everything the platform asks for. Otherwise it answers {"state": "absent", "linkAuthorizeUrl": "https://…"}: open that Makini Link URL for whoever holds the credentials the agent should use.list_platforms, and it is never given a Makini Link URL.https://api.makini.io/mgmt.| Method and path | What it does |
|---|---|
GET /mcp/tenants | List your customers, each with its user count. |
POST /mcp/tenants | Create a customer. |
GET /mcp/tenants/{tenantId} | Read one customer, with its user, connection and visible-platform counts. |
PUT /mcp/tenants/{tenantId} | Rename a customer, or change its externalId. |
DELETE /mcp/tenants/{tenantId} | Remove a customer. Delete its MCP users first. |
GET /mcp/tenants/{tenantId}/users | List a customer's MCP users. |
POST /mcp/tenants/{tenantId}/users | Add an MCP user, or an agent with "kind": "agent". |
GET /mcp/tenants/{tenantId}/users/{mcpUserId} | Read one MCP user. |
PUT /mcp/tenants/{tenantId}/users/{mcpUserId} | Change email, name or roleId, or set disabled. |
DELETE /mcp/tenants/{tenantId}/users/{mcpUserId} | Offboard an MCP user. |
POST /mcp/tenants/{tenantId}/users/{mcpUserId}/tokens | Issue a personal access token. |
GET /mcp/tenants/{tenantId}/users/{mcpUserId}/tokens | List a user's tokens, each with when it was created and last used. |
DELETE /mcp/tenants/{tenantId}/users/{mcpUserId}/tokens/{tokenId} | End one token. The user's other tokens keep working. |
POST /mcp/tenants/{tenantId}/users/{mcpUserId}/platforms/{key}/connect | Connect a platform for an agent. |
GET /mcp/tenants/{tenantId}/connections | List a customer's connections. |
GET /mcp/tenants/{tenantId}/roles | List a customer's roles, each with its user count. |
POST /mcp/tenants/{tenantId}/roles | Create a role (name, and optionally description and isDefault). |
GET /mcp/tenants/{tenantId}/roles/{roleId} | Read one role. |
PUT /mcp/tenants/{tenantId}/roles/{roleId} | Rename a role, or make it the default for new users. |
DELETE /mcp/tenants/{tenantId}/roles/{roleId} | Delete a role. Pass ?reassignToRoleId= to move its users in the same step. |
POST /mcp/tenants/{tenantId}/roles/{roleId}/tools/_lookup | Read a role's tool permissions on a platform, a page at a time. |
PUT /mcp/tenants/{tenantId}/roles/{roleId}/tools | Enable or disable individual tools for a role. |
PUT /mcp/tenants/{tenantId}/roles/{roleId}/tools/_default | Enable or disable every tool on a platform for a role. |
GET /mcp/tenants/{tenantId}/platforms | Read the platforms a customer inherits from your defaults, and its own overrides. |
PUT /mcp/tenants/{tenantId}/platforms/{key} | Show or hide one platform for a customer. |
GET /mcp/tenants/{tenantId}/platform-credentials | List the platforms that have company-wide credentials for a customer. |
GET /mcp/tenants/{tenantId}/platforms/{key}/credentials | Read which company-wide fields a platform takes, and whether they are set. |
PUT /mcp/tenants/{tenantId}/platforms/{key}/credentials | Set a customer's company-wide credentials for a platform. |
DELETE /mcp/tenants/{tenantId}/platforms/{key}/credentials | Stop supplying them. |
tools, name the tools you are deciding on (up to 200 per call). In disabled, list the ones among them that should be off:"defaultEnabled": null returns the role to inheriting. _lookup reports each tool's own setting and its effective state once your application ceiling applies. Take tool names from _lookup or from the agent's search_platform_tools.true or false overrides your default for this customer, and the override stays in place if you later change the default. null removes the override.GET …/platforms/{key}/credentials returns the fields the platform takes company-wide and the number of the customer's connections that use it. Send values for those fields:{code, message}. The ones you'll handle most:| Status | When |
|---|---|
404 | The tenant, user or role doesn't exist or isn't one of yours. |
409 | The application is in direct mode; the externalId or email address is already in use; a tenant still has users; a role still has users and no reassignToRoleId; the MCP user is disabled, or already has ten tokens, when you issue a token; you call connect for a person. |
502 | A service behind the request didn't answer. Retry. |