Skip to main content
Glama
MSPbotsAI

adobe-admin-console-mcp

by MSPbotsAI

adobe-admin-console-mcp

English | 中文

Adobe Admin Console MCP server for Claude — exposes Adobe's User Management API (UMAPI) as MCP tools, focused on Acrobat / PDF license (product profile) assignment for Enterprise organizations.

Tech stack: Python 3.12 + uv + FastMCP (Starlette/uvicorn)

关联需求:PRD-15546(Onboarding step 16,Acrobat / PDF license assignment)。完整调研见 vendor-mcp-template/prd/AdobeAdminConsole.md

Quick Start

cd adobe-admin-console-mcp
uv sync

# stdio mode (for Claude Desktop / CLI), single shared credential set from env
ADOBE_CLIENT_ID=xxxx ADOBE_CLIENT_SECRET=xxxx ADOBE_ORG_ID=xxxx@AdobeOrg uv run adobe-mcp

Related MCP server: N-central MCP Server

Authentication

This service is stateless: it never stores or persists Adobe credentials. Credentials are either supplied once via environment variables (local dev, AUTH_MODE=env), or per-request via HTTP headers (AUTH_MODE=gateway, production).

Adobe uses OAuth Server-to-Server (JWT/Service Account auth is deprecated). On every tool call, this service exchanges the caller's client_id + client_secret for a short-lived Adobe IMS access_token (~24h TTL) and uses it immediately — the token is not cached across requests, even though Adobe's own docs suggest doing so, in order to fully comply with the "no persisted credentials" requirement. This adds one extra IMS round trip per call.

Gateway mode HTTP headers (AUTH_MODE=gateway)

Header

类型

是否必填

默认值

枚举值

字段描述

Example

x-adobe-client-id

string

必填

Adobe Developer Console Project 的 Client ID,用于换取 access_token 及作为 x-api-key

1234abcd5678efgh

x-adobe-client-secret

string

必填

对应的 Client Secret,仅用于本次请求内换取 access_token,不持久化、不写日志

p8e-xxxxxxxxxxxx

x-adobe-org-id

string

必填

Adobe 组织 ID(Enterprise 租户标识)

1234567890ABCDEF@AdobeOrg

Missing any of the three headers on a /mcp request returns 401 with a required_headers list.

Env mode variables (AUTH_MODE=env, local dev only)

Variable

Default

Description

ADOBE_CLIENT_ID

Adobe Developer Console Project Client ID

ADOBE_CLIENT_SECRET

Adobe Developer Console Project Client Secret

ADOBE_ORG_ID

Adobe organization ID, e.g. 1234567890ABCDEF@AdobeOrg

ADOBE_BASE_URL

https://usermanagement.adobe.io/v2/usermanagement

UMAPI base URL

AUTH_MODE

gateway

env or gateway

MCP_TRANSPORT

stdio

stdio or http

MCP_HTTP_PORT

8080

HTTP server port

MCP_HTTP_HOST

0.0.0.0

HTTP server bind address

Get credentials: create a Project with User Management API enabled in the Adobe Developer Console (Enterprise organizations only — this API is not available for Teams / Education / individual Adobe IDs).

Claude Desktop Setup

{
  "mcpServers": {
    "adobe-admin-console": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/adobe-admin-console-mcp", "adobe-mcp"],
      "env": {
        "ADOBE_CLIENT_ID": "xxxx",
        "ADOBE_CLIENT_SECRET": "xxxx",
        "ADOBE_ORG_ID": "xxxx@AdobeOrg"
      }
    }
  }
}

Transport Modes

stdio (Claude Desktop / CLI)

ADOBE_CLIENT_ID=xxxx ADOBE_CLIENT_SECRET=xxxx ADOBE_ORG_ID=xxxx@AdobeOrg uv run adobe-mcp

HTTP — single-tenant (env mode)

ADOBE_CLIENT_ID=xxxx ADOBE_CLIENT_SECRET=xxxx ADOBE_ORG_ID=xxxx@AdobeOrg \
MCP_TRANSPORT=http AUTH_MODE=env uv run adobe-mcp
curl http://localhost:8080/health

HTTP — gateway / multi-tenant (production)

MCP_TRANSPORT=http AUTH_MODE=gateway uv run adobe-mcp

Tool List

Base URL: https://usermanagement.adobe.io/v2/usermanagement

Tool

Description

Parameters

adobe_list_users

列出组织下的用户(分页)

page (int, 可选,默认 0,从 0 开始)

adobe_get_user

获取指定用户详情(含当前产品/群组归属)

email (string, 必填)

adobe_list_product_profiles

列出可分配的产品档案(如 Acrobat Pro / Standard),客户端按 type == "PRODUCT_PROFILE" 过滤

page (int, 可选,默认 0)

adobe_assign_license

将用户加入指定 Product Profile,完成许可证分配

email (string, 必填), product_profile (string, 必填,产品档案名称)

adobe_remove_license

将用户从指定 Product Profile 移除,回收许可证

email (string, 必填), product_profile (string, 必填)

Rate limits (enforced by Adobe, not this service — expect 429 + Retry-After if exceeded):

Endpoint category

Per-client

Global

List / get users

25 req/min

100 req/min

List groups / product profiles

5 req/min

100 req/min

Assign / remove license (action)

10 req/min

100 req/min

Test Examples

tools/list (gateway mode)

curl -X POST http://localhost:8080/mcp \
  -H "x-adobe-client-id: your_client_id" \
  -H "x-adobe-client-secret: your_client_secret" \
  -H "x-adobe-org-id: 1234567890ABCDEF@AdobeOrg" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

tools/call — assign an Acrobat license

curl -X POST http://localhost:8080/mcp \
  -H "x-adobe-client-id: your_client_id" \
  -H "x-adobe-client-secret: your_client_secret" \
  -H "x-adobe-org-id: 1234567890ABCDEF@AdobeOrg" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "id": 2,
    "params": {
      "name": "adobe_assign_license",
      "arguments": {"email": "user@example.com", "product_profile": "Acrobat Pro DC - Enterprise"}
    }
  }'

Missing headers → 401

curl -i -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
# HTTP/1.1 401 Unauthorized
# {"error":"Missing credentials","required_headers":["x-adobe-client-id","x-adobe-client-secret","x-adobe-org-id"]}

API Reference

Known Limitations

  • No dedicated "list product profiles" endpointadobe_list_product_profiles calls the generic groups endpoint and filters client-side.

  • No official Adobe sandbox for UMAPI — it requires a real Enterprise organization with at least one product profile to test against (Teams/Education/individual accounts cannot enable this API).

  • Token exchange happens on every tool call (no caching), which adds latency but keeps the service fully stateless per the SOP requirement.

Available Tools

5 tools
adobe_assign_licenseA

Assign a license by adding a user to a product profile (e.g. an Acrobat Pro profile).

    Rate limit: 10 requests/min per client, 100/min globally.

    Args:
        email: The user's email address to grant the license to.
        product_profile: The exact product profile name (see adobe_list_product_profiles).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
product_profileYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It includes a rate limit (10 requests/min per client, 100/min globally) which is useful. However, it does not disclose side effects (e.g., consuming a license seat, irreversibility) or permission requirements, leaving a significant gap for a mutation tool.

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

Conciseness5/5

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

The description is front-loaded with the main action, followed by a rate-limiting note and concise parameter explanations. No wasted words; the example and cross-reference earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-parameter tool with an output schema present, the description covers purpose, rate limit, and parameter semantics. It lacks error-case behavior or idempotency notes, but for this complexity level it is reasonably complete.

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

Parameters5/5

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

The schema has no parameter descriptions (0% coverage), but the description explicitly explains both parameters: email is the user's email to grant the license, and product_profile must be the exact name, referencing adobe_list_product_profiles. This adds clear semantics beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Assign a license by adding a user to a product profile'), names the resource (license) and mechanism (adding to profile), and gives an example (Acrobat Pro profile). This distinguishes it from sibling tools like adobe_remove_license and adobe_list_users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: whenever a license needs to be granted. It also provides a cross-reference to adobe_list_product_profiles for obtaining the exact profile name, which is helpful prerequisite guidance. However, it does not explicitly exclude cases (e.g., user already has a license) or directly compare with adobe_remove_license.

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

adobe_get_userA

Get a single user's details, including current group/product profile memberships.

    Rate limit: 25 requests/min per client, 100/min globally.

    Args:
        email: The user's email address (or Adobe username string).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the transparency burden. It discloses a rate limit and that the input can be an email or Adobe username, but it doesn't mention error behavior, permissions, or explicitly state it's a read-only operation (though 'get' implies it). The rate limit adds some behavioral context, but other aspects are missing.

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

Conciseness4/5

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

The description is concise with three sentences covering purpose, rate limit, and parameter usage. It's front-loaded with the main action and does not include excessive detail, though the rate limit might be optional for tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-get tool, the description provides the core purpose and a key parameter detail, and the output schema presumably handles return structure. However, it lacks explicit guidance on alternative tools and edge-case behavior, so it's not fully complete.

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

Parameters4/5

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

The description expands on the schema's bare 'email' parameter by explaining it can be an Adobe username string as well, adding meaningful semantics beyond the schema. This is the only parameter, and the description compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'gets a single user's details' with a specific verb and resource, and distinguishes from sibling 'adobe_list_users' by focusing on a single user. The inclusion of 'group/product profile memberships' adds specific scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving one user's information, contrasting with the 'list' sibling tools, but it doesn't explicitly tell the agent when to choose this over others or mention any exclusions. This is implied usage based on the word 'single'.

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

adobe_list_product_profilesA

List product profiles available for license assignment (e.g. Acrobat Pro/Standard).

    Adobe's API returns all groups (user groups and product profiles together);
    this tool filters the response down to entries where type == "PRODUCT_PROFILE",
    since Adobe has no dedicated "list product profiles only" endpoint.

    Rate limit: 5 requests/min per client, 100/min globally.

    Args:
        page: Page number to fetch, zero-indexed (default: 0).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: it filters API responses to type=='PRODUCT_PROFILE' due to Adobe's API limitation, and provides rate limits (5/min per client, 100/min globally). This is valuable insight beyond a simple listing operation.

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

Conciseness5/5

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

The description is concise and well-structured: a clear one-line purpose, followed by necessary behavioral notes and parameter details. Every sentence earns its place without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and an existing output schema, the description covers the essential aspects: purpose, filtering logic, rate limits, and parameter semantics. No significant gaps remain.

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

Parameters5/5

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

The schema provides only a default value with no description. The description's Args section adds meaning: 'Page number to fetch, zero-indexed (default: 0)', which is essential for correct usage. This fully compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List product profiles available for license assignment' with examples (Acrobat Pro/Standard), using a specific verb+resource. It distinguishes from sibling tools like adobe_list_users by focusing on product profiles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool's purpose for license assignment is clear and the context implies when to use it. However, it does not explicitly state alternatives or when-not-to-use scenarios, though the filtering note provides helpful context about the API's behavior.

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

adobe_list_usersA

List users in the Adobe organization.

    Rate limit: 25 requests/min per client, 100/min globally.

    Args:
        page: Page number to fetch, zero-indexed (default: 0). Check the
            response's "lastPage" field to know whether to fetch the next page.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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 adds valuable context by disclosing rate limits and pagination mechanics beyond a simple 'list users' statement. It does not cover auth or error behavior, but for a simple list operation this is reasonably transparent.

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

Conciseness5/5

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

The description is compact and well-structured: a one-line summary, a rate-limit note, and an Args block. Every sentence earns its place without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity tool with one optional parameter and an output schema present. The description covers rate limits and pagination semantics comprehensively, and the output schema handles return value documentation. No significant gaps remain.

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

Parameters5/5

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

The schema provides only a 'page' integer with no description (0% coverage), but the description fully explains it: zero-indexed, default 0, and how to use the 'lastPage' field to continue pagination. This adds critical meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List users in the Adobe organization' with a specific verb ('List') and resource ('users'), and it naturally distinguishes from siblings like adobe_get_user (single user retrieval) and adobe_list_product_profiles (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage context, including rate limits (25/min client, 100/min global) and pagination instructions referencing the 'lastPage' field. It implies this is the tool for enumerating users, but does not explicitly mention alternatives or when not to use it.

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

adobe_remove_licenseA

Revoke a license by removing a user from a product profile.

    Rate limit: 10 requests/min per client, 100/min globally.

    Args:
        email: The user's email address to revoke the license from.
        product_profile: The exact product profile name (see adobe_list_product_profiles).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
product_profileYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It adds a rate limit (10/min per client, 100/min globally) and implies the action is a removal, but it does not mention side effects, idempotency, or error behavior (e.g., if the user is not in the profile).

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

Conciseness5/5

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

The description is concise and front-loaded with the primary action, then a rate limit note, then an Args section. Every sentence contributes value, and the structure is easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, rate limit, and parameter meanings, and references a sibling tool for obtaining valid values. Given that an output schema exists, return values need not be explained. However, it omits edge-case behavior such as handling missing users, which prevents a perfect score.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains both parameters: email is 'the user's email address to revoke the license from' and product_profile is 'the exact product profile name (see adobe_list_product_profiles).' This adds meaningful usage guidance beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Revoke a license by removing a user from a product profile,' which is a specific verb+resource statement that clearly differentiates it from siblings like adobe_assign_license. It conveys both the action and the mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context by noting the exact product profile name should be sourced from adobe_list_product_profiles, which is a useful usage hint. However, it does not explicitly contrast with alternatives or state when not to use it, though the purpose makes the primary use case evident.

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

Tool Schema Changelog

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

  1. 5 tool updatesv0.1.0
    • First observedadobe_assign_license
    • First observedadobe_get_user
    • First observedadobe_list_product_profiles
    • First observedadobe_list_users
    • First observedadobe_remove_license

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing users, getting user details, listing product profiles, assigning licenses, and removing licenses. There is no overlap or ambiguity in their intended functions.

Naming Consistency5/5

All tool names follow a consistent 'adobe_' prefix with a verb_noun pattern: list_users, get_user, list_product_profiles, assign_license, remove_license. The naming is uniform and predictable.

Tool Count5/5

With 5 tools, the server is well-scoped for its purpose of managing Adobe admin console users and licenses. Each tool serves a necessary function, and the count is within the ideal 3-15 range.

Completeness4/5

The tool set covers the core license management lifecycle: read users, read profiles, assign and revoke licenses. Minor gaps exist such as no user creation or deletion, but these may be outside the server's intended scope, so the coverage is nearly complete.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    The first full-featured MCP server for Adobe Experience Platform: 29 tools across schemas, datasets, profiles, segments, query service, and GDPR/CCPA privacy operations. Extends Adobe's read-only beta with production-grade write operations.
    102
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes the Google AdMob API as MCP tools for managing AdMob accounts, generating network and mediation reports, and listing apps and ad units.
    50
    3
    Apache 2.0