mcpField
K
kuri (栗 or くり)

kuri (栗 or くり)

ローカル
github.com/itsaphel開発ツール1376 週間前に更新

kuri (栗 or くり) について

kuriは、MCPサーバーを構築するためのRustフレームワークです。ツールやプロンプトを通常の非同期Rust関数で記述でき、マクロやプロトコル処理の定型コードを抑えます。

主な機能

  1. 01ツールとプロンプトを非同期Rust関数で定義
  2. 02マクロの使用を最小限に抑制
  3. 03シリアライズとルーティングの定型コードを削減
  4. 04Towerのミドルウェアとレイヤーに対応
  5. 05標準入力/出力トランスポート

活用シーン

  1. 01RustでのMCPツール構築
  2. 02Rust製MCPサーバーへのプロンプト追加
  3. 03サービスへのTowerミドルウェア適用

MCP 対応

kuriはMCPサーバー実装用フレームワークです。ライフサイクル処理、ツール、プロンプト、標準入力/出力トランスポートに対応し、リソースとHTTPトランスポートは対応済みとして記載されていません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

kuri (栗 or くり)

kuriは、開発者にとっての使いやすさと明快さを重視した、Model Context Protocol(MCP)サーバーを構築するためのフレームワークです。

Build status Crates.io Documentation

MCPを使うと、LLMは事前に定義された関数(「ツール」と呼ばれます)を実行できます。ツールを使ってデータを取得したり、副作用を発生させたり(つまり、外部の世界とやり取りしたり)できます。LLMが関数の入力引数を渡すだけで、その関数が実行され、応答がモデルに返されます。これらのツールは「MCP サーバー」によって提供されます。MCP サーバーはローカルで実行でき、1つのサーバーで複数のツールを提供できます。

設計理念

Rustは、強力な型システムと正しさの保証を備えているため、信頼性の高いMCP サーバーを記述するのに優れた言語です。kuriは、RustでのMCP サーバーのプログラミングを非常に快適にし、Rustを使ったMCP サーバーの構築を促進することを目指しています。設計目標は次のとおりです。

  • 快適な開発者体験: MCP サーバーのプログラミングは、通常のRustプログラミングのように感じられるべきです。ツールとプロンプトは、シンプルな非同期Rust関数です。
  • マクロの使用を最小限に(#[tool]、#[prompt]):ツールと引数の説明を付与する目的に限り、複雑なコード生成には使用しません。
  • 定型コードを最小限に: シリアライズやMCPプロトコルのルーティングではなく、アプリケーションのロジックに集中できます。
  • towerのミドルウェア、サービス、ユーティリティのエコシステムを活用します。タイムアウト、トレーシング、パニック処理などをすぐに利用でき、axum、tonic、hyperのコンポーネントも再利用できます。

これらは、他のMCP サーバー用クレートとkuriを分ける特徴の一部です。私たちは、1つのことに集中し、それを非常にうまく実現することを目指しています。複雑で魔法のようなマクロはなく、アプリケーションのコードは引き続き説明的で、kuriの内部構造は読みやすく理解しやすいものです。また、kuriはtowerを基盤としているため、豊富なミドルウェアとレイヤーのエコシステムを再利用できます。

例

use kuri::{MCPServiceBuilder, ServiceExt, ToolError, prompt, serve, tool, transport::StdioTransport};
use schemars::JsonSchema;
use serde::Deserialize;

#[derive(Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub enum Operation {
    Add,
    Subtract,
    Multiply,
    Divide,
}

// A pure function that takes three inputs and returns an integer. Descriptions
// for the tool and its parameters help the model decide which tool to use, and
// correctly supply the tool's parameters.
#[tool(
    description = "Perform basic arithmetic operations",
    params(
        x = "First number in the calculation",
        y = "Second number in the calculation",
        operation = "The operation to perform (add, subtract, multiply, divide)"
    )
)]
async fn calculator(x: i32, y: i32, operation: Operation) -> Result<i32, ToolError> {
    match operation {
        Operation::Add => Ok(x + y),
        Operation::Subtract => Ok(x - y),
        Operation::Multiply => Ok(x * y),
        Operation::Divide => {
            if y == 0 {
                Err(ToolError::ExecutionError("Division by zero".to_string()))
            } else {
                Ok(x / y)
            }
        }
    }
}

// Creates a prompt template for text summarisation. The application provides
// the text to summarise, and an optional format parameter (denoted using Rust's
// `Option` type). kuri tells the model that `format` may be omitted.
#[prompt(
    description = "Generates a prompt for summarising text",
    params(
        text = "The text to summarise",
        format = "Optional format for the summary (eg: 'bullet points' or 'Shakespeare')"
    )
)]
async fn summarise_text(text: String, format: Option<String>) -> String {
    let format_instruction = match format {
        Some(f) => format!(" in the format of {}", f),
        None => String::new(),
    };

    format!(
        "Please summarize the following text{}:\n\n{}",
        format_instruction, text
    )
}

#[tokio::main]
async fn main() -> Result<(), TransportError> {
    // Create the MCP service with the server's name
    let service = MCPServiceBuilder::new("kuri's test server".to_string())
        // Register the tool and prompt
        .with_tool(Calculator)
        .with_prompt(SummariseText)
        .build();

    // Serve over the stdio transport
    serve(service.into_request_service(), StdioTransport::new()).await
}

その他の例もご覧ください。

まず、Cargo.tomlにkuriと必要な依存関係を追加します。

[dependencies]
kuri = "0.1"
async-trait = "0.1"
schemars = "0.8"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }

MCP仕様のサポート

  • コアライフサイクル:接続の初期化、ケイパビリティのネゴシエーション、セッション制御
  • ツール:機能が完成しており、テストもあります
  • プロンプト:おおむね完成しており、テストもあります
  • リソース
  • トランスポート
  • その他のオプション機能

現在の優先事項は、HTTPトランスポートのサポート追加、APIの安定化、コア仕様の完全なサポートの確保です。

コントリビューション

このプロジェクトの目標は、MCP サーバーを構築するための、使いやすく、快適で、Rustらしいライブラリを作ることです。まだ初期段階のため、構成は今後変更される可能性があります。Rust、MCP、クレートの構築、ネットワークプロトコル(protohackersに興味がある方もいるかもしれません!)のいずれかがお好きでしたら、ぜひご参加ください!リポジトリで開発に参加するか、話をしてみたい場合はメールでご連絡ください!

このフレームワークをプロジェクトで使ってくださった方へ:試していただきありがとうございます!ぜひ使用感をお聞かせください!

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。