Skip to main content

eln_plugin_sdk/
tool.rs

1//! Tool 호출 표면 — plugin이 노출하는 단위 tool의 trait.
2
3use async_trait::async_trait;
4use serde_json::Value;
5
6use crate::{Identity, Permissions, ToolError};
7
8/// Tool 호출 시 plugin handler에 전달되는 컨텍스트.
9///
10/// `session_id`는 transport가 발급 (stdio: UUID v4, HTTP: `Mcp-Session-Id`).
11/// `permissions`/`identity`는 S3부터 ApiKey-derived — 활성 keystore HTTP에서는
12/// Bearer 키 레코드로 유도, stdio/익명은 transport default(ADMIN/READ) + Human.
13/// `key_id`는 그 인증 키의 식별자(발급 키 레코드 id) — audit 추적·키별 동작 근거.
14/// stdio·익명·인증 실패 경로에서는 `None`.
15#[derive(Debug, Clone)]
16#[non_exhaustive]
17pub struct CallContext {
18    pub session_id: String,
19    pub identity: Identity,
20    pub permissions: Permissions,
21    /// 이 호출을 인증한 API key 레코드의 id (`k_…`). 키 인증이 아니면 `None`.
22    pub key_id: Option<String>,
23}
24
25impl CallContext {
26    pub fn new(session_id: String, identity: Identity, permissions: Permissions) -> Self {
27        Self {
28            session_id,
29            identity,
30            permissions,
31            key_id: None,
32        }
33    }
34
35    /// 인증 키 id를 실어 반환 (builder). `new` 호출부 무영향 — key_id 기본은 `None`.
36    pub fn with_key_id(mut self, key_id: Option<String>) -> Self {
37        self.key_id = key_id;
38        self
39    }
40}
41
42#[async_trait]
43pub trait ToolHandler: Send + Sync {
44    /// Tool 이름 (MCP tool name과 매핑).
45    fn name(&self) -> &str;
46
47    /// Tool 한 줄 설명 (MCP description).
48    fn description(&self) -> &str;
49
50    /// 핸들러 본체.
51    async fn call(&self, ctx: &CallContext, args: Value) -> Result<Value, ToolError>;
52}