Skip to main content
Glama

Alexandre Caramaschi: cursos e aulas de GEO em português

Manifesto do catálogo e cobertura

getCatalogManifest
Read-onlyIdempotent

Use first, before reading modules in bulk: it says which revision is published and what can actually be read. Returns the published revision (build SHA and date), the normalization version used by content hashes, course count, how many courses have retrievable text, declared versus retrievable module counts, the coverage ratio (null when the denominator is unknown) and, per course, the declared and retrievable module counts. Every course without retrievable text is listed in gaps with a reason; nothing is silently dropped. mediaCoverage reports video lesson and podcast coverage (courses, modules, how many have a searchable transcript) and lists each video or audio file without transcript in mediaCoverage.gaps. No arguments.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
gapsYes
sourceYes
coursesYes
revisionYes
courseCountYes
mediaCoverageYes
schemaVersionYes
moduleCoverageYes
coursesWithContentYes
declaredModuleCountYes
normalizationVersionYes
retrievableModuleCountYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / mediaCoverage
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "courses": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "modules": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "podcast": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "slug": {
      +            "type": "string"
      +          },
      +          "transcribed": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "video": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "modules",
      +          "video",
      +          "podcast",
      +          "transcribed"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "coursesWithMedia": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "coursesWithPodcast": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "coursesWithTranscript": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "coursesWithVideo": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "gaps": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "kind": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "video",
      +                  "audio"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "moduleId": {
      +            "type": "string"
      +          },
      +          "reason": {
      +            "const": "transcript_missing",
      +            "type": "string"
      +          },
      +          "slug": {
      +            "type": "string"
      +          },
      +          "src": {
      +            "format": "uri",
      +            "type": "string"
      +          },
      +          "type": {
      +            "enum": [
      +              "mediaPlayer",
      +              "html"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "moduleId",
      +          "type",
      +          "kind",
      +          "src",
      +          "reason"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "mediaCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "modulesWithMedia": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "modulesWithTranscript": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "podcastCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "resourceTemplate": {
      +      "type": "string"
      +    },
      +    "tool": {
      +      "const": "getModuleMedia",
      +      "type": "string"
      +    },
      +    "transcribedCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "transcriptChars": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "transcriptCues": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "videoCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "label",
      +    "tool",
      +    "resourceTemplate",
      +    "mediaCount",
      +    "videoCount",
      +    "podcastCount",
      +    "transcribedCount",
      +    "transcriptCues",
      +    "transcriptChars",
      +    "coursesWithMedia",
      +    "coursesWithVideo",
      +    "coursesWithPodcast",
      +    "coursesWithTranscript",
      +    "modulesWithMedia",
      +    "modulesWithTranscript",
      +    "courses",
      +    "gaps"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "schemaVersion",
      -  "revision",
      -  "normalizationVersion",
      -  "source",
      -  "courseCount",
      -  "coursesWithContent",
      -  "declaredModuleCount",
      -  "retrievableModuleCount",
      -  "moduleCoverage",
      -  "courses",
      -  "gaps"
      -]New value: +[
      +  "schemaVersion",
      +  "revision",
      +  "normalizationVersion",
      +  "source",
      +  "courseCount",
      +  "coursesWithContent",
      +  "declaredModuleCount",
      +  "retrievableModuleCount",
      +  "moduleCoverage",
      +  "courses",
      +  "gaps",
      +  "mediaCoverage"
      +]
  2. First observed

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine behavioral guarantees beyond that: the coverage ratio is null when the denominator is unknown, and 'nothing is silently dropped' — every course lacking retrievable text appears in gaps with a reason. This is meaningful transparency not present in 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.

Conciseness3/5

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

Usage guidance is correctly front-loaded, but the second half is one very long run-on sentence enumerating every returned field, which largely duplicates the output schema. Given an output schema exists, much of this enumeration does not earn its place, bloating the definition.

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?

With an output schema present, the description need not explain return values, yet it fully describes the manifest's contents, coverage semantics, and gap reporting. An agent has everything needed to call this zero-argument tool correctly and interpret ambiguity (null ratio, guaranteed gap listing).

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?

The tool takes zero parameters, so per the rubric the baseline is 4. The description confirms this with 'No arguments,' which is consistent with the empty schema and additionalProperties:false.

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?

The description states a specific resource (the catalog manifest) and what it conveys: the published revision, normalization version, course/module counts, and coverage. 'Use first, before reading modules in bulk' implicitly distinguishes it from content-retrieval siblings like getModuleContent and getCourseModules. The verb framing ('it says which revision is published') is slightly diffuse for a purpose statement.

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?

'Use first, before reading modules in bulk' gives explicit ordering and context for when to call it, positioning it as a discovery/coverage step ahead of content tools. It does not name which sibling to use instead or state explicit exclusions, so it stops short of full when/when-not routing.

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