feature-evaluator

Manage feature flags, targeting rules, packs, segments, and experiments via MCP tools. Evaluate features, validate expressions, manage workspaces. Use for feature flag management, rule-based targeting, A/B experiments, segment targeting, pack-based feature bundling, and expression testing.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "feature-evaluator" with this command: npx skills add rendis/feature-evaluator/rendis-feature-evaluator-feature-evaluator

Feature Evaluator MCP

MCP integration for the Feature Evaluator — a feature flag system with rule-based evaluation, segment targeting, and pack-based feature bundling.

Setup

Dev Mode (AUTH_DISABLED=true on backend)

make server       # Start API on port 8080
make build-mcp    # Build MCP binary

.mcp.json at project root configures Claude Code to spawn the MCP server with FE_AUTH_TOKEN=dev-token.

OIDC (production)

make build-mcp                                    # Build MCP binary
./apps/mcp/bin/feature-evaluator-mcp login        # Open browser → Keycloak login
./apps/mcp/bin/feature-evaluator-mcp status       # Verify token is valid
./apps/mcp/bin/feature-evaluator-mcp logout       # Clear stored tokens

Remove FE_AUTH_TOKEN from .mcp.json env so the MCP server reads OIDC tokens from ~/.feature-evaluator/tokens.json instead. Tokens auto-refresh via refresh token.

For custom OIDC providers set FE_OIDC_ISSUER and FE_OIDC_CLIENT_ID env vars.

Quick Start Workflow

1. fe_list_workspaces         → discover available workspaces
2. fe_set_workspace           → switch workspace (validates it exists)
3. fe_list_features           → browse existing features
4. fe_create_feature          → create feature (key, name, valueType, defaultValue)
5. fe_create_rule             → add targeting rule with expression
6. fe_validate_expression     → check expression syntax before saving
7. fe_evaluate                → test evaluation with sample context
8. fe_dashboard_stats         → view workspace statistics

Tool Reference

Workspace

ToolPurposeKey Args
fe_list_workspacesList all workspaces
fe_set_workspaceSwitch active workspacekey

Features

ToolPurposeKey Args
fe_list_featuresList features (paginated)search?, value_type?, enabled?, tag?, environment?
fe_get_featureGet feature with ruleskey
fe_create_featureCreate featurekey, name, value_type, default_value, access_policy?, auth_profile_key?
fe_update_featureUpdate featurekey, name, access_policy?, auth_profile_key?
fe_toggle_featureEnable/disablekey, enabled
fe_delete_featureDelete featurekey

Rules

ToolPurposeKey Args
fe_list_rulesList rules for featurefeature_key
fe_create_ruleCreate targeting rulefeature_key, name, expression, value
fe_update_ruleUpdate rulefeature_key, rule_id, name, expression, value
fe_delete_ruleDelete rulefeature_key, rule_id
fe_reorder_rulesReorder rulesfeature_key, rule_ids

Evaluation

ToolPurposeKey Args
fe_evaluateEvaluate single featurefeature_key, context?
fe_bulk_evaluateEvaluate multiple featuresfeature_keys, context?

Packs

ToolPurposeKey Args
fe_list_packsList packssearch?
fe_get_packGet pack detailkey
fe_create_packCreate packkey, name, feature_keys?, tier_key?, inherits_from?, trial_until?
fe_update_packUpdate packkey, name?, description?, feature_keys?, tier_key?, inherits_from?, trial_until?
fe_toggle_packEnable/disablekey, enabled
fe_activate_packActivate on targetkey, target_type, target_id
fe_deactivate_packDeactivate from targetkey, target_type, target_id

Tiers

Tiers are predefined (24 total across 6 categories: entry, growth, advanced, top, special, technical). Assign to packs via tier_key.

ToolPurposeKey Args
fe_list_tiersList all predefined tiers

Segments

ToolPurposeKey Args
fe_list_segmentsList segmentssearch?
fe_get_segmentGet segment detailkey
fe_create_segmentCreate segmentkey, name

Expressions

ToolPurposeKey Args
fe_validate_expressionValidate syntaxexpression
fe_test_expressionTest with contextexpression, context

Experiments

ToolPurposeKey Args
fe_list_experimentsList experimentsstatus?
fe_get_experimentGet experimentid
fe_create_experimentCreate experimentfeature_key, name
fe_manage_experimentLifecycle controlid, action (start/pause/complete)

Dashboard & Audit

ToolPurposeKey Args
fe_dashboard_statsWorkspace statistics
fe_list_tagsList tags
fe_audit_errorsEvaluation errorsfeature?
fe_changelogChange historyentity?

Expression Language (expr-lang)

Rules use expr-lang/expr. Full reference: references/expressions.md

Eval Request

{
  "featureKey": "my-feature",
  "context": {
    "user": { "id": "u-1", "email": "alice@empresa.com", "role": "admin" },
    "tenant": { "id": "t-1" },
    "campus": { "id": "c-1" },
    "program": { "id": "p-1" },
    "custom": { "country": "US" }
  },
  "environment": "production"
}

Each context key becomes a top-level variable in expressions (user.*, tenant.*, etc.).

Expression Variables

VariableSource
user.*, tenant.*, campus.*, program.*context in request body
headers.*HTTP headers (via feature InputContract)
requestBody.*Request body fields
authenticatedTrue if auth profile validation passed
derived.emailJWT email claim, fallback context.user.email
derived.userIdJWT sub claim, fallback context.user.id
derived.subjectJWT sub claim (no fallback)
derived.nameJWT name claim (no fallback)
derived.bearerTokenPresentTrue if Bearer token in request
derived.apiKeyPresentTrue if API key in request

JWT auto-extraction: Send Authorization: Bearer <jwt> → claims sub, email, name auto-populate derived.*. JWT claims take priority over context body.

Builtin Functions

FunctionDescription
now()Current UTC time
dateBefore(date, ref)True if date < ref (RFC3339, YYYY-MM-DD)
dateAfter(date, ref)True if date > ref
contains(val, needle)String containment
startsWith(val, prefix)String prefix
endsWith(val, suffix)String suffix
inSegment(key)Segment membership check
externalApi(key)External API validation

Common Patterns

# Email targeting (from JWT)
derived.email == "admin@empresa.com"
endsWith(derived.email, "@empresa.com")

# Email targeting (from context body)
user.email == "admin@empresa.com"

# Auth + role
authenticated && user.role == "admin"

# Segments
inSegment("beta-users")

# Date range
dateAfter(now(), "2025-06-01") && dateBefore(now(), "2025-12-31")

# Combined
tenant.id == "acme" && inSegment("early-access") && authenticated

Security Limits

Max AST depth: 10, max nodes: 100, max inSegment() calls: 5, max string length: 1000. Denied: exec, system, import, require, proto, constructor, prototype, eval, Function, process.

Known API Behaviors

  • List responses: {"data": [...], "pagination": {"page": 1, "pageSize": 20, "total": N, "totalPages": M}}
  • Toggle/Delete: return 204 No Content
  • Errors: {"error": {"code": "...", "message": "...", "messageKey": "..."}}
  • Pack targets: tenant, campus, program
  • Value types: boolean, string, number, json
  • Access policies: public (default), optional, required

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

pdf-forge

No summary provided by upstream source.

Repository SourceNeeds Review
General

surveygo

No summary provided by upstream source.

Repository SourceNeeds Review
General

mock-loom

No summary provided by upstream source.

Repository SourceNeeds Review