Enables retrieval of configuration metadata from SAP SuccessFactors OData APIs, allowing users to query entity metadata, Role-Based Permission (RBP) roles, role permissions, dynamic groups, and effective user permissions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SF-MCPList all permission roles in instance 'mycompany'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SF-MCP: SAP SuccessFactors MCP Server
A secure Model Context Protocol (MCP) server providing 29 tools for querying and managing SAP SuccessFactors via OData APIs.
Overview
This MCP server enables Claude Desktop (or any MCP-compatible client) to interact with SAP SuccessFactors. It provides tools for configuration management, role-based permissions (RBP), data querying, HR operations, and cross-instance comparison.
Features
Tools (29 total)
Category | Tool | Description |
Configuration |
| Retrieve OData metadata for any entity |
Configuration |
| Discover all available OData entities |
Configuration |
| Compare entity config between instances |
RBP Security |
| List all Role-Based Permission roles |
RBP Security |
| Get permissions for specific roles |
RBP Security |
| Get all permissions for a user |
RBP Security |
| Get roles assigned to a user |
RBP Security |
| Map UI labels to permission types |
RBP Security |
| Check if user has specific permission |
RBP Security |
| List permission groups (dynamic groups) |
RBP Audit |
| View modification history for roles |
RBP Audit |
| View history of role assignments |
Data Query |
| Flexible OData queries with filtering |
Data Validation |
| Get dropdown/picklist options |
Employee Lookup |
| Get complete employee profile with job info and manager |
Employee Lookup |
| Find employees by name, department, location, or manager |
Employee Lookup |
| View job history (promotions, transfers, title changes) |
Employee Lookup |
| Get a manager's team roster with direct/indirect reports |
Time Off |
| Check vacation/PTO/sick leave balances |
Time Off |
| See who's out in a date range (absence calendar) |
Time Off |
| View pending time-off requests for approval tracking |
Hiring |
| List job requisitions with status and hiring manager |
Hiring |
| Track candidates through hiring stages |
Hiring |
| List recent/upcoming new hires for onboarding |
Compliance |
| List terminated employees for exit processing |
Compliance |
| Find employees with incomplete profiles |
Compliance |
| Find upcoming work anniversaries for recognition |
Performance |
| Track review form completion across the org |
Compensation |
| Get compensation breakdown with pay components |
Security Features
Input Validation: Regex-based validation prevents OData injection attacks
XXE Protection: Uses
defusedxmllibrary for safe XML parsingAudit Logging: JSON-structured logs compatible with Cloud Logging
Per-Request Authentication: Credentials required on every tool call (no stored defaults)
Prerequisites
Python 3.10 or higher
uv package manager
SAP SuccessFactors account with API access
Installation
Clone or download this repository
Install dependencies
cd sf-mcp uv syncAuthentication & Configuration
Each tool call requires the following parameters:
data_center: SAP data center code (e.g.,DC55,DC10,DC4)environment: Environment type (preview,production, orsales_demo)auth_user_id: Your SuccessFactors user ID (without @instance)auth_password: Your SuccessFactors password
Note: All connection parameters are provided by the MCP client on each tool call. No server-side configuration required.
Supported Data Centers
Data Center | Alias | Location | Environments |
DC10 | DC66 | Sydney, Australia | preview, production |
DC12 | DC33 | Germany | preview, production |
DC15 | DC30 | Shanghai, China | preview, production |
DC17 | DC60 | Toronto, Canada | preview, production |
DC19 | DC62 | São Paulo, Brazil | preview, production |
DC2 | DC57 | Netherlands | preview, production, sales_demo |
DC22 | - | Dubai, UAE | preview, production |
DC23 | DC84 | Riyadh, Saudi Arabia | preview, production |
DC4 | DC68 | Virginia, US | preview, production, sales_demo |
DC40 | - | - | sales_demo |
DC41 | - | Virginia, US | preview, production |
DC44 | DC52 | Singapore | preview, production |
DC47 | - | Canada Central | preview, production |
DC50 | - | Tokyo, Japan | preview, production |
DC55 | - | Frankfurt, Germany | preview, production |
DC74 | - | Zurich, Switzerland | preview, production |
DC8 | DC70 | Ashburn, Virginia, US | preview, production, sales_demo |
DC80 | - | Mumbai, India | preview, production |
DC82 | - | Riyadh, Saudi Arabia | preview, production |
Usage
Running with MCP Dev Server
For development and testing:
Running Standalone
Claude Desktop Integration
Follow these steps to add the SuccessFactors MCP server to Claude Desktop:
Step 1: Locate Your Configuration File
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
If the file doesn't exist, create it.
Step 2: Find the Path to uv
Run this command in your terminal to find where uv is installed:
Step 3: Add the MCP Server Configuration
Edit your claude_desktop_config.json file and add the sf-mcp server:
Example with actual paths (macOS):
Example with actual paths (Windows):
Step 4: Restart Claude Desktop
Completely quit and restart Claude Desktop for the changes to take effect.
Step 5: Verify the Connection
In Claude Desktop, you should see the MCP tools icon (hammer) in the input area. Click it to see the 29 SuccessFactors tools available.
Note: Credentials (auth_user_id and auth_password) must be provided on each tool call - they are not stored in the configuration.
Cloud Run Deployment (Alternative)
For remote deployment via Google Cloud Run:
Tool Reference
Configuration Tools
get_configuration
Retrieves OData metadata for a specified SuccessFactors entity.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | OData entity name (e.g., "User", "Position") |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
Example:
list_entities
Discover all available OData entities in an instance.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter: "foundation", "employee", "talent", "platform", or "all" |
Response:
compare_configurations
Compare entity configuration between two instances (e.g., dev vs prod).
Parameter | Type | Required | Description |
| string | Yes | First instance (e.g., dev) |
| string | Yes | Second instance (e.g., prod) |
| string | Yes | Entity to compare |
| string | Yes | SAP data center for instance1 (e.g., "DC55") |
| string | Yes | Environment for instance1 (e.g., "preview") |
| string | Yes | SAP data center for instance2 (e.g., "DC55") |
| string | Yes | Environment for instance2 (e.g., "production") |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
Response:
RBP Security Tools
get_rbp_roles
Lists all Role-Based Permission roles.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Include role descriptions (default: false) |
get_role_permissions
Gets permissions assigned to specific RBP roles. Supports multiple role IDs.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Single ID or comma-separated: "10" or "10,20,30" |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Locale for labels (default: en-US) |
get_user_permissions
Gets all permissions for specific users based on their assigned roles.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Single ID or comma-separated: "admin" or "admin,user2" |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Locale for labels (default: en-US) |
get_user_roles
Gets all RBP roles assigned to a specific user.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | User ID to look up roles for |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Also fetch permissions for each role (default: false) |
Response:
get_permission_metadata
Maps UI labels to permission types and values.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Locale for labels (default: en-US) |
check_user_permission
Check if a user has a specific permission for a target user.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | User whose permission to check |
| string | Yes | Target user of the permission |
| string | Yes | Permission type from metadata |
| string | Yes | Permission string value |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Permission long value (default: -1L) |
get_dynamic_groups
Lists dynamic groups (permission groups) used in RBP rules.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by group type |
RBP Audit Tools
get_role_history
View modification history for RBP roles - who changed what and when.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by specific role ID |
| string | No | Filter by role name (alternative to role_id) |
| string | No | Start date filter (YYYY-MM-DD) |
| string | No | End date filter (YYYY-MM-DD) |
| integer | No | Max records (default: 100, max: 500) |
Response:
get_role_assignment_history
View history of role assignments - who was granted roles and when.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter assignments for a specific role |
| string | No | Filter assignments for a specific user |
| string | No | Start date filter (YYYY-MM-DD) |
| string | No | End date filter (YYYY-MM-DD) |
| integer | No | Max records (default: 100, max: 500) |
Examples:
Response:
Data Query Tools
query_odata
Execute flexible OData queries against any SuccessFactors entity.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Entity name or entity with key: "User" or "User('admin')" |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Fields to return: "userId,firstName,lastName" |
| string | No | OData filter: "status eq 'active'" |
| string | No | Navigation properties: "empInfo,jobInfoNav" |
| integer | No | Max records (default: 100, max: 1000) |
| integer | No | Records to skip for pagination |
| string | No | Sort: "lastName asc" or "hireDate desc" |
Examples:
Response:
Data Validation Tools
get_picklist_values
Get all values for a specific picklist (dropdown options).
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Picklist ID: "ecJobFunction", "nationality" |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Locale for labels (default: en-US) |
| boolean | No | Include inactive values (default: false) |
Common Picklists:
ecJobFunction- Job functionsecJobCode- Job codesecPayGrade- Pay gradesecDepartment- Departmentsnationality- Countries/nationalitiesmaritalStatus- Marital status options
Response:
Employee Lookup Tools
get_employee_profile
Get a complete employee profile including job info, contact details, and manager.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Employee's user ID (e.g., "jsmith") |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type: "preview", "production", or "sales_demo" |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Include current compensation details (default: false) |
search_employees
Find employees by name, department, location, or manager.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center (e.g., "DC55", "DC10") |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Partial name to search across first/last/display name |
| string | No | Filter by department |
| string | No | Filter by location |
| string | No | Filter to a manager's direct reports |
| string | No | "active", "inactive", or "all" (default: "active") |
| integer | No | Max results (default: 50, max: 200) |
get_employee_history
View an employee's job history including promotions, transfers, and title changes.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Employee's user ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Include salary history (default: false) |
get_team_roster
Get a manager's team roster with direct and optionally indirect reports.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Manager's user ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Include reports-of-reports (default: false) |
| integer | No | Max direct reports (default: 100, max: 200) |
Time Off Tools
get_time_off_balances
Check vacation, PTO, and sick leave balances for one or more employees.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Single or comma-separated user IDs (max 50) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Check balance as of date (YYYY-MM-DD) |
get_upcoming_time_off
See who is out or taking time off in a date range (team absence calendar).
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Start of date range (YYYY-MM-DD) |
| string | Yes | End of date range (YYYY-MM-DD) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by department |
| string | No | Filter to manager's team |
| string | No | "approved", "pending", or "all" (default: "approved") |
| integer | No | Max results (default: 200, max: 500) |
get_time_off_requests
View time-off requests for approval tracking.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter to specific employee |
| string | No | "pending", "approved", "rejected", "cancelled", or "all" (default: "pending") |
| string | No | Only requests submitted after this date (YYYY-MM-DD) |
| integer | No | Max results (default: 50, max: 200) |
Hiring & Onboarding Tools
get_open_requisitions
List job requisitions with status and hiring manager.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by department |
| string | No | Filter by hiring manager |
| string | No | Filter by location |
| string | No | "open", "filled", "closed", or "all" (default: "open") |
| integer | No | Max results (default: 100, max: 500) |
get_candidate_pipeline
Track candidates for a job requisition through hiring stages.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Job requisition ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Include rejected candidates (default: false) |
| integer | No | Max results (default: 100, max: 500) |
get_new_hires
List recent and upcoming new hires for onboarding planning.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Hires starting on/after this date (YYYY-MM-DD) |
| string | Yes | Hires starting on/before this date (YYYY-MM-DD) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by department |
| integer | No | Max results (default: 100, max: 500) |
Compliance & Reporting Tools
get_terminations
List terminated employees in a date range for exit processing and compliance.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Start of date range (YYYY-MM-DD) |
| string | Yes | End of date range (YYYY-MM-DD) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by department |
| integer | No | Max results (default: 100, max: 500) |
get_employees_missing_data
Find employees with incomplete profiles for compliance audits.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Comma-separated: "email", "phone", "address", "emergency_contact" |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by department |
| integer | No | Max results (default: 100, max: 500) |
get_anniversary_employees
Find employees with upcoming work anniversaries for recognition programs.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Start of anniversary search range (YYYY-MM-DD) |
| string | Yes | End of anniversary search range (YYYY-MM-DD) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| boolean | No | Only show 1, 5, 10, 15, 20, 25+ years (default: false) |
| string | No | Filter by department |
| integer | No | Max results (default: 100, max: 500) |
Performance & Compensation Tools
get_performance_review_status
Track performance review form completion across the organization.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Filter by form template ID |
| string | No | Filter by department |
| string | No | Filter by manager |
| string | No | "not_started", "in_progress", "completed", or "" for all |
| integer | No | Max results (default: 100, max: 500) |
get_compensation_details
Get compensation breakdown for employees including base pay and pay components.
Parameter | Type | Required | Description |
| string | Yes | SuccessFactors company ID |
| string | Yes | Single or comma-separated user IDs (max 20) |
| string | Yes | SAP data center |
| string | Yes | Environment type |
| string | Yes | SuccessFactors user ID for authentication |
| string | Yes | SuccessFactors password for authentication |
| string | No | Show compensation as of this date (YYYY-MM-DD) |
Example Queries
Here are the top 10 questions you can ask Claude using this SuccessFactors MCP server:
Top 10 SuccessFactors Queries
"Show me all users in department 'Sales' with their job titles and manager information"
Queries User and EmpJob entities with filters and navigation properties
"What permissions does user 'jsmith' have in the system?"
Uses
get_user_permissionsto see all effective permissions from assigned roles
"Compare the User entity configuration between my dev instance (SFLAP012345) and production instance (PROD123)"
Uses
compare_configurationsto identify configuration drift between environments
"List all active employees hired in 2024 with their compensation details"
Queries EmpEmployment/EmpJob with date filters and expansion to compensation data
"Which users have both 'HR Role' and 'Manager Role' assigned?"
Uses
get_user_rolesfor multiple users to find role overlaps
"Show me all available picklist values for 'ecJobCode' (Job Codes)"
Uses
get_picklist_valuesto see all job code options configured in the system
"Get all employees reporting to manager 'asmith1' including their positions and locations"
Queries User entity with manager filter and expands to job/location details
"What are all the OData entities available in my SuccessFactors instance?"
Uses
list_entitiesto discover all queryable data entities
"Show me the role modification history for the 'Recruiters' role in the last 6 months"
Uses
get_role_historywith date filters to audit role changes
"Check if user 'admin1' has permission to view payroll data for user 'jdoe'"
Uses
check_user_permissionto verify specific access rights between users
HR Operations Queries
"Pull up the full profile for employee 'jsmith' including their compensation details"
Uses
get_employee_profilewithinclude_compensation=true
"Find all employees in the Marketing department"
Uses
search_employeeswith department filter
"Show me who's on vacation next week"
Uses
get_upcoming_time_offwith date range and status "approved"
"What are the PTO balances for my team?"
Uses
get_time_off_balanceswith comma-separated user IDs
"List all open job requisitions for the Engineering department"
Uses
get_open_requisitionswith department filter
"Show me all new hires starting in February 2026"
Uses
get_new_hireswith start_date_from and start_date_to
"Which employees are missing emergency contact information?"
Uses
get_employees_missing_datawith check_fields="emergency_contact"
"Who has a work anniversary this month? Show milestones only."
Uses
get_anniversary_employeeswith milestone_years_only=true
"What's the status of performance reviews for my team?"
Uses
get_performance_review_statuswith manager_id filter
"Show me John Smith's job history including all promotions"
Uses
get_employee_historyto see chronological career progression
Bonus Advanced Queries
"Export all cost centers with their managers to analyze organizational structure"
"Find all employees with expiring work permits in the next 90 days"
"List all dynamic groups used in RBP rules"
"Show me all fields in the Position entity that are marked as required"
These queries leverage the MCP server's capabilities for user management, permissions, HR operations, configuration analysis, and data extraction from your SuccessFactors system.
Common SuccessFactors Entities
Category | Entities |
Employee | User, EmpEmployment, EmpJob, PerPersonal, PerPhone, PerEmail |
Foundation | FOCompany, FODepartment, FOJobCode, FOLocation, FOPayGrade |
Position | Position, PositionEntity, PositionMatrixRelationship |
Talent | Goal, GoalPlan, PerformanceReview, Competency |
Recruiting | JobRequisition, Candidate, JobApplication |
Use list_entities to discover all available entities in your instance.
Cloud Deployment (Google Cloud Run)
Prerequisites
Google Cloud account with billing enabled
Google Cloud CLI installed
Deploy to Cloud Run
Note: Credentials are provided on each tool call by the MCP client, not stored in the deployment.
Local Testing with Docker
Note: Credentials are provided on each tool call, not as Docker environment variables.
Architecture
Project Structure
Design Principles
Modular decomposition: The original 4,778-line monolithic main.py has been decomposed into focused modules with single responsibilities. Production code reduced by ~50%.
sf_tool decorator: Eliminates ~400 lines of repeated boilerplate across 29 tools. Each tool previously duplicated request ID generation, timing, audit logging, input validation, credential checking, and error handling. The decorator centralizes these cross-cutting concerns:
FastMCP Depends() injection: Internal parameters (request_id, start_time, api_host) are hidden from the MCP tool schema using FastMCP's dependency injection system. The Depends() pattern replaces the deprecated exclude_args parameter.
Validator registry: Input validators are registered by name in a VALIDATORS dict, allowing the sf_tool decorator to apply additional validation via a declarative validate={"locale": "locale"} parameter.
Consolidated HTTP clients: Three request patterns (JSON OData, XML metadata, service document) are unified in client.py with shared auth, timeout, error handling, and audit logging.
Module Responsibilities
Module | Purpose |
| 50+ data center mappings, named constants, |
| 10 regex-based validators + registry pattern |
| Cloud Logging-compatible JSON formatter, audit trail |
| Credential resolution, API key middleware |
| OData request, metadata request, service doc request |
| XXE-safe XML parsing, SAP date parsing |
|
|
| FastMCP |
Dependencies
fastmcp>=2.0.0- Model Context Protocol SDKrequests>=2.31.0- HTTP client librarydefusedxml>=0.7.0- Safe XML parsing (XXE protection)python-dotenv>=1.0.0- Environment variable loaderuvicorn>=0.30.0- ASGI server for HTTP transport
Dev Dependencies
pytest>=8.0.0- Test framework
Testing
Run the test suite:
The test suite covers:
Config: DC mapping resolution, case insensitivity, aliases, error cases
Validation: All 10 validators with valid/invalid inputs, injection prevention
Client: Mocked HTTP responses (200, 401, 500, empty, connection error)
Decorators: Value injection, validation errors, max_top clamping, exception handling
Troubleshooting
Authentication Errors (HTTP 401)
Verify credentials format: user ID without @instance
Check password is correct
Ensure API user has proper permissions in SuccessFactors
Validation Errors
The server validates all inputs to prevent injection attacks. If you see validation errors:
instance: Must contain only alphanumeric, underscores, hyphensentity: Must be valid OData entity namefilter: Cannot contain blocked keywords ($batch, $metadata, script tags)locale: Must be format like "en-US" or "de"
Server Disconnected
Verify
uvpath in config is correctCheck logs:
tail -f ~/Library/Logs/Claude/mcp*.logTest manually:
uv run mcp dev main.py
Security Considerations
Input Validation: All parameters validated with regex patterns
XXE Protection: XML parsing uses defusedxml library
Audit Logging: All tool invocations logged in JSON format
Per-Request Authentication: Credentials required on each tool call (no stored defaults)
Credential Masking: Sensitive fields automatically masked in logs
Minimal Permissions: Use dedicated API user with required permissions only
License
MIT License