A side-by-side look at the Powerbi Analyst MCP and Rows.page MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Powerbi Analyst MCP for data visualization work as a local process; choose Rows.page for data visualization. You can also run both side by side in one mcpServers block.
POWERBI_ANALYST_MCP_CLIENT_ID, POWERBI_ANALYST_MCP_TENANT_ID.authenticate, logout, list_apps.push, pin_finding, get_dataset.Rows where the two servers differ are marked.
| Spec | R Rows.page | |
|---|---|---|
| Category | Data Visualization | Data Visualization |
| Quality signal | 53/100 · Good | 53/100 · Good |
| Install command | Confirmed | Not confirmed yet |
| Transport | Local subprocess (stdio) | — |
| Auth | OAuth 2.0 | No auth required |
| Pricing | Free | Freemium |
| Required env vars | POWERBI_ANALYST_MCP_CLIENT_IDPOWERBI_ANALYST_MCP_TENANT_ID | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 14 | 0 |
| Directory activity | 2 views 0 installs 0 upvotes | 0 views 0 installs 0 upvotes |
| Tools | 12 | 6 |
| Full listing | View Powerbi Analyst MCP | View Rows.page |
authenticateSign in via OAuth device code — returns a URL + one-time code; call again to completelogoutClear the cached token (forces re-authentication)list_appsList all Power BI apps you have access to — **start here**; returns `workspaceId` for each applist_datasetsList datasets / semantic models in a workspace (use `workspaceId` from `list_apps`)get_dataset_infoMetadata and last 5 refresh history entries for a datasetlist_tablesAll visible tables in a datasetlist_measuresMeasures with name, table, description, and format stringlist_columnsColumns with data type and key flagexecute_daxRun a DAX query — inline for small results, local CSV for large ones. Pass `query_summary` to log the query for future reference.read_query_resultPage through a large CSV result without loading it all into contextsearch_query_historySearch the local query log by keyword, dataset, or time range — find prior DAX and results across sessionsdelete_query_log_entryRemove a query log entry (e.g. when the approach turned out to be wrong)pushPublish rows as a rows.page dataset (or a new version of one) and get a shareable URL. Pass exactly one of csv, tsv, jsonl, json, rows or url. Up to 16 MB inline; use url for bigger files. Identical content returns unchanged: true without a new version. Re-pushes report rows_delta, columns_added/removed and a diff_url. Anonymous datasets expire after 7 days unless kept. Finding views use the rows.page query language in q: `word` or `"two words"` searches text columns; `field:value`, `field:"a b"`, `-field:value`, `field:*` (not null), `-field:*` (null), `field:foo*` (prefix); `field:>20`, `>=`, `<`, `<=`, `field:10..20`, ISO dates (`at:>2026-09-01`); dot paths for nested JSON (`payload.customer.country:NL`); `tags:urgent` means the list contains it; combine with `OR` and parentheses. A q starting with SELECT, WITH or FROM runs as SQL against the table `data`. sort is comma-separated columns, `-` for descending (`-price,name`); cols picks and orders visible columns (`a,b,c`).pin_findingPin a finding (a saved, titled view) to a dataset you own. Finding views use the rows.page query language in q: `word` or `"two words"` searches text columns; `field:value`, `field:"a b"`, `-field:value`, `field:*` (not null), `-field:*` (null), `field:foo*` (prefix); `field:>20`, `>=`, `<`, `<=`, `field:10..20`, ISO dates (`at:>2026-09-01`); dot paths for nested JSON (`payload.customer.country:NL`); `tags:urgent` means the list contains it; combine with `OR` and parentheses. A q starting with SELECT, WITH or FROM runs as SQL against the table `data`. sort is comma-separated columns, `-` for descending (`-price,name`); cols picks and orders visible columns (`a,b,c`).get_datasetRead a dataset: meta, recent versions, findings, columns and the first 20 preview rows.list_datasetsList the datasets kept on your account, newest first. Needs an API key.delete_datasetDelete a dataset you own. Its URL stops working immediately.get_limitsShow your plan, its caps (file size, datasets, version history) and usage.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"mbrummerstedt-powerbi-analyst-mcp": {
"command": "uvx",
"args": [
"powerbi-analyst-mcp"
],
"env": {
"POWERBI_ANALYST_MCP_CLIENT_ID": "YOUR_POWERBI_ANALYST_MCP_CLIENT_ID_HERE",
"POWERBI_ANALYST_MCP_TENANT_ID": "YOUR_POWERBI_ANALYST_MCP_TENANT_ID_HERE"
}
}
}
}
No confirmed install command for Rows.page yet — follow the setup steps linked from its listing page rather than a guessed package name.