Fusion BIP MCP Server
Summary: The server exposes MCP tools for querying Oracle Fusion through BI Publisher and managing/running BIP catalog objects.
Run a read-only
SELECTagainst Fusion withquery_fusion, requiring SQL and output column aliases and returning rows as XML.Run a deployed BIP report by catalog path with
run_report.Download BIP catalog object definitions (
.xdmor.xdo) withget_catalog_object.Deploy/replace BIP data models (
.xdm) withdeploy_data_model— a write operation.Deploy/replace BIP reports (
.xdo) linked to a data model withdeploy_report— a write operation.Optionally select the Fusion user per call via
fusion_user(defaultbip_user).
Note: the schema exposes additional report/data-model management tools beyond the README's single query_fusion tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fusion BIP MCP Serverrun the revenue report for this quarter"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Fusion BIP MCP Server
An MCP server that lets an AI agent answer questions from live Oracle Fusion data. You ask in plain English; the agent writes the SQL, runs it through this server, reads the rows back, and if the query fails it looks up the right tables and columns and tries again. The server has one tool, query_fusion, and talks to Fusion's BI Publisher SOAP service directly from your machine, so there is no database or middle tier to stand up.
The tool
Tool | What it does | Arguments |
| Runs one query against Oracle Fusion and returns the rows as XML |
|
sqlis oneSELECT(orWITH ... SELECT). Results come back as<ROWSET><ROW><COLUMN_NAME>value</COLUMN_NAME>...</ROW></ROWSET>, with tags taken from the column names or aliases, so give expressions an alias (COUNT(*) AS INVOICE_COUNT).fusion_useris only used with a credential helper (option B below). Leave it out otherwise.
When a query fails, the Oracle error comes back as the tool's error, for example ORA-00942: table or view does not exist or ORA-00904: "VENDOR": invalid identifier. The tool's description tells the agent how to recover: look tables up in ALL_OBJECTS, list columns from ALL_TAB_COLUMNS (both through this same tool), or read Oracle's Tables and Views for Oracle Fusion Cloud guides on docs.oracle.com, then correct the SQL and run it again. Many Fusion objects are synonyms, which have no rows in ALL_TAB_COLUMNS, so the description also tells the agent to follow a synonym to its view or table, to filter date-effective _F/_M tables on SYSDATE, and to decode code columns through FND_LOOKUP_VALUES. DBA_ views are not available to Fusion users, and every answer is limited to the data the connected account can see.
Limits: results over 40,000 characters are cut at a whole row and end with a comment saying how many rows were shown (set FUSION_MCP_MAX_CHARS to change the limit). Queries run against BI Publisher's ApplicationDB_FSCM data source, which can read Financials, Procurement, SCM and HCM tables, subject to the account's data security.
What it accepts: the SQL must start with SELECT or WITH and must not contain a semicolon (one trailing semicolon is removed). The query runs inside a short PL/SQL block so BI Publisher can read the column names; refusing semicolons means nothing can be added after the query. BI Publisher also refuses DML and DDL on its own. Even so, use an account with only the access you want the agent to have.
Each query runs through a temporary data model created in the account's own BI Publisher folder (/~username) and deleted when the call ends, whether it succeeds or fails.
Related MCP server: HCM MCP Server for Oracle Fusion Cloud (unofficial)
Setup
The repo contains no Fusion addresses, users or passwords. You supply your own.
Requirements: Python 3.10 or later, and a Fusion account that can create data models in its own BI Publisher folder (the BI Publisher Data Model Developer or Author role).
git clone https://github.com/brianmakarewicz/fusion-bip-mcp-server
cd fusion-bip-mcp-server
python -m venv .venv
.venv/bin/pip install -e . # Windows: .venv\Scripts\pip install -e .This installs the fusion-mcp command.
Option A (recommended): save the connection in your OS keychain
.venv/bin/fusion-mcp setupIt asks for the Fusion URL (https://<your-pod>.fa.<region>.oraclecloud.com; a pasted Fusion page address is trimmed to that), the username and the password (typing is hidden), tests the login, and saves only if the login works. The password goes into the operating system's credential store (Windows Credential Manager, macOS Keychain, or the Linux Secret Service), never into a file. The URL and username go into fusion-mcp/config.json under your user config folder. fusion-mcp forget removes both (the usage log, if any, stays in the same folder). Running setup again replaces the saved connection.
The hidden password prompt needs a real console: run setup from PowerShell, cmd, Terminal or a Linux/macOS shell. In Git Bash (mintty) prefix it with winpty, or use fusion-mcp setup --password-stdin and pipe in three lines: the URL, the username, then the password. fusion-mcp --help lists the commands.
Option B: several accounts, through your own credential helper
Write a conn_helper.py in a folder outside the repo that defines get_fusion_url(pod) and get_fusion_user(name, pod), returning the URL and (username, password). examples/conn_helper_example.py keeps the passwords in the OS keychain and only the account names in a file. Then set:
Variable | Value |
| The folder containing your |
| The account name to use when a call does not name one |
| Optional; passed to your helper as |
Add an account with .venv/bin/python conn_helper.py add <name> (use the repo's virtual environment, which has keyring). Remove one by deleting it from accounts.json and its keychain entry (service fusion-bip-mcp-server-helper); fusion-mcp forget does not touch helper accounts.
With option B the agent can name any account your helper knows through fusion_user, so only give the helper accounts you are happy for the agent to use.
Option C (not recommended): plaintext environment variables
FUSION_URL, FUSION_USERNAME and FUSION_PASSWORD work, but the password then sits unencrypted in your MCP client's config file, where anything that can read your files can read it. The server refuses FUSION_PASSWORD unless you also set FUSION_MCP_ACCEPT_PLAINTEXT_PASSWORD=yes to confirm you accept that risk.
Logins and session tokens
The server logs in to BI Publisher once and reuses the session token for later queries. The password is sent only at that first login, and again only when Fusion reports that the token has expired, at which point the server logs in again from the same stored credentials and retries the query once. The token is kept in memory and never written to disk.
Register it with your MCP client
After option A there is nothing to pass; just point the client at the command.
Claude Code:
claude mcp add fusion-bip -- /path/to/fusion-bip-mcp-server/.venv/bin/fusion-mcpClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"fusion-bip": {
"command": "/path/to/fusion-bip-mcp-server/.venv/bin/fusion-mcp"
}
}
}On Windows the command is .venv\Scripts\fusion-mcp.exe. For option B, add the FUSION_MCP_* variables to the client's env settings.
Usage log
Every call appends one line to metering.jsonl in the same fusion-mcp config folder (set FUSION_MCP_METER_LOG to move it). It records the time, tool, duration, result size and outcome; for errors it keeps only the error type and ORA- code. It stores a hash and length of the SQL, not the SQL itself, and never stores result data.
Which credentials are used
The server checks in this order and uses the first that is set: a credential helper (FUSION_MCP_HELPER_DIR), then FUSION_PASSWORD (option C), then the saved connection from fusion-mcp setup. A leftover FUSION_PASSWORD therefore takes precedence over a saved connection.
If Fusion rejects the login, the server stops trying for five minutes so that an agent retrying in a loop cannot lock the account. Fix the credentials and restart the server.
The server runs over stdio only, started by your MCP client. It has no network listener and does no caller authentication of its own.
How it fits together
server.py: the MCP server; registers the tool and its description.client.py: the backend the server imports.direct_client.py: the query, run against BI Publisher SOAP.soap.py: builds the SOAP requests and reads Fusion's responses and errors.builders.py: checks the SQL and builds the temporary data model.context.py: finds your credentials (helper, saved connection, or environment).credentials.py: thesetupandforgetcommands and the OS keychain storage.metering.py: the usage log.
License
MIT. See LICENSE.
Available Tools
5 toolsdeploy_data_modelA
Deploy a BIP data model (.xdm) to a catalog folder. WRITE operation.
Args: name: Data model name (letters, digits, underscore). xdm_xml: Complete data model XML. Use ApplicationDB_FSCM as data source. folder: Target folder, e.g. /Custom/MyReports or /~bip_user. replace: Delete any existing model of the same name first (default true). fusion_user: Must have the BIP Author role (default bip_user).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| folder | Yes | ||
| replace | No | ||
| xdm_xml | Yes | ||
| fusion_user | No | bip_user |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It explicitly states 'WRITE operation', describes destructive behavior via 'replace: Delete any existing model of the same name first', and mentions the required BIP Author role for fusion_user. This is substantive behavioral disclosure beyond simple mutation, though it omits details about failure modes when replace=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a two-sentence overview followed by a bulleted list of parameters. Each line is purposeful and directly useful; no fluff or repetition. The length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, parameters, and critical behavioral constraints (write, replace, auth). An output schema exists, so return value details are not needed. It lacks some edge-case context like folder existence requirements or behavior when replace is false, but overall it is sufficient for an agent to deploy a data model safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It provides meaningful semantics for all parameters: name formats, xdm_xml content guidance (ApplicationDB_FSCM), folder examples, replace behavior, and fusion_user role requirement. This significantly exceeds basic schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Deploy a BIP data model (.xdm) to a catalog folder.' It identifies the resource (data model), format (.xdm), and destination (catalog folder), which distinguishes it from sibling tools like deploy_report. The verb 'deploy' is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating the tool's purpose, but it does not explicitly contrast with alternatives like deploy_report or provide when-not-to-use guidance. It gives clear context for deployment but no exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_reportA
Deploy a BIP report (.xdo) linked to a data model. WRITE operation.
Args: name: Report name (letters, digits, underscore). dm_path: Path to the linked data model, e.g. /Custom/MyReports/MY_DM.xdm folder: Target folder for the report. replace: Delete any existing report of the same name first (default true). fusion_user: Must have the BIP Author role (default bip_user).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| folder | Yes | ||
| dm_path | Yes | ||
| replace | No | ||
| fusion_user | No | bip_user |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the write nature, the destructive replace default, and the BIP Author role requirement, which are critical behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact docstring with a clear summary line followed by a structured Args listing. No redundant text; every line adds needed detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with an output schema, the description covers purpose, parameters, destructive behavior, and role prerequisites. It misses explicit guidance on when to prefer other tools, but is otherwise complete given the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 0%, the Args section provides detailed meaning for every parameter: name restrictions, an example dm_path, the replace behavior, and the default fusion_user role. This far exceeds the schema's type-only info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deploys a BIP report (.xdo) linked to a data model, uses a specific verb 'Deploy', and calls out 'WRITE operation' to distinguish it from read-oriented sibling tools like query_fusion and run_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description doesn't explicitly state when to use this tool over alternatives or provide exclusion criteria. It implies usage through the 'WRITE operation' note and the replace parameter behavior, but no direct comparison to sibling tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_catalog_objectA
Download a catalog object definition (.xdm or .xdo) for inspection.
Args: object_path: Full catalog path, e.g. /Custom/MyReports/MY_DM.xdm fusion_user: Fusion user to run as (default bip_user).
| Name | Required | Description | Default |
|---|---|---|---|
| fusion_user | No | bip_user | |
| object_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The description indicates a read-only download operation and discloses the fusion_user impersonation behavior in the Args section. It does not discuss error handling or authentication, but the download semantics are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a single sentence plus a short parameter list. All information is relevant and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter interface, the presence of an output schema, and the clear download behavior, the description provides adequate context. It lacks explicit mention of error conditions or related tool selection, but is sufficient for a basic read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description's Args section provides a concrete example for object_path and explains the default for fusion_user, adding meaning beyond the schema's bare property names. This compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Download') and resource ('catalog object definition (.xdm or .xdo)') and clarifies the purpose ('for inspection'). This clearly distinguishes it from siblings like deploy_report or query_fusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for inspection' implies the tool is intended for viewing or examining object definitions. However, it does not explicitly mention alternative tools or when not to use this tool, so the guidance is clear but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_fusionA
Run a read-only SELECT against Oracle Fusion and return the rows as XML.
Args: sql: A single SELECT statement. No trailing semicolon. Add WHERE/ROWNUM to keep the result small — BIP serializes the whole set. columns: Output column aliases in SELECT order, upper-case identifiers. Alias every column in the SQL to a simple upper-case name. fusion_user: Fusion user to run as (default bip_user).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| columns | Yes | ||
| fusion_user | No | bip_user |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses read-only safety, warns that BIP serializes the entire result set (implying a need for row limits), and specifies single-statement SQL with no trailing semicolon. It doesn't mention authentication or error cases, but the fusion_user parameter and default help cover access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-sentence summary leads into a clear Args list with specific details for each parameter. No unnecessary words; every line adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, read-only behavior, output format, serialization risk, and parameter constraints. An output schema is present, reducing the need to detail return values. Missing items like error handling and authentication are minor given the fusion_user parameter and default, and the tool appears adequately specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain parameters, and it does. For sql, it explains syntax criteria and result-size implications; for columns, it dictates aliasing and ordering; for fusion_user, it gives the default. This far exceeds the bare schema and provides all necessary operational meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+operation: 'Run a read-only SELECT against Oracle Fusion and return the rows as XML.' This clearly distinguishes it from sibling tools like run_report or deploy_report, which handle predefined reports and data models, while query_fusion is for direct SQL queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical parameter usage guidance (e.g., 'Add WHERE/ROWNUM to keep the result small') but does not explicitly state when to use query_fusion versus alternatives like run_report or get_catalog_object. The read-only SELECT nature implies ad-hoc querying, but no when/when-not comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_reportA
Run a deployed BIP report and return its output.
Args: report_path: Full catalog path, e.g. /Custom/MyReports/MY_RPT.xdo fusion_user: Fusion user to run as (default bip_user).
| Name | Required | Description | Default |
|---|---|---|---|
| fusion_user | No | bip_user | |
| report_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool runs a report and returns output, but does not disclose whether this operation is read-only, whether specific permissions are required beyond the fusion_user parameter, whether the report may have side effects, or any potential failure modes. The parameter explanations add some context (e.g., fusion_user runs as), but key behavioral traits are left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two sentences plus a short arg list) and front-loaded with the main action. Every sentence earns its place; the Args block provides necessary parameter details without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters and an output schema, the description is reasonably complete. It covers the purpose and both parameters adequately. However, it does not mention when to use this vs. alternatives or discuss error scenarios, making it slightly incomplete in an agent context. Given the output schema exists, the lack of return-value detail is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description compensates fully by explaining both parameters. 'Full catalog path, e.g. /Custom/MyReports/MY_RPT.xdo' gives a concrete example, and 'Fusion user to run as (default bip_user)' clarifies the default and purpose. This adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Run a deployed BIP report and return its output.' The verb 'Run' and resource 'deployed BIP report' are specific and distinguish it from sibling tools like deploy_report (which deploys, not runs) and query_fusion (which queries data).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that the report must already be deployed (it says 'deployed BIP report'), so an agent can infer that deploy_report should be used first if the report is not yet deployed. However, it does not explicitly state when to use this tool over alternatives like query_fusion for data retrieval, nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
deploy_data_model - First observed
deploy_report - First observed
get_catalog_object - First observed
query_fusion - First observed
run_report
TDQS
Scored across 5 tools
Each tool targets a distinct operation: direct SQL query, report execution, catalog object download, data model deployment, and report deployment. There is no overlap or ambiguity between them.
All five tool names follow a consistent verb_noun pattern in snake_case (query_fusion, run_report, get_catalog_object, deploy_data_model, deploy_report). Minor variation in the verb (query, run, get, deploy) is natural and predictable.
With only 5 tools, the server is tightly scoped to core Fusion BIP operations: querying data, running reports, and managing catalog objects. Each tool earns its place, and the count is ideal for the stated purpose.
The tool set covers the main lifecycle: query, run, get, deploy (with replace for updates). However, it lacks a catalog listing/browsing tool and an explicit delete operation, which would make it fully self-sufficient. These are workable gaps for agents that already know the exact catalog paths.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
The BigQuery remote MCP server is a fully managed service that uses the Model Context Protocol to connect AI applications and LLMs to BigQuery data sources. It provides secure, standardized tools for AI agents to list datasets and tables, retrieve schemas, generate and execute SQL queries through natural language, and analyze data—enabling direct access to enterprise analytics data without requiring manual SQL coding.
Related MCP Servers
- FlicenseAqualityCmaintenanceA local stdio MCP server providing read-only access to Oracle Fusion/ERP Cloud databases via the BI Publisher SOAP API, enabling object discovery, table descriptions, source reading, and SELECT queries.9-
- AlicenseAqualityBmaintenanceAn MCP server that lets AI models interact with Oracle Fusion Cloud HCM across its entire REST surface. It uses generic, schema-aware tools to dynamically discover licensed modules and resources without per-endpoint code.6Apache 2.0
- FlicenseNot gradedqualityDmaintenanceMCP server that connects Claude Desktop to an Oracle Fusion Cloud instance. It exposes suppliers, purchase orders, invoices, and project costs as callable tools.-
- FlicenseAqualityAmaintenanceMCP server enabling AI agents to directly query and manage Power BI datasets, reports, and workspaces via DAX, with built-in data security policies and support for both Power BI Desktop and Service.163-