Skip to content

fix(server/mcp): scope defer span.End inside loop iteration#2558

Merged
duwenxin99 merged 5 commits intogoogleapis:mainfrom
marlonbarreto-git:fix-stdio-defer-span-leak
Mar 3, 2026
Merged

fix(server/mcp): scope defer span.End inside loop iteration#2558
duwenxin99 merged 5 commits intogoogleapis:mainfrom
marlonbarreto-git:fix-stdio-defer-span-leak

Conversation

@marlonbarreto-git
Copy link
Copy Markdown
Contributor

Description

In readInputStream(), defer span.End() is called inside a for loop. Since defer schedules execution when the enclosing function returns (not the current loop iteration), all spans created per message accumulate without ever being ended for the lifetime of the stdio session.

For a long-lived stdio server, this means:

  • Memory leak: span objects accumulate indefinitely
  • Incorrect traces: spans are never properly closed, producing misleading telemetry data

Changes

Wrap the per-message processing logic in an immediately invoked function expression (IIFE), so defer span.End() correctly fires at the end of each iteration. This follows the same pattern already used in InitializeConfigs (server.go lines 85-98) for scoping spans inside loops.

Test

All existing tests pass. The TestStdioSession test exercises readLine and write on the stdio session. The readInputStream loop is covered by the existing MCP endpoint tests that exercise the full message processing pipeline.

Fixes #2549

@marlonbarreto-git marlonbarreto-git requested a review from a team as a code owner February 24, 2026 16:43
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @marlonbarreto-git, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical issue in the MCP server's stdio session where OpenTelemetry spans were not being closed correctly. By introducing an immediately invoked function expression (IIFE) within the message processing loop, the defer span.End() call is now properly scoped to each iteration, preventing memory leaks from accumulating span objects and ensuring accurate tracing data for long-lived stdio sessions.

Highlights

  • Fixes OpenTelemetry Span Leak: Corrected an issue where OpenTelemetry spans were not properly closed in the readInputStream function of the MCP server's stdio session.
  • Prevents Memory Leaks and Incorrect Traces: The previous behavior led to indefinite accumulation of span objects and misleading telemetry data due to spans never being properly ended.
  • Introduces IIFE for Scope Management: The message processing logic within the loop is now wrapped in an immediately invoked function expression (IIFE) to ensure defer span.End() executes at the end of each loop iteration.
Changelog
  • internal/server/mcp.go
    • Wrapped message processing logic in an IIFE to correctly scope defer span.End().
Activity
  • No activity has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@google-cla
Copy link
Copy Markdown

google-cla bot commented Feb 24, 2026

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

The pull request effectively addresses the issue of defer span.End() not being scoped correctly within the readInputStream() loop. By wrapping the message processing logic in an immediately invoked function expression (IIFE), each OpenTelemetry span is now properly ended at the conclusion of its respective message processing, preventing potential memory leaks and ensuring accurate tracing data. This change aligns with established Go idioms for handling defer in loops and maintains consistency with existing patterns in the codebase.

@marlonbarreto-git
Copy link
Copy Markdown
Contributor Author

@anubhav756 this PR is ready for review — single commit, CLA signed, conventional commit format.

Could you please trigger the CI by applying the tests: run label or commenting /gcbrun? As an external contributor I can't trigger the Cloud Build checks myself.

All tests pass locally:

$ go test ./internal/server/... -v
--- PASS: TestMcpEndpointWithoutInitialized (0.02s)
--- PASS: TestMcpEndpoint (0.03s)
--- PASS: TestStdioSession (0.00s)
PASS
ok  github.com/googleapis/genai-toolbox/internal/server  0.344s

@averikitsch averikitsch added the tests: run Label to trigger Github Action tests. label Feb 27, 2026
@averikitsch
Copy link
Copy Markdown
Contributor

/gcbrun

@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Feb 27, 2026
@averikitsch averikitsch added the release candidate Use label to signal PR should be included in the next release. label Feb 27, 2026
In readInputStream(), defer span.End() is called inside a for loop.
Since defer executes when the enclosing function returns (not the loop
iteration), spans accumulate without being closed for the lifetime of
the stdio session. This causes memory leaks and incorrect trace data.

Wrap per-message processing in an IIFE so defer fires per iteration,
consistent with the pattern used in InitializeConfigs.

