Skip to main content
Glama

List ISM versions

list_versions

Retrieve all available ISM releases including historical, current, and future tags. Returns version id, commit SHA, and release date.

Instructions

Lists every published ISM release (historical, current, and any future tags as soon as they appear upstream). Returns tag, version id, commit SHA, and release date parsed from the tag.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
refreshNoForce a refresh of the upstream tag list, bypassing the cache.
limitNo

Implementation Reference

  • src/index.ts:114-140 (registration)
    MCP tool registration for 'list_versions'. Defines the tool name, description, input schema (optional 'refresh' boolean and optional 'limit' integer), and the handler callback that calls the underlying listVersions function and formats the result.
    server.registerTool(
      "list_versions",
      {
        title: "List ISM versions",
        description:
          "Lists every published ISM release (historical, current, and any future tags as soon as they appear upstream). Returns tag, version id, commit SHA, and release date parsed from the tag.",
        inputSchema: {
          refresh: z
            .boolean()
            .optional()
            .describe(
              "Force a refresh of the upstream tag list, bypassing the cache.",
            ),
          limit: z.number().int().min(1).max(200).optional(),
        },
      },
      async ({ refresh, limit }) => {
        const versions = await listVersions({ force: refresh });
        const items = limit ? versions.slice(0, limit) : versions;
        return txt({
          latest: versions[0]?.id ?? null,
          count: versions.length,
          versions: items,
          source: "https://github.com/AustralianCyberSecurityCentre/ism-oscal",
        });
      },
    );
  • Inline handler callback for the 'list_versions' tool. Calls listVersions({ force: refresh }), optionally slices by limit, and returns a JSON response with latest, count, versions array, and source URL.
    async ({ refresh, limit }) => {
      const versions = await listVersions({ force: refresh });
      const items = limit ? versions.slice(0, limit) : versions;
      return txt({
        latest: versions[0]?.id ?? null,
        count: versions.length,
        versions: items,
        source: "https://github.com/AustralianCyberSecurityCentre/ism-oscal",
      });
    },
  • Core implementation of listVersions(). Fetches bundled versions from local data, optionally fetches from GitHub API (paginated), merges them, caches the result, and returns sorted IsmVersion[]. Handles offline mode and fallback to bundled/cached data on network error.
    export async function listVersions(
      opts: { force?: boolean } = {},
    ): Promise<IsmVersion[]> {
      const now = Date.now();
      if (!opts.force && tagsMemo && now - tagsMemo.fetchedAt < TAGS_TTL_MS) {
        return tagsMemo.versions;
      }
    
      const bundled = await loadBundleIndex();
      const bundledVersions = (bundled?.versions ?? []).map((v) => ({
        ...v,
        bundled: true,
      }));
    
      if (OFFLINE) {
        if (bundledVersions.length === 0) {
          throw new Error(
            "ISM_MCP_OFFLINE is set but no bundled data was found. " +
              "Run `npm run bundle` (or use a release tarball that includes data/).",
          );
        }
        bundledVersions.sort(compareVersionsDesc);
        tagsMemo = { fetchedAt: now, versions: bundledVersions };
        return bundledVersions;
      }
    
      await ensureCacheDir();
      const cacheFile = join(CACHE_DIR, "tags.json");
    
      try {
        const networkVersions = await fetchAllTagsFromGitHub();
        const merged = mergeVersions(bundledVersions, networkVersions);
        tagsMemo = { fetchedAt: now, versions: merged };
        await writeFile(cacheFile, JSON.stringify(tagsMemo), "utf8");
        return merged;
      } catch (err) {
        if (bundledVersions.length > 0) {
          bundledVersions.sort(compareVersionsDesc);
          tagsMemo = { fetchedAt: now, versions: bundledVersions };
          return bundledVersions;
        }
        if (existsSync(cacheFile)) {
          const raw = await readFile(cacheFile, "utf8");
          const cached = JSON.parse(raw) as CachedTags;
          tagsMemo = cached;
          return cached.versions;
        }
        throw err;
      }
    }
  • IsmVersion interface type definition used as the return type of listVersions. Contains tag, id, sha, date, and optional bundled fields.
    export interface IsmVersion {
      /** Tag name, e.g. "v2026.03.24" */
      tag: string;
      /** Semver-ish id without the leading "v", e.g. "2026.03.24" */
      id: string;
      /** Commit SHA the tag points at */
      sha: string;
      /** Publication date parsed from tag (YYYY-MM-DD), best-effort. */
      date: string | null;
      /** Whether this version's data is bundled with the package. */
      bundled?: boolean;
    }
  • Startup warm-up call to listVersions() in main(), prefetching the version list early and logging a warning on failure.
    async function main(): Promise<void> {
      // Warm up the version list (and surface auth/network errors early), but
      // don't fail startup — the tool can also report this on demand.
      try {
        await listVersions();
      } catch (err) {
        process.stderr.write(
          `[ism-mcp] warning: failed to fetch versions at startup: ${(err as Error).message}\n`,
        );
      }
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It states the tool lists and returns data but does not mention performance, caching behavior, rate limits, side effects, or read-only nature beyond what's implied.

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

Conciseness5/5

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

Two sentences cover purpose and return value without extraneous information. The description is front-loaded and every sentence contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple list tool, specifying what is returned. However, it lacks details on ordering, pagination, or ISM context. No output schema exists, so more completeness would benefit.

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

Parameters2/5

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

Schema coverage is 50% (refresh described, limit not). The description does not add meaning to the parameters; it only outlines return fields. For low coverage, the description should compensate but fails to do so.

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 clearly states the verb 'Lists' and the resource 'ISM releases/versions', specifying that it includes historical, current, and future tags. It distinguishes from sibling tools like list_controls by focusing on versions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing all versions but provides no explicit guidance on when to use this tool over alternatives such as get_version_metadata or compare_versions. No exclusions or context are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RusticEagle/ism-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server