ism-mcp

An offline-capable Model Context Protocol server for the ACSC Information Security Manual.

v1.2.1 24 ISM releases bundled 1100+ controls MIT licensed

ISM versions

24

Every published release from 2022.09.14 to 2026.03.24 is bundled.

OSCAL profiles

8

Five classification baselines + Essential Eight ML1/2/3.

Offline ready

100%

Set ISM_MCP_OFFLINE=1 for fully air-gapped operation.

ism-mcp

A Model Context Protocol server that serves the Australian Cyber Security Centre (ACSC) Information Security Manual (ISM) to MCP-capable LLM clients (Claude Desktop, VS Code, Cursor, Continue, etc.).

Data is sourced live from the official ASD/ACSC OSCAL mirror:

Each git tag in that repository is one published ISM release. The server discovers tags dynamically via the GitHub API, so:

no code changes or redeploys required.

Catalog and profile JSON is cached on disk (default ~/.cache/ism-mcp/, override with ISM_MCP_CACHE_DIR). Tag listings are refreshed every six hours (override with ISM_MCP_TAGS_TTL_MS).

Capabilities

Tools

ToolPurpose
list_versionsEnumerate every published ISM release (tag, id, SHA, date).
get_version_metadataOSCAL metadata + control/group counts for a version.
list_groupsHierarchical chapter/guideline structure with control counts.
list_controlsPaginated list of controls, filterable by applicability / group / label prefix.
search_controlsFull-text search across labels, titles, statements, and group paths.
get_controlFull detail for a single control by OSCAL id or human label (e.g. GOV-01), as JSON or Markdown.
get_controlsFull detail for multiple controls in one call, with unmatched identifiers and optional deduplication.
compare_versionsDiff two ISM releases — added, removed, and modified controls.
list_profilesList the eight OSCAL profiles (NC / OS / P / S / TS + E8 ML1/2/3).
get_profile_controlsResolved set of controls for a given baseline or Essential Eight maturity level.
cache_infoInspect the local cache.

Resources (templates)

Prompts

Install / build

npm install
npm run build

The compiled entrypoint is dist/index.js and is exposed as the ism-mcp bin.

Run

The server speaks MCP over stdio:

node dist/index.js

For interactive exploration, use the official inspector:

npm run inspect

Wire it into a client

VS Code (.vscode/mcp.json or settings)

{
  "servers": {
    "ism": {
      "command": "node",
      "args": ["/absolute/path/to/ism-mcp/dist/index.js"],
    },
  },
}

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "ism": {
      "command": "node",
      "args": ["/absolute/path/to/ism-mcp/dist/index.js"],
    },
  },
}

Optional environment

VariablePurpose
ISM_MCP_CACHE_DIROverride on-disk cache directory.
ISM_MCP_TAGS_TTL_MSTag-list cache TTL in milliseconds (default 6h).

Example prompts to try

Data and licensing

The ISM is published by the Australian Signals Directorate. See the upstream repository and for terms of use. This server is an unaffiliated tool that consumes the publicly published OSCAL data.

CI / CD

Three GitHub Actions workflows ship with the repo:

One-time repository setup

  1. Settings → Actions → General → Workflow permissions: Read and write.
  2. (Optional) configure repository credentials for npm publish on release.
  3. Update the repository, homepage, and bugs fields in package.json (replace OWNER).
  4. (Optional) configure Cloudflare account credentials in repository secrets to enable Workers deployment on release.

Cutting a release

# bump version
npm version patch        # or minor / major
git push --follow-tags

Manual releases run CI first; when CI succeeds on main, it creates the version tag and dispatches release.yml, which builds an offline-ready ism-mcp-<version>.tgz, attaches it to the GitHub Release, and (optionally) publishes the package to npm and deploys the Cloudflare Worker endpoint.

Upstream ISM releases are also checked automatically once per day. If a new upstream tag is detected, the sync workflow rebundles the data, bumps the package version, pushes the update to main, and the existing CI and release workflows take over from there.

For remote AI clients, add the remote MCP server with this URL:

https://ism.mcp.zta.au/mcp

{
  "servers": {
    "ism": {
      "type": "http",
      "url": "https://ism.mcp.zta.au/mcp",
    },
  },
}

Remote MCP / HTTP transport

Beyond stdio, ism-mcp also speaks MCP Streamable HTTP so it can be hosted as a remote endpoint that AI tools query over the network.

# run as an HTTP server on :8080
MCP_TRANSPORT=http PORT=8080 node dist/index.js
# or via flag
node dist/index.js --http

Endpoints:

The hosted Cloudflare deployment supports dynamic client registration and client_credentials token exchange in addition to unauthenticated MCP access.

For durable client registrations and issued tokens across Worker restarts, bind a Cloudflare KV namespace as AUTH_KV. If AUTH_KV is not configured, the Worker falls back to in-memory auth state.

Environment variables:

VariablePurpose
MCP_TRANSPORTstdio (default for CLI) or http. The Docker image sets this to http.
PORT / HOSTBind address (defaults: 0.0.0.0:8080).
MCP_HTTP_PATHURL path for the MCP endpoint (default /mcp).

Connect a client to the remote endpoint

Hosted endpoint: https://ism.mcp.zta.au/mcp

// VS Code .vscode/mcp.json
{
  "servers": {
    "ism": {
      "type": "http",
      "url": "https://ism.mcp.zta.au/mcp",
    },
  },
}

Bundled ISM releases

The downloadable package and Docker image ship with these versions pre-fetched:

24 versions (latest first)

The current bundle was built from upstream commit d10f14f on 2026-05-05.