内容
# Medlock
Medlock 是一个纯 Bun 应用,提供前端网站和模型上下文协议(MCP)服务器,通过 Streamable HTTP 提供服务。
公开部署返回确定性的演示生命体征。私有部署可以将相同的 MCP 工具表面连接到用户的 Solid Pod,并应在公开真实数据之前配置 bearer 认证。
## 技术栈
- Bun 作为 HTTP 服务器、静态网站构建、测试和工具
- `@modelcontextprotocol/server` 使用 `WebStandardStreamableHTTPServerTransport`
- Cloud Run 用于生产和拉取请求预览
- Terraform 用于 Google Cloud 资源
- GitHub Actions OIDC 用于 GitOps 部署
## 本地开发
```sh
bun install
bun run dev
```
有用的命令:
```sh
bun run test
bun run typecheck
bun run verify
bun run mcp:inspect
```
MCP 端点可在以下地址访问:
```text
http://localhost:3000/api/mcp
```
## MCP 表面
工具:
- `solid_fetch_vitals`:从演示 Solid Pod 数据源返回选定的只读生命体征
- `vitals_scan`:准备浏览器扫描交接 URL,而无需从服务器激活摄像头硬件
资源:
- `medlock://context`:MCP 客户端的部署和安全上下文
## 配置
环境变量:
- `ALLOWED_HOSTS`:MCP 端点接受的以逗号分隔的主机列表
- `ALLOWED_ORIGINS`:API 端点接受的以逗号分隔的浏览器来源列表
- `CANONICAL_HOST`:用于旧版重定向的规范主机,默认为 `medlock.ai`
- `DATA_DIR`:当 `WAITLIST_BACKEND=file` 时,用于开发等待列表条目的本地文件系统存储
- `FIRESTORE_COLLECTION`:等待列表记录的 Firestore 集合,默认为 `waitlist`
- `FIRESTORE_DATABASE_ID`:Firestore 数据库 ID,默认为 `(default)`
- `FIRESTORE_PROJECT_ID`:Firestore REST API 使用的项目;Cloud Run 也设置 `GOOGLE_CLOUD_PROJECT`
- `LEGACY_HOSTS`:重定向到 `CANONICAL_HOST` 的以逗号分隔的主机列表
- `MEDLOCK_MCP_TOKEN`:私有 MCP 部署的可选 bearer 令牌
- `PORT`:HTTP 端口,默认为 `3000`
- `PUBLIC_DIR`:静态资产目录覆盖
- `WAITLIST_BACKEND`:`file`、`memory` 或 `firestore`;生产环境使用 `firestore`,拉取请求预览使用 `memory`
## Cloud Run 设置
仓库遵循与 `collinbentley1/cdbentley` 相同的结构:
- `infra/terraform/bootstrap`:项目服务、Terraform 状态存储桶、GitHub OIDC 和服务帐户
- `infra/terraform/prod`:工件仓库、Firestore、Cloud Run 和自定义域名映射
- `.github/workflows/application.yml`:Bun 验证
- `.github/workflows/infrastructure.yml`:Terraform 验证和生产环境应用
- `.github/workflows/deploy-prod.yml`:主分支容器部署
- `.github/workflows/deploy-preview.yml`:拉取请求预览部署
生产环境需要 GitHub 仓库变量由 bootstrap 输出:
- `GCP_WORKLOAD_IDENTITY_PROVIDER`
- `GCP_TERRAFORM_SERVICE_ACCOUNT`
- `GCP_PROD_DEPLOY_SERVICE_ACCOUNT`
- `GCP_PREVIEW_DEPLOY_SERVICE_ACCOUNT`
- `GCP_RUNTIME_SERVICE_ACCOUNT`
Dockerfile 使用 Docker Hardened Images,因此还需要存储库机密 `DHI_USERNAME` 和 `DHI_ACCESS_TOKEN` 用于 GitHub Actions 部署作业。