起重机堆叠
一个三组件堆栈的monorepo样板:
| 组件 | 技术 |
|---|
| REST API | Go、chi、SQLite |
| MCP服务器 | Go,mark3labs/MCP-Go,HTTP/SSE+stdio |
| iOS应用程序 | SwiftUI、iOS 18、苹果登录 |
建筑
iOS App ──── POST /auth/login ──────────────► Go REST API (port 8080)
◄─── session token ─────────────────
──── POST /auth/generate-mcp-key ──►
◄─── PAT ──────────────────────────
AI Agent ──── MCP tool calls ───────────────► Go MCP Server (port 9090)
(via PAT) │
└─► Go REST API
先决条件
- 转到1.23+
- Xcode 16+(适用于iOS)
- Xcodegen (
brew install xcodegen)
跑步
转到REST API
# Development (with a dev session token for testing without Apple Sign-In)
make run-api
# Production
go run ./cmd/api
转到MCP服务器
# HTTP/SSE transport (default, port 9090)
make run-mcp PAT=
# stdio transport (for local AI agent use)
MCP_PAT_TOKEN= MCP_TRANSPORT=stdio go run ./cmd/mcp
iOS应用程序
- 打开
ios/CraneStack.xcodeproj 在Xcode中 - 选择模拟器或设备
- 构建与运行(
⌘R) - 在开发中,tap 开发人员登录 绕过Apple登录
编辑后重新生成Xcode项目 ios/project.yml:
cd ios && xcodegen generate
环境变量
API服务器(cmd/api)
| 变量 | 默认值 | 描述 |
|---|
DB_PATH | cranestack.db | SQLite数据库文件的路径 |
PORT | 8080 | API监听的端口 |
DEV_SESSION_TOKEN | _(未设置)_ | 设置后,在没有Apple登录的情况下注册开发会话进行本地测试 |
LOG_FORMAT | json | 日志格式: json 或 text |
MCP服务器(cmd/mcp)
| 变量 | 必填 | 描述 |
|---|
MCP_PAT_TOKEN | ✅ | API生成的个人访问令牌 |
MCP_TRANSPORT | sse | 使用交通工具: sse 或 stdio |
API_BASE_URL | http://localhost:8080 | REST API的基本URL |
LOG_FORMAT | json | 日志格式: json 或 text |
PAT流程(开发)
# 1. Start the API with a known dev session token
make run-api
# 2. Generate a PAT using that dev token
curl -s -X POST http://localhost:8080/auth/generate-mcp-key \
-H "Authorization: Bearer dev-session-token" | jq
# 3. Start the MCP server with that PAT
make run-mcp PAT=
项目结构
cranestack/
├── cmd/
│ ├── api/main.go # REST API entrypoint
│ └── mcp/main.go # MCP server entrypoint
├── internal/
│ ├── apictx/ # Request context helpers (user ID)
│ ├── api/
│ │ ├── handlers/ # HTTP handlers
│ │ ├── middleware.go # RequireAuth
│ │ ├── routes.go # Route wiring
│ │ ├── server.go # Server struct
│ │ └── session.go # In-memory session store
│ ├── db/
│ │ ├── db.go # SQLite open + migrate
│ │ ├── schema.go # CREATE TABLE statements
│ │ └── repository.go # Data access methods
│ └── mcp/
│ ├── client.go # Authenticated HTTP client
│ ├── server.go # MCP server + transport selection
│ └── tools/ # MCP tool definitions
└── ios/
├── project.yml # xcodegen spec
└── CraneStack/
├── CraneStackApp.swift
├── AuthManager.swift
├── APIClient.swift
└── Views/