chore: publish clean community baseline
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
# Crank
|
||||
|
||||
Crank Community — self-hosted платформа для публикации REST API как MCP tools.
|
||||
|
||||
Проект решает практическую задачу: описать внешний REST endpoint, проверить его,
|
||||
опубликовать и отдать LLM-клиентам через MCP без написания отдельного MCP server
|
||||
для каждой интеграции.
|
||||
|
||||
## Возможности
|
||||
|
||||
- Создание REST operations через UI или YAML.
|
||||
- Маппинг MCP input в query/body/header параметры REST-запроса.
|
||||
- Маппинг REST response в структурированный output MCP tool.
|
||||
- Публикация выбранных operations в agent-scoped MCP endpoints.
|
||||
- Черновики, версии, samples, mappings, logs и usage в PostgreSQL.
|
||||
- Простая авторизация через bootstrap admin user и browser session.
|
||||
- PostgreSQL-backed secrets и auth profiles для upstream REST API.
|
||||
- Docker Compose deployment.
|
||||
|
||||
## Scope Community
|
||||
|
||||
Этот репозиторий содержит только Community-возможности:
|
||||
|
||||
- только REST protocol;
|
||||
- один самостоятельный self-hosted deployment;
|
||||
- простая admin-аутентификация;
|
||||
- статические agent API keys для MCP-доступа;
|
||||
- PostgreSQL как системная БД;
|
||||
- optional Valkey/Redis для runtime coordination;
|
||||
- Gitea Actions workflow для CI/CD.
|
||||
|
||||
Репозиторий фокусируется только на перечисленном scope.
|
||||
|
||||
## Архитектура
|
||||
|
||||
Основные сущности:
|
||||
|
||||
- `Workspace` — граница данных для operations, agents, secrets и logs.
|
||||
- `Operation` — версионируемый REST integration contract.
|
||||
- `Agent` — MCP surface, который публикует ограниченный набор operations.
|
||||
|
||||
Рабочий flow:
|
||||
|
||||
1. Оператор создает или импортирует REST operation.
|
||||
2. Crank валидирует schema и mapping.
|
||||
3. Оператор выполняет test call к upstream REST API.
|
||||
4. Operation публикуется.
|
||||
5. Agent открывает published operation как MCP tool.
|
||||
6. MCP client вызывает tool через `mcp-server`.
|
||||
|
||||
## Структура репозитория
|
||||
|
||||
```text
|
||||
apps/
|
||||
admin-api/ HTTP API для UI, auth, operations, agents, logs и settings
|
||||
mcp-server/ Agent-scoped MCP Streamable HTTP server
|
||||
ui/ Static web UI
|
||||
|
||||
crates/
|
||||
crank-core/ Общая domain model
|
||||
crank-registry/ PostgreSQL persistence
|
||||
crank-runtime/ REST execution, mapping, cache, limits
|
||||
crank-adapter-rest/ REST adapter
|
||||
crank-community-auth/ Password hashing и sessions
|
||||
crank-community-mcp/ MCP application layer
|
||||
crank-mapping/ JSONPath mapping
|
||||
crank-schema/ Schema normalization и validation
|
||||
|
||||
deploy/community/
|
||||
docker-compose.yml Production-like Community deployment
|
||||
.env.example Runtime env template
|
||||
```
|
||||
|
||||
## Требования
|
||||
|
||||
- Rust toolchain из `rust-toolchain.toml`
|
||||
- Node.js и npm для UI
|
||||
- PostgreSQL
|
||||
- Docker и Docker Compose для deployment
|
||||
|
||||
## Локальная разработка
|
||||
|
||||
Запустите PostgreSQL и задайте переменные окружения:
|
||||
|
||||
```bash
|
||||
export POSTGRES_HOST=127.0.0.1
|
||||
export POSTGRES_PORT=5432
|
||||
export POSTGRES_DB=crank
|
||||
export POSTGRES_USER=crank
|
||||
export POSTGRES_PASSWORD=crank
|
||||
export CRANK_MASTER_KEY=0000000000000000000000000000000000000000000000000000000000000000
|
||||
export CRANK_SESSION_SECRET=dev-session-secret
|
||||
export CRANK_PASSWORD_PEPPER=dev-password-pepper
|
||||
export CRANK_BOOTSTRAP_ADMIN_EMAIL=owner@crank.local
|
||||
export CRANK_BOOTSTRAP_ADMIN_PASSWORD=change-me-admin-password
|
||||
export CRANK_BOOTSTRAP_ADMIN_DISPLAY_NAME="Crank Owner"
|
||||
export CRANK_STORAGE_ROOT=.tmp/storage
|
||||
export CRANK_BASE_URL=http://127.0.0.1:3000
|
||||
```
|
||||
|
||||
Запустите backend:
|
||||
|
||||
```bash
|
||||
cargo run -p admin-api
|
||||
cargo run -p mcp-server
|
||||
```
|
||||
|
||||
Соберите UI:
|
||||
|
||||
```bash
|
||||
cd apps/ui
|
||||
npm ci
|
||||
npm run build
|
||||
```
|
||||
|
||||
## Проверки
|
||||
|
||||
Rust:
|
||||
|
||||
```bash
|
||||
cargo fmt --all --check
|
||||
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||
cargo test --workspace --all-targets
|
||||
```
|
||||
|
||||
UI:
|
||||
|
||||
```bash
|
||||
cd apps/ui
|
||||
npm ci
|
||||
npm run build
|
||||
npx playwright test
|
||||
```
|
||||
|
||||
Playwright поднимает локальный test stack с PostgreSQL, `admin-api`,
|
||||
`mcp-server` и UI test server.
|
||||
|
||||
## Deployment
|
||||
|
||||
Community manifest находится в `deploy/community/docker-compose.yml`.
|
||||
|
||||
Production-like deployment ожидает:
|
||||
|
||||
- внешний PostgreSQL;
|
||||
- container images для `admin-api`, `mcp-server` и `ui`;
|
||||
- runtime secrets через environment variables;
|
||||
- reverse proxy перед портами `3000`, `3001`, `3002`.
|
||||
|
||||
Gitea workflow `.gitea/workflows/deploy.yml` собирает images, читает runtime
|
||||
configuration из OpenBao, пишет `.env` на deployment host и запускает Docker
|
||||
Compose.
|
||||
|
||||
Ключевые runtime variables:
|
||||
|
||||
- `POSTGRES_HOST`, `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`
|
||||
- `CRANK_MASTER_KEY`
|
||||
- `CRANK_SESSION_SECRET`
|
||||
- `CRANK_PASSWORD_PEPPER`
|
||||
- `CRANK_BOOTSTRAP_ADMIN_EMAIL`
|
||||
- `CRANK_BOOTSTRAP_ADMIN_PASSWORD`
|
||||
- `CRANK_BASE_URL`
|
||||
- `CRANK_PUBLISH_BIND`
|
||||
|
||||
Полная operational-документация:
|
||||
|
||||
- [docs/runtime-config.md](docs/runtime-config.md)
|
||||
- [docs/deployment.md](docs/deployment.md)
|
||||
- [docs/mcp-interface.md](docs/mcp-interface.md)
|
||||
|
||||
## MCP
|
||||
|
||||
Crank публикует agent-scoped MCP endpoints через Streamable HTTP. Каждый agent
|
||||
имеет собственный published tool catalog, поэтому MCP client видит только REST
|
||||
tools, явно привязанные к этому agent.
|
||||
|
||||
Типовой сценарий:
|
||||
|
||||
1. Создать REST operation.
|
||||
2. Протестировать operation.
|
||||
3. Опубликовать operation.
|
||||
4. Привязать operation к agent.
|
||||
5. Создать agent API key.
|
||||
6. Подключить MCP client к agent endpoint.
|
||||
|
||||
## Английская документация
|
||||
|
||||
English README: [docs/en/README.md](docs/en/README.md).
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user