Skip to main content
Glama
GET-Technology-Inc

Jamf Docs MCP Server

Jamf Docs MCP Server

CI codecov npm version License: MIT

An MCP server that gives AI assistants (Claude, Cursor, etc.) direct access to Jamf official documentation. Ask Jamf-related questions and get answers based on the latest docs from learn.jamf.com.

Supported Products (28): Jamf Pro, Jamf School, Jamf Connect, Jamf Protect, Jamf Now, Jamf Safe Internet, Jamf Insights, RapidIdentity, Jamf Trust, Jamf Routines, Self Service+, Jamf App Catalog, Jamf Account, Jamf Security Cloud, Elevate, Composer, Jamf Parent, Jamf Teacher, Jamf Setup and Reset, Jamf Assessment, Title Editor, Jamf Infrastructure Manager, Jamf AD CS Connector, Jamf PKI Proxy, Jamf Migrate, Jamf Remote Assist, Jamf Cloud Distribution Service, Healthcare Listener

中文文件

Installation

@modelcontextprotocol/server is a peer dependency, and the CLI imports it at startup (dist/index.js → @modelcontextprotocol/server/stdio). If it is missing from the install tree the process exits immediately with ERR_MODULE_NOT_FOUND — the install itself succeeds, so the failure only shows up when you run the server.

Most install paths bring it in automatically:

Install method

Peer installed

npx -y @get-technology-inc/jamf-docs-mcp-server

Yes

npm install (npm 7+, default settings)

Yes

pnpm add (pnpm 10)

Yes

npm install --legacy-peer-deps

No

Yarn 1 (classic)

No

If you use one of the last two — or if you are vendoring the package — install the SDK alongside it:

npm install @get-technology-inc/jamf-docs-mcp-server @modelcontextprotocol/server@^2

Why it is a peer dependency, not a regular one. This package hands McpServer instances to its consumers, and those consumers pass them to createMcpHandler from their own SDK copy. If the two resolve to different copies of the SDK, an instance built by one module's Protocol is inspected by another's, and every 2026-07-28 request fails with Cannot read properties of undefined (reading 'includes') — an HTTP 500 with no useful diagnostic. Declaring the SDK as a peer states the single-copy requirement instead of relying on the consumer's tree happening to hoist it; listing it under dependencies as well would reintroduce exactly the duplicate it exists to prevent.

Node.js 24 or newer is required. 5.x is the last release line that supports Node.js 20 and 22. On those versions an unpinned npx -y @get-technology-inc/jamf-docs-mcp-server resolves to the newest 5.x on its own, because npm prefers the newest release whose engines field accepts the running Node: the server keeps working, but stops receiving updates until Node is upgraded. Use @get-technology-inc/jamf-docs-mcp-server@5 to make that explicit.

Related MCP server: Apple Dev MCP Server

Quick Start

Claude Desktop

Edit claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "jamf-docs": {
      "command": "npx",
      "args": ["-y", "@get-technology-inc/jamf-docs-mcp-server"]
    }
  }
}

Restart Claude Desktop to apply.

Claude Code (CLI)

claude mcp add jamf-docs -- npx -y @get-technology-inc/jamf-docs-mcp-server

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "jamf-docs": {
      "command": "npx",
      "args": ["-y", "@get-technology-inc/jamf-docs-mcp-server"]
    }
  }
}

Verify Installation

Test with MCP Inspector:

npx @modelcontextprotocol/inspector npx -y @get-technology-inc/jamf-docs-mcp-server

Usage Examples

Once configured, just ask your AI assistant:

  • "How do I configure SSO in Jamf Pro?"

  • "What are the system requirements for Jamf Protect?"

  • "Explain the MDM enrollment process"

  • "What changed in the latest Jamf Connect release notes?"

Available Tools

Tool

Description

jamf_docs_list_products

List all supported products, topics, and document type filters

jamf_docs_search

Search documentation by keyword with filtering and pagination

jamf_docs_get_article

Retrieve full content of a specific documentation article

jamf_docs_get_toc

Browse the table of contents for a product or any single publication

jamf_docs_batch_get_articles

Fetch multiple articles in one call (up to 10 URLs)

jamf_docs_glossary_lookup

Look up Jamf terminology and definitions (fuzzy matching)

jamf_docs_list_products

Returns all available Jamf products and their IDs, available topic filters, and document type filters.

Parameter

Type

Default

Description

outputMode

"full" | "compact"

"full"

Detail level of the response

responseFormat

"markdown" | "json"

"markdown"

Output format

maxTokens

number (100–50000)

10000

Maximum tokens in response. Higher than the other tools' 5000 because the answer is a whole catalogue

This is the one tool without a language parameter. Every tool's input schema is strict, so an unrecognised key is rejected (Unrecognized key: "language") rather than silently ignored.

If a source cannot be read, the reply lists what it could and says so: incomplete names each unavailable source, and the markdown reply says the same at the top. maps-registry is learn.jamf.com, where the publication list and the product versions both come from, so either can then be missing or a compiled-in default. jamf-support is support.jamf.com, whose jamf-support-* publications are then missing. No incomplete means every source answered.

Searches across all Jamf product documentation.

Parameter

Type

Default

Description

query

string (2–200 chars)

required

Search keywords

product

string

—

Filter by product ID (e.g., jamf-pro)

topic

string

—

Filter by topic category (e.g., enrollment, security)

docType

string

—

Filter by document type: documentation, release-notes, training, solution-guide, glossary, getting-started

version

string

—

Filter by version (e.g., "11.13.0") or "current"

language

string

en-US

Documentation language/locale

limit

number (1–50)

10

Results per page

page

number (1–100)

1

Page number for pagination

maxTokens

number (100–50000)

5000

Maximum tokens in response

outputMode

"full" | "compact"

"full"

Detail level; use "compact" for token-efficient output

responseFormat

"markdown" | "json"

"markdown"

Output format

jamf_docs_get_article

Fetches and converts a documentation article to clean markdown or JSON. Address the article either by url, or by the mapId + contentId pair that search results and the table of contents carry — one of the two is required, and a call with neither is an error.

Passing both, as a search result allows, is fine. On learn.jamf.com the pair decides which article is fetched, and the result's url is that article's own address, read from its metadata or else the table of contents; a note says so when the url you passed does not match it. Only if neither has the address does the result keep the url you passed. A concepts.jamf.com or support.jamf.com url is fetched by URL, and a note says the pair was ignored.

Parameter

Type

Default

Description

url

string

—

Full https:// URL on learn.jamf.com, docs.jamf.com, concepts.jamf.com or support.jamf.com

mapId

string

—

Fluid Topics map ID (from search results or the TOC). Use with contentId, instead of url or alongside it

contentId

string

—

Fluid Topics content ID (from search results or the TOC). Use with mapId, instead of url or alongside it

section

string

—

Extract only a named section (e.g., "Prerequisites"). A section that matches no heading is not an error: the reply lists the article's sections, or says it has none, and lists its sub-topics with their URLs — on learn.jamf.com, what a page shows as sections are mostly sub-topics

summaryOnly

boolean

false

Return only article outline, and the article's sub-topics when it has any — token-efficient way to preview before fetching full content

includeRelated

boolean

false

Include links to related articles

language

string

locale in the URL

Documentation language/locale. Overrides the locale in url; no effect on concepts.jamf.com or support.jamf.com URLs, or on a mapId + contentId pair (each map is already one language)

maxTokens

number (100–50000)

5000

Maximum tokens in response

outputMode

"full" | "compact"

"full"

Detail level; "compact" shows a ~500-token preview with available sections list

responseFormat

"markdown" | "json"

"markdown"

Output format

maxTokens bounds every reply: the article or one section, a summaryOnly outline, a missed section's reply, and any note about how the call was resolved, all counted in tokenInfo.tokenCount. When content exceeds maxTokens, the tool truncates the response and lists the remaining sections with their token counts, as many as fit. An outline or a list of sections or sub-topics cut to fit says how many it left out, and truncated is true. Use the section parameter on a follow-up call to retrieve a specific part.

jamf_docs_get_toc

Retrieves the navigation structure (table of contents) for a product, or for any single publication — release notes, technical papers, courses, evaluation and configuration guides. Exactly one of product and publication is required; passing both, or neither, is an error. (Before 5.1, product was required and publication did not exist.)

Parameter

Type

Default

Description

product

string

—

Product ID (see supported products below)

publication

string (1–200 chars)

—

Bundle family ID of one publication, e.g. jamf-pro-release-notes or technical-paper-laps. jamf_docs_list_products lists them

version

string

latest

Specific version to fetch (e.g., "11.13.0") or "current"

language

string

en-US

Documentation language/locale

page

number (1–100)

1

Page number for paginated TOC

maxTokens

number (100–50000)

5000

Maximum tokens in response

outputMode

"full" | "compact"

"full"

Use "compact" for a flat list without nested children

responseFormat

"markdown" | "json"

"markdown"

