Pular para o conteúdo

Início rápido

  1. Instale o CLI

    Janela do terminal
    cargo install carmy-cli

    O Carmy exige Rust 1.88 ou mais recente.

  2. Crie uma aplicação

    Janela do terminal
    carmy new shop
    cd shop

    O projeto segue as convenções do Carmy: src/main.rs, um arquivo por tool em src/tools/ e um carmy.toml.

  3. Sirva via HTTP

    Janela do terminal
    cargo run
    Janela do terminal
    $ curl localhost:3000/.well-known/agent
    {"capabilities":["tools","streaming","idempotency"],"execute_url":"/agent/execute","protocol":"carmy/1","server":"shop","tools_url":"/agent/tools","tools_version":"…"}
    $ curl localhost:3000/agent/execute -H 'content-type: application/json' \
    -d '{"tool":"hello","arguments":{"name":"Ada"}}'
    {"execution_id":"exec_…","status":"completed","data":{"message":"Hello, Ada!"},"_agent":{"cacheable":true,"next_actions":[]}}
  4. Sirva o mesmo app via MCP

    Janela do terminal
    cargo run -- mcp

    Qualquer cliente MCP, como o Claude Desktop ou o Cursor, já consegue listar e chamar suas tools. Veja MCP.

  5. Rode os testes

    Janela do terminal
    cargo test

    A tool hello gerada já vem com testes que a chamam pelo runtime de verdade.

Crie src/tools/search.rs:

use carmy::prelude::*;
#[derive(Deserialize, JsonSchema)]
struct SearchInput {
/// Search expression.
query: String,
}
#[derive(Serialize, JsonSchema)]
struct SearchOutput {
results: Vec<String>,
}
#[carmy::tool(description = "Search the catalog", effect = "read", idempotent = true)]
async fn search(input: SearchInput) -> AgentResult<SearchOutput> {
Ok(SearchOutput {
results: vec![format!("Result for {}", input.query)],
})
}

Depois adicione mod search; em src/tools/mod.rs. Só isso: a tool se registra sozinha e fica disponível via HTTP e MCP.

Próximo: Estrutura do projeto.