Workos
usenotra/notra
A skill your agent uses when the user asks for a WorkOS docs URL, term, or dashboard field (Sign-in endpoint, initiateloginuri, Redirect URI, WORKOS env vars), or is implementing, debugging, or…
A skill your agent uses when implementing authorization and access control for FrontMCP tools, resources, prompts, or skills, deciding who may invoke what.
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install agentfront/frontmcp frontmcp-authorities --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .claude/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.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/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .claude/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authoritiesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install agentfront/frontmcp frontmcp-authorities --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .agents/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .agents/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install agentfront/frontmcp frontmcp-authorities --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .cursor/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .cursor/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/agentfront/frontmcp.git --path libs/skills/catalog/frontmcp-authorities--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install agentfront/frontmcp frontmcp-authorities --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .gemini/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .gemini/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install agentfront/frontmcp frontmcp-authoritiesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .github/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .github/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .github/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add agentfront/frontmcp --skill frontmcp-authorities -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install agentfront/frontmcp frontmcp-authorities --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/agentfront/frontmcp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/libs/skills/catalog/frontmcp-authorities .opencode/skills/frontmcp-authorities && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "frontmcp-authorities" agent skill from https://github.com/agentfront/frontmcp/tree/main/libs/skills/catalog/frontmcp-authorities into .opencode/skills/frontmcp-authorities/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontmcp-authorities", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
frontmcp-authoritiesA skill your agent uses when implementing authorization and access control for FrontMCP tools, resources, prompts, or skills, deciding who may invoke what.
Frontmcp Authorities is an agent skill from agentfront/frontmcp. Use when implementing authorization and access control for FrontMCP tools, resources, prompts, or skills, deciding who may invoke what. Covers the RBAC, ABAC, and ReBAC models and when to choose each; JWT claims mapping per identity provider (Auth0, Keycloak, Okta, Cognito, Frontegg); reusable named authority profiles; and custom authority evaluators for domain-specific policy. This is about who-can-do-what (permissions, roles, scopes), distinct from configuring auth modes and login (see frontmcp-config) and…
Its SKILL.md is about 7.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/authority-profiles.md`, `references/claims-mapping.md` and `references/custom-evaluators.md`).
It sits in Backend & APIs, covering Authorization and RBAC and Authentication. It works with Auth0, Okta and Model Context Protocol. The repository describes itself as: TypeScript-first framework for the Model Context Protocol (MCP). You write clean, typed code; FrontMCP handles the protocol, transport, DI, session/auth, and execution flow. The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8f59ba8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.agentfront.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Frontmcp Authorities loads about 7.1k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 181 tokens; SKILL.md has 2,127 words of instructions outside code blocks.
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.
The automated check found no risky patterns in SKILL.md.
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.
The full file from agentfront/frontmcp at commit 8f59ba8, republished under its Apache-2.0 licence (© agentfront). 2,127 words, ~7,118 tokens.
.claude/skills/frontmcp-authorities/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Built-in RBAC/ABAC/ReBAC authorization system for FrontMCP entry types. Each flow has native checkEntryAuthorities and filterByAuthorities stages that enforce access control policies declared via the authorities field on entry decorators. Configured via @FrontMcp({ authorities: { claimsMapping, profiles, scopeMapping } }) — no plugin needed. Flow stages handle enforcement, and developers can hook into them with Will, Did, and Around decorators. Supports named profiles for reuse, JWT claims mapping for any identity provider, inline policies with roles/permissions/attributes/relationships, and composable combinators (allOf, anyOf, not).
@Skill({ authorities }))frontmcp-config / configure-auth)mode: 'public')configure-auth-modes)Decision: Use this skill whenever you need to control who can access which entries based on roles, permissions, attributes, or relationships.
Before writing any authorities configuration, the coding agent MUST ask the developer:
"What identity provider (IdP) are you using, and what does your JWT payload look like? I need to know where roles, permissions, and tenant ID are located in the claims."
Why this matters: Every IdP places roles and permissions in different JWT claim paths. Auth0 uses namespaced URIs (https://myapp.com/roles), Keycloak nests them under realm_access.roles, Okta uses groups, Cognito uses cognito:groups, and Frontegg uses flat roles/permissions. Writing claimsMapping without knowing the actual token shape will produce silent authorization failures where every user is denied.
What to collect before proceeding:
realm_access.roles)permissions or scope)org_id, tenantId)See references/claims-mapping.md for IdP-specific claim paths.
@frontmcp/sdk)@frontmcp/auth available (peer dependency of SDK, provides all authorities types)frontmcp-config / configure-auth-modes) so that authInfo is populated on incoming requestsAdd the authorities field to your @FrontMcp decorator. No plugin import needed — authorities is a built-in framework feature.
import { FrontMcp } from '@frontmcp/sdk';
@FrontMcp({
info: { name: 'my-server', version: '1.0.0' },
authorities: {
// configured in next steps
},
})
export class MyServer {}Set claimsMapping to tell the engine where roles, permissions, and user/tenant identifiers live in your IdP's JWT. Each value is a dot-path into the decoded JWT claims object.
// Keycloak example — in @FrontMcp({ authorities: { ... } })
authorities: {
claimsMapping: {
roles: 'realm_access.roles',
permissions: 'resource_access.my-client.roles',
tenantId: 'org_id',
userId: 'sub',
},
}
// Auth0 example
authorities: {
claimsMapping: {
roles: 'https://myapp.com/roles',
permissions: 'permissions',
tenantId: 'org_id',
},
}If no claimsMapping is provided, the engine falls back to (in order):
authInfo.user.roles → authInfo.extra.authorization.scopes → []authInfo.user.permissions → []The OAuth-scopes-as-roles fallback means a token with no roles claim but with scope: "admin read" will be treated as having roles: ['admin', 'read']. Configure explicit claimsMapping.roles to opt out. For non-standard token shapes, use claimsResolver instead (see Common Patterns below).
Profiles let you define reusable authorization policies and reference them by name in decorators. Register them in the profiles field.
// In @FrontMcp({ authorities: { ... } })
authorities: {
claimsMapping: { roles: 'realm_access.roles', permissions: 'scope' },
profiles: {
admin: {
roles: { any: ['admin', 'superadmin'] },
},
authenticated: {
attributes: {
conditions: [{ path: 'user.sub', op: 'exists', value: true }],
},
},
matchTenant: {
attributes: {
conditions: [
{ path: 'claims.org_id', op: 'eq', value: { fromInput: 'tenantId' } },
],
},
},
editor: {
permissions: { any: ['content:write', 'content:publish'] },
},
},
}For type-safe profile names, augment the global interface:
declare global {
interface FrontMcpAuthorityProfiles {
admin: true;
authenticated: true;
matchTenant: true;
editor: true;
}
}Use the authorities field on any entry decorator (@Tool, @Resource, @Prompt, @Skill). Three forms are supported:
String (profile reference):
@Tool({ name: 'delete_user', authorities: 'admin' })
export default class DeleteUserTool extends ToolContext { ... }String array (multiple profiles, AND semantics):
@Tool({ name: 'update_tenant_settings', authorities: ['authenticated', 'matchTenant'] })
export default class UpdateTenantSettingsTool extends ToolContext { ... }Inline policy object:
@Tool({
name: 'publish_content',
authorities: {
roles: { any: ['editor', 'admin'] },
permissions: { all: ['content:publish'] },
},
})
export default class PublishContentTool extends ToolContext { ... }Combinators for complex policies:
@Tool({
name: 'sensitive_action',
authorities: {
allOf: [
{ roles: { any: ['admin'] } },
{ attributes: { conditions: [{ path: 'env.NODE_ENV', op: 'eq', value: 'production' }] } },
],
},
})
export default class SensitiveActionTool extends ToolContext { ... }Async guards (one-shot DB/Redis/API checks):
For dynamic, async authorization that does not warrant a reusable custom evaluator, use the
guards field. Each guard receives the same AuthoritiesEvaluationContext and returns
true on grant, or false/a denial string on deny. Only true grants: anything else
(undefined from a guard that forgot to return, null, 0, an object) denies. Guards run
in sequence and combine with other policy fields via operator (default AND).
import type { AuthorityGuardFn } from '@frontmcp/auth';
const requireActiveSubscription: AuthorityGuardFn = async (ctx) => {
if (ctx.user.sub === undefined) return 'sign-in required';
const active = await db.isSubscriptionActive(ctx.user.sub);
return active ? true : 'subscription is not active';
};
@Tool({
name: 'premium_feature',
authorities: {
roles: { any: ['user'] },
guards: [requireActiveSubscription],
},
})
export default class PremiumFeatureTool extends ToolContext { ... }Use guards for one-off async checks; promote to a registered custom evaluator when the
same logic is reused across many entries (see references/custom-evaluators.md).
scopeMapping)If your transport layer issues OAuth scope challenges (RFC 6750 insufficient_scope),
declare a scopeMapping so authority denials are converted into the right WWW-Authenticate
challenge with the required scopes. Mapping is explicit only — no automatic
permission-to-scope inference.
authorities: {
scopeMapping: {
roles: { admin: ['admin:all'] },
permissions: { 'repo:write': ['repo'] },
profiles: { admin: ['admin:all'] },
},
}When a request is denied because the user lacks role admin, the response surfaces
the admin:all scope as the required challenge.
pipes)pipes are functions that run during auth context construction and merge their output into
FrontMcpAuthContext. Use them to extract custom typed fields from JWT claims so they are
available to your tools as strongly typed accessors. Declare the resulting fields by
augmenting ExtendFrontMcpAuthContext:
A pipe receives the raw JWT claims (a Readonly<Record<string, unknown>>) and
returns a Partial<ExtendFrontMcpAuthContext> (sync or async). It does not
receive the AuthInfo envelope — there is no .user accessor on the input.
// Pipe signature (defined inline; do not import — AuthContextPipe is not
// re-exported from `@frontmcp/auth`):
// (claims: Readonly<Record<string, unknown>>) =>
// Partial<ExtendFrontMcpAuthContext> | Promise<Partial<ExtendFrontMcpAuthContext>>
const tenantPipe = (claims: Readonly<Record<string, unknown>>) => ({
tenantId: claims['tenantId'] as string | undefined,
});
declare global {
interface ExtendFrontMcpAuthContext {
tenantId?: string;
}
}
// In @FrontMcp({ authorities: { ... } })
authorities: {
pipes: [tenantPipe],
}Tools, resources, agents and jobs (workflow steps included) run the pipes when their context is built, before any hook
or execute() reads this.auth, so this.auth.tenantId is set there. Pipes can be async; one that throws is logged
and leaves its fields undefined. Pipes extend this.auth only -- authority policies still evaluate the claims from
claimsMapping / claimsResolver. Up to 1.8.7 pipes never ran (their fields were always undefined).
@Skill({ authorities }))authorities on @Skill is enforced exactly like the other entry types, across
every surface a skill is served from:
AuthorityDeniedError (MCP code -32003), the same as a denied tools/call.
Covers skills/load (MCP) and skill://<path>/SKILL.md and skill://<path>/<file>
reads (SEP-2640). Over HTTP, GET /skills/{id} answers 404 for such a skill, as
for an unknown one.skills/search / skills/list (MCP), the skill://index.json discovery index and
skill-path autocomplete (SEP-2640), and GET /skills (HTTP).@Skill({ name: 'review-pr', description: '…', instructions: '…' }) // open to all
@Skill({ name: 'internal-runbook', description: '…', instructions: '…',
authorities: 'admin' }) // admins onlyTwo limitations to design around:
{ fromInput: '…' } ABAC/ReBAC policies can't be evaluated when
filtering and will hide the skill from discovery. Use role/permission/claims
authorities for discoverable skills; input-dependent policies still enforce at
load time. (Same limitation applies to tools/resources/prompts.)skillsConfig.auth. With 'inherit' (the default),
GET /skills, /llm.txt and /llm_full.txt run the server's own auth, and gated
skills are evaluated against the caller it verified. 'api-key', 'bearer' and
'public' surface no claims, so there gated skills are left out of every listing and
GET /skills/{id} answers 404 for them. Ungated skills are unaffected.Boot-time fail-fast covers skills too: a @Skill with authorities but no configured
authorities engine fails server startup with AuthConfigurationError, exactly like a
tool, resource, resource template, prompt, agent, or a tool declared inside an agent
(hidden entries included).
Startup fails with AuthConfigurationError: Invalid authorities rule: … when an entry's or a
profile's rule checks nothing or isn't what it looks like, and AuthoritiesEngine.evaluate()
denies such a rule if it runs anyway (even under not):
{}, { roles: {} }, { roles: { all: [] } }, allOf: [], guards: []role:), a profile name no profile has (authorities: 'admn'), a profile name inside
allOf/anyOf, an operator other than 'AND'/'OR'value, or one the operator can't use: exists needs true/false;
in/notIn a non-empty list; gt/gte/lt/lte a number; startsWith/endsWith/matches
a string (a { fromInput } / { fromClaims } reference works for all but exists)To leave an entry open, remove its authorities. There is no opt-out.
@Agent({ authorities }) gates the agent's invoke_<id> tool like any tool (hidden from
tools/list, refused on tools/call), and tools declared inside an agent are checked against
the caller the agent runs for, also with execution.useToolFlow: false.
| Scenario | Approach | Reference |
|---|---|---|
| Simple role gate (admin-only tool) | authorities: 'admin' profile | references/authority-profiles.md |
| Gate skill discovery + load | @Skill({ authorities: 'admin' }) (role/permission/claims-based) | references/authority-profiles.md |
| Permission-based access | authorities: { permissions: { all: ['x'] } } | references/rbac-abac-rebac.md |
| Tenant isolation | ABAC with { fromInput: 'tenantId' } | references/rbac-abac-rebac.md |
| Resource ownership check | ReBAC with relationship resolver | references/rbac-abac-rebac.md |
| IP allowlist or custom logic | Custom evaluator via custom.* | references/custom-evaluators.md |
| Different IdP (Auth0/Keycloak/Okta) | Configure claimsMapping | references/claims-mapping.md |
| Admin OR (editor AND same-tenant) | anyOf / allOf combinators | references/authority-profiles.md |
| Custom pre/post authority logic | Hook with Will/Did/Around on checkEntryAuthorities stage | references/custom-evaluators.md |
| Replace built-in check with OPA/Cedar | Around('checkEntryAuthorities') hook | references/custom-evaluators.md |
| Audit authority decisions | Did('checkEntryAuthorities') hook for logging/metrics | references/custom-evaluators.md |
| Tenant allowlist in Redis/DB | Async custom evaluator with custom.* field | references/custom-evaluators.md |
| Subscription check before tool runs | Async custom evaluator or Will('checkEntryAuthorities') hook | references/custom-evaluators.md |
| Feature flag gate on a tool | Async custom evaluator checking flag service | references/custom-evaluators.md |
| Pattern | Correct | Incorrect | Why |
|---|---|---|---|
| Claims mapping | claimsMapping: { roles: 'realm_access.roles' } | claimsMapping: { roles: 'roles' } (for Keycloak) | Keycloak nests roles under realm_access.roles; using the wrong path silently resolves to [] |
| Profile reference | authorities: 'admin' | authorities: { profile: 'admin' } | Profiles are referenced as plain strings, not nested objects |
| Multiple profiles | authorities: ['authenticated', 'matchTenant'] | authorities: 'authenticated, matchTenant' | Use an array, not a comma-separated string |
| Inline RBAC | { roles: { any: ['admin'] } } | { roles: ['admin'] } | roles expects an object with all and/or any arrays |
| Dynamic value ref | { fromInput: 'tenantId' } | '{{ tenantId }}' | Use DynamicValueRef objects, not template strings |
| OR combinator | { anyOf: [policy1, policy2] } | { operator: 'OR', ...policy1, ...policy2 } | Use anyOf for clarity; operator applies to top-level fields within a single policy |
| ReBAC resolver | Register relationshipResolver in plugin options | Inline the DB query in the policy | The resolver is a separate interface; policies only declare the relationship to check |
authorities: { ... } is set on the @FrontMcp decoratorclaimsMapping paths match the actual JWT token structure from your IdPauthorities: 'name' are registered in profilespublic) so authInfo is populatedrelationshipResolver is provided in plugin optionstools/list response omits entries the caller is not authorized to see{ fromInput: ... } resolve correctly from tool argumentsAuthoritiesResult objectsFrontMcpAuthorityProfiles is augmented for type-safe profile references@frontmcp/auth is imported so the authorities field is available on decorators| Problem | Cause | Solution |
|---|---|---|
Startup: Invalid authorities rule: … names an unknown profile "admin" | Profile used in decorator but not in authorities.profiles config | Fix the name, or add the profile to the profiles field in @FrontMcp({ authorities }) |
| All users denied despite correct roles | claimsMapping.roles path does not match the actual JWT claim path | Decode a real JWT and verify the dot-path resolves to the roles array |
authorities field not recognized on decorator | @frontmcp/auth not imported (metadata augmentation not active) | Add import '@frontmcp/auth' (or import type ... from '@frontmcp/auth') anywhere in your project to activate the metadata augmentation. There is no @frontmcp/auth/authorities subpath. |
| ABAC condition always fails | { fromInput: 'tenantId' } but tool input field is named tenant_id | The fromInput key must exactly match the tool's input schema field name |
| ReBAC always denies | No relationshipResolver provided | Implement RelationshipResolver and pass it to plugin options |
| Custom evaluator not found | Key in custom.* policy does not match registered evaluator name | Ensure the evaluator is registered with the same key used in the policy |
| List endpoints show all entries | No authorities config in @FrontMcp() or hook priority conflict | Verify authorities: { ... } is set on @FrontMcp() decorator |
AuthorityDeniedError has no detail | deniedBy field shows generic message | Check the evaluatedPolicies array on the error for which policy type failed |
TS error: evaluators/relationshipResolver/claimsResolver not on AuthoritiesConfig | The runtime Zod schema accepts these keys but the exported AuthoritiesConfig interface in authorities.profiles.ts only declares claimsMapping, profiles, scopeMapping, pipes. | Pass the config inline (TS infers from the decorator's broader type) or cast the typed config as the interface catches up. |
This skill currently exposes only references; see references/ for guidance.
Skills are distributed as plain SKILL.md files plus a sibling references/
and examples/ tree, so consumers can pick whichever access mode fits:
| Mode | How it works |
|---|---|
| Filesystem | Read libs/skills/catalog/frontmcp-authorities/ directly from a clone of the catalog repo, or from a published @frontmcp/skills install. SKILL.md is the entry point. |
frontmcp CLI | frontmcp skills list, frontmcp skills read frontmcp-authorities, frontmcp skills read frontmcp-authorities:references/<file>.md, frontmcp skills install frontmcp-authorities — no server required. |
MCP skill:// | When a developer mounts this skill into their own FrontMCP server (@FrontMcp({ skills: [...] })), the SDK exposes it via SEP-2640 resources: skill://frontmcp-authorities/SKILL.md, skill://frontmcp-authorities/references/{file}.md, etc. The server’s skill://index.json returns the SEP-2640 discovery document for everything mounted on it. |
The catalog itself is not an MCP server. The skill:// URIs only resolve
when a server has been configured to host this skill.
libs/auth/src/authorities/ (engine, types, evaluators), flow stages in libs/sdk/src/tool/flows/, libs/sdk/src/resource/flows/, libs/sdk/src/prompt/flows/, libs/sdk/src/agent/flows/frontmcp-config, frontmcp-development, frontmcp-extensibility© agentfront, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in libs/skills/catalog/frontmcp-authorities of agentfront/frontmcp.
Open the folder on GitHubat commit 8f59ba8
Frontmcp Authorities 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Frontmcp Authorities this skillagentfront/frontmcp | 146 | — | ~7.1k | Automated safety check: Pass | Apache-2.0 | |
| Workosusenotra/notra | 255 | — | ~6.2k | Automated safety check: Pass | AGPL-3.0 | |
| Iam Auditbriiirussell/cybersecurity-skills | 412 | — | ~3.1k | Automated safety check: Notes | MIT | |
| Cometchat Securitycometchat/cometchat-skills | 129 | 1 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Spring Security JWTrrezartprebreza/spring-boot-skills | 296 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Convex Setup Authwaynesutton/markdown-site | 628 | — | ~1.4k | Automated safety check: Pass | MIT |
usenotra/notra
A skill your agent uses when the user asks for a WorkOS docs URL, term, or dashboard field (Sign-in endpoint, initiateloginuri, Redirect URI, WORKOS env vars), or is implementing, debugging, or…
briiirussell/cybersecurity-skills
Audit, design, and migrate Identity and Access Management — cloud provider IAM (AWS, GCP, Azure), identity providers (Okta, Entra ID / Azure AD, Auth0, Google Workspace), application authorization…
cometchat/cometchat-skills
Enterprise auth & access control for CometChat — SSO/OIDC/SAML via your own IdP, server-minted auth tokens, token revocation & session control, and role-based access (RBAC app-wide roles + group…
rrezartprebreza/spring-boot-skills
A skill your agent uses when an application issues and validates its own first-party JWT access and refresh tokens, including authentication filters, password encoding, RBAC, and method security.
waynesutton/markdown-site
Set up Convex authentication with proper user management, identity mapping, and access control patterns.
Amplicode/spring-skills
Creates a Spring Security configuration class with authentication, authorization, and HTTP protection setup.
agentfront/frontmcp
A skill your agent uses when customizing, branding, or replacing the built-in FrontMCP OAuth pages (the login, consent, federated-select, incremental-authorization, and error pages) with your own…
agentfront/frontmcp
A skill your agent uses when pushing real-time notifications or events into Claude Code (or another MCP client) sessions, or building two-way chat bridges.
agentfront/frontmcp
A skill your agent uses when extending FrontMCP beyond the core SDK by integrating external npm packages, libraries, or third-party services into providers and tools.
agentfront/frontmcp
A skill your agent uses when adding tracing, structured logging, metrics, or monitoring to a FrontMCP server.
agentfront/frontmcp
A skill your agent uses when configuring a FrontMCP server through frontmcp.config or the @FrontMcp options.
agentfront/frontmcp
A skill your agent uses when deploying, building for production, packaging, or shipping a FrontMCP server.
Works with
Categories
A skill your agent uses when implementing authorization and access control for FrontMCP tools, resources, prompts, or skills, deciding who may invoke what. Frontmcp Authorities is an agent skill from agentfront/frontmcp. Use when implementing authorization and access control for FrontMCP tools, resources, prompts, or skills, deciding who may invoke what.
Frontmcp Authorities fits situations like: implementing authorization and access control for FrontMCP tools; deciding who may invoke what.
Run `npx skills add agentfront/frontmcp --skill frontmcp-authorities -a claude-code`. Or copy the skill folder (libs/skills/catalog/frontmcp-authorities in agentfront/frontmcp) into .claude/skills/frontmcp-authorities in your project. Claude Code loads it when a task matches its description.
Run `npx skills add agentfront/frontmcp --skill frontmcp-authorities -a codex`. Or copy the skill folder (libs/skills/catalog/frontmcp-authorities in agentfront/frontmcp) into .agents/skills/frontmcp-authorities in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add agentfront/frontmcp --skill frontmcp-authorities -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frontmcp-authorities, .gemini/skills/frontmcp-authorities, .github/skills/frontmcp-authorities and .opencode/skills/frontmcp-authorities in your project.
SKILL.md names no scripts, command-line tools or credentials: Frontmcp Authorities is instructions for the agent only.
SKILL.md names 1 domain. As links in the text: docs.agentfront.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Frontmcp Authorities is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.1k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 13k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Frontmcp Authorities: Workos (usenotra/notra, 255 stars), Iam Audit (briiirussell/cybersecurity-skills, 412 stars), Cometchat Security (cometchat/cometchat-skills, 129 stars) and Spring Security JWT (rrezartprebreza/spring-boot-skills, 296 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
agentfront (a GitHub organization) maintains it in agentfront/frontmcp, which has 146 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 7, 2026.
Source: agentfront/frontmcp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.