jumpcloud-mcp
MCP server for JumpCloud APIs with full OpenAPI-driven coverage, enabling endpoint discovery, operation invocation, and direct API requests while managing multi-tenant user tokens in Vault and guarding mutating tools.
README
jumpcloud-mcp
MCP server for JumpCloud APIs with:
- Full API surface access through JumpCloud OpenAPI specs
- Multi-tenant and multi-user token management persisted in Vault
- Non-secret runtime configuration persisted in Postgres
- Mutating-tool guard using
MCP_ADMIN_AUTH_KEY - Stdio and HTTP transports
Solution Summary
This repository is adapted from skeleton-mcp into a JumpCloud-specific implementation.
Key design requirements implemented:
- Secrets are persisted in Vault only.
- Configuration is persisted in Postgres only.
- User tokens are scoped by tenant and user (
app/tenants/:tenantId/users/:userId/jumpcloud/tokens). - Tenant/user policy guardrails can restrict allowed domains, methods, paths, and mutating operationIds.
- Mutation tools can require
authorizationKeywhenMCP_ADMIN_AUTH_KEYis configured. - Full JumpCloud API coverage is supported via OpenAPI-driven discovery and execution.
JumpCloud Coverage Model
jumpcloud-mcp supports complete endpoint coverage by loading these OpenAPI specs at runtime:
- Console API:
https://docs.jumpcloud.com/new/console/index.yaml - Directory Insights API:
https://docs.jumpcloud.com/new/api/insights/directory/index.yaml
Coverage is exposed by:
jumpcloud_openapi_discoveryfor endpoint/operation discoveryjumpcloud_operation_invokefor operationId-driven executionjumpcloud_api_requestfor explicit method/path execution
Endpoint Inventory Artifact
This repository can generate a deterministic endpoint inventory artifact for diffing API coverage changes:
- JSON inventory:
docs/openapi-endpoint-inventory.json - Markdown summary:
docs/openapi-endpoint-inventory.md
Commands:
npm run inventory:generate
npm run inventory:check
inventory:check regenerates the artifact and fails if committed files are out of date.
CI workflow:
.github/workflows/openapi-inventory-check.ymlrunsnpm run inventory:checkon push and pull requests.
Architecture
Runtime flow:
src/index.jsstarts stdio MCP mode.src/http/index.jsstarts HTTP MCP mode.src/config/env.jsvalidates runtime configuration.src/services/vault.jsmanages persistent secrets.src/services/configStore.jsmanages persistent config in Postgres.src/services/targetService.jsloads OpenAPI and executes JumpCloud calls.src/mcp/server.jsregisters tools, auth checks, and responses.
Persistence model:
- Secrets: Vault KV (
secret/data/<app>/tenants/<tenant>/users/<user>/jumpcloud/tokens) - Config: Postgres table (
<app>_config) scoped by composite scope id (tenantId/userIdstored inuser_id)
Setup
- Install dependencies:
npm install
- Copy and edit environment:
cp .env.example .env
- Start local infra:
docker compose up -d postgres vault
- Start server:
npm run start:stdio
# or
npm run start:http
External Services Mode
Use docker-compose.external.yml when Vault and Postgres are managed externally.
Required env vars in this mode include:
POSTGRES_HOSTVAULT_ADDR
Start app-only stack:
docker compose -f docker-compose.external.yml up -d
MCP Tool Catalog
All tools return JSON in text content with shape:
{
"ok": true,
"status": 200,
"data": {}
}
Errors return isError=true and shape:
{
"ok": false,
"status": 401,
"error": "Unauthorized: invalid authorizationKey for mutating API request"
}
jumpcloud_query_suggestion
- Use when: you need planning guidance, schema guidance, and recommended tool sequence.
- Do not use when: you already know the exact tool and operation.
- Access type: read-only.
- Risk: low.
- Required permissions: none.
- Environment behavior: reads active OpenAPI operation metadata from loaded specs.
- Parameters:
intentstring optionaldomainenum optional:console|directory-insightsmethodstring optionalpathstring optionalincludeToolSchemasboolean optional
- Response shape:
data.summarydata.recommendedOrderdata.suggestedOperationsdata.safetyChecksdata.toolSchemas(unless disabled)
- Common failures: OpenAPI fetch/parse errors.
- Recommended prereq:
jumpcloud_connection_info. - Follow-up tools:
jumpcloud_openapi_discovery,jumpcloud_operation_invoke,jumpcloud_api_request. - Example:
{
"name": "jumpcloud_query_suggestion",
"arguments": {
"intent": "list users then update one user",
"domain": "console"
}
}
jumpcloud_openapi_discovery
- Use when: you need schema discovery for operation IDs, methods, paths, tags, and domains.
- Do not use when: you are ready to execute and already know the operation.
- Access type: read-only.
- Risk: low.
- Required permissions: none.
- Environment behavior: returns operation metadata from OpenAPI cache.
- Parameters:
domainenum optional:console|directory-insightssearchstring optionallimitint optional (max 500)
- Response shape:
data.endpoints[]data.countdata.totalDiscovered
- Common failures: OpenAPI fetch/parse errors.
- Recommended prereq:
jumpcloud_connection_info. - Follow-up tools:
jumpcloud_operation_invoke,jumpcloud_api_request. - Example:
{
"name": "jumpcloud_openapi_discovery",
"arguments": {
"domain": "console",
"search": "systemusers",
"limit": 20
}
}
jumpcloud_operation_invoke
- Use when: you have an operationId and want strict OpenAPI-based invocation.
- Do not use when: you only have raw method/path; use
jumpcloud_api_request. - Access type: read-only or mutating (depends on operation method).
- Risk: variable.
- Required permissions:
- Active user token in Vault.
authorizationKeyrequired for mutating operations ifMCP_ADMIN_AUTH_KEYis set.- Request must satisfy tenant/user policy guardrails when configured.
- Environment behavior: operation domain inferred from OpenAPI metadata.
- Parameters:
userIdoptional (defaults toMCP_CONFIG_DEFAULT_USER_ID)tokenIdoptional (defaults to active token)operationIdrequiredpathParamsoptional recordqueryoptional recordbodyoptional JSONheadersoptional recordauthorizationKeyoptional unless gated mutation
- Response shape:
data.domain,data.method,data.path,data.status,data.data
- Common failures:
- Unknown operationId
- Missing required path parameter
- Missing/inactive token
- JumpCloud API errors
- Recommended prereq:
jumpcloud_openapi_discovery. - Follow-up tools:
jumpcloud_api_requestfor edge cases. - Safety warning: high-impact on production identity/device state for mutating operations.
- Example:
{
"name": "jumpcloud_operation_invoke",
"arguments": {
"userId": "team-a",
"operationId": "systemusers_list",
"query": {
"limit": 10
}
}
}
jumpcloud_api_request
- Use when: you need explicit HTTP method/path execution with full API coverage.
- Do not use when: planning/discovery only.
- Access type: read-only or mutating.
- Risk: variable.
- Required permissions:
- Active user token in Vault.
authorizationKeyfor mutating methods (POST|PUT|PATCH|DELETE) when admin key is configured.- Request must satisfy tenant/user policy guardrails when configured.
- Environment behavior: routes via
domainto Console or Directory Insights base URL. - Parameters:
userIdoptionaltokenIdoptionaldomainoptional:console|directory-insightsmethodrequiredpathrequiredqueryoptional objectbodyoptional JSONheadersoptional objectauthorizationKeyoptional unless gated mutation
- Response shape:
data.domain,data.method,data.path,data.status,data.data
- Common failures: token missing, auth errors, timeout, invalid path, JumpCloud errors.
- Recommended prereq:
jumpcloud_openapi_discovery. - Follow-up tools:
jumpcloud_query_suggestionfor next step guidance. - Safety warning: mutating calls can alter production directory state.
- Example:
{
"name": "jumpcloud_api_request",
"arguments": {
"userId": "default",
"domain": "console",
"method": "GET",
"path": "/api/systemusers"
}
}
jumpcloud_user_token_list
- Use when: checking per-user token metadata and active selection.
- Do not use when: creating/updating/deleting tokens.
- Access type: read-only.
- Risk: medium.
- Required permissions: none.
- Environment behavior: reads Vault token document for selected user.
- Parameters:
userIdoptionalincludeSensitiveoptional (actual values remain redacted unless sensitive output is enabled)
- Response shape:
data.userId,data.activeTokenId,data.tokens
- Common failures: Vault connectivity/read issues.
- Recommended prereq:
jumpcloud_scope_info. - Follow-up tools:
jumpcloud_user_token_upsert,jumpcloud_user_token_set_active,jumpcloud_user_token_delete.
jumpcloud_user_token_upsert
- Use when: creating/updating a user-scoped JumpCloud token in Vault.
- Do not use when: read-only inspection.
- Access type: mutating.
- Risk: high.
- Required permissions:
authorizationKeywhenMCP_ADMIN_AUTH_KEYis configured.
- Environment behavior: writes to user Vault path and may initialize active token.
- Parameters:
userIdoptionaltokenIdrequiredvaluerequiredtokenTypeoptional:apiKey|bearerheaderNameoptionaldescriptionoptionalauthorizationKeyoptional unless gated
- Response shape:
data.userId,data.tokenId,data.activeTokenId
- Common failures: Vault write failure, invalid payload.
- Recommended prereq:
jumpcloud_scope_info. - Follow-up tools:
jumpcloud_user_token_set_active,jumpcloud_api_request.
jumpcloud_user_token_set_active
- Use when: switching active token for a user.
- Do not use when: creating token material.
- Access type: mutating.
- Risk: medium.
- Required permissions:
authorizationKeywhen admin key is configured. - Environment behavior: updates active token pointer in Vault document.
- Parameters:
userIdoptionaltokenIdrequiredauthorizationKeyoptional unless gated
- Response shape:
data.userId,data.activeTokenId - Common failures: unknown tokenId, Vault write failure.
jumpcloud_user_token_delete
- Use when: removing obsolete token entries.
- Do not use when: only deactivation is needed.
- Access type: mutating.
- Risk: high.
- Required permissions:
authorizationKeywhen admin key is configured. - Environment behavior: deletes token and may reselect active token.
- Parameters:
userIdoptionaltokenIdrequiredauthorizationKeyoptional unless gated
- Response shape:
data.userId,data.activeTokenId,data.remainingTokenCount - Common failures: Vault write failure.
- Safety warning: destructive operation.
jumpcloud_config_list / jumpcloud_config_get
- Use when: retrieving non-secret per-user Postgres config.
- Do not use when: storing secrets.
- Access type: read-only.
- Risk: low.
- Required permissions: none.
- Environment behavior: reads
<app>_configtable byuser_id.
jumpcloud_config_set / jumpcloud_config_delete
- Use when: writing/deleting non-secret per-user configuration.
- Do not use when: storing token values or other sensitive secrets.
- Access type: mutating.
- Risk: medium/high.
- Required permissions:
authorizationKeywhen admin key is configured. - Environment behavior: writes/deletes rows in Postgres config table.
- Safety warning (
jumpcloud_config_delete): destructive operation.
jumpcloud_tenant_list / jumpcloud_tenant_scope_validate / jumpcloud_tenant_bootstrap_defaults
jumpcloud_tenant_list:- Read-only tenant discovery from Postgres scope ids.
- Optional user discovery from both Postgres and Vault token paths.
jumpcloud_tenant_scope_validate:- Read-only scope readiness checks for tenant/user.
- Reports whether tokens/config are present and recommends next tools.
jumpcloud_tenant_bootstrap_defaults:- Mutating baseline tenant/user config initializer.
- Requires
authorizationKeywhenMCP_ADMIN_AUTH_KEYis configured. - Writes non-secret defaults only (never token secrets).
jumpcloud_tenant_policy_get / jumpcloud_tenant_policy_set
jumpcloud_tenant_policy_get:- Read-only policy inspection for effective tenant/user guardrails.
- Returns the current policy object for the requested scope.
jumpcloud_tenant_policy_set:- Mutating policy update tool for tenant/user guardrails.
- Requires
authorizationKeywhenMCP_ADMIN_AUTH_KEYis configured. - Supports partial updates for:
allowMutationsallowedDomainsallowedMethodsallowedPathPrefixesenforceMutationOperationAllowListallowedOperationIds
Policy enforcement behavior:
- If
allowedDomainsis non-empty, requests must match one of those domains. - If
allowedMethodsis non-empty, requests must match one of those methods. - If
allowedPathPrefixesis non-empty, request path must start with at least one prefix. - If
allowMutations=false, mutating methods are denied. - If
enforceMutationOperationAllowList=true, mutatingjumpcloud_operation_invokecalls must haveoperationIdinallowedOperationIds.
jumpcloud_connection_info / jumpcloud_scope_info / jumpcloud_health_check
jumpcloud_connection_info: read-only server/runtime metadata.jumpcloud_scope_info: read-only effective app/user scope resolver.jumpcloud_health_check: read-only API connectivity/auth check using active user token.
HTTP Auth for MCP Endpoint
The MCP HTTP endpoint supports:
- Vault token index auth (
MCP_HTTP_AUTH_MODE=token) - OAuth2 introspection auth (
MCP_HTTP_AUTH_MODE=oauth2) - Dual acceptance (
MCP_HTTP_AUTH_MODE=both)
Tests
Run:
npm test
Highlights:
- OpenAPI discovery and operation invocation tests
- Multi-tenant and multi-user token behavior tests
- Tenant discovery/scope validation/bootstrap tool tests
- Admin auth gating tests for mutating tools
- HTTP integration and Vault-related tests
License
MIT. See LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.