Lewati ke konten

Membuat Tool MCP

Buat tool MCP kustom untuk memperluas kapabilitas digital worker Anda dengan integrasi eksternal, logika kustom, dan akses data.

  1. Definisikan Antarmuka WIT

    wit/tool.wit
    package greentic:my-tool;
    interface tool {
    record input {
    query: string,
    options: option<string>,
    }
    record output {
    success: bool,
    data: option<string>,
    error: option<string>,
    }
    execute: func(input: input) -> output;
    }
    world my-tool {
    export tool;
    }
  2. Implementasikan di Rust

    src/lib.rs
    use wit_bindgen::generate;
    generate!({
    world: "my-tool",
    path: "wit",
    });
    struct MyTool;
    impl tool::Guest for MyTool {
    fn execute(input: tool::Input) -> tool::Output {
    // Your tool logic here
    let result = process_query(&input.query);
    tool::Output {
    success: true,
    data: Some(result),
    error: None,
    }
    }
    }
    fn process_query(query: &str) -> String {
    format!("Processed: {}", query)
    }
    export!(MyTool);
  3. Build Komponen WASM

    Terminal window
    cargo build --target wasm32-wasip2 --release
  4. Buat Manifest Tool

    tool.yaml
    name: my_tool
    version: "1.0.0"
    description: My custom MCP tool
    parameters:
    - name: query
    type: string
    description: The query to process
    required: true
    - name: options
    type: string
    description: Optional configuration
    required: false
    returns:
    type: object
    properties:
    success:
    type: boolean
    data:
    type: string
    error:
    type: string
    capabilities:
    - network:outbound
  5. Daftarkan Tool

    greentic.demo.yaml
    mcp:
    tools:
    - name: my_tool
    component: "tools/my-tool.wasm"
    manifest: "tools/my-tool.yaml"
impl tool::Guest for HttpTool {
fn execute(input: tool::Input) -> tool::Output {
let url = &input.url;
let method = input.method.unwrap_or("GET".to_string());
match http_request(&method, url, input.body.as_deref()) {
Ok(response) => tool::Output {
success: true,
data: Some(response),
error: None,
},
Err(e) => tool::Output {
success: false,
data: None,
error: Some(e.to_string()),
},
}
}
}
impl tool::Guest for DbTool {
fn execute(input: tool::Input) -> tool::Output {
// Get connection string from secrets
let conn_str = get_secret("database_url")?;
// Execute query (pseudo-code)
let results = db_query(&conn_str, &input.query)?;
tool::Output {
success: true,
data: Some(serde_json::to_string(&results)?),
error: None,
}
}
}
impl tool::Guest for EmailTool {
fn execute(input: tool::Input) -> tool::Output {
let api_key = get_secret("sendgrid_api_key")?;
let result = send_email(
&api_key,
&input.to,
&input.subject,
&input.body,
);
match result {
Ok(_) => tool::Output {
success: true,
data: Some("Email sent".to_string()),
error: None,
},
Err(e) => tool::Output {
success: false,
data: None,
error: Some(e.to_string()),
},
}
}
}
- id: call_tool
type: mcp-tool
config:
tool: "my_tool"
parameters:
query: "{{user_query}}"
output: tool_result
- id: agent
type: llm
config:
model: "gpt-4"
system_prompt: |
You are an assistant with access to tools.