Real answers from a demo Salesforce org

Six questions asked of Verdant, a made-up solar-installation company that ships inside sf-intelligence. These are the tool’s real answers in plain words, with every component it cited. You can ask the same questions yourself in a couple of minutes.

Recorded with sf-intelligence 0.4.0. Pick a question below.

Question

“Can I delete the Amount field on Invoice?”

No 3 things depend on it.

Next: Change those three first, then delete the field.

Blocking
  • Apex classPaymentServiceApexClass:PaymentService

    Reads the field. Salesforce will refuse the delete while this code references it.

  • Formula fieldInvoice BalanceCustomField:Invoice__c.Balance__c

    Uses the field in its formula.

  • Roll-up summaryProject › Total InvoicedCustomField:Project__c.Total_Invoiced__c

    Sums the field across a project’s invoices.

What it checked
  • Found Apex, Formulas, Roll-ups
  • Nothing in Flows, Workflow rules, Validation rules
  • Not checked Reports, dashboards and list views, Lightning pages and components, Visualforce, Quick actions and buttons, Assignment, auto-response and escalation rules, Restriction and scoping rules, OmniStudio cards, Email templates, DLRS roll-up definitions, Plain-text mentions of the field name in code

“Not checked” means those kinds of metadata were not in the snapshot, so the answer says so instead of claiming nothing is there.

It also flags Amount as financial data (a pattern match, not a certainty), so a delete may need a data-retention sign-off.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.safe_to_delete_field",
  "arguments": {
    "fieldId": "CustomField:Invoice__c.Amount__c"
  }
}
Question

“Who can edit Invoices?”

2 can edit one permission set and one profile.

Next: Invoice sharing is Controlled by Parent, so what Sales Reps can see follows the parent record’s sharing. Review that before changing access.

Can edit
  • Permission setFinance TeamPermissionSet:Finance_Team

    Read, Create, Edit, View All on every record.

  • ProfileVerdant Sales RepProfile:Verdant_Sales_Rep

    Read, Create, Edit on records shared with them.

Left out on purpose
  • ProfileVerdant Read OnlyProfile:Verdant_Read_Only

    Read only.

  • GroupFinance GroupGroup:Finance_Group

    Sharing access only.

Record owners, manual sharing and team access are record data, not metadata, so the answer lists them as things it cannot see offline.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.who_can_access_object",
  "arguments": {
    "componentId": "CustomObject:Invoice__c",
    "accessLevel": "edit"
  }
}
Question

“What runs when a Project is saved?”

6 steps in the order Salesforce runs them.

Next: The flow creates a Permit record, so ask the same question about Permit to see what that sets off.

In order
  1. Before triggerProjectTriggerApexTrigger:ProjectTrigger

    Calls ProjectTriggerHandler, which sets Risk Score.

  2. Validation ruleComplete Requires PermitValidationRule:Project__c.Complete_Requires_Permit

    Blocks Status = Complete until Permit Approved is checked.

  3. SaveRecord is saved
  4. After triggerProjectTriggerApexTrigger:ProjectTrigger

    Calls ProjectTriggerHandler again.

  5. FlowProject On ApproveFlow:Project_On_Approve

    When Status is Approved, creates a Permit record, so Permit’s own automation runs too.

  6. Approval processDiscount ApprovalApprovalProcess:Project__c.Discount_Approval

    Applies when Contract Value is over 50,000.

No step writes back to Project, so there is no save loop here. When one does, the answer names it.

Conditions are listed, not evaluated against a specific record.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.what_happens_on_save",
  "arguments": {
    "objectApiName": "Project__c",
    "event": "update"
  }
}
Question

“What sets Invoice Status to Paid?”

1 may set it nothing sets Paid outright in the metadata.

Next: Open PaymentService and find where it assigns Status.

Definitely sets Paid

None found in the metadata.

May set Paid
  • Apex classPaymentServiceApexClass:PaymentService

    Writes Status. The value is set in code, which the snapshot does not capture, so read the class to confirm.

Cannot set Paid

None found.

Never modelled: managed-package code and automation, dynamic Apex, integrations and API loads, data imports, and manual edits. An empty “definitely sets” list is not proof that nothing sets the value.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.why_field_changed",
  "arguments": {
    "fieldId": "CustomField:Invoice__c.Status__c",
    "value": "Paid"
  }
}
Question

“Is this deployment risky? It deletes Invoice Amount and changes the Project On Approve flow.”

No-go 1 blocking change, 1 to review.

Next: Move PaymentService, the Balance formula and the roll-up off Amount, then run the review again.

