Skip to main content
Glama

Analytics Legends — SAP AI & Analytics MCP Server

Search the Academy training catalogue

find_academy_modules
Read-onlyIdempotent

Search the Analytics Legends Academy — the written training modules on SAP Datasphere, Business Data Cloud, SAP Analytics Cloud, BW/4HANA and Databricks — by track, level and free text. _meta.tranche_total_row_count carries the live catalogue size on every call; it is the only count to quote. Returns the catalogue entry: id, slug, EN/FR title, track, level, duration in minutes, tags and the editor's summary. DO NOT CONFUSE IT WITH list_sap_modules, which serves a different population under the same word: that one is the 40-row PRODUCT taxonomy (codes such as SAC, DATASPHERE) used to normalise product wording. This one is the course catalogue. Without query, rows come back in the catalogue's own CURRICULUM order — the order a reader is meant to take them in — track by track. This catalogue is written training, NOT SAP certification tracks: this server publishes no certification data at any tier, so a certification question has no answer here rather than a partial one. CATALOGUE ONLY — the module BODY is subscriber content, served by get_academy_module on this same endpoint with an API key of an MCP Pass or Firm account. On THIS endpoint the paid tranche is opened by the MCP Pass (€29.90/month, analyticslegends.ai/mcp-server/) or the Firm Pass, from one key; the Consultant and Legend web plans do not include MCP access. status and is_preview are SERVED, never filtered on: they are the two flags the WEBSITE marks free access with (a free analyticslegends.ai account reads those modules on the site, M001 Datasphere Foundations included), NOT a free lane of this server — get_academy_module requires an MCP Pass or Firm Pass key for every module (a free account's key gets only the fixed daily showcase). They do not coincide (measured 2026-08-16: 38 rows status='available', 56 rows is_preview), and you decide which one your answer needs. PAGINATED WITH A KEY (a free one is enough): pass _meta.next_cursor back as cursor with the same filters until it is null; without a key, first 10 rows only. Read _meta.available_tracks and _meta.available_levels — both counted on the served population at call time — before assuming a facet value exists.

Input Schema

NameRequiredDescriptionDefault
levelNoRestrict to one level, matched case-insensitively: Beginner · Intermediate · Advanced · Expert. Counts in `_meta.available_levels`.
limitNoMax rows (hard cap 50).
queryNoFree-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim.
trackNoRestrict to one track, by SLUG (`databricks-data-eng`) or by English name (`Databricks & Data Eng.`), matched case-insensitively. The live vocabulary with per-track counts is `_meta.available_tracks` on every response. The numeric track_id is deliberately NOT accepted — it is an internal counter, and passing `6` would look like naming a subject.
cursorNoOpaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor.

Output Schema

NameRequiredDescriptionDefault
rowsYes
toolYes
_metaNo
_attributionYes
result_countYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / rows / items / properties / is_preview / description
      Previous value: -"The second free-access marker. Does NOT coincide with status — read both."New value: +"The second free-access marker of the WEBSITE. Does NOT coincide with status — read both. It does not open get_academy_module without a key."
    • changedOutput schema / properties / rows / items / properties / status / description
      Previous value: -"Editorial access marker: 'available' or 'legend-pass'. Served, not filtered on. READ 'legend-pass' AS 'sold at the CONSULTANT tier': it is a LEGACY label from when the paid tier was called Legend, it sits on the majority of rows, and the tier that actually opens the body here is Consultant (get_academy_module). The site stopped rendering this field for exactly that reason on 2026-07-26; this endpoint still serves the raw value, so the LABEL is the stale half and the tier floor is the true one."New value: +"Editorial access marker: 'available' or 'legend-pass'. Served, not filtered on. 'legend-pass' is a LEGACY label from when the paid web plan was called Legend; it sits on the majority of rows and does not say who can read the body here. On this endpoint every module body (get_academy_module) is opened by an MCP Pass or Firm Pass key, whatever this field says. The site stopped rendering this field on 2026-07-26; this endpoint still serves the raw value."
  2. Changed1 schema field changed
    • changedOutput schema / properties / rows / items / properties / status / description
      Previous value: -"Editorial access marker: 'available' or 'legend-pass'. Served, not filtered on."New value: +"Editorial access marker: 'available' or 'legend-pass'. Served, not filtered on. READ 'legend-pass' AS 'sold at the CONSULTANT tier': it is a LEGACY label from when the paid tier was called Legend, it sits on the majority of rows, and the tier that actually opens the body here is Consultant (get_academy_module). The site stopped rendering this field for exactly that reason on 2026-07-26; this endpoint still serves the raw value, so the LABEL is the stale half and the tier floor is the true one."
  3. Changed1 schema field changed
    • changedInput schema / properties / query / description
      Previous value: -"Free-text filter, matched case-insensitively."New value: +"Free-text filter, case-insensitive. EVERY word must appear in the record (substring per word, any order), so a natural-language phrase narrows the answer instead of having to match verbatim."
  4. Changed1 schema field changed
    • changedInput schema / properties / cursor / description
      Previous value: -"Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments to read the next page; a null `next_cursor` means you have reached the end. It is bound to those filters and refused if they change — a cursor names a POSITION in one ordering, and applying it to another query would start the page in the wrong place."New value: +"Opaque token from a previous response's `_meta.next_cursor`. Pass it back with the SAME filter arguments; `null` means the last page. Changing a filter refuses the cursor."
  5. Changed6 schema fields changed
    • addedOutput schema / properties / rows / items / properties / summary_fr
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / tags
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / title_fr
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / track_name_en
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / track_name_fr
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / updated_at
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  6. Added

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare a safe read-only, idempotent, closed-world operation and the description does not contradict them. Beyond that it discloses genuinely non-obvious behaviour: curriculum ordering when `query` is omitted, `status`/`is_preview` being served rather than filtered (with measured counts showing they diverge), and that pagination requires a key. The heavy commercial framing about the €29.90 pass dilutes this slightly but the behavioural content is substantial.

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?

Core distinction and pagination rules are front-loaded, but the block is long and crowded with ALL-CAPS warnings, pricing tiers and dated measurement asides that don't help an agent invoke the tool. Several sentences could be cut without losing invocation-relevant information.

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?

An output schema exists, yet the description still summarises returned fields and, more importantly, covers pagination, key requirements, ordering defaults and facet discovery — the aspects an agent must know to call it correctly. Nothing operationally necessary appears missing for a five-parameter catalogue search.

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 schema already documents each parameter, but the description adds meaning beyond it: omitting `query` yields curriculum order rather than an arbitrary listing, and the agent is told to consult `_meta.available_tracks`/`_meta.available_levels` before assuming a facet exists — compensating for the zero enums. Some of the track slug/name and cursor rules merely restate the schema.

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 — 'Search the Analytics Legends Academy ... by track, level and free text' — and enumerates the subject domains covered. It then explicitly contrasts itself with `list_sap_modules`, so an agent can distinguish the course catalogue from the product taxonomy 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?

It gives explicit routing rules: use `list_sap_modules` for the 40-row product taxonomy, `get_academy_module` for module bodies, and this tool for catalogue entries. It also states exclusions ('no certification data at any tier') and pagination conditions ('without a key, first 10 rows only'), leaving little to inference.

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.