内容
# 琥珀
一款恐龙主题公园管理应用程序,同时演示了如何使用 Elixir 构建一个安全的 **远程 MCP 服务器**,并使用真正的 **OAuth 2.1** 授权服务器。这是关于使用 **Ash AI** 和 **AshLua** 将应用程序的数据和操作暴露给 AI 代理的 YouTube 视频的配套内容。
使用 [Phoenix](https://www.phoenixframework.org/) 和 [Ash 框架](https://ash-hq.org/) 构建。
[](https://youtu.be/xejfNsxjK3o)
## 内容概览
琥珀是一个小型公园运营应用程序:它跟踪 **恐龙**、**围栏** 和 **事件报告**,具有基于角色的访问权限(管理员可以写入,访客可以读取)。
视频在此基础上添加了:
- 一个 **OAuth 2.1 授权服务器** (`AshAuthentication.Oauth2Server`),具有动态客户端注册功能,允许 MCP 客户端(如 Claude.ai 和 ChatGPT 应用 SDK)连接并验证用户。
- 一个 **远程 MCP 服务器** (`AshAi.Mcp.Router`),安装在 `/mcp` 并受 OAuth 承载令牌保护。
- 由 [AshLua](https://ash-lua.hexdocs.pm/) 提供的 **"代码模式"** 工具 - 服务器不是暴露一个 MCP 工具,而是暴露一个小型 Lua 沙箱(`amber_lua_docs` + `amber_lua_eval`),允许代理针对公园的读取/更新操作进行脚本编写。
## 入门指南
### 先决条件
- [Elixir](https://elixir-lang.org/install.html) 和 Erlang/OTP(请参阅 `mix.exs` 获取所需版本)
- 一个正在运行的 **PostgreSQL** 实例
### 运行应用程序
1. 安装并设置依赖项(这也会创建数据库并初始化数据):
```bash
mix setup
```
2. 在 IEx 中启动服务器:
```bash
iex -S mix phx.server
```
3. 打开 [`localhost:4000`](http://localhost:4000)。
### 初始化账户
`mix setup` 初始化了一个公园和两个用户:
| 邮箱 | 密码 | 角色 |
| -------------------- | ------------------- | -------------- |
| `ranger@amber.park` | `dinosaurs-are-cool` | writer(读写) |
| `visitor@amber.park` | `dinosaurs-are-cool` | reader(只读) |
## 连接 MCP 客户端
MCP 端点在 `http://localhost:4000/mcp` 提供服务。将 MCP 客户端(Claude.ai 连接器、ChatGPT 应用 SDK 或任何支持 OAuth + 动态客户端注册的客户端)指向该 URL。客户端将被重定向到登录并授予 `mcp` 范围,然后接收用于调用暴露的工具的 bearer 令牌。
## 参考资料
- **[Ash 框架](https://ash.hexdocs.pm/)** — Elixir 的声明式应用程序框架
- **[Ash AI](https://ash-ai.hexdocs.pm/)** — 将 Ash 操作转换为 MCP 工具和 LLM 集成
- **[AshLua](https://ash-lua.hexdocs.pm/)** — 在 Ash 操作上运行沙箱化的 Lua(“代码模式”)
- **[Ash 身份验证](https://ash-authentication.hexdocs.pm/)** — Ash 的用户身份验证
- **[Ash 身份验证 OAuth2 服务器](https://ash-authentication-oauth2-server.hexdocs.pm/)** — OAuth 2.1 授权服务器
- **[模型上下文协议](https://modelcontextprotocol.io/)** — MCP 客户端和服务器通信的协议