Qlik Cloud管理MCP服务器

一个本地模型上下文协议(MCP)服务器,将Claude Desktop连接到Qlik Cloud租户以执行管理操作,提供扩展性、治理和身份验证功能。

  • by mabaeyens
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 mabaeyens/qlik-cloud-admin-mcp

使用说明

Qlik云管理MCP服务器

仅供演示和实验使用。 本项目按原样提供,以说明概念。它还没有准备好生产, Qlik不提供官方支持,也不提供任何形式的保修。 任何使用此代码的人都要自行承担风险,并负责测试 并在使用前在自己的环境中进行验证。


这是什么

本地人 模型上下文协议 连接的(MCP)服务器 将Claude Desktop转移到Qlik Cloud租户进行管理操作。

Claude Desktop -> MCP server (this project) -> Qlik Cloud REST API
                        ^
                        └── signed in as YOU, with your own permissions

它展示了三件事:

  1. 可扩展性 -Qlik Cloud公开了一个丰富的REST API。通过将其封装在MCP服务器中, 任何管理操作都可以在Claude Desktop中作为自然语言对话使用。

  2. 治理 -MCP工具可以对业务规则进行编码。此服务器显示了一个具体示例: 删除资源并不会将其硬删除。相反,它会将其移动到“回收站” 共享空间,为管理员提供恢复窗口。删除空格被完全阻止 重定向到Qlik云管理控制台。

  3. 身份 -服务器充当使用它的人,而不是管理员服务帐户。

这台服务器补充了官方 Qlik MCP服务器, 其涵盖分析操作。这一部分涵盖了管理和治理操作 官方服务器今天没有公开。


权限

此服务器充当使用它的人。 首次使用时,您可以在您的 浏览器,服务器发出的每个请求都带有您自己的身份。如果您无法打开 应用程序、空间或Qlik中心中的数据加载编辑器,您也不能在这里完成。

没有办法提升,这是结构性的,而不是政策:

  • 正在运行的进程中唯一的凭据是访问令牌,其主题是您。
  • OAuth客户端是 公共 -不存在可泄露或共享的客户端机密,因此您的 机器可以为另一个身份铸造一个令牌。
  • 只有 user_default 和 offline_access 范围总是被要求的。不 admin.* 范围是 可通过配置或其他方式请求。
  • 代码库中没有API密钥、客户端证书授予和模拟授予。
  • A. 403 被报告为许可结果。不会对不同的身份进行重试, 因为没有其他身份。

值得了解的后果:两个用户对“有多少应用程序”的答案不同 在那里”,退出其他人的应用程序需要管理员登录。

