v0.9.0
๐ Features
Prototype OpenTelemetry Traces in MCP Server - @swcollard PR #274
Pulls in new crates and SDKs for prototyping instrumenting the Apollo MCP Server with Open Telemetry Traces.
- Adds new rust crates to support OTel
- Annotates excecute and call_tool functions with trace macro
- Adds Axum and Tower middleware's for OTel tracing
- Refactors Logging so that all the tracing_subscribers are set together in a single module.
Add CORS support - @DaleSeo PR #362
This PR implements comprehensive CORS support for Apollo MCP Server to enable web-based MCP clients to connect without CORS errors. The implementation and configuration draw heavily from the Router's approach. Similar to other features like health checks and telemetry, CORS is supported only for the StreamableHttp transport, making it a top-level configuration.
Enhance tool descriptions - @DaleSeo PR #350
This PR enhances the descriptions of the introspect and search tools to offer clearer guidance for AI models on efficient GraphQL schema exploration patterns.
Telemetry: Trace operations and auth - @swcollard PR #375
- Adds traces for the MCP server generating Tools from Operations and performing authorization
- Includes the HTTP status code to the top level HTTP trace
Implement metrics for mcp tool and operation counts and durations - @swcollard PR #297
This PR adds metrics to count and measure request duration to events throughout the MCP server
- apollo.mcp.operation.duration
- apollo.mcp.operation.count
- apollo.mcp.tool.duration
- apollo.mcp.tool.count
- apollo.mcp.initialize.count
- apollo.mcp.list_tools.count
- apollo.mcp.get_info.count
Adding ability to omit attributes for traces and metrics - @alocay PR #358
Adding ability to configure which attributes are omitted from telemetry traces and metrics.
- Using a Rust build script (
build.rs) to auto-generate telemetry attribute code based on the data found intelemetry.toml. - Utilizing an enum for attributes so typos in the config file raise an error.
- Omitting trace attributes by filtering it out in a custom exporter.
- Omitting metric attributes by indicating which attributes are allowed via a view.
- Created
telemetry_attributes.rsto mapTelemetryAttributeenum to a OTELKey.
The telemetry.toml file includes attributes (both for metrics and traces) as well as list of metrics gathered. An example would look like the following:
[attributes.apollo.mcp]
my_attribute = "Some attribute info"
[metrics.apollo.mcp]
some.count = "Some metric count info"
This would generate a file that looks like the following:
/// All TelemetryAttribute values
pub const ALL_ATTRS: &[TelemetryAttribute; 1usize] = &[
TelemetryAttribute::MyAttribute
];
#[derive(Debug, ::serde::Deserialize, ::schemars::JsonSchema,, Clone, Eq, PartialEq, Hash, Copy)]
pub enum TelemetryAttribute {
///Some attribute info
#[serde(alias = "my_attribute")]
MyAttribute,
}
impl TelemetryAttribute {
/// Supported telemetry attribute (tags) values
pub const fn as_str(&self) -> &'static str {
match self {
TelemetryAttribute::MyAttribute => "apollo.mcp.my_attribute",
}
}
}
#[derive(Debug, ::serde::Deserialize, ::schemars::JsonSchema,, Clone, Eq, PartialEq, Hash, Copy)]
pub enum TelemetryMetric {
///Some metric count info
#[serde(alias = "some.count")]
SomeCount,
}
impl TelemetryMetric {
/// Converts TelemetryMetric to &str
pub const fn as_str(&self) -> &'static str {
match self {
TelemetryMetric::SomeCount => "apollo.mcp.some.count",
}
}
}
An example configuration that omits tool_name attribute for metrics and request_id for tracing would look like the following:
telemetry:
exporters:
metrics:
otlp:
endpoint: "http://localhost:4317"
protocol: "grpc"
omitted_attributes:
- tool_name
tracing:
otlp:
endpoint: "http://localhost:4317"
protocol: "grpc"
omitted_attributes:
- request_id
Adding config option for trace sampling - @alocay PR #366
Adding configuration option to sample traces. Can use the following options:
- Ratio based samples (ratio >= 1 is always sample)
- Always on
- Always off
Defaults to always on if not provided.
๐ Fixes
Update SDL handling in sdl_to_api_schema function - @lennyburdette PR #365
Loads supergraph schemas using a function that supports various features, including Apollo Connectors. When supergraph loading failed, it would load it as a standard GraphQL schema, which reveals Federation query planning directives in when using the search and introspection tools.
Include the cargo feature and TraceContextPropagator to send otel headers downstream - @swcollard PR #307
Inside the reqwest middleware, if the global text_map_propagator is not set, it will no op and not send the traceparent and tracestate headers to the Router. Adding this is needed to correlate traces from the mcp server to the router or other downstream APIs
Add support for deprecated directive - @esilverm PR #367
Includes any existing @deprecated directives in the schema in the minified output of builtin tools. Now operations generated via these tools should take into account deprecated fields when being generated.
๐ Configuration
Add basic config file options to otel telemetry - @swcollard PR #330
Adds new Configuration options for setting up configuration beyond the standard OTEL environment variables needed before.
- Renames trace->telemetry
- Adds OTLP options for metrics and tracing to choose grpc or http upload protocols and setting the endpoints
- This configuration is all optional, so by default nothing will be logged
Disable statefulness to fix initialize race condition - @swcollard PR #351
We've been seeing errors with state and session handling in the MCP Server. Whether that is requests being sent before the initialized notification is processed. Or running a fleet of MCP Server pods behind a round robin load balancer. A new configuration option under the streamable_http transport stateful_mode, allows disabling session handling which appears to fix the race condition issue.
๐ Maintenance
Add tests for server event and SupergraphSdlQuery - @DaleSeo PR #347
This PR adds tests for some uncovered parts of the codebase to check the Codecov integration.
Fix version on mcp server tester - @alocay PR #374
Add a specific version when calling the mcp-server-tester for e2e tests. The current latest (1.4.1) as an issue so to avoid problems now and in the future updating the test script to invoke the testing tool via specific version.