agentleFS
MicrosoftKnown publishermicrosoft/rayfin/packages/tools/cli/assets/agent-files/skills/rayfin-functions/SKILL.md

rayfin-functions

Skill646 starsChanged 24 days agoMITView on GitHub

Use when writing Rayfin user-defined functions (UDFs), invoking functions from frontend code, or using functions CLI commands. Triggers: rayfin functions, udf.func, UserDataFunctions, RayfinContext, FabricContext, AppFunctionsSchema, functions init, dev functions apply, client.functions, invoke, func start, function_app.ts, types.ts, rayfin/functions/, FunctionClient, FunctionsSchema, fabric-user-data-functions, functionsBaseUrl, rayfinLocalDev, resolveRayfinFunctionsBaseUrl, VITE_RAYFIN_FUNCTIONS_URL

  • Reads credentials

We split this skill into the rules it gives an agent

10 rules. About 0 are common, 1 is distinctive, and 9 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 9

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read Application authentication in functions/index.md for the configuration, identity model, and deployment requirements.

    line 32
  2. Distinctive:

    When the user names a Fabric item ("connect to lakehouseA in workspaceB"), turn the workspace + item display names into coordinates:

    line 47
  3. Very specific:

    If a Fabric CLI (e.g. fab) or Fabric MCP is already available in the workspace, prefer it — it wraps the same endpoints.

    line 49
  4. Very specific:

    Only fall back to asking the user when the name matches multiple items, the lookup returns 403 (no access), or you can't determine the …

    line 52
  5. Very specific:

    Read functions/invoking-from-frontend.md before changing frontend routing.

    line 56
  6. Very specific:

    Import RayfinContext from @microsoft/fabric-user-data-functions — not from @microsoft/rayfin-functions.

    line 68
  7. Very specific:

    Use import type for data-entity imports — a runtime import pulls the decorator runtime into the functions bundle.

    line 70
  8. Very specific:

    Never hand-edit rayfin/functions/src/types.ts — typegen regenerates it and will overwrite your edits.

    line 71
  9. Very specific:

    Never expose a local Functions URL in production.

    line 72
  10. Very specific:

    Prefer secrets via rayfin secret set <NAME> read through ctx.Secrets.

    line 74

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Rayfin Functions

Server-side user-defined functions (UDFs) that run in the Fabric runtime and are invocable from your frontend via RayfinClient. Write trusted backend logic once; get a type-safe client call on the frontend.

The full reference lives in the Rayfin guide. Read the doc for the task you're doing before writing code — don't guess API shapes, endpoints, or CLI flags. Read a doc off disk from node_modules/@microsoft/rayfin-guide/assets/docs/<path>, or fetch it with rayfin docs get --module guide --path '<path>' — or get_doc with module: "guide" via MCP.

Where to read

TaskDoc path
Overview, auth configuration and identities, project structure, first functionfunctions/index.md
udf.func() API, RayfinContext, data access, importing entitiesfunctions/writing-functions.md
How types.ts is generated and kept in syncfunctions/typegen.md
Reading secrets inside a functionfunctions/secrets.md
Calling functions from the frontend (client.functions.*.invoke)functions/invoking-from-frontend.md
Connecting to external resources — audiences, recipe chooser, per-resource walkthroughsfunctions/connections/index.md
CLI: scaffold, local host, deploycli/functions/index.md, init.md, dev-apply.md, deploy.md

Connections and secrets

Read functions/connections/index.md before writing any connection code, and functions/secrets.md before reading a secret. Both are the source of truth; the summary below exists only so you know what to look for.

Enabled Functions require services.functions.auth.type: application. Read Application authentication in functions/index.md for the configuration, identity model, and deployment requirements.

  • Generic connections are declared on the context annotation — RayfinContext<AppSchema, AudienceType.Sql | AudienceType.Storage> — and read as ctx.Tokens.Sql. The annotation is what registers the binding, so the third argument of udf.func() stays [].
  • Supported audiences are Sql, Storage, Fabric, AzureAI, and ADO.
  • ctx.Tokens.* uses the app identity for external resources; ctx.getDataClient() uses the caller's Rayfin token for Rayfin DB access. Keep tokens server-side.
  • Audiences are resolved by the TypeScript compiler at deploy time, so a type alias works — but prefer literal AudienceType.Sql, and keep a tsconfig.json in the functions project. Without one the CLI reads the annotation syntactically, cannot resolve aliases, and warns.
  • Secrets are declared with rayfin secret set, recorded in rayfin.yml, and read as ctx.Secrets.STRIPE_API_KEY. The CLI generates rayfin/functions/src/secrets.generated.ts; never hand-edit it and never hard-code a secret name.
  • ctx.getToken() and ctx.getSecret() are deprecated and flagged by @typescript-eslint/no-deprecated. Use ctx.Tokens and ctx.Secrets.

Get the Fabric info for the user

Connection code needs real endpoints — the SQL server or the OneLake path. Resolve these yourself; don't ask the user to paste connection strings. When the user names a Fabric item ("connect to lakehouseA in workspaceB"), turn the workspace + item display names into coordinates:

  • If a Fabric CLI (e.g. fab) or Fabric MCP is already available in the workspace, prefer it — it wraps the same endpoints.
  • Otherwise call the Fabric REST API directly: base https://api.fabric.microsoft.com/v1, token from az account get-access-token --resource https://api.fabric.microsoft.com.

Only fall back to asking the user when the name matches multiple items, the lookup returns 403 (no access), or you can't determine the workspace. The full lookup workflow is in functions/connections/get-fabric-info.md.

Local functions routing

Read functions/invoking-from-frontend.md before changing frontend routing. Bundled Vite templates already use rayfinLocalDev() from @microsoft/rayfin-local-dev. Leave functionsBaseUrl undefined so the SDK uses /functions/<name>/invoke; the adapter forwards that same-origin route to the local Functions host selected by rayfin dev. For custom or older Vite projects, add the adapter as documented. Use resolveRayfinFunctionsBaseUrl() only when existing code must explicitly provide a Functions base URL. For other frameworks, pass the framework-mapped Functions URL only during development.

Guardrails

  • Import RayfinContext from @microsoft/fabric-user-data-functions — not from @microsoft/rayfin-functions.
  • Register every function with udf.func(name, handler, []) — don't export bare functions.
  • Use import type for data-entity imports — a runtime import pulls the decorator runtime into the functions bundle.
  • Never hand-edit rayfin/functions/src/types.ts — typegen regenerates it and will overwrite your edits.
  • Never expose a local Functions URL in production; leave functionsBaseUrl undefined so invoke() targets the deployed backend.
  • Install resource SDK packages in rayfin/functions/package.json, not the project root.
  • Prefer secrets via rayfin secret set <NAME> read through ctx.Secrets; use process.env only for local debugging.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.