Search the developer.adobe.com docs. Manage Adobe Developer Console projects, workspaces, APIs, and credentials. Create and test I/O Events registrations and subscriber defined filters.
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Mandatory prerequisite: Before starting this skill, read and apply Common Skill Rules.
Guide the user through subscribing an Adobe API to a credential in an existing project, step by step.
Before starting: invoke the dev-console-context skill to establish the org, project, and workspace. If the user wants a new project, invoke dev-console-create-project first and continue with the context it returns. After the workspace is selected or created, call get_credentials and immediately call get_credential_services for each returned credential before presenting the credentials and their subscriptions. Do not repeat these calls if the context skill already made them during this request.
Find the API — If the user asks "what APIs are available", "show me available APIs", or similar, call list_services with filterBy: "enabled" and display only the enabled APIs as a list (name + description, no raw codes). If the user named a specific API, call list_services with filterBy: "enabled" to find its code and full details. Never guess an SDK code.
Pick credential type — Always validate against the API's supported types — never skip this check because an existing credential was found. An API can have multiple enabled instances with different type values. Collect ALL enabled instances for the API code. Reuse a type already specified by the user if it is supported; otherwise:
admin_entp instances as Admin Enterprise credentials; do not filter them out or redirect the user to Console for creation or subscription.analytics) — if an analytics instance is presentadobeid)oauth_server_to_server, also used for entp)admin_entp) — if an admin_entp instance is presentCheck for product profiles — After the credential type is decided, inspect its properties.licenseConfigs array from the matching API instance:
name, never raw id or productId) and tell the user: "You can select one or more of these profiles." Collect their choices — you'll need the selected profiles' id and productId fields when subscribing.licenseConfigs.services to create_oauth_s2s_credential until licenseConfigs have been resolved.Subscribe — Use a credential of the selected type from the chosen workspace. If several matching credentials exist, ask the user to choose by credential name. If none exists, create one using Credential creation inputs below. For a newly created project, use the selected workspace ID from the creation/context flow for every credential creation and subscription call. For an App Builder project, preserve the user's Production or Stage selection; never replace a selected Stage workspace with Production. Automatically use Production only for a default project with a single workspace. If no workspace has been selected, use the returned workspace details or call list_workspaces to resolve the selection before proceeding. If the selected type is User Auth (AdobeId), call list_workspaces to confirm the selected workspace before creating that credential; this confirmation must not change the user's selection.
Admin Enterprise credential (admin_entp):
create_admin_enterprise_credential with orgId, projectId, workspaceId, the creation inputs below, and services including any product profiles selected in step 3. This creates the credential and subscribes the API in one call.subscribe_admin_enterprise_credential_to_services with orgId, credentialId, and services including any product profiles selected in step 3. No project or workspace ID is required by this tool; choose only a credential from the selected workspace.update_admin_enterprise_credential changes only the credential's name, description, and redirect settings; it does not add, replace, or remove API subscriptions. Never call it to subscribe an API or report a subscription success based on its response.admin_entp to subscribe_credential_to_services; that tool does not support it.OAuth Server-to-Server credential (oauth_server_to_server) → call subscribe_credential_to_services:
orgId, projectId, workspaceId, credentialType: "oauth_server_to_server", credentialId, and services.licenseConfigs if the user selected product profiles in step 3. An empty licenseConfigs: [] is NOT the same as omitting it — pass the user's selections.credentialType must always match the credential's actual type (oauth_server_to_server), never the API's type (entp).Other credential types (adobeid, analytics, entp, oauth_server_to_server) use subscribe_credential_to_services (PUT). The server automatically preserves all already-subscribed services — only pass the service(s) you want to add or change; do NOT pre-fetch and re-send the full existing list. Preservation is per-service, not per-licenseConfig: if you're adding a licenseConfig to an already-subscribed service, include that service's full intended licenseConfigs list (existing plus new), not just the new one.
Report success — If the subscription tool succeeds, report success without a separate verification call. For Admin Enterprise service tools, the DTO-derived JSON body uses sdkList, error, and errorDetails (not errorList). HTTP 200 can contain partial failures: the connector returns an MCP error if either error array is non-empty, including the failed SDK codes and returned SDK list. Some changes may already have applied; inspect current subscriptions before retrying and never automatically retry the whole list. For Admin Enterprise creation, inspect subscriptionResult when present; do not report an API as subscribed if it appears in errorList or its subscription is otherwise unconfirmed.
"✓ [API name] has been successfully subscribed to your [credential type] credential."
List the APIs confirmed by the response. The services array may contain only additions, so do not present it as the full current list.
Only call get_credential_services if the response is ambiguous or an error was returned.
When no credential exists and one must be created, apply the Common Skill Rules for names, titles, and descriptions. Preserve valid user-supplied values; otherwise derive the missing name using the pattern {projectName}-{type}[-{subtype}], without a naming prompt:
| Credential type | Platform / subtype | Auto-generated name example |
|---|---|---|
| OAuth S2S | — | mcptesting-s2s |
| Admin Enterprise | — | mcptesting-admin-enterprise |
| AdobeId | WebApp | mcptesting-adobeid-webapp |
| AdobeId | SinglePageApp | mcptesting-adobeid-singlepageapp |
| AdobeId | NativeApp | mcptesting-adobeid-native |
| AdobeId | apiKey | mcptesting-adobeid-apikey |
| Analytics | Web | mcptesting-analytics-web |
| Analytics | iOS | mcptesting-analytics-ios |
| Analytics | Android | mcptesting-analytics-android |
For a missing description, use: "{Type} credential for {projectTitle}" (e.g. "OAuth S2S credential for mcptesting").
For generated names, use lowercase letters, digits, and hyphens, and truncate to 50 characters if needed. Do not silently modify user-supplied values; follow the shared validation and fallback rules.
create_oauth_s2s_credential)services to create_oauth_s2s_credential — always create the credential first (no services), then subscribe in a separate subscribe_credential_to_services call. Inline service attachment is unreliable and causes confusing retry flows.create_admin_enterprise_credential)defaultRedirectUri (the OAuth callback URL) and redirectUriPattern (the regex for allowed redirect URIs). Never invent placeholder values or use an unrestricted pattern by default.services, including product profiles selected in step 3. Do not make a separate subscription call after successful inline subscription.create_user_auth_credential)platformList, when provided, and documented API support.
1. WebApp — web application
2. SinglePageApp — SPA/React/Angular app
3. NativeApp — desktop or mobile app
4. apiKey — server-side API key accessBefore asking for platform, if available_scopes is present:
Platform-specific inputs — NEVER invent placeholder values, always wait for the user:
WebApp / SinglePageApp: ask for both:
defaultRedirectUri — plain URL (e.g. https://example.com/callback)redirectUriList — one or more redirect URI patterns; pass as plain URLs, the server escapes dots automaticallyNativeApp: no extra inputs required — proceed directly.apiKey: ask for domain. No redirect URI needed.create_analytics_credential)platformList, when provided, and documented API support. Filter the following platform labels before offering a choice:
1. Web — web app
2. iOS — iOS mobile app
3. Android — Android mobile appPlatform-specific inputs — NEVER invent placeholder values:
Web: ask for both:
defaultRedirectUri — plain URL (e.g. https://example.com/callback)redirectUriList — one or more redirect URI patterns; pass as plain URLs, the server escapes dots automaticallyiOS: ask for urlScheme. No redirect URI needed.Android: no extra inputs required — proceed directly.After creating a credential that needs a separate subscription call, use its returned id as credentialId. Admin Enterprise creation already includes the requested services. Never re-fetch credentials after a fresh creation.
Whenever any tool response includes a console_url field (credential creation or subscription), always display it to the user as a clickable link:
🔗 View in Adobe Developer Console: {console_url}If you're unsure about an API, credential type, product profile, or Adobe concept during this flow — call search_adobe_docs before asking the user to clarify. For example:
Always prefer fetching from official docs over guessing.
entp APIs (e.g. Adobe Campaign) use an OAuth S2S credential. Never show "entp" to the user.admin_entp instances are selectable as Admin Enterprise credentials. Use create_admin_enterprise_credential for creation with inline services and subscribe_admin_enterprise_credential_to_services to add or update APIs on existing credentials. API removal is handled by dev-console-unsubscribe-api skill. update_admin_enterprise_credential only updates credential details and does not change subscriptions.type field to determine credential type. Completely ignore oauthServerToServerOnly. Mapping: adobeid → create_user_auth_credential, analytics → create_analytics_credential, entp → create_oauth_s2s_credential, oauth_server_to_server → create_oauth_s2s_credential, admin_entp → create_admin_enterprise_credential.get_credentials response uses id_integration as the credential ID — use this value wherever credentialId is required in any tool call. integration_name is the credential's display name.licenseConfigs as "product profiles" to the user.properties.licenseConfigs is non-empty for an API, always complete step 3 and include the selected licenseConfigs in the services array — both when subscribing to an existing credential and when creating a new one. An omitted or empty licenseConfigs means the subscription will have no product profile attached.list_services returns a very large payload that exceeds the inline token limit. When you need to find an API code or inspect its details, search the saved file with a shell command (e.g. python3 -c "import json; ..." filtering by name/code) rather than reading the full response inline..tessl-plugin
skills