Official agent skill

Assign Offline Profile

by microsoft in microsoft/power-platform-skills

A skill your agent uses when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices.

OfficialMITAuto-check: notes

Install Assign Offline Profile

skills CLI
$ npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install microsoft/power-platform-skills assign-offline-profile --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/microsoft/power-platform-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/mobile-apps/skills/assign-offline-profile .claude/skills/assign-offline-profile && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
assign-offline-profile
GitHub stars
979
Token cost
~2.6k tokens
SKILL.md length
805 words
Files
1
Skills in repo
92
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices.

  • Works in 7 steps: Verify project + locate profile → Pick users/teams → Discover existing memberships → …
  • The user needs to bind users
  • SKILL.md covers Workflow, Status code (final line) and Failure recovery
  • Calls node and just

What it does

Assign Offline Profile is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Without this, the profile exists in Dataverse but no one's app uses it.

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: A plugin marketplace for GitHub Copilot and other AI agents that provides Power Platform development plugins, including reusable skills, agents, and commands for building and… The licence is MIT.

When your agent uses it

  • The user needs to bind users
  • Teams to a Mobile Offline Profile so they actually receive offline sync on their devices

Example prompts

  • “/assign-offline-profile”

Requirements

  • Pre-approved tools (allowed-tools): Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Verify project + locate profile
  2. Pick users/teams
  3. Discover existing memberships
  4. Confirm diff (single gate)
  5. POST memberships
  6. Verify
  7. Summary

What it can do on your machine

Read from SKILL.md and the folder at commit 8c4b447. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Edit
    • Write
    • Grep
    • Glob
    • Bash
    • AskUserQuestion

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • node
    • just

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Assign Offline Profile loads about 2.6k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 805 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~56
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from microsoft/power-platform-skills at commit 8c4b447, republished under its MIT licence (© microsoft). 805 words, ~2,614 tokens.