Output format

Pages are cut to maxTokens. A page holds up to 10 top-level entries, each with everything under it, as many as fit, and the next page starts at the first one that did not fit. Every top-level entry is on exactly one page, but which page depends on maxTokens (and on the tree, so on version and language), so keep them the same while paging. The markdown footer names maxTokens beside the next page when it is not the default, and structuredContent echoes back what to resend: productId or publicationId, version, language (when one was asked for) and maxTokens. The MCP App's "Show more" resends all of them. A top-level entry larger than maxTokens on its own is alone on its page, cut to the entries under it that fit. Only that page has tokenInfo.truncated: true, and truncatedEntry says how many of its entries are shown and what the whole entry costs (estimatedTokens); outputMode: "full" markdown names the maxTokens to repeat the call with. ("compact" lists top-level entries only, so a cut there hides nothing it would show.) If maxTokens makes more pages than page accepts (100), page 100 offers no next page and paginationNote names a maxTokens that reaches the rest.

jamf_docs_batch_get_articles

Fetches multiple documentation articles in a single call. Each URL is fetched concurrently, and invalid domains are reported as per-article errors without failing the entire batch.

Parameter

Type

Default

Description

urls

string[] (1–10)

required

Array of Jamf documentation URLs (same hosts as jamf_docs_get_article)

concurrency

number (1–5)

3

Maximum parallel requests

language

string

locale in each URL

Documentation language/locale. Overrides the locale in each URL; no effect on concepts.jamf.com or support.jamf.com URLs

maxTokens

number (100–50000)

5000

Total token budget across all articles

outputMode

"full" | "compact"

"full"

Detail level per article

responseFormat

"markdown" | "json"

"markdown"

Output format

jamf_docs_glossary_lookup

Looks up a term in the Jamf official glossary and returns matching definitions using fuzzy matching. A term of 4 characters or fewer is treated as an abbreviation and must be a whole word of the entry's name, so DEP does not match zero-touch deployment. A 4-character term may be a plural, or miss a letter or swap two (MDMs, LDPA). Glossary content is currently English-only; non-English language values are accepted but results will be in English.

"No glossary entries found" means the glossary was read and no entry matches (with responseFormat: "json", the JSON body with totalMatches: 0). If entries match but not even the first fits in maxTokens, the reply says how many matched and the maxTokens the first one needs; truncatedContent lists each entry left out and its estimated tokens. If the glossary cannot be read (learn.jamf.com is unreachable, times out, or answers with a server error), the tool returns an error (isError: true) that says what failed and that it may be temporary. If some matching entries cannot be fetched, the reply answers from the others and says so: incomplete names the entries it may be missing. If one of those would have led the answer, because its title names the term more closely than any entry that was fetched, the reply is an error instead, so a lesser entry is never given in its place.

Parameter

Type

Default

Description

term

string (2–100 chars)

required

Glossary term to look up

product

string

—

Accepted, but does not filter: Jamf publishes one platform-wide glossary with no product classification

language

string

en-US

Documentation language/locale (glossary is English-only)

maxTokens

number (100–50000)

5000

Maximum tokens in response

outputMode

"full" | "compact"

"full"

Detail level

responseFormat

"markdown" | "json"

"markdown"

Output format

MCP Resources

Static and dynamic reference data accessible without tool calls:

Resource

URI

Description

Products list

jamf://products

All available Jamf products with IDs and version info (fetched dynamically from API)

Topics list

jamf://topics

Topic categories for filtering documentation searches

Product TOC

jamf://products/{productId}/toc

Table of contents for a specific product (template resource)

Product versions

jamf://products/{productId}/versions

Available documentation versions for a specific product (template resource)

Template resources support tab-completion on productId in compatible clients.

MCP Prompts

Pre-built prompt workflows that guide the AI through multi-step documentation tasks:

jamf_troubleshoot

Guides the AI through a structured troubleshooting workflow: searching for relevant documentation, previewing articles with summaryOnly, then providing a root-cause diagnosis and step-by-step resolution.

Argument

Type

Description

problem

string (required)

Description of the issue to troubleshoot

product

string (optional)

Jamf product ID to scope the search

jamf_setup_guide

Directs the AI to generate a step-by-step setup guide for a Jamf feature, including prerequisites, configuration steps, and verification.

Argument

Type

Description

feature

string (required)

The feature or capability to set up

product

string (optional)

Jamf product ID to scope the search

jamf_compare_versions

Instructs the AI to compare table-of-contents structures and key articles between two product versions, summarizing new features, removed capabilities, and migration considerations.

Argument

Type

Description

product

string (required)

Jamf product ID

version_a

string (required)

First version to compare (e.g., "11.13.0")

version_b

string (required)

Second version to compare (e.g., "11.32.0")

Supported Products

Product ID

Name

Description

jamf-pro

Jamf Pro

Apple device management for enterprise

jamf-school

Jamf School

Apple device management for education

jamf-connect

Jamf Connect

Identity and access management

jamf-protect

Jamf Protect

Endpoint security for Apple

jamf-now

Jamf Now

Simple Apple device management for small businesses

jamf-safe-internet

Jamf Safe Internet

Content filtering and web security for education and business

jamf-insights

Jamf Insights

Analytics and reporting platform for Apple fleet

jamf-rapididentity

RapidIdentity

Identity and access management platform

jamf-trust

Jamf Trust

Zero-trust network access for Apple devices

jamf-routines

Jamf Routines

Automated workflow orchestration for device management

self-service-plus

Self Service+

Next-generation self-service portal for macOS and mobile

jamf-app-catalog

Jamf App Catalog

Curated application catalog for managed deployments

jamf-account

Jamf Account

Identity, licensing, and platform services portal

jamf-security-cloud

Jamf Security Cloud

Cloud security portal for Jamf Connect and Jamf Protect

elevate

Elevate

Guided remediation and device health portal

composer

Composer

macOS package building and editing

jamf-parent

Jamf Parent

Parental device controls for school-issued devices

jamf-teacher

Jamf Teacher

Classroom device management for teachers

jamf-setup-reset

Jamf Setup and Reset

Device personalisation and wipe-and-reprovision apps

jamf-assessment

Jamf Assessment

Locked-down assessment mode for education devices

title-editor

Title Editor

Custom software title patch definitions

jamf-infrastructure-manager

Jamf Infrastructure Manager

On-premises proxy for LDAP and other internal services

jamf-adcs-connector

Jamf AD CS Connector

Certificate issuance via Active Directory Certificate Services

jamf-pki-proxy

Jamf PKI Proxy

Proxy for certificate authorities behind a firewall

jamf-migrate

Jamf Migrate

Migrating macOS devices between Jamf Pro instances

jamf-remote-assist

Jamf Remote Assist

Remote screen sharing and support sessions

jamf-cloud-distribution-service

Jamf Cloud Distribution Service

Jamf-hosted package distribution (JCDS)

healthcare-listener

Healthcare Listener

Integration with healthcare information systems

Key Features

  • Compact Mode: Use outputMode: "compact" for token-efficient responses; articles show a ~500-token preview with an available sections list

  • Summary Only: Use summaryOnly: true on jamf_docs_get_article to preview an article outline before fetching full content

  • Section Extraction: Use section: "Prerequisites" to retrieve only the part of an article you need

  • Batch Fetching: Use jamf_docs_batch_get_articles to fetch up to 10 articles in one call with concurrent requests

  • Glossary Lookup: Use jamf_docs_glossary_lookup to look up Jamf terminology with fuzzy matching

  • Multi-language: Every tool except jamf_docs_list_products accepts a language parameter for localized documentation: en-US (default), ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN

  • Document Type Filter: Use docType on jamf_docs_search to narrow results to documentation, release-notes, training, solution-guide, glossary, or getting-started

  • Version Query: Use the version parameter to query documentation for a specific product version

  • Pagination: Search results support page and limit; table of contents supports page; product lists are not paginated

  • Search Suggestions: Receive helpful suggestions when a search returns no results

  • Token Management: All tools accept a maxTokens parameter (100–50000; default 5000, or 10000 for jamf_docs_list_products) to control response size

MCP Apps (interactive viewer)

Hosts that negotiate the MCP Apps extension (io.modelcontextprotocol/ui) render jamf_docs_search, jamf_docs_get_toc and jamf_docs_get_article results as an interactive viewer instead of plain markdown: search hits are clickable through to the article, TOC entries open in place, and articles carry section navigation and a back stack. All three tools reference one self-contained ui:// resource, whose URI carries a hash of the bundle it names (ui://jamf-docs/app-<hash>.html). Hosts that do not negotiate the extension ignore the metadata and get exactly the markdown they always did.

The resource is served with a 24-hour public cache hint, which is safe precisely because the URI is content-addressed: a given URI names one exact bundle forever, and a new bundle arrives under a new URI rather than replacing an old one. Hosts pick up a changed viewer on their next tools/list refresh.

Design

