---
summary: "ErrorHandler stops double-writing ended OTel spans (recordException/setStatus); storage decodeCursor no longer leaks server stack traces through McpError.data on malformed cursors."
breaking: false
---

# 0.8.8 — 2026-05-01

## Fixed

- **`src/utils/internal/error-handler/errorHandler.ts`** ([#93](https://github.com/cyanheads/mcp-ts-core/issues/93)) — `handleError` now guards its OTel block with `activeSpan.isRecording()`, eliminating two `Cannot execute the operation on ended Span` warnings per tool failure under HTTP+OTel (`measureToolExecution` already records and ends the span before re-throwing). Same fix covers the prompt path; resource path was already clean (uses `classifyOnly`).
- **`src/storage/core/storageValidation.ts`** ([#71](https://github.com/cyanheads/mcp-ts-core/issues/71)) — `decodeCursor` no longer attaches `error.stack` to `McpError.data.rawError` — the stack goes to `logger.warning`, the thrown error carries only `operation` + request context. `McpError.data` is wire-visible (`structuredContent.error.data`/JSON-RPC `error.data`), so a forged cursor against `ctx.state.list(...)` previously leaked framework paths and version markers. Mirrors the pattern in `src/utils/pagination/pagination.ts`.
