Skip to main content
Glama
yingcaihuang

authentik-aws-mcp

by yingcaihuang
README.md
# authentik-aws-mcp

用于通过 `https://authsso.verycloud.cn/api/v3/` 管理 authentik 的 MCP Server。

支持:

- 列出组
- 添加组
- 创建用户
- 删除用户
- 批量删除用户
- 列出用户
- 禁用/启用用户
- 用户存在则更新,不存在则创建(upsert)
- 在组中添加用户
- 从组中移除用户
- 同步用户组(merge/replace)
- 默认开通用户(创建用户并加入默认组)
- 一句话开通并自动加组(组不存在自动创建,返回随机密码)
- 批量一句话开通(批量创建并加入同组)
- 重置用户密码(支持自动生成随机密码并返回)
- 批量重置用户密码(支持 email/username/user_pk 混合输入)
- 强制重置并尝试发送邮件通知
- 查看最近事件(Recent events)
- 最近一周登录与授权时间序列(Logins and authorizations,按时间桶聚合)
- 最近安全统计概览(一次输出上面两个维度)
- 列出应用(Applications,附带绑定的 Provider 概要)
- 查看单个应用详情(含绑定 Provider)
- 列出提供程序(Providers,含类型与所属应用)
- 查看应用及其绑定的 Provider 详细信息
- 获取 OAuth2/OpenID Provider 完整配置(client_id/secret、回调地址、scope、OIDC 端点)

服务脚本:`authentik-aws-mcp.mjs`

---

## 1) 安装依赖

在项目目录执行:

```bash
npm init -y
npm i @modelcontextprotocol/sdk zod
npm pkg set type=module
```

---

## 2) MCP 配置示例(token 从 JSON 传入)

将以下配置加入你的 MCP 客户端配置文件:

```json
{
  "mcpServers": {
    "authentik-aws": {
      "command": "node",
      "args": [
        "/Users/betty/Downloads/authentik-mcp-for-aws-quick/authentik-aws-mcp.mjs"
      ],
      "env": {
        "AUTHENTIK_BASE_URL": "https://authsso.verycloud.cn/api/v3",
        "AUTHENTIK_TOKEN": "<你的token>",
        "AUTHENTIK_DEFAULT_GROUPS": "aws-users,developers",
        "AUTHENTIK_PASSWORD_MIN_LENGTH": "12"
      }
    }
  }
}
```

### 环境变量说明

- `AUTHENTIK_TOKEN`:**必填**,authentik API token
- `AUTHENTIK_BASE_URL`:可选,默认 `https://authsso.verycloud.cn/api/v3`
- `AUTHENTIK_DEFAULT_GROUPS`:可选,默认开通用户时加入的组(逗号分隔)
- `AUTHENTIK_PASSWORD_MIN_LENGTH`:可选,密码最小长度,默认 `12`

---

## 3) 输入校验规则

创建用户/默认开通时要求:

- `username`:3-64 位,允许 `字母/数字/._-`
- `name`:显示名,1-128 字符
- `email`:合法邮箱格式
- `password`:满足复杂度:
  - 长度 >= `AUTHENTIK_PASSWORD_MIN_LENGTH`
  - 包含大写、小写、数字、特殊字符

---

## 4) 工具与使用示例

> 以下为工具参数示例(在 MCP 客户端里调用时使用对应 JSON)。

### 4.1 `list_groups`

```json
{
  "search": "aws",
  "page": 1,
  "page_size": 50
}
```

### 4.2 `create_group`

```json
{
  "name": "aws-readonly",
  "is_superuser": false,
  "if_not_exists": true
}
```

### 4.3 `create_user`

```json
{
  "username": "zhangsan",
  "name": "张三",
  "email": "zhangsan@example.com",
  "password": "Aa123456!@#",
  "is_active": true,
  "if_not_exists": true
}
```

### 4.4 `delete_user`

删除用户,支持按 `email` / `username` / `user_pk`。

方式 A:按邮箱删除(推荐)

```json
{
  "email": "dev@qq.com",
  "if_not_exists": true
}
```

方式 B:按用户名删除

```json
{
  "username": "dev",
  "if_not_exists": true
}
```

方式 C:按 user_pk 删除

```json
{
  "user_pk": 123,
  "if_not_exists": true
}
```

### 4.5 `add_user_to_group`

方式 A(用户名 + 组名):

```json
{
  "username": "zhangsan",
  "group_name": "aws-readonly"
}
```

方式 B(邮箱 + 组名):

```json
{
  "email": "zhangsan@example.com",
  "group_name": "aws-readonly"
}
```