The viewer paints no background and owns no colour. It reads the host's theme, design tokens and fonts out of hostContext (applyDocumentTheme, applyHostStyleVariables, applyHostFonts) and builds every rule from those, so the panel is a piece of the host's surface rather than a web page embedded in one. app-ui/styles.ts carries a :root fallback for each token, because hosts may send any subset of the 76 style variables.

Before 5.10 it did the opposite: a hardcoded palette with a prefers-color-scheme dark block. That media query reports the operating system, not the host — so a user running Claude in dark mode on a light OS got a white slab in a dark conversation, and no tuning of the greys could fix it.

Inline and fullscreen

The two display modes render different things, because Claude's design guidelines make them different surfaces. An inline card is a compact summary that fits its own content; fullscreen is where a documentation browser lives.

Inline

Fullscreen

Search hits

3

the page

Table-of-contents rows

8

the page

Article prose

3 blocks, stopping before any table or code block

whole

Breadcrumbs, Back, parent link

—

✓

Section rail, neighbour list

—

✓

Type-ahead filter, paging

—

✓

Actions

1

as needed

Opening a result from an inline panel sends ui/request-display-mode before the tools/call, so the article arrives in the mode built for it. A host that declines, or that offers no fullscreen, still gets the article in place.

Two documented constraints drive this.

Inline apps must not scroll internally. On a touch device the conversation view owns vertical panning, so a vertical gesture starting inside an inline app is handed to the conversation — an internal scroll container does not scroll at all, and everything past the host's cap becomes unreachable rather than below the fold. Bounding what is rendered instead keeps search at ~518px, the table of contents at ~373px and an article at ~554px, all fully visible.

Inline apps must not drill in. "Drill-ins, breadcrumbs, or multiple views" are named patterns to avoid, which is why every piece of navigation chrome above is fullscreen-only.

The article preview is counted in blocks rather than characters. A character budget does not predict height: 900 characters of prose is three short paragraphs, and 900 characters containing a settings table is 700px of panel.

Style variables in app-ui/styles.ts are transcribed from the same guidelines.

Article navigation

jamf_docs_get_article publishes navigation — parent, siblings, children, and the true totals alongside the (capped) lists.

This matters more than it sounds. Fluid Topics serves one topic per API call while learn.jamf.com concatenates a topic and its children into a single page, so every <h2> a reader sees on the site is a separate topic here — verified at 9 of 9 on "Computer Configuration Profiles", whose API payload contains zero heading tags of any level. Without navigation, a client showing that page has the introduction and no route to the nine procedures the page consists of on the website. The viewer renders them as In this section.

It is derived from the map's TOC index, the same index the breadcrumb and the internal links are resolved from. An article loads that index once and shares it between all three.

Developing the viewer

npm run dev:app-ui     # http://127.0.0.1:5173 — edit app-ui/*.ts, the frame reloads

app-ui/dev/harness.ts is a local MCP Apps host built on the SDK's AppBridge, which accepts Client | null — a host with no server behind it is a supported mode. It speaks the real protocol to the real App class and answers tools/call out of app-ui/dev/fixtures.json, real structuredContent captured from the live tools by npm run fixtures:app-ui.

It exists because the viewer only runs inside a host, so there is nothing to look at without one, and the alternative loop — build, launch the Inspector, click through — is tens of seconds per edit. It also does three things no inspector can: strip hostContext.styles entirely (the check that proves the :root fallbacks are coherent as a set), resize the container continuously across the @container breakpoints, and lie about deviceCapabilities.hover.

Before shipping, run the viewer through the real thing as well — it is the only place the actual ui:// resource, CSP and _meta are exercised:

npm run build && npm run test:inspector
WARNING

The MCP Apps viewer is broken in 4.0.0 — upgrade past it. The build step that inlines the UI bundle into the HTML document used a replacement string, so every $ pattern in the minified JavaScript was expanded instead of copied. The document that shipped is not parseable JavaScript, and a host that renders it gets SyntaxError: missing ) after argument list and a blank panel. Nothing else in 4.0.0 is affected — tools, resources and prompts return the same results either way, since a host that cannot render the app falls back to the markdown. Fixed in 4.0.1.

4.0.1 alone did not reach every host. Up to and including 4.0.1 the resource lived at a fixed ui://jamf-docs/app.html with a 24-hour public cache hint, so a host that had read the broken 4.0.0 bundle kept serving it from cache for up to a day after the server was upgraded — the corrected bundle was published under the same URI and never fetched. Upgrading past 4.0.1 fixes the distribution as well as the bundle: the URI now changes with the content, so a host holding the 4.0.0 copy simply stops asking for it. No manual cache clearing is needed, and the remaining delay is the one-hour tools/list hint rather than 24 hours.

HTTP/SSE Transport Mode

In addition to the default stdio transport, the server supports an HTTP transport for use as a remote or shared MCP endpoint.

Starting the HTTP Server

# Using the npm script (defaults: localhost:3000)
npm run start:http

# Using the built binary directly with custom options
node dist/index.js --transport http --port 8080 --host 127.0.0.1

CLI Arguments

Argument

Default

Description

--transport

stdio

Transport mode: stdio or http

--port

3000

Port to listen on (1–65535)

--host

127.0.0.1

Host to bind to

Security note: The default host 127.0.0.1 restricts access to localhost only. Binding to 0.0.0.0 exposes the server to the network; only do this in controlled environments.

HTTP Endpoints

Endpoint

Method

Description

/mcp

POST

MCP JSON-RPC endpoint (streamable HTTP transport)

/health

GET

Health check — returns {"status":"ok","version":"<current>"}

Connecting an MCP Client via HTTP

Claude Desktop or other MCP clients that support HTTP transport can connect with:

{
  "mcpServers": {
    "jamf-docs": {
      "url": "http://127.0.0.1:3000/mcp"
    }
  }
}

CORS Configuration

By default the server does not set CORS headers (cross-origin requests are blocked). To allow specific origins, set the CORS_ALLOWED_ORIGINS environment variable:

CORS_ALLOWED_ORIGINS=https://myapp.example.com node dist/index.js --transport http

Multiple origins are separated by commas.

Rate Limiting

The HTTP server applies per-IP token-bucket rate limiting. The default is 60 requests per minute. Override with the RATE_LIMIT_RPM environment variable.

By default the "IP" is the TCP peer address. Behind a reverse proxy every request arrives from the proxy, so all clients share one RATE_LIMIT_RPM bucket and one busy client throttles everyone. Set TRUST_PROXY=true (or 1) to take the client address from X-Forwarded-For instead. Only those two exact values turn it on — TRUE, yes or anything else leaves it off. When it is on:

  • The rightmost entry is used: the address appended by the proxy directly in front of the server. Entries to its left are whatever the client sent and can be forged, so they are ignored. That is right for exactly one proxy hop; behind two (a CDN in front of nginx, say) the rightmost entry is the outer proxy, and clients arriving through it share a bucket again.

  • A request without X-Forwarded-For falls back to the peer address. X-Real-IP and Forwarded are not read, so the proxy must send X-Forwarded-For for the setting to have any effect.

  • The address feeds the rate limiter and nothing else.

Leave it off when clients reach the server directly. With it on and no proxy in front, a client can send any X-Forwarded-For it likes and get a fresh bucket on every request, which defeats the limit.

Configuration

All settings are optional. Set them as environment variables before launching the server.

Cache Settings

Variable

Default

Range

Description

CACHE_DIR

.cache

—

Cache directory. Must be a directory used only for this cache; see below

CACHE_TTL_SEARCH

1800000 (30 min)

1 min–30 days

TTL for search result cache entries

CACHE_TTL_ARTICLE

86400000 (24 hr)

1 min–30 days

TTL for article content cache entries

CACHE_TTL_PRODUCTS

604800000 (7 days)

1 min–30 days

TTL for product list cache entries

CACHE_TTL_TOC

86400000 (24 hr)

1 min–30 days

TTL for table of contents cache entries

CACHE_MAX_ENTRIES

500

10–10000

Maximum number of entries kept in the in-memory cache

CACHE_DIR must be a directory used only for this cache. The server writes entries there as <hash>.json, and every start deletes the ones that have expired or can't be read. Files with other names are left alone, but don't point it at a project root or a directory other tools use.

  • A relative path, including the default .cache, resolves against the server's working directory. It must stay inside that directory. If the host starts the server from /, set an absolute CACHE_DIR: on macOS /.cache can't be created, so nothing reaches the disk.

  • A path inside /etc, /usr, /var, /sys, /proc, /dev, /sbin or /bin is rejected, relative or absolute. Symlinks are resolved first, so on macOS /private/etc/… is rejected just like /etc/…. An unset CACHE_DIR isn't checked.

  • Your home directory and the OS temp directory are allowed even when they're under one of those. $TMPDIR on macOS is under /private/var, and on ostree systems such as Fedora Silverblue /home is a link to /var/home.

  • A rejected value falls back to .cache, with a warning on stderr. That is relative to the working directory too, so if the working directory is inside a system directory, the fallback is as well.

