fxray MCP server
Power Apps via pac: solutions, canvas Power Fx source, Dataverse metadata, FetchXML, gated imports.
0 stars76 downloads/wk
Reviews
Write oneNobody has reviewed fxray yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
fxray tools (23, 3 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
app_checker_resultsThe App Checker results Power Apps Studio saved inside the app (AppCheckerResult.sarif): counts by level and issues grouped by rule with locations (screen.control.property). level= filters (Critical/High/Medium/Low).
canvas_data_sourcesThe app's data sources (Dataverse tables, connectors, static data) with the formulas that reference each one. Flags UNREFERENCED data sources, which Power Apps Studio silently drops on the next save/publish. On a solution source it also checks meta.xml DatabaseReferences (empty = every write breaks after import) and reports columns the solution defines but the app's cached table schema lacks (invi
canvas_overviewSummary of a canvas app's source: screens (in Studio order) with control counts, components, control types, data sources and app checker counts. source = .msapp, SourceCode folder (Src/*.pa.yaml), or a solution zip / unpacked folder (then app= logical or display name when it holds several apps).
describe_tableColumns of one table: logical name, type, display name, required level, max length, lookup targets, choice values; plus primary id/name columns and relationships. `table` = logical, display or entity-set name. System columns (createdby, versionnumber, ...) are hidden unless include_system_columns=true. full=true adds descriptions, formats and numeric ranges. source: solution zip/folder, or a canva
diff_solutionsWhat changed between two versions of a solution (each a zip or unpacked folder, e.g. two export_solution outputs): version/publisher/root components, tables and columns (type, required level, length, choices), relationships, canvas apps (screens, controls, formula changes as small diffs, data sources), flows/env vars/ connection references, and changed files for anything else (views, forms).
export_solutionExport a solution from an allowlisted environment (read-side: nothing changes in the environment) into a new timestamped folder under the output dir, and by default unpack it there (pac solution unpack) so its tables, relationships and canvas apps can be read offline. managed=true exports the managed package (only possible from the environment where the solution is unmanaged). Takes ~1 minute. Ret
fetch_querywrite actionRun a read-only FetchXML query against an allowlisted environment (pac env fetch) and return rows as dicts. FetchXML cannot modify data. Rows are capped at max_rows (default from config, ceiling 5000): pac itself ignores top/count/page and would page through every record, so the server stops reading at the cap. pac also ignores <order>; the server sorts client-side when the result is complete. Val
get_controlOne control (or screen, or 'App') with its type, variant, parent, children and property formulas (Power Fx). properties= limits to named properties (e.g. ['OnSelect', 'Items']).
import_solutionImport a solution zip into an ALLOWLISTED environment. dry_run=true (default) returns the plan: target org (verified with pac env who), package name/version/managed, what is installed now, whether this is a new install, an update or an upgrade, blockers and warnings (managed/unmanaged mismatch, downgrade, canvas AppVersion trap, empty DatabaseReferences), backup and the exact pac command. mode: 'u
list_canvas_appsCanvas apps: live in an environment (`pac canvas list`: name, created by, modified on), or offline in a solution zip / unpacked folder (logical name, display name, AppVersion stamp).
list_controlsThe control tree (name, type, variant, parent, depth, number of properties), optionally for one screen and/or one control type (substring, e.g. 'Gallery', 'Button'). Use get_control for formulas.
list_environmentsAll Dataverse environments the signed-in account can see (global discovery), each marked allowed / not allowed. Only allowed ones can be used by the other tools.
list_relationshipsTable relationships from a solution (or a canvas app's cached schema): one-to-many (referenced/one side, referencing/many side and its lookup column, cascade delete) and many-to-many (intersect table). table= limits to relationships touching that table.
list_solutionsSolutions in an allowlisted environment: unique name, display name, version, managed flag, publisher. Managed (mostly Microsoft system) solutions are hidden unless include_managed=true. name_filter is a case-insensitive substring on unique or display name.
list_tablesDataverse tables. With source= (solution zip/folder, or canvas .msapp/SourceCode folder for the tables the app caches): name, display name, entity set, column counts. Without source: live table NAMES from the environment (the entity catalog via FetchXML; pac has no live column metadata, so describe_table needs a source). pattern = substring on logical or display name.
pac_statusCheck the setup: config (allowlisted environments, writes enabled, output folder), the pac CLI version, and pac's auth profiles. Run this first when anything fails. Does not contact an environment.
pack_solutionPack an unpacked solution folder into a solution zip (pac solution pack). Local only: nothing is sent to an environment. dry_run=true (default) returns the plan and command plus warnings (canvas data sources Studio would prune, empty DatabaseReferences). Default zip goes under <output>/packs/. Executing needs allow_writes=true.
publish_customizationswrite actionPublish all customizations in an allowlisted environment (pac solution publish). dry_run=true (default) returns the verified target and command. Executing needs allow_writes=true and dry_run=false.
search_formulasSearch every Power Fx formula in a canvas app for a substring (or regex=true). code_only=true ignores matches inside string literals and comments. property= restricts to one property name (e.g. 'OnSelect'); control= to controls whose name contains it. Returns control, property, and the matching lines.
solution_checkwrite actionRun the Power Apps solution checker on a solution zip (pac solution check): uploads the zip to Microsoft's checker service (a cloud call, nothing changes in the environment), waits, and summarizes the SARIF results by rule and severity. Takes several minutes. Output is kept under <output>/checks/.
solution_componentsWhat a solution contains. Offline (source= a solution zip or unpacked folder): manifest (name, version, managed, publisher/prefix), root components by name, canvas apps, flows, connection references, environment variables, missing dependencies. Live (solution= unique name): every component row from the environment with type and, for tables, canvas apps, flows, environment variables and connection
unpack_solutionUnpack a solution zip (pac solution unpack, local only) into a new folder under the output dir (or <output>/unpacked/<folder_name>). Returns the folder, which works as source= for the offline tools.
whoamiWho pac is signed in as and which org it reaches for an allowlisted environment (`pac env who`). Fails with instructions if the sign-in expired. `environment` = URL or id from the allowlist (default: first).
Public scan report
scanner v0.1.9 · 2026-09-24 · same rubric, same numbers if you re-run it
- Code scan17 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner6/10
How fxray compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 89/100
- higher than 80% of 48,273 servers
- Tools
- 23
- the typical server has 7
- Tools that change things
- 13%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 76
- more than 58% of 11,915 servers with a package
What its tools let an agent do: 19 read · 1 create · 2 change · 1 send or post
Install fxray in Claude Code, Cursor or VS Code
claude mcp add fxray -- uvx fxray
What the publisher says
From the fxray repository's README, as published. We do not edit it. Read it on GitHub
fxray
<!-- mcp-name: io.github.S-CurveLabs/fxray -->
An X-ray for Power Fx: an MCP server that wraps the Power Platform CLI (pac) so Claude, GitHub Copilot (VS Code agent mode) or any MCP client can inspect and work with Power Apps solutions, canvas app source and Dataverse: list and export solutions, read canvas apps as text (screens, controls, Power Fx formulas, data sources), read table / column / relationship metadata, run read-only FetchXML, diff two solution versions, run the solution checker, and (gated, dry-run by default) pack, import and publish.
Safety model
passes --environment explicitly, so pac's currently selected org is never used implicitly, and whoami and every write re-check that the org pac actually connected to is allowlisted. An empty allowlist (or no config file) disables every live tool; offline tools still work.
- Environment allowlist. Live tools only reach environments listed in allowed_environments. Every call
dryrun=true and return a plan plus the exact pac command. Executing needs allowwrites = true in the config and dry_run=false on the call. Have the assistant show you the plan first.
- Read-only by default. packsolution, importsolution and publish_customizations default to
deleting components missing from the zip. Blockers (managed/unmanaged mismatch, managed downgrade, empty DatabaseReferences) stop execution. Before importing over an unmanaged solution the current one is exported to out/backups// and the result carries an undo recipe; managed targets cannot be exported, which the plan says.
- Imports default to mode="update" (never deletes). upgrade (managed only) is explicit and flagged as
written to.
- Local output (exports, unpacks, packs, checker results) goes under outputdir; protectedpaths are never
reaches pac.
- FetchXML is read-only by nature; it is parsed and validated (well-formed, no DOCTYPE, one entity) before it
- No secrets in the config: pac keeps its own auth profiles. pac's signed checker-results URL is not returned.
Install
pip install fxray # or run it without installing: uvx fxrayNeeds Python 3.11+ and the Power Platform CLI:
dotnet tool install --global Microsoft.PowerApps.CLI.Tool # needs the .NET SDK
pac auth create --environment https://yourorg.crm.dynamics.com/ # a person, in a terminal (browser sign-in)fxray finds pac on PATH, then at ~\.dotnet\tools\pac.exe (the dotnet global-tool folder); the Windows MSI install's pac.cmd shim is resolved to the pac.exe it wraps. MCP clients often start servers with a shorter PATH than your terminal, so if pac works in a terminal but not in fxray, set pac_path to the full path. Tested on Windows with pac 2.9.3. pac is a .NET tool and runs on macOS/Linux too; fxray should, but that is untested.
Interactive sign-in is impossible from an MCP server: when pac's token expires the tools say so and stop, and a person runs pac auth create (or pac auth select) again in a terminal.
Configure
Copy fxray.example.toml to fxray.toml and list the environments fxray may reach. Lookup order (first file found wins):
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
fxray: common questions
- Is fxray MCP server safe?
- Yes, by our scan: it is graded A (89/100). Read the fxray safety report
- How do I install fxray?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does fxray need an API key?
- No secret keys are declared. It reads 3 settings from the environment.
- Is fxray maintained?
- The last commit was 40 days ago (2026-09-23). The latest release is v0.1.0.
- How does fxray compare with other MCP servers?
- safety score 89/100 (higher than 80% of 48,273 servers); tools 23 (the typical server has 7); tools that change things 13% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.