Skip to main content
Glama

create_editorial_velocity

create_editorial_velocity

Measure how many articles a website publishes per month and per week (free tool)

Reads the sitemap of one website and the date shown on each of its pages, then counts the articles published over the last 12 full months (UTC), per month, per section, per language, and how many articles were updated. Works with any CMS.

What is counted. Only articles, dated by the publication date the site itself shows, read in this order: structured data (JSON-LD datePublished), meta tags, an itemprop attribute, a labelled date in the visible text such as "Published on" or "Publié le", the first line of a press release ("City, March 12, 2026"), then the first <time> element ("Updated on" is never a publication date). A page is an article when it is typed as one (JSON-LD Article, BlogPosting, NewsArticle and similar types, or an article:published_time meta tag), when its date comes from such a visible label or from the first line of a press release (no inference needed), or when it belongs to a section without article markup whose pages read are mostly dated by an itemprop attribute or a <time> element: that section is listed in method.inferredSections (the exact rule is described there) and its dated pages are counted (never its future dates, never an agenda or event section). Other dated pages are not counted, their number is returned as publications.otherDatedPages. Articles that share the same day are counted like any other: a section where at least 80% of the pages counted share one day is only reported in method.sameDaySections (grouped publication, or dates changed in bulk), never excluded. Pages read without any date are never counted, their number is returned as method.undatedPages; a page served but not HTML (a PDF) is one of them, not a failure in method.pagesFailed. An article republished with a new date counts as a publication.

Asynchronous, poll the result. This call only starts the analysis and answers HTTP 202 with an analysisId and a pollUrl. Call GET /api/v1/tools/editorial-velocity?analysisId=... every 5 seconds until status is done or failed; an analysis takes from 1 to 45 minutes depending on the size of the site. MCP clients must call the get_editorial_velocity tool again until the status is terminal.

Up to 1500 pages read. Below that, every page of the sitemap modified in the window is read. Above it, pages are sampled section by section (method.strata sections, a section being the first path segment): a few pages of each section are read first, a section whose pages show no publication date is left out and listed in method.undatedSections, and the rest of the 1500 pages is shared among the dated sections. Counts are then extrapolated, method.sampled is true and publications.ci95 gives the 95 % confidence interval of the yearly total. A section whose reading was stopped by the time or page budget, or by too many failed pages, before any dated page was read is listed in method.undecidedSections: it is counted nowhere, neither in the total nor in ci95, and the result is then a sample. A total of 0 with ci95 present, or with method.undecidedSections not empty, comes from a sample: it does not prove that the website published nothing.

Same domain, reused for 7 days. An analysis of the same domain finished less than 7 days ago is returned as is, and an analysis of the same domain still running is shared rather than started twice. HTTP 200 with reused true when it is already done; nothing is read again, and your daily quota is given back in both cases (quotaReleased true; false in the rare case where giving it back failed).

