diff --git a/.env.example b/.env.example index ba7672f..2a75b00 100644 --- a/.env.example +++ b/.env.example @@ -1,13 +1,13 @@ -POSTGRES_DB=rmcp -POSTGRES_USER=rmcp +POSTGRES_DB=crank +POSTGRES_USER=crank POSTGRES_PASSWORD=change-me -MCPAAS_DATABASE_URL=postgres://rmcp:change-me@postgres:5432/rmcp -MCPAAS_STORAGE_ROOT=/var/lib/rmcp/storage -MCPAAS_PUBLISH_HOST=127.0.0.1 -MCPAAS_ADMIN_BIND=0.0.0.0:3001 -MCPAAS_MCP_BIND=0.0.0.0:3002 -MCPAAS_MCP_REFRESH_MS=5000 -MCPAAS_LOG_LEVEL=info -MCPAAS_SECRET_PROVIDER=env -MCPAAS_PUBLIC_BASE_URL=https://rmcp.example.com -MCPAAS_MCP_PUBLIC_URL=https://rmcp.example.com/mcp +CRANK_DATABASE_URL=postgres://crank:change-me@postgres:5432/crank +CRANK_STORAGE_ROOT=/var/lib/crank/storage +CRANK_PUBLISH_HOST=127.0.0.1 +CRANK_ADMIN_BIND=0.0.0.0:3001 +CRANK_MCP_BIND=0.0.0.0:3002 +CRANK_MCP_REFRESH_MS=5000 +CRANK_LOG_LEVEL=info +CRANK_SECRET_PROVIDER=env +CRANK_PUBLIC_BASE_URL=https://crank.example.com +CRANK_MCP_PUBLIC_URL=https://crank.example.com/mcp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 99152d3..50ed643 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,18 +19,18 @@ jobs: postgres: image: postgres:16-alpine env: - POSTGRES_DB: rmcp_test + POSTGRES_DB: crank_test POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - 5432:5432 options: >- - --health-cmd "pg_isready -U postgres -d rmcp_test" + --health-cmd "pg_isready -U postgres -d crank_test" --health-interval 10s --health-timeout 5s --health-retries 5 env: - TEST_DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/rmcp_test + TEST_DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/crank_test steps: - name: Checkout diff --git a/Cargo.lock b/Cargo.lock index 6d49f50..ff46154 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,13 +7,13 @@ name = "admin-api" version = "0.1.0" dependencies = [ "axum", - "mcpaas-adapter-grpc", - "mcpaas-core", - "mcpaas-mapping", - "mcpaas-proto", - "mcpaas-registry", - "mcpaas-runtime", - "mcpaas-schema", + "crank-adapter-grpc", + "crank-core", + "crank-mapping", + "crank-proto", + "crank-registry", + "crank-runtime", + "crank-schema", "reqwest", "serde", "serde_json", @@ -211,6 +211,129 @@ dependencies = [ "libc", ] +[[package]] +name = "crank-adapter-graphql" +version = "0.1.0" +dependencies = [ + "axum", + "crank-core", + "crank-mapping", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", +] + +[[package]] +name = "crank-adapter-grpc" +version = "0.1.0" +dependencies = [ + "base64", + "crank-core", + "crank-proto", + "prost", + "prost-reflect", + "prost-types", + "protoc-bin-vendored", + "serde", + "serde_json", + "thiserror", + "tokio", + "tonic", + "tonic-prost", + "tonic-prost-build", +] + +[[package]] +name = "crank-adapter-rest" +version = "0.1.0" +dependencies = [ + "axum", + "crank-core", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", +] + +[[package]] +name = "crank-core" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "serde_yaml", + "thiserror", +] + +[[package]] +name = "crank-mapping" +version = "0.1.0" +dependencies = [ + "crank-core", + "serde", + "serde_json", + "serde_yaml", + "thiserror", +] + +[[package]] +name = "crank-proto" +version = "0.1.0" +dependencies = [ + "crank-core", + "crank-schema", + "prost", + "prost-reflect", + "prost-types", + "serde", + "thiserror", +] + +[[package]] +name = "crank-registry" +version = "0.1.0" +dependencies = [ + "crank-core", + "crank-mapping", + "crank-schema", + "serde", + "serde_json", + "sqlx", + "thiserror", + "tokio", +] + +[[package]] +name = "crank-runtime" +version = "0.1.0" +dependencies = [ + "axum", + "crank-adapter-graphql", + "crank-adapter-grpc", + "crank-adapter-rest", + "crank-core", + "crank-mapping", + "crank-schema", + "serde", + "serde_json", + "thiserror", + "tokio", +] + +[[package]] +name = "crank-schema" +version = "0.1.0" +dependencies = [ + "crank-core", + "serde", + "serde_json", + "serde_yaml", + "thiserror", +] + [[package]] name = "crc" version = "3.4.0" @@ -933,12 +1056,12 @@ name = "mcp-server" version = "0.1.0" dependencies = [ "axum", - "mcpaas-adapter-grpc", - "mcpaas-core", - "mcpaas-mapping", - "mcpaas-registry", - "mcpaas-runtime", - "mcpaas-schema", + "crank-adapter-grpc", + "crank-core", + "crank-mapping", + "crank-registry", + "crank-runtime", + "crank-schema", "reqwest", "serde", "serde_json", @@ -949,129 +1072,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "mcpaas-adapter-graphql" -version = "0.1.0" -dependencies = [ - "axum", - "mcpaas-core", - "mcpaas-mapping", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", -] - -[[package]] -name = "mcpaas-adapter-grpc" -version = "0.1.0" -dependencies = [ - "base64", - "mcpaas-core", - "mcpaas-proto", - "prost", - "prost-reflect", - "prost-types", - "protoc-bin-vendored", - "serde", - "serde_json", - "thiserror", - "tokio", - "tonic", - "tonic-prost", - "tonic-prost-build", -] - -[[package]] -name = "mcpaas-adapter-rest" -version = "0.1.0" -dependencies = [ - "axum", - "mcpaas-core", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", -] - -[[package]] -name = "mcpaas-core" -version = "0.1.0" -dependencies = [ - "serde", - "serde_json", - "serde_yaml", - "thiserror", -] - -[[package]] -name = "mcpaas-mapping" -version = "0.1.0" -dependencies = [ - "mcpaas-core", - "serde", - "serde_json", - "serde_yaml", - "thiserror", -] - -[[package]] -name = "mcpaas-proto" -version = "0.1.0" -dependencies = [ - "mcpaas-core", - "mcpaas-schema", - "prost", - "prost-reflect", - "prost-types", - "serde", - "thiserror", -] - -[[package]] -name = "mcpaas-registry" -version = "0.1.0" -dependencies = [ - "mcpaas-core", - "mcpaas-mapping", - "mcpaas-schema", - "serde", - "serde_json", - "sqlx", - "thiserror", - "tokio", -] - -[[package]] -name = "mcpaas-runtime" -version = "0.1.0" -dependencies = [ - "axum", - "mcpaas-adapter-graphql", - "mcpaas-adapter-grpc", - "mcpaas-adapter-rest", - "mcpaas-core", - "mcpaas-mapping", - "mcpaas-schema", - "serde", - "serde_json", - "thiserror", - "tokio", -] - -[[package]] -name = "mcpaas-schema" -version = "0.1.0" -dependencies = [ - "mcpaas-core", - "serde", - "serde_json", - "serde_yaml", - "thiserror", -] - [[package]] name = "md-5" version = "0.10.6" diff --git a/Cargo.toml b/Cargo.toml index 3959bfd..1fc8d14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,15 +2,15 @@ members = [ "apps/admin-api", "apps/mcp-server", - "crates/mcpaas-core", - "crates/mcpaas-schema", - "crates/mcpaas-mapping", - "crates/mcpaas-proto", - "crates/mcpaas-registry", - "crates/mcpaas-runtime", - "crates/mcpaas-adapter-rest", - "crates/mcpaas-adapter-graphql", - "crates/mcpaas-adapter-grpc", + "crates/crank-core", + "crates/crank-schema", + "crates/crank-mapping", + "crates/crank-proto", + "crates/crank-registry", + "crates/crank-runtime", + "crates/crank-adapter-rest", + "crates/crank-adapter-graphql", + "crates/crank-adapter-grpc", ] resolver = "3" diff --git a/Crank.png b/Crank.png new file mode 100644 index 0000000..aa1c5d1 Binary files /dev/null and b/Crank.png differ diff --git a/README.md b/README.md index 789c6b9..74e4dad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -# MCPaaS +# Crank -MCPaaS - это low-code платформа для публикации внешних API в виде MCP tools без написания нового backend-обработчика под каждую интеграцию. Система предоставляет единый административный UI, в котором оператор может подключать REST, GraphQL и gRPC операции, настраивать маппинг входных и выходных данных, выполнять тестовый вызов и публиковать результат как MCP tool. +![Crank](./Crank.png) + +Crank - это low-code платформа для публикации внешних API в виде MCP tools без написания нового backend-обработчика под каждую интеграцию. Система предоставляет единый административный UI, в котором оператор может подключать REST, GraphQL и gRPC операции, настраивать маппинг входных и выходных данных, выполнять тестовый вызов и публиковать результат как MCP tool. На текущем этапе репозиторий содержит проектную документацию и архитектурные решения, которые задают границы MVP и подход к реализации. diff --git a/TASKS.md b/TASKS.md index 3e31727..3c46718 100644 --- a/TASKS.md +++ b/TASKS.md @@ -2,16 +2,17 @@ ## Current -### `feat/ui-width-spacing` +### `feat/crank-rebrand` Status: completed DoD: -- рабочая область create page не растягивается на всю ширину экрана -- step cards имеют нормальные внутренние отступы -- поля и редакторы не липнут к левому краю -- UI build остается зеленым +- проект переименован в `Crank` в документации, UI и package metadata +- workspace и crate package names согласованы с новым брендом +- `README.md` использует `Crank.png` как главное изображение +- `origin` указывает на `git@github.com:bsodfather/crank.git` +- Rust workspace и UI build остаются зелеными ## Next diff --git a/apps/admin-api/Cargo.toml b/apps/admin-api/Cargo.toml index e14eb08..a6f0074 100644 --- a/apps/admin-api/Cargo.toml +++ b/apps/admin-api/Cargo.toml @@ -7,12 +7,12 @@ version.workspace = true [dependencies] axum.workspace = true -mcpaas-core = { path = "../../crates/mcpaas-core" } -mcpaas-mapping = { path = "../../crates/mcpaas-mapping" } -mcpaas-proto = { path = "../../crates/mcpaas-proto" } -mcpaas-registry = { path = "../../crates/mcpaas-registry" } -mcpaas-runtime = { path = "../../crates/mcpaas-runtime" } -mcpaas-schema = { path = "../../crates/mcpaas-schema" } +crank-core = { path = "../../crates/crank-core" } +crank-mapping = { path = "../../crates/crank-mapping" } +crank-proto = { path = "../../crates/crank-proto" } +crank-registry = { path = "../../crates/crank-registry" } +crank-runtime = { path = "../../crates/crank-runtime" } +crank-schema = { path = "../../crates/crank-schema" } serde.workspace = true serde_json.workspace = true serde_yaml.workspace = true @@ -24,6 +24,6 @@ tracing-subscriber.workspace = true uuid.workspace = true [dev-dependencies] -mcpaas-adapter-grpc = { path = "../../crates/mcpaas-adapter-grpc", features = ["test-support"] } +crank-adapter-grpc = { path = "../../crates/crank-adapter-grpc", features = ["test-support"] } reqwest.workspace = true sqlx.workspace = true diff --git a/apps/admin-api/Dockerfile b/apps/admin-api/Dockerfile index 43af89e..ea3c405 100644 --- a/apps/admin-api/Dockerfile +++ b/apps/admin-api/Dockerfile @@ -18,7 +18,7 @@ WORKDIR /app COPY --from=builder /app/target/release/admin-api /usr/local/bin/admin-api -ENV MCPAAS_ADMIN_BIND=0.0.0.0:3001 +ENV CRANK_ADMIN_BIND=0.0.0.0:3001 EXPOSE 3001 diff --git a/apps/admin-api/src/app.rs b/apps/admin-api/src/app.rs index 83848d0..a6f8ce2 100644 --- a/apps/admin-api/src/app.rs +++ b/apps/admin-api/src/app.rs @@ -80,14 +80,14 @@ mod tests { }; use axum::{Json, Router, routing::post}; - use mcpaas_adapter_grpc::test_support as grpc_test_support; - use mcpaas_core::{ + use crank_adapter_grpc::test_support as grpc_test_support; + use crank_core::{ DescriptorId, ExecutionConfig, GraphqlOperationType, GraphqlTarget, GrpcTarget, HttpMethod, Protocol, RestTarget, Target, ToolDescription, }; - use mcpaas_mapping::{MappingRule, MappingSet}; - use mcpaas_registry::PostgresRegistry; - use mcpaas_schema::{Schema, SchemaKind}; + use crank_mapping::{MappingRule, MappingSet}; + use crank_registry::PostgresRegistry; + use crank_schema::{Schema, SchemaKind}; use serde_json::{Value, json}; use sqlx::{Executor, postgres::PgPoolOptions}; use tokio::net::TcpListener; @@ -621,7 +621,7 @@ mod tests { async fn test_registry() -> PostgresRegistry { let database_url = env::var("TEST_DATABASE_URL") - .unwrap_or_else(|_| "postgres://rmcp:rmcp@127.0.0.1:5432/rmcp".to_owned()); + .unwrap_or_else(|_| "postgres://crank:crank@127.0.0.1:5432/crank".to_owned()); let admin_pool = PgPoolOptions::new() .max_connections(1) .connect(&database_url) @@ -648,7 +648,7 @@ mod tests { fn test_storage_root(name: &str) -> std::path::PathBuf { env::temp_dir().join(format!( - "rmcp_admin_api_{name}_{}_{}", + "crank_admin_api_{name}_{}_{}", std::process::id(), SystemTime::now() .duration_since(UNIX_EPOCH) diff --git a/apps/admin-api/src/error.rs b/apps/admin-api/src/error.rs index 6f8778d..fbbdaaa 100644 --- a/apps/admin-api/src/error.rs +++ b/apps/admin-api/src/error.rs @@ -3,10 +3,10 @@ use axum::{ http::StatusCode, response::{IntoResponse, Response}, }; -use mcpaas_mapping::MappingError; -use mcpaas_registry::RegistryError; -use mcpaas_runtime::RuntimeError; -use mcpaas_schema::SchemaError; +use crank_mapping::MappingError; +use crank_registry::RegistryError; +use crank_runtime::RuntimeError; +use crank_schema::SchemaError; use serde_json::{Value, json}; use thiserror::Error; use tracing::{error, warn}; diff --git a/apps/admin-api/src/main.rs b/apps/admin-api/src/main.rs index 90e1a63..b45491d 100644 --- a/apps/admin-api/src/main.rs +++ b/apps/admin-api/src/main.rs @@ -7,7 +7,7 @@ mod storage; use std::{env, net::SocketAddr, path::PathBuf}; -use mcpaas_registry::PostgresRegistry; +use crank_registry::PostgresRegistry; use tokio::net::TcpListener; use tracing::info; @@ -17,16 +17,16 @@ use crate::{app::build_app, service::AdminService, state::AppState}; async fn main() -> Result<(), Box> { tracing_subscriber::fmt() .with_env_filter( - env::var("MCPAAS_LOG_LEVEL") + env::var("CRANK_LOG_LEVEL") .unwrap_or_else(|_| "admin_api=info,tower_http=info".into()), ) .init(); - let database_url = env::var("MCPAAS_DATABASE_URL")?; + let database_url = env::var("CRANK_DATABASE_URL")?; let storage_root = PathBuf::from( - env::var("MCPAAS_STORAGE_ROOT").unwrap_or_else(|_| "/var/lib/rmcp/storage".into()), + env::var("CRANK_STORAGE_ROOT").unwrap_or_else(|_| "/var/lib/crank/storage".into()), ); - let bind_addr = env::var("MCPAAS_ADMIN_BIND").unwrap_or_else(|_| "0.0.0.0:3001".into()); + let bind_addr = env::var("CRANK_ADMIN_BIND").unwrap_or_else(|_| "0.0.0.0:3001".into()); let socket_addr: SocketAddr = bind_addr.parse()?; let registry = PostgresRegistry::connect(&database_url).await?; let state = AppState { diff --git a/apps/admin-api/src/routes/operations.rs b/apps/admin-api/src/routes/operations.rs index b101923..3e72808 100644 --- a/apps/admin-api/src/routes/operations.rs +++ b/apps/admin-api/src/routes/operations.rs @@ -96,7 +96,7 @@ pub async fn upload_input_json( .service .save_json_sample( &operation_id.as_str().into(), - mcpaas_registry::SampleKind::InputJson, + crank_registry::SampleKind::InputJson, &payload, ) .await?; @@ -117,7 +117,7 @@ pub async fn upload_output_json( .service .save_json_sample( &operation_id.as_str().into(), - mcpaas_registry::SampleKind::OutputJson, + crank_registry::SampleKind::OutputJson, &payload, ) .await?; diff --git a/apps/admin-api/src/service.rs b/apps/admin-api/src/service.rs index 5024c88..0d2d07a 100644 --- a/apps/admin-api/src/service.rs +++ b/apps/admin-api/src/service.rs @@ -1,18 +1,18 @@ use std::path::PathBuf; -use mcpaas_core::{ +use crank_core::{ AuthConfig, AuthKind, AuthProfile, AuthProfileId, ConfigExport, ExportMode, GeneratedDraft, GeneratedDraftStatus, OperationId, OperationStatus, Protocol, SampleId, Samples, Target, }; -use mcpaas_mapping::{JsonPathRoot, MappingSet, infer_mapping_from_samples}; -use mcpaas_proto::{ProtoService, services_from_descriptor_set_bytes}; -use mcpaas_registry::{ +use crank_mapping::{JsonPathRoot, MappingSet, infer_mapping_from_samples}; +use crank_proto::{ProtoService, services_from_descriptor_set_bytes}; +use crank_registry::{ CreateVersionRequest, OperationSampleMetadata, OperationSummary, OperationVersionRecord, PostgresRegistry, PublishRequest, RegistryOperation, SampleKind, SaveAuthProfileRequest, SaveDescriptorMetadataRequest, SaveSampleMetadataRequest, }; -use mcpaas_runtime::{PreparedRequest, RuntimeError, RuntimeExecutor, RuntimeOperation}; -use mcpaas_schema::Schema; +use crank_runtime::{PreparedRequest, RuntimeError, RuntimeExecutor, RuntimeOperation}; +use crank_schema::Schema; use serde::{Deserialize, Serialize}; use serde_json::{Value, json}; use time::{OffsetDateTime, format_description::well_known::Rfc3339}; @@ -38,8 +38,8 @@ pub struct OperationPayload { pub output_schema: Schema, pub input_mapping: MappingSet, pub output_mapping: MappingSet, - pub execution_config: mcpaas_core::ExecutionConfig, - pub tool_description: mcpaas_core::ToolDescription, + pub execution_config: crank_core::ExecutionConfig, + pub tool_description: crank_core::ToolDescription, } #[derive(Clone, Debug, Deserialize)] @@ -395,13 +395,13 @@ impl AdminService { let services = services_from_descriptor_set_bytes(payload) .map_err(|error| ApiError::validation(error.to_string()))?; - let descriptor_id = mcpaas_core::DescriptorId::new(new_prefixed_id("desc")); + let descriptor_id = crank_core::DescriptorId::new(new_prefixed_id("desc")); let storage_ref = self .storage .write_descriptor( operation_id, summary.current_draft_version, - mcpaas_registry::DescriptorKind::DescriptorSet, + crank_registry::DescriptorKind::DescriptorSet, &descriptor_id, source_name, payload, @@ -410,11 +410,11 @@ impl AdminService { self.registry .save_descriptor_metadata(SaveDescriptorMetadataRequest { - descriptor: &mcpaas_registry::DescriptorMetadata { + descriptor: &crank_registry::DescriptorMetadata { id: descriptor_id.clone(), operation_id: Some(operation_id.clone()), version: Some(summary.current_draft_version), - descriptor_kind: mcpaas_registry::DescriptorKind::DescriptorSet, + descriptor_kind: crank_registry::DescriptorKind::DescriptorSet, storage_ref, source_name: source_name.map(ToOwned::to_owned), package_index: Some( @@ -452,13 +452,13 @@ impl AdminService { )); } - let descriptor_id = mcpaas_core::DescriptorId::new(new_prefixed_id("desc")); + let descriptor_id = crank_core::DescriptorId::new(new_prefixed_id("desc")); let storage_ref = self .storage .write_descriptor( operation_id, summary.current_draft_version, - mcpaas_registry::DescriptorKind::ProtoUpload, + crank_registry::DescriptorKind::ProtoUpload, &descriptor_id, source_name, payload, @@ -467,11 +467,11 @@ impl AdminService { self.registry .save_descriptor_metadata(SaveDescriptorMetadataRequest { - descriptor: &mcpaas_registry::DescriptorMetadata { + descriptor: &crank_registry::DescriptorMetadata { id: descriptor_id.clone(), operation_id: Some(operation_id.clone()), version: Some(summary.current_draft_version), - descriptor_kind: mcpaas_registry::DescriptorKind::ProtoUpload, + descriptor_kind: crank_registry::DescriptorKind::ProtoUpload, storage_ref, source_name: source_name.map(ToOwned::to_owned), package_index: None, @@ -513,7 +513,7 @@ impl AdminService { .into_iter() .rev() .find(|descriptor| { - descriptor.descriptor_kind == mcpaas_registry::DescriptorKind::DescriptorSet + descriptor.descriptor_kind == crank_registry::DescriptorKind::DescriptorSet }) .ok_or_else(|| ApiError::not_found("descriptor set was not uploaded"))?; let bytes = self.storage.read_bytes(&descriptor.storage_ref).await?; @@ -809,10 +809,10 @@ impl AdminService { fn build_request_preview( mapping: &MappingSet, input: &Value, -) -> Result { +) -> Result { let mapped = mapping.apply(&json!({ "mcp": input }))?; let prepared = PreparedRequest::from_mapping_output(&mapped).map_err(|error| { - mcpaas_mapping::MappingError::InvalidJsonPath { + crank_mapping::MappingError::InvalidJsonPath { path: error.to_string(), } })?; @@ -890,9 +890,9 @@ fn proto_service_summary(service: ProtoService) -> Result, message: &Value) -> Response { } }, "serverInfo": { - "name": "rmcp-mcp-server", + "name": "crank-mcp-server", "version": env!("CARGO_PKG_VERSION") } }), @@ -480,9 +480,9 @@ fn tool_definition(operation: &RegistryOperation) -> Value { }) } -fn schema_to_json_schema(schema: &mcpaas_schema::Schema) -> Value { +fn schema_to_json_schema(schema: &crank_schema::Schema) -> Value { match schema.kind { - mcpaas_schema::SchemaKind::Object => { + crank_schema::SchemaKind::Object => { let mut properties = serde_json::Map::new(); let mut required = Vec::new(); @@ -500,7 +500,7 @@ fn schema_to_json_schema(schema: &mcpaas_schema::Schema) -> Value { "required": required }) } - mcpaas_schema::SchemaKind::Array => json!({ + crank_schema::SchemaKind::Array => json!({ "type": "array", "items": schema .items @@ -508,16 +508,16 @@ fn schema_to_json_schema(schema: &mcpaas_schema::Schema) -> Value { .map(schema_to_json_schema) .unwrap_or_else(|| json!({})) }), - mcpaas_schema::SchemaKind::String => json!({ "type": "string" }), - mcpaas_schema::SchemaKind::Integer => json!({ "type": "integer" }), - mcpaas_schema::SchemaKind::Number => json!({ "type": "number" }), - mcpaas_schema::SchemaKind::Boolean => json!({ "type": "boolean" }), - mcpaas_schema::SchemaKind::Enum => json!({ + crank_schema::SchemaKind::String => json!({ "type": "string" }), + crank_schema::SchemaKind::Integer => json!({ "type": "integer" }), + crank_schema::SchemaKind::Number => json!({ "type": "number" }), + crank_schema::SchemaKind::Boolean => json!({ "type": "boolean" }), + crank_schema::SchemaKind::Enum => json!({ "type": "string", "enum": schema.enum_values }), - mcpaas_schema::SchemaKind::Null => json!({ "type": "null" }), - mcpaas_schema::SchemaKind::Oneof => json!({ + crank_schema::SchemaKind::Null => json!({ "type": "null" }), + crank_schema::SchemaKind::Oneof => json!({ "anyOf": schema.variants.iter().map(schema_to_json_schema).collect::>() }), } diff --git a/apps/mcp-server/src/catalog.rs b/apps/mcp-server/src/catalog.rs index 4e2e773..49e19a9 100644 --- a/apps/mcp-server/src/catalog.rs +++ b/apps/mcp-server/src/catalog.rs @@ -4,7 +4,7 @@ use std::{ time::{Duration, Instant}, }; -use mcpaas_registry::{PostgresRegistry, RegistryError, RegistryOperation}; +use crank_registry::{PostgresRegistry, RegistryError, RegistryOperation}; use tokio::sync::RwLock; use tracing::info; diff --git a/apps/mcp-server/src/main.rs b/apps/mcp-server/src/main.rs index f0b95ea..0a40b60 100644 --- a/apps/mcp-server/src/main.rs +++ b/apps/mcp-server/src/main.rs @@ -5,7 +5,7 @@ mod session; use std::{env, net::SocketAddr, time::Duration}; -use mcpaas_registry::PostgresRegistry; +use crank_registry::PostgresRegistry; use tokio::net::TcpListener; use tracing::info; @@ -15,15 +15,15 @@ use crate::app::build_app; async fn main() -> Result<(), Box> { tracing_subscriber::fmt() .with_env_filter( - env::var("MCPAAS_LOG_LEVEL") + env::var("CRANK_LOG_LEVEL") .unwrap_or_else(|_| "mcp_server=info,tower_http=info".into()), ) .init(); - let database_url = env::var("MCPAAS_DATABASE_URL")?; - let bind_addr = env::var("MCPAAS_MCP_BIND").unwrap_or_else(|_| "0.0.0.0:3002".into()); - let public_base_url = env::var("MCPAAS_PUBLIC_BASE_URL").ok(); - let refresh_interval = env::var("MCPAAS_MCP_REFRESH_MS") + let database_url = env::var("CRANK_DATABASE_URL")?; + let bind_addr = env::var("CRANK_MCP_BIND").unwrap_or_else(|_| "0.0.0.0:3002".into()); + let public_base_url = env::var("CRANK_PUBLIC_BASE_URL").ok(); + let refresh_interval = env::var("CRANK_MCP_REFRESH_MS") .ok() .and_then(|value| value.parse::().ok()) .map(Duration::from_millis) @@ -49,14 +49,14 @@ mod tests { }; use axum::{Json, Router, http::header, routing::post}; - use mcpaas_adapter_grpc::test_support as grpc_test_support; - use mcpaas_core::{ + use crank_adapter_grpc::test_support as grpc_test_support; + use crank_core::{ DescriptorId, ExecutionConfig, GraphqlOperationType, GraphqlTarget, GrpcTarget, HttpMethod, Operation, OperationId, OperationStatus, Protocol, RestTarget, Target, ToolDescription, }; - use mcpaas_mapping::{MappingRule, MappingSet}; - use mcpaas_registry::{PostgresRegistry, PublishRequest}; - use mcpaas_schema::{Schema, SchemaKind}; + use crank_mapping::{MappingRule, MappingSet}; + use crank_registry::{PostgresRegistry, PublishRequest}; + use crank_schema::{Schema, SchemaKind}; use serde_json::{Value, json}; use sqlx::{Executor, postgres::PgPoolOptions}; use tokio::net::TcpListener; @@ -86,7 +86,7 @@ mod tests { let base_url = spawn_mcp_server(build_app( registry, Duration::from_millis(0), - Some("https://rmcp.example.com".to_owned()), + Some("https://crank.example.com".to_owned()), )) .await; let client = reqwest::Client::new(); @@ -153,7 +153,7 @@ mod tests { let base_url = spawn_mcp_server(build_app( registry, Duration::from_millis(0), - Some("https://rmcp.example.com".to_owned()), + Some("https://crank.example.com".to_owned()), )) .await; let client = reqwest::Client::new(); @@ -207,7 +207,7 @@ mod tests { let base_url = spawn_mcp_server(build_app( registry, Duration::from_millis(0), - Some("https://rmcp.example.com".to_owned()), + Some("https://crank.example.com".to_owned()), )) .await; let client = reqwest::Client::new(); @@ -244,7 +244,7 @@ mod tests { let base_url = spawn_mcp_server(build_app( registry, Duration::from_millis(0), - Some("https://rmcp.example.com".to_owned()), + Some("https://crank.example.com".to_owned()), )) .await; let client = reqwest::Client::new(); @@ -297,7 +297,7 @@ mod tests { let base_url = spawn_mcp_server(build_app( registry.clone(), Duration::from_millis(0), - Some("https://rmcp.example.com".to_owned()), + Some("https://crank.example.com".to_owned()), )) .await; let client = reqwest::Client::new(); @@ -479,7 +479,7 @@ mod tests { async fn test_registry() -> PostgresRegistry { let database_url = env::var("TEST_DATABASE_URL") - .unwrap_or_else(|_| "postgres://rmcp:rmcp@127.0.0.1:5432/rmcp".to_owned()); + .unwrap_or_else(|_| "postgres://crank:crank@127.0.0.1:5432/crank".to_owned()); let admin_pool = PgPoolOptions::new() .max_connections(1) .connect(&database_url) diff --git a/apps/ui/index.html b/apps/ui/index.html index 865fea3..cfa159f 100644 --- a/apps/ui/index.html +++ b/apps/ui/index.html @@ -3,7 +3,7 @@ - RMCP Console + Crank Console
diff --git a/apps/ui/package-lock.json b/apps/ui/package-lock.json index f57125a..bcd80b4 100644 --- a/apps/ui/package-lock.json +++ b/apps/ui/package-lock.json @@ -1,11 +1,11 @@ { - "name": "rmcp-ui", + "name": "crank-ui", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "rmcp-ui", + "name": "crank-ui", "version": "0.1.0", "dependencies": { "@hookform/resolvers": "^5.2.2", diff --git a/apps/ui/package.json b/apps/ui/package.json index 56e897a..8190624 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -1,5 +1,5 @@ { - "name": "rmcp-ui", + "name": "crank-ui", "private": true, "version": "0.1.0", "type": "module", diff --git a/apps/ui/src/features/operation-form/model.test.ts b/apps/ui/src/features/operation-form/model.test.ts index 924c4f9..8326c2d 100644 --- a/apps/ui/src/features/operation-form/model.test.ts +++ b/apps/ui/src/features/operation-form/model.test.ts @@ -8,7 +8,7 @@ describe("buildOperationPayload", () => { ...defaultOperationFormValues, restStaticHeadersText: JSON.stringify( { - "x-app-source": "rmcp", + "x-app-source": "crank", }, null, 2, @@ -26,7 +26,7 @@ describe("buildOperationPayload", () => { expect(payload.target.kind).toBe("rest"); expect(payload.target.method).toBe("POST"); expect(payload.target.static_headers).toEqual({ - "x-app-source": "rmcp", + "x-app-source": "crank", }); expect(payload.execution_config.headers).toEqual({ "x-trace-id": "trace-123", diff --git a/apps/ui/src/pages/operation-create/page.tsx b/apps/ui/src/pages/operation-create/page.tsx index 18ae1b5..53cf456 100644 --- a/apps/ui/src/pages/operation-create/page.tsx +++ b/apps/ui/src/pages/operation-create/page.tsx @@ -1,5 +1,5 @@ import { OperationForm } from "../../features/operation-form/operation-form"; export function OperationCreatePage() { - return ; + return ; } diff --git a/apps/ui/src/shared/ui/app-shell.tsx b/apps/ui/src/shared/ui/app-shell.tsx index b36e942..0e4a4c3 100644 --- a/apps/ui/src/shared/ui/app-shell.tsx +++ b/apps/ui/src/shared/ui/app-shell.tsx @@ -51,7 +51,7 @@ export function AppShell({ children }: AppShellProps) {
- MCPaaS + Crank Tool Console
@@ -107,7 +107,7 @@ export function AppShell({ children }: AppShellProps) { -
+
{meta.section} @@ -122,11 +122,13 @@ export function AppShell({ children }: AppShellProps) {
-
-

{meta.heading}

-

{meta.subtitle}

+
+
+

{meta.heading}

+

{meta.subtitle}

+
+ {children}
- {children}
diff --git a/apps/ui/src/styles.css b/apps/ui/src/styles.css index 0a7f960..b201faa 100644 --- a/apps/ui/src/styles.css +++ b/apps/ui/src/styles.css @@ -318,9 +318,15 @@ button { .main-content { width: 100%; max-width: 1480px; - padding: 28px; margin: 0 auto; flex: 1; + display: flex; + flex-direction: column; +} + +.main-content-inner { + flex: 1; + padding: 28px; } .page-header { @@ -872,9 +878,6 @@ button { align-items: center; justify-content: space-between; gap: 16px; - width: calc(100% + 56px); - margin-left: -28px; - margin-right: -28px; padding: 12px 28px; border-radius: 0; background: rgba(255, 255, 255, 0.9); @@ -1126,10 +1129,14 @@ pre { padding: 0 20px; } - .main-content { + .main-content-inner { padding: 20px; } + .sticky-action-bar { + padding-inline: 20px; + } + .builder-content { max-width: none; } @@ -1154,18 +1161,18 @@ pre { grid-template-columns: 1fr; } + .main-content-inner { + padding: 16px; + } + + .sticky-action-bar { + padding-inline: 16px; + } + .builder-card-header, .builder-card-body, .page-section { padding-left: 16px; padding-right: 16px; } - - .sticky-action-bar { - width: calc(100% + 32px); - margin-left: -16px; - margin-right: -16px; - padding-left: 16px; - padding-right: 16px; - } } diff --git a/crates/mcpaas-adapter-graphql/Cargo.toml b/crates/crank-adapter-graphql/Cargo.toml similarity index 71% rename from crates/mcpaas-adapter-graphql/Cargo.toml rename to crates/crank-adapter-graphql/Cargo.toml index 6d84231..ad18d0f 100644 --- a/crates/mcpaas-adapter-graphql/Cargo.toml +++ b/crates/crank-adapter-graphql/Cargo.toml @@ -1,13 +1,13 @@ [package] -name = "mcpaas-adapter-graphql" +name = "crank-adapter-graphql" edition.workspace = true license.workspace = true rust-version.workspace = true version.workspace = true [dependencies] -mcpaas-core = { path = "../mcpaas-core" } -mcpaas-mapping = { path = "../mcpaas-mapping" } +crank-core = { path = "../crank-core" } +crank-mapping = { path = "../crank-mapping" } reqwest.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/mcpaas-adapter-graphql/src/client.rs b/crates/crank-adapter-graphql/src/client.rs similarity index 98% rename from crates/mcpaas-adapter-graphql/src/client.rs rename to crates/crank-adapter-graphql/src/client.rs index 416f841..9e926db 100644 --- a/crates/mcpaas-adapter-graphql/src/client.rs +++ b/crates/crank-adapter-graphql/src/client.rs @@ -1,7 +1,7 @@ use std::{collections::BTreeMap, time::Duration}; -use mcpaas_core::GraphqlTarget; -use mcpaas_mapping::JsonPath; +use crank_core::GraphqlTarget; +use crank_mapping::JsonPath; use reqwest::{ Client, header::{CONTENT_TYPE, HeaderMap, HeaderName, HeaderValue}, @@ -161,7 +161,7 @@ mod tests { use std::collections::BTreeMap; use axum::{Json, Router, routing::post}; - use mcpaas_core::{GraphqlOperationType, GraphqlTarget}; + use crank_core::{GraphqlOperationType, GraphqlTarget}; use serde_json::{Value, json}; use tokio::net::TcpListener; diff --git a/crates/mcpaas-adapter-graphql/src/error.rs b/crates/crank-adapter-graphql/src/error.rs similarity index 100% rename from crates/mcpaas-adapter-graphql/src/error.rs rename to crates/crank-adapter-graphql/src/error.rs diff --git a/crates/mcpaas-adapter-graphql/src/lib.rs b/crates/crank-adapter-graphql/src/lib.rs similarity index 100% rename from crates/mcpaas-adapter-graphql/src/lib.rs rename to crates/crank-adapter-graphql/src/lib.rs diff --git a/crates/mcpaas-adapter-graphql/src/model.rs b/crates/crank-adapter-graphql/src/model.rs similarity index 100% rename from crates/mcpaas-adapter-graphql/src/model.rs rename to crates/crank-adapter-graphql/src/model.rs diff --git a/crates/mcpaas-adapter-grpc/Cargo.toml b/crates/crank-adapter-grpc/Cargo.toml similarity index 82% rename from crates/mcpaas-adapter-grpc/Cargo.toml rename to crates/crank-adapter-grpc/Cargo.toml index 2496598..aafb201 100644 --- a/crates/mcpaas-adapter-grpc/Cargo.toml +++ b/crates/crank-adapter-grpc/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mcpaas-adapter-grpc" +name = "crank-adapter-grpc" edition.workspace = true license.workspace = true rust-version.workspace = true @@ -10,8 +10,8 @@ test-support = [] [dependencies] base64.workspace = true -mcpaas-core = { path = "../mcpaas-core" } -mcpaas-proto = { path = "../mcpaas-proto" } +crank-core = { path = "../crank-core" } +crank-proto = { path = "../crank-proto" } prost.workspace = true prost-reflect.workspace = true serde.workspace = true diff --git a/crates/mcpaas-adapter-grpc/build.rs b/crates/crank-adapter-grpc/build.rs similarity index 100% rename from crates/mcpaas-adapter-grpc/build.rs rename to crates/crank-adapter-grpc/build.rs diff --git a/crates/mcpaas-adapter-grpc/proto/echo.proto b/crates/crank-adapter-grpc/proto/echo.proto similarity index 100% rename from crates/mcpaas-adapter-grpc/proto/echo.proto rename to crates/crank-adapter-grpc/proto/echo.proto diff --git a/crates/mcpaas-adapter-grpc/src/client.rs b/crates/crank-adapter-grpc/src/client.rs similarity index 98% rename from crates/mcpaas-adapter-grpc/src/client.rs rename to crates/crank-adapter-grpc/src/client.rs index a8fb744..b58e7db 100644 --- a/crates/mcpaas-adapter-grpc/src/client.rs +++ b/crates/crank-adapter-grpc/src/client.rs @@ -1,7 +1,7 @@ use std::{collections::BTreeMap, str::FromStr, time::Duration}; use base64::{Engine as _, engine::general_purpose::STANDARD}; -use mcpaas_core::GrpcTarget; +use crank_core::GrpcTarget; use prost::Message; use prost_reflect::{DescriptorPool, MethodDescriptor, prost_types::FileDescriptorSet}; use tonic::{ @@ -138,7 +138,7 @@ fn normalize_headers(metadata: &tonic::metadata::MetadataMap) -> BTreeMap Schema { #[cfg(test)] mod tests { - use mcpaas_schema::SchemaKind; + use crank_schema::SchemaKind; use crate::{ ProtoEnum, ProtoField, ProtoFieldCardinality, ProtoFieldType, ProtoMapField, ProtoMessage, diff --git a/crates/mcpaas-proto/src/errors.rs b/crates/crank-proto/src/errors.rs similarity index 100% rename from crates/mcpaas-proto/src/errors.rs rename to crates/crank-proto/src/errors.rs diff --git a/crates/mcpaas-proto/src/lib.rs b/crates/crank-proto/src/lib.rs similarity index 100% rename from crates/mcpaas-proto/src/lib.rs rename to crates/crank-proto/src/lib.rs diff --git a/crates/mcpaas-proto/src/model/field.rs b/crates/crank-proto/src/model/field.rs similarity index 100% rename from crates/mcpaas-proto/src/model/field.rs rename to crates/crank-proto/src/model/field.rs diff --git a/crates/mcpaas-proto/src/model/message.rs b/crates/crank-proto/src/model/message.rs similarity index 100% rename from crates/mcpaas-proto/src/model/message.rs rename to crates/crank-proto/src/model/message.rs diff --git a/crates/mcpaas-proto/src/model/method.rs b/crates/crank-proto/src/model/method.rs similarity index 100% rename from crates/mcpaas-proto/src/model/method.rs rename to crates/crank-proto/src/model/method.rs diff --git a/crates/mcpaas-proto/src/model/mod.rs b/crates/crank-proto/src/model/mod.rs similarity index 100% rename from crates/mcpaas-proto/src/model/mod.rs rename to crates/crank-proto/src/model/mod.rs diff --git a/crates/mcpaas-proto/src/model/service.rs b/crates/crank-proto/src/model/service.rs similarity index 100% rename from crates/mcpaas-proto/src/model/service.rs rename to crates/crank-proto/src/model/service.rs diff --git a/crates/mcpaas-registry/Cargo.toml b/crates/crank-registry/Cargo.toml similarity index 62% rename from crates/mcpaas-registry/Cargo.toml rename to crates/crank-registry/Cargo.toml index a65873c..9db9a95 100644 --- a/crates/mcpaas-registry/Cargo.toml +++ b/crates/crank-registry/Cargo.toml @@ -1,14 +1,14 @@ [package] -name = "mcpaas-registry" +name = "crank-registry" edition.workspace = true license.workspace = true rust-version.workspace = true version.workspace = true [dependencies] -mcpaas-core = { path = "../mcpaas-core" } -mcpaas-mapping = { path = "../mcpaas-mapping" } -mcpaas-schema = { path = "../mcpaas-schema" } +crank-core = { path = "../crank-core" } +crank-mapping = { path = "../crank-mapping" } +crank-schema = { path = "../crank-schema" } serde.workspace = true serde_json.workspace = true sqlx.workspace = true diff --git a/crates/mcpaas-registry/src/error.rs b/crates/crank-registry/src/error.rs similarity index 100% rename from crates/mcpaas-registry/src/error.rs rename to crates/crank-registry/src/error.rs diff --git a/crates/mcpaas-registry/src/lib.rs b/crates/crank-registry/src/lib.rs similarity index 100% rename from crates/mcpaas-registry/src/lib.rs rename to crates/crank-registry/src/lib.rs diff --git a/crates/mcpaas-registry/src/migrations.rs b/crates/crank-registry/src/migrations.rs similarity index 100% rename from crates/mcpaas-registry/src/migrations.rs rename to crates/crank-registry/src/migrations.rs diff --git a/crates/mcpaas-registry/src/model.rs b/crates/crank-registry/src/model.rs similarity index 98% rename from crates/mcpaas-registry/src/model.rs rename to crates/crank-registry/src/model.rs index a827937..1f04854 100644 --- a/crates/mcpaas-registry/src/model.rs +++ b/crates/crank-registry/src/model.rs @@ -1,9 +1,9 @@ -use mcpaas_core::{ +use crank_core::{ AuthProfile, DescriptorId, ExportMode, Operation, OperationId, OperationStatus, Protocol, SampleId, }; -use mcpaas_mapping::MappingSet; -use mcpaas_schema::Schema; +use crank_mapping::MappingSet; +use crank_schema::Schema; use serde::{Deserialize, Serialize}; use serde_json::Value; diff --git a/crates/mcpaas-registry/src/postgres.rs b/crates/crank-registry/src/postgres.rs similarity index 98% rename from crates/mcpaas-registry/src/postgres.rs rename to crates/crank-registry/src/postgres.rs index 3bd71bf..f40ce31 100644 --- a/crates/mcpaas-registry/src/postgres.rs +++ b/crates/crank-registry/src/postgres.rs @@ -1,4 +1,4 @@ -use mcpaas_core::{AuthProfile, OperationId, OperationStatus}; +use crank_core::{AuthProfile, OperationId, OperationStatus}; use serde::{Serialize, de::DeserializeOwned}; use serde_json::Value; use sqlx::{ @@ -481,7 +481,7 @@ impl PostgresRegistry { pub async fn get_auth_profile( &self, - auth_profile_id: &mcpaas_core::AuthProfileId, + auth_profile_id: &crank_core::AuthProfileId, ) -> Result, RegistryError> { let row = sqlx::query( "select @@ -917,7 +917,7 @@ fn map_operation_version_record(row: &PgRow) -> Result Result { Ok(AuthProfile { - id: mcpaas_core::AuthProfileId::new(row.try_get::("id")?), + id: crank_core::AuthProfileId::new(row.try_get::("id")?), name: row.try_get("name")?, kind: deserialize_enum_text(&row.try_get::("kind")?, "kind")?, config: deserialize_json_value(row.try_get::, _>("config_json")?.0)?, @@ -928,7 +928,7 @@ fn map_auth_profile(row: &PgRow) -> Result { fn map_sample_metadata(row: &PgRow) -> Result { Ok(OperationSampleMetadata { - id: mcpaas_core::SampleId::new(row.try_get::("id")?), + id: crank_core::SampleId::new(row.try_get::("id")?), operation_id: OperationId::new(row.try_get::("operation_id")?), version: from_db_version(row.try_get("version")?, "version")?, sample_kind: deserialize_enum_text( @@ -944,7 +944,7 @@ fn map_sample_metadata(row: &PgRow) -> Result Result { Ok(DescriptorMetadata { - id: mcpaas_core::DescriptorId::new(row.try_get::("id")?), + id: crank_core::DescriptorId::new(row.try_get::("id")?), operation_id: row .try_get::, _>("operation_id")? .map(OperationId::new), @@ -970,7 +970,7 @@ fn map_yaml_import_job(row: &PgRow) -> Result { id: YamlImportJobId::new(row.try_get::("id")?), source_sample_id: row .try_get::, _>("source_sample_id")? - .map(mcpaas_core::SampleId::new), + .map(crank_core::SampleId::new), status: deserialize_enum_text(&row.try_get::("status")?, "status")?, format_version: row.try_get("format_version")?, mode: deserialize_enum_text(&row.try_get::("mode")?, "mode")?, @@ -1038,14 +1038,14 @@ mod tests { time::{SystemTime, UNIX_EPOCH}, }; - use mcpaas_core::{ + use crank_core::{ ApiKeyHeaderAuthConfig, AuthConfig, AuthKind, AuthProfile, ConfigExport, ExecutionConfig, ExportMode, GeneratedDraft, GeneratedDraftStatus, HttpMethod, OperationId, OperationStatus, Protocol, RestTarget, RetryPolicy, Samples, SecretRef, Target, ToolDescription, ToolExample, }; - use mcpaas_mapping::{MappingRule, MappingSet}; - use mcpaas_schema::{Schema, SchemaKind}; + use crank_mapping::{MappingRule, MappingSet}; + use crank_schema::{Schema, SchemaKind}; use serde_json::json; use sqlx::{Executor, PgPool, postgres::PgPoolOptions}; @@ -1159,12 +1159,12 @@ mod tests { registry.create_operation(&operation, None).await.unwrap(); let auth_profile = AuthProfile { - id: "auth_rmcp".into(), - name: "RMCP API key".to_owned(), + id: "auth_crank".into(), + name: "Crank API key".to_owned(), kind: AuthKind::ApiKeyHeader, config: AuthConfig::ApiKeyHeader(ApiKeyHeaderAuthConfig { header_name: "X-Api-Key".to_owned(), - secret_ref: SecretRef::new("vault://rmcp/api-key"), + secret_ref: SecretRef::new("vault://crank/api-key"), }), created_at: "2026-03-25T12:00:00Z".to_owned(), updated_at: "2026-03-25T12:00:00Z".to_owned(), @@ -1415,7 +1415,7 @@ mod tests { execution_config: ExecutionConfig { timeout_ms: 10_000, retry_policy: Some(RetryPolicy { max_attempts: 3 }), - auth_profile_ref: Some("auth_rmcp".into()), + auth_profile_ref: Some("auth_crank".into()), headers: BTreeMap::from([("X-Request-Id".to_owned(), "static".to_owned())]), protocol_options: None, }, diff --git a/crates/crank-runtime/Cargo.toml b/crates/crank-runtime/Cargo.toml new file mode 100644 index 0000000..a2ef521 --- /dev/null +++ b/crates/crank-runtime/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "crank-runtime" +edition.workspace = true +license.workspace = true +rust-version.workspace = true +version.workspace = true + +[dependencies] +crank-adapter-graphql = { path = "../crank-adapter-graphql" } +crank-adapter-grpc = { path = "../crank-adapter-grpc" } +crank-adapter-rest = { path = "../crank-adapter-rest" } +crank-core = { path = "../crank-core" } +crank-mapping = { path = "../crank-mapping" } +crank-schema = { path = "../crank-schema" } +serde.workspace = true +serde_json.workspace = true +thiserror.workspace = true + +[dev-dependencies] +axum.workspace = true +crank-adapter-grpc = { path = "../crank-adapter-grpc", features = ["test-support"] } +tokio.workspace = true diff --git a/crates/mcpaas-runtime/src/error.rs b/crates/crank-runtime/src/error.rs similarity index 73% rename from crates/mcpaas-runtime/src/error.rs rename to crates/crank-runtime/src/error.rs index 1ae1f1a..85b1827 100644 --- a/crates/mcpaas-runtime/src/error.rs +++ b/crates/crank-runtime/src/error.rs @@ -1,9 +1,9 @@ -use mcpaas_adapter_graphql::GraphqlAdapterError; -use mcpaas_adapter_grpc::GrpcAdapterError; -use mcpaas_adapter_rest::RestAdapterError; -use mcpaas_core::Protocol; -use mcpaas_mapping::MappingError; -use mcpaas_schema::SchemaError; +use crank_adapter_graphql::GraphqlAdapterError; +use crank_adapter_grpc::GrpcAdapterError; +use crank_adapter_rest::RestAdapterError; +use crank_core::Protocol; +use crank_mapping::MappingError; +use crank_schema::SchemaError; use thiserror::Error; #[derive(Debug, Error)] diff --git a/crates/mcpaas-runtime/src/executor.rs b/crates/crank-runtime/src/executor.rs similarity index 98% rename from crates/mcpaas-runtime/src/executor.rs rename to crates/crank-runtime/src/executor.rs index ab1ef6b..3871e10 100644 --- a/crates/mcpaas-runtime/src/executor.rs +++ b/crates/crank-runtime/src/executor.rs @@ -1,9 +1,9 @@ use std::collections::BTreeMap; -use mcpaas_adapter_graphql::{GraphqlAdapter, GraphqlRequest}; -use mcpaas_adapter_grpc::{GrpcAdapter, GrpcRequest}; -use mcpaas_adapter_rest::{RestAdapter, RestRequest}; -use mcpaas_core::Target; +use crank_adapter_graphql::{GraphqlAdapter, GraphqlRequest}; +use crank_adapter_grpc::{GrpcAdapter, GrpcRequest}; +use crank_adapter_rest::{RestAdapter, RestRequest}; +use crank_core::Target; use serde_json::{Map, Value, json}; use crate::{AdapterResponse, PreparedRequest, RuntimeError, RuntimeOperation}; @@ -217,14 +217,14 @@ mod tests { use std::collections::BTreeMap; use axum::{Json, Router, routing::post}; - use mcpaas_adapter_grpc::test_support as grpc_test_support; - use mcpaas_core::{ + use crank_adapter_grpc::test_support as grpc_test_support; + use crank_core::{ DescriptorId, ExecutionConfig, GeneratedDraft, GeneratedDraftStatus, GraphqlOperationType, GraphqlTarget, GrpcTarget, HttpMethod, Operation, OperationId, OperationStatus, Protocol, RestTarget, Samples, Target, ToolDescription, ToolExample, }; - use mcpaas_mapping::{MappingRule, MappingSet}; - use mcpaas_schema::{Schema, SchemaKind}; + use crank_mapping::{MappingRule, MappingSet}; + use crank_schema::{Schema, SchemaKind}; use serde_json::{Value, json}; use tokio::net::TcpListener; diff --git a/crates/mcpaas-runtime/src/lib.rs b/crates/crank-runtime/src/lib.rs similarity index 100% rename from crates/mcpaas-runtime/src/lib.rs rename to crates/crank-runtime/src/lib.rs diff --git a/crates/mcpaas-runtime/src/model.rs b/crates/crank-runtime/src/model.rs similarity index 93% rename from crates/mcpaas-runtime/src/model.rs rename to crates/crank-runtime/src/model.rs index 54a27e6..af54c04 100644 --- a/crates/mcpaas-runtime/src/model.rs +++ b/crates/crank-runtime/src/model.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; -use mcpaas_core::{ExecutionConfig, Operation, OperationId, Protocol, Target, ToolDescription}; -use mcpaas_mapping::MappingSet; -use mcpaas_schema::Schema; +use crank_core::{ExecutionConfig, Operation, OperationId, Protocol, Target, ToolDescription}; +use crank_mapping::MappingSet; +use crank_schema::Schema; use serde::{Deserialize, Serialize}; use serde_json::Value; diff --git a/crates/mcpaas-mapping/Cargo.toml b/crates/crank-schema/Cargo.toml similarity index 79% rename from crates/mcpaas-mapping/Cargo.toml rename to crates/crank-schema/Cargo.toml index 8c3fc5e..1592938 100644 --- a/crates/mcpaas-mapping/Cargo.toml +++ b/crates/crank-schema/Cargo.toml @@ -1,12 +1,12 @@ [package] -name = "mcpaas-mapping" +name = "crank-schema" edition.workspace = true license.workspace = true rust-version.workspace = true version.workspace = true [dependencies] -mcpaas-core = { path = "../mcpaas-core" } +crank-core = { path = "../crank-core" } serde.workspace = true serde_json.workspace = true thiserror.workspace = true diff --git a/crates/mcpaas-schema/src/error.rs b/crates/crank-schema/src/error.rs similarity index 100% rename from crates/mcpaas-schema/src/error.rs rename to crates/crank-schema/src/error.rs diff --git a/crates/mcpaas-schema/src/lib.rs b/crates/crank-schema/src/lib.rs similarity index 100% rename from crates/mcpaas-schema/src/lib.rs rename to crates/crank-schema/src/lib.rs diff --git a/crates/mcpaas-schema/src/model.rs b/crates/crank-schema/src/model.rs similarity index 100% rename from crates/mcpaas-schema/src/model.rs rename to crates/crank-schema/src/model.rs diff --git a/crates/mcpaas-schema/src/normalize.rs b/crates/crank-schema/src/normalize.rs similarity index 100% rename from crates/mcpaas-schema/src/normalize.rs rename to crates/crank-schema/src/normalize.rs diff --git a/crates/mcpaas-schema/src/validate.rs b/crates/crank-schema/src/validate.rs similarity index 100% rename from crates/mcpaas-schema/src/validate.rs rename to crates/crank-schema/src/validate.rs diff --git a/crates/mcpaas-runtime/Cargo.toml b/crates/mcpaas-runtime/Cargo.toml deleted file mode 100644 index de9fa35..0000000 --- a/crates/mcpaas-runtime/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "mcpaas-runtime" -edition.workspace = true -license.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -mcpaas-adapter-graphql = { path = "../mcpaas-adapter-graphql" } -mcpaas-adapter-grpc = { path = "../mcpaas-adapter-grpc" } -mcpaas-adapter-rest = { path = "../mcpaas-adapter-rest" } -mcpaas-core = { path = "../mcpaas-core" } -mcpaas-mapping = { path = "../mcpaas-mapping" } -mcpaas-schema = { path = "../mcpaas-schema" } -serde.workspace = true -serde_json.workspace = true -thiserror.workspace = true - -[dev-dependencies] -axum.workspace = true -mcpaas-adapter-grpc = { path = "../mcpaas-adapter-grpc", features = ["test-support"] } -tokio.workspace = true diff --git a/docker-compose.yml b/docker-compose.yml index b906b12..35b1968 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,15 +3,15 @@ services: image: postgres:16-alpine restart: unless-stopped environment: - POSTGRES_DB: ${POSTGRES_DB:-rmcp} - POSTGRES_USER: ${POSTGRES_USER:-rmcp} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-rmcp} + POSTGRES_DB: ${POSTGRES_DB:-crank} + POSTGRES_USER: ${POSTGRES_USER:-crank} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-crank} volumes: - postgres_data:/var/lib/postgresql/data ports: - "127.0.0.1:5432:5432" healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-rmcp} -d ${POSTGRES_DB:-rmcp}"] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-crank} -d ${POSTGRES_DB:-crank}"] interval: 10s timeout: 5s retries: 5 @@ -22,18 +22,18 @@ services: dockerfile: apps/admin-api/Dockerfile restart: unless-stopped environment: - MCPAAS_DATABASE_URL: ${MCPAAS_DATABASE_URL:-postgres://rmcp:rmcp@postgres:5432/rmcp} - MCPAAS_STORAGE_ROOT: ${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} - MCPAAS_ADMIN_BIND: ${MCPAAS_ADMIN_BIND:-0.0.0.0:3001} - MCPAAS_LOG_LEVEL: ${MCPAAS_LOG_LEVEL:-info} - MCPAAS_SECRET_PROVIDER: ${MCPAAS_SECRET_PROVIDER:-env} + CRANK_DATABASE_URL: ${CRANK_DATABASE_URL:-postgres://crank:crank@postgres:5432/crank} + CRANK_STORAGE_ROOT: ${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} + CRANK_ADMIN_BIND: ${CRANK_ADMIN_BIND:-0.0.0.0:3001} + CRANK_LOG_LEVEL: ${CRANK_LOG_LEVEL:-info} + CRANK_SECRET_PROVIDER: ${CRANK_SECRET_PROVIDER:-env} depends_on: postgres: condition: service_healthy volumes: - - artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} + - artifact_storage:${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} ports: - - "${MCPAAS_PUBLISH_HOST:-127.0.0.1}:3001:3001" + - "${CRANK_PUBLISH_HOST:-127.0.0.1}:3001:3001" healthcheck: test: ["CMD", "curl", "--fail", "http://127.0.0.1:3001/health"] interval: 15s @@ -46,18 +46,18 @@ services: dockerfile: apps/mcp-server/Dockerfile restart: unless-stopped environment: - MCPAAS_DATABASE_URL: ${MCPAAS_DATABASE_URL:-postgres://rmcp:rmcp@postgres:5432/rmcp} - MCPAAS_STORAGE_ROOT: ${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} - MCPAAS_MCP_BIND: ${MCPAAS_MCP_BIND:-0.0.0.0:3002} - MCPAAS_LOG_LEVEL: ${MCPAAS_LOG_LEVEL:-info} - MCPAAS_SECRET_PROVIDER: ${MCPAAS_SECRET_PROVIDER:-env} + CRANK_DATABASE_URL: ${CRANK_DATABASE_URL:-postgres://crank:crank@postgres:5432/crank} + CRANK_STORAGE_ROOT: ${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} + CRANK_MCP_BIND: ${CRANK_MCP_BIND:-0.0.0.0:3002} + CRANK_LOG_LEVEL: ${CRANK_LOG_LEVEL:-info} + CRANK_SECRET_PROVIDER: ${CRANK_SECRET_PROVIDER:-env} depends_on: postgres: condition: service_healthy volumes: - - artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} + - artifact_storage:${CRANK_STORAGE_ROOT:-/var/lib/crank/storage} ports: - - "${MCPAAS_PUBLISH_HOST:-127.0.0.1}:3002:3002" + - "${CRANK_PUBLISH_HOST:-127.0.0.1}:3002:3002" healthcheck: test: ["CMD", "curl", "--fail", "http://127.0.0.1:3002/health"] interval: 15s @@ -70,7 +70,7 @@ services: dockerfile: apps/ui/Dockerfile restart: unless-stopped ports: - - "${MCPAAS_PUBLISH_HOST:-127.0.0.1}:3000:3000" + - "${CRANK_PUBLISH_HOST:-127.0.0.1}:3000:3000" healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/"] interval: 15s diff --git a/docs/architecture.md b/docs/architecture.md index 5256527..51afb4b 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -279,7 +279,7 @@ gRPC target: ## 9. Основные компоненты -### `mcpaas-core` +### `crank-core` Ответственность: @@ -288,7 +288,7 @@ gRPC target: - статусы и базовые protocol-specific target types, - общие ошибки. -### `mcpaas-schema` +### `crank-schema` Ответственность: @@ -296,7 +296,7 @@ gRPC target: - представление типов и полей для UI и runtime, - валидация JSON относительно внутренней схемы. -### `mcpaas-mapping` +### `crank-mapping` Ответственность: @@ -305,7 +305,7 @@ gRPC target: - применение input/output mapping, - генерация чернового mapping по sample-данным и схемам. -### `mcpaas-proto` +### `crank-proto` Ответственность: @@ -314,7 +314,7 @@ gRPC target: - извлечение services, methods и message schemas, - преобразование protobuf metadata в нормализованные схемы. -### `mcpaas-registry` +### `crank-registry` Ответственность: @@ -323,7 +323,7 @@ gRPC target: - выдача списка активных tools, - инвалидация кэша и сигналы на reload. -### `mcpaas-runtime` +### `crank-runtime` Ответственность: @@ -333,7 +333,7 @@ gRPC target: - применение output mapping, - единообразные runtime-ошибки. -### `mcpaas-adapter-rest` +### `crank-adapter-rest` Ответственность: @@ -341,7 +341,7 @@ gRPC target: - отправка запроса через `reqwest`, - нормализация HTTP-ответа в JSON. -### `mcpaas-adapter-graphql` +### `crank-adapter-graphql` Ответственность: @@ -350,7 +350,7 @@ gRPC target: - отправка запроса, - извлечение `data` и ошибок из GraphQL-ответа. -### `mcpaas-adapter-grpc` +### `crank-adapter-grpc` Ответственность: @@ -358,7 +358,7 @@ gRPC target: - вызов unary RPC метода, - преобразование protobuf response обратно в нормализованный JSON. -### `mcpaas-admin-api` +### `crank-admin-api` Ответственность: @@ -370,7 +370,7 @@ gRPC target: - endpoints для тестового выполнения операций, - discovery endpoints для gRPC metadata. -### `mcpaas-mcp-server` +### `crank-mcp-server` Ответственность: @@ -379,7 +379,7 @@ gRPC target: - делегирование выполнения в runtime, - возврат нормализованного результата MCP-клиенту. -### `mcpaas-ui` +### `crank-ui` Ответственность: @@ -407,21 +407,21 @@ gRPC target: Для реализации рекомендуется workspace-структура: ```text -mcpaas/ +crank/ apps/ admin-api/ mcp-server/ ui/ crates/ - mcpaas-core/ - mcpaas-schema/ - mcpaas-mapping/ - mcpaas-proto/ - mcpaas-registry/ - mcpaas-runtime/ - mcpaas-adapter-rest/ - mcpaas-adapter-graphql/ - mcpaas-adapter-grpc/ + crank-core/ + crank-schema/ + crank-mapping/ + crank-proto/ + crank-registry/ + crank-runtime/ + crank-adapter-rest/ + crank-adapter-graphql/ + crank-adapter-grpc/ docs/ ``` diff --git a/docs/data-model.md b/docs/data-model.md index 508a3a7..0638682 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -169,7 +169,7 @@ "method": "PATCH", "path_template": "/v1/users/{userId}", "static_headers": { - "X-App-Source": "mcpaas" + "X-App-Source": "crank" } } ``` @@ -437,7 +437,7 @@ }, "auth_profile_ref": "auth_01hr7x8rj2d8nq8v0c4m4t1r9e", "headers": { - "X-Client": "mcpaas" + "X-Client": "crank" }, "protocol_options": { "rest": null, @@ -717,10 +717,10 @@ operation: Эта модель задает основу для: -- Rust structs в `mcpaas-core`, `mcpaas-schema`, `mcpaas-mapping`; +- Rust structs в `crank-core`, `crank-schema`, `crank-mapping`; - DTO для `admin-api`; - таблиц `operations`, `operation_versions`, `operation_samples`, `operation_descriptors`; - import/export layer для `YAML` конфигураций; -- runtime view, который будет передаваться в `mcpaas-runtime`. +- runtime view, который будет передаваться в `crank-runtime`. Следующим логическим шагом после этого документа должна стать схема БД, в которой эти сущности будут разложены по таблицам и связям. diff --git a/docs/database-schema.md b/docs/database-schema.md index 83275c2..067a4d2 100644 --- a/docs/database-schema.md +++ b/docs/database-schema.md @@ -2,7 +2,7 @@ ## 1. Назначение документа -Этот документ фиксирует структуру хранения конфигураций, версий операций, загруженных артефактов и published runtime-view. Его цель - дать основу для SQL-миграций и для реализации `mcpaas-registry`. +Этот документ фиксирует структуру хранения конфигураций, версий операций, загруженных артефактов и published runtime-view. Его цель - дать основу для SQL-миграций и для реализации `crank-registry`. В документе предполагается реляционная модель, ориентированная на `PostgreSQL`. Канонической считается схема, совместимая с `PostgreSQL`. diff --git a/docs/demo-runbook.md b/docs/demo-runbook.md index 6b07124..fe2613d 100644 --- a/docs/demo-runbook.md +++ b/docs/demo-runbook.md @@ -2,14 +2,14 @@ ## 1. Цель документа -Этот документ фиксирует минимальный воспроизводимый сценарий запуска и демонстрации MCPaaS без знания внутренней структуры кода. +Этот документ фиксирует минимальный воспроизводимый сценарий запуска и демонстрации Crank без знания внутренней структуры кода. ## 2. Предусловия - доступен `PostgreSQL`; -- задан `MCPAAS_DATABASE_URL`; -- задан `MCPAAS_STORAGE_ROOT`; -- доступны `MCPAAS_ADMIN_BIND` и `MCPAAS_MCP_BIND`; +- задан `CRANK_DATABASE_URL`; +- задан `CRANK_STORAGE_ROOT`; +- доступны `CRANK_ADMIN_BIND` и `CRANK_MCP_BIND`; - для UI установлен `Node.js`; - для Rust-части установлен toolchain из `rust-toolchain.toml`. diff --git a/docs/deployment.md b/docs/deployment.md index 6914754..c5504db 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -169,7 +169,7 @@ services: - не публиковать внутренние сервисы наружу без необходимости; - содержать healthchecks. -Практически это должно быть управляемо через env вроде `MCPAAS_PUBLISH_HOST`: +Практически это должно быть управляемо через env вроде `CRANK_PUBLISH_HOST`: - `127.0.0.1` для local reverse proxy на том же Linux host; - конкретный внутренний IP или `0.0.0.0` для отдельного центрального reverse proxy в LAN. diff --git a/docs/development-rules.md b/docs/development-rules.md index bb26bb7..afed24a 100644 --- a/docs/development-rules.md +++ b/docs/development-rules.md @@ -55,10 +55,10 @@ ### 5.1. Что пишется через TDD обязательно -- `mcpaas-schema` -- `mcpaas-mapping` -- `mcpaas-registry` -- `mcpaas-runtime` +- `crank-schema` +- `crank-mapping` +- `crank-registry` +- `crank-runtime` - YAML import/export - versioning logic @@ -171,7 +171,7 @@ Удаленный репозиторий проекта: ```text -git@github.com:bsodfather/rmcp.git +git@github.com:bsodfather/crank.git ``` ### 8.2. Ветки diff --git a/docs/diagrams.md b/docs/diagrams.md index 76b3ac7..45001a4 100644 --- a/docs/diagrams.md +++ b/docs/diagrams.md @@ -15,15 +15,15 @@ ```mermaid flowchart LR - UI[mcpaas-ui] + UI[crank-ui] ADMIN[admin-api] MCP[mcp-server] - REG[mcpaas-registry] - RUN[mcpaas-runtime] - CORE[mcpaas-core] - SCHEMA[mcpaas-schema] - MAP[mcpaas-mapping] - PROTO[mcpaas-proto] + REG[crank-registry] + RUN[crank-runtime] + CORE[crank-core] + SCHEMA[crank-schema] + MAP[crank-mapping] + PROTO[crank-proto] REST[adapter-rest] GQL[adapter-graphql] GRPC[adapter-grpc] @@ -58,15 +58,15 @@ flowchart LR ```mermaid flowchart TD - CORE[mcpaas-core] - SCHEMA[mcpaas-schema] - MAP[mcpaas-mapping] - PROTO[mcpaas-proto] - REG[mcpaas-registry] - RUN[mcpaas-runtime] - REST[mcpaas-adapter-rest] - GQL[mcpaas-adapter-graphql] - GRPC[mcpaas-adapter-grpc] + CORE[crank-core] + SCHEMA[crank-schema] + MAP[crank-mapping] + PROTO[crank-proto] + REG[crank-registry] + RUN[crank-runtime] + REST[crank-adapter-rest] + GQL[crank-adapter-graphql] + GRPC[crank-adapter-grpc] ADMIN[apps/admin-api] MCP[apps/mcp-server] diff --git a/docs/implementation-plan.md b/docs/implementation-plan.md index c79b863..e965ebf 100644 --- a/docs/implementation-plan.md +++ b/docs/implementation-plan.md @@ -25,15 +25,15 @@ - `apps/admin-api` - `apps/mcp-server` - `apps/ui` -- `crates/mcpaas-core` -- `crates/mcpaas-schema` -- `crates/mcpaas-mapping` -- `crates/mcpaas-proto` -- `crates/mcpaas-registry` -- `crates/mcpaas-runtime` -- `crates/mcpaas-adapter-rest` -- `crates/mcpaas-adapter-graphql` -- `crates/mcpaas-adapter-grpc` +- `crates/crank-core` +- `crates/crank-schema` +- `crates/crank-mapping` +- `crates/crank-proto` +- `crates/crank-registry` +- `crates/crank-runtime` +- `crates/crank-adapter-rest` +- `crates/crank-adapter-graphql` +- `crates/crank-adapter-grpc` Результат: @@ -87,7 +87,7 @@ DoD: Цель: -- реализовать `mcpaas-schema`. +- реализовать `crank-schema`. Фичи: @@ -113,7 +113,7 @@ DoD: Цель: -- реализовать `mcpaas-mapping`. +- реализовать `crank-mapping`. Фичи: @@ -139,7 +139,7 @@ DoD: Цель: -- реализовать `mcpaas-registry` и миграции. +- реализовать `crank-registry` и миграции. Фичи: @@ -171,8 +171,8 @@ DoD: Фичи: -- `mcpaas-adapter-rest` -- `mcpaas-runtime` для REST +- `crank-adapter-rest` +- `crank-runtime` для REST - REST test run - создание REST operation - publish REST operation @@ -282,7 +282,7 @@ DoD: Фичи: -- `mcpaas-adapter-graphql` +- `crank-adapter-graphql` - GraphQL target support; - variables mapping; - `response_path`; @@ -309,11 +309,11 @@ DoD: Фичи: -- `mcpaas-proto` +- `crank-proto` - descriptor loading; - service/method discovery; - protobuf normalization; -- `mcpaas-adapter-grpc` +- `crank-adapter-grpc` - unary test runs; - publish и вызов через MCP. diff --git a/docs/mcp-interface.md b/docs/mcp-interface.md index 541a122..be33f93 100644 --- a/docs/mcp-interface.md +++ b/docs/mcp-interface.md @@ -18,7 +18,7 @@ Причина: -- проект задуман как `MCPaaS`, а не как локальный single-process adapter; +- проект задуман как `Crank`, а не как локальный single-process adapter; - нужен удаленный доступ к опубликованным tools; - published tools должны обновляться без пересборки и без локального обертывания каждого клиента. @@ -127,7 +127,7 @@ MVP-контракт `mcp-server` строится вокруг JSON-RPC мет 1. MCP client вызывает tool. 2. `mcp-server` находит published runtime view. 3. Валидирует input относительно schema. -4. Делегирует вызов в `mcpaas-runtime`. +4. Делегирует вызов в `crank-runtime`. 5. Возвращает результат. ## 9. Обновление tools diff --git a/docs/module-decomposition.md b/docs/module-decomposition.md index 77f2841..c6b9882 100644 --- a/docs/module-decomposition.md +++ b/docs/module-decomposition.md @@ -2,7 +2,7 @@ ## 1. Цель документа -Этот документ фиксирует детальную структуру проекта до начала активной разработки. Его задача - заранее ограничить ответственность каждого компонента, избежать разрастания `mcpaas-core`, не допустить появления "универсальных" структур на все случаи жизни и сохранить понятные границы между доменной логикой, runtime, адаптерами, API и UI. +Этот документ фиксирует детальную структуру проекта до начала активной разработки. Его задача - заранее ограничить ответственность каждого компонента, избежать разрастания `crank-core`, не допустить появления "универсальных" структур на все случаи жизни и сохранить понятные границы между доменной логикой, runtime, адаптерами, API и UI. Основной принцип: каждый crate отвечает за один слой системы. Внутри crate модули должны быть маленькими, тематическими и с минимальным количеством публичных сущностей. @@ -20,7 +20,7 @@ ### 2.2. Что запрещено -- помещать SQL, HTTP-клиенты или gRPC-клиенты в `mcpaas-core`; +- помещать SQL, HTTP-клиенты или gRPC-клиенты в `crank-core`; - хранить в `core` "общие утилиты", не относящиеся к доменной модели; - делать `runtime`, который напрямую читает БД; - писать mapping-логику внутри REST, GraphQL или gRPC адаптеров; @@ -41,28 +41,28 @@ Рекомендуемая структура: ```text -mcpaas/ +crank/ apps/ admin-api/ mcp-server/ ui/ crates/ - mcpaas-core/ - mcpaas-registry/ - mcpaas-runtime/ - mcpaas-adapter-rest/ - mcpaas-adapter-graphql/ - mcpaas-adapter-grpc/ - mcpaas-mapping/ - mcpaas-schema/ - mcpaas-proto/ + crank-core/ + crank-registry/ + crank-runtime/ + crank-adapter-rest/ + crank-adapter-graphql/ + crank-adapter-grpc/ + crank-mapping/ + crank-schema/ + crank-proto/ ``` -Дополнительные crates `mcpaas-mapping`, `mcpaas-schema` и `mcpaas-proto` нужны затем, чтобы не перегружать `mcpaas-core`. +Дополнительные crates `crank-mapping`, `crank-schema` и `crank-proto` нужны затем, чтобы не перегружать `crank-core`. ## 4. Детальная декомпозиция по crate -### 4.1. `mcpaas-core` +### 4.1. `crank-core` Назначение: @@ -74,7 +74,7 @@ mcpaas/ Что должно лежать в crate: ```text -mcpaas-core/ +crank-core/ src/ lib.rs ids.rs @@ -119,9 +119,9 @@ mcpaas-core/ Причина: -`mcpaas-core` должен быть максимально стабильным и независимым. Если положить туда все подряд, он станет точкой связности всей системы. +`crank-core` должен быть максимально стабильным и независимым. Если положить туда все подряд, он станет точкой связности всей системы. -### 4.2. `mcpaas-schema` +### 4.2. `crank-schema` Назначение: @@ -133,7 +133,7 @@ mcpaas-core/ Структура: ```text -mcpaas-schema/ +crank-schema/ src/ lib.rs schema/ @@ -173,7 +173,7 @@ mcpaas-schema/ Схемы будут использоваться почти везде, но это не повод тащить их в `core`. Иначе `core` станет тяжелым и начнет менять версию при каждом изменении схемной логики. -### 4.3. `mcpaas-mapping` +### 4.3. `crank-mapping` Назначение: @@ -186,7 +186,7 @@ mcpaas-schema/ Структура: ```text -mcpaas-mapping/ +crank-mapping/ src/ lib.rs model/ @@ -229,7 +229,7 @@ mcpaas-mapping/ не помещать mapping-правила в строковые поля, которые потом интерпретируются каждым адаптером по-своему. Mapping должен быть единым движком. -### 4.4. `mcpaas-proto` +### 4.4. `crank-proto` Назначение: @@ -240,7 +240,7 @@ mcpaas-mapping/ Структура: ```text -mcpaas-proto/ +crank-proto/ src/ lib.rs descriptor/ @@ -272,14 +272,14 @@ mcpaas-proto/ - `descriptor/registry.rs` - индексирование описаний для поиска services/methods. - `reflect/client.rs` - клиент server reflection, если будет добавлен. - `model/*` - protobuf-ориентированная промежуточная модель. -- `convert/to_schema.rs` - перевод protobuf message в `mcpaas-schema`. +- `convert/to_schema.rs` - перевод protobuf message в `crank-schema`. - `convert/to_json.rs` и `from_json.rs` - преобразование runtime payload. Почему отдельный crate: protobuf-логика объемная и быстро начнет загрязнять gRPC adapter, если не отделить ее сразу. -### 4.5. `mcpaas-registry` +### 4.5. `crank-registry` Назначение: @@ -290,7 +290,7 @@ protobuf-логика объемная и быстро начнет загряз Структура: ```text -mcpaas-registry/ +crank-registry/ src/ lib.rs model/ @@ -332,7 +332,7 @@ mcpaas-registry/ `registry` не выполняет операции и не знает о `reqwest`/`tonic`. Он только хранит и отдает согласованные представления. -### 4.6. `mcpaas-runtime` +### 4.6. `crank-runtime` Назначение: @@ -343,7 +343,7 @@ mcpaas-registry/ Структура: ```text -mcpaas-runtime/ +crank-runtime/ src/ lib.rs executor/ @@ -380,7 +380,7 @@ mcpaas-runtime/ `runtime` не должен знать, где хранится операция. Он получает уже готовую `runtime_operation`. -### 4.7. `mcpaas-adapter-rest` +### 4.7. `crank-adapter-rest` Назначение: @@ -389,7 +389,7 @@ mcpaas-runtime/ Структура: ```text -mcpaas-adapter-rest/ +crank-adapter-rest/ src/ lib.rs client.rs @@ -411,7 +411,7 @@ mcpaas-adapter-rest/ REST adapter не валидирует MCP input и не знает о registry. Он получает уже подготовленный request contract. -### 4.8. `mcpaas-adapter-graphql` +### 4.8. `crank-adapter-graphql` Назначение: @@ -420,7 +420,7 @@ REST adapter не валидирует MCP input и не знает о registry. Структура: ```text -mcpaas-adapter-graphql/ +crank-adapter-graphql/ src/ lib.rs client.rs @@ -443,7 +443,7 @@ GraphQL adapter не занимается introspection по умолчанию один GraphQL tool соответствует одному заранее определенному `query` или `mutation`. Адаптер не должен принимать от LLM произвольный GraphQL-документ, потому что в MCP-модели операция должна оставаться узкой, предсказуемой и валидируемой по фиксированной схеме. -### 4.9. `mcpaas-adapter-grpc` +### 4.9. `crank-adapter-grpc` Назначение: @@ -452,7 +452,7 @@ GraphQL adapter не занимается introspection по умолчанию Структура: ```text -mcpaas-adapter-grpc/ +crank-adapter-grpc/ src/ lib.rs channel.rs @@ -470,7 +470,7 @@ mcpaas-adapter-grpc/ Правило: -gRPC adapter не должен сам парсить `.proto`. Этим занимается `mcpaas-proto`. Иначе в адаптере смешаются discovery и execution. +gRPC adapter не должен сам парсить `.proto`. Этим занимается `crank-proto`. Иначе в адаптере смешаются discovery и execution. Дополнительное ограничение: @@ -609,22 +609,22 @@ UI должен декомпозироваться по пользователь Целевой граф зависимостей: ```text -mcpaas-core -mcpaas-schema -> mcpaas-core -mcpaas-mapping -> mcpaas-core -mcpaas-proto -> mcpaas-core, mcpaas-schema -mcpaas-registry -> mcpaas-core, mcpaas-schema, mcpaas-mapping -mcpaas-adapter-rest -> mcpaas-core -mcpaas-adapter-graphql -> mcpaas-core -mcpaas-adapter-grpc -> mcpaas-core, mcpaas-proto -mcpaas-runtime -> mcpaas-core, mcpaas-schema, mcpaas-mapping, adapters -admin-api -> mcpaas-core, mcpaas-schema, mcpaas-mapping, mcpaas-proto, mcpaas-registry, mcpaas-runtime -mcp-server -> mcpaas-core, mcpaas-registry, mcpaas-runtime +crank-core +crank-schema -> crank-core +crank-mapping -> crank-core +crank-proto -> crank-core, crank-schema +crank-registry -> crank-core, crank-schema, crank-mapping +crank-adapter-rest -> crank-core +crank-adapter-graphql -> crank-core +crank-adapter-grpc -> crank-core, crank-proto +crank-runtime -> crank-core, crank-schema, crank-mapping, adapters +admin-api -> crank-core, crank-schema, crank-mapping, crank-proto, crank-registry, crank-runtime +mcp-server -> crank-core, crank-registry, crank-runtime ``` Критические ограничения: -- `mcpaas-core` ни от кого не зависит; +- `crank-core` ни от кого не зависит; - адаптеры не зависят от `registry`; - `runtime` не зависит от `admin-api` и `mcp-server`; - `registry` не зависит от адаптеров; @@ -675,17 +675,17 @@ mcp-server -> mcpaas-core, mcpaas-registry, mcpaas-runtime Рекомендуемый порядок разработки: -1. `mcpaas-core` -2. `mcpaas-schema` -3. `mcpaas-mapping` -4. `mcpaas-registry` -5. `mcpaas-adapter-rest` -6. `mcpaas-runtime` +1. `crank-core` +2. `crank-schema` +3. `crank-mapping` +4. `crank-registry` +5. `crank-adapter-rest` +6. `crank-runtime` 7. `admin-api` 8. `ui` -9. `mcpaas-proto` -10. `mcpaas-adapter-grpc` -11. `mcpaas-adapter-graphql` +9. `crank-proto` +10. `crank-adapter-grpc` +11. `crank-adapter-graphql` 12. `mcp-server` Причина такого порядка: @@ -699,7 +699,7 @@ mcp-server -> mcpaas-core, mcpaas-registry, mcpaas-runtime Если придерживаться этой декомпозиции, то: -- `mcpaas-core` останется маленьким и стабильным; +- `crank-core` останется маленьким и стабильным; - schema и mapping не смешаются с transport-логикой; - protobuf discovery не загрязнит gRPC runtime; - `admin-api` и `mcp-server` останутся тонкими входными слоями; diff --git a/docs/runtime-config.md b/docs/runtime-config.md index c614756..3695e6e 100644 --- a/docs/runtime-config.md +++ b/docs/runtime-config.md @@ -28,7 +28,7 @@ Рекомендуемая структура: ```text -var/mcpaas/ +var/crank/ samples/ descriptors/ yaml-imports/ @@ -57,24 +57,24 @@ var/mcpaas/ Минимально ожидаются: -- `MCPAAS_DATABASE_URL` -- `MCPAAS_STORAGE_ROOT` -- `MCPAAS_ADMIN_BIND` -- `MCPAAS_MCP_BIND` -- `MCPAAS_MCP_REFRESH_MS` -- `MCPAAS_LOG_LEVEL` -- `MCPAAS_SECRET_PROVIDER` -- `MCPAAS_PUBLIC_BASE_URL` -- `MCPAAS_MCP_PUBLIC_URL` +- `CRANK_DATABASE_URL` +- `CRANK_STORAGE_ROOT` +- `CRANK_ADMIN_BIND` +- `CRANK_MCP_BIND` +- `CRANK_MCP_REFRESH_MS` +- `CRANK_LOG_LEVEL` +- `CRANK_SECRET_PROVIDER` +- `CRANK_PUBLIC_BASE_URL` +- `CRANK_MCP_PUBLIC_URL` Опционально: -- `MCPAAS_ADMIN_TOKEN` -- `MCPAAS_MASTER_KEY` +- `CRANK_ADMIN_TOKEN` +- `CRANK_MASTER_KEY` Стартовое значение для refresh published tools: -- `MCPAAS_MCP_REFRESH_MS=5000` +- `CRANK_MCP_REFRESH_MS=5000` ## 6. Логирование и трассировка diff --git a/docs/rust-design.md b/docs/rust-design.md index b72a4e8..531d909 100644 --- a/docs/rust-design.md +++ b/docs/rust-design.md @@ -343,35 +343,35 @@ where ## 11. Рекомендуемые `impl`-блоки по проекту -### В `mcpaas-core` +### В `crank-core` - маленькие `impl` на domain types; - status helpers; - derived metadata methods. -### В `mcpaas-schema` +### В `crank-schema` - schema validation; - field traversal; - shape helpers. -### В `mcpaas-mapping` +### В `crank-mapping` - JSONPath validation; - mapping rule helpers; - execution helpers. -### В `mcpaas-proto` +### В `crank-proto` - metadata conversion helpers; - descriptor lookup helpers. -### В `mcpaas-registry` +### В `crank-registry` - service methods, а не методы на доменных структурах; - repository implementations. -### В `mcpaas-runtime` +### В `crank-runtime` - orchestration services; - adapter dispatch; diff --git a/docs/testing-strategy.md b/docs/testing-strategy.md index 5321ab0..5736e2d 100644 --- a/docs/testing-strategy.md +++ b/docs/testing-strategy.md @@ -17,10 +17,10 @@ Покрывают: -- `mcpaas-schema` -- `mcpaas-mapping` -- `mcpaas-proto` -- небольшие части `mcpaas-core` +- `crank-schema` +- `crank-mapping` +- `crank-proto` +- небольшие части `crank-core` Что проверять: @@ -35,8 +35,8 @@ Покрывают: -- `mcpaas-registry` с реальной БД; -- `mcpaas-runtime` с реальными adapter contracts; +- `crank-registry` с реальной БД; +- `crank-runtime` с реальными adapter contracts; - `admin-api` на поднятом приложении; - publish flow и YAML import/export.