admin — Claude Code skill for Grafana Cloud management
A skill for Grafana Cloud account work: creates stacks, mints service-account tokens, configures SSO and RBAC roles.
npx skills add grafana/skills --skill admin -a claude-codeWhat admin does
The skill handles Grafana Cloud admin tasks through the API and Terraform. It creates a stack with a Cloud API call, polls /api/health until the new stack answers, mints a service-account token and checks it against /api/org. Team onboarding goes through POST /api/org/invites, team creation, member adds and a role assignment.
Three references ship with it: references/sso.md for OAuth, SAML and GitHub OAuth configs, references/terraform.md for the provider and common resources, references/api-reference.md for Cloud API and Stack API endpoints. RBAC is declarative — the role and its assignments live in provisioning YAML, and after a Grafana restart you confirm the role with GET /api/access-control/roles.
You need a grafana-com-api-key and an admin token for the stack. For SSO, the skill advises validating in an incognito window before telling anyone it works. Stack deletion is destructive: if GET /api/instances/{id} still returns 200 a few seconds later, the delete did not apply, so re-check the stack ID and the Cloud API key.
What it helps with
- create a new Grafana Cloud stack through the Cloud API
- mint a service-account token for CI/CD or Terraform
- set up Okta, SAML or GitHub login
- assign an RBAC role scoped to a dashboard folder
- invite users and assemble a team
Example prompts for the agent
- create a new Grafana Cloud stack in us-east-0 and verify it responds
- set up a terraform-provisioner service account with the Admin role and mint a token for it
- configure SAML login and show me how to verify the role mapping
How to install admin
1Skills CLI (Vercel)
npx skills add grafana/skills --skill admin -a claude-code2Manually: put the files in place
~/.claude/skills/admin/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/admin/
1Skills CLI (Vercel)
npx skills add grafana/skills --skill admin -a codex2Manually: put the files in place
.agents/skills/admin/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add grafana/skills --skill admin -a cursor2Manually: put the files in place
.cursor/skills/admin/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install grafana/skills admin2Manually: put the files in place
.github/skills/admin/SKILL.md1Skills CLI (Vercel)
npx skills add grafana/skills --skill admin -a gemini-cli2Platform CLI
gemini skills install https://github.com/grafana/skills --path skills/grafana-cloud/adminManually: put the files in place
.devin/skills/admin/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add grafana/skills --skill admin -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about admin
How do I install admin in Claude?
Run npx skills add grafana/skills --skill admin -a claude-code. The skill lands in ~/.claude/skills/admin/SKILL.md.
What does the admin skill do?
It manages a Grafana Cloud account: organizations, stacks, RBAC roles, SSO, service accounts and teams. Some work goes through the Cloud API and Stack API, the rest through Terraform and provisioning YAML.
What do I need before using it?
A grafana-com-api-key for organization-level calls and an admin token for the stack itself. Without them API requests come back unauthorized.
Source text
SKILL.md · Apache-2.0
---
name: admin
license: Apache-2.0
description: Manage Grafana Cloud accounts — organizations, stacks, RBAC roles and assignments, SSO/SAML/OAuth/GitHub auth, service accounts for CI/CD, user invites, team membership, and API-driven provisioning. Creates stacks via the Cloud API, mints service-account tokens, applies role assignments, configures SSO providers, and provisions teams/folders/dashboards via Terraform. Use when managing Grafana Cloud access, configuring SSO/SAML/OAuth, setting up service accounts for Terraform/CI/CD, assigning RBAC roles, inviting users, managing multiple stacks or organizations, provisioning cloud resources via API or Terraform, or auditing admin actions — even when the user says "set up SSO", "create a stack", "make a service account", or "onboard a team" without explicitly saying "admin".
---
# Grafana Cloud Admin
> **Docs**: https://grafana.com/docs/grafana-cloud/account-management.md
## Common Workflows
### Setting up a new stack
```bash
# 1. Create the stack via Cloud API
curl -X POST https://grafana.com/api/instances \
-H "Authorization: Bearer <grafana-com-api-key>" \
-H "Content-Type: application/json" \
-d '{"name": "my-new-stack", "slug": "my-new-stack", "region": "us-east-0", "plan": "grafana-cloud-free"}'
# 2. Verify the stack is reachable (poll until 200)
until curl -fs https://my-new-stack.grafana.net/api/health > /dev/null; do sleep 2; done
# 3. Mint an admin service-account token (see § Service Accounts below)
# 4. Test the token
curl https://my-new-stack.grafana.net/api/org -H "Authorization: Bearer <token>"
# Returns 200 + org JSON → token works
```
### Onboarding a team
1. Invite users via `POST /api/org/invites` (one curl per user — see [references/api-reference.md § Stack API](references/api-reference.md#stack-api--user--team--org-management))
2. Create the team via `POST /api/teams`
3. Add each user via `POST /api/teams/{teamId}/members`
4. Assign an RBAC role to the team (see [§ RBAC](#rbac) below)
5. Verify: `GET /api/teams/{teamId}/members` returns the expected user list
### Configuring SSO (Okta / SAML / GitHub)
1. Pick the provider config from [references/sso.md](references/sso.md) and drop into `grafana.ini`
2. Restart Grafana
3. **Always validate in an incognito window before announcing**: see [references/sso.md § Verifying SSO](references/sso.md#verifying-sso) for the 5-step verification + role-mapping debug pattern
### Deleting a stack (destructive)
```bash
# 1. Delete via Cloud API
curl -X DELETE https://grafana.com/api/instances/{id} \
-H "Authorization: Bearer <grafana-com-api-key>"
# 2. Verify the stack is gone (must return 404)
curl https://grafana.com/api/instances/{id} \
-H "Authorization: Bearer <grafana-com-api-key>"
```
If the GET still returns 200 after a few seconds, the delete didn't apply — re-check the stack ID and Cloud API key.
## Organization and Stack Structure
```
Grafana Cloud Account
└── Organization (billing unit)
├── Stack 1 (prod) → dedicated Grafana, Prometheus, Loki, Tempo URLs
├── Stack 2 (staging)
└── Stack 3 (dev)
```
- **Organization**: top-level account with billing, users, API keys, stacks
- **Stack**: dedicated Grafana + LGTM instance with its own URLs and credentials
## User Roles
| Role | Scope | Permissions |
|------|-------|-------------|
| **Org Admin** | Organization | Manage stacks, users, billing, API keys |
| **Admin** | Stack | Data sources, plugins, users, provisioning |
| **Editor** | Stack | Create/edit dashboards, alerts |
| **Viewer** | Stack | Read-only dashboards |
## RBAC
Define a custom role + assignment in provisioning YAML:
```yaml
# provisioning/access-control/roles.yaml
apiVersion: 1
roles:
- name: TeamDashboardEditor
description: Edit dashboards within team folder
permissions:
- action: dashboards:read
scope: folders:UID:team-folder
- action: dashboards:write
scope: folders:UID:team-folder
- action: dashboards:create
scope: folders:UID:team-folder
```
```yaml
# provisioning/access-control/assignments.yaml
apiVersion: 1
roleAssignments:
- roleName: TeamDashboardEditor
users:
- [email protected]
- [email protected]
teams:
- platform-team
```
After committing the YAML and restarting Grafana, verify the role applied: `GET /api/access-control/roles | jq '.[] | select(.name=="TeamDashboardEditor")'`.
## Service Accounts
Service accounts are the recommended way for programmatic access (CI/CD, Terraform, agents).
```bash
# 1. Create the service account
curl -X POST https://yourstack.grafana.net/api/serviceaccounts \
-H "Authorization: Bearer <admin-token>" \
-H "Content-Type: application/json" \
-d '{"name": "terraform-provisioner", "role": "Admin", "isDisabled": false}'
# 2. Mint a token for it
curl -X POST https://yourstack.grafana.net/api/serviceaccounts/{id}/tokens \
-H "Authorization: Bearer <admin-token>" \
-H "Content-Type: application/json" \
-d '{"name": "ci-token", "secondsToLive": 0}'
# 3. Verify the token works (test on a harmless endpoint)
curl https://yourstack.grafana.net/api/org \
-H "Authorization: Bearer <new-token>"
# 200 + org JSON → token works. Anything else → re-check role assignment in step 1.
```
Provisioning equivalent (YAML, declarative):
```yaml
# provisioning/access-control/service_accounts.yaml
apiVersion: 1
serviceAccounts:
- name: alloy-writer
orgId: 1
role: Editor
tokens:
- name: alloy-token
```
## References
- [`references/sso.md`](references/sso.md) — OAuth / SAML / GitHub OAuth config + the 5-step SSO verification pattern + common failure modes
- [`references/terraform.md`](references/terraform.md) — Terraform provider config + common resource patterns (teams, users, folders, dashboards) + drift troubleshooting
- [`references/api-reference.md`](references/api-reference.md) — full Cloud API + Stack API endpoint reference + audit-log queries
© grafana · Apache-2.0 · grafana/skills