Skip to main content
Glama

Add keyword

add_keyword

Start tracking a keyword. kind is "brand" (default), "competitor" or "topic". platforms optionally restricts it to some platforms (default: every platform). New mentions containing the term will be matched, classified and delivered. A multi-word term also matches a post holding its words close together (any order, plurals and spellings like non-profit/nonprofit); such a post is kept and billed only when the classifier scores it relevant. Wrap the term in double quotes, or set matching.exactPhrase, for the exact phrase only. Prefer short terms people actually write ("fundraising agency") over sentences ("looking for a fundraising agency"). For a common word, narrow it with matching (requiredTerms with requiredMode any|all, requiredGroups: combinations where the post must hold every term of at least one, as [["weather","alert*"],["tsunami"]], so one keyword replaces a search per line, excludedTerms, a * wildcard at an end of any rule term, excludedAuthors, caseSensitive, exactPhrase, subreddits: { only, excluded } to keep its Reddit posts to some subreddits or out of some): a post the rules reject is never stored or billed. context is one sentence the classifier reads for this keyword only ("Arc is our browser; ignore the geometry word"). cap ({ mentions: N, per: "day" | "week" | "month" }, per defaults to month) is a ceiling on its matched mentions per UTC day, week (from Monday) or month: at the cap it stops matching until the next period starts or until the cap is raised, while its daily keyword charge continues. A daily cap keeps mentions coming every day with a fixed ceiling on spend (N × $0.008 a day at most, plus the keyword). groupId puts it in a keyword group (list_groups; default: the workspace's default group); a term may be tracked once per group, so two groups may track the same term as two keywords. reviewSources collects reviews: pass each page's link (url: an App Store or Google Play app, a Trustpilot page, a Google Maps place or its maps.app.goo.gl share link) or platform (appstore|googleplay|trustpilot|googlemaps) and id; the app stores also take countries (two-letter codes, default us) and Google Play a language (default en). Every review of the page becomes a mention of this keyword, polled daily, and the last 30 days (newest 100) come in free at once. feeds reads RSS or Atom feeds: pass each as { url }, a feed's URL or a page's (a forum, a community, a blog) whose advertised feed is used; a URL with no feed is refused. An item of a feed is a mention of this keyword when it holds the term, polled every hour, and the newest 10 matching items of the last 30 days come in at once (billed like any mention). platforms: [] makes a reviews-only or feeds-only keyword. comments ({ enabled: true, maxPerPost: N }, off by default) reads the comments under its relevant mentions from 30 minutes after each post, as long as its platform's conversations last (a day on Reddit, Hacker News and Bluesky, a week on GitHub, Stack Overflow and DEV, a month on YouTube), $0.008 per comment delivered (comments of fewer than three words are skipped), at most maxPerPost (default 20) per mention; list them with list_mention_comments. display ({ languages: { only, excluded }, countries: { only, excluded } }, lowercase ISO 639-1 and ISO 3166-1 alpha-2 codes) chooses which of its mentions you see by the post's language and the author's country: a hidden mention is still matched, classified and billed, but stays out of search_mentions, exports, alerts and digests; a post whose language or country nobody could tell is always shown. On GitHub a keyword also gets events about repositories naming it; matching.repositories chooses them: events (traction: a repository under 30 days old reached 10 stars; stars: a star milestone from 100 up; growth: fast growth in a week; new: every repository created, even with no stars, off by default), minStars and minWeeklyStars (stars gained in 7 days, 25 or more). An event outside the rule is dropped before it is stored, so it is never billed: "repositories about X with 200+ stars gaining 100 a week" is { events: ["stars","growth"], minStars: 200, minWeeklyStars: 100 }.

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": {
      "term": "<term>"
    },
    "name": "add_keyword"
  }
}

Input Schema