Blocking
  • Field · deletedInvoice › AmountCustomField:Invoice__c.Amount__c

    Deleting it breaks what depends on it.

    • Apex classPaymentServiceApexClass:PaymentService
    • Formula fieldInvoice BalanceCustomField:Invoice__c.Balance__c
    • Roll-up summaryProject › Total InvoicedCustomField:Project__c.Total_Invoiced__c
Review first
  • Flow · changedProject On ApproveFlow:Project_On_Approve

    No dependents found, but Lightning pages, Lightning components and quick actions were not in the snapshot, so it can’t call this safe.

A change it cannot fully check is marked “review”, never “safe”.

No overlapping field writes or save loops on Invoice or Project involve these changes.

You can hand it a package.xml, a destructiveChanges.xml or the file list from a git diff instead of naming components.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.review_change",
  "arguments": {
    "components": [
      {
        "componentId": "CustomField:Invoice__c.Amount__c",
        "changeKind": "deleted"
      },
      {
        "componentId": "Flow:Project_On_Approve",
        "changeKind": "modified"
      }
    ]
  }
}
Question

“Brief me on the Invoice object.”

One-page brief written for someone new to the org.

Next: Share the brief with whoever is new, then ask what runs when an Invoice is saved.

What it is
  • Custom objectInvoiceCustomObject:Invoice__c

    An invoice billed against a Project for solar installation work. Child of Project via master-detail.

Key fields (top 3 of 6)
  • Currency · requiredAmountCustomField:Invoice__c.Amount__c

    Total amount billed on this invoice before payments are applied. Used by 3 components.

  • PicklistStatusCustomField:Invoice__c.Status__c

    Draft · Sent · Paid · Overdue. Used by 2 components.

  • Roll-up summaryTotal PaidCustomField:Invoice__c.Total_Paid__c

    Sum of all Payment amounts applied to this invoice.

Connected to
  • Parent · master-detailProjectCustomObject:Project__c
  • Child · master-detailPaymentCustomObject:Payment__c

    Deleting an Invoice deletes its Payments.

The full brief also covers what runs on save, who can access it, integrations and risk signals, such as “1 of 6 custom fields have neither a description nor help text”.

For developers: the tool call

Your assistant made this call to the sf-intelligence MCP server:

{
  "name": "sfi.object_360",
  "arguments": {
    "objectApiName": "Invoice__c",
    "format": "handbook"
  }
}
See the full brief, exactly as returned
# Invoice (`Invoice__c`) — object brief

## What it is
- Custom object, plural label "Invoices".
- Description: An invoice billed against a Project for solar installation work. Child of Project via master-detail.
- Org-wide default: internal `ControlledByParent`, external `not captured`.

## Key fields (6 of 6: 6 custom, 0 standard)
Ranked: declared required / external id / unique first (1 / 0 / 0), then by how many components reference the field.
- `Amount__c` "Amount" (Currency; required) — 3 referencing component(s). Total amount billed on this invoice before payments are applied.
- `Status__c` "Status" (Picklist) — 2 referencing component(s). Lifecycle status of the invoice.
- `Total_Paid__c` "Total Paid" (Summary) — 2 referencing component(s). Sum of all Payment amounts applied to this invoice.
- `Project__c` "Project" (MasterDetail; → `Project__c`) — 1 referencing component(s)
- `Balance__c` "Balance" (Currency; formula) — 0 referencing component(s). Outstanding balance on the invoice: amount billed minus total payments applied.
- `Due_Date__c` "Due Date" (Date) — 0 referencing component(s). Date by which the invoice balance is due.

## Picklists (1 of 1, most-referenced first)
- `Status__c`: 4 active value(s) — Draft · Sent · Paid · Overdue

## Record types (0 total, 0 active)
- None: `RecordType` was retrieved by the last refresh and none is attached to this object — this empty result means "this object has no record types".

## Relationships (1 lookup field(s) to parents, 1 child object(s) pointing here, among retrieved fields)
Parents (fields on this object):
- `Project__c` → `Project__c` (MasterDetail)
Children (fields on other objects that point here):
- `Payment__c` via `Invoice__c` (1 master-detail — deletes cascade)
- A child appears only when its lookup field is in this vault with a captured target; a standard child whose lookup was not captured (e.g. a polymorphic activity lookup) is not listed.

## What runs when a record is saved (1 active component(s) in 1 step(s), in order)
Tags show which events each step fires on. Entry conditions are listed by the save tool, not evaluated here.
- — the record is written to the database —
- **Parent roll-up summaries recalculated** (1): `Total_Invoiced__c` [insert+update]
- Not in the sequence above — delete: 1 step(s) from 1 component(s) (`Total_Invoiced__c`); undelete: 1 step(s) from 1 component(s) (`Total_Invoiced__c`) (`sfi.what_happens_on_save` {"event":"delete"}).
- Other components that write this object's fields (not part of the sequence above): 1 ApexClass (`sfi.why_field_changed` per field).

