@exiahuang/salesforce-mcp
v1.0.0
Published
Salesforce MCP Server - A Model Context Protocol server for Salesforce
Maintainers
Readme
@exiahuang/salesforce-mcp
Salesforce MCP Server - A Model Context Protocol server for Salesforce that enables AI assistants like Claude to interact with Salesforce orgs through a standardized protocol.
Overview
This MCP server provides comprehensive Salesforce integration using Salesforce CLI (sf) for authentication and direct REST API calls. It supports both standalone server mode and library mode for programmatic access.
Features
- Connection Management: Auto-detect default org, support explicit alias, direct token injection
- SOQL Queries: Execute queries, pagination support, aggregate functions, relationship queries
- Tooling API: Query metadata (ApexClass, CustomField, FlowDefinition, etc.)
- CRUD Operations: Create, Read, Update, Delete, Upsert records
- Metadata Operations: Describe global, describe SObject, describe fields
- Apex Execution: Execute anonymous Apex, run tests, get Apex class/trigger body
- Debug Logs: Retrieve organization debug logs
- User Management: Assign permission sets
- Recent Records: Get recently accessed, updated, deleted records
- API Limits: Query API usage limits
- Chatter: Post feed items
Installation
npm installConfiguration
Environment Variables
Copy .env.example to .env and configure:
# Option 1: Direct token injection (highest priority)
SF_ACCESS_TOKEN=your_access_token_here
SF_INSTANCE_URL=https://yourinstance.salesforce.com
# Option 2: Use org alias
SF_ALIAS=myorg
# API Version (default: 65.0)
SF_API_VERSION=65.0Priority Order
- Constructor parameter (library mode)
- SF_ACCESS_TOKEN + SF_INSTANCE_URL (env vars)
- SF_ALIAS (fetch via sf org display)
- Default org (auto-detect from sf config)
Usage
As Library
import { SalesforceClient } from '@exiahuang/salesforce-mcp';
const client = new SalesforceClient({
apiVersion: '65.0',
alias: 'myorg'
});
// Query
const accounts = await client.query('SELECT Id, Name FROM Account LIMIT 10');
// CRUD
await client.create('Account', [{ Name: 'Test Account' }]);
await client.update('Account', [{ Id: 'xxx', Name: 'Updated' }]);
await client.delete('Account', ['xxx']);
// Metadata
const sobjects = await client.describeGlobal();
const fields = await client.describe('Account');As Standalone Server
npm run build
npm run startOr with CLI:
sf-mcpDevelopment
# Setup
chmod +x init.sh
./init.sh
# Build
npm run build
# Test
npm test
# Type check
npm run typecheckProject Structure
src/
├── index.ts # Main exports
├── client.ts # SalesforceClient class
├── server.ts # MCP server wrapper
├── cli.ts # CLI entry point
├── config.ts # Configuration
├── types.ts # TypeScript types
├── errors.ts # Error classes
├── connection/ # Connection management
├── salesforce/ # REST API calls
├── sfcli/ # SF CLI wrapper
├── mcp/ # MCP tool definitions
└── tools/ # Tool implementationsMCP Tools
| Category | Tools | |----------|-------| | Connection | salesforce_get_org_info, salesforce_set_connection | | Query | salesforce_query, salesforce_query_more, salesforce_search, salesforce_tooling_query | | CRUD | salesforce_create, salesforce_read, salesforce_update, salesforce_delete, salesforce_upsert | | Metadata | salesforce_describe_global, salesforce_describe, salesforce_describe_field | | Apex | salesforce_execute_apex, salesforce_run_tests, salesforce_get_apex_body | | Logging | salesforce_get_logs | | User Management | salesforce_assign_permission_set | | Recent Records | salesforce_recently_accessedcently_updated, salesforce_recently_deleted | |, salesforce_re Limits | salesforce_get_limits | | Chatter | salesforce_chatter_post_feed_item |
Prerequisites
- Node.js 18+
- npm or yarn
- Salesforce CLI (sf) installed and configured
- At least one Salesforce org authenticated
License
MIT
