MCP.Market

fxray MCP server

by S-CurveLabs·io.github.S-CurveLabs/fxray·v0.1.0

Power Apps via pac: solutions, canvas Power Fx source, Dataverse metadata, FetchXML, gated imports.

A89/100grade A
What users say
No reviews yet
Be the first
Safety scan
A89/100

full report

Adoption
Growing

0 stars76 downloads/wk

Reviews

Write one

Nobody 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 posts

Read from the package source without running it. The installed server may list more.

  • app_checker_results

    The 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_sources

    The 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_overview

    Summary 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_table

    Columns 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_solutions

    What 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_solution

    Export 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 action

    Run 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_control

    One 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_solution

    Import 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_apps

    Canvas 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_controls

    The 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_environments

    All 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_relationships

    Table 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_solutions

    Solutions 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_tables

    Dataverse 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_status

    Check 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_solution

    Pack 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 action

    Publish 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_formulas

    Search 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 action

    Run 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_components

    What 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_solution

    Unpack 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.

  • whoami

    Who 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

no findings
  • 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
Overall 89/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

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
Add to Cursor

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 fxray

Needs 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.

More from S-CurveLabs →