## Who can access it (2 profile(s), 1 permission set(s) grant at least one object permission)
- Read: 2 profile(s) (`Verdant_Read_Only`, `Verdant_Sales_Rep`), 1 permission set(s) (`Finance_Team`)
- Create: 1 profile(s) (`Verdant_Sales_Rep`), 1 permission set(s) (`Finance_Team`)
- Edit: 1 profile(s) (`Verdant_Sales_Rep`), 1 permission set(s) (`Finance_Team`)
- Delete: none declared.
- View All: 0 profile(s), 1 permission set(s) (`Finance_Team`)
- Modify All: none declared.
- These are permission containers, not users; permission set groups are not expanded here (`sfi.object_access_audit` does that). Record-level visibility also depends on sharing.

## Integrations touching it (0)
- None found among outbound messages, named credentials/external services/connected apps that reference it, Apex REST resources that read or write it, and Change Data Capture channel members.
- Apex callouts are not attributed to an object in the vault; `sfi.endpoint_catalog` / `sfi.integration_map` list them org-wide.

## Risk signals (1)
- 1 of 6 custom field(s) have neither a description nor help text.

## Where to look next (non-core tools run through `sfi.run_analysis`)
- `sfi.what_happens_on_save` {"objectApiName":"Invoice__c","event":"update"} — the full ordered save with conditions and actions
- `sfi.object_access_audit` {"componentId":"CustomObject:Invoice__c"} — every grant incl. permission set groups
- `sfi.generate_data_dictionary` {"objectId":"CustomObject:Invoice__c"} — every field
- `sfi.field_360` {"fieldId":"CustomField:Invoice__c.Amount__c"} — everything about one field
- `sfi.object_360` {"objectApiName":"Invoice__c"} — full usage accounting (reports, pages, code)

_Reference counts read MODELED edges of mixed confidence: metadata declarations are `declared`, Apex references `parsed` or `heuristic`. Dynamic SOQL, reflective access and runtime integration payloads are invisible, so a small or zero count is never proof of disuse._

_Metadata only: counts here are components, never records. Record counts, owners and recency need the live tools (`sfi.live_count`, `sfi.live_recent_activity`). `required` is the field's declared flag; platform- and layout-required fields are not visible in field metadata._
Try it yourself

Ask the demo org in your own assistant.

The demo org is built in, so there is nothing to log in to. Add it to your assistant, restart it, and ask any of the questions above.

  1. Copy the snippet for your assistant.
  2. Restart the assistant (or reload its MCP servers).
  3. Ask: “Can I delete the Amount field on Invoice?”

The first run builds the demo in a few seconds. Nothing leaves your computer.

Claude Code

Terminal
claude mcp add --scope user sf-intelligence-demo -- npx -y sf-intelligence demo

Then start claude and ask a question. /mcp shows the server as connected.

Claude Desktop

claude_desktop_config.json
{
  "mcpServers": {
    "sf-intelligence-demo": {
      "command": "npx",
      "args": ["-y", "sf-intelligence", "demo"]
    }
  }
}

Merge this into the file if it already lists other servers, then fully quit and reopen Claude Desktop.

Cursor

.cursor/mcp.json
{
  "mcpServers": {
    "sf-intelligence-demo": {
      "command": "npx",
      "args": ["-y", "sf-intelligence", "demo"]
    }
  }
}

Cursor doesn't reload this file by itself: turn the server off and on in Settings → MCP. Or add the demo to Cursor in one click.

VS Code + Copilot

.vscode/mcp.json
{
  "servers": {
    "sf-intelligence-demo": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "sf-intelligence", "demo"]
    }
  }
}

VS Code reads the servers key, not mcpServers. With the wrong key it loads nothing and shows no error. Use Copilot Chat in Agent mode.

Codex

Terminal
codex mcp add sf-intelligence-demo -- npx -y sf-intelligence demo
or by hand: ~/.codex/config.toml
[mcp_servers.sf-intelligence-demo]
command = "npx"
args = ["-y", "sf-intelligence", "demo"]
startup_timeout_sec = 30

Codex uses TOML. A longer start-up timeout gives the first download time to finish. Check it with codex mcp list.

About the demo org

A small org set up like a real one.

Verdant has custom objects such as Project, Invoice, Payment and Permit, with Apex, flows, validation rules, an approval process, profiles and permission sets. None of it is a real company’s data.

Ready for your own org? Connect it in three steps