凭证端点(/api/v1/api-keys, /api/v1/oauth-clients, /api/v1/oauth-tokens, /oauth/*)在发送请求之前被工具拒绝。不是因为他们会升级 任何东西,但持久的凭证都不能被铸造并反映到聊天记录中。


需求

  • 紫外线 安装在您的计算机上
  • 租户上的Qlik Cloud帐户
  • 来自Qlik管理员的租户URL和公共OAuth客户端id(见下文)
  • Claude 桌面版

qlik-cli是 不 必修的。早期版本对它进行了抨击;这个与REST对话 API直接。


设置

管理员:注册OAuth客户端(一次)

创建一个 本土的 整个团队的(桌面)公共OAuth客户端。如果管理层 Console不提供本机选项,请通过API创建本机选项:

curl -X POST "https://<tenant>/api/v1/oauth-clients" \
  -H "Authorization: Bearer <admin token>" \
  -H "Content-Type: application/json" \
  -d '{"clientName":"Qlik Cloud Admin MCP",
       "description":"Local MCP server. Each user signs in as themselves.",
       "appType":"native",
       "redirectUris":["http://localhost/callback"],
       "allowedScopes":["user_default","offline_access"]}'
  • 做 不 发送 allowedGrantTypes 或 allowedAuthMethods:API拒绝 appType: native,并且赠款是隐含的。
  • 重定向URL: http://localhost/callback -正是这个主机和路径。Qlik比赛 方案、主机和路径完全正确,但 忽略端口,因此一个条目涵盖了每个用户 每次跑步。 127.0.0.1 不是的别名 localhost 在这里。
  • 范围: user_default 和 offline_access 只有。同意 admin.* 或 admin_classic 将打破许可模式;服务器从不请求它们。
  • 不设置同意方法。然后,用户在上看到Qlik“授权此应用程序”屏幕 第一个登录,这是本设计想要的授权步骤。
  • 没有发布客户端密钥,也不需要。为用户提供客户端id和租户URL。

参考: 创建OAuth客户端 和那个 OAuth客户端API.

用户:安装并登录

1.安装uv

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

2.下载此存储库

git clone https://github.com/mabaeyens/qlik-cloud-admin-mcp.git
cd qlik-cloud-admin-mcp

3.配置

copy .env.example .env

填写管理员给你的两个值。也不是秘密:

QLIK_TENANT_URL=https://your-tenant.eu.qlikcloud.com
QLIK_OAUTH_CLIENT_ID=your_public_client_id

4.创建回收站空间

在Qlik Cloud中,创建一个 共享空间 准确命名 Recycle Bin.删除工具移动 应用程序、自动化和数据文件,而不是硬删除它们。

然后 将每个将退役内容的用户添加为具有编辑权限的成员.能够 看到空间不够,做租户管理员也不够:移动内容 进入共享空间需要该空间中的贡献者角色,因此没有角色的租户管理员 有一个403。以管理员身份创建空间,或授予管理员对该空间的完全权限 之后。

5.配置克劳德桌面

打开 %APPDATA%\Claude\claude_desktop_config.json 并在里面添加下面的块 mcpServers,将路径替换为您克隆存储库的位置。

{
  "mcpServers": {
    "qlik-cloud-admin": {
      "command": "uv",
      "args": ["--directory", "C:/path/to/qlik-cloud-admin-mcp", "run", "server.py"],
      "env": {
        "QLIK_TENANT_URL": "https://your-tenant.eu.qlikcloud.com",
        "QLIK_OAUTH_CLIENT_ID": "your_public_client_id"
      }
    }
  }
}

6.重新启动克劳德桌面并登录

完全退出并重新打开Claude Desktop。然后让克劳德帮你登录,这会给你打电话 qlikcloud_login。您的浏览器打开,Qlik要求您 授权此应用程序 - 批准它。同意屏幕是您授予服务器作为您的 账户每个帐户显示一次。然后标签告诉你关闭是安全的。

跑 qlikcloud_health 确认您以哪个帐户登录。

若要切换帐户,请要求以其他帐户登录-- qlikcloud_login 随着 switch_account=True 使Qlik询问要使用哪个帐户,而不是默默地重复使用任何帐户 您的浏览器已具有会话。没有它,浏览器中的实时Qlik会话会为您签名 直接回到同一个账户。

7.设置系统提示(如果同时使用官方Qlik MCP服务器,建议)

如果您同时拥有此服务器和 官方Qlik MCP服务器 连接后,创建一个Claude Desktop项目并添加以下系统提示,这样Claude总是更喜欢官方服务器进行分析操作:

当官方Qlik MCP服务器和Qlik云管理员都连接时,总是更喜欢官方Qlik-MCP工具进行分析操作(打开应用程序、搜索字段、列表表、阅读应用程序内容)。仅将qlik云管理工具用于官方服务器未涵盖的管理和治理操作。


用法

工具 说明
qlikcloud_login 以自己的身份在浏览器中登录Qlik Cloud
qlikcloud_logout 注销、撤销令牌并删除存储的会话
qlikcloud_health 租户、登录身份、角色、存储后端、令牌到期
qlikcloud_get 读取任何Qlik Cloud REST端点(fetch_all=True 跟随分页)
qlikcloud_delete 强制执行治理规则后删除(见下文)
qlikcloud_assistant_chat 向Qlik Answers助手发送消息并获得回复

六种工具,以及 qlikcloud_get 这是唯一的阅读方式。当官方Qlik MCP服务器覆盖 操作(打开应用程序、搜索字段、列出工作表)更喜欢这些工具。

为什么没有通用的POST、PUT或PATCH。 它们在v0.4.0中被删除。一个模特拿着 针对整个租户的无限制书写动词是一个很大的爆炸半径,但收益很小,并且 任何值得写的东西都值得一个专门构建的工具,它可以说它将要改变什么 先问——这是什么 qlikcloud_delete 做。保持表面小还有第二个问题 好处:配给工具模式的MCP客户端开始将它们隐藏在搜索后足够一次 服务器已连接,隐藏的读取工具是模型可以推断不存在的工具。

分页

Qlik列表端点一次返回一页。通过 fetch_all=True 到 qlikcloud_get 当 您需要一个完整的列表或计数:

qlikcloud_get(path = "/api/v1/spaces", fetch_all = True, max_pages = 10)

合并后的结果报告 pageCount, itemCount,以及 truncated如果达到上限, truncatedReason 上面写着——这份名单永远不会被默默地缩短。请注意,“完整”是指 为您完成:结果已经过滤到您的帐户可以看到的内容。

qlikcloud_assistant_chat

使用对话上下文查询Qlik Answers助手。第一次通话时,省略 thread_id 并且自动创建新线程。通过返回 thread_id 关于后续电话 继续谈话。

qlikcloud_assistant_chat(
    assistant_id = "abc123",   # from /api/v1/assistants
    message     = "What were total sales last quarter?",
    thread_id   = None         # omit on first call; reuse on follow-ups
)

qlikcloud_delete中的治理规则

  • 应用 -移动到“回收站”共享空间,从未硬删除。
  • 自动化 -移动到“回收站”共享空间,从未硬删除。
  • 数据文件 -移动到“回收站”共享空间,从未硬删除。
  • 回收站中已有的任何内容 -拒绝。见下文。
  • 空间 -封锁。必须在Qlik云管理控制台中手动删除。
  • 所有其他资源类型 -此工具不支持。

回收站是一扇单向门。 通过此操作无法永久删除任何内容 服务器,回收站中的任何内容都会被彻底拒绝——对于每个用户、租户 管理员包括在内。清空回收站是在Qlik Cloud活动中心手工完成的 中心。没有工具、标志或路径可以覆盖此内容: qlikcloud_delete 是唯一的 这个工具可以删除任何东西,它所做的就是移动。

这些规则是以你自己的权利运行的:你只能退役你被允许移动的资源, 您必须能够看到回收站空间 和 拥有编辑权限。如果是 不是真的,工具这么说,什么也不动。停用另一个人的应用程序是一种管理操作, 由登录的管理员执行。


同伴技能:模型考古学

skills/qlik-model-archaeology/ 是克劳德的一项技能,可以将这些工具转化为工作流程 理解一个文档糟糕的应用程序:绘制数据模型,找出什么 DATE3 和 COS 实际上是指根据术语表、谱系和脚本证据,并生成一个数据字典。

在Claude寻找技能的地方复制或符号链接它来安装它:

mkdir -p ~/.claude/skills
ln -s "$PWD/skills/qlik-model-archaeology" ~/.claude/skills/qlik-model-archaeology

它与上面列出的工具一起工作,无需额外设置,因为它所依赖的证据是全部 可通过REST访问。其核心规则是 检索到的 答案(一个经过验证的术语表术语 源列名)的报告方式与 推断 一,“我无法确定 当证据不存在时,“问这位管家”是一个有效且首选的答案。

API路径格式

路径是普通的Qlik Cloud REST路径:

/api/v1/spaces
/api/v1/users/me
/api/v1/apps/{appId}

参考:https://qlik.dev/apis/rest/

较旧的qlik-cli简写(v1/spaces,没有 /api)仍被接受,因此提示 为v0.2.x编写的继续工作。


故障排除

跑 qlikcloud_health 首先:它报告租户、登录身份、会话所在地 当令牌刷新时。

症状 检查
“未登录” 运行 qlikcloud_login
浏览器未打开 登录工具打印登录URL-将其粘贴到浏览器中
redirect_uri is not registered 客户需要 http://localhost/callback 已注册-确切的主机和路径,端口无关。 127.0.0.1 不匹配 localhost
Console将不接受本地主机重定向URL 通过带有的API创建客户端 appType: "native" (请参阅管理部分)
以错误帐户登录 qlikcloud_login 随着 switch_account=True -它迫使Qlik询问要使用哪个帐户
403关于你期望工作的事情 你的帐户缺乏权限。在集线器中检查它-服务器无法提升
403在管理控制台页面上显示,即使是作为租户管理员 也应如此。令牌只携带 user_default 范围,因此管理员分类的端点(许可证、角色、加密密钥)对每个人都被拒绝。使用管理控制台
会话结束时间早于预期 客户端可能无法授予 offline_access,因此不会发出刷新令牌。让管理员添加作用域
会话存储显示“文件”而不是“操作系统密钥链” 此主机上没有可用的密钥链。刷新令牌位于0600文件中
连接器在Claude Desktop中显示为失败 检查Claude Desktop MCP日志;此服务器登录到stderr

会话存储的位置

刷新令牌进入操作系统密钥链(macOS密钥链、Windows凭据管理器、密码 Linux上的服务),当其中一个可用时 0600 文件下 ~/.config/qlik-cloud-admin-mcp/ 否则。非秘密元数据(哪个帐户处于活动状态) 居住于 sessions.json 无论哪种方式,都在那个目录中。

要完全重置,请执行以下操作: qlikcloud_logout(all_accounts=True),或删除该目录和 qlik-cloud-admin-mcp 钥匙链条目。


从v0.2.x升级

v0.3.0更改了身份模型。以前,服务器的每个用户都充当租户 配置了API密钥的管理员;现在每个用户都像自己一样。

  1. 管理员: 注册公共OAuth客户端(请参阅设置)并分发租户URL和 客户端id。
  2. 每位用户: 替换 QLIK_API_KEY 在 .env -和in claude_desktop_config.json,如果 设置在那里-与 QLIK_OAUTH_CLIENT_ID,并设置 QLIK_TENANT_URL.
  3. 重新启动Claude Desktop,运行 qlikcloud_login那么 qlikcloud_health.
  4. 管理员:撤销旧的tenant-Admin API密钥。 没有人再使用它了,还有一个实时管理员 没有消费者的关键是纯粹的风险。
  5. 如果您不是管理员,预计结果会比v0.2.0更窄。这就是 改变,而不是bug。
  6. qlik-cli可以保持安装状态;这里再也没有什么东西碰它了。

发展

uv sync                 # install dependencies, including the dev group
uv run pytest           # unit tests, no network access needed
uv run server.py        # run the server directly (stdio transport)

设计文件在 specs/ (未发表)。本自述中的每一条行为规则都是 在测试的支持下 tests/.


更新日志

看 更改日志.md 发布说明。


许可证

麻省理工学院