Fixes googleapis#2549
@marlonbarreto-git marlonbarreto-git force-pushed the fix-stdio-defer-span-leak branch from bba70d6 to 74378c5 Compare February 27, 2026 23:20
@duwenxin99 duwenxin99 enabled auto-merge (squash) March 2, 2026 03:01
@duwenxin99
Copy link
Copy Markdown
Contributor

/gcbrun

@duwenxin99 duwenxin99 added the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@duwenxin99 duwenxin99 added the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@duwenxin99 duwenxin99 added the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Mar 2, 2026
@averikitsch
Copy link
Copy Markdown
Contributor

/gcbrun

@averikitsch averikitsch added the tests: run Label to trigger Github Action tests. label Mar 3, 2026
@github-actions github-actions bot removed the tests: run Label to trigger Github Action tests. label Mar 3, 2026
@averikitsch
Copy link
Copy Markdown
Contributor

/gcbrun

@duwenxin99 duwenxin99 merged commit c88a62d into googleapis:main Mar 3, 2026
16 checks passed
github-actions bot pushed a commit to xaas-cloud/genai-toolbox that referenced this pull request Mar 3, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
github-actions bot pushed a commit to pepe57/genai-toolbox that referenced this pull request Mar 3, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
github-actions bot pushed a commit to Jaleel-zhu/genai-toolbox that referenced this pull request Mar 3, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
github-actions bot pushed a commit to AnmolShukla2002/genai-toolbox that referenced this pull request Mar 3, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
github-actions bot pushed a commit to TheTechOddBug/genai-toolbox that referenced this pull request Mar 4, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
github-actions bot pushed a commit to bhardwajRahul/genai-toolbox that referenced this pull request Mar 4, 2026
…oogleapis#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549 c88a62d
Yuan325 added a commit that referenced this pull request Mar 13, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.29.0](v0.28.0...v0.29.0)
(2026-03-13)


### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([#2639](#2639))
* **source/spanner:** restructure prebuilt toolsets
([#2641](#2641))
* **source/dataplex:** restructure prebuilt toolsets
([#2640](#2640))
* **source/oss-db:** restructure prebuilt toolsets
([#2638](#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([#2635](#2635))
* **source/bigquery:** restructure prebuilt toolsets
([#2637](#2637))
* **source/firestore:** restructure prebuilt toolsets
([#2636](#2636))
* telemetry metrics updates as per semantic convention
([#2566](#2566))

### Features

* Add user agent to embeddings generation
([#2572](#2572))
([287251a](287251a))
* **skill:** Attach user agent metadata for generated skill
([#2697](#2697))
([9598a6a](9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([#2696](#2696))
([73bf962](73bf962))
* **skill:** Update skill generation logic
([#2646](#2646))
([c233eee](c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([#2639](#2639))
([5f3f063](5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([#2637](#2637))
([dc984ba](dc984ba))
* **sources/bigquery:** Support custom oauth header name
([#2564](#2564))
([d3baf77](d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([#2635](#2635))
([99613dc](99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([#2640](#2640))
([acb9a80](acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([#2636](#2636))
([22ab7b9](22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([#2638](#2638))
([5196c6a](5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([#2641](#2641))
([ea2b698](ea2b698))
* Telemetry metrics updates as per semantic convention
([#2566](#2566))
([131d764](131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([#2219](#2219))
([b7a5f80](b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([#2308](#2308))
([a136e16](a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([#2576](#2576))
([a554298](a554298))


### Bug Fixes

* Improve list locks integration test for postgres
([#2279](#2279))
([d9ebe5d](d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([#2681](#2681))
([f66189f](f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([#2627](#2627))
([81699a3](81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([#2734](#2734))
([bfd7ba6](bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([#2558](#2558))
([c88a62d](c88a62d)),
closes [#2549](#2549)
* **skill:** Fix env variable propagation
([#2645](#2645))
([5271368](5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([#2620](#2620))
([df7f2fd](df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([#2729](#2729))
([87cd4a0](87cd4a0))
* **ui:** Remove module from script
([#2703](#2703))
([6943ab6](6943ab6))
* Update toolset attributes naming
([#2554](#2554))
([3d6ae4e](3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
github-actions bot pushed a commit that referenced this pull request Mar 13, 2026
🤖 I have created a release *beep* *boop*
---

##
[0.29.0](v0.28.0...v0.29.0)
(2026-03-13)

### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([#2639](#2639))
* **source/spanner:** restructure prebuilt toolsets
([#2641](#2641))
* **source/dataplex:** restructure prebuilt toolsets
([#2640](#2640))
* **source/oss-db:** restructure prebuilt toolsets
([#2638](#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([#2635](#2635))
* **source/bigquery:** restructure prebuilt toolsets
([#2637](#2637))
* **source/firestore:** restructure prebuilt toolsets
([#2636](#2636))
* telemetry metrics updates as per semantic convention
([#2566](#2566))

### Features

* Add user agent to embeddings generation
([#2572](#2572))
([287251a](287251a))
* **skill:** Attach user agent metadata for generated skill
([#2697](#2697))
([9598a6a](9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([#2696](#2696))
([73bf962](73bf962))
* **skill:** Update skill generation logic
([#2646](#2646))
([c233eee](c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([#2639](#2639))
([5f3f063](5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([#2637](#2637))
([dc984ba](dc984ba))
* **sources/bigquery:** Support custom oauth header name
([#2564](#2564))
([d3baf77](d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([#2635](#2635))
([99613dc](99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([#2640](#2640))
([acb9a80](acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([#2636](#2636))
([22ab7b9](22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([#2638](#2638))
([5196c6a](5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([#2641](#2641))
([ea2b698](ea2b698))
* Telemetry metrics updates as per semantic convention
([#2566](#2566))
([131d764](131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([#2219](#2219))
([b7a5f80](b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([#2308](#2308))
([a136e16](a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([#2576](#2576))
([a554298](a554298))

### Bug Fixes

* Improve list locks integration test for postgres
([#2279](#2279))
([d9ebe5d](d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([#2681](#2681))
([f66189f](f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([#2627](#2627))
([81699a3](81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([#2734](#2734))
([bfd7ba6](bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([#2558](#2558))
([c88a62d](c88a62d)),
closes [#2549](#2549)
* **skill:** Fix env variable propagation
([#2645](#2645))
([5271368](5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([#2620](#2620))
([df7f2fd](df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([#2729](#2729))
([87cd4a0](87cd4a0))
* **ui:** Remove module from script
([#2703](#2703))
([6943ab6](6943ab6))
* Update toolset attributes naming
([#2554](#2554))
([3d6ae4e](3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> 39832a0
github-actions bot pushed a commit to renovate-bot/googleapis-_-genai-toolbox that referenced this pull request Mar 13, 2026
🤖 I have created a release *beep* *boop*
---

##
[0.29.0](googleapis/mcp-toolbox@v0.28.0...v0.29.0)
(2026-03-13)

### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
* **source/spanner:** restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
* **source/dataplex:** restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
* **source/oss-db:** restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
* **source/bigquery:** restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
* **source/firestore:** restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
* telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))

### Features

* Add user agent to embeddings generation
([googleapis#2572](googleapis#2572))
([287251a](googleapis@287251a))
* **skill:** Attach user agent metadata for generated skill
([googleapis#2697](googleapis#2697))
([9598a6a](googleapis@9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([googleapis#2696](googleapis#2696))
([73bf962](googleapis@73bf962))
* **skill:** Update skill generation logic
([googleapis#2646](googleapis#2646))
([c233eee](googleapis@c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
([5f3f063](googleapis@5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
([dc984ba](googleapis@dc984ba))
* **sources/bigquery:** Support custom oauth header name
([googleapis#2564](googleapis#2564))
([d3baf77](googleapis@d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
([99613dc](googleapis@99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
([acb9a80](googleapis@acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
([22ab7b9](googleapis@22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
([5196c6a](googleapis@5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
([ea2b698](googleapis@ea2b698))
* Telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))
([131d764](googleapis@131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([googleapis#2219](googleapis#2219))
([b7a5f80](googleapis@b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([googleapis#2308](googleapis#2308))
([a136e16](googleapis@a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([googleapis#2576](googleapis#2576))
([a554298](googleapis@a554298))

### Bug Fixes

* Improve list locks integration test for postgres
([googleapis#2279](googleapis#2279))
([d9ebe5d](googleapis@d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([googleapis#2681](googleapis#2681))
([f66189f](googleapis@f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([googleapis#2627](googleapis#2627))
([81699a3](googleapis@81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([googleapis#2734](googleapis#2734))
([bfd7ba6](googleapis@bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([googleapis#2558](googleapis#2558))
([c88a62d](googleapis@c88a62d)),
closes [googleapis#2549](googleapis#2549)
* **skill:** Fix env variable propagation
([googleapis#2645](googleapis#2645))
([5271368](googleapis@5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([googleapis#2620](googleapis#2620))
([df7f2fd](googleapis@df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([googleapis#2729](googleapis#2729))
([87cd4a0](googleapis@87cd4a0))
* **ui:** Remove module from script
([googleapis#2703](googleapis#2703))
([6943ab6](googleapis@6943ab6))
* Update toolset attributes naming
([googleapis#2554](googleapis#2554))
([3d6ae4e](googleapis@3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> 39832a0
github-actions bot pushed a commit to Jaleel-zhu/genai-toolbox that referenced this pull request Mar 13, 2026
🤖 I have created a release *beep* *boop*
---

##
[0.29.0](googleapis/mcp-toolbox@v0.28.0...v0.29.0)
(2026-03-13)

### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
* **source/spanner:** restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
* **source/dataplex:** restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
* **source/oss-db:** restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
* **source/bigquery:** restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
* **source/firestore:** restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
* telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))

### Features

* Add user agent to embeddings generation
([googleapis#2572](googleapis#2572))
([287251a](googleapis@287251a))
* **skill:** Attach user agent metadata for generated skill
([googleapis#2697](googleapis#2697))
([9598a6a](googleapis@9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([googleapis#2696](googleapis#2696))
([73bf962](googleapis@73bf962))
* **skill:** Update skill generation logic
([googleapis#2646](googleapis#2646))
([c233eee](googleapis@c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
([5f3f063](googleapis@5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
([dc984ba](googleapis@dc984ba))
* **sources/bigquery:** Support custom oauth header name
([googleapis#2564](googleapis#2564))
([d3baf77](googleapis@d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
([99613dc](googleapis@99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
([acb9a80](googleapis@acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
([22ab7b9](googleapis@22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
([5196c6a](googleapis@5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
([ea2b698](googleapis@ea2b698))
* Telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))
([131d764](googleapis@131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([googleapis#2219](googleapis#2219))
([b7a5f80](googleapis@b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([googleapis#2308](googleapis#2308))
([a136e16](googleapis@a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([googleapis#2576](googleapis#2576))
([a554298](googleapis@a554298))

### Bug Fixes

* Improve list locks integration test for postgres
([googleapis#2279](googleapis#2279))
([d9ebe5d](googleapis@d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([googleapis#2681](googleapis#2681))
([f66189f](googleapis@f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([googleapis#2627](googleapis#2627))
([81699a3](googleapis@81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([googleapis#2734](googleapis#2734))
([bfd7ba6](googleapis@bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([googleapis#2558](googleapis#2558))
([c88a62d](googleapis@c88a62d)),
closes [googleapis#2549](googleapis#2549)
* **skill:** Fix env variable propagation
([googleapis#2645](googleapis#2645))
([5271368](googleapis@5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([googleapis#2620](googleapis#2620))
([df7f2fd](googleapis@df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([googleapis#2729](googleapis#2729))
([87cd4a0](googleapis@87cd4a0))
* **ui:** Remove module from script
([googleapis#2703](googleapis#2703))
([6943ab6](googleapis@6943ab6))
* Update toolset attributes naming
([googleapis#2554](googleapis#2554))
([3d6ae4e](googleapis@3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com> 39832a0
NightStack15 added a commit to NightStack15/googleapis-_-genai-toolbox that referenced this pull request Mar 20, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.29.0](googleapis/mcp-toolbox@v0.28.0...v0.29.0)
(2026-03-13)


### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([#2639](googleapis/mcp-toolbox#2639))
* **source/spanner:** restructure prebuilt toolsets
([#2641](googleapis/mcp-toolbox#2641))
* **source/dataplex:** restructure prebuilt toolsets
([#2640](googleapis/mcp-toolbox#2640))
* **source/oss-db:** restructure prebuilt toolsets
([#2638](googleapis/mcp-toolbox#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([#2635](googleapis/mcp-toolbox#2635))
* **source/bigquery:** restructure prebuilt toolsets
([#2637](googleapis/mcp-toolbox#2637))
* **source/firestore:** restructure prebuilt toolsets
([#2636](googleapis/mcp-toolbox#2636))
* telemetry metrics updates as per semantic convention
([#2566](googleapis/mcp-toolbox#2566))

### Features

* Add user agent to embeddings generation
([#2572](googleapis/mcp-toolbox#2572))
([287251a](googleapis/mcp-toolbox@287251a))
* **skill:** Attach user agent metadata for generated skill
([#2697](googleapis/mcp-toolbox#2697))
([9598a6a](googleapis/mcp-toolbox@9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([#2696](googleapis/mcp-toolbox#2696))
([73bf962](googleapis/mcp-toolbox@73bf962))
* **skill:** Update skill generation logic
([#2646](googleapis/mcp-toolbox#2646))
([c233eee](googleapis/mcp-toolbox@c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([#2639](googleapis/mcp-toolbox#2639))
([5f3f063](googleapis/mcp-toolbox@5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([#2637](googleapis/mcp-toolbox#2637))
([dc984ba](googleapis/mcp-toolbox@dc984ba))
* **sources/bigquery:** Support custom oauth header name
([#2564](googleapis/mcp-toolbox#2564))
([d3baf77](googleapis/mcp-toolbox@d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([#2635](googleapis/mcp-toolbox#2635))
([99613dc](googleapis/mcp-toolbox@99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([#2640](googleapis/mcp-toolbox#2640))
([acb9a80](googleapis/mcp-toolbox@acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([#2636](googleapis/mcp-toolbox#2636))
([22ab7b9](googleapis/mcp-toolbox@22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([#2638](googleapis/mcp-toolbox#2638))
([5196c6a](googleapis/mcp-toolbox@5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([#2641](googleapis/mcp-toolbox#2641))
([ea2b698](googleapis/mcp-toolbox@ea2b698))
* Telemetry metrics updates as per semantic convention
([#2566](googleapis/mcp-toolbox#2566))
([131d764](googleapis/mcp-toolbox@131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([#2219](googleapis/mcp-toolbox#2219))
([b7a5f80](googleapis/mcp-toolbox@b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([#2308](googleapis/mcp-toolbox#2308))
([a136e16](googleapis/mcp-toolbox@a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([#2576](googleapis/mcp-toolbox#2576))
([a554298](googleapis/mcp-toolbox@a554298))


### Bug Fixes

* Improve list locks integration test for postgres
([#2279](googleapis/mcp-toolbox#2279))
([d9ebe5d](googleapis/mcp-toolbox@d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([#2681](googleapis/mcp-toolbox#2681))
([f66189f](googleapis/mcp-toolbox@f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([#2627](googleapis/mcp-toolbox#2627))
([81699a3](googleapis/mcp-toolbox@81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([#2734](googleapis/mcp-toolbox#2734))
([bfd7ba6](googleapis/mcp-toolbox@bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([#2558](googleapis/mcp-toolbox#2558))
([c88a62d](googleapis/mcp-toolbox@c88a62d)),
closes [#2549](googleapis/mcp-toolbox#2549)
* **skill:** Fix env variable propagation
([#2645](googleapis/mcp-toolbox#2645))
([5271368](googleapis/mcp-toolbox@5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([#2620](googleapis/mcp-toolbox#2620))
([df7f2fd](googleapis/mcp-toolbox@df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([#2729](googleapis/mcp-toolbox#2729))
([87cd4a0](googleapis/mcp-toolbox@87cd4a0))
* **ui:** Remove module from script
([#2703](googleapis/mcp-toolbox#2703))
([6943ab6](googleapis/mcp-toolbox@6943ab6))
* Update toolset attributes naming
([#2554](googleapis/mcp-toolbox#2554))
([3d6ae4e](googleapis/mcp-toolbox@3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
NirajNandre pushed a commit to NirajNandre/genai-toolbox-fork that referenced this pull request Mar 24, 2026
…is#2558)

## Description

In `readInputStream()`, `defer span.End()` is called inside a `for`
loop. Since `defer` schedules execution when the enclosing **function**
returns (not the current loop iteration), all spans created per message
accumulate without ever being ended for the lifetime of the stdio
session.

For a long-lived stdio server, this means:
- **Memory leak**: span objects accumulate indefinitely
- **Incorrect traces**: spans are never properly closed, producing
misleading telemetry data

## Changes

Wrap the per-message processing logic in an immediately invoked function
expression (IIFE), so `defer span.End()` correctly fires at the end of
each iteration. This follows the same pattern already used in
`InitializeConfigs` (`server.go` lines 85-98) for scoping spans inside
loops.

## Test

All existing tests pass. The `TestStdioSession` test exercises
`readLine` and `write` on the stdio session. The `readInputStream` loop
is covered by the existing MCP endpoint tests that exercise the full
message processing pipeline.

Fixes googleapis#2549
NirajNandre pushed a commit to NirajNandre/genai-toolbox-fork that referenced this pull request Mar 24, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.29.0](googleapis/mcp-toolbox@v0.28.0...v0.29.0)
(2026-03-13)


### ⚠ BREAKING CHANGES

* **source/alloydb:** restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
* **source/spanner:** restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
* **source/dataplex:** restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
* **source/oss-db:** restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
* **source/cloudsql:** restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
* **source/bigquery:** restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
* **source/firestore:** restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
* telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))

### Features

* Add user agent to embeddings generation
([googleapis#2572](googleapis#2572))
([287251a](googleapis@287251a))
* **skill:** Attach user agent metadata for generated skill
([googleapis#2697](googleapis#2697))
([9598a6a](googleapis@9598a6a))
* **skills:** Add additional-notes flag to generate skills command
([googleapis#2696](googleapis#2696))
([73bf962](googleapis@73bf962))
* **skill:** Update skill generation logic
([googleapis#2646](googleapis#2646))
([c233eee](googleapis@c233eee))
* **source/alloydb:** Restructure prebuilt toolsets
([googleapis#2639](googleapis#2639))
([5f3f063](googleapis@5f3f063))
* **source/bigquery:** Restructure prebuilt toolsets
([googleapis#2637](googleapis#2637))
([dc984ba](googleapis@dc984ba))
* **sources/bigquery:** Support custom oauth header name
([googleapis#2564](googleapis#2564))
([d3baf77](googleapis@d3baf77))
* **source/cloudsql:** Restructure prebuilt toolsets
([googleapis#2635](googleapis#2635))
([99613dc](googleapis@99613dc))
* **source/dataplex:** Restructure prebuilt toolsets
([googleapis#2640](googleapis#2640))
([acb9a80](googleapis@acb9a80))
* **source/firestore:** Restructure prebuilt toolsets
([googleapis#2636](googleapis#2636))
([22ab7b9](googleapis@22ab7b9))
* **source/oss-db:** Restructure prebuilt toolsets
([googleapis#2638](googleapis#2638))
([5196c6a](googleapis@5196c6a))
* **source/spanner:** Restructure prebuilt toolsets
([googleapis#2641](googleapis#2641))
([ea2b698](googleapis@ea2b698))
* Telemetry metrics updates as per semantic convention
([googleapis#2566](googleapis#2566))
([131d764](googleapis@131d764))
* **tools/mongodb:** Add tool annotations to MongoDB tools for improved
LLM understanding
([googleapis#2219](googleapis#2219))
([b7a5f80](googleapis@b7a5f80))
* **tools/serverless-spark:** Add get_session_template tool
([googleapis#2308](googleapis#2308))
([a136e16](googleapis@a136e16))
* **tools/serverless-spark:** Add list/get sessions tools
([googleapis#2576](googleapis#2576))
([a554298](googleapis@a554298))


### Bug Fixes

* Improve list locks integration test for postgres
([googleapis#2279](googleapis#2279))
([d9ebe5d](googleapis@d9ebe5d))
* **mcp:** Guard nil SSE session lookup and return 400 for missing
session
([googleapis#2681](googleapis#2681))
([f66189f](googleapis@f66189f))
* **oracle:** Update oracle-execute-sql tool interface to match source
signature
([googleapis#2627](googleapis#2627))
([81699a3](googleapis@81699a3))
* Return AllParams for GetParameter() for tools with
templateParameter([googleapis#2734](googleapis#2734))
([bfd7ba6](googleapis@bfd7ba6))
* **server/mcp:** Scope defer span.End inside loop iteration
([googleapis#2558](googleapis#2558))
([c88a62d](googleapis@c88a62d)),
closes [googleapis#2549](googleapis#2549)
* **skill:** Fix env variable propagation
([googleapis#2645](googleapis#2645))
([5271368](googleapis@5271368))
* **sources/looker:** Looker and looker-dev prebuilt tools should share
one source definition.
([googleapis#2620](googleapis#2620))
([df7f2fd](googleapis@df7f2fd))
* **telemetry:** Histogram buckets from OTel standard to MCP standards
([googleapis#2729](googleapis#2729))
([87cd4a0](googleapis@87cd4a0))
* **ui:** Remove module from script
([googleapis#2703](googleapis#2703))
([6943ab6](googleapis@6943ab6))
* Update toolset attributes naming
([googleapis#2554](googleapis#2554))
([3d6ae4e](googleapis@3d6ae4e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Yuan Teoh <45984206+Yuan325@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release candidate Use label to signal PR should be included in the next release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: defer span.End() inside for loop in readInputStream() — spans never end until session closes

4 participants