Skip to main content
Glama

Save Strategy Item

save_strategy_item
Idempotent

Creates or updates one strategy item: kind = persona | pillar | angle | market | buyer_question | kpi_target. Personas, pillars and angles are the Messaging page (/messaging); an angle is one persona × pillar pair, so create it with fields.personaId and fields.pillarId from get_brand_context. Markets are the Markets page (/markets); to add one from a place name, set_up_market resolves the codes for you. Pass id to update an existing item. For a persona, pillar, angle or market, send only the fields that change; the rest, and the active flag, keep their saved values. Pillar and angle slugs cannot change after creation. A new market without priority goes after every existing one; a locationCode and languageCode pair must be one list_market_locations returns. Pass id and active only (no fields) to deactivate (false) or reactivate (true) a persona, pillar, angle, market, or buyer question without deleting it. KPI targets are the Targets page (/targets): one target per metric per month. Saving a metric and month that already has one is refused with that target's id; to change it, pass its id and fields.value only (metric and month cannot change). engagement_rate is a percent: send 4.5 for 4.5%. KPI targets have no active flag — passing active is refused. Delete a KPI with delete_strategy_item. Read targets with their actuals and progress from get_content_performance (kpis). Buyer question text cannot be edited in place — create a new one, retire it with active: false, or delete it with delete_strategy_item. A buyer question's topic (a short label, max 60 characters) can change any time: pass id with fields.topic, or empty to clear. It touches no past or future check. Creating a buyer question also returns item.firstCheck { questions, markets, engines, checks }: what the next AI answer check sends (active questions × active markets with a location × engines). suggest_buyer_questions lists questions to start with. Returns appUrl, the page where a person sees the item. Related: get_brand_context, suggest_buyer_questions, delete_strategy_item, set_up_market, list_market_locations, get_content_performance.

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": {
      "kind": "<kind>"
    },
    "name": "save_strategy_item"
  }
}

Input Schema

NameRequiredDescriptionDefault
idNoExisting item id. Omit to create.
kindYesWhich kind of strategy item.
activeNofalse retires the item without deleting it.
fieldsNoKind-specific fields. persona: name, slug, wants, convincedBy (list), objections (list; put the answer in the line as objection: answer), pains (list), jobs (list: jobs to be done), language (list: phrases the customer uses, in their words). pillar: name, slug, formats (list), notes. angle: name, slug, personaId, pillarId. Lists and notes are optional on create. market: name, country (ISO code such as US), timezone (IANA, such as America/New_York), priority (lower comes first; optional on create), locationCode and languageCode (from list_market_locations; null clears them). buyer_question: question, topic (optional; a short label, max 60 characters; empty clears it). kpi_target: metric (posts_per_week | impressions | engagement_rate | leads | qualified | rejection_rate | cost_per_lead), month (YYYY-MM), value (zero or more, up to 4 decimal places; engagement_rate in percent, so 4.5 means 4.5%).

Output Schema

