[package] name = "kberg" version = "0.1.0" edition = "2024" description = "MCP bridge for connecting local LLMs to desktop apps. Provider-agnostic agent loop over a Streamable HTTP MCP server." license = "MIT" readme = "README.md" keywords = ["mcp", "llm", "ollama", "tools", "agent"] categories = ["api-bindings", "development-tools"] [features] default = ["server", "ollama"] server = ["dep:axum", "dep:tokio", "dep:tokio-stream"] ollama = ["dep:reqwest", "dep:rustls", "dep:tokio"] [dependencies] serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" tracing = "0.1" async-trait = "0.1" uuid = { version = "1", features = ["v4", "serde"] } axum = { version = "0.8", optional = true } # `rustls-no-provider`, not the default feature set: reqwest 0.13's # `default-tls` resolves to `rustls`, which is a hard alias for # `__rustls-aws-lc-rs` with no ring counterpart. Cargo unifies features # across the graph, so this one line was putting a C crypto backend into # every consumer of this crate — GoingsOn, Spaghetti, buckets_of_money and # tm-mcp. The provider is named in `OllamaProvider::new` instead. # # TLS is kept rather than dropped: Ollama is loopback by default, but # `with_base_url` is public and an https endpoint is a consumer's to choose. reqwest = { version = "0.13", optional = true, default-features = false, features = ["json", "charset", "http2", "rustls-no-provider"] } # Direct only so `OllamaProvider::new` can name a provider. rustls = { version = "0.23", optional = true, default-features = false, features = ["ring"] } tokio = { version = "1", optional = true, features = ["rt-multi-thread", "macros", "net", "sync", "time", "io-std", "io-util"] } tokio-stream = { version = "0.1", optional = true, features = ["sync"] } [dev-dependencies] tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "sync", "time"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } reqwest = { version = "0.13", default-features = false, features = ["json", "charset", "http2", "rustls-no-provider"] } # The test helper names a provider, same as `OllamaProvider::new` does. rustls = { version = "0.23", default-features = false, features = ["ring"] } [lints.rust] unused = "warn" unreachable_pub = "warn" [lints.clippy] pedantic = { level = "warn", priority = -1 } # Allow-list tuned from a measured breakdown across server/multithreaded/pter # (2026-07-22). These are the high-churn / low-signal pedantic lints; everything # else in `pedantic` stays a warning. Keep this block identical across repos. module_name_repetitions = "allow" # Doc lints. No docs-completeness push is underway. missing_errors_doc = "allow" missing_panics_doc = "allow" doc_markdown = "allow" # Numeric casts. Endemic and mostly intentional in size and byte math. cast_possible_truncation = "allow" cast_sign_loss = "allow" cast_precision_loss = "allow" cast_possible_wrap = "allow" cast_lossless = "allow" # Subjective structure and style nags. High churn, low signal. must_use_candidate = "allow" too_many_lines = "allow" struct_excessive_bools = "allow" similar_names = "allow" items_after_statements = "allow" single_match_else = "allow" # Frequent false-positives in TUI and router-heavy code. match_same_arms = "allow" unnecessary_wraps = "allow" type_complexity = "allow"