Microsoft Power BI MCP server for AI agents

Live

OAUTH 2.0

BUSINESS INTELLIGENCE

Analytics

Microsoft Power BI gives your agent business intelligence across each user's Power BI workspaces: run DAX queries against semantic models, start and schedule refreshes, manage reports, dashboards, and workspaces, and deploy through pipelines.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Microsoft Power BI
agent · Acme Q3
Run
When did the Sales semantic model last refresh, and did it succeed?
S
microsoftpowerbi_dataset_refresh_history_list
138ms
BI agent
The Sales model last refreshed at 06:00 today and completed in 4 minutes. The 2 refreshes before it also succeeded.
Sources: Power BI refresh history, 3 refreshes
microsoftpowerbi
3 refreshes
18:29
Message Claude...

Tools your BI agent reaches for on Microsoft Power BI, scoped per user.

CALL ANY TOOL
77 tools for business intelligence in Power BI: run DAX queries, refresh semantic models and dataflows, manage reports, dashboards, workspaces, and access, and deploy through pipelines.
microsoftpowerbi_app_dashboard_get
Get app dashboard
Get one dashboard from an installed Power BI app. Returns the dashboard id, displayName, embedUrl, isReadOnly, and appId. Use this when you have both IDs. Use microsoftpowerbi_app_dashboard_tiles_list to see its tiles.
Parameters
Name
Type
Required
Description
app_id
string
Required
ID (GUID) of the app. Get it from microsoftpowerbi_apps_list.
dashboard_id
string
Required
ID (GUID) of the dashboard. Get it from microsoftpowerbi_app_dashboards_list.
microsoftpowerbi_app_dashboard_tiles_list
List app dashboard tiles
microsoftpowerbi_app_report_get
Get app report
microsoftpowerbi_app_reports_list
List app reports
microsoftpowerbi_capacities_list
List capacities
microsoftpowerbi_dashboard_create
Create dashboard
microsoftpowerbi_dashboard_tile_clone
Clone dashboard tile
microsoftpowerbi_dashboard_tiles_list
List dashboard tiles
microsoftpowerbi_dataflow_datasources_list
List dataflow datasources
microsoftpowerbi_dataflow_get
Get dataflow
microsoftpowerbi_dataflow_refresh_schedule_update
Update dataflow refresh schedule
microsoftpowerbi_dataflows_list
List dataflows
microsoftpowerbi_dataset_execute_queries
Dataset execute queries
microsoftpowerbi_dataset_parameters_update
Update dataset parameters
microsoftpowerbi_dataset_refresh_details_get
Get dataset refresh details
microsoftpowerbi_dataset_refresh_history_list
List dataset refresh history
microsoftpowerbi_dataset_user_add
Add dataset user
microsoftpowerbi_datasets_list
List datasets
microsoftpowerbi_gateway_datasource_status_get
Get gateway datasource status
microsoftpowerbi_gateway_datasources_list
List gateway datasources
microsoftpowerbi_import_get
Get import
microsoftpowerbi_my_workspace_dashboards_list
List my workspace dashboards
microsoftpowerbi_pipeline_deploy_all
Pipeline deploy all
microsoftpowerbi_pipeline_operations_list
List pipeline operations
microsoftpowerbi_pipeline_stages_list
List pipeline stages
microsoftpowerbi_push_dataset_create
Create push dataset
microsoftpowerbi_push_dataset_table_update
Update push dataset table
microsoftpowerbi_push_dataset_tables_list
List push dataset tables
microsoftpowerbi_report_get
Get report
microsoftpowerbi_reports_list
List reports

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Microsoft Power BI tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["microsoftpowerbi"], toolNames: [
    "microsoftpowerbi_datasets_list",
    "microsoftpowerbi_dataset_execute_queries",
    "microsoftpowerbi_dataset_refresh"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Refresh the Sales model and report total revenue by region" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["microsoftpowerbi"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Refresh the Sales model and report total revenue by region" }],
  tools,
});

// Execute the tool call with the user's vaulted Microsoft Power BI OAuth token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["microsoftpowerbi"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Refresh the Sales model and report total revenue by region" }],
  tools,
});

// Tool call runs with the user's vaulted Microsoft Power BI OAuth token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["microsoftpowerbi"] }, pageSize: 100,
});

const agent = new Agent({
  name: "bi_agent",
  model: "gemini-2.5-pro",
  instruction: "Microsoft Power BI tools scoped to this user",
  tools,
});

await agent.run("Refresh the Sales model and report total revenue by region");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Microsoft Power BI tool. Click to copy, paste into your agent, done.
Reports and data
Copy the prompt
Copied
List the reports in the Finance workspace.
Copy the prompt
Copied
Run a DAX query for total revenue by region on the Sales model.
Copy the prompt
Copied
List the pages in the Executive Summary report.
Refreshes
Copy the prompt
Copied
Refresh the Sales semantic model now.
Copy the prompt
Copied
Show the refresh history for the Sales model.
Copy the prompt
Copied
Change the Sales model to refresh daily at 6am.
Workspaces and deployment
Copy the prompt
Copied
Create a workspace called Marketing Analytics.
Copy the prompt
Copied
Give jane@example.com the Viewer role in the Finance workspace.
Copy the prompt
Copied
Deploy everything from the Test stage onward in the Finance pipeline.
SEE HOW AUTH WORKS
Each user signs in to Microsoft Power BI once, and Scalekit stores and refreshes their tokens. Credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Microsoft Power BI
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Microsoft Power BI
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Microsoft Power BI
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Microsoft Power BI
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other analytics and BI connectors.
GTM and RevOps Teams
Revenue forecast commentary
Pulls open pipeline from Salesforce and HubSpot, calculates coverage against quota, flags at-risk stages, posts commentary to Slack, and logs every snapshot to Google Sheets.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Test other agents
See the same per-user auth pattern across other analytics and BI connectors.
GTM
Revenue forecast agent
Score pipeline coverage against quota across Salesforce and HubSpot, post forecast commentary to Slack, log snapshots to Sheets.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Microsoft Power BI token looks fine in a demo. In production every refresh, deployment, and access change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Microsoft Power BI today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Microsoft Power BI as the user or through a shared service account?
As the user. Each user signs in to Microsoft Power BI once, and Scalekit stores and refreshes their tokens. Refreshes, deployments, and access changes are attributed to that user in your audit trail, not a shared service account.
Where is the Microsoft Power BI OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Microsoft Power BI?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the list and get tools without microsoftpowerbi_workspace_user_add or microsoftpowerbi_pipeline_deploy_all, which change access or push content to the next stage. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Microsoft Power BI access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which Power BI content can the agent reach?
The workspaces, apps, and My workspace content the connected user can access. microsoftpowerbi_workspaces_list returns those workspaces, and the gateway and capacity tools return only the gateways that user administers and the capacities that user can access.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""microsoftpowerbi"": {
""url"": ""https://mcp.scalekit.com/microsoftpowerbi"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.microsoftpowerbi]
url = ""https://mcp.scalekit.com/microsoftpowerbi""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""microsoftpowerbi"": {
""url"": ""https://mcp.scalekit.com/microsoftpowerbi"",
""type"": ""http""
}
}
}