SFDC HTTP Transport MCP Server with OAuth from CLI - #2
Conversation
…rt server file add + stdio disable
…pt mcp sdk, fix on baseline tools for oauth mode
There was a problem hiding this comment.
Pull request overview
Adds an Express-based StreamableHTTP transport for the Salesforce MCP server with OAuth header-based auth, request isolation via AsyncLocalStorage, and a new --api-only mode for cloud/serverless deployments.
Changes:
- Introduces HTTP transport server (
/mcp) with SSE keepalives, OAuth discovery endpoints, and an Express auth middleware. - Adds AsyncLocalStorage request context propagation and updates auth to prefer per-request OAuth tokens over CLI creds.
- Adds/updates several provider tools (CRUD + search/describe) and introduces an
--api-onlytool registration filter.
Reviewed changes
Copilot reviewed 34 out of 36 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/mcp/tsconfig.json | Adds DOM lib typings for fetch/HTTP mode compilation. |
| packages/mcp/src/utils/request-context.ts | Adds AsyncLocalStorage request context + chdir shim for HTTP mode. |
| packages/mcp/src/utils/registry-utils.ts | Adds --api-only tool filtering during registration. |
| packages/mcp/src/utils/auth.ts | Prefers OAuth connection (AsyncLocalStorage) over CLI auth in HTTP mode. |
| packages/mcp/src/utils/auth-helper.ts | Implements OAuth header extraction + userinfo slow path + Connection creation. |
| packages/mcp/src/types/auth-context.ts | Defines OAuth auth context type used by helper. |
| packages/mcp/src/sf-mcp-server.ts | Wraps tool execution in per-request AsyncLocalStorage context. |
| packages/mcp/src/middleware/oauth-middleware.ts | Adds Express middleware enforcing Bearer auth for tool calls. |
| packages/mcp/src/index.ts | Adds CLI flags for HTTP transport + forces --api-only in HTTP mode. |
| packages/mcp/src/http-server.ts | Adds Express StreamableHTTP server, OAuth discovery routes, SSE keepalive. |
| packages/mcp/package.json | Adds Express/CORS/Helmet dependencies and typings. |
| packages/mcp-test-client/tsconfig.json | Enables skipLibCheck for test client compilation. |
| packages/mcp-test-client/tsconfig.build.json | Enables skipLibCheck for test client build. |
| packages/mcp-provider-dx-core/src/tools/update_record.ts | Adds new update_record CRUD tool. |
| packages/mcp-provider-dx-core/src/tools/search_records.ts | Adds new SOSL-based search_records tool. |
| packages/mcp-provider-dx-core/src/tools/list_all_orgs.ts | Adds HTTP transport detection messaging for OAuth mode. |
| packages/mcp-provider-dx-core/src/tools/get_username.ts | Adds HTTP transport detection messaging for OAuth mode. |
| packages/mcp-provider-dx-core/src/tools/get_record.ts | Adds new get_record tool. |
| packages/mcp-provider-dx-core/src/tools/describe_object.ts | Adds new describe_object tool. |
| packages/mcp-provider-dx-core/src/tools/delete_record.ts | Adds new delete_record tool. |
| packages/mcp-provider-dx-core/src/tools/create_record.ts | Adds new create_record tool. |
| packages/mcp-provider-dx-core/src/shared/utils.ts | Adds isHttpTransport() helper for HTTP vs stdio detection. |
| packages/mcp-provider-dx-core/src/index.ts | Registers new CRUD/search/describe tools in provider. |
| packages/mcp-provider-devops/tsconfig.build.json | Enables skipLibCheck for provider build. |
| packages/mcp-provider-code-analyzer/tsconfig.build.json | Enables skipLibCheck for provider build. |
| packages/mcp-provider-api/tsconfig.json | Enables skipLibCheck for provider API build. |
| packages/EXAMPLE-MCP-PROVIDER/tsconfig.build.json | Enables skipLibCheck for example provider build. |
| package.json | Adds Yarn resolutions for MCP SDK and eventsource types. |
| docker-compose.yml | Adds container configuration for running HTTP server locally. |
| Dockerfile | Adds multi-stage image build + default HTTP OAuth-only runtime flags. |
| .github/workflows/image_deploy.yml | Adds deployment workflow using kubectl + EKS. |
| .github/workflows/ci-asc.yml | Adds ECR build/push workflow for Docker image. |
| .env.example | Adds SF_USERINFO_URL env example. |
| .dockerignore | Adds Docker build context ignore rules. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
:( Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
ryohang
left a comment
There was a problem hiding this comment.
can you please make a PR to the upstream without the workflow changes.
|
|
||
| export async function getDefaultTargetDevHub(): Promise<OrgConfigInfo | undefined> { | ||
| return getDefaultConfig(OrgConfigProperties.TARGET_DEV_HUB); | ||
| } |
There was a problem hiding this comment.
packages/mcp/src/utils/auth.ts - Major refactor
❌ Gutted core auth functions (commented out getAllAllowedOrgs, getDefaultTargetOrg, etc.)
❌ Changed getConnection() to OAuth-only
Impact: Upstream auth changes will cause merge conflicts
Recommendation: Consider a wrapper pattern instead:
typescript
Copy code
// Keep original auth.ts intact
// Create new oauth-auth.ts with OAuth-specific logic
// Use strategy pattern in getConnection() to switch modes
There was a problem hiding this comment.
completed with wrapper pattern, no merge conflicts
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 94 out of 96 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Key Changes
HTTP Server & Transport Layer
AsyncLocalStorage for Request Isolation
OAuth Authentication
Tool Updates for OAuth Mode
Docker & CI/CD
Architecture
Client Request (Jarvis Registry)
↓ Authorization: Bearer
↓ X-Salesforce-Instance-URL: (optional for now, custom header later)
OAuth Middleware (validates headers)
↓
Express HTTP Server
↓
AsyncLocalStorage.run(context, ...)
↓
MCP StreamableHTTP Transport
↓
Tool.exec(args, extra)
↓
Auth Helper (extracts token from context)
↓
jsforce Connection (per-request, isolated)
@copilot