Download SKILL.mdSave it as .claude/skills/assign-offline-profile/SKILL.md (or your agent's skills folder).
name
assign-offline-profile
description
Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Without this, the profile exists in Dataverse but no one's app uses it.
allowed-tools
Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion
user-invocable
false
model
sonnet

Shared instructions: shared-instructions.md — read first.

References:

Assign Offline Profile

Bind one or more users and/or teams to an existing Mobile Offline Profile. Without this step, the profile exists in Dataverse but is unbound — no one's app actually uses it for offline sync.

Per the maker portal's UX (the "Assign profile to user" dialog under env settings), this is a separate operation from profile creation. Many users hit "I created the profile but offline still doesn't work" — the missing piece is membership.

Before project reads or commands, apply app-working-directory.md. Resolve one absolute working_dir for a direct call or require the child invocation's owner root. Keep every shell/file operation, referenced recipe, and retry on that root and the selected environment/tenant; missing or conflicting context is NEEDS_CONTEXT. File tools use <working_dir>/.... Planning-phase calls may discover and propose the membership diff but must return before the confirmation gate, POST/DELETE, or artifact updates.

Workflow

  1. Verify project + locate profile → 2. Pick users/teams → 3. Discover existing memberships → 4. Confirm diff (single gate) → 5. POST memberships → 6. Verify → 7. Summary

Step 1 — Verify project + locate profile
bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
environment_id=$(node -p "require('./power.config.json').environmentId || ''") || {
  echo "BLOCKED: unreadable power.config.json" >&2; exit 1;
}
if [ -z "$environment_id" ]; then
  echo "NEEDS_CONTEXT: selected app has no environmentId" >&2; exit 1;
fi
node "${PLUGIN_ROOT}/scripts/resolve-environment.js" "$environment_id" --no-cache --require-tenant

Capture <envUrl> and <tenantId> and require them to match any supplied owner identity. Pass --tenant-id "<tenantId>" on every Dataverse request, including profile lookup, WhoAmI, membership discovery, mutation, readback, and retries.

Profile ID resolution (in order):

SourceUsed when
$ARGUMENTS contains --profile-id <guid>Explicit override
$ARGUMENTS contains --profile-name <name>Resolve via GET /mobileofflineprofiles?$filter=name eq '<name>'&$select=mobileofflineprofileid
<working_dir>/offline-profile.jsonRead top-level profileId field
OtherwiseGET /mobileofflineprofiles and present AskUserQuestion with the list (max 4 options)

STOP if no profile can be resolved. Print: Run /setup-offline-profile first, or pass --profile-id.

power.config.json is intentionally NOT consulted here. That file is owned by pa app init. The profile ID lives in offline-profile.json only.

Step 2 — Pick users/teams

$ARGUMENTS parsing:

FlagEffect
--user <upn> (repeatable)Add specific user(s) by UPN (user@domain.com)
--team <name> (repeatable)Add specific team(s) by name
--meAdd the current Dataverse user from WhoAmI / systemusers(<UserId>) — useful for solo dev demos
--all-app-usersAdd every user with System User role in the current env (broad; intended for prod rollout — confirm at gate)
--unassign-user <upn> / --unassign-team <name>Remove an existing membership rather than add

If no flags passed, present AskUserQuestion:

Question: "Who should receive this offline profile?"

Options (max 4):

  • Just me (the current user) — equivalent to --me
  • Pick specific users by UPN — you reply with comma-separated emails in the next message
  • Pick a team — list env's teams and pick one
  • All users with System User role — equivalent to --all-app-users; broad scope, confirm at gate

For pick-users flow: after the choice, print:

"Reply with comma-separated UPNs (e.g. rm1@contoso.com, rm2@contoso.com)"

Then read the next user message and parse.

Show full SKILL.md (354 more words)Show less
Step 3 — Discover existing memberships

Telemetry checkpoint: discover_offline_profile_memberships

For idempotency:

bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
# Existing user memberships for this profile
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
  "usermobileofflineprofilememberships?\$filter=_mobileofflineprofileid_value eq <profileId>&\$select=usermobileofflineprofilemembershipid,_systemuserid_value&\$expand=systemuserid_systemuser(\$select=domainname)" \
  --tenant-id "<tenantId>"

# Existing team memberships for this profile
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
  "teammobileofflineprofilememberships?\$filter=_mobileofflineprofileid_value eq <profileId>&\$select=teammobileofflineprofilemembershipid,_teamid_value&\$expand=teamid_team(\$select=name)" \
  --tenant-id "<tenantId>"

Build the set of already-bound UPNs and team names.

For each candidate user/team from Step 2, look up their systemuserid / teamid (skip if already in already-bound):

bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
  "systemusers?\$filter=domainname eq '<upn>'&\$select=systemuserid,fullname,domainname&\$top=1" \
  --tenant-id "<tenantId>"

node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
  "teams?\$filter=name eq '<team-name>' and teamtype eq 0&\$select=teamid,name&\$top=1" --tenant-id "<tenantId>"

(teamtype eq 0 excludes Access Teams and Owner Teams — only Manage Teams get profile assignments.)

Construct three lists:

  • to_add — resolved IDs to POST
  • to_remove — resolved IDs to DELETE (from --unassign-* flags)
  • not_found — UPNs/team-names that didn't resolve (warn)
  • already_bound — skipped no-ops
Step 4 — Confirm diff (single gate)

Telemetry checkpoint: confirm_offline_profile_assignment_diff

AskUserQuestion:

Question header: Confirm membership changes

Question body:

Profile: <name> (<profileId>)

Will ADD:
  - User: rahul@contoso.com (Rahul Bansal)
  - User: charanma@... (Charan Mahankali)
  - Team: Field Service RMs (12 members)

Will REMOVE:
  (none)

Already bound (skipping):
  - User: admin@... (no-op)

Could not resolve:
  - someone@external.com — not in this env's system users

Proceed?

Options:

  • Proceed
  • Cancel
Step 5 — POST memberships

Telemetry checkpoint: assign_offline_profile_memberships

For each in to_add, POST sequentially (parallel POSTs occasionally return 429):

User membership:

bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> POST \
  "usermobileofflineprofilememberships" \
  --tenant-id "<tenantId>" \
  --body '{
    "MobileOfflineProfileId@odata.bind": "/mobileofflineprofiles(<profileId>)",
    "SystemUserId@odata.bind": "/systemusers(<systemuserid>)"
  }' \
  --include-headers

Expected 204 with OData-EntityId → capture membership GUID.

Team membership:

bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> POST \
  "teammobileofflineprofilememberships" \
  --tenant-id "<tenantId>" \
  --body '{
    "MobileOfflineProfileId@odata.bind": "/mobileofflineprofiles(<profileId>)",
    "TeamId@odata.bind": "/teams(<teamid>)"
  }' \
  --include-headers

For each in to_remove, DELETE:

bash
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> DELETE \
  "usermobileofflineprofilememberships(<membershipid>)" --tenant-id "<tenantId>"

⚠️ Duplicate handling: POSTing a membership that already exists returns 409 Conflict. The dataverse-request.js wrapper's looksLikeDuplicate rescue treats this as silent success (the Step 3 dedup should catch most cases first). Re-runs are safe.

Step 6 — Verify

Telemetry checkpoint: verify_offline_profile_memberships

Re-query memberships from Step 3 and assert the diff applied:

  • Every to_add now appears in the GET response
  • Every to_remove no longer appears

If the verification disagrees, return BLOCKED: membership writes did not commit and print the discrepancy.

Step 7 — Summary

Print:

✓ Membership updates applied.

  Profile      : <name>
  Total members: <N users + M teams>
  Added        : <list>
  Removed      : <list>
  Skipped      : <list> (already bound)

Users will receive the profile on their next mobile app sign-in. Existing
sessions need to sign out + sign in to trigger the profile pull.

Update memory-bank.md ## Offline profile block:

yaml
membership:
  users: [rahul@..., charanma@...]
  teams: [Field Service RMs]
  lastAssignedAt: 2026-05-19T...

Status code (final line)

  • DONE — every requested add/remove applied; verify confirmed
  • DONE_WITH_CONCERNS: <list> — some UPNs/teams could not be resolved, or --all-app-users matched 0 users (env may not have the role granted yet)
  • NEEDS_CONTEXT: <missing> — couldn't determine profileId (no offline-profile.json, no --profile flags, no profiles in env)
  • BLOCKED: <reason> — auth failure, profile not found in env, or verification disagreement

Failure recovery

