Salesforce MCP Server
Enables interaction with Salesforce through REST, Bulk API, and SOQL for comprehensive CRM management across objects like Leads, Accounts, and Opportunities. It provides a structured interface for performing CRUD operations and executing complex queries via the Model Context Protocol.
README
Salesforce MCP Server
A Model Context Protocol (MCP) server that provides tools for interacting with Salesforce via REST API, Bulk API, and SOQL using a tier 3 architecture.
Version: 0.1.0
Last Updated: January 2025
Test Coverage: 90%+
Integration Tests: 100+ test cases
Features
Supported Salesforce Objects
-
Lead: Create, read, update, delete, and query leads
-
Contact: Create, read, update, delete, and query contacts
-
Account: Create, read, update, delete, and query accounts
-
Opportunity: Create, read, update, delete, and query opportunities
-
Task: Create, read, update, delete, and query tasks
-
Case: Create, read, update, delete, and query cases
-
Campaign: Create, read, update, delete, and query campaigns
-
Quote: Create, read, update, delete, and query quotes
-
Order: Create, read, update, delete, and query orders
-
Product: Create, read, update, delete, and query products
-
Asset: Create, read, update, delete, and query assets
-
OpportunityLineItem: Create, read, update, delete, and query opportunity line items
-
Pricebook2: Create, read, update, delete, and query pricebooks
-
PricebookEntry: Create, read, update, delete, and query pricebook entries
-
OpportunityContactRole: Create, read, update, delete, and query opportunity contact roles
APIs Supported
-
REST API: Standard CRUD operations for all objects
-
Bulk API: Bulk operations for large datasets
-
SOQL: Salesforce Object Query Language for complex queries
Architecture
-
Presentation Layer (Controllers): Handle MCP tool definitions and responses
-
Business Logic Layer (Services): Handle business logic and validation
-
Data Access Layer (Repositories): Handle data access and external API calls
Setup
Prerequisites
-
Python 3.10+
-
Salesforce account with API access
-
Connected App configured in Salesforce
Installation
-
Clone the repository
cd backend/python/mcp_servers/mcp-salesforce-server -
Install dependencies
pip install uv uv pip install . -
Configure environment variables
cp env.example .env # Edit .env with your Salesforce credentials
Environment Configuration
Create a .env file with the following variables:
# Salesforce Authentication
SALESFORCE_CLIENT_ID=your_client_id_here
SALESFORCE_CLIENT_SECRET=your_client_secret_here
SALESFORCE_USERNAME=your_username_here
SALESFORCE_PASSWORD=your_password_here
SALESFORCE_SECURITY_TOKEN=your_security_token_here
# Salesforce Instance Configuration
SALESFORCE_INSTANCE_URL=https://your-instance.salesforce.com
SALESFORCE_LOGIN_URL=https://login.salesforce.com
SALESFORCE_SANDBOX_URL=https://test.salesforce.com
# API Configuration
SALESFORCE_API_VERSION=v58.0
SALESFORCE_USE_SANDBOX=false
# Server Configuration
HOST=0.0.0.0
PORT=8080
# Logging Configuration
LOG_LEVEL=INFO
# Optional: Custom timeout settings (in seconds)
SALESFORCE_REQUEST_TIMEOUT=30
SALESFORCE_BULK_TIMEOUT=300
# Azure Key Vault Configuration (optional)
AGENTOS_AKV_NAME=your_key_vault_name
AZURE_KEYVAULT_NAME=your_key_vault_name
AKV_NAME=your_key_vault_name
# MCP Server Configuration
MCP_SERVER_NAME=SalesforceServer
MCP_SERVER_INSTRUCTIONS=A powerful server for Salesforce operations and CRM management.
MCP_STATELESS_HTTP=true
MCP_JSON_RESPONSE=true
MCP_STREAM_PATH=/stream
MCP_SERVER_URL=http://localhost:8080/mcp-salesforce-server/
# Authentication & Security
MCP_TOKEN=your_optional_mcp_token
CORS_ALLOW_ORIGINS=*
# Environment Configuration
ENVIRONMENT=development
FASTAPI_PREFIX=salesforce
# Logging Configuration
LOG_LEVEL=INFO
LOG_FORMAT=json
LOG_FILE=./logs
LOG_MAX_SIZE=10485760
LOG_BACKUP_COUNT=5
Usage
Running the Server
Test Configuration First:
python test_config.py
Local Development:
python salesforce_mcp_server.py
Docker:
docker-compose up --build
Direct Docker:
docker build -t salesforce-mcp-server .
docker run -p 8080:8080 --env-file .env salesforce-mcp-server
Health Check
Check server health:
curl http://localhost:8080/health
MCP Tools Available
Lead Operations
-
create_lead(lead_data): Create a new lead -
get_lead(lead_id, fields): Get lead by ID -
update_lead(lead_id, lead_data): Update existing lead -
delete_lead(lead_id): Delete lead -
query_leads(where_conditions, limit): Query leads using SOQL
Contact Operations
-
create_contact(contact_data): Create a new contact -
get_contact(contact_id, fields): Get contact by ID -
update_contact(contact_id, contact_data): Update existing contact -
delete_contact(contact_id): Delete contact -
query_contacts(where_conditions, limit): Query contacts using SOQL
Account Operations
-
create_account(account_data): Create a new account -
get_account(account_id, fields): Get account by ID -
update_account(account_id, account_data): Update existing account -
delete_account(account_id): Delete account -
query_accounts(where_conditions, limit): Query accounts using SOQL
Opportunity Operations
-
create_opportunity(opportunity_data): Create a new opportunity -
get_opportunity(opportunity_id, fields): Get opportunity by ID -
update_opportunity(opportunity_id, opportunity_data): Update existing opportunity -
delete_opportunity(opportunity_id): Delete opportunity -
query_opportunities(where_conditions, limit): Query opportunities using SOQL
Task Operations
-
create_task(task_data): Create a new task -
get_task(task_id, fields): Get task by ID -
update_task(task_id, task_data): Update existing task -
delete_task(task_id): Delete task -
query_tasks(where_conditions, limit): Query tasks using SOQL
Case Operations
-
create_case(case_data): Create a new case -
get_case(case_id, fields): Get case by ID -
update_case(case_id, case_data): Update existing case -
delete_case(case_id): Delete case -
query_cases(where_conditions, limit): Query cases using SOQL
Campaign Operations
-
create_campaign(campaign_data): Create a new campaign -
get_campaign(campaign_id, fields): Get campaign by ID -
update_campaign(campaign_id, campaign_data): Update existing campaign -
delete_campaign(campaign_id): Delete campaign -
query_campaigns(where_conditions, limit): Query campaigns using SOQL
Quote Operations
-
create_quote(quote_data): Create a new quote -
get_quote(quote_id, fields): Get quote by ID -
update_quote(quote_id, quote_data): Update existing quote -
delete_quote(quote_id): Delete quote -
query_quotes(where_conditions, limit): Query quotes using SOQL
Order Operations
-
create_order(order_data): Create a new order -
get_order(order_id, fields): Get order by ID -
update_order(order_id, order_data): Update existing order -
delete_order(order_id): Delete order -
query_orders(where_conditions, limit): Query orders using SOQL
Product Operations
-
create_product(product_data): Create a new product -
get_product(product_id, fields): Get product by ID -
update_product(product_id, product_data): Update existing product -
delete_product(product_id): Delete product -
query_products(where_conditions, limit): Query products using SOQL
Asset Operations
-
create_asset(asset_data): Create a new asset -
get_asset(asset_id, fields): Get asset by ID -
update_asset(asset_id, asset_data): Update existing asset -
delete_asset(asset_id): Delete asset -
query_assets(where_conditions, limit): Query assets using SOQL
Opportunity Line Item Operations
-
create_opportunity_line_item(line_item_data): Create a new opportunity line item -
get_opportunity_line_item(line_item_id, fields): Get opportunity line item by ID -
update_opportunity_line_item(line_item_id, line_item_data): Update existing opportunity line item -
delete_opportunity_line_item(line_item_id): Delete opportunity line item -
query_opportunity_line_items(where_conditions, limit): Query opportunity line items using SOQL
Pricebook Operations
-
create_pricebook2(pricebook_data): Create a new pricebook -
get_pricebook2(pricebook_id, fields): Get pricebook by ID -
update_pricebook2(pricebook_id, pricebook_data): Update existing pricebook -
delete_pricebook2(pricebook_id): Delete pricebook -
query_pricebook2s(where_conditions, limit): Query pricebooks using SOQL
Pricebook Entry Operations
-
create_pricebook_entry(entry_data): Create a new pricebook entry -
get_pricebook_entry(entry_id, fields): Get pricebook entry by ID -
update_pricebook_entry(entry_id, entry_data): Update existing pricebook entry -
delete_pricebook_entry(entry_id): Delete pricebook entry -
query_pricebook_entries(where_conditions, limit): Query pricebook entries using SOQL
Opportunity Contact Role Operations
-
create_opportunity_contact_role(role_data): Create a new opportunity contact role -
get_opportunity_contact_role(role_id, fields): Get opportunity contact role by ID -
update_opportunity_contact_role(role_id, role_data): Update existing opportunity contact role -
delete_opportunity_contact_role(role_id): Delete opportunity contact role -
query_opportunity_contact_roles(where_conditions, limit): Query opportunity contact roles using SOQL
Health Check
health_check(): Check server health and Salesforce connection
SOQL Query Examples
Basic Queries
# Get all leads
query_leads()
# Get leads with specific conditions
query_leads("Status = 'New' AND Company LIKE '%Tech%'")
# Get contacts with limit
query_contacts("Email != null", limit=10)
# Get accounts by industry
query_accounts("Industry = 'Technology'", limit=50)
Complex Queries
# Get opportunities with related account data
query_opportunities("StageName = 'Closed Won' AND Amount > 10000")
# Get tasks by status
query_tasks("Status = 'In Progress'")
# Get cases by priority
query_cases("Priority = 'High' AND Status != 'Closed'")
Data Models
Lead
{
"last_name": "Doe",
"first_name": "John",
"company": "Tech Corp",
"email": john.doe@techcorp.com,
"phone": "+1234567890",
"status": "New",
"lead_source": "Website",
"industry": "Technology"
}
Contact
{
"last_name": "Smith",
"first_name": "Jane",
"email": jane.smith@company.com,
"phone": "+1234567890",
"title": "Sales Manager",
"department": "Sales"
}
Account
{
"name": "Acme Corporation",
"type": "Customer",
"industry": "Technology",
"phone": "+1234567890",
"website": https://www.acme.com
}
Opportunity
{
"name": "Enterprise Deal",
"stage_name": "Prospecting",
"close_date": "2024-12-31",
"amount": 50000.00,
"type": "New Business",
"probability": 25.0
}
Task
{
"subject": "Follow up call",
"description": "Call prospect about proposal",
"status": "Not Started",
"priority": "High",
"activity_date": "2024-01-15"
}
Case
{
"subject": "Technical Support Request",
"description": "User cannot access the system",
"status": "New",
"priority": "Medium",
"origin": "Web"
}
Campaign
{
"name": "Q4 Product Launch",
"type": "Email",
"status": "Planned",
"start_date": "2024-10-01",
"end_date": "2024-12-31",
"budget": 50000.00
}
Quote
{
"name": "Enterprise Quote #001",
"status": "Draft",
"expiration_date": "2024-12-31",
"subtotal": 100000.00,
"total_price": 110000.00
}
Order
{
"account_id": "001O400001BrpgiIAB",
"effective_date": "2024-01-15",
"status": "Draft",
"total_amount": 50000.00,
"type": "New"
}
Product
{
"name": "Enterprise CRM License",
"product_code": "CRM-ENT-001",
"family": "Software",
"is_active": true,
"description": "Enterprise CRM software license"
}
Asset
{
"name": "CRM Software License",
"account_id": "001O400001BrpgiIAB",
"product2_id": "01tO400000ABC123",
"status": "Installed",
"purchase_date": "2024-01-15"
}
Opportunity Line Item
{
"opportunity_id": "006O400000ABC123",
"product2_id": "01tO400000ABC123",
"quantity": 10,
"unit_price": 1000.00,
"total_price": 10000.00
}
Pricebook2
{
"name": "Standard Price Book",
"is_active": true,
"description": "Standard pricing for all products"
}
PricebookEntry
{
"pricebook2_id": "01sO400000ABC123",
"product2_id": "01tO400000ABC123",
"unit_price": 1000.00,
"is_active": true
}
Opportunity Contact Role
{
"opportunity_id": "006O400000ABC123",
"contact_id": "003O400000ABC123",
"role": "Decision Maker",
"is_primary": true
}
Security Features
Multi-Layer Security Architecture
-
SOQL Injection Prevention: Validates and sanitizes all SOQL queries with advanced pattern matching
-
Field Validation: Ensures only valid fields are used in queries with comprehensive field mapping
-
Rate Limiting: Respects Salesforce API rate limits with intelligent retry logic
-
Authentication: Secure OAuth2 authentication with Salesforce and automatic token refresh
-
Error Handling: Comprehensive error handling and logging with correlation IDs
Enhanced Security Features
-
Azure Key Vault Integration: Secure secrets management for production environments
-
Input Validation: Pydantic v2 models with comprehensive field validation
-
CORS Configuration: Configurable cross-origin resource sharing policies
-
Container Security: Non-root user execution and minimal base image
-
Structured Logging: JSON logging with security event tracking
-
Request Timeouts: Configurable timeouts to prevent hanging connections
-
Retry Logic: Exponential backoff for failed authentication attempts
Data Quality Management
Duplicate Prevention
The server includes built-in capabilities to help manage data quality:
-
Duplicate Detection: Query tools can identify duplicate records by name, email, or other key fields
-
Bulk Operations: Use bulk delete operations to clean up duplicate data efficiently
-
Data Validation: Field validation ensures data consistency before creation
Example Duplicate Cleanup
# Query for duplicate accounts
query_accounts("Name = 'Duplicate Company Name'")
# Delete specific duplicate records
delete_account("001O400000ABC123")
delete_account("001O400000XYZ789")
# Query for duplicate leads
query_leads("Company = 'Duplicate Company' AND Email = 'duplicate@email.com'")
Best Practices
-
Regularly audit data for duplicates using SOQL queries
-
Implement data validation rules in Salesforce
-
Use bulk operations for large-scale data cleanup
-
Monitor data quality metrics through regular queries
Rate Limits
The server respects Salesforce API rate limits:
-
REST API: 15,000 requests per 24 hours
-
Bulk API: 10,000 requests per 24 hours
-
Query API: 5,000 requests per 24 hours
Error Handling
The server provides structured error responses for:
-
Authentication failures
-
Invalid object types
-
Missing required fields
-
SOQL injection attempts
-
Rate limit exceeded
-
Network errors
Development
Project Structure
mcp-salesforce-server/
├── config/
│ ├── logging_config.py # Logging configuration with correlation IDs
│ └── settings.py # Application settings with Pydantic v2
├── constants/
│ └── salesforce_constants.py # Non-sensitive configuration
├── controllers/
│ └── salesforce_controller.py # Presentation layer
├── models/
│ └── salesforce_models.py # Data models with validation
├── repositories/
│ └── salesforce_repository.py # Data access layer with retry logic
├── services/
│ └── salesforce_service.py # Business logic layer
├── tests/ # Comprehensive test suite
│ ├── conftest.py # Test configuration and fixtures
│ ├── run_tests.py # Test runner for all tests
│ ├── run_integration_tests.py # Integration test runner
│ ├── test_salesforce_mcp_server.py
│ ├── constants/ # Unit tests for constants
│ ├── controllers/ # Unit tests for controllers
│ ├── models/ # Unit tests for models
│ ├── repositories/ # Unit tests for repositories
│ ├── services/ # Unit tests for services
│ └── integration/ # Integration tests
│ ├── conftest.py # Integration test fixtures
│ ├── test_lead_integration.py
│ ├── test_all_objects_crud_integration.py
│ ├── test_end_to_end_workflows.py
│ └── README.md # Integration test documentation
├── logs/ # Log files directory
├── dependencies.py # Dependency injection container
├── salesforce_mcp_server.py # Main server file
├── pyproject.toml # Dependencies and project config
├── pytest.ini # Pytest configuration
├── Dockerfile # Container configuration
├── docker-compose.yml # Docker orchestration
├── env.example # Environment template
└── README.md # This file
Testing
Unit Tests
Run all unit tests:
pytest
Run with coverage:
pytest --cov=. --cov-report=html
Integration Tests
Run comprehensive integration tests:
python tests/run_integration_tests.py
Run specific integration test categories:
python tests/run_integration_tests.py crud # CRUD operations
python tests/run_integration_tests.py lead # Lead workflows
python tests/run_integration_tests.py workflows # Business workflows
Complete Test Suite
Run all tests (unit + integration):
python tests/run_tests.py all
Test Coverage
-
90%+ Code Coverage across all layers
-
100+ Integration Test Cases for end-to-end validation
-
15+ Business Workflows tested
-
50+ Error Scenarios covered
Code Quality
Format code:
black .
Lint code:
flake8 .
Type checking:
mypy .
Troubleshooting
Common Issues
-
Configuration Errors
-
Run
python test_config.pyto check your configuration -
Ensure all required environment variables are set in
.env -
Copy
env.exampleto.envand fill in your credentials
-
-
Authentication Failed
-
Verify Salesforce credentials in
.env -
Check if security token is correct
-
Ensure connected app is properly configured
-
-
Rate Limit Exceeded
-
Check Salesforce API limits
-
Implement request throttling
-
Use bulk operations for large datasets
-
-
Invalid Object Type
-
Verify object name spelling
-
Check if object is available in your Salesforce org
-
Ensure proper permissions
-
-
SOQL Query Errors
-
Validate query syntax
-
Check field names and relationships
-
Ensure proper escaping of special characters
-
Logs
Check server logs for detailed error information:
docker-compose logs salesforce-mcp-server
Contributing
-
Fork the repository
-
Create a feature branch
-
Make your changes
-
Add tests
-
Submit a pull request
License
This project is licensed under the MIT License.
Changelog
Recent Updates (Last 2 Weeks)
🔧 Enhanced Security & Configuration
-
Azure Key Vault Integration: Added support for Azure Key Vault secrets management
-
Enhanced Environment Configuration: Improved settings validation with Pydantic v2
-
Security Token Management: Enhanced Salesforce security token handling
-
CORS Configuration: Improved cross-origin resource sharing settings
🧪 Comprehensive Testing Suite
-
Integration Test Framework: Added complete integration test suite with 100+ test cases
-
End-to-End Workflow Testing: Business process validation across all Salesforce objects
-
90%+ Code Coverage: Comprehensive unit and integration test coverage
-
Mock Strategy: Advanced HTTP-level mocking for realistic API simulation
-
Test Automation: Automated test runners for unit and integration tests
🏗️ Architecture Improvements
-
Tier 3 Architecture: Fully implemented presentation, business, and data layers
-
Dependency Injection: Enhanced dependency container with proper error handling
-
Structured Logging: JSON logging with correlation IDs and session tracking
-
Error Handling: Comprehensive error handling across all architectural layers
📊 Enhanced Data Models
-
Pydantic v2 Migration: Updated to latest Pydantic with enhanced validation
-
Field Validation: Email, phone, website, and business rule validation
-
Type Safety: Improved type hints and validation across all models
-
Data Quality: Enhanced duplicate detection and data integrity features
🚀 Performance & Scalability
-
Request Timeouts: Configurable timeout settings for API requests
-
Retry Logic: Exponential backoff for failed authentication attempts
-
Session Management: HTTP session reuse for improved performance
-
Bulk Operations: Enhanced bulk API support for large datasets
🔒 Security Enhancements
-
SOQL Injection Prevention: Enhanced query sanitization and validation
-
Authentication Flow: Improved OAuth 2.0 flow with automatic token refresh
-
Input Validation: Comprehensive input validation and sanitization
-
Secrets Management: Azure Key Vault integration for secure credential storage
📈 API & Integration
-
13 Salesforce Objects: Full CRUD support for all major Salesforce objects
-
65+ MCP Tools: Comprehensive tool set for Salesforce operations
-
Health Monitoring: Enhanced health checks and status endpoints
-
API Version Management: Support for multiple Salesforce API versions (v58.0+)
🐳 Container & Deployment
-
Docker Security: Non-root user execution and security hardening
-
Health Checks: Container health monitoring with curl-based checks
-
Environment Management: Improved environment variable handling
-
Docker Compose: Enhanced orchestration with proper environment passing
📚 Documentation & Developer Experience
-
Comprehensive README: Updated with latest features and setup instructions
-
Integration Test Documentation: Detailed testing guides and examples
-
API Documentation: Complete MCP tool documentation with examples
-
Troubleshooting Guide: Enhanced troubleshooting and debugging information
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。