
List every workspace in the tenant, including ones the account is not a member of. Requires the Fabric Administrator role, not just the connected credential. Use list_workspaces for only the account's own workspaces.
List every report in the tenant, across all workspaces. Requires the Fabric Administrator role, not just the connected credential. Use list_reports for the reports in one workspace.
List every semantic model in the tenant, across all workspaces. Requires the Fabric Administrator role, not just the connected credential. Use list_datasets for the models in one workspace.
List every dashboard in the tenant, across all workspaces. Requires the Fabric Administrator role, not just the connected credential. Use list_dashboards for the dashboards in one workspace.
List every dataflow in the tenant, across all workspaces. Requires the Fabric Administrator role, not just the connected credential. This is the only tenant-wide view of dataflows; the user surface has no such endpoint.
List the Power BI apps the connected account can open. Apps are published, read-only collections of reports and dashboards. Returns every app in one response; the API does not page this endpoint.
Get one Power BI app by ID. Use listapps to find appid.
List the reports published inside a Power BI app. These are separate from the reports in a workspace; use listreports for those. Use listapps to find app_id.
List the dashboards published inside a Power BI app. These are separate from the dashboards in a workspace; use listdashboards for those. Use listapps to find app_id.
List the dashboards in a Power BI workspace. Returns every dashboard in one response; the API does not page this endpoint. Use listworkspaces to find workspaceid.
Get one dashboard by ID. Use listdashboards to find dashboardid.
Create an empty dashboard in a Power BI workspace. Tiles are pinned from reports in the Power BI UI; the API cannot add them. Note the REST API has no dashboard delete, so one created here can only be removed in Power BI itself.
List the tiles pinned to a dashboard, including the report and semantic model behind each one. Use listdashboards to find dashboardid.
List the Power BI (Gen1) dataflows in a workspace. Fabric Dataflow Gen2 is a different item type served by a different API and is not returned here. Dataflows exist only inside a workspace, so use listadmindataflows for a tenant-wide view.
Get a Power BI (Gen1) dataflow's stored definition, containing its entities and Power Query expressions. Returns the model document rather than a summary row; use list_dataflows for names and owners.
List the semantic models (datasets) in a Power BI workspace. Returns every model in one response; the API does not page this endpoint. Check addrowsapi_enabled to find models that accept pushed rows.
Get one semantic model by ID. Use listdatasets to find datasetid.
Delete a semantic model and every report built on it. This cannot be undone. Use listdatasets to find datasetid.
Start a refresh of a semantic model. Returns as soon as the refresh is queued, not when it finishes; poll getrefreshhistory to watch it. Only models with is_refreshable true can be refreshed.
List past and in-progress refreshes of a semantic model, newest first. A status of 'Unknown' means the refresh is still running. Unlike the list endpoints, this one does honour the 'top' limit.
List the data sources a semantic model reads from, including the gateway serving each one. Use listdatasets to find datasetid.
List the on-premises data gateways the connected account can administer. A gateway connects Power BI to data sources behind a firewall. Returns every gateway in one response; the API does not page this endpoint.
Get one on-premises data gateway by ID. Use listgateways to find gatewayid.
List the data sources bound to an on-premises data gateway. Use this to see what a gateway serves before changing anything that depends on it. Use listgateways to find gatewayid.
List the .pbix and Excel imports performed into a Power BI workspace, with the state of each. Importing a file is how reports get into a workspace; the API cannot build a report from nothing.
Get one import by ID to check its progress. importstate reads 'Publishing' while it runs and 'Succeeded' when the reports and semantic models it created become available. Use listimports to find import_id.
Create a push semantic model from a table schema, with no .pbix file. This is the only way to create a semantic model through the API alone. The schema is fixed once created, so changing it means creating a new model. Follow with push_rows to add data.
Append rows to a table in a push semantic model. Row keys must match the column names the model was created with. Only models with addrowsapienabled true accept rows; an imported model rejects them. Use truncatetable to clear the table first.
Delete every row from a table in a push semantic model, leaving the table and its schema in place. This cannot be undone. Use listdatasettables to find table_name.
List the table names in a push semantic model. The API returns names only, not the columns each table was created with, so the column names for push_rows must come from whoever defined the model.
List the reports in a Power BI workspace. Returns every report in one response; the API does not page this endpoint. Use listworkspaces to find workspaceid.
Get one report by ID, including the semantic model it reads from. Use listreports to find reportid.
Delete a report from a Power BI workspace. This does not delete the semantic model behind it. Use listreports to find reportid.
Copy a report, optionally into another workspace or onto another semantic model. This is the only way to create a report through the API; a report cannot be built from nothing. Use listreports to find reportid.
Validate Power BI credentials by reading the tenant's available features. Returns success and a message explaining any problem, including an account with no Power BI licence.
List the Power BI workspaces the connected account can open. Supports an OData filterquery to narrow results server-side. Returns every match in one response; this endpoint does not page. Use listadmin_workspaces for workspaces across the whole tenant.
Get one Power BI workspace by ID. Use listworkspaces to find workspaceid.
Create a Power BI workspace. The name must be unique in the tenant. Returns the new workspace including its ID, which the workspace-scoped tools take.
Delete a Power BI workspace and everything inside it. This cannot be undone. Use listworkspaces to find workspaceid.
List the users, groups and service principals with access to a Power BI workspace, and the access level each holds. Use listworkspaces to find workspaceid.
Grant a user, group or service principal access to a Power BI workspace. Pass emailaddress for a person, or identifier with principaltype 'App' or 'Group'. Use removeworkspaceuser to revoke it.
Revoke a principal's access to a Power BI workspace. Use listworkspaceusers to find the exact email address or object ID to pass.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now