SAP CC Identity (Keystone)
MCP Tools
Read Tools
| Tool |
Purpose |
Key Parameters |
keystone_list_projects |
List accessible projects |
domain_id, name (optional filters) |
keystone_token_info |
Current auth context: user, project, domain, roles, catalog |
— |
keystone_list_application_credentials |
List app credentials for current user |
— |
keystone_list_domains |
List available domains |
name (optional) |
keystone_list_users |
List users in a domain |
domain_id, name (optional) |
keystone_list_roles |
List available roles |
— |
Write Tools (requires MCP_READ_ONLY=false)
| Tool |
Purpose |
Key Parameters |
keystone_create_application_credential |
Create app credential (secret shown once) |
name, description, expires_at, roles |
keystone_delete_application_credential |
Delete/revoke an app credential |
id |
Admin Tools (requires MCP_ADMIN_TOOLS=true)
| Tool |
Purpose |
Key Parameters |
keystone_list_role_assignments |
List role assignments across projects/domains |
project_id, user_id, role_id (optional filters) |
keystone_list_groups |
List groups and their memberships |
domain_id (optional) |
SAP CC Domain Model
Region (eu-de-1)
└── Domain (organizational unit, e.g. "cc-demo")
├── Project A (resource container)
│ └── Role assignments (member, admin, network_admin...)
├── Project B
└── Project C
Key facts:
- A domain is an organizational boundary (typically maps to a team or cost center)
- Each project belongs to exactly one domain
- Roles are assigned per-project (a user can be admin in Project A, member in Project B)
- Regions are fully independent — credentials, projects, and catalogs don't cross regions
- Domain names follow convention:
cc-<name> (e.g., cc-demo, cc-platform)
For deeper explanation, see references/domain-project-model.md.
Gotchas
token_info never exposes the actual token value — only metadata (user, project, roles, catalog). This is security by design in the MCP server. Don't tell users you can show them their token.
App credential secret is shown ONLY at creation time — if the user loses it, the only recovery is delete + recreate. Always instruct users to store the secret immediately (keychain).
App credentials inherit roles at creation time — role changes to the user after creation do NOT affect existing app credentials. To pick up new roles: delete old credential, create new one.
Always list existing app credentials before creating — avoids duplicates. Use keystone_list_application_credentials first, check if one with the intended name already exists.
App credential names are unique per user, not globally — two different users can have an app credential named mcp-server. But the same user cannot have two with the same name.
Deleting an app credential immediately revokes access — any service (including the MCP server itself) using that credential will fail on the next API call. Always create the replacement first.
domain_id is required for cross-domain project listing — without it, keystone_list_projects only returns projects in your token's current domain scope.
Service catalog in token_info is region-specific — it shows only services available in the current region. Different regions may have different service availability.
App credentials cannot create other app credentials — unless created with unrestricted: true (which most deployments disallow). This prevents credential escalation chains.
Project scope determines what you see — your token is scoped to one project. All API calls operate within that project's context. To work across projects, you need separate credentials per project.
Common Workflows
Check Current Auth Context
"Who am I? What project? What can I do?"
1. keystone_token_info
→ Returns: user name, user domain, project name, project domain,
role assignments, service catalog, token expiry
2. Interpret roles to determine access level
3. Review service catalog to see available services
Create Application Credential for MCP Server
1. keystone_list_application_credentials
→ Check if one already exists with intended name
2. keystone_create_application_credential
name: "mcp-server-<project>-<region>" (e.g., mcp-server-cc-demo-eu-de-2)
description: "MCP server credential for <project> in <region>"
expires_at: "2027-05-06T00:00:00Z" (recommend 1 year dev, 90 days prod)
3. IMMEDIATELY store the secret in keychain:
macOS: security add-generic-password -a "<name>" -s "openstack-appcred" -w "<secret>"
Linux: secret-tool store --label="<name>" service openstack-appcred account "<name>"
4. Configure MCP server with credential ID + secret retrieval command
5. Verify with keystone_token_info after restart
Rotate Credentials
Order matters — create new BEFORE deleting old:
1. keystone_list_application_credentials → identify the old credential
2. keystone_create_application_credential → new credential with new name/suffix
3. Store new secret in keychain
4. Update MCP server config to use new credential
5. Restart MCP server
6. keystone_token_info → verify new credential works
7. keystone_delete_application_credential → remove old credential ONLY after verification
8. Remove old secret from keychain
List Accessible Projects
1. keystone_list_projects
→ Shows projects in current domain
2. For cross-domain: keystone_list_projects with domain_id filter
→ Need to know the target domain_id (not name)
3. Cross-reference with keystone_token_info to see current project scope
Discover Available Services
1. keystone_token_info → service_catalog section
2. Each catalog entry contains:
- type (e.g., "compute", "resources", "audit-data")
- name (e.g., "nova", "limes", "hermes")
- endpoints with region and URL
3. Use catalog to determine which MCP tools are usable in current region
Troubleshooting
"Authentication failed" or 401 errors
| Cause |
Diagnostic |
Fix |
| App credential deleted/expired |
keystone_list_application_credentials — is it still there? |
Create new credential |
| Wrong project scope |
keystone_token_info — check project name |
Update OS_PROJECT_NAME or recreate credential |
| User account disabled |
Login to dashboard — is account active? |
Contact domain admin |
| Wrong region |
Check OS_AUTH_URL matches OS_REGION_NAME |
Fix auth URL |
"Insufficient permissions" or 403 errors
| Cause |
Diagnostic |
Fix |
| Missing role |
keystone_token_info → check roles list |
Request role from project admin |
| App credential has subset of roles |
List app cred → check roles field |
Delete and recreate with needed roles |
| Wrong project |
keystone_token_info → check project |
Switch to correct project |
"Project not found"
- Verify domain scope — cross-domain listing requires
domain_id
- Check spelling: project names are case-sensitive
- Confirm the project exists in this region (regions are independent)
"App credential name already exists"
- Names are unique per user — list existing creds to find the conflict
- Delete the old one (if no longer needed) or choose a different name
Security
| Principle |
Implementation |
| Never expose tokens |
MCP server sanitizes all responses — token values never reach the LLM |
| App creds over passwords |
Scoped, revocable, no password exposure — always prefer |
| Keychain storage |
Use OS_APPCRED_SECRET_CMD pattern — never plaintext in config files |
| Set expiration |
Forces periodic rotation, limits blast radius of compromised creds |
| Minimum roles |
Create app credentials with only the roles needed for the task |
| One credential per purpose |
Easy to revoke without disrupting other services |
| Verify before deleting |
Always confirm new credential works before revoking the old one |
Cross-Service References
- credential-setup skill — detailed guided workflow for first-time credential creation
- sapcc-quota — check
limes_get_project_quota to see what resources your project can use
- sapcc-audit — use
hermes_list_events with initiator_name to see who did what in a project
- Service catalog — determines which other MCP tools (nova_, neutron_, limes_, etc.) are available
Routing
| User need |
Action |
| Domain and project hierarchy details |
Read domain-project-model.md |
1---2name: sapcc-identity3description: SAP Converged Cloud identity and access management via Keystone. Domain/project hierarchy, authentication context, application credentials, role assignments, and service catalog interpretation. Use when: project, domain, authentication, roles, token, application credential, keystone, who am I, service catalog.4---56# SAP CC Identity (Keystone)78## MCP Tools910### Read Tools11| Tool | Purpose | Key Parameters |12|------|---------|----------------|13| `keystone_list_projects` | List accessible projects | `domain_id`, `name` (optional filters) |14| `keystone_token_info` | Current auth context: user, project, domain, roles, catalog | — |15| `keystone_list_application_credentials` | List app credentials for current user | — |16| `keystone_list_domains` | List available domains | `name` (optional) |17| `keystone_list_users` | List users in a domain | `domain_id`, `name` (optional) |18| `keystone_list_roles` | List available roles | — |1920### Write Tools (requires MCP_READ_ONLY=false)21| Tool | Purpose | Key Parameters |22|------|---------|----------------|23| `keystone_create_application_credential` | Create app credential (secret shown once) | `name`, `description`, `expires_at`, `roles` |24| `keystone_delete_application_credential` | Delete/revoke an app credential | `id` |2526### Admin Tools (requires MCP_ADMIN_TOOLS=true)27| Tool | Purpose | Key Parameters |28|------|---------|----------------|29| `keystone_list_role_assignments` | List role assignments across projects/domains | `project_id`, `user_id`, `role_id` (optional filters) |30| `keystone_list_groups` | List groups and their memberships | `domain_id` (optional) |3132## SAP CC Domain Model3334```35Region (eu-de-1)36└── Domain (organizational unit, e.g. "cc-demo")37 ├── Project A (resource container)38 │ └── Role assignments (member, admin, network_admin...)39 ├── Project B40 └── Project C41```4243**Key facts:**44- A domain is an organizational boundary (typically maps to a team or cost center)45- Each project belongs to exactly one domain46- Roles are assigned per-project (a user can be admin in Project A, member in Project B)47- Regions are fully independent — credentials, projects, and catalogs don't cross regions48- Domain names follow convention: `cc-<name>` (e.g., `cc-demo`, `cc-platform`)4950For deeper explanation, see `references/domain-project-model.md`.5152## Gotchas53541. **token_info never exposes the actual token value** — only metadata (user, project, roles, catalog). This is security by design in the MCP server. Don't tell users you can show them their token.55562. **App credential secret is shown ONLY at creation time** — if the user loses it, the only recovery is delete + recreate. Always instruct users to store the secret immediately (keychain).57583. **App credentials inherit roles at creation time** — role changes to the user after creation do NOT affect existing app credentials. To pick up new roles: delete old credential, create new one.59604. **Always list existing app credentials before creating** — avoids duplicates. Use `keystone_list_application_credentials` first, check if one with the intended name already exists.61625. **App credential names are unique per user, not globally** — two different users can have an app credential named `mcp-server`. But the same user cannot have two with the same name.63646. **Deleting an app credential immediately revokes access** — any service (including the MCP server itself) using that credential will fail on the next API call. Always create the replacement first.65667. **domain_id is required for cross-domain project listing** — without it, `keystone_list_projects` only returns projects in your token's current domain scope.67688. **Service catalog in token_info is region-specific** — it shows only services available in the current region. Different regions may have different service availability.69709. **App credentials cannot create other app credentials** — unless created with `unrestricted: true` (which most deployments disallow). This prevents credential escalation chains.717210. **Project scope determines what you see** — your token is scoped to one project. All API calls operate within that project's context. To work across projects, you need separate credentials per project.7374## Common Workflows7576### Check Current Auth Context7778"Who am I? What project? What can I do?"7980```811. keystone_token_info82 → Returns: user name, user domain, project name, project domain,83 role assignments, service catalog, token expiry842. Interpret roles to determine access level853. Review service catalog to see available services86```8788### Create Application Credential for MCP Server8990```911. keystone_list_application_credentials92 → Check if one already exists with intended name932. keystone_create_application_credential94 name: "mcp-server-<project>-<region>" (e.g., mcp-server-cc-demo-eu-de-2)95 description: "MCP server credential for <project> in <region>"96 expires_at: "2027-05-06T00:00:00Z" (recommend 1 year dev, 90 days prod)973. IMMEDIATELY store the secret in keychain:98 macOS: security add-generic-password -a "<name>" -s "openstack-appcred" -w "<secret>"99 Linux: secret-tool store --label="<name>" service openstack-appcred account "<name>"1004. Configure MCP server with credential ID + secret retrieval command1015. Verify with keystone_token_info after restart102```103104### Rotate Credentials105106Order matters — create new BEFORE deleting old:107108```1091. keystone_list_application_credentials → identify the old credential1102. keystone_create_application_credential → new credential with new name/suffix1113. Store new secret in keychain1124. Update MCP server config to use new credential1135. Restart MCP server1146. keystone_token_info → verify new credential works1157. keystone_delete_application_credential → remove old credential ONLY after verification1168. Remove old secret from keychain117```118119### List Accessible Projects120121```1221. keystone_list_projects123 → Shows projects in current domain1242. For cross-domain: keystone_list_projects with domain_id filter125 → Need to know the target domain_id (not name)1263. Cross-reference with keystone_token_info to see current project scope127```128129### Discover Available Services130131```1321. keystone_token_info → service_catalog section1332. Each catalog entry contains:134 - type (e.g., "compute", "resources", "audit-data")135 - name (e.g., "nova", "limes", "hermes")136 - endpoints with region and URL1373. Use catalog to determine which MCP tools are usable in current region138```139140## Troubleshooting141142### "Authentication failed" or 401 errors143144| Cause | Diagnostic | Fix |145|-------|-----------|-----|146| App credential deleted/expired | `keystone_list_application_credentials` — is it still there? | Create new credential |147| Wrong project scope | `keystone_token_info` — check project name | Update `OS_PROJECT_NAME` or recreate credential |148| User account disabled | Login to dashboard — is account active? | Contact domain admin |149| Wrong region | Check `OS_AUTH_URL` matches `OS_REGION_NAME` | Fix auth URL |150151### "Insufficient permissions" or 403 errors152153| Cause | Diagnostic | Fix |154|-------|-----------|-----|155| Missing role | `keystone_token_info` → check roles list | Request role from project admin |156| App credential has subset of roles | List app cred → check roles field | Delete and recreate with needed roles |157| Wrong project | `keystone_token_info` → check project | Switch to correct project |158159### "Project not found"160161- Verify domain scope — cross-domain listing requires `domain_id`162- Check spelling: project names are case-sensitive163- Confirm the project exists in this region (regions are independent)164165### "App credential name already exists"166167- Names are unique per user — list existing creds to find the conflict168- Delete the old one (if no longer needed) or choose a different name169170## Security171172| Principle | Implementation |173|-----------|---------------|174| Never expose tokens | MCP server sanitizes all responses — token values never reach the LLM |175| App creds over passwords | Scoped, revocable, no password exposure — always prefer |176| Keychain storage | Use `OS_APPCRED_SECRET_CMD` pattern — never plaintext in config files |177| Set expiration | Forces periodic rotation, limits blast radius of compromised creds |178| Minimum roles | Create app credentials with only the roles needed for the task |179| One credential per purpose | Easy to revoke without disrupting other services |180| Verify before deleting | Always confirm new credential works before revoking the old one |181182## Cross-Service References183184- **credential-setup skill** — detailed guided workflow for first-time credential creation185- **sapcc-quota** — check `limes_get_project_quota` to see what resources your project can use186- **sapcc-audit** — use `hermes_list_events` with `initiator_name` to see who did what in a project187- **Service catalog** — determines which other MCP tools (nova_, neutron_, limes_, etc.) are available188189## Routing190191| User need | Action |192|-----------|--------|193| Domain and project hierarchy details | Read [domain-project-model.md](references/domain-project-model.md) |