方式 C(user_pk + group_pk):

```json
{
  "user_pk": 123,
  "group_pk": "f6d8a1d2-xxxx-xxxx-xxxx-1a2b3c4d5e6f"
}
```

### 4.6 `provision_user_default`

使用默认组(来自 `AUTHENTIK_DEFAULT_GROUPS`):

```json
{
  "username": "lisi",
  "name": "李四",
  "email": "lisi@example.com",
  "password": "Aa123456!@#"
}
```

### 4.7 `quick_add_user_to_group`(推荐:一句话开通)

场景:你希望一句话完成“如果组不存在就创建、再创建用户、并自动加到组里、最后返回随机密码”。

示例(你的场景):

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

行为说明:

- `awsv1` 不存在:自动创建(不提示“组不存在”)
- 用户不存在:创建用户并加入组
- 用户存在:提示“用户已存在”,并确保用户在组内
- 新建用户时:返回 `generated_password`

可选传参(覆盖默认用户名/显示名):

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1",
  "username": "dev",
  "name": "Dev User"
}
```

### 4.8 `reset_user_password`

重置用户密码,支持指定密码或自动随机生成。

方式 A:按邮箱重置并自动生成随机密码(推荐)

```json
{
  "email": "dev@qq.com"
}
```

方式 B:按用户名并指定新密码

```json
{
  "username": "dev",
  "password": "Aa123456!@#"
}
```

方式 C:按 `user_pk`

```json
{
  "user_pk": 123
}
```

### 4.9 `force_reset_password_and_notify`

强制重置密码,并尝试调用 authentik 邮件通知端点发送通知。

示例 A:按邮箱重置并通知(不强制邮件一定成功)

```json
{
  "email": "dev@qq.com"
}
```

示例 B:要求“邮件必须发送成功”,否则报错

```json
{
  "email": "dev@qq.com",
  "require_email_success": true
}
```

示例 C:指定密码并通知

```json
{
  "username": "dev",
  "password": "Aa123456!@#",
  "require_email_success": false
}
```

返回说明:

- `reset`:密码是否重置成功
- `notify.ok`:邮件通知是否成功
- `notify.endpoint`:成功使用的通知端点
- `notify.errors`:通知失败时,各尝试端点的错误
- `new_password`:新密码(请妥善保存)

### 4.10 `list_users`

列出用户,支持搜索、分页、按组过滤。

```json
{
  "search": "dev",
  "group_name": "awsv1",
  "page": 1,
  "page_size": 50
}
```

### 4.11 `disable_user` / `enable_user`

禁用用户:

```json
{
  "email": "dev@qq.com"
}
```

启用用户:

```json
{
  "email": "dev@qq.com"
}
```

### 4.12 `remove_user_from_group`

把用户从组中移除:

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

### 4.13 `bulk_quick_add_users_to_group`

批量开通并加入同一组(组不存在自动创建):

```json
{
  "group_name": "awsv1",
  "users": [
    { "email": "dev1@qq.com", "username": "dev1", "name": "Dev 1" },
    { "email": "dev2@qq.com", "username": "dev2", "name": "Dev 2" }
  ],
  "continue_on_error": true
}
```

返回中会同时包含:
- `generated_password`:明文密码
- `generated_password_b64`:Base64 密码(用于避免聊天/表格转义导致复制错误)

### 4.14 `bulk_delete_users`

批量删除用户(支持 `email` / `username` / `user_pk`,支持不存在跳过):

```json
{
  "users": [
    { "email": "dev1@qq.com" },
    { "username": "dev2" },
    { "user_pk": 123 }
  ],
  "if_not_exists": true,
  "continue_on_error": true
}
```

### 4.15 `upsert_user`

用户存在则更新,不存在则创建:

```json
{
  "username": "dev",
  "name": "Dev User",
  "email": "dev@qq.com",
  "is_active": true
}
```

更新时顺便重置密码:

```json
{
  "username": "dev",
  "name": "Dev User",
  "email": "dev@qq.com",
  "password": "Aa123456!@#",
  "reset_password_on_update": true
}
```

### 4.16 `sync_user_groups`

同步用户组(`merge` 并集 / `replace` 完全替换):

```json
{
  "email": "dev@qq.com",
  "groups": ["awsv1", "developers"],
  "mode": "replace",
  "create_missing_groups": true
}
```

### 4.17 `bulk_reset_password`

批量重置密码(支持混合输入):

```json
{
  "users": [
    { "email": "admin1@qq.com" },
    { "username": "admin2" },
    { "user_pk": 123 }
  ],
  "continue_on_error": true
}
```

每个成功项会返回:
- `new_password`
- `new_password_b64`

`provision_user_default` 调用时指定组示例:

```json
{
  "username": "wangwu",
  "name": "王五",
  "email": "wangwu@example.com",
  "password": "Aa123456!@#",
  "groups": ["aws-users", "aws-admin"],
  "create_missing_groups": true
}
```

### 4.18 `list_recent_events`

查看最近事件(按时间倒序),可按 `action` / `actions` / `username` 过滤:

```json
{
  "actions": ["login", "authorize_application"],
  "username": "dev",
  "limit": 20,
  "page": 1
}
```

返回中每条事件包含:`action`、`user`、`app`、`client_ip`、`created`、`brand`、`context`。

### 4.19 `get_logins_authorizations_volume`

统计最近一周(默认 7 天)的登录与授权事件量,后端按小时聚合并对齐到时间桶:

```json
{
  "history_days": 7,
  "actions": ["login", "authorize_application"]
}
```

返回 `timeseries`(每个时间桶含 `total` 和 `by_action`)与 `summary`(`grand_total`、`by_action`、`bucket_count`)。

> 说明:authentik 面板卡片标签写的是 "per 8 hours",但后端 `volume` 接口实际按小时聚合后对齐到时间桶。本工具直接使用接口返回的 `time` 字段,不自行改动粒度,保证与 authentik 一致。

### 4.20 `get_security_overview`(最近安全统计,推荐)

一次调用同时输出两个维度:最近事件 + 最近一周登录/授权时间序列。适合"我想查看一下最近的安全统计"这类需求:

```json
{
  "history_days": 7,
  "recent_limit": 20
}
```

返回结构:

- `recent_events`:最近事件列表
- `logins_and_authorizations`:时间序列 + 汇总

参数均可选,不传则使用默认值(7 天、20 条、`login` + `authorize_application`)。

### 4.21 `list_applications`

列出应用,每个应用附带绑定的 Provider 概要:

```json
{
  "search": "aws",
  "limit": 50,
  "page": 1
}
```

每个应用返回:`name`、`slug`、`provider_pk`、`provider`(类型/名称/流程)、`launch_url` 等。

### 4.22 `get_application`

按 slug 或名称查看单个应用详情(含绑定 Provider 完整信息):

```json
{
  "slug": "newapi"
}
```

或按名称:

```json
{
  "name": "newapi"
}
```

### 4.23 `list_providers`

列出所有 Provider,含类型(`component`,如 `oauth2provider`/`saml-provider`)与所属应用:

```json
{
  "search": "newapi",
  "limit": 100
}
```

只看未绑定任何应用的 Provider:

```json
{
  "unassigned_only": true
}
```

### 4.24 `get_application_with_provider`(应用 + 绑定 Provider 详情)

输入应用 slug 或名称,返回应用信息 + 绑定 Provider(类型与流程)的详细信息:

```json
{
  "name": "newapi"
}
```

### 4.25 `get_oauth2_provider_config`(OAuth2 完整配置)

获取 OAuth2/OpenID Provider 的完整配置。三种定位方式任选其一:

方式 A:直接传 Provider 数字 PK

```json
{
  "provider_id": 22
}
```

方式 B:传应用 slug(自动解析该应用绑定的 Provider)

```json
{
  "application_slug": "newapi"
}
```

方式 C:传应用名称

```json
{
  "application_name": "newapi"
}
```

返回内容:

- `provider`:`client_id`、`client_secret`、`redirect_uris`(回调地址)、`signing_key`、`sub_mode`、各类 token 有效期、流程等
- `scopes`:把 property mapping ID 解析为 scope 名称(如 openid/email/profile)+ description
- `oidc_endpoints`:issuer/authorize/token/user_info/jwks/logout 等 URL

> ⚠️ 注意:返回内容包含 `client_secret` 等敏感凭证,请仅在安全渠道使用。
>
> 可选参数:`include_setup_urls`(默认 true)、`resolve_scopes`(默认 true),需要极简输出时可分别关闭。

---

## 5) 自检

```bash
node --check authentik-aws-mcp.mjs
```

---

## 6) 所有 MCP 调用方法总览(可直接复制给大模型)

下面给你每个工具的两种调用方式:

- **自然语言口令**:你在对话里直接发给大模型
- **参数 JSON**:大模型实际调用工具时使用的参数

### 6.1 `list_groups`

自然语言:

> 请调用 `list_groups`,搜索 `aws`,第 1 页,每页 50 条。

参数 JSON:

```json
{
  "search": "aws",
  "page": 1,
  "page_size": 50
}
```

### 6.2 `create_group`

自然语言:

> 帮我创建组 `awsv1`,已存在就跳过。

参数 JSON:

```json
{
  "name": "awsv1",
  "is_superuser": false,
  "if_not_exists": true
}
```

### 6.3 `create_user`

自然语言:

> 创建用户 dev(显示名 Dev,邮箱 dev@qq.com),密码 Aa123456!@#,已存在就跳过。

参数 JSON:

```json
{
  "username": "dev",
  "name": "Dev",
  "email": "dev@qq.com",
  "password": "Aa123456!@#",
  "is_active": true,
  "if_not_exists": true
}
```

### 6.4 `delete_user`

自然语言:

> 删除用户 dev@qq.com;如果不存在就直接跳过,不要报错。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "if_not_exists": true
}
```

