AS

aiadiguru2025/sf-mcp

Developer tools
15 stars 7 forks Quality 77 Trend 25MIT

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_id and auth_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:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/my-feature
  3. Run tests: uv run pytest tests/ -v
  4. Run linting: uv run ruff check .
  5. Commit your changes
  6. 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

View the full README on GitHub

Install

docker run -p 8080:8080 sf-mcp
New to MCP? Start with the mcpskill.org guide →

Configuration

{ "mcpServers": { "sf-mcp": { "command": "/path/to/uv", "args": ["--directory", "/path/to/sf-mcp", "run", "main.py"] } } }