SAP SuccessFactors MCP server — 43 HR tools for Claude Desktop & Cloud Run. Query employees, permissions, time off, hiring, compliance, and more via natural language.
Overview
SuccessFactors-MCP SAP SuccessFactors Model Context Protocol Server Installation · Quick Start · 62 Tools · Deployment · API Reference A production-grade Model Context Protocol server that connects Claude (or any MCP client) to via OData APIs. Query employee data, manage permissions, run compliance reports, and administer HR operations — all through natural language. 62 tools organized across 16 categories: - - package manager - SAP SuccessFactors account with API access The MCP tools icon (hammer) will appear in the input area with all 62 tools available. Credentials (auth_user_id and auth_password) are provided on each tool call — nothing is stored in the config. Then point Claude Desktop to the remote URL: Set MCP_API_KEY to require authentication on the HTTP endpoint:
README
SuccessFactors-MCP
SAP SuccessFactors Model Context Protocol Server
Installation ·
Quick Start ·
62 Tools ·
Deployment ·
API Reference
A production-grade Model Context Protocol server that connects Claude (or any MCP client) to SAP SuccessFactors via OData APIs. Query employee data, manage permissions, run compliance reports, and administer HR operations — all through natural language.
You: "Who on the Engineering team has a work anniversary this month?"
Claude: [calls get_anniversary_employees] Found 3 upcoming anniversaries...
- Jane Smith (5 years - milestone!) - March 12
- Bob Johnson (2 years) - March 18
- Alice Chen (10 years - milestone!) - March 25
Why SF-MCP?
| Challenge | SF-MCP Solution |
|---|---|
| SAP SuccessFactors APIs are complex and verbose | 62 purpose-built tools with clean interfaces |
| Building OData queries requires deep SF knowledge | Natural language — ask Claude in plain English |
| Security concerns with API access | Per-request auth, input validation, audit logging |
| Managing multiple SF instances | 21 data centers supported, cross-instance comparison |
| API rate limits and performance | Connection pooling, response caching, rate limiting |
Tools
62 tools organized across 16 categories:
Installation
Prerequisites
- Python 3.10+
- uv package manager
- SAP SuccessFactors account with API access
Setup
git clone https://github.com/aiadiguru2025/sf-mcp.git
cd sf-mcp
uv sync
Quick Start
Development mode (MCP Inspector):
uv run mcp dev main.py
Stdio mode (Claude Desktop):
uv run main.py
HTTP mode (Cloud Run / remote):
PORT=8080 uv run main.py
Claude Desktop Integration
Step 1 — Find the path to uv
# macOS / Linux
which uv
# Windows (PowerShell)
Get-Command uv | Select-Object -ExpandProperty Source
Step 2 — Edit your Claude Desktop config
| OS | Config path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Add the sf-mcp server:
{
"mcpServers": {
"sf-mcp": {
"command": "/path/to/uv",
"args": ["--directory", "/path/to/sf-mcp", "run", "main.py"]
}
}
}
Step 3 — Restart Claude Desktop
The MCP tools icon (hammer) will appear in the input area with all 62 tools available.
Note: Credentials (
auth_user_idandauth_password) are provided on each tool call — nothing is stored in the config.
Deployment
Google Cloud Run
# Build and deploy
export PROJECT_ID=your-gcp-project-id
gcloud builds submit --tag gcr.io/$PROJECT_ID/sf-mcp
gcloud run deploy sf-mcp \
--image gcr.io/$PROJECT_ID/sf-mcp \
--platform managed \
--region us-central1
Then point Claude Desktop to the remote URL:
{
"mcpServers": {
"sf-mcp": {
"url": "https://sf-mcp-xxxxx-uc.a.run.app/mcp"
}
}
}
Docker (local)
docker build -t sf-mcp .
docker run -p 8080:8080 sf-mcp
API Key Protection (optional)
Set MCP_API_KEY to require authentication on the HTTP endpoint:
MCP_API_KEY=your-secret-key PORT=8080 uv run main.py
Clients must then include X-API-Key: your-secret-key in requests.
Configuration
All tool parameters (data_center, environment, auth_user_id, auth_password) are provided per-request. Server-side environment variables are optional:
Rate Limiting
| Variable | Default | Description |
|---|---|---|
SF_RATE_LIMIT |
100 |
Max requests per window per instance |
SF_RATE_LIMIT_WINDOW |
60 |
Window duration in seconds |
SF_RATE_LIMIT_WARN_THRESHOLD |
0.8 |
Log warning at 80% usage |
SF_RATE_LIMIT_RETRY_AFTER |
5 |
Seconds to wait on 429 retry |
SF_RATE_LIMIT_MAX_RETRIES |
3 |
Max 429 retry attempts |
Response Caching
| Variable | Default | Description |
|---|---|---|
SF_CACHE_TTL_METADATA |
3600 |
Metadata cache TTL (1 hour) |
SF_CACHE_TTL_SERVICE_DOC |
3600 |
Service doc cache TTL (1 hour) |
SF_CACHE_TTL_PICKLIST |
1800 |
Picklist cache TTL (30 min) |
SF_CACHE_TTL_PERMISSIONS |
3600 |
Permission cache TTL (1 hour) |
SF_CACHE_TTL_DEFAULT |
0 |
Default TTL (0 = disabled) |
SF_CACHE_MAX_ENTRIES |
1000 |
Max cache entries before eviction |
Endpoint Protection
| Variable | Default | Description |
|---|---|---|
MCP_API_KEY |
(none) | API key for HTTP endpoint auth |
Copy .env.example to .env to customize:
cp .env.example .env
Supported Data Centers
21 data centers across 6 continents with alias support:
| Data Center | Alias | Location | Environments |
|---|---|---|---|
| DC2 | DC57 | Netherlands | preview, production, sales_demo |
| DC4 | DC68 | Virginia, US | preview, production, sales_demo |
| DC8 | DC70 | Ashburn, Virginia, US | preview, production, sales_demo |
| 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 | Sao Paulo, Brazil | preview, production |
| DC22 | — | Dubai, UAE | preview, production |
| DC23 | DC84 | Riyadh, Saudi Arabia | preview, production |
| 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 |
| DC80 | — | Mumbai, India | preview, production |
| DC82 | — | Riyadh, Saudi Arabia | preview, production |
Architecture
sf-mcp/
├── main.py # Entry point (stdio + HTTP modes)
├── sf_mcp/
│ ├── server.py # FastMCP instance
│ ├── config.py # DC mappings, constants, env vars
│ ├── auth.py # Credential resolution, API key middleware
│ ├── client.py # HTTP client (OData, metadata, service doc, pagination)
│ ├── cache.py # TTL-based response cache with deep-copy safety
│ ├── rate_limiter.py # Sliding-window rate limiter (per-instance)
│ ├── validation.py # 10 input validators with registry pattern
│ ├── decorators.py # sf_tool decorator (cross-cutting concerns)
│ ├── dependencies.py # FastMCP DI for schema exclusion
│ ├── logging_config.py # Cloud Logging JSON formatter, audit_log()
│ ├── xml_utils.py # Safe XML parsing (defusedxml), SAP date parsing
│ └── tools/ # 62 tools across 16 modules
│ ├── configuration.py # get_configuration, compare_configurations, list_entities
│ ├── permissions.py # 7 RBP security tools
│ ├── audit.py # Role history, role assignment history
│ ├── query.py # query_odata, get_picklist_values
│ ├── employee.py # Profile, search, history, team roster
│ ├── time_off.py # Balances, upcoming absences, requests
│ ├── recruiting.py # Requisitions, pipeline, new hires
│ ├── compliance.py # Terminations, missing data, anniversaries, reviews, comp
│ ├── position.py # Position details, vacancies, org chart
│ ├── workflow.py # Pending approvals, workflow history
│ ├── mdf.py # MDF object definitions, queries, foundation objects
│ ├── monitoring.py # Alerts, scheduled jobs, integration jobs
│ ├── admin.py # Rate limit quota, cache status, cache clear
│ └── utils.py # Shared utilities (display_name)
├── tests/ # 110 tests
├── Dockerfile # Cloud Run container
├── .env.example # Configuration template
└── pyproject.toml # Project metadata, dependencies, linter config
Design Principles
Zero boilerplate — The sf_tool decorator handles request ID generation, timing, audit logging, input validation, credential checking, error handling, and $top clamping. Tool functions contain only business logic.
Secure by default — 10 input validators (regex allowlists), OData injection prevention, XXE-safe XML parsing (defusedxml), timing-safe API key comparison (hmac.compare_digest), and automatic credential masking in logs.
Production-ready — Connection pooling (requests.Session), mutation-safe response caching (deep-copy on put/get), sliding-window rate limiting with automatic 429 retry, and Cloud Logging-compatible JSON audit trail.
Schema-clean — Internal parameters (request_id, start_time, api_host) are hidden from the MCP tool schema via FastMCP’s Dependency injection, keeping tool interfaces clean for LLM consumers.
Security
| Layer | Mechanism |
|---|---|
| Input validation | 10 regex-based validators; OData filter blocklist checks raw + URL-decoded + double-decoded input |
| Injection prevention | Entity paths, $select, $orderby, $filter, $expand all validated; control characters rejected |
| Authentication | Per-request credentials (never stored); timing-safe API key comparison via hmac.compare_digest |
| XML safety | defusedxml prevents XXE, entity expansion, and DTD attacks |
| Audit logging | Every tool call logged with structured JSON; passwords automatically masked |
| Cache safety | Deep-copied on store and retrieval to prevent mutation bugs |
| Date handling | All SAP timestamp parsing uses explicit UTC to prevent timezone inconsistencies |
Testing
# Run all 110 tests
uv run pytest tests/ -v
# Run with coverage
uv run pytest tests/ --cov=sf_mcp
# Lint
uv run ruff check .
# Type check
uv run mypy sf_mcp/
Test coverage includes:
- 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)
- Rate limiter — Limit enforcement, sliding window, per-instance isolation, thread safety
- Cache — Put/get, TTL expiry, category TTLs, invalidation, eviction, deep-copy safety
- Pagination — Single/multi page, max_pages limit, error handling, $skip increments
- Decorators — Value injection, validation errors, max_top clamping, exception handling
API Reference
Every tool accepts these common parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
instance |
string | Yes | SuccessFactors company ID |
data_center |
string | Yes | SAP data center code (e.g., DC55, DC10) |
environment |
string | Yes | preview, production, or sales_demo |
auth_user_id |
string | Yes | SuccessFactors user ID (without @instance) |
auth_password |
string | Yes | SuccessFactors password |
Example Queries
Ask Claude in natural language:
| Query | Tool Used |
|---|---|
| “Show me all users in the Sales department” | search_employees |
| “What permissions does jsmith have?” | get_user_permissions |
| “Compare User config between dev and prod” | compare_configurations |
| “Who’s on vacation next week?” | get_upcoming_time_off |
| “List all open job requisitions for Engineering” | get_open_requisitions |
| “How much PTO does jdoe have left?” | get_time_off_balances |
| “Show me all new hires starting in March” | get_new_hires |
| “Who has a 10-year anniversary this month?” | get_anniversary_employees |
| “What are the status of performance reviews for my team?” | get_performance_review_status |
| “Show John’s complete job history” | get_employee_history |
| “What custom MDF objects exist in our instance?” | get_mdf_object_definitions |
| “List all departments with their cost centers” | get_foundation_objects |
| “Are there any pending workflow approvals?” | get_pending_approvals |
| “Check the status of our integration jobs” | get_integration_center_jobs |
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.
Troubleshooting
Dependencies
| Package | Version | Purpose |
|---|---|---|
| fastmcp | >=2.0.0 | Model Context Protocol SDK |
| requests | >=2.31.0 | HTTP client with connection pooling |
| defusedxml | >=0.7.0 | XXE-safe XML parsing |
| python-dotenv | >=1.0.0 | Environment variable loading |
| uvicorn | >=0.30.0 | ASGI server for HTTP transport |
Dev dependencies: pytest, ruff, mypy
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Run tests:
uv run pytest tests/ -v - Run linting:
uv run ruff check . - Commit your changes
- Open a Pull Request
Changelog
See CHANGELOG.md for release history.
License
This project is licensed under the MIT License — see the LICENSE file for details.
Built with FastMCP · Powered by Model Context Protocol
Install
docker run -p 8080:8080 sf-mcpConfiguration
{
"mcpServers": {
"sf-mcp": {
"command": "/path/to/uv",
"args": ["--directory", "/path/to/sf-mcp", "run", "main.py"]
}
}
}