Memberships are individually committed (no transaction). If Step 5 fails mid-loop:

  • Partially-added memberships remain (visible in env)
  • Re-running with the same arguments is idempotent (Step 3 dedup catches what's already bound)
  • Use --unassign-* to undo specific bindings if needed

© microsoft, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in plugins/mobile-apps/skills/assign-offline-profile of microsoft/power-platform-skills.

Open the folder on GitHubat commit 8c4b447

Compare with similar skills

Assign Offline Profile next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Assign Offline Profile compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Assign Offline Profile this skillmicrosoft/power-platform-skills979—~2.6kAutomated safety check: NotesMIT
Profileccusage/ccusage19k—~430Automated safety check: PassCustom licence
Cpu ProfileClickHouse/ClickHouse50k—~1.9kAutomated safety check: NotesApache-2.0
Codex Profilessickn33/agentic-awesome-skills47k1 repos~1.7kAutomated safety check: PassMIT
Collectors Snmp Profilesnetdata/netdata81k—~3.1kAutomated safety check: PassGPL-3.0
Alloc ProfileClickHouse/ClickHouse50k—~4.3kAutomated safety check: PassApache-2.0

Similar skills

  • Profile

    ccusage/ccusage

    Profiles ccusage performance. An agent skill from ccusage/ccusage.

    19k GitHub stars~430 tokensUpdated today
    Auto-check passed
  • Cpu Profile

    ClickHouse/ClickHouse

    Profile a ClickHouse query using the sampling query profiler and system.tracelog.

    50k GitHub stars~1.9k tokensUpdated today
    DatabasesAuto-check: notes
  • Codex Profiles

    sickn33/agentic-awesome-skills

    Use codex-profiles to run Codex CLI or Codex Desktop with isolated CODEXHOME profiles for separate accounts, projects, and local state.

    47k GitHub starsUsed in 1 repo~1.7k tokens
    Auto-check passed
  • Author or review Netdata SNMP polling profiles, ddsnmp parsing, topology/licensing/BGP rows and profile-format documentation.

    81k GitHub stars~3.1k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Alloc Profile

    ClickHouse/ClickHouse

    Analyze a jemalloc (or other) allocation profile in collapsed stack format.

    50k GitHub stars~4.3k tokensUpdated today
    DatabasesAuto-check passed
  • Competitor Profiling

    sickn33/agentic-awesome-skills

    When the user wants to research, profile, or analyze competitors from their URLs.

    47k GitHub starsUsed in 1 repo~3.6k tokens
    Marketing & SEOAuto-check passed

More from microsoft/power-platform-skills

All 92 skills in this repo
  • Manage Firewall

    microsoft/power-platform-skills

    Official

    Inspects and configures the web application firewall (WAF) in front of a Power Pages production site.

    979 GitHub stars~4.5k tokensUpdated today
    Auto-check: notes
  • Manage Headers

    microsoft/power-platform-skills

    Official

    Inspects and configures the security headers a Power Pages site sends to browsers — Content Security Policy, frame and clickjacking protection, cross-origin sharing, cookie behavior, and related…

    979 GitHub stars~3k tokensUpdated today
    Auto-check: notes
  • Scan Code

    microsoft/power-platform-skills

    Official

    Scans a Power Pages site project for security issues in source code and dependencies.

    979 GitHub stars~3.4k tokensUpdated today
    Auto-check: notes
  • Scan Site

    microsoft/power-platform-skills

    Official

    Runs a security scan on a deployed Power Pages site, fetches the latest scan report, and produces a plain-language summary.

    979 GitHub stars~3.2k tokensUpdated today
    Auto-check: notes
  • Setup Datamodel

    microsoft/power-platform-skills

    Official

    Creates Dataverse tables, columns, and relationships for a Power Pages site based on a data model proposal.

    979 GitHub stars~4k tokensUpdated today
    Auto-check: notes
  • Add Server Logic

    microsoft/power-platform-skills

    Official

    Creates, edits, and manages Power Pages Server Logic files — server-side JavaScript that runs securely on the Power Pages runtime.

    979 GitHub stars~18k tokensUpdated today
    Auto-check: notes

Questions about Assign Offline Profile

What does Assign Offline Profile do?

A skill your agent uses when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices. Assign Offline Profile is an agent skill from microsoft/power-platform-skills, published by the product's own GitHub organization. Use when the user needs to bind users or teams to a Mobile Offline Profile so they actually receive offline sync on their devices.

When should I use Assign Offline Profile?

Assign Offline Profile fits situations like: the user needs to bind users; teams to a Mobile Offline Profile so they actually receive offline sync on their devices.

How do I install Assign Offline Profile in Claude Code?

Run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a claude-code`. Or copy the skill folder (plugins/mobile-apps/skills/assign-offline-profile in microsoft/power-platform-skills) into .claude/skills/assign-offline-profile in your project. Claude Code loads it when a task matches its description.

How do I install Assign Offline Profile in Codex?

Run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a codex`. Or copy the skill folder (plugins/mobile-apps/skills/assign-offline-profile in microsoft/power-platform-skills) into .agents/skills/assign-offline-profile in your project. Codex loads it when a task matches its description.

Can I use Assign Offline Profile in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add microsoft/power-platform-skills --skill assign-offline-profile -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/assign-offline-profile, .gemini/skills/assign-offline-profile, .github/skills/assign-offline-profile and .opencode/skills/assign-offline-profile in your project.

What does Assign Offline Profile need to run?

Going by SKILL.md and its folder, Assign Offline Profile needs the command-line tools its instructions call (node and just). Its frontmatter pre-approves these tools: Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion.

Does Assign Offline Profile access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Assign Offline Profile safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Assign Offline Profile use?

Assign Offline Profile is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Assign Offline Profile use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Assign Offline Profile?

Skills that share tags, products or a category with Assign Offline Profile: Profile (ccusage/ccusage, 19k stars), Cpu Profile (ClickHouse/ClickHouse, 50k stars), Codex Profiles (sickn33/agentic-awesome-skills, 47k stars) and Collectors Snmp Profiles (netdata/netdata, 81k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Assign Offline Profile?

microsoft (a GitHub organization, an official publisher) maintains it in microsoft/power-platform-skills, which has 979 GitHub stars. The repository holds 92 skills in this directory. The repository was last updated on October 9, 2026.

Source: microsoft/power-platform-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.