NameRequiredDescriptionDefault
capNoA mention cap per day, week or month (per, default month); omit or null for none.
kindNobrand: your own names. competitor: theirs. topic: the space. Drives share of voice and segments.brand
termYesThe word or phrase to track, case-insensitive. A multi-word term matches as the phrase or as its words close together (see matching.exactPhrase); wrap it in double quotes for the exact phrase only.
feedsNoRSS or Atom feeds only this keyword reads: a feed's URL, or a page that advertises one (else a 400). Read hourly; an item holding the term is a mention. See [RSS](/platforms/rss#a-keywords-own-feeds).
contextNoA sentence the classifier reads for this keyword only, on top of the company profile or group description: what the term means here, what to ignore. "Arc is our browser; ignore the geometry word." Null clears it.
displayNoWhich of this keyword's mentions you see, by language and country; each list is replaced when sent, kept when omitted. Hidden mentions are still billed.
groupIdNoThe group to track it in (grp_...); omit for the workspace's default group. A term may be tracked once per group.
commentsNoComments under this keyword's mentions; omitted fields are untouched (on create: off, 20 per post).
matchingNoOmitted fields are untouched; an empty list clears one.
platformsNoPlatforms to search the term on; omit or null for every platform. [] searches it nowhere: a keyword that only collects reviews or reads feeds, which then needs reviewSources or feeds.
reviewSourcesNoReview pages this keyword collects (app store apps, Trustpilot pages, Google Maps places): every new review is a mention, whatever it says. Polled daily; a newly connected page brings 30 days back, free. See [Reviews](/platforms/reviews).
idempotencyKeyNoOptional. A unique value (a UUID) for this call: 1 to 255 visible ASCII characters, no spaces. Calling again with the same key and the same input within 24 hours returns the first result instead of doing it twice.
readsWorkspaceFeedsNoWhether the keyword also reads the workspace's feeds (GET /v1/feeds); default true. A new keyword reading them gets the look-back of the 8 most recently connected.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / idempotencyKey
      Added value: +{
      +  "description": "Optional. A unique value (a UUID) for this call: 1 to 255 visible ASCII characters, no spaces. Calling again with the same key and the same input within 24 hours returns the first result instead of doing it twice.",
      +  "maxLength": 255,
      +  "minLength": 1,
      +  "pattern": "^[\\x21-\\x7e]+$",
      +  "type": "string"
      +}
  2. Changed12 schema fields changed
    • changedInput schema / properties / cap / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "A ceiling on what this keyword may be charged for per day, week or month, mentions and comments together. At the cap it stops matching and receiving comments until the next period starts (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      -    "properties": {
      -      "mentions": {
      -        "description": "Charged items allowed per period (see per): matched mentions plus the thread comments delivered under them. Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      -        "maximum": 1000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "per": {
      -        "default": "month",
      -        "description": "The period the cap counts in, in UTC: day (from 00:00), week (from Monday 00:00) or month (the calendar month, the default). At the cap the keyword stops until the next period starts, so a daily cap keeps mentions coming every day with a fixed ceiling on spend.",
      -        "enum": [
      -          "day",
      -          "week",
      -          "month"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mentions"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A ceiling on what this keyword may be charged for per day, week or month, mentions and comments together. At the cap it stops matching and receiving comments until the next period starts (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      +    "properties": {
      +      "mentions": {
      +        "description": "Charged items allowed per period (see per): matched mentions plus the thread comments delivered under them. Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      +        "maximum": 1000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "per": {
      +        "default": "month",
      +        "description": "The period the cap counts in, in UTC: day, week (from Monday) or calendar month (the default). At the cap the keyword stops until the next period starts.",
      +        "enum": [
      +          "day",
      +          "week",
      +          "month"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mentions"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / comments / properties / enabled / description
      Previous value: -"Read the comments under this keyword's relevant mentions, from 30 minutes after each post, as long as its platform's conversations last (a day to a month). Each comment delivered costs $0.008 (comments of fewer than three words are dropped, never billed) (the comments line of the bill). Off by default."New value: +"Read the comments under this keyword's relevant mentions. Each comment delivered costs $0.008; comments under three words are dropped, never billed. See [Comments](/guides/comments)."
    • changedInput schema / properties / comments / properties / maxPerPost / description
      Previous value: -"The newest comments of one thread you receive, 20 by default, 100 at most: the ceiling on what one mention's comments can cost. A comment that names the keyword is a mention too, but only among these newest ones, so it is never billed past the ceiling."New value: +"The newest comments of one thread you receive: the ceiling on what one mention's comments can cost. A comment naming the keyword is a mention only among these."
    • changedInput schema / properties / context / anyOf
      Previous value: -[
      -  {
      -    "description": "A sentence the classifier reads for this keyword only, on top of the company profile or the group's own description (at most 300 characters): what the term means here, what to ignore. \"Arc is our browser; ignore the geometry word.\" Null clears it.",
      -    "maxLength": 300,
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "A sentence the classifier reads for this keyword only, on top of the company profile or group description: what the term means here, what to ignore. \"Arc is our browser; ignore the geometry word.\" Null clears it.",
      +    "maxLength": 300,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / context / description
      Previous value: -"A sentence the classifier reads for this keyword only, on top of the company profile or the group's own description (at most 300 characters): what the term means here, what to ignore. \"Arc is our browser; ignore the geometry word.\" Null clears it."New value: +"A sentence the classifier reads for this keyword only, on top of the company profile or group description: what the term means here, what to ignore. \"Arc is our browser; ignore the geometry word.\" Null clears it."
    • changedInput schema / properties / feeds / description
      Previous value: -"RSS or Atom feeds this keyword reads, at most 20, each { url }: a feed's URL, or a page's (a forum, a community, a blog), in which case the feed the page advertises is used, else a usual address such as /feed or /rss. A URL with no feed behind it is a 400. Each feed is read every hour; an item is a mention of this keyword when it holds the term (with the keyword's matching rules), and only of keywords that named the feed. A newly connected feed brings its newest 10 items of the last 30 days that hold the term, billed like any mention and never sent as instant alerts."New value: +"RSS or Atom feeds only this keyword reads: a feed's URL, or a page that advertises one (else a 400). Read hourly; an item holding the term is a mention. See [RSS](/platforms/rss#a-keywords-own-feeds)."
    • changedInput schema / properties / matching / properties / exactPhrase / description
      Previous value: -"true: only the exact phrase matches. false (default): a multi-word keyword also matches a post holding its words close together, in any order, plurals and spellings (non-profit, nonprofit) included; such a match is kept and billed only when the classifier scores it relevant. A term sent in double quotes sets this to true."New value: +"true: only the exact phrase matches (a term sent in double quotes sets it). false: a multi-word keyword also matches its words close together, kept and billed only when scored relevant. See [Keywords](/guides/keywords#the-exact-phrase-only)."
    • changedInput schema / properties / matching / properties / repositories / properties / events / description
      Previous value: -"The repository events this keyword takes. traction: a repository created in the last 30 days reached 10 stars. stars: one with 100 stars or more passed a milestone (100, 250, 500, 1,000, 2,000, 5,000 ...). growth: it gained stars fast in a week. new: every repository created, even with no stars (off by default: nearly all of them are noise for a broad keyword). Default: traction, stars, growth. Empty: no repository events."New value: +"The repository events this keyword takes (default traction, stars, growth; empty: none). See [GitHub](/platforms/github#repositories).\n\n- traction: under 30 days old, it reached 10 stars.\n- stars: it passed a milestone (100, 250, 500, 1,000 ...).\n- growth: it gained stars fast in a week.\n- new: every repository created; opt in, mostly noise."
    • changedInput schema / properties / matching / properties / repositories / properties / minWeeklyStars / description
      Previous value: -"Only repositories that gained at least this many stars in the last 7 days (25 or more). It applies to every event, and one whose last week is not known yet does not pass. null: a growth event needs 100 stars and 20% of the repository's stars in a week, the other events need no growth."New value: +"Only repositories that gained at least this many stars in the last 7 days, for every event; an unknown week fails. null: growth needs 100 stars and 20% a week, other events nothing."
    • changedInput schema / properties / matching / properties / requiredGroups / description
      Previous value: -"Combinations of terms, at most 50 of 10 terms each: the post must ALSO contain every term of at least one group (an OR of ANDs). For the keyword inreach, [[\"weather\", \"alert*\"], [\"tsunami\"], [\"flash flood\"]] keeps a post about inReach weather alerts, tsunamis or flash floods, one keyword instead of three. Same phrase and wildcard rules as requiredTerms; when both are set a post must pass both. Empty: no combinations."New value: +"Combinations: the post must ALSO contain every term of at least one group (an OR of ANDs), on top of requiredTerms, with the same phrase and wildcard rules. See [Keywords](/guides/keywords#several-searches-in-one-keyword)."
    • changedInput schema / properties / reviewSources / description
      Previous value: -"Review pages this keyword collects, at most 10: App Store and Google Play apps, Trustpilot pages, Google Maps places. Every new review of one is a mention of the keyword, whatever its text says. Polled once a day (per country on the app stores). A newly connected page brings its last 30 days, the newest 100 reviews (per country), free and never sent as instant alerts; after that each review bills like any mention."New value: +"Review pages this keyword collects (app store apps, Trustpilot pages, Google Maps places): every new review is a mention, whatever it says. Polled daily; a newly connected page brings 30 days back, free. See [Reviews](/platforms/reviews)."
    • changedInput schema / properties / reviewSources / items / properties / countries / description
      Previous value: -"App Store and Google Play only: storefronts to read, two-letter codes, at most 20. Default: the one in the link, else us. Each is one more poll a day; the same review seen in two storefronts is one mention. Trustpilot and Google Maps have one page for everyone and take none."New value: +"App Store and Google Play storefronts to read, as two-letter codes; default the link's, else us. Each adds a daily poll; a review seen in two is one mention. Trustpilot and Google Maps take none."
  3. Changed1 schema field changed
    • changedInput schema / properties / platforms / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "enum": [
      -        "bluesky",
      -        "hackernews",
      -        "github",
      -        "stackoverflow",
      -        "devto",
      -        "reddit",
      -        "x",
      -        "youtube",
      -        "news",
      -        "linkedin",
      -        "tiktok",
      -        "instagram"
      -      ],
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "enum": [
      +        "bluesky",
      +        "hackernews",
      +        "github",
      +        "stackoverflow",
      +        "devto",
      +        "reddit",
      +        "x",
      +        "youtube",
      +        "news",
      +        "linkedin",
      +        "tiktok",
      +        "instagram",
      +        "facebook"
      +      ],
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / display
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Which of this keyword's mentions you see, by language and country; each list is replaced when sent, kept when omitted. Hidden mentions are still billed.",
      +  "properties": {
      +    "countries": {
      +      "additionalProperties": false,
      +      "description": "By where the author is (ISO 3166-1 alpha-2); omitted: untouched.",
      +      "properties": {
      +        "excluded": {
      +          "description": "Replaces the list; [] clears it.",
      +          "items": {
      +            "enum": [
      +              "us",
      +              "ca",
      +              "mx",
      +              "br",
      +              "ar",
      +              "co",
      +              "cl",
      +              "pe",
      +              "gb",
      +              "ie",
      +              "fr",
      +              "de",
      +              "es",
      +              "pt",
      +              "it",
      +              "nl",
      +              "be",
      +              "ch",
      +              "at",
      +              "se",
      +              "no",
      +              "dk",
      +              "fi",
      +              "pl",
      +              "cz",
      +              "ro",
      +              "gr",
      +              "hu",
      +              "ua",
      +              "ru",
      +              "lt",
      +              "lv",
      +              "ee",
      +              "tr",
      +              "il",
      +              "ae",
      +              "sa",
      +              "eg",
      +              "ng",
      +              "ke",
      +              "za",
      +              "ma",
      +              "in",
      +              "pk",
      +              "bd",
      +              "lk",
      +              "np",
      +              "cn",
      +              "hk",
      +              "tw",
      +              "jp",
      +              "kr",
      +              "sg",
      +              "my",
      +              "id",
      +              "ph",
      +              "vn",
      +              "th",
      +              "au",
      +              "nz"
      +            ],
      +            "type": "string"
      +          },
      +          "maxItems": 60,
      +          "type": "array"
      +        },
      +        "only": {
      +          "description": "Replaces the list; [] clears it.",
      +          "items": {
      +            "enum": [
      +              "us",
      +              "ca",
      +              "mx",
      +              "br",
      +              "ar",
      +              "co",
      +              "cl",
      +              "pe",
      +              "gb",
      +              "ie",
      +              "fr",
      +              "de",
      +              "es",
      +              "pt",
      +              "it",
      +              "nl",
      +              "be",
      +              "ch",
      +              "at",
      +              "se",
      +              "no",
      +              "dk",
      +              "fi",
      +              "pl",
      +              "cz",
      +              "ro",
      +              "gr",
      +              "hu",
      +              "ua",
      +              "ru",
      +              "lt",
      +              "lv",
      +              "ee",
      +              "tr",
      +              "il",
      +              "ae",
      +              "sa",
      +              "eg",
      +              "ng",
      +              "ke",
      +              "za",
      +              "ma",
      +              "in",
      +              "pk",
      +              "bd",
      +              "lk",
      +              "np",
      +              "cn",
      +              "hk",
      +              "tw",
      +              "jp",
      +              "kr",
      +              "sg",
      +              "my",
      +              "id",
      +              "ph",
      +              "vn",
      +              "th",
      +              "au",
      +              "nz"
      +            ],
      +            "type": "string"
      +          },
      +          "maxItems": 60,
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "languages": {
      +      "additionalProperties": false,
      +      "description": "By the language of the post (ISO 639-1); omitted: untouched.",
      +      "properties": {
      +        "excluded": {
      +          "description": "Replaces the list; [] clears it.",
      +          "items": {
      +            "enum": [
      +              "en",
      +              "es",
      +              "de",
      +              "fr",
      +              "pt",
      +              "it",
      +              "nl",
      +              "ca",
      +              "pl",
      +              "tr",
      +              "sv",
      +              "da",
      +              "ru",
      +              "uk",
      +              "ar",
      +              "hi",
      +              "id",
      +              "ja",
      +              "zh",
      +              "ko"
      +            ],
      +            "type": "string"
      +          },
      +          "maxItems": 60,
      +          "type": "array"
      +        },
      +        "only": {
      +          "description": "Replaces the list; [] clears it.",
      +          "items": {
      +            "enum": [
      +              "en",
      +              "es",
      +              "de",
      +              "fr",
      +              "pt",
      +              "it",
      +              "nl",
      +              "ca",
      +              "pl",
      +              "tr",
      +              "sv",
      +              "da",
      +              "ru",
      +              "uk",
      +              "ar",
      +              "hi",
      +              "id",
      +              "ja",
      +              "zh",
      +              "ko"
      +            ],
      +            "type": "string"
      +          },
      +          "maxItems": 60,
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / readsWorkspaceFeeds
      Added value: +{
      +  "description": "Whether the keyword also reads the workspace's feeds (GET /v1/feeds); default true. A new keyword reading them gets the look-back of the 8 most recently connected.",
      +  "type": "boolean"
      +}
  6. Changed2 schema fields changed
    • addedInput schema / properties / matching / properties / requiredGroups
      Added value: +{
      +  "description": "Combinations of terms, at most 50 of 10 terms each: the post must ALSO contain every term of at least one group (an OR of ANDs). For the keyword inreach, [[\"weather\", \"alert*\"], [\"tsunami\"], [\"flash flood\"]] keeps a post about inReach weather alerts, tsunamis or flash floods, one keyword instead of three. Same phrase and wildcard rules as requiredTerms; when both are set a post must pass both. Empty: no combinations.",
      +  "items": {
      +    "items": {
      +      "maxLength": 80,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "maxItems": 10,
      +    "minItems": 1,
      +    "type": "array"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • changedInput schema / properties / matching / properties / requiredTerms / description
      Previous value: -"The post must ALSO contain these terms, any one of them or all of them per requiredMode. Empty: no requirement."New value: +"The post must ALSO contain these terms, any one of them or all of them per requiredMode. A `*` at the start or the end of an entry is a wildcard (alert* matches alerts and alerting). Empty: no requirement."
  7. Changed2 schema fields changed
    • changedInput schema / properties / cap / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "A monthly ceiling on what this keyword may be charged for, mentions and comments together. At the cap it stops matching and receiving comments until the first of the next month (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      -    "properties": {
      -      "mentions": {
      -        "description": "Charged items allowed per calendar month (UTC): matched mentions plus the thread comments delivered under them. Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      -        "maximum": 1000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "mentions"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A ceiling on what this keyword may be charged for per day, week or month, mentions and comments together. At the cap it stops matching and receiving comments until the next period starts (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      +    "properties": {
      +      "mentions": {
      +        "description": "Charged items allowed per period (see per): matched mentions plus the thread comments delivered under them. Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      +        "maximum": 1000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "per": {
      +        "default": "month",
      +        "description": "The period the cap counts in, in UTC: day (from 00:00), week (from Monday 00:00) or month (the calendar month, the default). At the cap the keyword stops until the next period starts, so a daily cap keeps mentions coming every day with a fixed ceiling on spend.",
      +        "enum": [
      +          "day",
      +          "week",
      +          "month"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mentions"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / cap / description
      Previous value: -"A monthly mention cap; omit or null for none."New value: +"A mention cap per day, week or month (per, default month); omit or null for none."
  8. Changed1 schema field changed
    • addedInput schema / properties / matching / properties / repositories
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "GitHub only: each field is replaced when sent, kept when omitted; null clears a minimum.",
      +  "properties": {
      +    "events": {
      +      "description": "The repository events this keyword takes. traction: a repository created in the last 30 days reached 10 stars. stars: one with 100 stars or more passed a milestone (100, 250, 500, 1,000, 2,000, 5,000 ...). growth: it gained stars fast in a week. new: every repository created, even with no stars (off by default: nearly all of them are noise for a broad keyword). Default: traction, stars, growth. Empty: no repository events.",
      +      "items": {
      +        "enum": [
      +          "new",
      +          "traction",
      +          "stars",
      +          "growth"
      +        ],
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "minStars": {
      +      "anyOf": [
      +        {
      +          "maximum": 1000000,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Only repositories with at least this many stars; null for no minimum."
      +    },
      +    "minWeeklyStars": {
      +      "anyOf": [
      +        {
      +          "maximum": 1000000,
      +          "minimum": 25,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Only repositories that gained at least this many stars in the last 7 days (25 or more). It applies to every event, and one whose last week is not known yet does not pass. null: a growth event needs 100 stars and 20% of the repository's stars in a week, the other events need no growth."
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed1 schema field changed
    • addedInput schema / properties / matching / properties / subreddits
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Reddit only, for this keyword alone: each list is replaced when sent, kept when omitted.",
      +  "properties": {
      +    "excluded": {
      +      "description": "Replaces the keyword's deny list; [] clears it.",
      +      "items": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    },
      +    "only": {
      +      "description": "Replaces the keyword's allowlist; [] clears it.",
      +      "items": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  10. Changed4 schema fields changed
    • changedInput schema / properties / cap / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "A monthly ceiling on the mentions this keyword may match. At the cap it stops matching until the first of the next month (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      -    "properties": {
      -      "mentions": {
      -        "description": "Matched mentions allowed per calendar month (UTC). Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      -        "maximum": 1000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "mentions"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A monthly ceiling on what this keyword may be charged for, mentions and comments together. At the cap it stops matching and receiving comments until the first of the next month (UTC), or until the cap is raised or removed. It stays unmuted: it keeps its place and its daily keyword charge; pause it to stop that too.",
      +    "properties": {
      +      "mentions": {
      +        "description": "Charged items allowed per calendar month (UTC): matched mentions plus the thread comments delivered under them. Every match counts, relevant or not, the look-back a new keyword gets included, because every match bills.",
      +        "maximum": 1000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "mentions"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / comments
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Comments under this keyword's mentions; omitted fields are untouched (on create: off, 20 per post).",
      +  "properties": {
      +    "enabled": {
      +      "description": "Read the comments under this keyword's relevant mentions, from 30 minutes after each post, as long as its platform's conversations last (a day to a month). Each comment delivered costs $0.008 (comments of fewer than three words are dropped, never billed) (the comments line of the bill). Off by default.",
      +      "type": "boolean"
      +    },
      +    "maxPerPost": {
      +      "description": "The newest comments of one thread you receive, 20 by default, 100 at most: the ceiling on what one mention's comments can cost. A comment that names the keyword is a mention too, but only among these newest ones, so it is never billed past the ceiling.",
      +      "maximum": 100,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / feeds
      Added value: +{
      +  "description": "RSS or Atom feeds this keyword reads, at most 20, each { url }: a feed's URL, or a page's (a forum, a community, a blog), in which case the feed the page advertises is used, else a usual address such as /feed or /rss. A URL with no feed behind it is a 400. Each feed is read every hour; an item is a mention of this keyword when it holds the term (with the keyword's matching rules), and only of keywords that named the feed. A newly connected feed brings its newest 10 items of the last 30 days that hold the term, billed like any mention and never sent as instant alerts.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One feed to read.",
      +    "properties": {
      +      "url": {
      +        "description": "A feed's address (https://forum.example.com/posts.rss), or a page's (https://forum.example.com): the feed the page advertises is used.",
      +        "maxLength": 500,
      +        "minLength": 4,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • changedInput schema / properties / platforms / description
      Previous value: -"Platforms to search the term on; omit or null for every platform. [] searches it nowhere: a keyword that only collects reviews, which then needs reviewSources."New value: +"Platforms to search the term on; omit or null for every platform. [] searches it nowhere: a keyword that only collects reviews or reads feeds, which then needs reviewSources or feeds."
  11. Changed2 schema fields changed
    • addedInput schema / properties / matching / properties / exactPhrase
      Added value: +{
      +  "description": "true: only the exact phrase matches. false (default): a multi-word keyword also matches a post holding its words close together, in any order, plurals and spellings (non-profit, nonprofit) included; such a match is kept and billed only when the classifier scores it relevant. A term sent in double quotes sets this to true.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / term / description
      Previous value: -"The word or phrase to track, matched case-insensitively as a phrase."New value: +"The word or phrase to track, case-insensitive. A multi-word term matches as the phrase or as its words close together (see matching.exactPhrase); wrap it in double quotes for the exact phrase only."
  12. First observed

TDQS

A4/5.0
Behavior5/5

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

With annotations only declaring readOnlyHint=false and destructiveHint=false, the description carries real behavioral weight: per-mention and per-comment pricing, that excluded posts are never stored or billed, that cap-stopped keywords keep accruing a daily charge, that hidden display mentions are still billed, and polling cadences per source. These are non-obvious cost and side-effect facts an agent could not infer from the annotations.

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

Conciseness2/5

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

The definition is a single ~600-word paragraph with no headings or bullet structure, burying the core verb behind dense billing and edge-case detail. Given full schema coverage, large stretches duplicate structured data rather than adding information. Only the opening sentence is truly front-loaded.

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 13-parameter creation tool with no output schema, the description covers what an agent needs: sources (platforms, reviews, feeds, repositories), cost model, cap and masking semantics, and worked configuration examples. Nothing material about correct invocation is left unaddressed.

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 coverage is 100% and many description passages restate schema text almost verbatim (cap, comments, reviewSources, feeds), so the marginal value is limited. Where it does add value, it is genuine: the requiredGroups combination example and "platforms: [] makes a reviews-only or feeds-only keyword" clarify intent beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

"Start tracking a keyword" is a specific verb+resource, and the following sentences make concrete what tracking entails (matching, classification, delivery). It does not explicitly route against sibling creation tools such as update_keyword or duplicate_keyword, so it stops short of a 5.

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 substantial usage context: prefer short terms people actually write, use quotes or matching.exactPhrase for exact phrase, narrow common words with matching, use platforms: [] for reviews-only/feeds-only keywords, and it points to list_groups and list_mention_comments for related actions. What is missing is explicit create-vs-modify routing (e.g. when to use add_keyword rather than update_keyword or duplicate_keyword).

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