NameRequiredDescriptionDefault
itemYes
kindYes
appUrlYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / fields / description
      Previous value: -"Kind-specific fields. persona: name, slug, wants, convincedBy (list), objections (list). pillar: name, slug, formats (list), notes. angle: name, slug, personaId, pillarId. Lists and notes are optional on create. market: name, country (ISO code such as US), timezone (IANA, such as America/New_York), priority (lower comes first; optional on create), locationCode and languageCode (from list_market_locations; null clears them). buyer_question: question, topic (optional; a short label, max 60 characters; empty clears it). kpi_target: metric (posts_per_week | impressions | engagement_rate | leads | qualified | rejection_rate | cost_per_lead), month (YYYY-MM), value (zero or more, up to 4 decimal places; engagement_rate in percent, so 4.5 means 4.5%)."New value: +"Kind-specific fields. persona: name, slug, wants, convincedBy (list), objections (list; put the answer in the line as objection: answer), pains (list), jobs (list: jobs to be done), language (list: phrases the customer uses, in their words). pillar: name, slug, formats (list), notes. angle: name, slug, personaId, pillarId. Lists and notes are optional on create. market: name, country (ISO code such as US), timezone (IANA, such as America/New_York), priority (lower comes first; optional on create), locationCode and languageCode (from list_market_locations; null clears them). buyer_question: question, topic (optional; a short label, max 60 characters; empty clears it). kpi_target: metric (posts_per_week | impressions | engagement_rate | leads | qualified | rejection_rate | cost_per_lead), month (YYYY-MM), value (zero or more, up to 4 decimal places; engagement_rate in percent, so 4.5 means 4.5%)."
  2. Changed3 schema fields changed
    • changedInput schema / properties / fields / description
      Previous value: -"Kind-specific fields. persona: name, slug, wants, convincedBy, objections. pillar: name, slug, formats, notes. angle: name, slug, personaId, pillarId. market: name, country, timezone, priority (locationCode and languageCode optional). buyer_question: question, topic (optional). kpi_target: metric, month, value."New value: +"Kind-specific fields. persona: name, slug, wants, convincedBy (list), objections (list). pillar: name, slug, formats (list), notes. angle: name, slug, personaId, pillarId. Lists and notes are optional on create. market: name, country (ISO code such as US), timezone (IANA, such as America/New_York), priority (lower comes first; optional on create), locationCode and languageCode (from list_market_locations; null clears them). buyer_question: question, topic (optional; a short label, max 60 characters; empty clears it). kpi_target: metric (posts_per_week | impressions | engagement_rate | leads | qualified | rejection_rate | cost_per_lead), month (YYYY-MM), value (zero or more, up to 4 decimal places; engagement_rate in percent, so 4.5 means 4.5%)."
    • addedOutput schema / properties / appUrl
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "item",
      -  "kind"
      -]New value: +[
      +  "appUrl",
      +  "item",
      +  "kind"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / fields / description
      Previous value: -"Kind-specific fields. persona: name, slug, wants, convincedBy, objections. pillar: name, slug, formats, notes. angle: name, slug, personaId, pillarId. market: name, country, timezone, priority (locationCode and languageCode optional). buyer_question: question. kpi_target: metric, month, value."New value: +"Kind-specific fields. persona: name, slug, wants, convincedBy, objections. pillar: name, slug, formats, notes. angle: name, slug, personaId, pillarId. market: name, country, timezone, priority (locationCode and languageCode optional). buyer_question: question, topic (optional). kpi_target: metric, month, value."
  4. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare a non-destructive, idempotent write, and the description adds substantial context beyond them: partial-update semantics (only changed fields are sent, others and the active flag keep saved values), immutable slugs, metric/month immutability on KPI targets, duplicate-target refusal returning the existing id, and the fact that passing active to a KPI target is refused. It also notes side-effect-free topic edits ('touches no past or future check') and the returned firstCheck preview.

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

Conciseness4/5

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

Front-loaded with the create/update core and ordered by kind, but the back half is a dense run of edge cases (buyer questions, KPI targets, firstCheck) that could be tighter or split. Nearly every sentence carries information, though a few, like the repeated delete_strategy_item mention, could be consolidated.

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

Completeness5/5

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

For a six-variant polymorphic write tool with nested fields, the description covers every kind's creation rules, update rules, and exceptions, and it names both return values (appUrl and item.firstCheck) even though a rich output schema exists. An agent has everything needed to call it correctly across all branches.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds meaning the schema cannot: angle is a persona × pillar pair built from get_brand_context ids, market priority ordering relative to existing markets, the locationCode/languageCode pair must come from list_market_locations, and engagement_rate is expressed as a percent (4.5 = 4.5%). It also clarifies the id+active-only deactivation shape and empty-string clearing of topic.

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?

Opens with a specific verb+resource: 'Creates or updates one strategy item', then enumerates the six kinds and maps each to its product surface (/messaging, /markets, /targets). This lets an agent distinguish it from siblings like save_claim, save_idea, or save_post without opening a schema.

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

Usage Guidelines5/5

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

Explicit routing throughout: use set_up_market to add a market from a place name, delete_strategy_item to delete a KPI or buyer question, get_brand_context for personaId/pillarId, suggest_buyer_questions to seed questions, get_content_performance to read targets. It also states when-not cases, such as buyer question text not being editable in place.

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