### 6.5 `add_user_to_group`

自然语言:

> 把用户 dev@qq.com 加入 awsv1 组。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

### 6.6 `provision_user_default`

自然语言:

> 默认开通用户:dev01(Dev 01,dev01@qq.com),密码 Aa123456!@#,并加入默认组。

参数 JSON:

```json
{
  "username": "dev01",
  "name": "Dev 01",
  "email": "dev01@qq.com",
  "password": "Aa123456!@#"
}
```

### 6.7 `quick_add_user_to_group`(一句话开通推荐)

自然语言:

> 帮我添加 dev@qq.com 到 awsv1 组;如果组不存在就自动创建;如果用户不存在就创建并返回随机密码。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

### 6.8 `reset_user_password`

自然语言:

> 帮我重置 dev@qq.com 的密码,并返回新密码。

参数 JSON:

```json
{
  "email": "dev@qq.com"
}
```

返回中同时包含:
- `new_password`
- `new_password_b64`

若你怀疑复制时被转义,建议优先使用 b64 还原。

### 6.9 `force_reset_password_and_notify`

自然语言:

> 强制重置 dev@qq.com 的密码并发送通知邮件,邮件必须成功。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "require_email_success": true
}
```

### 6.10 `list_users`

自然语言:

> 列出 awsv1 组里的用户,搜索 dev,第 1 页每页 50 条。

参数 JSON:

```json
{
  "search": "dev",
  "group_name": "awsv1",
  "page": 1,
  "page_size": 50
}
```

### 6.11 `disable_user`

自然语言:

> 禁用用户 dev@qq.com。

参数 JSON:

```json
{
  "email": "dev@qq.com"
}
```

### 6.12 `enable_user`

自然语言:

> 启用用户 dev@qq.com。

参数 JSON:

```json
{
  "email": "dev@qq.com"
}
```

### 6.13 `remove_user_from_group`

自然语言:

> 把 dev@qq.com 从 awsv1 组移除。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

### 6.14 `bulk_quick_add_users_to_group`

自然语言:

> 批量开通 dev1@qq.com 和 dev2@qq.com 到 awsv1,组不存在自动创建。

参数 JSON:

```json
{
  "group_name": "awsv1",
  "users": [
    { "email": "dev1@qq.com", "username": "dev1", "name": "Dev 1" },
    { "email": "dev2@qq.com", "username": "dev2", "name": "Dev 2" }
  ],
  "continue_on_error": true
}
```

### 6.15 `bulk_delete_users`

自然语言:

> 批量删除 dev1@qq.com、dev2 和 user_pk=123,不存在就跳过。

参数 JSON:

```json
{
  "users": [
    { "email": "dev1@qq.com" },
    { "username": "dev2" },
    { "user_pk": 123 }
  ],
  "if_not_exists": true,
  "continue_on_error": true
}
```

### 6.16 `upsert_user`

自然语言:

> upsert 用户 dev@qq.com:存在就更新,不存在就创建。

参数 JSON:

```json
{
  "username": "dev",
  "name": "Dev User",
  "email": "dev@qq.com",
  "is_active": true
}
```

### 6.17 `sync_user_groups`

自然语言:

> 把 dev@qq.com 的组同步为 awsv1 和 developers(replace 模式,不在列表里的组都移除)。

参数 JSON:

```json
{
  "email": "dev@qq.com",
  "groups": ["awsv1", "developers"],
  "mode": "replace",
  "create_missing_groups": true
}
```

### 6.18 `bulk_reset_password`

自然语言:

> 批量重置 admin1@qq.com 到 admin10@qq.com 的密码,并返回每个人的新密码和 b64。

参数 JSON:

```json
{
  "users": [
    { "email": "admin1@qq.com" },
    { "email": "admin2@qq.com" },
    { "email": "admin3@qq.com" }
  ],
  "continue_on_error": true
}
```

### 6.19 `list_recent_events`

自然语言:

> 看一下最近的登录和授权事件,最多 20 条。

参数 JSON:

```json
{
  "actions": ["login", "authorize_application"],
  "limit": 20
}
```

### 6.20 `get_logins_authorizations_volume`

自然语言:

> 统计最近一周的登录和授权量。

参数 JSON:

```json
{
  "history_days": 7
}
```

### 6.21 `get_security_overview`(最近安全统计推荐)

自然语言:

> 我想查看一下最近的安全统计。

参数 JSON:

```json
{}
```

会一次性返回最近事件与最近一周登录/授权时间序列两个维度。

### 6.22 `list_applications`

自然语言:

> 列出所有应用,把每个应用绑定的 Provider 也一起显示。

参数 JSON:

```json
{}
```

### 6.23 `get_application`

自然语言:

> 查看应用 newapi 的详情,包括它绑定的 Provider。

参数 JSON(按 slug):

```json
{
  "slug": "newapi"
}
```

或按名称:

```json
{
  "name": "newapi"
}
```

### 6.24 `get_application_with_provider`

自然语言:

> 查看应用 newapi 绑定了哪个 Provider,给我详细信息。

参数 JSON:

```json
{
  "name": "newapi"
}
```

### 6.25 `list_providers`

自然语言:

> 列出所有 Provider,告诉我每个的类型和所属应用。

参数 JSON:

```json
{}
```

### 6.26 `get_oauth2_provider_config`

自然语言:

> 帮我拉取应用 newapi 的 OAuth2 完整配置,包括 client_id、回调地址和 scope。

参数 JSON(用应用 slug,推荐;不用记数字 PK):

```json
{
  "application_slug": "newapi"
}
```

或直接用 Provider 数字 PK:

```json
{
  "provider_id": 22
}
```

返回 `client_id` / `client_secret` / `redirect_uris` / `scopes` / `oidc_endpoints`。⚠️ 含敏感凭证。

### 6.27 通用对话模板(推荐)

你可以固定这样对大模型说:

> 使用 `authentik-aws` MCP 完成:
> 1) 工具名:`<tool_name>`
> 2) 参数:`<json>`
> 3) 输出要求:返回关键结果(用户、组、密码、是否成功)

示例:

> 使用 `authentik-aws` MCP,调用 `quick_add_user_to_group`,参数 `{ "email": "dev@qq.com", "group_name": "awsv1" }`,返回用户、组和生成密码。

---

## 7) 常见问题

### 启动时报 `Missing AUTHENTIK_TOKEN`

说明 MCP JSON 的 `env` 没传 `AUTHENTIK_TOKEN`,或变量名写错。

### 创建用户报密码复杂度不满足

请确认密码同时包含:大写、小写、数字、特殊字符,并且长度达到最小值。

### 加组报未找到组

先调用 `create_group`,或在 `provision_user_default` 里传 `create_missing_groups: true`。

### 我想一句话开通用户到组,还要随机密码

请直接调用 `quick_add_user_to_group`,例如:

```json
{
  "email": "dev@qq.com",
  "group_name": "awsv1"
}
```

### 我想重置密码并拿到新密码

调用 `reset_user_password`,如果不传 `password`,系统会自动生成随机复杂密码并返回。

### 我想“重置密码 + 发通知邮件”一步完成

调用 `force_reset_password_and_notify`。

如果你要求“邮件必须成功才算成功”,请传:

```json
{
  "email": "dev@qq.com",
  "require_email_success": true
}
```

### 创建后提示密码不对怎么办

请直接调用 `reset_user_password` 重新设置一次,并使用返回的 `new_password` 登录。

示例:

```json
{
  "email": "dev@qq.com"
}
```

### 我想查看最近的安全统计

直接说"我想查看一下最近的安全统计"即可,大模型会调用 `get_security_overview`,一次返回最近事件和最近一周登录/授权时间序列两个维度。

如果只想看其中一个维度,可分别调用 `list_recent_events` 或 `get_logins_authorizations_volume`。

### 批量创建后密码登录失败怎么办

优先排查是否“复制时被转义/变形”:

1. 使用结果里的 `generated_password_b64`(或 `new_password_b64`)进行还原后再登录
2. 若仍失败,直接调用 `reset_user_password` 重新生成一次密码再试

Node 本地还原示例:

```bash
node -e "console.log(Buffer.from('这里放b64','base64').toString('utf8'))"
```