jumpcloud-mcp

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.

Category
访问服务器

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 authorizationKey when MCP_ADMIN_AUTH_KEY is 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_discovery for endpoint/operation discovery
  • jumpcloud_operation_invoke for operationId-driven execution
  • jumpcloud_api_request for 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.yml runs npm run inventory:check on push and pull requests.

Architecture

Runtime flow:

  1. src/index.js starts stdio MCP mode.
  2. src/http/index.js starts HTTP MCP mode.
  3. src/config/env.js validates runtime configuration.
  4. src/services/vault.js manages persistent secrets.
  5. src/services/configStore.js manages persistent config in Postgres.
  6. src/services/targetService.js loads OpenAPI and executes JumpCloud calls.
  7. src/mcp/server.js registers 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/userId stored in user_id)

Setup

  1. Install dependencies:
npm install
  1. Copy and edit environment:
cp .env.example .env
  1. Start local infra:
docker compose up -d postgres vault
  1. 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_HOST
  • VAULT_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:
    • intent string optional
    • domain enum optional: console|directory-insights
    • method string optional
    • path string optional
    • includeToolSchemas boolean optional
  • Response shape:
    • data.summary
    • data.recommendedOrder
    • data.suggestedOperations
    • data.safetyChecks
    • data.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:
    • domain enum optional: console|directory-insights
    • search string optional
    • limit int optional (max 500)
  • Response shape:
    • data.endpoints[]
    • data.count
    • data.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.
    • authorizationKey required for mutating operations if MCP_ADMIN_AUTH_KEY is set.
    • Request must satisfy tenant/user policy guardrails when configured.
  • Environment behavior: operation domain inferred from OpenAPI metadata.
  • Parameters:
    • userId optional (defaults to MCP_CONFIG_DEFAULT_USER_ID)
    • tokenId optional (defaults to active token)
    • operationId required
    • pathParams optional record
    • query optional record
    • body optional JSON
    • headers optional record
    • authorizationKey optional 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_request for 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.
    • authorizationKey for mutating methods (POST|PUT|PATCH|DELETE) when admin key is configured.
    • Request must satisfy tenant/user policy guardrails when configured.
  • Environment behavior: routes via domain to Console or Directory Insights base URL.
  • Parameters:
    • userId optional
    • tokenId optional
    • domain optional: console|directory-insights
    • method required
    • path required
    • query optional object
    • body optional JSON
    • headers optional object
    • authorizationKey optional 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_suggestion for 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:
    • userId optional
    • includeSensitive optional (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:
    • authorizationKey when MCP_ADMIN_AUTH_KEY is configured.
  • Environment behavior: writes to user Vault path and may initialize active token.
  • Parameters:
    • userId optional
    • tokenId required
    • value required
    • tokenType optional: apiKey|bearer
    • headerName optional
    • description optional
    • authorizationKey optional 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: authorizationKey when admin key is configured.
  • Environment behavior: updates active token pointer in Vault document.
  • Parameters:
    • userId optional
    • tokenId required
    • authorizationKey optional 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: authorizationKey when admin key is configured.
  • Environment behavior: deletes token and may reselect active token.
  • Parameters:
    • userId optional
    • tokenId required
    • authorizationKey optional 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>_config table by user_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: authorizationKey when 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 authorizationKey when MCP_ADMIN_AUTH_KEY is 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 authorizationKey when MCP_ADMIN_AUTH_KEY is configured.
    • Supports partial updates for:
      • allowMutations
      • allowedDomains
      • allowedMethods
      • allowedPathPrefixes
      • enforceMutationOperationAllowList
      • allowedOperationIds

Policy enforcement behavior:

  • If allowedDomains is non-empty, requests must match one of those domains.
  • If allowedMethods is non-empty, requests must match one of those methods.
  • If allowedPathPrefixes is non-empty, request path must start with at least one prefix.
  • If allowMutations=false, mutating methods are denied.
  • If enforceMutationOperationAllowList=true, mutating jumpcloud_operation_invoke calls must have operationId in allowedOperationIds.

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.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选