Request Settings

Applied to every outbound request to a documentation host.

Variable

Default

Range

Description

REQUEST_TIMEOUT

15000

1000–60000 ms

Per-attempt HTTP timeout

MAX_RETRIES

0

0–10

Retry attempts after the first. Only 429, 5xx, network errors and timeouts are retried, with exponential backoff and Retry-After honoured. 0 disables retrying

RETRY_DELAY

1000

100–30000 ms

Base for the backoff between retries. No effect while MAX_RETRIES is 0

RATE_LIMIT_DELAY

0

0–10000 ms

Minimum gap between outbound requests. 0 lets parallel fetches stay parallel

USER_AGENT

jamf-docs-mcp-server/<version> (+<repo url>)

—

Sent on every request so this client is identifiable to Jamf

HTTP Transport Settings

Variable

Default

Range

Description

RATE_LIMIT_RPM

60

1–10000

Inbound requests per minute per IP (HTTP transport only)

CORS_ALLOWED_ORIGINS

`` (empty)

—

Comma-separated list of allowed CORS origins (HTTP transport only)

TRUST_PROXY

off

true or 1

Take the client IP for the per-IP rate limit from the rightmost X-Forwarded-For entry instead of the socket. Enable only behind a reverse proxy — see Rate Limiting (HTTP transport only)

Development

git clone https://github.com/GET-Technology-Inc/jamf-docs-mcp-server.git
cd jamf-docs-mcp-server
npm install
npm run dev        # stdio mode with file watching
npm run start:http # HTTP transport mode

Available Scripts

Script

Description

npm run build

Compile TypeScript to dist/

npm run dev

Development mode with auto-reload (stdio)

npm run dev:app-ui

Live preview of the MCP Apps viewer at http://127.0.0.1:5173

npm run fixtures:app-ui

Re-capture the viewer's fixtures from the live tools

npm run start:http

Start HTTP/SSE transport mode

npm test

Pre-PR run: unit, integration and e2e

npm run test:unit

Unit tests only — hermetic, no network

npm run test:integration

Integration tests only (live Jamf APIs)

npm run test:contract

Upstream contract suites. Run out of band by upstream-contract.yml, not part of the merge gate

npm run test:e2e

End-to-end tests only (live Jamf APIs)

npm run test:all

Everything, contract suites included

npm run test:coverage

Coverage over the unit tier, as CI reports it

npm run test:inspector

Launch MCP Inspector against local build

npm run lint

Lint source files

npm run typecheck

TypeScript type check without emitting

License

MIT - Copyright (c) 2025 GET Technology Inc.

Disclaimer

This is an unofficial tool and is not affiliated with Jamf.

Available Tools

6 tools
jamf_docs_batch_get_articlesBatch Get Jamf Documentation ArticlesA
Read-onlyIdempotent

Retrieve multiple Jamf documentation articles in a single request.

Fetches up to 10 articles in parallel with concurrency control. Useful for comparing articles, gathering information from multiple pages, or bulk research.

Args:

  • urls (string[], required): Array of 1-10 https:// article URLs on learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com. Any other URL fails as its own per-article error

  • concurrency (number, optional): Max parallel requests 1-5 (default: 3)

  • language (string, optional): Documentation language/locale. Overrides the locale in each URL, which is used when this is omitted. No effect on concepts.jamf.com or support.jamf.com URLs

  • maxTokens (number, optional): Total token budget across all articles 100-50000 (default: 5000). Distributed evenly.

  • outputMode ('full' | 'compact'): Output detail level (default: 'full'). Use 'compact' for brief output.

  • responseFormat ('markdown' | 'json'): Output format (default: 'markdown')

Returns: An array of article results. Each article independently succeeds or fails. For JSON format, returns a BatchResponse object with results, summary, and tokenInfo.

Examples:

Note: Token budget is split evenly across articles. Use higher maxTokens for more articles. A note on an article (such as one about language) counts toward its share. Partial failures are reported per-article without failing the entire batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesArray of Jamf documentation article URLs (1-10)
languageNoDocumentation language/locale. Overrides the locale in the article URL, which is used when this is omitted. Has no effect on concepts.jamf.com or support.jamf.com URLs. Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN
maxTokensNoTotal token budget across all articles (100-50000, default: 5000)
outputModeNoOutput detail level: "full" for detailed output or "compact" for brief outputfull
concurrencyNoMaximum parallel requests (1-5, default: 3)
responseFormatNoOutput format: "markdown" for human-readable or "json" for machine-readablemarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
summaryYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description reveals critical runtime behavior: concurrency control (1-5), per-article failure isolation, token budget distribution, language override semantics, and partial-failure reporting. It even notes that the language parameter has no effect on certain domains. This substantially exceeds annotation coverage.

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

Conciseness4/5

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

The description is organized into clear sections (Args, Returns, Examples, Note) and front-loads the core purpose. It is slightly verbose with the Args list repeating some schema details, but every sentence adds operational value. Examples are helpful but could be trimmed.

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?

For a complex batch tool with 6 params and an output schema, the description covers all aspects an agent needs: input constraints, parameter interactions, return shape, error handling, and usage examples. It complements the output schema without duplicating field-level return details.

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

Parameters5/5

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

While the schema documents all six parameters (100% coverage), the description adds meaningful semantics: how maxTokens is split evenly, that concurrency limits parallel requests, how language overrides URL locale with no effect on certain domains, and what compact mode means. It clarifies behavior that the schema alone does not convey.

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 'Retrieve' and resource 'multiple Jamf documentation articles in a single request', distinguishing it from the single-article sibling by highlighting batching and parallelism. The title and opening sentence unambiguously identify this as the bulk version of get_article.

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?

The description gives concrete use cases ('comparing articles, gathering information from multiple pages, or bulk research') and includes examples. It does not explicitly name alternatives or exclusion conditions, but the batch context strongly implies when this tool is preferred over single-article fetches.

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

jamf_docs_get_articleGet Jamf Documentation ArticleA
Read-onlyIdempotent

Retrieve the full content of a specific Jamf documentation article.

This tool fetches and parses a Jamf documentation article, converting it to a clean, readable format. Works with any article from learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com.

Address the article either by url, or by the mapId + contentId pair that search results and TOC entries carry. One of the two is required. Passing both, as a search result allows, is fine: on learn.jamf.com the pair decides which article is fetched, and the result's url is that article's own address (a note says so if the url you passed does not match it). A concepts.jamf.com or support.jamf.com url is fetched by url, and a note says the pair was ignored.

Args:

  • url (string, optional): Full https:// URL of the article, on learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com. Required unless mapId and contentId are given

  • mapId (string, optional): Fluid Topics map ID, from a search result or a TOC. Use with contentId, instead of url or alongside it

  • contentId (string, optional): Fluid Topics content ID, from a search result or a TOC entry. Use with mapId, instead of url or alongside it

  • language (string, optional): Documentation language/locale. Overrides the locale in url, which is used when this is omitted. No effect on a mapId + contentId pair (a map is in one language) or on concepts.jamf.com or support.jamf.com URLs

  • section (string, optional): Extract only a specific section by title or ID (e.g., "Prerequisites", "Configuration")

  • summaryOnly (boolean, optional): Return only article summary and outline instead of full content (default: false). Token-efficient way to preview an article and its sub-topics

  • includeRelated (boolean, optional): Include links to related articles (default: false)

  • maxTokens (number, optional): Maximum tokens in response 100-50000 (default: 5000)

  • outputMode ('full' | 'compact'): Output detail level (default: 'full'). Use 'compact' for brief output

  • responseFormat ('markdown' | 'json'): Output format (default: 'markdown')

Returns: For JSON format: { "title": string, "content": string, "url": string, "product": string, "version": string, "breadcrumb": string[], "relatedArticles": [...], "tokenInfo": { "tokenCount": number, "truncated": boolean, "maxTokens": number }, "sections": [ { "id": string, "title": string, "level": number, "tokenCount": number } ] }

For Markdown format: The article content with token info and available sections.

Examples:

Errors:

  • "Either url or both mapId and contentId must be provided." if neither url nor the full pair is given

  • "URL must be from learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com" (an input validation error) if url is not https:// on one of those hosts

  • "Topic not found", "Cannot resolve bundleId" or "HTTP 404" if there is no article at that address

Note: maxTokens bounds every reply: the article or one section, a summaryOnly outline, a missed section's reply, and any note about how the call was resolved, all counted in tokenInfo.tokenCount. Large articles are intelligently truncated with remaining sections listed, as many as fit; a list cut to fit says how many it left out, and truncated is true. Use the section parameter to retrieve specific sections for long articles. A section that matches no heading is not an error: the reply says 'Section "" not found' and lists the article's sections, or says it has none. Most learn.jamf.com topics have no headings; what the website shows as their sections are sub-topics, which the reply lists with their urls, a matching one first.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull https:// URL of the Jamf documentation article, on learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com. Alternative: use mapId + contentId for direct fetch. One of the two is required.
mapIdNoFluid Topics map ID (from search results or TOC). Use with contentId for direct fetch.
sectionNoExtract only a specific section by title or ID (e.g., "Prerequisites", "Configuration")
languageNoDocumentation language/locale. Overrides the locale in the article URL, which is used when this is omitted. Has no effect on concepts.jamf.com or support.jamf.com URLs, or on a mapId + contentId pair, whose map is already in one language. Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN
contentIdNoFluid Topics content ID (from search results or TOC). Use with mapId for direct fetch.
maxTokensNoMaximum tokens in response (100-50000, default: 5000)
outputModeNoOutput detail level: "full" for detailed output or "compact" for brief outputfull
summaryOnlyNoReturn only article summary and outline instead of full content (token-efficient)
includeRelatedNoInclude related article links in the response
responseFormatNoOutput format: "markdown" for human-readable or "json" for machine-readablemarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
mapIdNo
titleYes
contentYes
productNo
versionNo
sectionsYes
contentIdNo
truncatedYes
breadcrumbNo
navigationNo
tokenCountNo
lastUpdatedNo
contentLocaleNo
versionStatusNo

TDQS

A5/5.0
Behavior5/5

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

The description thoroughly discloses behavior beyond the readOnly/idempotent annotations: how token limits apply to every reply, truncation logic, what happens when a section is not found (including the exact error message), and how the tool resolves conflicting address inputs. It also notes the quirk that most learn.jamf.com topics have no headings and are treated as sub-topics. This is rich, non-obvious behavior that far exceeds annotation coverage.

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?

The description is long but well-organized into purpose, args, returns, examples, errors, and a detailed note. Every section adds necessary information for correct invocation. The intro is front-loaded with the core purpose, and technical details are logically grouped. There is no redundant filler; the density is justified by the tool's complexity (10 parameters, multiple hosts, and nuanced behaviors).

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?

Given the tool's complexity, the description is remarkably complete. It covers all parameters, error cases, output formats (including a full JSON schema in the Returns section), token handling, and edge cases like missing sections or precedence of address inputs. It even explains the behavior for different document hosts. Nothing an agent needs to call this tool correctly is missing.

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

Parameters5/5

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

While the input schema covers 100% of parameters, the description adds significant semantic detail: the exact interplay between url and mapId/contentId, language override behavior for different host types, and the meaning of maxTokens in the context of truncation and summaryOnly. It explains that outputMode and responseFormat affect the output shape, and gives examples of valid parameter values. This goes well beyond the schema's field descriptions.

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 opening sentence states exactly what the tool does: 'Retrieve the full content of a specific Jamf documentation article.' It further explains that it fetches and parses an article into a clean format, and clarifies the supported hosts. This clearly distinguishes it from sibling tools like search or batch get, which serve different purposes.

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?

The description provides explicit guidance on when to use URL vs. mapId + contentId, explains precedence when both are passed, and details when to use summaryOnly or section for long articles. It also gives concrete examples of valid calls. While it doesn't explicitly say 'use batch for multiple articles', the single-article scope is unambiguous and the examples reinforce the correct usage.

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

jamf_docs_get_tocGet Documentation Table of ContentsA
Read-onlyIdempotent

Get the table of contents for Jamf documentation.

Browse the navigation structure of either a Jamf product or any single Jamf publication - release notes, technical papers, courses, evaluation guides and configuration guides all live on the publication axis rather than the product one. Exactly one of product and publication is required.

Args:

  • product (string): Product ID - one of: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener

  • publication (string): Bundle family id of any single publication, e.g. "technical-paper-laps" or "jamf-pro-release-notes". Call jamf_docs_list_products for the available ids

  • version (string, optional): Specific version (e.g., "11.13.0") or "current" (defaults to latest)

  • language (string, optional): Documentation language/locale (default: en-US)

  • page (number, optional): Page number for pagination 1-100 (default: 1)

  • maxTokens (number, optional): Maximum tokens in response 100-50000 (default: 5000)

  • outputMode ('full' | 'compact'): Output detail level (default: 'full'). Use 'compact' for flat list without nested children

  • responseFormat ('markdown' | 'json'): Output format (default: 'markdown')

Returns: For JSON format: { "product": string, "version": string, "mapId": string, // omitted when the map could not be resolved "toc": [...], // each entry carries title, url and contentId "tokenInfo": { "tokenCount": number, "truncated": boolean, "maxTokens": number }, "pagination": { "page": number, "pageSize": number, "totalPages": number, "totalItems": number, "hasNext": boolean, "hasPrev": boolean }, "truncatedEntry"?: { // only on a page cut to fit; see the Note "title": string, "shownEntries": number, "totalEntries": number, "estimatedTokens": number } }

For Markdown format: A hierarchical list of documentation topics with pagination and token info.

Examples:

  • Browse Jamf Pro documentation: product="jamf-pro"

  • Get page 2 of TOC: product="jamf-pro", page=2

  • Limit response size: product="jamf-pro", maxTokens=2000

Errors:

  • "Invalid option: expected one of ..." (an input validation error) if product is not a known product ID

  • 'Version "" not found', followed by the available versions, if that version is not published

Note: Use this to discover what topics are available before searching or retrieving specific articles. Large TOCs are paginated by top-level entry: a page holds up to 10 of them, each with everything under it, as many as fit maxTokens, and the next page starts at the first that did not fit. Every top-level entry is on exactly one page, but which page depends on maxTokens, so keep maxTokens the same while paging; the markdown footer names it beside the next page when it is not the default. A top-level entry larger than maxTokens on its own is alone on its page, cut to the entries under it that fit; only that page has tokenInfo.truncated, and truncatedEntry.estimatedTokens is what the whole entry costs. If maxTokens makes more pages than page accepts (100), page 100 offers no next page and paginationNote names a maxTokens that reaches the rest. The response-level mapId and an entry's contentId together form the pair jamf_docs_get_article accepts for a direct fetch. Markdown output shows the mapId only; use responseFormat="json" (or read structuredContent) for the per-entry contentIds. structuredContent also carries what to send back for the next page: productId (or publicationId), version, language (when one was asked for) and maxTokens. The JSON text has no id or language, and has the budget as tokenInfo.maxTokens. structuredContent.entries is the TOC flattened in document order and always carries every descendant; each entry's depth (0 for top level) is what restores the nesting. The markdown is not the same view: outputMode="full" shows that nesting as indentation, while outputMode="compact" lists only the top-level entries and shows no nesting at all.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination (1-100, default: 1)
productNoProduct ID: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener
versionNoSpecific version (e.g. "11.13.0"); defaults to latest
languageNoDocumentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN
maxTokensNoMaximum tokens in response (100-50000, default: 5000)
outputModeNoOutput detail level: "full" for detailed output or "compact" for brief outputfull
publicationNoBundle family id for any Jamf publication, e.g. "technical-paper-laps" or "jamf-pro-release-notes". Use this for the documents that are not one of the products in `product` — release notes, technical papers, courses, evaluation and configuration guides. Exactly one of `product` or `publication` is required. Call jamf_docs_list_products to see the available ids.
responseFormatNoOutput format: "markdown" for human-readable or "json" for machine-readablemarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
mapIdNo
entriesYes
hasMoreYes
productYes
versionYes
languageNo
maxTokensYes
productIdNo
localeNoteNo
totalPagesYes
versionNoteNo
totalEntriesYes
publicationIdNo
paginationNoteNo
truncatedEntryNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial operational detail: how pagination splits by top-level entry, that page assignment depends on maxTokens, that changing maxTokens mid-page breaks paging, the single truncated page behavior, the page-100 cap, and the exact error strings for bad product IDs and missing versions. This is well beyond the safety profile the annotations provide.

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?

Front-loading is good and the Note carries the highest-value content, but two full blocks are redundant: the Args list restates every schema property description verbatim, and the Returns section reproduces an entire JSON response shape that the output schema already defines. Roughly half the text duplicates structured data, diluting an otherwise well-organized payload.

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?

For an 8-parameter, paginated tool with a rich output schema, the description covers everything an agent needs: axis selection, the mutual-exclusion constraint, paging stability rules, truncation signaling, structuredContent continuation fields, and the mapId/contentId pairing for article fetches. Return values are where they belong, in the output schema, and the Note supplies the cross-call knowledge the schema cannot.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description contributes genuine semantics the schema does not: 'Exactly one of product and publication is required' (the schema marks neither as required, so this constraint is only available here), the meaning of publication as a bundle family for non-product docs, and outputMode='compact' as a flat list without nested children rather than the schema's generic 'brief output'.

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?

States a specific verb and resource ('Get the table of contents for Jamf documentation') and immediately scopes it: 'Browse the navigation structure of either a Jamf product or any single Jamf publication.' It goes further than any sibling by explaining that release notes, technical papers, courses and guides live on the publication axis, not the product axis, so an agent can select correctly without opening a schema.

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?

Gives clear context: 'Use this to discover what topics are available before searching or retrieving specific articles,' which positions it relative to jamf_docs_search and jamf_docs_get_article. It also points to jamf_docs_list_products for publication ids. It lacks an explicit when-not (e.g., when to skip the TOC and search directly), so it stops short of the top band.

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

jamf_docs_glossary_lookupLookup Jamf Glossary TermA
Read-onlyIdempotent

Look up a term in the Jamf official glossary and get its definition.

This tool searches the Jamf Platform Technical Glossary, one glossary shared by every Jamf product, and returns matching term definitions using fuzzy matching. A term of 4 characters or fewer is treated as an abbreviation and must be a whole word of the entry's name, so "DEP" does not match "zero-touch deployment". A 4-character term may be a plural, or miss a letter or swap two ("MDMs", "LDPA").

Note: Glossary content is currently only available in English (en-US). Non-English language parameters are accepted but results will be in English.

Args:

  • term (string, required): Glossary term to look up (2-100 characters). Supports fuzzy matching.

  • product (string, optional): Accepted, but does not filter: Jamf publishes one platform-wide glossary with no product classification

  • language (string, optional): Documentation language/locale (default: en-US). Note: glossary is English-only.

  • maxTokens (number, optional): Maximum tokens in response 100-50000 (default: 5000)

  • outputMode ('full' | 'compact'): Output detail level (default: 'full')

  • responseFormat ('markdown' | 'json'): Output format (default: 'markdown')

Returns: For JSON format: { "term": string, "totalMatches": number, "entries": [{ "term": string, "definition": string, "url": string }], "tokenInfo": { "tokenCount": number, "truncated": boolean, "maxTokens": number }, "truncatedContent"?: { "omittedCount": number, "omittedItems": [{ "title": string, "estimatedTokens": number }] }, "incomplete"?: { "unfetched": [{ "term": string, "url": string }], "message": string } }

For Markdown format: A formatted list of glossary definitions with source links.

Examples:

  • "What is MDM?" → term="MDM"

  • "What is a configuration profile?" → term="Configuration Profile"

  • "What is Automated Device Enrollment (formerly DEP)?" → term="Automated Device Enrollment"

Errors:

  • "Glossary lookup for "" failed: ..." (isError) if learn.jamf.com could not be read (a network error, a timeout, or a server error), so the lookup cannot say whether the glossary has the term. This is not a "no match". It may be temporary: try again.

  • "Invalid option: expected one of ..." (an input validation error) if product is not a known product ID

Note: "No glossary entries found" is not an error. It means the glossary was read and no entry matches; in JSON that is "totalMatches": 0. If entries match but not even the first fits in maxTokens, the reply says how many matched and the maxTokens the first one needs: "truncatedContent" lists each entry left out and the tokens it costs. If some matching entries could not be fetched, the reply answers from the rest and says so: "incomplete" names the entries it may be missing. If the entry that would lead the answer is one of them, that is the error above instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesGlossary term to look up (e.g., "MDM", "Configuration Profile", "Automated Device Enrollment")
productNoAccepted, but does not filter: Jamf publishes one platform-wide glossary with no product classification
languageNoDocumentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN
maxTokensNoMaximum tokens in response (100-50000, default: 5000)
outputModeNoOutput detail level: "full" for detailed output or "compact" for brief outputfull
responseFormatNoOutput format: "markdown" for human-readable or "json" for machine-readablemarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
termYes
entriesYes
truncatedYes
incompleteNo
totalMatchesYes
truncatedContentNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, yet the description adds substantial behavior beyond them: the whole-word rule for terms of 4 characters or fewer, plural/typo tolerance, English-only results even with non-English language params, and a careful distinction between a lookup failure (network/timeout, retryable, 'not a no-match') and a legitimate zero-match result.

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

Conciseness4/5

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

Well front-loaded with purpose, then args, returns, examples, and error/no-match semantics in a predictable order. Slight redundancy: the English-only caveat appears twice (once as a standalone note, once in the language arg), and the error section is dense, but nearly every sentence carries load-bearing 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?

For a 6-parameter tool with an output schema present, the description covers everything else an agent needs: fuzzy-match behavior, abbreviation rules, the no-op product parameter, truncation via truncatedContent, partial results via incomplete, and the error-vs-no-match distinction. Nothing material is missing.

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 baseline is 3, but the description adds real meaning the schema does not: product is accepted yet filters nothing, and language options are accepted but always yield English content. The fuzzy-matching and abbreviation semantics on term also go beyond the schema's example list.

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?

States a specific verb+resource (look up a term in the Jamf official glossary) and immediately scopes it: one platform-wide glossary shared by every Jamf product, with fuzzy matching. An agent can distinguish this from jamf_docs_search/get_article because the resource is explicitly the glossary, not documentation articles.

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?

Clear context for when to reach for it (definition lookup of a term) and explicit operational guidance on term length, abbreviations, and that product does not filter. It never names a sibling or says when NOT to use this versus jamf_docs_search, so routing is inferable rather than explicit.

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

jamf_docs_list_productsList Jamf ProductsA
Read-onlyIdempotent

List Jamf products, publications, topics, and documentation versions.

Returns two separate catalogues:

  • Products: the IDs the product filter in jamf_docs_search accepts, and the product parameter of jamf_docs_get_toc. Jamf Pro, Jamf School, Jamf Connect, Jamf Protect, Jamf Now, Jamf Safe Internet and more.

  • Publications: every document Jamf publishes - release notes, technical papers, courses, evaluation and configuration guides - grouped the way Jamf classifies them. Pass one of these IDs as the publication parameter of jamf_docs_get_toc. These are documents, not products, and the search product filter does not take them.

Also lists available topic and docType filters for search.

Args:

  • maxTokens (number, optional): Maximum tokens in response 100-50000 (default: 10000, higher than other tools because this one answers with a whole catalogue)

  • outputMode ('full' | 'compact'): Output detail level (default: 'full'). Use 'compact' for brief list

  • responseFormat ('markdown' | 'json'): Output format (default: 'markdown')

Returns: For JSON format: { "products": [...], "publications": [...], "topics": [...], "incomplete"?: { "unavailable": string[], "message": string }, "tokenInfo": { "tokenCount": number, "truncated": boolean, "maxTokens": number } }

For Markdown format: A formatted list of products and topics with their details.

Examples:

  • "What Jamf products are available?" → use this tool

  • "List all Jamf documentation" → use this tool

  • "What topics can I filter by?" → use this tool

  • "Where are the Jamf Pro release notes?" → use this tool, then get_toc with the publication ID

Note: This is a read-only operation that does not modify any state.

If a source could not be read, the reply lists what it could and says so. "incomplete" then names each unavailable source, its "message" says what that cost, and the Markdown reply says the same at the top. "maps-registry" is learn.jamf.com, where the publication list and the product versions both come from: either can then be missing or a compiled-in default. "jamf-support" is support.jamf.com, whose jamf-support-* publications are then missing. This may be temporary: try again in a minute. No "incomplete" means every source answered.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxTokensNoMaximum tokens in response (100-50000, default: 10000)
outputModeNoOutput detail level: "full" for detailed output or "compact" for brief outputfull
responseFormatNoOutput format: "markdown" for human-readable or "json" for machine-readablemarkdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
topicsYes
productsYes
incompleteNo
publicationsNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuine behavior beyond that: the `incomplete` failure mode, which underlying sources (maps-registry, jamf-support) can go missing, what each failure costs, and retry guidance. This is rich failure/partial-result disclosure, though it doesn't discuss rate limits or auth.

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

Conciseness4/5

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

The catalogue split is front-loaded and the failure-mode note is well organized. However, the 'Args' section and the 'Returns' block largely restate the input schema and the output schema, so several lines are redundant with structured fields already available to the agent.

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, return values are already specified, and the description still supplies the interpretive context an agent needs: what each catalogue is for, which sibling consumes each ID, the truncation mechanism, and the partial-failure behavior. Nothing needed to call it correctly is missing.

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% and all three params are documented in the schema, so the baseline is 3. The description goes beyond by explaining why maxTokens defaults higher here ('this one answers with a whole catalogue') and by characterizing 'compact' as a brief list, adding intent the enum alone doesn't convey.

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?

States a specific verb and resource ('List Jamf products, publications, topics, and documentation versions') and immediately splits the response into two named catalogues with distinct downstream uses. It explicitly distinguishes what the list contains from sibling operations by naming jamf_docs_search and jamf_docs_get_toc and their respective parameters.

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?

Provides four concrete example queries mapped to this tool, plus an explicit exclusion ('These are documents, not products, and the search `product` filter does not take them'). The alternative paths (get_toc with product or publication IDs, search with product filter) are named with the condition that selects them.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv6.0.12
    • Changedjamf_docs_get_toc4 fields changed
      • addedOutput schema / properties / language
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / maxTokens
        Added value: +{
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncatedEntry
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "estimatedTokens": {
        +      "type": "number"
        +    },
        +    "shownEntries": {
        +      "type": "number"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "totalEntries": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "title",
        +    "shownEntries",
        +    "totalEntries",
        +    "estimatedTokens"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "product",
        -  "version",
        -  "totalEntries",
        -  "page",
        -  "totalPages",
        -  "hasMore",
        -  "entries"
        -]New value: +[
        +  "product",
        +  "version",
        +  "totalEntries",
        +  "page",
        +  "totalPages",
        +  "hasMore",
        +  "maxTokens",
        +  "entries"
        +]
    • Changedjamf_docs_glossary_lookup1 field changed
      • addedOutput schema / properties / truncatedContent
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "omittedCount": {
        +      "type": "number"
        +    },
        +    "omittedItems": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "estimatedTokens": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "estimatedTokens"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "omittedCount",
        +    "omittedItems"
        +  ],
        +  "type": "object"
        +}
    • Changedjamf_docs_list_products1 field changed
      • addedOutput schema / properties / incomplete
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "unavailable": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "unavailable",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedjamf_docs_search1 field changed
      • addedOutput schema / properties / results / items / properties / crossFiled
        Added value: +{
        +  "type": "boolean"
        +}
  2. 3 tool updatesv6.0.11
    • Changedjamf_docs_batch_get_articles1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"New value: +"Documentation language/locale. Overrides the locale in the article URL, which is used when this is omitted. Has no effect on concepts.jamf.com or support.jamf.com URLs. Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
    • Changedjamf_docs_get_article2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"New value: +"Documentation language/locale. Overrides the locale in the article URL, which is used when this is omitted. Has no effect on concepts.jamf.com or support.jamf.com URLs, or on a mapId + contentId pair, whose map is already in one language. Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / url / description
        Previous value: -"Full URL of the Jamf documentation article. Alternative: use mapId + contentId for direct fetch."New value: +"Full https:// URL of the Jamf documentation article, on learn.jamf.com, docs.jamf.com, concepts.jamf.com, support.jamf.com. Alternative: use mapId + contentId for direct fetch. One of the two is required."
    • Changedjamf_docs_glossary_lookup3 fields changed
      • changedInput schema / properties / product / description
        Previous value: -"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener"New value: +"Accepted, but does not filter: Jamf publishes one platform-wide glossary with no product classification"
      • changedInput schema / properties / term / description
        Previous value: -"Glossary term to look up (e.g., \"MDM\", \"Configuration Profile\", \"Smart Group\")"New value: +"Glossary term to look up (e.g., \"MDM\", \"Configuration Profile\", \"Automated Device Enrollment\")"
      • addedOutput schema / properties / incomplete
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "type": "string"
        +    },
        +    "unfetched": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "term": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "term",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "unfetched",
        +    "message"
        +  ],
        +  "type": "object"
        +}
  3. 1 tool updatev5.10.6
    • Changedjamf_docs_list_products8 fields changed
      • changedInput schema / properties / maxTokens / default
        Previous value: -5000New value: +10000
      • changedInput schema / properties / maxTokens / description
        Previous value: -"Maximum tokens in response (100-50000, default: 5000)"New value: +"Maximum tokens in response (100-50000, default: 10000)"
      • addedOutput schema / properties / publications / items / properties / app / items
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / publications / items / properties / app / type
        Previous value: -"string"New value: +"array"
      • addedOutput schema / properties / publications / items / properties / portal / items
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / publications / items / properties / portal / type
        Previous value: -"string"New value: +"array"
      • addedOutput schema / properties / publications / items / properties / utility / items
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / publications / items / properties / utility / type
        Previous value: -"string"New value: +"array"
  4. 6 tool updatesv5.10.1
    • Changedjamf_docs_batch_get_articles2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH"New value: +"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en-US",
        -  "ja-JP",
        -  "zh-TW",
        -  "de-DE",
        -  "es-ES",
        -  "fr-FR",
        -  "nl-NL",
        -  "th-TH"
        -]New value: +[
        +  "en-US",
        +  "ja-JP",
        +  "zh-TW",
        +  "de-DE",
        +  "es-ES",
        +  "fr-FR",
        +  "nl-NL",
        +  "th-TH",
        +  "it-IT",
        +  "pt-BR",
        +  "zh-CN"
        +]
    • Changedjamf_docs_get_article2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH"New value: +"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en-US",
        -  "ja-JP",
        -  "zh-TW",
        -  "de-DE",
        -  "es-ES",
        -  "fr-FR",
        -  "nl-NL",
        -  "th-TH"
        -]New value: +[
        +  "en-US",
        +  "ja-JP",
        +  "zh-TW",
        +  "de-DE",
        +  "es-ES",
        +  "fr-FR",
        +  "nl-NL",
        +  "th-TH",
        +  "it-IT",
        +  "pt-BR",
        +  "zh-CN"
        +]
    • Changedjamf_docs_get_toc11 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH"New value: +"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en-US",
        -  "ja-JP",
        -  "zh-TW",
        -  "de-DE",
        -  "es-ES",
        -  "fr-FR",
        -  "nl-NL",
        -  "th-TH"
        -]New value: +[
        +  "en-US",
        +  "ja-JP",
        +  "zh-TW",
        +  "de-DE",
        +  "es-ES",
        +  "fr-FR",
        +  "nl-NL",
        +  "th-TH",
        +  "it-IT",
        +  "pt-BR",
        +  "zh-CN"
        +]
      • changedInput schema / properties / product / description
        Previous value: -"Product ID: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"New value: +"Product ID: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener"
      • changedInput schema / properties / product / enum
        Previous value: -[
        -  "jamf-pro",
        -  "jamf-school",
        -  "jamf-connect",
        -  "jamf-protect",
        -  "jamf-now",
        -  "jamf-safe-internet",
        -  "jamf-insights",
        -  "jamf-rapididentity",
        -  "jamf-trust",
        -  "jamf-routines",
        -  "self-service-plus",
        -  "jamf-app-catalog"
        -]New value: +[
        +  "jamf-pro",
        +  "jamf-school",
        +  "jamf-connect",
        +  "jamf-protect",
        +  "jamf-now",
        +  "jamf-safe-internet",
        +  "jamf-insights",
        +  "jamf-rapididentity",
        +  "jamf-trust",
        +  "jamf-routines",
        +  "self-service-plus",
        +  "jamf-app-catalog",
        +  "jamf-account",
        +  "jamf-security-cloud",
        +  "elevate",
        +  "composer",
        +  "jamf-parent",
        +  "jamf-teacher",
        +  "jamf-setup-reset",
        +  "jamf-assessment",
        +  "title-editor",
        +  "jamf-infrastructure-manager",
        +  "jamf-adcs-connector",
        +  "jamf-pki-proxy",
        +  "jamf-migrate",
        +  "jamf-remote-assist",
        +  "jamf-cloud-distribution-service",
        +  "healthcare-listener"
        +]
      • addedInput schema / properties / publication
        Added value: +{
        +  "description": "Bundle family id for any Jamf publication, e.g. \"technical-paper-laps\" or \"jamf-pro-release-notes\". Use this for the documents that are not one of the products in `product` — release notes, technical papers, courses, evaluation and configuration guides. Exactly one of `product` or `publication` is required. Call jamf_docs_list_products to see the available ids.",
        +  "maxLength": 200,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / version / description
        Previous value: -"Specific version (defaults to latest)"New value: +"Specific version (e.g. \"11.13.0\"); defaults to latest"
      • addedInput schema / properties / version / pattern
        Added value: +"^(?:current|\\d+(?:\\.\\d+)*)$"
      • removedInput schema / required
        Removed value: -[
        -  "product"
        -]
      • addedOutput schema / properties / localeNote
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / publicationId
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "product",
        -  "productId",
        -  "version",
        -  "totalEntries",
        -  "page",
        -  "totalPages",
        -  "hasMore",
        -  "entries"
        -]New value: +[
        +  "product",
        +  "version",
        +  "totalEntries",
        +  "page",
        +  "totalPages",
        +  "hasMore",
        +  "entries"
        +]
    • Changedjamf_docs_glossary_lookup4 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH"New value: +"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en-US",
        -  "ja-JP",
        -  "zh-TW",
        -  "de-DE",
        -  "es-ES",
        -  "fr-FR",
        -  "nl-NL",
        -  "th-TH"
        -]New value: +[
        +  "en-US",
        +  "ja-JP",
        +  "zh-TW",
        +  "de-DE",
        +  "es-ES",
        +  "fr-FR",
        +  "nl-NL",
        +  "th-TH",
        +  "it-IT",
        +  "pt-BR",
        +  "zh-CN"
        +]
      • changedInput schema / properties / product / description
        Previous value: -"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"New value: +"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener"
      • changedInput schema / properties / product / enum
        Previous value: -[
        -  "jamf-pro",
        -  "jamf-school",
        -  "jamf-connect",
        -  "jamf-protect",
        -  "jamf-now",
        -  "jamf-safe-internet",
        -  "jamf-insights",
        -  "jamf-rapididentity",
        -  "jamf-trust",
        -  "jamf-routines",
        -  "self-service-plus",
        -  "jamf-app-catalog"
        -]New value: +[
        +  "jamf-pro",
        +  "jamf-school",
        +  "jamf-connect",
        +  "jamf-protect",
        +  "jamf-now",
        +  "jamf-safe-internet",
        +  "jamf-insights",
        +  "jamf-rapididentity",
        +  "jamf-trust",
        +  "jamf-routines",
        +  "self-service-plus",
        +  "jamf-app-catalog",
        +  "jamf-account",
        +  "jamf-security-cloud",
        +  "elevate",
        +  "composer",
        +  "jamf-parent",
        +  "jamf-teacher",
        +  "jamf-setup-reset",
        +  "jamf-assessment",
        +  "title-editor",
        +  "jamf-infrastructure-manager",
        +  "jamf-adcs-connector",
        +  "jamf-pki-proxy",
        +  "jamf-migrate",
        +  "jamf-remote-assist",
        +  "jamf-cloud-distribution-service",
        +  "healthcare-listener"
        +]
    • Changedjamf_docs_list_products1 field changed
      • addedOutput schema / properties / publications
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "app": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "locales": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "portal": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "utility": {
        +        "type": "string"
        +      },
        +      "versions": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "title",
        +      "locales",
        +      "versions"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedjamf_docs_search8 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH"New value: +"Documentation language/locale (default: en-US). Options: en-US, ja-JP, zh-TW, de-DE, es-ES, fr-FR, nl-NL, th-TH, it-IT, pt-BR, zh-CN"
      • changedInput schema / properties / language / enum
        Previous value: -[
        -  "en-US",
        -  "ja-JP",
        -  "zh-TW",
        -  "de-DE",
        -  "es-ES",
        -  "fr-FR",
        -  "nl-NL",
        -  "th-TH"
        -]New value: +[
        +  "en-US",
        +  "ja-JP",
        +  "zh-TW",
        +  "de-DE",
        +  "es-ES",
        +  "fr-FR",
        +  "nl-NL",
        +  "th-TH",
        +  "it-IT",
        +  "pt-BR",
        +  "zh-CN"
        +]
      • changedInput schema / properties / product / description
        Previous value: -"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"New value: +"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog, jamf-account, jamf-security-cloud, elevate, composer, jamf-parent, jamf-teacher, jamf-setup-reset, jamf-assessment, title-editor, jamf-infrastructure-manager, jamf-adcs-connector, jamf-pki-proxy, jamf-migrate, jamf-remote-assist, jamf-cloud-distribution-service, healthcare-listener"
      • changedInput schema / properties / product / enum
        Previous value: -[
        -  "jamf-pro",
        -  "jamf-school",
        -  "jamf-connect",
        -  "jamf-protect",
        -  "jamf-now",
        -  "jamf-safe-internet",
        -  "jamf-insights",
        -  "jamf-rapididentity",
        -  "jamf-trust",
        -  "jamf-routines",
        -  "self-service-plus",
        -  "jamf-app-catalog"
        -]New value: +[
        +  "jamf-pro",
        +  "jamf-school",
        +  "jamf-connect",
        +  "jamf-protect",
        +  "jamf-now",
        +  "jamf-safe-internet",
        +  "jamf-insights",
        +  "jamf-rapididentity",
        +  "jamf-trust",
        +  "jamf-routines",
        +  "self-service-plus",
        +  "jamf-app-catalog",
        +  "jamf-account",
        +  "jamf-security-cloud",
        +  "elevate",
        +  "composer",
        +  "jamf-parent",
        +  "jamf-teacher",
        +  "jamf-setup-reset",
        +  "jamf-assessment",
        +  "title-editor",
        +  "jamf-infrastructure-manager",
        +  "jamf-adcs-connector",
        +  "jamf-pki-proxy",
        +  "jamf-migrate",
        +  "jamf-remote-assist",
        +  "jamf-cloud-distribution-service",
        +  "healthcare-listener"
        +]
      • changedInput schema / properties / version / description
        Previous value: -"Filter by version (e.g., \"11.5.0\", \"10.x\")"New value: +"Filter by version (e.g., \"11.13.0\") or \"current\""
      • addedInput schema / properties / version / pattern
        Added value: +"^(?:current|\\d+(?:\\.\\d+)*)$"
      • addedOutput schema / properties / otherSources
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "source": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "title",
        +      "url",
        +      "source"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / results / items / properties / otherVersions
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  5. 2 tool updatesv4.3.1
    • Changedjamf_docs_get_article3 fields changed
      • addedOutput schema / properties / contentLocale
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / navigation
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "childCount": {
        +      "type": "number"
        +    },
        +    "children": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "parent": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "title": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "title",
        +        "url"
        +      ],
        +      "type": "object"
        +    },
        +    "self": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "title": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "title",
        +        "url"
        +      ],
        +      "type": "object"
        +    },
        +    "siblingCount": {
        +      "type": "number"
        +    },
        +    "siblings": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "self",
        +    "siblings",
        +    "children",
        +    "siblingCount",
        +    "childCount"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / versionStatus
        Added value: +{
        +  "enum": [
        +    "latest",
        +    "superseded"
        +  ],
        +  "type": "string"
        +}
    • Changedjamf_docs_get_toc2 fields changed
      • addedOutput schema / properties / entries / items / properties / depth
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / entries / items / required
        Previous value: -[
        -  "title",
        -  "url"
        -]New value: +[
        +  "title",
        +  "url",
        +  "depth"
        +]
  6. 6 tool updatesv4.0.6
    • Changedjamf_docs_batch_get_articles2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjamf_docs_get_article5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / contentId / pattern
        Previous value: -"^[a-zA-Z0-9_~\\-]+$"New value: +"^[a-zA-Z0-9_~-]+$"
      • changedInput schema / properties / mapId / pattern
        Previous value: -"^[a-zA-Z0-9_~\\-]+$"New value: +"^[a-zA-Z0-9_~-]+$"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / tokenCount
        Added value: +{
        +  "type": "number"
        +}
    • Changedjamf_docs_get_toc8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / product / description
        Previous value: -"Product ID: jamf-pro, jamf-school, jamf-connect, jamf-protect"New value: +"Product ID: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / mapId
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / paginationNote
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / productId
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / versionNote
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "product",
        -  "version",
        -  "totalEntries",
        -  "page",
        -  "totalPages",
        -  "hasMore",
        -  "entries"
        -]New value: +[
        +  "product",
        +  "productId",
        +  "version",
        +  "totalEntries",
        +  "page",
        +  "totalPages",
        +  "hasMore",
        +  "entries"
        +]
    • Changedjamf_docs_glossary_lookup3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / product / description
        Previous value: -"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect"New value: +"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjamf_docs_list_products2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjamf_docs_search6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / product / description
        Previous value: -"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect"New value: +"Filter by product: jamf-pro, jamf-school, jamf-connect, jamf-protect, jamf-now, jamf-safe-internet, jamf-insights, jamf-rapididentity, jamf-trust, jamf-routines, self-service-plus, jamf-app-catalog"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / filters
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "docType": {
        +      "type": "string"
        +    },
        +    "language": {
        +      "type": "string"
        +    },
        +    "product": {
        +      "type": "string"
        +    },
        +    "topic": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / limit
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / paginationNote
        Added value: +{
        +  "type": "string"
        +}

