sap-fiori-url-generator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sap-fiori-url-generator (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill enables you to generate SAP Fiori Launchpad (FLP) URLs based on app names from the AppList.json file.
When you need to look up SAP Fiori app information:
App List Database: Read @skills/sap-fiori-apps-reference/references/AppList.json - contains all SAP Fiori apps with their Semantic Object-Action mappings, App IDs, descriptions, and technical details.
Use this reference to:
The AppList.json data can be obtained from SAP's Fiori Apps Library:
This ensures the app list stays current with the latest SAP Fiori applications.
When a user provides:
https://myserver.com:44300)You will:
The complete SAP Fiori Launchpad URL follows this pattern:
{BASE_URL}/sap/bc/ui2/flp?sap-client={CLIENT}&sap-language={LANGUAGE}#{SEMANTIC_OBJECT}-{ACTION}https://myserver.com:44300)100)EN, DE, FR)EN if not specified by userFirst, read the AppList.json file to access the app data:
const fs = require('fs');
const appList = JSON.parse(fs.readFileSync('AppList.json', 'utf8'));Search for the app by name (case-insensitive, partial match):
function findAppByName(appName) {
const normalizedSearch = appName.toLowerCase().trim();
return appList.find(app =>
app['App Name'] &&
app['App Name'].toLowerCase().includes(normalizedSearch)
);
}Get the "Semantic Object - Action" field:
function getSemanticObjectAction(app) {
const semanticAction = app['Semantic Object - Action'];
if (!semanticAction || semanticAction === 'NaN' || semanticAction === null) {
throw new Error('No Semantic Object-Action found for this app');
}
return semanticAction;
}Build the complete FLP URL:
function generateFioriUrl(baseUrl, client, semanticAction, language = 'EN') {
// Validate required parameters
if (!baseUrl) {
throw new Error('BASE_URL is required and must be provided by user');
}
if (!client) {
throw new Error('sap-client is required and must be provided by user');
}
// Remove trailing slash from base URL if present
const cleanBaseUrl = baseUrl.replace(/\/$/, '');
return `${cleanBaseUrl}/sap/bc/ui2/flp?sap-client=${client}&sap-language=${language}#${semanticAction}`;
}https://myserver.com:44300 (USER MUST PROVIDE)100 (USER MUST PROVIDE)Create Maintenance Request (USER MUST PROVIDE)EN (optional - defaults to EN if not specified)MaintenanceWorkRequest-createhttps://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=EN#MaintenanceWorkRequest-createIf the app name is not found in AppList.json:
Error: App "{app_name}" not found in AppList.json
Suggestion: Check spelling or try searching with partial nameIf the app exists but has no Semantic Object-Action:
Error: App "{app_name}" (ID: {app_id}) does not have a Semantic Object-Action defined
Note: This app may not be launchable via FLP URLIf multiple apps match the search term:
Found multiple apps matching "{search_term}":
1. App Name 1 (ID: F1234)
2. App Name 2 (ID: F5678)
Please specify which app you wantWhen an exact match isn't found, suggest similar apps:
function findSimilarApps(searchTerm, limit = 5) {
const normalized = searchTerm.toLowerCase();
return appList
.filter(app =>
app['App Name'] &&
app['App Name'].toLowerCase().includes(normalized)
)
.slice(0, limit)
.map(app => ({
name: app['App Name'],
id: app['App ID'],
semanticAction: app['Semantic Object - Action']
}));
}Provide additional app information:
function getAppDetails(app) {
return {
name: app['App Name'],
id: app['App ID'],
description: app['App Description'],
semanticAction: app['Semantic Object - Action'],
technicalCatalog: app['Technical Catalog'],
transactionCode: app['Transaction Codes'],
component: app['Application Component']
};
}User: "Generate URL for Create Maintenance Request app with base URL https://myserver.com:44300 and client 100"
Response:
App Found: Create Maintenance Request (F1511A)
Semantic Object-Action: MaintenanceWorkRequest-create
Generated URL:
https://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=EN#MaintenanceWorkRequest-createUser: "Generate URL for Create Maintenance Request in German, base URL https://myserver.com:44300, client 100"
Response:
App Found: Create Maintenance Request (F1511A)
Semantic Object-Action: MaintenanceWorkRequest-create
Generated URL:
https://myserver.com:44300/sap/bc/ui2/flp?sap-client=100&sap-language=DE#MaintenanceWorkRequest-createUser: "Generate URL for Create Maintenance Request"
Response:
Error: Missing required parameters
Please provide:
- Base URL (e.g., https://myserver.com:44300)
- SAP Client (e.g., 100)
- App Name (provided: Create Maintenance Request)
- Language (optional, defaults to EN)
Example: Generate URL for "Create Maintenance Request" with base URL https://myserver.com:44300 and client 100User: "Find apps related to 'Workflow'"
Response:
Found 8 apps matching "Workflow":
1. Manage Workflows (F2190)
Action: Workflow-showList
2. Workflow Component (F2506)
Action: Not available
3. Manage Workflow Templates (F2787)
Action: WorkflowTemplate-showList
4. Manage Workflows - For Bank Accounts (F2796)
Action: BankAccount-workflowShowList
5. Manage Workflow Scenarios (F3067)
Action: WorkflowScenario-showList
To generate a URL, please provide:
- Base URL (e.g., https://myserver.com:44300)
- SAP Client (e.g., 100)
- Which app you want from the list aboveCommon SAP language codes:
EN - EnglishDE - German (Deutsch)ES - Spanish (Español)FR - French (Français)IT - Italian (Italiano)PT - Portuguese (Português)ZH - Chinese (中文)JA - Japanese (日本語)KO - Korean (한국어)Each app entry contains:
Some apps may have NaN or null values for certain fields. Always check:
http:// or https://)sap-language=EN as default if not specifiedconst fs = require('fs');
class FioriUrlGenerator {
constructor(appListPath) {
this.apps = JSON.parse(fs.readFileSync(appListPath, 'utf8'));
}
findApp(appName) {
const normalized = appName.toLowerCase().trim();
return this.apps.find(app =>
app['App Name'] &&
app['App Name'].toLowerCase().includes(normalized)
);
}
generateUrl(baseUrl, client, appName, options = {}) {
const { language = 'EN' } = options;
// Validate required parameters
if (!baseUrl) {
throw new Error('Base URL is required - must be provided by user');
}
if (!client) {
throw new Error('SAP Client is required - must be provided by user');
}
// Find the app
const app = this.findApp(appName);
if (!app) {
throw new Error(`App "${appName}" not found`);
}
// Extract semantic action
const semanticAction = app['Semantic Object - Action'];
if (!semanticAction || semanticAction === 'NaN') {
throw new Error(`App "${app['App Name']}" has no Semantic Object-Action`);
}
// Clean base URL
const cleanBaseUrl = baseUrl.replace(/\/$/, '');
// Construct URL
return {
url: `${cleanBaseUrl}/sap/bc/ui2/flp?sap-client=${client}&sap-language=${language}#${semanticAction}`,
appDetails: {
name: app['App Name'],
id: app['App ID'],
description: app['App Description'],
semanticAction: semanticAction
}
};
}
}
// Usage - User MUST provide base URL and client
const generator = new FioriUrlGenerator('./AppList.json');
const result = generator.generateUrl(
'https://myserver.com:44300', // User provided
'100', // User provided
'Create Maintenance Request', // User provided
{ language: 'EN' } // Optional - defaults to EN
);
console.log(result.url);This skill enables seamless SAP Fiori URL generation by:
The generated URLs can be directly used to launch SAP Fiori apps in the Fiori Launchpad.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.