Domain. Send a host name or any URL of the site, it is reduced to its host (https://www.example.com/blog/ becomes example.com). Subdomains are kept, blog.example.com is not example.com. IP addresses, local names and unknown suffixes return 400 INVALID_DOMAIN.

Tiers, per UTC day.

  • Without an API key, free anonymous tier: 1 analysis per day per IP address.

  • Signed-in account, or API key of an account whose plan includes API access: 3 analyses per day.

  • Anti-loop ceiling, every tier: 50 analysis requests per day per account, or per IP address without one, reused answers included, never given back except after SERVICE_BUSY. Beyond it, 429 RATE_LIMITED with details.reason CREATE_ATTEMPTS_CEILING.

The API key of an account whose plan does NOT include API access does not authenticate, and the call returns 401. Remove the Authorization header to use the free anonymous tier instead.

Paid analysis beyond the free ones, 20 tokens, ONLY WITH THE USER'S EXPLICIT AGREEMENT. When an account has used its free analyses of the day, the call returns 429 RATE_LIMITED with details.paidOption (tokens, the price, and balance, the token balance of the account, null when unknown). So does the 429 FREE_CAPACITY_REACHED of an account: paid analyses do not count towards the daily capacity shared by all accounts, and paid true on that refusal pays for the analysis instead. Never retry with paid true on your own: tell the user the price and their balance, and send the same request again with "paid": true only after they agree. It then charges 20 tokens and starts the analysis (tokensCharged in the answer). The tokens are given back when the analysis service refuses the request, when the answer is reused (an analysis of the same domain less than 7 days old, or already running: tokensRefunded true), and when the analysis fails (at the first read that sees failed, or within the next hours if nobody reads it). With free analyses left, paid true uses a free one and charges nothing. Without an account, paid true returns 401. A balance below the price returns 402 INSUFFICIENT_TOKENS and nothing is charged or started. A 500 TOKENS_NOT_CONSUMED means the outcome of the debit could not be confirmed and nothing was started; if tokens were taken, they are given back automatically within the next hours. Do not retry with paid true before telling the user.

Quota headers: X-RateLimit-Limit, X-RateLimit-Used, X-RateLimit-Remaining, X-RateLimit-Reset (Unix time of the next UTC midnight). Retry-After is set on 429 and 503. A 502 or 503 answer gives the consumed quota back, and so does a 429 FREE_CAPACITY_REACHED and a reused answer; SERVICE_UNAVAILABLE consumes none.

Request format. Send the body as JSON with Content-Type: application/json: any other content type returns 415. Without an Authorization header, a request sent by a web page of another site (an Origin other than the SERPmantics app, or Sec-Fetch-Site: cross-site) returns 403. Server-to-server calls send no Origin header and are not affected.

Input Schema

NameRequiredDescriptionDefault
paidNoAccounts only. True to pay 20 tokens for this analysis when the free analyses of the day are used up. Send it only after the user agreed to the price (see details.paidOption of the 429). Ignored while free analyses are left: a free one is used and nothing is charged.
domainYesHost name of the website, or any URL of it. Reduced to its host, subdomain kept, www removed.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / paid
      Added value: +{
      +  "description": "Accounts only. True to pay 20 tokens for this analysis when the free analyses of the day are used up. Send it only after the user agreed to the price (see details.paidOption of the 429). Ignored while free analyses are left: a free one is used and nothing is charged.\n",
      +  "type": "boolean"
      +}
  2. Added

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so unusually well: HTTP 202 + `analysisId`/`pollUrl`, the 1–45 minute runtime, tiered per-day quotas, the 50-request anti-loop ceiling, 7-day domain reuse with quota release, and the exact 401/402/415/429/500/502/503 semantics. It also discloses the token-charging and refund rules for `paid`, which an agent cannot infer from any structured field.

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?

Purpose and the poll requirement are correctly front-loaded and bold headers make the long body navigable. However, the text is far larger than needed for a 2-parameter tool, with repetition ("never retry with `paid` true on your own" appears twice; quota-refund rules are restated across two sections) that could be consolidated without losing meaning.

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?

There is no output schema, so the description must define the returned shape, and it does: `publications.ci95`, `method.sampled`, `method.inferredSections`, `method.undatedSections`, `method.undecidedSections`, and the caveat that a zero total from a sample proves nothing. Combined with the async and quota rules, an agent has everything needed to call this correctly and interpret the result.

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 the baseline is 3, but the description goes further: `domain` normalization is spelled out with a worked example (`https://www.example.com/blog/` → `example.com`), subdomains retained, and invalid inputs (IPs, local names, unknown suffixes) yielding 400 INVALID_DOMAIN. `paid` is given real semantics — when it is ignored, when it charges, every refund path, and the requirement for explicit user consent before retrying.

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?

Names a specific verb and resource — measuring articles published per month/week for one site — and states the mechanism (sitemap plus per-page publication dates). It is immediately distinguishable from `get_editorial_velocity` (the polling read) and `create_editorial_velocity_comparison` (multi-site), which is exactly what an agent needs at selection time.

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?

Usage context is explicit: this call only starts the analysis and agents must poll `get_editorial_velocity` every 5 seconds until a terminal status, and same-domain analyses under 7 days are reused rather than re-run. What is missing is a direct statement of when to prefer this over `create_editorial_velocity_comparison` or the other `create_*` audit tools.

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