内容
# SpiceDB MCP-Server
这是一个高度实验性的模型上下文协议服务器,允许您的 LLM 使用 [SpiceDB](https://github.com/authzed/spicedb) 来回答与访问和事前审计相关的问题(如 NIST 在 [这份 PDF](https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-162.pdf) 第 3.1.2.3 节中定义的)。它使用 Docker Compose 启动一个示例的 SpiceDB 环境,然后在后台使用 MCP-C#-SDK 和 SpiceDB-C#-SDK 调用 `LookupSubjects`、`LookupResources`、`ReadRelationships` 和 `CheckBulkPermissions`。我使用 Claude Desktop 作为 MCP 客户端,因此您也需要在那儿注册一个(免费的)账户,或者使用其他客户端。
## 附带的博客文章
您可以在 [这里](https://www.innoq.com/en/articles/2025/04/journey-into-ai-mcp/) 找到附带的文章,带您了解实现过程,并总结了一些经验教训。文章底部还有一些关于 MCP 安全的更广泛的 [思考](https://www.innoq.com/en/articles/2025/04/journey-into-ai-mcp/#mythoughtsonmcpsecurity),您可能会觉得有趣。如果您想交流,请随时联系我。
## 它的功能
在这里,您可以看到使用 Claude Desktop 的输出示例(这是在开发过程中完成的,可能与最新的执行路径不符。不过,AI 的确定性并不总是得到保证,所以谁在乎呢 ;-) ):
### 表格视图:

### 图形视图:

## 运行代码
- 安装 .net 9
- `cd SpiceDB-MCP`,然后使用 `dotnet run` 启动代码一次。然后可以使用例如 ctrl+c 中断。
- 添加适当的配置以将 Claude Desktop 集成到服务器中。
### Claude 配置
您需要将 MCP 服务器集成到 Claude 中。在 MacOS 上,您需要在 `~/Library/Application\ Support/Claude/` 中创建一个名为 `claude_config.json` 的文件。如果该文件不存在,请创建它。然后发布/添加以下 JSON - 将路径更改为解决方案所在的位置,对我来说,例如是 `/Users/dguhr/git/dguhr/SpiceDB-MCP/SpiceDB-MCP`。
```json
{
"mcpServers": {
"spicedb": {
"command": "dotnet",
"args": [
"run",
"--project",
"/PATH/TO/SOLUTION",
"--no-build"
],
"env": {
"SPICEDB_PSK": "testkey"
}
}
}
}
```
> [!CAUTION]
> 目前该项目使用 `MCP C#-SDK v0.1.0-preview.2` NuGet 包。该包存在一个 bug(或者,也许是 Claude Desktop 客户端的问题 - 请参见我创建的 [Issue](https://github.com/modelcontextprotocol/csharp-sdk/issues/148)),因此生成的 dotnet 进程不会正确终止。因此,在使用后,您需要运行 `ps aux | grep dotnet` 或类似命令来杀死生成的 dotnet 进程。
### 启动本地 SpiceDB 环境与模型和架构
docker-compose.yaml 从 `bootstrap` 文件夹加载架构和测试关系,因此您只需运行:
```zsh
docker compose --env-file .env up -d
```
### 启动
启动 [Claude Desktop](https://claude.ai/download)(免费版本即可,但您需要一个账户)作为 MCP 客户端
(或者使用其他客户端,这就是好处所在 ;-))。
例如,您可以问以下问题:
* 谁可以访问文档 pay1?
* CTO 可以访问哪些文档?
* 谁可以访问 search2?
* smallteammember1 是否可以读取 smallprojectdoc3 和 smallprojectdoc1?
* 我想知道我公司里谁拥有什么权限访问什么以及为什么。请将其可视化为图形和表格。
请注意,尤其是对于最后一个问题,LLM 通常只想使用 ReadRelationships 和 GetSchema。
我尝试减轻这种行为,但它仍然使用得很多。任何描述上的改进都欢迎提出 ;-)
还要注意,有时它在创建基于 React 的图形时会遇到问题(当它使用 React 时)。不确定性万岁。
您当然可以创建更好的提示,告诉它使用哪个库等 - 我将这留给读者作为练习。
p.s. 请记住,这只是一个实验,因此模型可能并不完美。我没有投入太多思考。您可以通过更改 `bootstrap` 目录中 YAML 文件的内容来使用您的模型/关系。
### ZED CLI 使用
如果您想使用 zed,请在本地安装 zed - 请参见 [文档](https://authzed.com/docs/spicedb/getting-started/installing-zed)。
然后设置上下文:
`zed context set dev :50051 "testkey" --insecure`
然后使用它:
`zed context use dev`
并进行一些调用,例如获取架构:
`zed schema read`
或获取团队的所有成员:
`zed permission lookup-subjects team:smallprojectteam member user`
或获取所有可以访问文档的人:
`zed permission lookup-subjects document:pay1 view user`
或检查用户可以访问哪些文档:
`zed permission lookup-resources document view user:CTO`
### 更改代码并查看更改生效
如果您想基于此构建某些东西,请确保在更改后在您选择的控制台中运行 "dotnet run",
并重新启动 Claude Desktop,以便它考虑到新版本。这个工作流程感觉有些不顺畅,我希望未来能得到改善。