Skip to main content
Glama

List topic suggestions

list_topic_suggestions
Read-onlyIdempotent

Suggest timely topics the writer could write about now, for each of their content pillars (their profile themes and the tags they use most). Each suggestion has the topic, its pillar, a fit score (0 to 100), why it is timely now, a suggested angle, and evidence: the trend sources and headline links behind it. whyItWorks says in one sentence why it is likely to land (a Reddit thread, X post or Substack post well above the usual response in the writer's niche, or the writer's best-performing pillar), with the numbers in signals; it is null when there is nothing worth saying. Show the evidence links so the writer can check them; do not present a suggestion as fact beyond what they say. pillars lists the writer's pillars with their ids; pass pillarId to see one. When recommendations is empty, emptyReason says why: refreshing means the writer's niches are still being searched, so call again in about 30 seconds; unknown_pillar means that pillarId is not one of theirs, so call again without it; no_trends or no_matches mean nothing timely fits right now, so do not retry soon; no_pillars and no_profile mean the writer needs themes or a niche on their Narrareach profile; check_unavailable means try again later. To draft Notes on a suggestion in the writer's voice, call create_generated_notes with source "articles", postTitle set to the topic (trimmed to 300 characters), postContent set to its whyNow, its suggestedAngle, and each headline title with its URL (one per line; a headline without a URL by its title only), postUrl set to the first link's URL (left out when that link has none), and customInstructions "Use only the facts in this text; do not add any." The generator writes from that text and checks the notes against it, so the evidence goes with the notes. Each create_generated_notes call costs 10 requests against the rate limit. Available on the Revenue Writer plan and above, on the writer's own plan. Counts as three requests against the rate limit.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

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

Input Schema

NameRequiredDescriptionDefault
limitNoHow many suggestions to return, 1 to 20. Defaults to 10.
pillarIdNoOptional pillar id from the pillars in an earlier result. Omit for suggestions across every pillar.

Output Schema

NameRequiredDescriptionDefault
regionYes
pillarsYes
sourcesYes
fetchedAtYes
emptyReasonYes
recommendationsYes
connectedAccountNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / recommendations / items / properties / signals / properties / nicheResponse / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "engagement": {
      -        "type": "number"
      -      },
      -      "multiple": {
      -        "type": "number"
      -      },
      -      "source": {
      -        "enum": [
      -          "REDDIT",
      -          "X"
      -        ],
      -        "type": "string"
      -      },
      -      "typical": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "source",
      -      "engagement",
      -      "typical",
      -      "multiple"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "engagement": {
      +        "type": "number"
      +      },
      +      "multiple": {
      +        "type": "number"
      +      },
      +      "source": {
      +        "enum": [
      +          "REDDIT",
      +          "X",
      +          "SUBSTACK"
      +        ],
      +        "type": "string"
      +      },
      +      "typical": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "engagement",
      +      "typical",
      +      "multiple"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed1 schema field changed
    • changedOutput schema / properties / recommendations / items / properties / signals / properties / nicheGroup / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "label": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "lift": {
      -        "type": "number"
      -      },
      -      "writers": {
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "label",
      -      "writers",
      -      "lift"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "label": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "lift": {
      +        "type": "number"
      +      },
      +      "scope": {
      +        "enum": [
      +          "group",
      +          "nearby_groups"
      +        ],
      +        "type": "string"
      +      },
      +      "writers": {
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "label",
      +      "writers",
      +      "lift",
      +      "scope"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed2 schema fields changed
    • addedOutput schema / properties / recommendations / items / properties / signals / properties / nicheGroup
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "label": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "lift": {
      +          "type": "number"
      +        },
      +        "writers": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "label",
      +        "writers",
      +        "lift"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / recommendations / items / properties / signals / required
      Previous value: -[
      -  "nicheResponse",
      -  "pillarStrength"
      -]New value: +[
      +  "nicheResponse",
      +  "pillarStrength",
      +  "nicheGroup"
      +]
  4. Changed3 schema fields changed
    • addedOutput schema / properties / recommendations / items / properties / signals
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "nicheResponse": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "engagement": {
      +              "type": "number"
      +            },
      +            "multiple": {
      +              "type": "number"
      +            },
      +            "source": {
      +              "enum": [
      +                "REDDIT",
      +                "X"
      +              ],
      +              "type": "string"
      +            },
      +            "typical": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "source",
      +            "engagement",
      +            "typical",
      +            "multiple"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "pillarStrength": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "of": {
      +              "type": "integer"
      +            },
      +            "rank": {
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "rank",
      +            "of"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "nicheResponse",
      +    "pillarStrength"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / recommendations / items / properties / whyItWorks
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / recommendations / items / required
      Previous value: -[
      -  "id",
      -  "topic",
      -  "pillar",
      -  "fit",
      -  "matchedTerms",
      -  "momentum",
      -  "momentumPct",
      -  "firstSeenAt",
      -  "whyNow",
      -  "suggestedAngle",
      -  "sources",
      -  "links",
      -  "network"
      -]New value: +[
      +  "id",
      +  "topic",
      +  "pillar",
      +  "fit",
      +  "matchedTerms",
      +  "momentum",
      +  "momentumPct",
      +  "firstSeenAt",
      +  "whyNow",
      +  "suggestedAngle",
      +  "sources",
      +  "links",
      +  "network",
      +  "signals",
      +  "whyItWorks"
      +]
  5. Added

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, it discloses cost (three requests per call), plan gating (Revenue Writer and above, on the writer's own plan), the downstream cost of create_generated_notes (10 requests), and an evidence-integrity constraint ("do not present a suggestion as fact beyond what they say"). The whyItWorks null case and refresh-in-progress semantics are also behavioral traits not derivable from schema.

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 purpose and output shape before the operational details, and nearly every sentence carries actionable content (rate limits, emptyReason table, drafting recipe). Minor deductions: a single undivided block that is hard to scan, and field-by-field output narration that partly duplicates the existing output schema.

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 read tool with rate-limit costs, plan gating, an empty-state taxonomy and a downstream drafting workflow, the description covers every decision an agent must make. The output schema handles return values, and the description still supplies the interpretive rules (evidence is not fact; retry policy) that the schema cannot express.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented. The description adds meaning on top: pillarId values come from the pillars array in a prior result and an invalid id surfaces as emptyReason=unknown_pillar. limit is left entirely to the schema, which is acceptable at full coverage.

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 opening sentence gives a specific verb and resource ("Suggest timely topics the writer could write about now") plus the organizing scope (content pillars). It also enumerates the returned fields, so an agent can distinguish this from sibling list tools like list_inspiration_posts without opening either 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 is provided in both directions: pass pillarId to narrow to one pillar and omit it for all, and call create_generated_notes (with the exact argument recipe) to draft from a suggestion. It even gives per-emptyReason next actions, distinguishing retry-in-30s (refreshing) from do-not-retry (no_trends/no_matches) from user-fixable (no_pillars/no_profile).

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