← All articles

Beta Testing the SFMC Developer Agent: An Honest Review for Salesforce Marketing Cloud Developers

AI & MCP for SFMC June 15, 2026 · By Matthew Smith

Beta Testing the SFMC Developer Agent: An Honest Review for Salesforce Marketing Cloud Developers

The sfmcdeveloper.dev agent is a purpose-built AI copilot for Salesforce Marketing Cloud that writes AMPscript, SSJS, and Automation Studio SQL against your real Data Extension schema — and exposes an MCP server so tools like Cursor can call it directly. After three weeks of beta testing it on production-shaped work, here's what actually works, what still needs polish, and how to get a temporary Pro license if you want to try it yourself.

What the SFMC Developer Agent Actually Is

Most AI coding tools are trained on generic web data. They hallucinate SSJS Platform objects, invent AMPscript functions that don't exist, and write SQL that violates Automation Studio's 30-minute timeout or SELECT * rules. The sfmcdeveloper.dev agent is different in two specific ways:

  1. It is grounded in your tenant. You connect it to your Marketing Cloud account via an installed package, and it reads your Data Extension schema, your send classifications, and your data view access. When it writes a SQL query, it knows whether _Sent, _Open, and _Job are queryable in your MID.
  2. It exposes an MCP server. Model Context Protocol means you can wire it into Cursor, Claude Desktop, or any MCP-compatible client and call it as a tool from inside your editor — not a separate chat tab.

For a deeper look at how this fits into a developer's daily workflow, see How to Create a CloudPage in Salesforce Marketing Cloud — the agent can scaffold the entire CloudPage, including the SSJS Platform calls and the AMPscript personalization, in one prompt.

How I Structured the Beta Test

I ran the agent through six real-world tasks over three weeks:

For each task, I scored the agent's first output on three criteria: correctness (does it run without errors?), idiomatic style (does it look like something a senior SFMC dev would write?), and tenant-awareness (does it use my actual DE names and field names?).

Real Code Examples From the Beta

AMPscript: Personalization with Fallbacks

I asked the agent to write a personalization block that pulls first name from a Data Extension, falls back to a default value, and handles the case where the subscriber key isn't found. Here's what it produced:

%%[
VAR @firstName, @subscriberKey, @defaultName, @rowCount

SET @subscriberKey = AttributeValue("subscriber_key")
SET @defaultName = "there"

IF NOT EMPTY(@subscriberKey) THEN
  SET @rows = LookupRows("Contacts", "SubscriberKey", @subscriberKey)
  SET @rowCount = RowCount(@rows)

  IF @rowCount > 0 THEN
    SET @row = Row(@rows, 1)
    SET @firstName = Field(@row, "FirstName")

    IF EMPTY(@firstName) THEN
      SET @firstName = @defaultName
    ENDIF
  ELSE
    SET @firstName = @defaultName
  ENDIF
ELSE
  SET @firstName = @defaultName
ENDIF

IF @firstName == "there" THEN
  /* No personalization, generic greeting */
ELSE
  /* Personalized greeting */
ENDIF
]%%

Hello %%= v(@firstName) =%%,

What I liked: it used LookupRows instead of Lookup (correct for handling the empty-result case), it checked RowCount before accessing Row(), and it used AttributeValue to safely read the subscriber key. This is the pattern a senior SFMC developer would actually write.

SSJS: CloudPage with DE Read and Write

I asked for a CloudPage that reads a contact's preferences from one DE and logs a confirmation to another. The agent produced this:

<script runat="server">
Platform.Load("Core", "1");

var subscriberKey = Attribute.GetValue("subscriber_key");
var preference = Request.GetQueryStringParameter("preference");

if (subscriberKey && preference) {
  // Read current preferences
  var readDE = DataExtension.Init("Contact_Preferences");
  var filter = { Property: "SubscriberKey", SimpleOperator: "equals", Value: subscriberKey };
  var rows = readDE.Rows.Lookup(filter);

  if (rows && rows.length > 0) {
    var currentPrefs = rows[0].["Preferences"];

    // Write confirmation log
    var writeDE = DataExtension.Init("Preference_Change_Log");
    writeDE.Rows.Add({
      SubscriberKey: subscriberKey,
      OldPreference: currentPrefs,
      NewPreference: preference,
      ChangeDate: Now()
    });

    Write("Preferences updated successfully.");
  } else {
    Write("Subscriber not found.");
  }
} else {
  Write("Missing required parameters.");
}
</script>

What I liked: it used DataExtension.Init (the modern Core library pattern), it used SimpleOperator: "equals" instead of string concatenation, and it handled the empty-rows case before trying to access rows[0]. The Now() function for the timestamp is correct for SSJS.

SQL: Automation Studio Query Against Data Views

I asked for a query that finds subscribers who opened at least 3 emails in the last 30 days but haven't clicked anything. The agent produced this:

SELECT 
  s.SubscriberKey,
  s.EmailAddress,
  COUNT(DISTINCT o.OpenID) AS OpenCount,
  MAX(o.EventDate) AS LastOpenDate
FROM _Sent s
INNER JOIN _Open o 
  ON s.JobID = o.JobID 
  AND s.ListID = o.ListID 
  AND s.SubscriberID = o.SubscriberID
  AND s.BatchID = o.BatchID
  AND s.EventDate = o.EventDate
WHERE o.EventDate >= DATEADD(DAY, -30, GETDATE())
  AND s.SubscriberKey NOT IN (
    SELECT DISTINCT c.SubscriberKey 
    FROM _Click c 
    WHERE c.EventDate >= DATEADD(DAY, -30, GETDATE())
  )
GROUP BY s.SubscriberKey, s.EmailAddress
HAVING COUNT(DISTINCT o.OpenID) >= 3

What I liked: it used the correct four-column join between _Sent and _Open (JobID, ListID, SubscriberID, BatchID), it used NOT IN with a subquery against _Click for the suppression logic, and it used HAVING instead of a WHERE clause for the aggregate filter. No SELECT *, no temp tables, no functions that would break the 30-minute timeout.

What Worked Well

Tenant awareness was the standout feature. When I asked the agent to write a query, it pulled my actual Data Extension names from the schema. When I asked for an AMPscript block, it used the field names from my Contacts DE without me having to paste them in. This is the difference between an agent that helps and an agent that wastes your time.

The MCP server integration with Cursor was smooth. I added the MCP server config, restarted Cursor, and the agent appeared as a tool. I could highlight code in my editor, ask the agent to review it, and it would respond with corrections grounded in my schema.

Idiomatic style. The code it produced looked like what a senior SFMC developer would write — not like generic LLM output. It used LookupRows over Lookup, DataExtension.Init over Lookup for SSJS, and the correct data view join patterns for SQL.

Common Pitfalls and Gotchas

Even with a well-trained agent, you'll hit these issues:

1. The agent doesn't know your send classification. If you ask it to write a triggered send, it will produce code that works generically but may not match your specific send classification's required fields. Always verify the TriggeredSendDefinition configuration manually.

2. AMPscript Lookup vs LookupRows confusion. The agent sometimes uses Lookup when LookupRows is the safer choice. If you're checking for existence before accessing a field, force it to use LookupRows and check RowCount.

3. SSJS Platform.Load version. The agent defaults to "Core", "1" but some advanced functions require "Core", "1.1.1". If you're using newer functions like HTTP.Post with complex payloads, double-check the version.

4. SQL date functions. Automation Studio SQL doesn't support all T-SQL date functions. The agent sometimes uses functions like EOMONTH that will fail. Stick to DATEADD, DATEDIFF, and GETDATE().

5. The agent can't see your Content Builder assets. If you ask it to reference an image or a content block by ID, you need to provide that ID. It doesn't have visibility into your asset library. It can however pull in your content builder assets by saying something like pull in content with the key : xxyyzz123 (whatever your contents external/customer key is) Which you can then add to your project.

6. Journey Builder decision splits are not code. The agent can write AMPscript for email activities, but Journey Builder decision split criteria are configured in the UI, not in code. Don't ask it to "write a decision split" — ask it to write the AMPscript that runs inside the email.

How to Get a Temporary Pro License

I'm running a limited beta for SFMC developers who want to test the agent on real work. If you're actively building in Marketing Cloud — AMPscript, SSJS, SQL, Journey Builder — and you want to try the Pro tier (which includes the MCP server integration and unlimited queries), message me on LinkedIn at linkedin.com/in/matthewharrisonsmith with the subject "SFMC Agent Beta" and a brief description of what you're building. I'll send you a temporary Pro license key — no sales call, no demo, just access.

I'm looking for developers who will actually use it on production work and give me honest feedback. In exchange for the license, I ask for a 15-minute call at the end of your trial to hear what worked and what didn't.

FAQ

Is the SFMC Developer Agent a replacement for knowing AMPscript, SSJS, and SQL?

No. It's a productivity tool that handles the boilerplate and the syntax lookups, but you still need to understand Marketing Cloud's architecture, the data view model, and the constraints of Automation Studio. Think of it as a senior pair-programming partner, not an autopilot.

Does the agent have access to my production data?

No. It reads your Data Extension schema (field names, data types, send classifications) but not the rows themselves. Your subscriber data never leaves your tenant. The MCP server runs locally and only sends schema metadata to the model.

Can I use the agent inside Cursor or Claude Desktop?

Yes. The Pro tier includes an MCP server that you can configure in any MCP-compatible client. Once configured, the agent appears as a tool you can call from inside your editor. The free tier is limited to the web chat interface and 15 or so MCP calls.

What happens after the beta?

I'm using the beta to identify failure modes and improve the agent's accuracy on real SFMC work. Beta testers get to keep their Pro access through the end of the beta period, and I'll be offering discounted annual licenses to anyone who participated.


Free SFMC cheat sheet

Copy-paste AMPscript lookups, SSJS patterns, and Automation Studio SQL — curated from real Marketing Cloud projects.

Instant access. No spam — one useful SFMC pattern per week, unsubscribe anytime.

Let AI Write Your SFMC Code Against Your Real Schema

SFMC Agent writes validated AMPscript, SSJS, and Automation Studio SQL grounded in your actual Data Extension schema — and exposes an MCP server so you can call it from Cursor. Message me on LinkedIn for a temporary Pro license.

Create your free account

Matthew Smith

Salesforce Marketing Cloud Developer

SFMC developer and builder of SFMCDeveloper.dev Agent.