Skip to main content
Glama

Sergio by Serviche

Build a campaign (saved as a draft)

create_campaign
Idempotent

Builds a campaign as the Campaigns page's New campaign does, always saved as a draft: name, the messages (steps: the opener first, each { template, delayDays?, channel? text | email | call }), offer, audience (audience_filter, or audience_source { kind: list | view | people | filter }), caps and send window. Templates use Sergio's merge tags ({{Client First Name}}, {{User Company}}, {{Offer}}, {{Offer Expiry Date}} and the rest listed on steps.template), never a hard-coded business or client name. audience_filter takes the builder's own keys (visits, days since last booking, last booking total, days since last contact, frequency, services); audience_mode rolling (default) keeps adding people as they qualify (evergreen), fixed freezes the audience at start. read campaigns returns this vocabulary and existing campaigns to copy from. Sergio's audience rules apply unless your person asks otherwise, so leave those fields out: it leaves out anyone with an upcoming booking (audience_filter.noUpcomingBooking) and anyone another campaign reached lately (contact_floor_days, the business's window, 30 days unless changed), and new matches join on their own (audience_mode rolling). The people a rule leaves out show in the campaign as Excluded by Sergio, where a person can include one anyway, so another campaign running over the same people is not something to warn about. The answer's audience_rules says all this in one sentence: tell your person that sentence when you report the draft. A credit your person names is the offer the message describes (see offer_text); never ask them to apply credits. Nobody is enrolled and nothing is sent until it starts: start_campaign (your person sees every message first and says yes), or Start campaign in the app; turning on automatic sending stays the owner's. Pass the same idempotency_key when retrying; a repeat returns the same draft.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>",
      "idempotency_key": "<idempotency_key>"
    },
    "name": "create_campaign"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameYes
colorNo
stepsNo
auto_sendNo
daily_capNo
offer_textNooffer_text is the offer, written the way the builder writes it ("$25 off your next booking", "10% off your next booking", "a free fridge clean"); {{Offer}} sends those exact words to every recipient. A percent offer is NOT priced per person: "10% off your next booking" goes out as written, and there is no per-client dollar amount on a campaign. When your person asks for "10% of their booking as a credit", use the percent offer and tell them each client sees "10% off" rather than a dollar figure; a dollars offer is one amount for everyone. offer_expiry_days N: the offer is good for N days after each person's first message goes out; {{Offer Expiry Date}} quotes that date and every later step quotes the same one. When your person says to give clients a credit ("a $29.86 credit in their account"), that is the campaign's offer, described in the message: write the message the way they asked (for example "you have a $29.86 credit on your account, good until {{Offer Expiry Date}}"), with offer_text naming the credit and offer_expiry_days the days it lasts. Building or starting a campaign never puts money on anyone's account and nothing has to be applied first: the business honors the credit when the client books. So never tell your person to apply or add credits before sending, and never call the wording a problem.
short_codeNo
audience_modeNo
cooldown_daysNo
audience_filterNoWho the campaign is for, as the builder's Audience section sets it. Use these keys only; every key given must hold.
audience_sourceNoInstead of audience_filter, follow Contacts: { kind: "list", listId } | { kind: "view", viewId } | { kind: "people", clientIds: [...] } | { kind: "filter", query } (a Contacts filter).
idempotency_keyYesYour id for this operation (8-128 of A-Z a-z 0-9 . _ : -). Reuse it on every retry of the same operation; use a new one for a new operation.
send_time_localNo
enrollment_sourceNo
offer_expiry_daysNoDays the offer stays good after each person's first message; {{Offer Expiry Date}} quotes the date.
queue_expiry_daysNo
send_window_hoursNo
contact_floor_daysNo
min_days_since_visitNo
text_by_email_subjectNoThe one email subject every text step takes when it goes by email to someone Sergio may not text. An email step keeps its own.
hold_negative_feedbackNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the campaign is always a draft, nobody is enrolled or messaged until start_campaign, automatic sending remains owner-only, Sergio exclusions appear as 'Excluded by Sergio', no credits are actually applied, and a repeated idempotency_key returns the same draft. This is substantial lifecycle and side-effect disclosure that the annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the description is a very long dense block with some repetition, especially around offer credits and Sergio audience rules. Much of the content is valuable domain guidance, but it could be structured more tightly without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 21-parameter creation tool with no output schema and low schema coverage, the description provides strong behavioral and domain context: draft lifecycle, audience rules, offer semantics, merge-tag requirements, and idempotency. It is not fully complete because several parameters remain undocumented, but the highest-risk areas are covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 29% across 21 parameters, so the description must compensate. It adds important meaning for steps.template merge tags, audience_filter keys, audience_mode rolling versus fixed, offer_text, offer_expiry_days, and idempotency_key, but leaves many parameters unexplained, including color, short_code, auto_send, daily_cap, cooldown_days, enrollment_source, queue_expiry_days, send_window_hours, min_days_since_visit, text_by_email_subject, and hold_negative_feedback.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Builds a campaign as the Campaigns page's New campaign does, always saved as a draft.' It enumerates the campaign components (name, steps, offer, audience, caps, send window) and distinguishes this creation tool from start_campaign, which sends it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: use read campaigns to copy existing vocabulary, leave Sergio audience-rule fields out unless the person asks otherwise, use start_campaign when the campaign should actually send, and reuse idempotency_key on retries. It does not explicitly tell the agent when to use edit_campaign instead of create_campaign, but the creation-versus-sending boundary is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources