jamf-platform-mcp-server
This server provides read-only access to a Jamf fleet via the Jamf Platform API Gateway, enabling AI assistants to query devices, groups, automation configurations, and dependencies safely.
Fleet Overview & Device Search
Get a one-call fleet summary: device counts by platform/OS, managed status, stale check-ins, group breakdown, and blueprint deployment states.
Find devices by serial, name, model, ID, or user (case-insensitive substring) across macOS and iOS/iPadOS.
List outdated devices below a given OS major version, with separate handling for unknown versions.
Device Groups
Search device groups (smart/static, computer/mobile) by name or description, returning IDs, member counts, and types.
List members of a specific group with resolved names, serials, platform, and last-seen time.
Inspect a group’s criteria in evaluation order, including member count and flags for common misinterpretations.
Declarative Device Management (DDM)
List all DDM blueprints for the tenant.
Report the DDM state for a single device: applied declarations, status, validity, and failure reasons.
Show all devices that have a given declaration, grouped by status and failure cause.
Automation & Configuration Analysis
Audit scripts, policies, and extension attributes for expensive commands (e.g.,
du,find,mdfind) and identify which policies trigger them.Review inventory collection settings by performance cost, flagging high-impact options like home directory size scanning.
Search smart group criteria, advanced search criteria, and display fields for a specific term to avoid breaking dependencies when changing a value.
Dependency & Reference Checks
Before modifying a package, computer group, or script, find all references (inclusions/exclusions) and coverage gaps.
Map smart computer group dependencies, detect cycles, identify missing groups, and compute the blast radius of changes to a given group.
API Passthrough
Make authenticated, read-only GET requests to any Jamf Platform API Gateway endpoint, including Jamf Pro and Classic APIs, with flexible path construction.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jamf-platform-mcp-serverShow me the fleet overview and device counts."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jamf-platform-mcp-server: MCP server for the Jamf Platform API Gateway
An MCP server that gives AI assistants read access to a Jamf fleet through the
Jamf Platform API Gateway, authenticating with OAuth 2.0 client credentials
rather than user-account tokens. That choice is the point of the project: scoped
machine credentials mean the permission boundary is enforced by Jamf, so a
read-only integration cannot mutate a fleet no matter what this code does. See
JPM-0001.
Canonical location: github.com/jackvaughanjr/jamf-platform-mcp-server.
Tier: Prototype — no production dependants, upstream API in public beta, minor versions may break.
The upstream API is a public beta. The Platform API Gateway has no published breaking-change protocol and no announced GA date. Pin dependencies and expect churn. One documented API group (Compliance Benchmarks) currently returns a gateway-side 500 (JPM-0006).
Provenance
This is an independent project, not a fork or a derivative. No shared git history, no upstream remote, and no copied code.
It is worth naming an influence, though: evaluating dbankscard/jamf-mcp-server (MIT) is what surfaced the compound-tool idea used here: answering a whole fleet question in one call rather than making a model loop over per-device requests. That is a design idea, freely reusable and not subject to any licence term, so this credit is courtesy rather than obligation and carries no requirement onward to anyone using this project. Reasoning: JPM-0002.
Related work worth knowing about:
Jamf-Concepts/mcp-hub — Jamf's own open-source MCP server (Python, Beta) for Jamf Pro, Protect and Security Cloud
developer.jamf.com/mcp— Jamf-hosted MCP server for documentation search, not tenant management
Related MCP server: KVMFleet MCP Server
Structure
src/
index.ts MCP server: tool registration, stdio transport
platform-client.ts every gateway concern — auth, token cache, URL shapes, paging
config.ts environment validation (zod)
fleet.ts pure fleet aggregation — no client, no clock, no I/O
automations.ts script/policy auditing, criteria projection, inventory cost
declaration-scope.ts pure DDM rollup: one declaration across many devices
references.ts pure reference analysis + smart-group dependency graph
*.test.ts unit tests (vitest)
decisions/ architectural decision records, JPM- prefix, immutable
docs/
capabilities.md what the server can answer, by question rather than endpoint
gateway-reference.md observed gateway behaviour: paths, status semantics, paging
endpoint-inventory.md documented endpoint surface, compiled from Jamf's llms.txt
fixtures/
shapes/ type-only response schemas — committed
raw/ captured responses — GITIGNORED, live fleet data
discovery-report.md empirical record of what resolves
scripts/
discover-gateway.sh resolves service segments, enumerates hosting, derives shapes
fetch-blueprints.sh standalone Blueprints smoke test
jamf cwd-independent wrapper: scripts/jamf <tool> ['<json>']
call-tool.mjs calls one MCP tool live; inherits env so `op run` works
check-adr-immutability.sh
.githooks/pre-commit rejects force-added ignored files; enforces ADR immutabilityCurrent state (as of 2026-08-07)
Working and confirmed against a live tenant:
segment | style | resource | notes |
| tenant |
|
|
| tenant |
| records keyed |
| tenant |
| full paging envelope; spans macOS and iOS |
| tenant |
| full envelope; exposes |
| tenant | 300+ resources | the Jamf Pro API in full |
| classic |
| Jamf Pro Classic — no version segment |
| tenant |
| Declaration Reporting |
| tenant |
| per-device declaration state; |
| tenant |
| the same state per declaration, across devices |
Compliance Benchmarks has a correct, documented path but returns 500
{"error":"Upstream host lookup failed"}. The gateway routes it and cannot reach
its own backend. A fault on Jamf's side, not something a client can work around.
An earlier revision of this file claimed Classic, Declaration Reporting and Compliance Benchmarks were simply not exposed. That was wrong; see JPM-0006, which supersedes JPM-0005 and explains how the error happened.
Tools: getFleetOverview, findDevices, findOutdatedDevices, findDeviceGroups,
getDeviceGroupMembers, findExpensiveAutomations, getInventoryCollectionSettings
and findCriteriaReferences (compound), listBlueprints and
getDeviceDeclarationState, getDeclarationScope, findObjectReferences and
findGroupDependencies and getComputerGroup (typed), and
platformRequest (authenticated GET-only passthrough to any gateway route). Tool
count stays deliberately small
(JPM-0003).
Pagination is confirmed live: a real page-1 request returned different records with
hasPrevious: true and totalPages: 13, so page is 0-based as assumed and query
parameters survive the passthrough.
device-actions remains unverified, because every route in it is a write and no
write scopes have been granted.
Setup
npm install # also points core.hooksPath at .githooks
cp .env.op.example .env.op # edit to match your 1Password vault/item
npm run buildCreate an integration in Jamf Account → Integrations. A read-only integration is sufficient and strongly preferred. The client secret is shown exactly once.
Variable | Required | Notes |
| yes | from the integration |
| yes | shown once at creation |
| yes | appears in every gateway path |
| no | defaults to |
| no | defaults to |
| no | defaults to |
Write posture
A read-only integration (above) is this project's supported configuration, not a starter mode to graduate from (JPM-0007). Scopes that can erase or unmanage a device are never granted to this server — not gated, not granted, in any configuration. That work belongs in Jamf Pro's own interface, where it is attributed to a named person and lands in Jamf's audit log.
JAMF_READ_ONLY above is a backstop, not the guarantee: it is on unless the value
is the literal string false, so a typo fails closed. The real boundary is what
the credential's scopes permit, which Jamf enforces, not this code. A fork that
grants write scopes is making that decision, and owns what follows from it.
platformRequest offers no method or body parameter, so the passthrough cannot
express a mutation at all, not even with write scopes granted. A passthrough write
is unreviewable in a way a typed tool's write is not, since method, path and body
would all be caller-composed with no schema constraining any of them. Any future
write is a named tool with a narrow schema, so the set of possible mutations stays
enumerable by reading src/index.ts.
Credentials are injected at runtime so the secret never lands on disk:
op run --env-file=.env.op -- npm run devRegister with Claude Code
claude mcp add jamf-platform -- node /absolute/path/to/dist/index.jsConventions
ISO dates (
YYYY-MM-DD) everywhere, including in dated snapshots above.ADRs are immutable once committed. Correct one by superseding it, never by editing. Enforced by
scripts/check-adr-immutability.shvia the pre-commit hook;ADR_ALLOW_EDIT=1covers the sanctioned exceptions. Prefix:JPM-.Decisions vs findings.
decisions/holds decisions and is immutable.docs/gateway-reference.mdholds observations about a beta API and is expected to change. Do not mix them.Never
git add -f. The ignore list is a data-handling boundary guarding the client secret and captured fleet data; a pre-commit hook enforces it.Never commit a captured API response. Only type-only shapes (JPM-0004).
Confirm routes empirically. A Jamf docs section is not evidence a route exists. The documentation has been wrong about this gateway four times, each retraction recorded in docs/gateway-reference.md.
Commit messages explain why, and state explicitly when they retract an earlier conclusion. Descriptive imperative subjects; not Conventional Commits, which is why there is no badge claiming otherwise.
Versioning
SemVer 2.0.0. package.json is the single
source of the version. Changes are recorded in
CHANGELOG.md per Keep a Changelog.
Releases are tagged vX.Y.Z.
While the gateway remains in public beta, minor versions may carry breaking changes, because the upstream contract offers no stability guarantee, so strict SemVer against it would be a false promise.
Testing
npm test # vitest, 297 tests
npm run typecheck
DRY_RUN=1 ./scripts/discover-gateway.sh # probe matrix, no credentials neededTo exercise a tool against a live tenant, from any directory:
scripts/jamf tools/list
scripts/jamf getFleetOverview
scripts/jamf findDevices '{"query":"MacBook"}'scripts/jamf wraps op run with an absolute --env-file path, because op
resolves that against the caller's cwd and fails with a bare "open .env.op: no such
file or directory" otherwise. It also unsets OP_SERVICE_ACCOUNT_TOKEN, which the
committed .envrc handles inside the repo but cannot outside it, and resolves
symlinks so it can be linked onto PATH for a shorter handle:
ln -s "$PWD/scripts/jamf" ~/.local/bin/jamf-mcp
jamf-mcp getFleetOverviewNot npm run inspector under op run. The MCP Inspector spawns the server as
a child process without forwarding the parent environment, so injected credentials
never reach it and the server exits on config validation. Its -e flag would work
but puts the client secret on a command line where ps can read it.
scripts/call-tool.mjs spawns the server with the environment inherited, so
credentials go straight to the process that needs them. Its output can contain live
fleet data, so redirect to a gitignored path if you keep it.
Tests never reach the gateway: fetch is stubbed per test and credentials are
fixtures. The suite is mutation-checked rather than assumed useful: each of these
deliberate breakages causes failures: removing the totalCount pagination
fallback, making paging 1-based, disabling the read-only guard, misclassifying
iPads as Macs, treating an unparseable timestamp as a recent check-in, letting an
empty search query match every device, and counting an absent managed flag as
unmanaged.
The contribution contract
CONTRIBUTING.md is written as a contract, separating what a guard will stop you doing from what a human reviews. Three rules are mechanically enforced by a pre-commit hook and by CI:
Rule | Enforced by |
No live identifiers in tracked files — including test fixtures |
|
No captured API responses committed; never |
|
Committed ADRs are immutable — supersede, never edit |
|
src/conventions.test.ts additionally asserts the conventions that drifted during
early development: the test-count badge matches reality, ADR numbering is sequential
and fully indexed, every superseded record names its successor, and the README does
not cite a superseded ADR as guidance.
Test UUIDs use the reserved deadbeef- prefix, so an identifier copied out of live
output is visible rather than plausible. That rule exists because a real device id
reached a test file exactly that way.
Pull request and review policy
Single maintainer at present, so changes land directly on main. On a second
contributor: branch protection on main, one non-author approval, and
decisions/ changes reviewed by someone other than the author.
Every change should pass npm test, npm run typecheck, and npm run build.
Anything touching src/platform-client.ts should also be exercised against a live
tenant, since no test can confirm the gateway's actual behaviour.
Cross-reference
CONTRIBUTING.md — setup, enforced rules, how to add an endpoint
CLAUDE.md — working rules for AI assistants in this repo
decisions/ — why the project is built this way
docs/gateway-reference.md — observed gateway behaviour
docs/capabilities.md — what the server can answer, and what it cannot
docs/endpoint-inventory.md — documented endpoint surface
fixtures/discovery-report.md — empirical results
License
MIT — see LICENSE.
Available Tools
15 toolsfindCriteriaReferencesFind criteria referencesA
Search smart computer group criteria, advanced computer search criteria, and advanced search display fields for a term — e.g. "Home Directory" to find out whether anything consumes that inventory field before disabling its collection. Matches field names and criterion values, case-insensitively. Reports what it did NOT check, because "no references found" is a weaker claim than a hit.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Term to look for in criterion names, criterion values and display fields | |
| concurrency | No | Parallel detail requests. Defaults to 6. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses case-insensitive matching and that it reports what it did NOT check, setting correct expectations about the strength of a negative result. This is meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it searches, an example and use case, and a caveat about the meaning of 'no references found'. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers search scope, use case, matching behavior, and a limitation. There is no output schema, and the description doesn't specify the exact return format, but it provides enough context for an agent to understand what the tool does and when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a small amount of meaning by clarifying that query matches field names and criterion values, but it does not add detail about the concurrency parameter beyond its default and range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Search smart computer group criteria, advanced computer search criteria, and advanced search display fields for a term.' It also includes an example ('Home Directory') and clearly distinguishes the tool from sibling findObjectReferences by scoping to computer group criteria and display fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete use case ('to find out whether anything consumes that inventory field before disabling its collection') and explains when the result is weaker ('no references found' is weaker than a hit). It implies when to use the tool without explicitly naming alternatives, but the context is strong enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findDeviceGroupsFind device groupsA
Search device groups by name or description (case-insensitive substring), returning id, member count, deviceType and groupType. Covers both computer and mobile groups, smart and static, since the gateway returns them in one list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches. Defaults to 50. | |
| query | Yes | Substring to match against group name or description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses several behavioral traits beyond the schema: case-insensitive substring matching, return fields, and the fact that both group types come from a single gateway list. No annotations exist, so the description carries this burden; while it omits pagination details, those are covered in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long and front-loaded with the core action and return fields. Every sentence contributes value, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with rich schema coverage, the description fully covers purpose, scope, matching behavior, and return values. Without an output schema, specifying the returned fields is necessary and handled. The limit behavior is already documented in the schema, so no gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds the case-insensitive detail, but most parameter semantics (query substring, limit default and max) are already in the schema, so no substantial additional meaning is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Search device groups by name or description') and specifies the return fields. It distinguishes itself from sibling tools like getComputerGroup and findDevices by focusing on substring search across group metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by noting it covers both computer and mobile groups, smart and static, which implies a broad search use case. However, it does not explicitly mention alternatives or when not to use, but the scope statement effectively guides selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findDevicesFind devicesA
Search the fleet by serial number, device name, model, device id, or user id (case-insensitive substring). Spans macOS and iOS/iPadOS. Paginates the full device list and filters client-side, because the gateway has no confirmed server-side filter.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches to return. Defaults to 25. | |
| query | Yes | Substring to match against serial, name, model, id or user |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly discloses the client-side filtering implementation, pagination behavior, case-insensitive substring matching, and platform coverage (macOS and iOS/iPadOS). This goes well beyond the schema and gives agents critical insight into how the tool operates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The first sentence states the core purpose and searchable fields, while the second adds essential implementation context about pagination and platform coverage. Every clause contributes meaning, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with two parameters, no output schema, and no annotations, the description provides all necessary context: what it searches, how matching works (case-insensitive substring), what platforms it covers, and its implementation behavior (client-side filtering). No critical information appears missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters with descriptive text (100% coverage), so the baseline is 3. The description adds value by clarifying that 'serial' means serial number, 'id' means device id, 'user' means user id, and by stating the matching is case-insensitive—details not fully present in the schema. This enhances understanding beyond the structured definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches the fleet by specific fields (serial number, device name, model, device id, or user id) with case-insensitive substring matching. This specific verb+resource combination distinguishes it from sibling find tools that target different resources, such as findOutdatedDevices or findDeviceGroups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that it paginates and filters client-side due to no confirmed server-side filter, which implies performance considerations but does not explicitly state when to use this tool versus alternatives. No exclusions or alternative tool references are provided, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findExpensiveAutomationsFind expensive automationsA
Audit Jamf scripts, computer extension attributes and policies for commands that burn CPU or battery when run repeatedly (du, find /, mdfind, system_profiler and similar), and report which policies run them and how often. Extension attributes are called out separately because they execute at EVERY inventory collection. Answers "what is cooking this laptop's battery". Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| concurrency | No | Parallel detail requests. Defaults to 6. | |
| maxItemsPerKind | No | Cap detail fetches per kind (scripts / EAs / policies). Defaults to 500. | |
| includeDisabledPolicies | No | Include policies that are disabled. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explicitly states 'Read-only' and explains the tool's logic, including why extension attributes are highlighted (they execute at every inventory collection). It does not mention rate limits or output format, but the core safety and operational traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and well-structured. It opens with the main audit action, provides concrete examples of problematic commands, highlights a key distinction (EAs), and ends with a memorable, useful use-case phrase. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description appropriately explains what the tool reports (which policies run the expensive commands and how often). It covers the core scope and the EA caveat. Minor gaps include not specifying the exact output format or behavior when no results are found, but overall it's sufficient for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with descriptions for all three parameters, so the baseline is 3. The description adds no further parameter-specific meaning beyond naming the resource kinds, but it doesn't need to since the schema is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Audit'), the target resources (Jamf scripts, extension attributes, policies), the specific behavior (identifying CPU/battery-heavy commands), and the output (report which policies run them and how often). It distinguishes itself from sibling find/list tools by focusing on an audit of expensive automations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case ('Answers "what is cooking this laptop's battery"') and context for when to use the tool, but it does not explicitly mention alternatives or exclusions. It's clear this is a specialized audit tool rather than a general lookup, which is sufficient for usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findGroupDependenciesFind smart group dependenciesA
Map which computer groups depend on which others, via "Computer Group" membership criteria. Reports dependency cycles as their actual node paths, references to group names that do not exist, and — given a group — its blast radius: everything that transitively changes when that group's membership changes, with depth. A "not member of" criterion is reported distinctly from "member of", since treating one as the other inverts the meaning. Groups whose detail could not be fetched are named, because a group absent from the graph must not read as independent.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Optional: a group name to compute a blast radius for. Omit for the whole graph. | |
| concurrency | No | Parallel detail requests. Defaults to 6. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers richly: it discloses that cycles are reported as node paths, missing group references are surfaced, blast radius is transitive with depth, 'not member of' is treated distinctly, and unfetched groups are named to avoid implying independence. This goes far beyond a generic mapping description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence adds unique value, covering purpose, outputs, edge cases, and failure behavior. It is front-loaded with the core purpose and then layers nuance. No fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a graph analysis tool with no output schema, the description covers return types (cycles, missing refs, blast radius, distinct criterion types), error cases (unfetched groups), and parameter semantics. It leaves no obvious gap for an agent to misuse or under-trust the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds semantic depth by explaining 'blast radius' (transitive changes with depth), which elaborates on the 'group' parameter's purpose. The 'concurrency' parameter is self-explanatory with its default, and the description doesn't repeat it but complements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Map which computer groups depend on which others, via Computer Group membership criteria.' It clearly distinguishes this from sibling tools like getComputerGroup or findDeviceGroups by focusing on dependency mapping rather than listing or retrieving individual groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it maps dependencies, reports cycles, missing references, and blast radius given a group. It doesn't explicitly name alternatives or exclusions, but its specialized purpose makes it evident when to use it. The 'given a group' clause signals an optional input pattern, and 'Omit for the whole graph' in the schema further clarifies usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findObjectReferencesFind what references an objectA
Find everything that references a package, computer group or script — the check to run before deleting or changing one. Reports where each reference sits (scope, exclusion, script slot, group criterion) and distinguishes an EXCLUSION from an inclusion, since those mean opposite things. Names are matched exactly and case-insensitively, never as substrings. Critically, it reports which source kinds it could NOT check and what that means: a "clear" verdict requires full coverage, so most answers are partial-clear and must not be read as permission to delete. Coverage is in the strength field.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The object id. Supply this, or name, or both. | |
| kind | Yes | What kind of object to look for references to | |
| name | No | The object name, matched exactly (case-insensitively) | |
| concurrency | No | Parallel detail requests. Defaults to 6. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses exact matching rules (case-insensitive, not substrings), distinguishes exclusions from inclusions, and critically explains the coverage limitation and the meaning of the `strength` field. This is exceptional behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: purpose, reported locations, exclusion distinction, matching rules, coverage caveat, and strength field. It is front-loaded with the main action and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and 4 parameters, the description covers the critical aspects: what it returns (locations), key limitations (partial coverage), and the strength field. It could be more explicit about the overall output structure, but it is adequate for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reiterates the name matching behavior already present in the schema but adds no new parameter-specific semantics. It does mention `strength` as an output field, not a parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb 'Find' and resource types (package, computer group, script), and clearly frames the tool as a pre-deletion/changing check. This distinguishes it from sibling search tools like findCriteriaReferences or findGroupDependencies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this is 'the check to run before deleting or changing one' and warns that partial-clear results must not be read as permission to delete. It provides a clear when-to-use and a when-not-to-trust, but does not name alternative tools explicitly, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findOutdatedDevicesFind outdated devicesA
List devices whose OS major version is below a threshold, oldest first, with the freshest activity timestamp for each. Devices whose version is missing or unparseable are returned separately, because "unknown version" is a different finding from "old version". Spans macOS and iOS/iPadOS/tvOS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max devices per list. Defaults to 50. | |
| belowMajor | Yes | Report devices whose OS major version is below this (e.g. 26 to find pre-26) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full weight. It discloses ordering ('oldest first'), output detail ('freshest activity timestamp for each'), the separate grouping of missing/unparseable versions with rationale, and platform coverage. This gives the agent a clear behavioral model beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste. Each sentence adds distinct value: the core action with ordering, the special handling of unknown versions, and the platform scope. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has only two parameters, no output schema, and no annotations. The description covers the essential behavior (listing, ordering, grouping, platforms) sufficiently for an agent to understand what the tool returns and when to use it. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well-documented. The description adds context about the threshold behavior and unknown versions, but does not significantly enhance parameter meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List devices whose OS major version is below a threshold' with a specific verb and resource. It also distinguishes from siblings by mentioning 'Spans macOS and iOS/iPadOS/tvOS' and the separate handling of unknown versions, which sets it apart from generic device listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (identifying outdated devices by OS version threshold) and implies a comparison with generic device finders. It does not explicitly name alternatives or provide exclusions, but the specificity of the use case is sufficient for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getComputerGroupGet computer groupA
Read a computer group's criteria in evaluation order, with parentheses and and/or joins preserved, plus a member count. Flags criteria that will not do what they appear to: an unanchored "matches regex" tests whether a value CONTAINS a match rather than equals one, which turns "has failures" into "is not blank". Accepts a group id or a name substring; an ambiguous name returns candidates. Members are NOT included unless asked for, since the roster carries serials and MAC addresses and is rarely the question.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group id, or a substring of the group name | |
| memberLimit | No | Cap on members returned when includeMembers is true. Defaults to 200. | |
| includeMembers | No | Include the member list. Defaults to false; a count is always returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains evaluation order, parentheses/join preservation, the member count, the ambiguous-name candidate fallback, and the subtle regex containment trap, all of which are non-obvious behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of four dense sentences, each providing unique information: core function, a critical caveat, input resolution behavior, and member inclusion policy. It is front-loaded with the main purpose, and every clause earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (criteria evaluation) and the lack of an output schema, the description covers input interpretation, output composition, and edge cases (ambiguous names, regex semantics). It could explicitly mention the return format, but the essential information needed to use the tool effectively is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema descriptors already cover all three parameters, the description adds semantic meaning: 'Accepts a group id or a name substring' clarifies the group input, and 'Members are NOT included unless asked for' plus 'a count is always returned' enriches understanding of includeMembers and the output. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as 'Read a computer group's criteria' with specific details like 'in evaluation order' and 'plus a member count'. This distinguishes it from sibling tools like getDeviceGroupMembers, which presumably return member lists, and findDeviceGroups, which finds groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on how to use the group parameter ('id or name substring') and clarifies the default behavior for members ('Members are NOT included unless asked for'). Though it doesn't explicitly name alternative tools or when-not-to-use, the scope is well defined, and it implies that members are rarely the question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getDeclarationScopeGet declaration scopeA
Report every device reporting a given DDM declaration, with its status, validity and — for failures — the reasons Jamf gives, grouped so one cause affecting forty Macs reads as one problem rather than forty. Devices are resolved to names and serials, since the API returns bare UUIDs. The inverse of getDeviceDeclarationState. NOTE: Jamf excludes PENDING declarations from any filtered read and a filter is required, so devices still awaiting delivery are invisible — an all-healthy answer is NOT proof of full deployment. See excludedFromThisAnswer in the result.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | RSQL filter. Jamf requires one, so this defaults to "active==true,active==false" — an OR across both boolean values, which is the nearest thing to a match-all this route has. Do NOT use a wildcard like "deviceId==*": wildcards are supported only on declarationIdentifier, which is not filterable here, so that matches nothing and still returns 200. Allowed fields on THIS route: deviceId, channel, lastReportTime, active, validityState, declarationType, dateUpdated. Note declarationIdentifier is NOT among them — it lives in the path here, unlike on getDeviceDeclarationState. | |
| declaration | Yes | The declarationIdentifier, e.g. "Blueprint_FileVault". Exact, not a substring. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully discloses key behaviors: grouping of failures, device name/serial resolution, the PENDING exclusion limitation, the wildcard pitfall, and the existence of excludedFromThisAnswer in results. This is exceptionally transparent for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main description is four sentences, each with a distinct purpose: function, output enrichment, sibling relationship, and critical limitation. The parameter descriptions are detailed but relevant, and the overall structure is front-loaded with purpose. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by mentioning status, validity, reasons, grouping, and excludedFromThisAnswer. It covers the tool's purpose and main edge cases. It could optionally specify whether results are paginated or the exact response shape, but for a tool with simple parameters, the coverage is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond the schema: it explains the filter's default value, allowed fields, the wildcard trap, and clarifies that declaration is exact and not a substring. These details help avoid misuse and go far beyond basic type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports every device for a given DDM declaration, including status, validity, and grouped failure reasons. It explicitly differentiates from the sibling tool by saying 'The inverse of getDeviceDeclarationState', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit alternatives (the inverse statement), when-not-to-use guidance (PENDING declarations are excluded, so an all-healthy answer is not proof of full deployment), and required prerequisites (filter is required). This gives clear context for when to rely on the tool and when to be cautious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getDeviceDeclarationStateGet device declaration stateA
Report the declarative device management (DDM) state for one device: which declarations are applied, their status and validity, and — for anything that failed — the reasons Jamf gives. The companion to listBlueprints, since a Blueprint deploys declarations and this says whether they landed. Accepts a device UUID, or a substring of a name, serial, model or user; an ambiguous substring returns candidates rather than guessing. NOTE: Jamf excludes PENDING declarations from any filtered read, so a device mid-deployment will look emptier than it is — see excludedFromThisAnswer in the result.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | Device UUID, or a substring of the device name, serial, model or user id | |
| filter | No | RSQL filter. Jamf requires one, so this defaults to "declarationIdentifier==*" (match all). Filter fields: declarationIdentifier, active, declarationType, validityState, dateUpdated, channel. Wildcards on declarationIdentifier are case-insensitive, e.g. "declarationIdentifier==Blueprint_*". | |
| includeChannels | No | Also list the device's available DDM channels. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral transparency burden. It discloses crucial behaviors: ambiguous substrings return candidates rather than guessing, and PENDING declarations are excluded from filtered reads, with a pointer to 'excludedFromThisAnswer' in the result. This goes well beyond basic expectations and gives the agent a clear picture of edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph, but each sentence is informative and earns its place. It front-loads the core purpose, then adds relational context and a critical caveat. It is not overly verbose, though it could be slightly more concise without losing meaning. Overall, it is well-structured and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description should explain return values, and it does so reasonably by mentioning 'status and validity', 'reasons Jamf gives', 'candidates', and 'excludedFromThisAnswer'. It also covers important edge cases like PENDING exclusions. While it does not enumerate every return field, it provides enough context for an agent to understand what to expect and how to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of parameter descriptions, so the baseline is 3. The description adds value by explaining that an ambiguous device substring returns candidates rather than guessing, which is not in the schema. It also gives a note about PENDING declarations that relates to the filter's default behavior. This additional semantic context elevates the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Report the declarative device management (DDM) state for one device: which declarations are applied, their status and validity, and — for anything that failed — the reasons Jamf gives.' This is a specific verb+resource combination. It also distinguishes itself from siblings by describing itself as 'The companion to listBlueprints', clarifying its unique role relative to a related tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions the tool as 'The companion to listBlueprints', giving clear relational guidance on when to use it. It also explains the input behavior (substring may return candidates) and warns about PENDING declarations being excluded, helping the agent decide when this tool is appropriate. However, it lacks explicit 'when not to use' exclusions or comparisons to other related tools like getDeclarationScope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getDeviceGroupMembersGet device group membersA
List the devices in a device group, resolved to names, serials, platform and last-seen time. Accepts a group UUID or a name substring; an ambiguous name returns the candidate groups rather than guessing. Member ids with no matching device are reported separately, since a membership pointing at an absent device is itself worth knowing.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group UUID, or a substring of the group name | |
| limit | No | Max members to return. Defaults to 200. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well. It discloses the resolved output fields, the ambiguous-name behavior (returns candidates instead of guessing), and the separate reporting of member IDs with no matching device. These are valuable behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, with the main action stated first and important edge cases packed into the following sentences. Every sentence adds value, no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only 2 parameters and no output schema, the description provides sufficient context: it describes what is returned (resolved fields) and how missing members are handled. The ambiguous name behavior is also disclosed, making the tool's behavior predictable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters, so baseline is 3. The description adds meaning beyond the schema by explaining the ambiguous name behavior for the group parameter, which tells the agent what happens if the name is not unique. This enriches the semantic understanding without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: listing devices in a device group with resolved attributes (names, serials, platform, last-seen time). The verb 'List' is specific, and the resource 'devices in a device group' distinguishes it from related tools like findDeviceGroups or findDevices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it accepts a group UUID or name substring and handles ambiguous names by returning candidate groups. However, it does not explicitly state when to prefer this over sibling tools like getComputerGroup or findDevices, nor provides exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getFleetOverviewFleet overviewA
One-call fleet summary: device counts by platform and OS major, managed vs unmanaged, stale check-ins, device-group breakdown, and blueprint deployment states. Fetches devices, device groups and blueprints concurrently. NOTE the device total spans macOS AND iOS/iPadOS — it is not a Mac count. Sections that fail are reported individually rather than failing the whole call.
| Name | Required | Description | Default |
|---|---|---|---|
| topGroups | No | How many largest device groups to list. Defaults to 10. The biggest groups are usually catch-alls holding the entire fleet, so check saturation.largestIsSaturated and raise this to see differentiating groups. | |
| staleThresholdDays | No | Days without any reported activity before a device counts as stale. Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and provides valuable behavioral details: it fetches devices, groups, and blueprints concurrently; notes the device total includes both macOS and iOS/iPadOS (not just Macs); and states that partial failures are reported individually. These go beyond the name and help set expectations, though it omits auth/rate-limit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main summary, and every clause adds value: the caveat about device totals prevents misinterpretation, and the failure-mode note clarifies behavior. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only aggregation tool with no output schema, the description covers what data is returned, how it behaves (concurrent fetching), and important caveats (cross-platform total, partial failures). It does not describe return formatting or default values, but those are partially in the schema, and the complexity is well addressed for an overview tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with detailed descriptions for both parameters (topGroups and staleThresholdDays). The description adds only indirect hints (e.g., 'stale check-ins' relates to staleThresholdDays) but does not need to compensate given the schema's thoroughness. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as a 'one-call fleet summary' and enumerates specific data it provides (device counts by platform/OS, managed status, stale check-ins, device-group breakdown, blueprint states). It distinguishes itself from sibling tools like findDevices or listBlueprints by positioning it as an aggregated overview rather than a raw listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one-call fleet summary' implies using this tool when you need a broad overview instead of making multiple find/list calls. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getInventoryCollectionSettingsInventory collection settingsA
Read the tenant computer inventory collection settings and rate each option by how much work it adds per collection. Flags home_directory_sizes as high cost because Jamf computes it by running du across every user home directory — the usual cause of a du process under JamfDaemon burning battery. Pair with findExpensiveAutomations, which shows how often inventory is actually triggered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explains that the tool rates options by cost, specifically flags home_directory_sizes as high cost, and details why (running du across all user home directories, leading to battery drain). This is rich behavioral context beyond just 'read settings'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, cost explanation, and pairing recommendation. The description is front-loaded with the core action and then adds valuable context without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description fully covers what the tool does, why it matters (cost analysis and battery impact), and how to use it alongside another tool. Nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema fully covers the input. The baseline is 4 for no-parameter tools, and the description doesn't need to add parameter semantics. It doesn't, but that's acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read the tenant computer inventory collection settings') and the unique output ('rate each option by how much work it adds per collection'). It also distinguishes itself by naming a complementary sibling tool (findExpensiveAutomations), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance by recommending pairing with findExpensiveAutomations to see how often inventory is triggered. It also gives a concrete example of when this tool is useful (diagnosing a du process under JamfDaemon), helping the agent decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listBlueprintsList blueprintsA
List Blueprints for the configured tenant. Requires the read:pro:blueprints scope — note the scope prefix is "pro" while the URL service segment is "blueprints".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It explicitly states the required auth scope (read:pro:blueprints) and clarifies a common confusion about the scope prefix vs. URL segment, adding useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The main action is front-loaded, and the scope clarification is concise and relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with no parameters and no output schema, the description covers the essential context: the resource, tenant, and required permission. It could optionally mention return format, but this is not critical for such a straightforward tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so no parameter-specific description is needed. The schema is empty and description provides no parameter details, but the baseline for zero params is 4, and this description does not attempt to compensate for undocumented params because none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Blueprints for the configured tenant, using a specific verb and resource. It does not explicitly distinguish itself from sibling tools like findDevices or getFleetOverview, but the resource name is unique enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context about the tenant and required scope but offers no guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites beyond the scope requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
platformRequestJamf Platform API requestA
Make an authenticated request against any Jamf Platform API Gateway endpoint. The gateway also fronts the Jamf Pro API (300+ endpoints) and Jamf Pro Classic API (500+), so this reaches essentially the whole Jamf surface. Shapes: style "tenant" (default) builds /{version}/tenant/{tenantId}/{resource}; style "flat" omits the tenant segment and has never returned 200; rawPath is used verbatim after /api/{service}. For Classic use service "proclassic" with style "classic", which builds /tenant/{tenantId}/{resource} — no version segment, tenant filled in automatically, and no /JSSResource/ prefix, which does not exist on the gateway. The service segment may be more than one segment: Declaration Reporting is "ddm/report". Jamf Pro versions are per-resource (account-groups v1, enrollment v3, computers-inventory v4) — do not assume v1. READ-ONLY BY DESIGN: this tool issues GET and nothing else, and offers no method or body parameter. Writes go through named typed tools with narrow schemas, never through the passthrough, because a passthrough write is unreviewable — method, path and body would all be composed by the caller with nothing to constrain them. See JPM-0007.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Query string parameters | |
| style | No | Path layout; defaults to "tenant". Use "classic" for Jamf Pro Classic — it builds /tenant/{tenantId}/{resource} with no version segment and fills the tenant in for you, so prefer it over rawPath, which requires you to know the tenant id. | |
| rawPath | No | Path after /api/{service}, used verbatim. Required for Classic, where it is "/tenant/{tenantId}/{resource}" — e.g. "/tenant/{tenantId}/scripts". Nothing is inserted, so the tenant segment must be included; a path without it answers 400. | |
| service | Yes | Gateway service segment, e.g. "blueprints", "devices" | |
| version | No | Version segment, defaults to "v1". Per-resource on Jamf Pro. | |
| resource | No | Resource path, e.g. "blueprints". Omit if using rawPath. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It explicitly states the tool is GET-only and has no method or body parameter, discloses that 'flat' style has never returned 200, explains that rawPath requires the tenant segment or returns 400, and notes that Jamf Pro versions are per-resource. This goes far beyond basic safety annotation coverage, providing critical operational expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, scope, path construction, versioning, and design rationale. It is front-loaded with the core purpose and read-only guarantee, then progressively details layout options. The length is justified by the tool's generic nature, which requires extensive clarification to be used safely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a generic passthrough with multiple path styles, no output schema, and no annotations), the description is exceptionally complete. It covers all key behavioral aspects, path construction, versioning, service segments, and provides strong guidance on when to avoid it. The rationale for why writes are excluded (unreviewable) adds crucial context for safe usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema. It clarifies the 'tenant' default, explains that 'classic' fills the tenant automatically and omits the version segment, details rawPath verbatim behavior, and notes service can be multi-segment (e.g., 'ddm/report'). This transforms the parameter descriptions from raw definitions into actionable usage rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it makes authenticated GET requests against any Jamf Platform API Gateway endpoint, covering both Jamf Pro and Classic APIs. It explicitly distinguishes itself from the typed sibling tools by emphasizing that writes go through named typed tools, not this passthrough. The READ-ONLY BY DESIGN statement and mention of 300+/500+ endpoints make the tool's purpose and scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool (for any GET request against the gateway, including endpoints not covered by typed siblings) and when not to (writes must use named typed tools). It also offers detailed usage instructions for path styles (tenant vs. classic vs. flat), rawPath requirements, service segment composition, and version selection, making it clear how to choose alternatives like style 'classic' over rawPath. The reference to JPM-0007 suggests additional context.
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.
15 tool updates
v0.2.1- First observed
findCriteriaReferences - First observed
findDeviceGroups - First observed
findDevices - First observed
findExpensiveAutomations - First observed
findGroupDependencies - First observed
findObjectReferences - First observed
findOutdatedDevices - First observed
getComputerGroup - First observed
getDeclarationScope - First observed
getDeviceDeclarationState - First observed
getDeviceGroupMembers - First observed
getFleetOverview - First observed
getInventoryCollectionSettings - First observed
listBlueprints - First observed
platformRequest
TDQS
Scored across 15 tools
Each tool targets a distinct resource and action: device search, group search, DDM state, scope, references, dependencies, etc. Even the two declaration tools are clear inverses, and the passthrough is explicitly read-only, so there is no ambiguity about which tool to select.
Tool names are consistently camelCase and mostly follow a verb+noun pattern, but the verbs vary (list, get, find) and one tool (platformRequest) breaks the pattern. This is a minor deviation, not chaotic, and the meaning of each verb is reasonably intuitive.
15 tools is well-scoped for a broad platform server. Each tool covers a meaningful slice of the Jamf surface, and the count feels neither thin nor bloated.
The server is read-only by design — there are no create, update, or delete tools, and the generic passthrough explicitly refuses writes. This leaves a critical gap for a management platform: agents can inspect the entire fleet but cannot perform any management action, which will cause failures for any workflow requiring a change.
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
- gatewayOAuthai.sealgate
MCP gateway with runtime security policy, tool-call-level control, and audit of agent actions.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
Related MCP Servers
- FlicenseAqualityCmaintenanceAn MCP server that connects AI assistants to the NinjaOne remote monitoring and management platform via the REST API v2. It provides tools for device inventory, organization management, alert handling, maintenance scheduling, and automated job execution.221-

KVMFleet MCP Serverofficial
AlicenseAqualityDmaintenanceRead-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.59 npm1MIT- AlicenseNot gradedqualityBmaintenanceAn async MCP server for Jamf Pro integration, providing AI assistants with tools for computer health analysis, inventory management, and policy monitoring.8Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server for managing devices via JAMF Pro and Microsoft Intune APIs, enabling AI assistants to query and control device management tasks.MIT