---
title: MCP Removes the ping and logging/setLevel Methods
description: The 2026-07-28 MCP spec removes ping and logging/setLevel. Log level now sets per-request via _meta, and there is no stated ping replacement.
date: 2026-08-06T00:00:00.000Z
category: ai-productivity
tags: mcp, model-context-protocol, agents, observability
---

## Quick Answer

The MCP 2026-07-28 specification removes three protocol methods outright: `ping`, `logging/setLevel`, and `notifications/roots/list_changed`. Log level now sets per-request through a [`_meta` field](https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/logging) (`io.modelcontextprotocol/logLevel`) instead of a standalone RPC call. There's no stated direct replacement for `ping` as a liveness check in [this changelog entry](https://modelcontextprotocol.io/specification/2026-07-28/changelog).

## What's actually changing

The specification changelog states it directly:

> "Removed protocols: `ping`, `logging/setLevel`, `notifications/roots/list_changed`; log level now set per-request via `io.modelcontextprotocol/logLevel` in `_meta`"

Two of these three removals have a clear migration path; one doesn't. `logging/setLevel`'s replacement is explicit: a `_meta` field on each request instead of a dedicated call. `notifications/roots/list_changed`'s removal connects to [the broader Roots feature deprecation](/ai-productivity/mcp-deprecates-roots-sampling-and-logging/), which has its own migration guidance. `ping` simply has no stated replacement in this entry.

## Structural Comparison Matrix

| Operational Aspect                   | Before (removed 2026-07-28)        | After                                                    |
| :----------------------------------- | :--------------------------------- | :------------------------------------------------------- |
| **Setting log verbosity**            | Standalone `logging/setLevel` call | `_meta.io.modelcontextprotocol/logLevel` on each request |
| **Liveness checking**                | Standalone `ping` call             | No stated direct replacement                             |
| **Roots list-changed notifications** | `notifications/roots/list_changed` | Tied to the broader Roots deprecation                    |

## Fix it: move log level into \_meta, reconsider liveness checks

```json title="before: standalone logging/setLevel call (removed)"
{
  "jsonrpc": "2.0",
  "method": "logging/setLevel",
  "params": { "level": "debug" }
}
```

```json title="after: log level carried per-request in _meta"
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": { "query": "example" },
    "_meta": {
      "io.modelcontextprotocol/logLevel": "debug"
    }
  }
}
```

<Callout
  type="warning"
  title="Don't assume a health-check request works the same"
>
  If monitoring or orchestration code calls `ping` on an interval to confirm a
  server is alive, that call has no direct replacement here. Consider whether
  any ordinary low-cost request (like `server/discover`) serves the same purpose
  in practice, and verify that assumption against the current spec rather than
  treating this post's inference as confirmed guidance.
</Callout>

## Confirmed version

Sourced from the official Model Context Protocol specification changelog, 2026-07-28 revision, published 2026-07-28. The lack of a stated `ping` replacement is confirmed by its absence from this changelog entry, not an independent claim that no replacement exists anywhere in the spec; check current spec text directly if liveness checking is critical to your integration. Browse more posts like this in the [AI Productivity](/ai-productivity) archive.
