Click on "Install 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., "@AEM Assets MCP ServerSearch for assets related to 'Electric Vehicle' and show their details."
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.
AEM Assets Server for AI Integrations
A dual-implementation server for Adobe Experience Manager (AEM) Assets API:
REST API (
rest-api/) - For ChatGPT Custom GPTs via Actions (FastAPI)MCP Server (
mcp-server/) - For ChatGPT Custom GPTs with MCP support (FastMCP)
Both implementations share the same core AEM client logic and provide identical functionality.
๐๏ธ Architecture
๐ Features
Both implementations provide identical tools to interact with AEM Assets:
List folders - Browse folders in your AEM Assets repository
List assets by folder - Get all assets within a specific folder
Get asset details - Retrieve detailed information about a specific asset including metadata
Update asset metadata - Update metadata fields for individual assets
Bulk update metadata - Update metadata for all assets in a folder
๐ฏ Which Implementation Should I Use?
Feature | REST API (Vercel) | MCP Server (Cloud Run) |
Target Platform | ChatGPT Actions | ChatGPT with MCP support |
Protocol | HTTP REST | JSON-RPC over SSE |
Deployment | Vercel (serverless) | Google Cloud Run (containers) |
Schema | OpenAPI 3.0 | MCP Protocol |
Best For | Standard ChatGPT integrations | Native MCP clients (ChatGPT, Claude Desktop) |
Recommendation:
Use REST API if you're integrating with ChatGPT Custom GPTs via Actions (most common)
Use MCP Server if your ChatGPT supports native MCP protocol connections
๐ Prerequisites
AEM Access
Adobe Experience Manager Assets Author API Access
AEM base URL (e.g.,
https://author-pXXXXXX-eXXXXXXX.adobeaemcloud.com)OAuth Server-to-Server credentials (for modern
/adobe/*APIs):Client ID
Client Secret
JWT Service Account credentials (for classic
/api/assetsAPI):Service Account JSON file with private key
See GET_CREDENTIALS.md for detailed setup
REST API Requirements
Python 3.12+
Vercel account (for deployment)
ChatGPT Plus/Pro with Custom GPTs
MCP Server Requirements
Python 3.12+
Docker
Google Cloud Platform account
gcloudCLIGitHub account (for CI/CD)
๐ ๏ธ Tech Stack
Shared Components
Python 3.12 - Core language
HTTPX - Async HTTP client
Pydantic - Data validation
Dual Authentication:
OAuth Server-to-Server (modern AEM APIs)
JWT Service Account (classic AEM APIs)
REST API Stack
FastAPI - Modern async web framework
Vercel - Serverless deployment
MCP Server Stack
FastMCP - MCP protocol implementation
Docker - Containerization
Google Cloud Run - Container hosting
Terraform - Infrastructure as Code
GitHub Actions - CI/CD
๐ Project Structure
๐ Quick Start
Choose your implementation path:
Option A: REST API for ChatGPT Actions
Local Development
Clone the repository:
Create virtual environment:
Install dependencies:
Configure environment:
See GET_CREDENTIALS.md for how to get your credentials.
Run REST API locally:
Visit http://localhost:8000 to see the server info.
Deploy to Vercel
See DEPLOYMENT_VERCEL.md for detailed instructions.
Option A: Local Deployment (Fastest)
Option B: GitHub Actions (Automated CI/CD)
Set up once, then automatically deploy on every push to main:
Get Vercel credentials (see DEPLOYMENT_VERCEL.md)
Add GitHub Secrets:
VERCEL_TOKENVERCEL_ORG_IDVERCEL_PROJECT_ID
Push to
mainor manually trigger workflow
Your API will be available at: https://your-project.vercel.app/api/mcp
Use the OpenAPI schema at rest-api/openapi-schema.json to configure ChatGPT Actions.
Option B: MCP Server for Native MCP Support
Local Development
Install MCP server dependencies:
Configure environment (same as REST API):
Run MCP server locally:
The MCP server will start with SSE transport on port 8080.
Deploy to Google Cloud Run
See DEPLOYMENT_CLOUDRUN.md for detailed instructions.
Quick steps using GitHub Actions:
Set up GCP project and enable APIs
Configure Workload Identity Federation (see CLOUD_RUN_SETUP_GUIDE.md)
Add GitHub Secrets:
GCP_PROJECT_IDGCP_REGIONGCP_WORKLOAD_IDENTITY_PROVIDERGCP_SERVICE_ACCOUNTAEM_BASE_URLAEM_CLIENT_ID
Create GCP secrets:
echo -n "your_client_secret" | gcloud secrets create aem-client-secret --data-file=- echo -n "$(cat service-account.json)" | gcloud secrets create aem-service-account-json --data-file=-Trigger deployment:
Go to GitHub Actions โ "Deploy to Google Cloud Run" โ "Run workflow"
Your MCP server will be available at: https://aem-assets-mcp-server-xxxxx.run.app
Connect from ChatGPT using the MCP server URL.
๐งช Testing
Test REST API
Test MCP Server
See TESTING.md for comprehensive testing guide including:
Direct AEM API testing
JWT token generation
MCP Inspector usage
๐ง Configuration
Both implementations use the same environment variables:
Variable | Description | Required | Example |
| AEM Author instance URL | โ |
|
| OAuth Client ID | โ |
|
| OAuth Client Secret | โ |
|
| JWT Service Account (file path or JSON string) | โ |
|
API endpoints and scopes are configured in shared/constants.py:
Modern API:
/adobe/assets,/adobe/folders(OAuth)Classic API:
/api/assets(JWT)IMS Token:
https://ims-na1.adobelogin.com/ims/token/v3Scopes:
openid,AdobeID,aem.assets.author,aem.folders
๐ Documentation
GET_CREDENTIALS.md - How to obtain AEM credentials
JWT_SETUP.md - JWT Service Account setup
DEPLOYMENT_VERCEL.md - REST API deployment to Vercel
DEPLOYMENT_CLOUDRUN.md - MCP Server deployment to Cloud Run
CLOUD_RUN_SETUP_GUIDE.md - Detailed Cloud Run setup
TESTING.md - Testing guide
LOCAL_DEVELOPMENT.md - Local development tips
๐ค ChatGPT Integration
For REST API (ChatGPT Actions)
Create a Custom GPT in ChatGPT
Go to "Configure" โ "Actions"
Import the schema from
rest-api/openapi-schema.jsonSet the server URL to your Vercel deployment
Test with prompts like:
"List all folders in /content/dam/"
"Show me assets in the MyFolder folder"
"Update the description for asset XYZ"
For MCP Server (Native MCP)
Create a Custom GPT in ChatGPT with MCP support
Configure MCP connection with your Cloud Run URL
The MCP server will automatically expose all tools
Test with the same natural language prompts
๐ Security Notes
Never commit
.envfiles orservice-account.jsonUse GitHub Secrets for CI/CD
Use GCP Secret Manager for Cloud Run
Use Vercel environment variables for Vercel deployment
Rotate credentials regularly
Review AEM user permissions
๐ Troubleshooting
Common Issues
Issue: JWT authentication not working in Cloud Run
Cause:
AEM_SERVICE_ACCOUNT_JSONmust contain JSON string, not file pathFix: Create secret with JSON content:
gcloud secrets create aem-service-account-json --data-file=service-account.json
Issue: Permission denied on Secret Manager
Cause: Cloud Run service account lacks permissions
Fix: Grant
roles/secretmanager.secretAccessor:gcloud secrets add-iam-policy-binding aem-client-secret \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/secretmanager.secretAccessor"
Issue: 403 Forbidden from AEM
Cause: Incorrect authentication or insufficient permissions
Fix: Verify credentials, check AEM user has correct Product Profile (AEM Administrators)
Issue: Vercel deployment fails
Cause: Path issues after restructure
Fix: Ensure
vercel.jsonpoints torest-api/app/main.py
See TESTING.md for more troubleshooting steps.
๐ License
MIT License - See LICENSE file for details
๐ Acknowledgments
Adobe Experience Manager Assets API
FastAPI and FastMCP teams
Model Context Protocol specification