# sf_create_apex_class

Creates and deploys an Apex class to the Salesforce org using the Metadata API. Accepts the full Apex source code including the class declaration. Use for any type of Apex class: service classes, controllers, batch classes, schedulable classes, queueable classes, test utilities, etc. IMPORTANT — If this class will be used as an Agentforce agent action: it MUST contain a public static method annotated with @InvocableMethod. Classes without @InvocableMethod cannot be invoked by agents and will silently fail at runtime. Example minimum structure: public class MyClass { @InvocableMethod(label=

Agent View of the PolicyLayer registry record for `sf_create_apex_class`. HTML page: https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-apex-class

## Facts

- Tool: `sf_create_apex_class`
- Server: Salesforce Metadata Mcp (`salesforce-metadata-mcp`) — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp.md
- Install: `npx -y salesforce-metadata-mcp`
- Homepage: https://github.com/semwalajay83-sem/salesforce-metadata-mcp
- Risk category: Execute (High risk)
- Registry record: grade F, identity unverified
- Server rate-limited: no
- Parameters: 0
- Recommended policy verdict: Rate-limited

## Example call (MCP tools/call, JSON-RPC 2.0)

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sf_create_apex_class",
    "arguments": {}
  }
}
```

## Why sf_create_apex_class is rated High

This tool deploys arbitrary Apex code to a live Salesforce org. Deploying code is an Execute-category action because it runs/installs executable logic with effects that depend entirely on the code provided. The blast radius is high since malicious or erroneous Apex can access, modify, or delete org data, call external services, escalate permissions, or destabilize the org.

From the tool's own definition: "Creates and deploys an Apex class to the Salesforce org using the Metadata API. Accepts the full Apex source code including the class declaration."

## Use case

AI agents invoke sf_create_apex_class to trigger actions in Salesforce Metadata Mcp. What it does depends on the arguments the agent supplies, and its effects often reach beyond the immediate call: builds kicked off, notifications sent, workflows started.

## Recommended policy (PolicyLayer)

Verdict: **Rate-limited**. Enforced by the PolicyLayer MCP gateway (https://policylayer.com/mcp-gateway) before a call reaches Salesforce Metadata Mcp:

```json
{
  "version": "1",
  "default": "deny",
  "tools": {
    "sf_create_apex_class": {
      "limits": [
        {
          "counter": "sf_create_apex_class_rate",
          "window": "minute",
          "max": 10,
          "scope": "grant"
        }
      ]
    }
  }
}
```

## Other tools on Salesforce Metadata Mcp (212)

- `sf_bulk_delete_records` — Destructive — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-bulk-delete-records.md
- `sf_delete_record` — Destructive — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-delete-record.md
- `sf_delete_scratch_org` — Destructive — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-delete-scratch-org.md
- `sf_activate_omniscript` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-activate-omniscript.md
- `sf_create_apex_test_class` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-apex-test-class.md
- `sf_create_apex_trigger` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-apex-trigger.md
- `sf_create_flow` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-flow.md
- `sf_create_scheduled_job` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-scheduled-job.md
- `sf_create_scratch_org` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-create-scratch-org.md
- `sf_deactivate_flow` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-deactivate-flow.md
- `sf_deploy_metadata` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-deploy-metadata.md
- `sf_devops_promote_work_item` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-devops-promote-work-item.md
- `sf_execute_anonymous_apex` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-execute-anonymous-apex.md
- `sf_install_package` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-install-package.md
- `sf_promote_devops_work_item` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-promote-devops-work-item.md
- `sf_run_apex_tests` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-run-apex-tests.md
- `sf_send_email` — Execute — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-send-email.md
- `sf_check_code_coverage` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-check-code-coverage.md
- `sf_check_deploy_status` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-check-deploy-status.md
- `sf_check_devops_commit_status` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-check-devops-commit-status.md
- `sf_detect_devops_merge_conflict` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-detect-devops-merge-conflict.md
- `sf_explore_slds_blueprints` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-explore-slds-blueprints.md
- `sf_export_omnistudio_component` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-export-omnistudio-component.md
- `sf_export_records` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-export-records.md
- `sf_get_apex_test_results` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-apex-test-results.md
- `sf_get_dataraptor` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-dataraptor.md
- `sf_get_deployment_history` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-deployment-history.md
- `sf_get_event_logs` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-event-logs.md
- `sf_get_field_history` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-field-history.md
- `sf_get_flexcard` — Read — https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp/sf-get-flexcard.md
- …and 182 more: https://policylayer.com/tools/io-github-semwalajay83-sem-salesforce-metadata-mcp.md

## For agents

This record is a snapshot. Live verdicts and the full registry:

- Check every server in your MCP config at once: `npx -y policylayer stack`
- Vet a server before you add it: install the mcp-precheck skill — `npx skills add https://policylayer.com` (skill text: https://policylayer.com/skill.md)
- Query the registry over MCP: endpoint `https://api.policylayer.com/mcp` — tools `check_mcp_server`, `check_mcp_stack`, `check_tool`, `search_registry`, `get_change_events`

---

Source: the PolicyLayer MCP registry — one continuously verified record per MCP server. Full record: https://policylayer.com/registry?q=io-github-semwalajay83-sem-salesforce-metadata-mcp · API: https://policylayer.com/registry/api · Policy library: https://policylayer.com/policies/io-github-semwalajay83-sem-salesforce-metadata-mcp
