{"name":"io.github.S-CurveLabs/fxray","slug":"s-curvelabs-fxray","title":"fxray","description":"Power Apps via pac: solutions, canvas Power Fx source, Dataverse metadata, FetchXML, gated imports.","url":"https://mcp.market/server/s-curvelabs-fxray","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":24,"stars":0,"forks":0,"downloads_week":76,"last_push_at":"2026-09-23T22:42:38.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/S-CurveLabs/fxray","website":null,"version":"0.1.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"fxray","version":"0.1.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Path to fxray.toml (environment allowlist, write gate, pac path). Optional if the file is in the working folder or the per-user folder.","name":"FXRAY_CONFIG"},{"description":"Folder whose fxray.toml to use when FXRAY_CONFIG is not set.","name":"FXRAY_WORKSPACE"},{"description":"Per-user folder (default %LOCALAPPDATA%\\fxray on Windows, ~/.config/fxray elsewhere).","name":"FXRAY_HOME"}]}],"tools":[{"name":"app_checker_results","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"canvas_data_sources","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"canvas_overview","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_table","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"diff_solutions","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_solution","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"fetch_query","description":"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","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_control","description":"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']).","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_solution","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_canvas_apps","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_controls","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_environments","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_relationships","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_solutions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tables","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"pac_status","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"pack_solution","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"publish_customizations","description":"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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_formulas","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"solution_check","description":"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/.","write_action":true,"price_micros":0,"input_schema":null},{"name":"solution_components","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"unpack_solution","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoami","description":"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).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-24T05:03:48.378Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T05:03:48.322Z","components":{"code":{"score":25,"max":25,"notes":["17 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":6,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"fxray","version":"0.1.0","found":true,"weeklyDownloads":76,"license":"MIT","dependencyCount":5,"publishedAt":"2026-09-23T22:43:44.866089Z","repositoryUrl":"https://github.com/S-CurveLabs/fxray"}],"repo":{"found":true,"owner":"S-CurveLabs","repo":"fxray","archived":false,"pushedAt":"2026-09-23T22:42:38Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/331485439?v=4","ownerCreatedAt":"2026-09-20T03:04:44Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":0,"forks":0,"downloadsWeek":76,"license":"MIT","lastPushAt":"2026-09-23T22:42:38.000Z","score":24}}}},"grade_history":[],"reviews":[]}