Estrutura do projeto
O carmy new cria esta estrutura:
shop/├── Cargo.toml├── carmy.toml # nome, endereço, timeout; variáveis CARMY_* sobrescrevem├── README.md├── .gitignore└── src/ ├── main.rs # o ponto de entrada └── tools/ ├── mod.rs # uma linha `mod` por tool └── hello.rs # uma tool e seus testessrc/main.rs
Seção intitulada “src/main.rs”mod tools;
#[tokio::main]async fn main() -> carmy::Result { carmy::run().await}carmy::run() é um atalho para carmy::app().run().await. O carmy::app() faz três
coisas:
- lê a configuração do
carmy.tomle do ambiente - registra toda tool declarada com
#[carmy::tool] - escolhe o transporte pelo primeiro argumento da linha de comando
Para registrar dependências compartilhadas, use o builder:
#[tokio::main]async fn main() -> carmy::Result { let db = Db::connect("postgres://localhost/shop").await.expect("database"); carmy::app().state(db).run().await}src/tools/
Seção intitulada “src/tools/”A convenção é um arquivo por tool. Declare cada arquivo em src/tools/mod.rs:
//! Um arquivo por tool. Declare cada arquivo aqui; `#[carmy::tool]` o registra.mod hello;mod search;Mantenha os testes de uma tool no mesmo arquivo (veja Testes).
carmy.toml
Seção intitulada “carmy.toml”name = "shop" # CARMY_NAMEaddress = "127.0.0.1:3000" # CARMY_ADDRtimeout_secs = 30 # CARMY_TIMEOUT_SECSComandos
Seção intitulada “Comandos”| comando | efeito |
|---|---|
cargo run ou cargo run -- server |
serve HTTP no endereço configurado |
cargo run -- mcp |
serve MCP via stdin/stdout |
cargo run -- tools |
imprime o catálogo de tools em JSON |
cargo test |
roda os testes |