MCP serverMCP servertypeExposes tools to a coding agent over MCP.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

pam-mcp-server

A local MCP server that answers an agent's questions about the support status of SAP product versions from the reader's own export of the SAP Product Availability Matrix.

Lets an agent look up the support status of an SAP product version while it reads an architecture document or a specification that names one, without the SAP Support Radar app it ships beside. Three tools over stdio: one lists the matrix fields that can be filtered, one lists the values a field holds, and one queries the entries by any of them, as a Markdown table or as JSON records. It reads the JSON file the app's import script makes from the reader's own SAP Product Availability Matrix export, is read-only and makes no network calls. It runs on the reader's own machine only: the matrix is SAP customer-licensed data, so there is no hosted endpoint.

Facts

Last pushLicenceApache-2.0

Where it sits

Provides
Knowing the maintenance status of a releaseABAPKnowing the maintenance status of a releasecapabilityKnowing whether a release a solution runs on is still maintained, and until when: which versions get fixes, which get critical fixes only, and when maintenance ends. Upgrading to a newer release once that is known is a different job.
Part of
SAP Support RadarSAP Support RadarartifactA browser app that checks the support and maintenance status of the SAP product versions a person runs against their own export of the SAP Product Availability Matrix.
Serves
Requires
SAP Product Availability MatrixSAP Product Availability Matrixoutside the atlasThe data it answers from: the PAM.json file the app's import script makes from the reader's own matrix export. It reads ../webapp/model/PAM.json by default, or the file PAM_JSON_PATH names.

Who is behind it

Tobias HofmannTobias HofmannPersonMaintains this
In the atlas: maintains 4, contributes to 12
@tobiashofmann
maintainer

What it declares

Every artifact

Type
MCP server
Origin
Independently maintained

As an MCP server

Runs as
local process
Transport
stdio
Read-only
yesstates it is
Guardrails
1 quoted from README show all
  • It is read-only and makes no network calls — it only reads the local PAM.json file.

Connections3

Your machineSAP cloudpam-mcp-server — README, Running, checked 2026-10-12: “npm start # runs dist/index.js over stdio”stdiodocumentedrequiresYour MCP client, actorYour MCP clientpam-mcp-server, modulepam-mcp-serverSAP Product Availability Matrix, SAP solutionSAP Product AvailabilityMatrixSAP solution
SAPnot SAP's, or the project's ownstated in the documentdocumented only

README

quoted from tobiashofmann/sap-support-radar under Apache-2.0, read
tobiashofmann/sap-support-radar/pam-mcp-server/README.mdOn GitHub

pam-mcp-server

An MCP server exposing the SAP Product Availability Matrix (PAM) data from de.itsfullofstars.sap.pam (webapp/model/PAM.json) as queryable tools, so an LLM client can look up product/version support status without needing the PAM app's UI.

It is read-only and makes no network calls — it only reads the local PAM.json file.

This is deliberately local-only, not a hosted service: real PAM data is SAP customer-licensed information that can never be bundled with this app or served publicly (see ADR 0006). Each user generates their own PAM.json locally (npm run pam:import, from their own SAP PAM CSV export) and runs this server against it on their own machine — there is no remote endpoint to connect to instead.

Tools

  • pam_list_fields — lists every filterable PAM field (e.g. version, product, line, status, eomm, ...), its human-readable label, and whether it's matched exactly or by substring. Call this first if you're unsure which field name to use.
  • pam_list_field_values — lists the distinct values a given field currently has, most common first (e.g. every status value that actually occurs, with counts). Useful to discover the exact spelling of a status/category/line value before filtering.
  • pam_query_products — the main query tool. Accepts one optional filter per PAM field (a string or array of strings, OR'd within a field, AND'd across fields), plus limit/offset pagination and a response_format ("markdown" summary table or "json" full records).

How specific a filter is determines how many entries come back, by design:

You filter by...You get...
version (e.g. "SAP S/4HANA 2025")Typically a single matching entry.
product or line (e.g. "SAP S/4HANA")Every entry belonging to that product/line.
status (e.g. "Unrestricted available")Every product currently in that status.
Any other status/date field (ra_puna, ra_pua, ua, hanaStatus, hanaDate, eomm, eom, eop1, eosk, addOn)Every entry with that exact value.

Setup

npm install
npm run build

Running

npm start                 # runs dist/index.js over stdio
npm run dev                 # tsx watch mode, runs src/index.ts directly
npm run inspector            # opens the MCP Inspector against the built server

By default, the server reads ../webapp/model/PAM.json (relative to this package, i.e. the main app's bundled PAM data). Point it at a different file — e.g. a freshly re-imported or uploaded export — via the PAM_JSON_PATH environment variable:

PAM_JSON_PATH=/path/to/other/PAM.json npm start

See ../docs/architecture.md for the full PAM.json field mapping, and ../docs/index.md for how PAM.json itself is generated from an SAP PAM CSV export.

Using with Claude Code / another MCP client

Add it as a local stdio server, e.g. via the Claude Code CLI:

claude mcp add pam -- node /absolute/path/to/pam-mcp-server/dist/index.js

or in an MCP client's JSON config:

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

Project structure

pam-mcp-server/
├── package.json
├── tsconfig.json
├── src/
│   ├── index.ts        # entry point: creates the McpServer, registers tools, connects stdio transport
│   ├── data.ts          # loads/caches PAM.json
│   ├── fields.ts         # field metadata (names, labels, match mode) shared by all tools
│   ├── filtering.ts       # filter matching + distinct-value counting logic
│   ├── format.ts          # markdown table rendering + response truncation
│   ├── constants.ts        # CHARACTER_LIMIT, pagination defaults
│   └── tools/
│       ├── listFields.ts
│       ├── listFieldValues.ts
│       └── queryProducts.ts
└── dist/                 # built output (entry point: dist/index.js)
Apache-2.0, read
Knowing the maintenance status of a release
  1. ui5-task-check-eocpUI5 build task warning when the app's UI5 version reaches EOCPfrom UI5
  2. SAP Support RadarBrowser app checking SAP product support status from a PAM exportfrom Across stacks

Details

Sources3
Added by handdiscovered herechecked
github.com/tobiashofmann/sap-support-radar/tree/main/pam-mcp-servertree, pushes, contributors, CIchecked
pam-mcp-server/README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
discovered viaAdded by hand
first seen in the atlas
ecosystem and domainumbrella, operations-and-runtime
History in the atlas2
  1. Staged as its own entry beside the app (ADR-0063, two entries) because an agent reaches for the server and a person opens the app. part_of rests on the README's project layout. ecosystem: umbrella and serves_ecosystems: abap for the same reasons as the app: it reads the same matrix, and its documentation's worked example queries SAP S/4HANA 2022 and SAP NetWeaver 7.5. No tool_count: the README lists three tools and states no count. Its package is private and not on npm.
  2. First seen.
For your agent
Ref
artifact:tobiashofmann-pam-mcp-server
JSON
/artifacts/tobiashofmann-pam-mcp-server.json
MCP
Connecting an agent