Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
13e8610
initial mcp impl
jerbly Jan 1, 2026
f72bda9
fixed notificaiton protocol, added docs
jerbly Jan 1, 2026
2ee2847
added live-check tool
jerbly Jan 2, 2026
6198f89
refactor: replace registry lookups with O(1) search context methods i…
jerbly Jan 2, 2026
b373e09
feat: add schemars dependency and integrate JSON schema generation fo…
jerbly Jan 2, 2026
7c1b005
feat: integrate JSON schema generation for attribute, entity, event, …
jerbly Jan 2, 2026
a789c0d
feat: enhance MCP server live-check tool with configurable advice pol…
jerbly Jan 3, 2026
cbcd6ab
refactor: update tool execution methods to use mutable self references
jerbly Jan 3, 2026
f2a2b2e
migrated to rmcp
jerbly Jan 3, 2026
85ed3a8
feat: add README for MCP server integration with LLMs
jerbly Jan 4, 2026
5af6d20
feat: add allowed external types configuration for cargo-check-extern…
jerbly Jan 4, 2026
533706a
unit tests
jerbly Jan 4, 2026
9152449
added search and mcp test coverage
jerbly Jan 4, 2026
59eb339
fmt
jerbly Jan 5, 2026
10c871e
changelog
jerbly Jan 5, 2026
e766140
better changelog
jerbly Jan 5, 2026
66d93fb
remove claude references
jerbly Jan 5, 2026
752b7db
Merge branch 'main' of https://github.com/open-telemetry/weaver into mcp
jerbly Jan 5, 2026
9e12be5
changelog fix
jerbly Jan 5, 2026
5511a63
fixed commands in readme
jerbly Jan 5, 2026
422ffa3
improve search tool description
jerbly Jan 6, 2026
ec8091a
Merge branch 'main' of https://github.com/open-telemetry/weaver into mcp
jerbly Jan 10, 2026
0191b9e
fixes following structure changes to ForgeResolvedRegistry
jerbly Jan 10, 2026
7eb42cb
removed schemars <v1 workarounds
jerbly Jan 11, 2026
bfafb6b
comment update
jerbly Jan 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
- New Experimental feature: `weaver serve` command to serve a REST API and web UI. ([#1076](https://github.com/open-telemetry/weaver/pull/1076) by @jerbly)
- Add support for diff schemas in `registry json-schema`([#1105](https://github.com/open-telemetry/weaver/pull/1105) by @lmolkova)
- 💥 BREAKING CHANGE 💥 Upgraded JSON schema generation to [2020-12 version of JSON Schema.](https://json-schema.org/draft/2020-12/schema) ([#1125](https://github.com/open-telemetry/weaver/pull/1125) by @jerbly)
- New Experimental feature: `weaver registry mcp` MCP server for a registry with search, get and live_check tools. ([#1113](https://github.com/open-telemetry/weaver/pull/1113) by @jerbly)

# [0.20.0] - 2025-12-11

Expand Down
119 changes: 115 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ weaver_checker = { path = "crates/weaver_checker" }
weaver_emit = { path = "crates/weaver_emit" }
weaver_live_check = { path = "crates/weaver_live_check" }
weaver_search = { path = "crates/weaver_search" }
weaver_mcp = { path = "crates/weaver_mcp" }
weaver_version = { path = "crates/weaver_version" }

clap = { version = "4.5.41", features = ["derive"] }
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ Further reading:
| [weaver registry update-markdown](docs/usage.md#registry-update-markdown) | Update markdown files that contain markers indicating the templates used to update the specified sections |
| [weaver registry live-check](docs/usage.md#registry-live-check) | Check the conformance level of an OTLP stream against a semantic convention registry |
| [weaver registry emit](docs/usage.md#registry-emit) | Emits a semantic convention registry as example signals to your OTLP receiver |
| [weaver registry mcp](docs/mcp-server.md) | Run an MCP server for LLM integration |
| [weaver completion](docs/usage.md#completion) | Generate shell completions |


Expand Down
31 changes: 16 additions & 15 deletions crates/weaver_live_check/src/live_checker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use serde::Serialize;
use std::collections::HashMap;
use std::rc::Rc;
use std::sync::Arc;
use weaver_semconv::{attribute::AttributeType, group::GroupType};

use crate::{
Expand All @@ -19,7 +20,7 @@ use crate::CumulativeStatistics;
#[derive(Serialize)]
pub struct LiveChecker {
/// The resolved registry
pub registry: VersionedRegistry,
pub registry: Arc<VersionedRegistry>,
semconv_attributes: HashMap<String, Rc<VersionedAttribute>>,
semconv_templates: HashMap<String, Rc<VersionedAttribute>>,
semconv_metrics: HashMap<String, Rc<VersionedSignal>>,
Expand All @@ -37,7 +38,7 @@ pub struct LiveChecker {
impl LiveChecker {
#[must_use]
/// Create a new LiveChecker
pub fn new(registry: VersionedRegistry, advisors: Vec<Box<dyn Advisor>>) -> Self {
pub fn new(registry: Arc<VersionedRegistry>, advisors: Vec<Box<dyn Advisor>>) -> Self {
// Create a hashmap of attributes for quick lookup
let mut semconv_attributes = HashMap::new();
let mut semconv_templates = HashMap::new();
Expand All @@ -47,7 +48,7 @@ impl LiveChecker {
// Hashmap of events by name
let mut semconv_events = HashMap::new();

match &registry {
match registry.as_ref() {
VersionedRegistry::V1(registry) => {
for group in &registry.groups {
if group.r#type == GroupType::Metric {
Expand Down Expand Up @@ -243,7 +244,7 @@ mod tests {
Box::new(EnumAdvisor),
];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor =
RegoAdvisor::new(&live_checker, &None, &None).expect("Failed to create Rego advisor");
live_checker.add_advisor(Box::new(rego_advisor));
Expand Down Expand Up @@ -1108,7 +1109,7 @@ mod tests {

let advisors: Vec<Box<dyn Advisor>> = vec![];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor = RegoAdvisor::new(
&live_checker,
&Some("data/policies/live_check_advice/".into()),
Expand Down Expand Up @@ -1197,7 +1198,7 @@ mod tests {
Box::new(EnumAdvisor),
];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor =
RegoAdvisor::new(&live_checker, &None, &None).expect("Failed to create Rego advisor");
live_checker.add_advisor(Box::new(rego_advisor));
Expand Down Expand Up @@ -1259,7 +1260,7 @@ mod tests {
serde_json::from_reader(File::open(path).expect("Unable to open file"))
.expect("Unable to parse JSON");

let mut live_checker = LiveChecker::new(registry, vec![]);
let mut live_checker = LiveChecker::new(Arc::new(registry), vec![]);
let rego_advisor = RegoAdvisor::new(
&live_checker,
&Some("data/policies/live_check_advice/".into()),
Expand Down Expand Up @@ -1316,7 +1317,7 @@ mod tests {
Box::new(EnumAdvisor),
];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor =
RegoAdvisor::new(&live_checker, &None, &None).expect("Failed to create Rego advisor");
live_checker.add_advisor(Box::new(rego_advisor));
Expand Down Expand Up @@ -1398,7 +1399,7 @@ mod tests {
serde_json::from_reader(File::open(path).expect("Unable to open file"))
.expect("Unable to parse JSON");

let mut live_checker = LiveChecker::new(registry, vec![]);
let mut live_checker = LiveChecker::new(Arc::new(registry), vec![]);
let rego_advisor = RegoAdvisor::new(
&live_checker,
&Some("data/policies/live_check_advice/".into()),
Expand Down Expand Up @@ -1447,7 +1448,7 @@ mod tests {
serde_json::from_reader(File::open(path).expect("Unable to open file"))
.expect("Unable to parse JSON");

let mut live_checker = LiveChecker::new(registry, vec![]);
let mut live_checker = LiveChecker::new(Arc::new(registry), vec![]);
let rego_advisor = RegoAdvisor::new(
&live_checker,
&Some("data/policies/live_check_advice/".into()),
Expand Down Expand Up @@ -1733,7 +1734,7 @@ mod tests {
Box::new(EnumAdvisor),
];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor =
RegoAdvisor::new(&live_checker, &None, &None).expect("Failed to create Rego advisor");
live_checker.add_advisor(Box::new(rego_advisor));
Expand Down Expand Up @@ -1814,7 +1815,7 @@ mod tests {

let advisors: Vec<Box<dyn Advisor>> = vec![];

let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);
let rego_advisor = RegoAdvisor::new(
&live_checker,
&Some("data/policies/bad_advice/".into()),
Expand Down Expand Up @@ -1877,7 +1878,7 @@ mod tests {
});
let mut samples = vec![sample];
let advisors: Vec<Box<dyn Advisor>> = vec![Box::new(TypeAdvisor)];
let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);

let mut stats =
LiveCheckStatistics::Cumulative(CumulativeStatistics::new(&live_checker.registry));
Expand Down Expand Up @@ -1952,7 +1953,7 @@ mod tests {
live_check_result: None,
});
let advisors: Vec<Box<dyn Advisor>> = vec![Box::new(TypeAdvisor)];
let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);

let rego_advisor = RegoAdvisor::new(
&live_checker,
Expand Down Expand Up @@ -2008,7 +2009,7 @@ mod tests {
}),
];
let advisors: Vec<Box<dyn Advisor>> = vec![Box::new(TypeAdvisor)];
let mut live_checker = LiveChecker::new(registry, advisors);
let mut live_checker = LiveChecker::new(Arc::new(registry), advisors);

let mut stats =
LiveCheckStatistics::Cumulative(CumulativeStatistics::new(&live_checker.registry));
Expand Down
27 changes: 27 additions & 0 deletions crates/weaver_mcp/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[package]
name = "weaver_mcp"
version.workspace = true
authors.workspace = true
repository.workspace = true
license.workspace = true
publish.workspace = true
edition.workspace = true
rust-version.workspace = true
description = "MCP (Model Context Protocol) server for semantic convention registry"

[lints]
workspace = true

[dependencies]
weaver_search = { path = "../weaver_search" }
weaver_forge = { path = "../weaver_forge", features = ["openapi"] }
weaver_semconv = { path = "../weaver_semconv", features = ["openapi"] }
weaver_live_check = { path = "../weaver_live_check" }

rmcp = { version = "0.12", features = ["server", "transport-io"] }
schemars = "1" # Must match rmcp's schemars version (not workspace 0.8.x)
tokio.workspace = true
serde.workspace = true
serde_json.workspace = true
miette.workspace = true
log.workspace = true
Loading