TDQS

A4.6/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a distinct purpose: list_products for catalogs, search for discovery, get_toc for navigation, glossary_lookup for terms, get_article for single retrieval, and batch_get_articles for bulk retrieval. No overlapping functionality, and descriptions clarify boundaries.

Naming Consistency4/5

All tools share the jamf_docs_ prefix and snake_case, but the verb patterns vary slightly: most are verb_noun (list_products, get_toc, get_article), while search is a bare verb and glossary_lookup is noun_verb. Minor deviation, still readable.

Tool Count5/5

Six tools are well-scoped for a documentation server, covering discovery, search, navigation, retrieval, bulk retrieval, and glossary. Each tool earns its place, and the count is within the ideal 3–15 range.

Completeness5/5

The set covers the full documentation lifecycle: listing products/publications/topics/versions, searching with filters, browsing TOCs, looking up glossary terms, and retrieving single or multiple articles. No obvious gaps for the stated purpose.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides access to Apple's official developer documentation, frameworks, APIs, and WWDC session transcripts across all Apple platforms. It enables AI assistants to search technical guides, sample code, and platform compatibility information using natural language queries.
    18
    588 npm
    1,379
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to search and retrieve jam-nodes documentation, including node info, API references, and guides, via MCP tools without loading everything into context.
    5
    1
    MIT