Atlas / MCP servers / scoobydrew83 / sfdt

sfdtBLOCK

mcp/scoobydrew83/sfdt

Salesforce DevTools — CLI, VS Code extension, sf plugin, MCP server, and web dashboard for Salesforce DX deploy, test, org health, and release management. AI-optional, CI-ready.

Verdict
BLOCK
Grade
F
Trust score
46 /100
Exposed tools
54 31r · 21w · 2d
Transport
stdio
License
Apache-2.0
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Org health and tech debt for Salesforce — see the org you actually have, then change it safely.

@sfdt/cli is the command-line core of the SFDT suite. It diagnoses org health and technical debt (audit, monitoring, drift, dependencies, permissions, coverage), groups that evidence under the AI-Readiness Index, and ships changes with preflight, testing and rollback. Pairs with the SFDT Chrome extension and the VS Code extension.

📖 [Read the docs at sfdt.dev →](https://sfdt.dev/) · npm · Usage guide

[](https://www.npmjs.com/package/@sfdt/cli) [](https://www.npmjs.com/package/@sfdt/cli) [](https://marketplace.visualstudio.com/items?itemName=sfdt.sfdt-devtools) [](https://github.com/scoobydrew83/sfdt/actions/workflows/ci.yml) [](https://github.com/scoobydrew83/sfdt/actions/workflows/codeql.yml) [](https://github.com/scoobydrew83/sfdt/blob/main/LICENSE) [](https://nodejs.org)

Features

  • Org health & tech-debt diagnosis — sfdt audit (17 checks: access sprawl, MFA, unused and unreferenced Apex, inactive automation, deprecated API versions, connected apps, missing field descriptions, setup audit-trail anomalies), sfdt monitor (limits, erro
Read from source at commit 15935ebe5f2fOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add web --env GW_TOKEN=${GW_TOKEN} -- npx -y @sfdt/[email protected]
claude-desktop
{
  "mcpServers": {
    "web": {
      "command": "npx",
      "args": [
        "-y",
        "@sfdt/[email protected]"
      ],
      "env": {
        "GW_TOKEN": "${GW_TOKEN}"
      }
    }
  }
}
03

Exposed tools (54)

31 read · 21 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
Areadd
D1read
Setwrite.
Stage1readpresent
V2readdocumented
sfdt-plugin-customreadA custom plugin for sfdt
sfdt-plugin-promptedreadAnother desc
sfdt_apex_logsreadList recent Apex debug logs, or retrieve one log body by Id. Read-only.
sfdt_apex_runwriteExecute Anonymous Apex in the org from a file or inline code. Mutating (the code runs with the authenticated user\
sfdt_apex_tracereadManage Apex debug trace flags. action=
sfdt_api_versionsreadAudit Salesforce API versions across local source and the org — per-type version distributions (Apex classes/triggers, Flows, LWC, Aura), sourceApiVersion, the org\
sfdt_comparereadCompare metadata between two orgs, or between local source and an org. Returns compare results.
sfdt_coveragereadReport Apex code coverage for a Salesforce org — org-wide percentage plus per-class coverage. Read-only.
sfdt_data_deletedestructiveBulk-delete a configured data set in the org. Destructive — requires confirmExecution.
sfdt_data_exportwriteExport a configured data set from the org to local files. Reads from the org and writes local data files (read-only with respect to the org).
sfdt_data_importwriteImport a configured data set into the org. Mutating (writes records) — requires confirmExecution.
sfdt_data_loadwriteLoad a bulk data set (bulk.json) into the org over Bulk API v2 — insert or upsert by external id. Mutating (writes records) — requires confirmExecution.
sfdt_dependenciesreadShow the metadata dependencies of a component — what it references and what references it. Read-only.
sfdt_deploywritePerform a metadata deployment to a target Salesforce org. Supports a smart delta mode (only git-changed metadata with smart test selection). Potentially destructive.
sfdt_docsreadGenerate MkDocs-compatible project documentation (custom objects + fields, Apex classes, Flows) with an optional AI overview and a Mermaid ER diagram of the data model.
sfdt_driftwriteRun metadata drift detection between a target Salesforce org and local source directories.
sfdt_events_listreadList every subscribable streaming channel in the org — custom and standard platform events, custom channels, and Change Data Capture entities — with each channel\
sfdt_events_publishwritePublish one platform event to the org\
sfdt_events_tailreadSubscribe to a platform event or CDC channel and collect events. ALWAYS bounded — it returns after timeoutSeconds, or earlier once max events arrive or an expectation matches. Set replay to
sfdt_flow_scanreadAnalyze a Salesforce org\
sfdt_get_parked_resultreadRetrieve the full payload of a previously parked tool result.
sfdt_historywriteShow recent sfdt run history (audit, monitor, quality, test, deploy, agent-test, ...) from the local run index — trend org-health, test, and deploy outcomes over time. Read-only.
sfdt_ledger_listreadList org changes sfdt has recorded, newest first, with the state each replaced. Status is derived: applied, failed, undone, or PENDING — pending means the change was recorded but its outcome never was, so the command may have been interrupted mid-write and the org should be checked. Read-only.
sfdt_logsreadRetrieve the latest structured or raw execution logs for DevOps actions.
sfdt_manifest_from_gitreadGenerate package.xml and destructiveChanges.xml manifests using Git diff analysis.
sfdt_monitorwriteRun org monitoring checks (org limit consumption, recent Apex job failures, security health-check score, org info, recent deployment health, legacy API usage, paused flow interviews) and optionally a full metadata backup. Returns a normalised snapshot of check results.
sfdt_notifywriteSend the latest audit or monitor snapshot to configured notification channels (Slack/Teams/Google Chat/email/webhook), applying each channel\
sfdt_permissions_matrixwriteShow what each profile and permission set GRANTS on one object — object-level CRUD plus per-field read/edit. CRITICAL WORDING: these are GRANTED permissions, never
sfdt_pr_commentwritePost the latest audit or monitor snapshot to the current pull request as a markdown comment (via the gh CLI).
sfdt_preflightwriteRun sfdt pre-deployment validation checks (git clean state, branch naming rules, Apex test runs, coverage threshold checks, etc.). Useful before validation or deployment.
sfdt_qualityreadAnalyze Apex test quality, generate IsTest boilerplate stubs, or generate a fix-plan for coverage gaps.
sfdt_quick_deploywriteQuick deploy a previously validated metadata validation job using validation job ID.
sfdt_record_clonewriteCreate a copy of a record from its createable fields, with optional overrides. Mutating — requires confirmExecution.
sfdt_record_editwriteUpdate fields on one record. Fields the org reports as non-editable are refused locally, with the reason, before anything is sent. Mutating — requires confirmExecution.
sfdt_record_getreadRead one Salesforce record and report which fields are editable, and why the rest are not. Read-only.
sfdt_releasereadBuild a release: generate the release manifest (package.xml) and release notes for a package. Writes release artifacts to the repo. Mutating — requires confirmExecution.
sfdt_retrofitreadRetrofit metadata from a source org to a target org: retrieve specified metadata types, commit, then smart-deploy. Validate-only unless execute=true.
sfdt_rollbackreadRoll back the last successful deployment using org backup snapshots.
sfdt_scanreadFetch the complete metadata inventory of a Salesforce org (all component types and members). Read-only.
sfdt_scratch_createwriteCreate a Salesforce scratch org. Mutating (consumes a DevHub scratch-org allocation) — requires confirmExecution.
sfdt_scratch_deletedestructiveDelete a scratch org by alias or username. Destructive — requires confirmExecution.
sfdt_scratch_poolreadInspect or top up the scratch-org pool. action=
sfdt_soql_describereadDescribe an sObject — fields (type, picklists, references), key prefix, and child relationships. Read-only.
sfdt_soql_planreadFetch the org query plans for a SOQL query (REST explain endpoint) — leading operation, relative cost, cardinality, and notes. The query is never executed. Read-only.
sfdt_soql_querywriteExecute a SOQL SELECT with a row bound enforced (config soql.defaultLimit/maxLimit — never unbounded). Returns records plus truncation metadata. Read-only.
sfdt_soql_searchreadFind sObjects in the org by name substring (schema search across the org inventory). Read-only.
sfdt_soql_validatereadValidate a SOQL query without executing it — local static checks plus an org LIMIT 0 round-trip (degrades to local-only when the org is unreachable). Read-only.
sfdt_testwriteRun Apex tests via the enhanced test runner. Optionally limit to specific test classes. Consumes org test resources; not metadata-mutating.
sfdt_validatewritePerform a deployment validation dry-run on Salesforce without committing changes.
04

Trust audit

BLOCKgrade F · trust 46/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (4 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
skills/sfdt-cli/SKILL.md:29
sfdt is a **generic tool** — it contains no project-specific values. All configuration lives in a `.sfdt/` directory created per-project by `sfdt init`. Commands are thin wrappers that load config, se
Why it matters. asks the agent to read credentials
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
host/installers/README.md:20
`chrome://extensions` with Developer Mode enabled, or use the public Web
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMInventory / provenance · inv.binary · CWE-1104
extension/lib/apex-log/viewmodel.ts
viewmodel.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/lib/audit-logger.test.js:124
const key = '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEA\nzzz\n-----END RSA PRIVATE KEY-----';
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/lib/audit-logger.test.js:131
const out = redactSensitiveData('-----BEGIN PRIVATE KEY-----\nabc\n-----END PRIVATE KEY-----');
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/lib/audit-logger.test.js:257
const SECRET = '-----BEGIN RSA PRIVATE KEY-----\n'
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/lib/audit-logger.test.js:268
'-----BEGIN PRIVATE KEY-----',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/lib/audit-logger.test.js:284
{ Id: '5000', d: '-----BEGIN PRIVATE KEY-----' },
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
sfdt_data_delete, sfdt_scratch_delete
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
test/commands/ci-template-injection.test.js
ci-template-injection.test.js
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
vscode/.vscodeignore
.vscodeignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.symlink · CWE-1104
AGENTS.md
AGENTS.md
Why it matters. link not followed
LOWInventory / provenance · inv.symlink · CWE-1104
GEMINI.md
GEMINI.md
Why it matters. link not followed
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
test/action.test.js:18
action = yaml.load(await fs.readFile(ACTION_PATH, 'utf-8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
test/commands/ci.test.js:68
expect(() => yaml.load(r.content), `${provider}/${type}/${auth} must parse as YAML`).not.toThrow();
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
test/commands/ci.test.js:245
expect(() => yaml.load(r.content)).not.toThrow();
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
extension/entrypoints/app/main.ts:14
import { SFDT_TOKENS_CSS } from '../../lib/tokens.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
extension/entrypoints/app/main.ts:15
import { SFDT_COMPONENT_CSS } from '../../lib/ui-styles.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
extension/entrypoints/app/main.ts:16
import { watchTheme, OWN_PAGE_COLOR_SCHEME_CSS } from '../../lib/theme.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
extension/entrypoints/app/main.ts:17
import { isFeatureEnabled, loadSettings } from '../../lib/settings.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
extension/entrypoints/app/main.ts:18
import { loadRecents, pushRecent } from '../../lib/palette-recents.js';
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/lib/config-trust.test.js:95
describe('ai.baseURL — exfiltration destination (H3)', () => {
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/lib/config-trust.test.js:362
['data.dir', { data: { dir: '/tmp/exfil' } }],
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/lib/config-trust.test.js:523
{ type: 'email', to: ['[email protected]'], smtp: { hostEnv: 'SMTP_HOST' } },
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/lib/config-trust.test.js:532
{ type: 'email', to: ['[email protected]'], smtp: { hostEnv: 'SMTP_HOST' } },

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 15935ebe5f2ffull audit observations/trust-audit/mcp-server/scoobydrew83__sfdt.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1115935ebe5f2fBLOCKF46first audit
06

Questions

What is the sfdt MCP server?

Salesforce DevTools — CLI, VS Code extension, sf plugin, MCP server, and web dashboard for Salesforce DX deploy, test, org health, and release management. AI-optional, CI-ready.

What tools does sfdt expose?

54 in total: 31 read-only, 21 that write, and 2 that can delete or overwrite (sfdt_data_delete, sfdt_scratch_delete). Every one is listed on this page with its risk.

Is sfdt safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (46/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does sfdt need?

It reads GW_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does sfdt run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @sfdt/web at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (15935ebe5f2f), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement