Skip to content

[mcp] SDK integration with Streamable HTTP transport (Phase 1.2)#7846

Merged
yurishkuro merged 10 commits into
mainfrom
copilot/implement-phase-1-part-2-adr-002
Jan 9, 2026
Merged

[mcp] SDK integration with Streamable HTTP transport (Phase 1.2)#7846
yurishkuro merged 10 commits into
mainfrom
copilot/implement-phase-1-part-2-adr-002

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Jan 8, 2026

Part of #7827

Phase 1 Part 2: MCP Server Setup

Implementing the MCP SDK integration and streamable HTTP transport as outlined in ADR-002.

Checklist

  • Add github.com/modelcontextprotocol/go-sdk dependency (v1.2.0)
  • Update server.go to initialize MCP server with Streamable HTTP transport
  • Register placeholder tool(s) for Phase 1 completion
  • Update server_test.go to test MCP server initialization
  • Update README.md to reflect Phase 1 Part 2 completion
  • Run tests to validate implementation
  • Run lint to ensure code quality
  • Address PR review feedback:
    • Added comment explaining nil ServerOptions parameter
    • Made ServerVersion required in config with validation
    • Used strongly typed HealthToolOutput struct with jsonschema tags
    • Replaced time.Sleep with assert.Eventually in tests
    • Enhanced MCP endpoint test with JSON validation
    • Extracted test server setup into helper function with t.Cleanup()
    • Fixed linter error: use net.ListenConfig.Listen with context instead of net.Listen
    • Fixed integration test: make ServerVersion optional with auto-fill in Validate()
    • Use &mcp.ServerOptions{} instead of nil
    • Added test coverage for healthTool function (94.9% package coverage)
    • Refactored version variable name to avoid shadowing package name
Original prompt

Continue after PR 7842 and implement phase 1 part 2 of the ADR-002


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 2 commits January 8, 2026 19:47
Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Copilot AI changed the title [WIP] Continue implementation of ADR-002 phase 1 part 2 Implement Phase 1 Part 2 of ADR-002: MCP SDK integration with Streamable HTTP transport Jan 8, 2026
Copilot AI requested a review from yurishkuro January 8, 2026 19:58
Comment thread cmd/jaeger/internal/extension/jaegermcp/server.go Outdated
Comment thread cmd/jaeger/internal/extension/jaegermcp/server.go Outdated
Comment thread cmd/jaeger/internal/extension/jaegermcp/server.go Outdated
Comment thread cmd/jaeger/internal/extension/jaegermcp/server_test.go Outdated
Comment thread cmd/jaeger/internal/extension/jaegermcp/server_test.go
Comment thread go.mod
… improve tests

Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Comment thread cmd/jaeger/internal/extension/jaegermcp/server_test.go Outdated
Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Jan 8, 2026

Codecov Report

❌ Patch coverage is 96.29630% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 95.51%. Comparing base (5679556) to head (767d0a0).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
cmd/jaeger/internal/extension/jaegermcp/server.go 95.65% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7846      +/-   ##
==========================================
- Coverage   95.54%   95.51%   -0.03%     
==========================================
  Files         310      310              
  Lines       15966    15989      +23     
==========================================
+ Hits        15254    15272      +18     
- Misses        559      562       +3     
- Partials      153      155       +2     
Flag Coverage Δ
badger_v1 9.18% <ø> (ø)
badger_v2 1.93% <ø> (ø)
cassandra-4.x-v1-manual 13.58% <ø> (ø)
cassandra-4.x-v2-auto 1.92% <ø> (ø)
cassandra-4.x-v2-manual 1.92% <ø> (ø)
cassandra-5.x-v1-manual 13.58% <ø> (ø)
cassandra-5.x-v2-auto 1.92% <ø> (ø)
cassandra-5.x-v2-manual 1.92% <ø> (ø)
clickhouse 1.97% <ø> (ø)
elasticsearch-6.x-v1 17.54% <ø> (ø)
elasticsearch-7.x-v1 17.57% <ø> (ø)
elasticsearch-8.x-v1 17.73% <ø> (ø)
elasticsearch-8.x-v2 1.93% <ø> (ø)
elasticsearch-9.x-v2 1.93% <ø> (ø)
grpc_v1 8.84% <ø> (ø)
grpc_v2 1.93% <ø> (ø)
kafka-3.x-v2 1.93% <ø> (ø)
memory_v2 1.93% <ø> (ø)
opensearch-1.x-v1 17.62% <ø> (ø)
opensearch-2.x-v1 17.62% <ø> (ø)
opensearch-2.x-v2 1.93% <ø> (ø)
opensearch-3.x-v2 1.93% <ø> (ø)
query 1.93% <ø> (ø)
tailsampling-processor 0.55% <ø> (ø)
unittests 94.15% <96.29%> (-0.03%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Member

@yurishkuro yurishkuro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the tests and linter in the CI are failing.

Comment thread cmd/jaeger/internal/extension/jaegermcp/server.go Outdated
Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Jan 9, 2026

the tests and linter in the CI are failing.

Fixed the linter error by using net.ListenConfig{}.Listen(ctx, "tcp", endpoint) instead of net.Listen(). All tests now pass including race detector. (a0d5862)

Copilot AI requested a review from yurishkuro January 9, 2026 00:07
@yurishkuro yurishkuro added the changelog:experimental Change to an experimental part of the code label Jan 9, 2026
Comment thread cmd/jaeger/internal/extension/jaegermcp/config.go
Name: s.config.ServerName,
Version: s.config.ServerVersion,
}
// Pass nil for ServerOptions to use default settings.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pass &ServerOptions{} instead of nil.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed from nil to &mcp.ServerOptions{}. (da6ff72)

- Remove valid:"required" tag from ServerVersion to allow YAML configs without it
- Auto-fill ServerVersion in Validate() method if empty
- Change nil to &mcp.ServerOptions{} when creating MCP server
- Update tests to reflect that ServerVersion is optional

Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Comment thread cmd/jaeger/internal/extension/jaegermcp/server.go
- Add TestHealthTool to directly test the healthTool function
- Add TestServerShutdownErrorPath to improve shutdown error coverage
- Update TestServerShutdownWithError with proper config
- Update TestServerShutdownAfterListenerClose with proper config
- Coverage increased from 92.3% to 94.9%

Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Signed-off-by: Yuri Shkuro <github@ysh.us>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jan 9, 2026

Metrics Comparison Summary

Total changes across all snapshots: 73

Detailed changes per snapshot

summary_metrics_snapshot_cassandra

📊 Metrics Diff Summary

Total Changes: 0

  • 🆕 Added: 0 metrics
  • ❌ Removed: 0 metrics
  • 🔄 Modified: 0 metrics
  • 🚫 Excluded: 53 metrics

summary_metrics_snapshot_elasticsearch

📊 Metrics Diff Summary

Total Changes: 73

  • 🆕 Added: 0 metrics
  • ❌ Removed: 73 metrics
  • 🔄 Modified: 0 metrics
  • 🚫 Excluded: 0 metrics

❌ Removed Metrics

  • jaeger_storage_latency_seconds (18 variants)
View diff sample
-jaeger_storage_latency_seconds{le="+Inf",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="0",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="10",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="100",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="1000",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="10000",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
-jaeger_storage_latency_seconds{le="25",name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
...
- `jaeger_storage_requests` (1 variants)
View diff sample
-jaeger_storage_requests{name="some_storage",operation="find_traces",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",result="err",role="tracestore"}
- `rpc_server_duration_milliseconds` (18 variants)
View diff sample
-rpc_server_duration_milliseconds{le="+Inf",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="0",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="10",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="100",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="1000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="10000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_duration_milliseconds{le="25",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
...
- `rpc_server_requests_per_rpc` (18 variants)
View diff sample
-rpc_server_requests_per_rpc{le="+Inf",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="0",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="10",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="100",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="1000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="10000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_requests_per_rpc{le="25",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
...
- `rpc_server_responses_per_rpc` (18 variants)
View diff sample
-rpc_server_responses_per_rpc{le="+Inf",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="0",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="10",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="100",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="1000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="10000",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
-rpc_server_responses_per_rpc{le="25",otel_scope_name="go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",otel_scope_schema_url="https://opentelemetry.io/schemas/1.37.0",otel_scope_version="0.64.0",rpc_grpc_status_code="2",rpc_method="FindTraces",rpc_service="jaeger.api_v3.QueryService",rpc_system="grpc"}
...

➡️ View full metrics file


// createDefaultConfig creates the default configuration for the extension.
func createDefaultConfig() component.Config {
version := version.Get().GitVersion
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
version := version.Get().GitVersion
ver := version.Get().GitVersion

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied. (767d0a0)

Comment on lines +36 to +38
if version == "" {
version = "dev"
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if version == "" {
version = "dev"
}
if ver == "" {
ver = "dev"
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied. (767d0a0)

},
ServerName: "jaeger",
ServerVersion: version.Get().GitVersion,
ServerVersion: version,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ServerVersion: version,
ServerVersion: ver,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied. (767d0a0)

Copy link
Copy Markdown
Member

@yurishkuro yurishkuro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

apply latest review comments

- Rename variable to avoid shadowing package name
- Apply suggested changes from PR review

Co-authored-by: yurishkuro <3523016+yurishkuro@users.noreply.github.com>
Copilot AI requested a review from yurishkuro January 9, 2026 03:43
@yurishkuro yurishkuro changed the title Implement Phase 1 Part 2 of ADR-002: MCP SDK integration with Streamable HTTP transport MCP server/Phase 1.2: SDK integration with Streamable HTTP transport Jan 9, 2026
@yurishkuro yurishkuro marked this pull request as ready for review January 9, 2026 05:03
@yurishkuro yurishkuro requested a review from a team as a code owner January 9, 2026 05:03
@dosubot dosubot Bot added the enhancement label Jan 9, 2026
@yurishkuro yurishkuro merged commit 0bea7f0 into main Jan 9, 2026
61 checks passed
@yurishkuro yurishkuro deleted the copilot/implement-phase-1-part-2-adr-002 branch January 9, 2026 05:05
@yurishkuro yurishkuro changed the title MCP server/Phase 1.2: SDK integration with Streamable HTTP transport [mcp] SDK integration with Streamable HTTP transport (Phase 1.2) Jan 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog:experimental Change to an experimental part of the code enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants