This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new f49c6d21fd MCP 2026-07-28 cache hints (SEP-2549) + v2
resources/templates/list
f49c6d21fd is described below
commit f49c6d21fd17d71781f23d798b0a2394f892d6bb
Author: James Bognar <[email protected]>
AuthorDate: Fri Jul 31 07:47:38 2026 -0400
MCP 2026-07-28 cache hints (SEP-2549) + v2 resources/templates/list
Add optional ttlMs/cacheScope hints to all five v2 result carriers
(tools/list, prompts/list, resources/list, resources/templates/list,
resources/read) plus real paginated resources/templates/list dispatch.
V2-only cache config (McpCacheHint/McpCacheConfig, servlet
createCacheConfig()/getCacheConfig(), McpEndpoint.cacheConfig());
revision-neutral core stays cache-free (dependency-fence proven).
New v2 beans: McpCacheScope, CacheableResult<T>, ResourceTemplate,
ListResourceTemplatesResult. New neutral McpResourceTemplateSpec +
registration.
TODO-312c2.
---
pages/release-notes/10.0.0.md | 10 +++++++
pages/topics/05.07.JuneauBeanMcp.md | 21 ++++++++++++++
pages/topics/11.JuneauRestServerMcp.md | 51 ++++++++++++++++++++++++++++++++++
3 files changed, 82 insertions(+)
diff --git a/pages/release-notes/10.0.0.md b/pages/release-notes/10.0.0.md
index e31457859b..209255a3ff 100644
--- a/pages/release-notes/10.0.0.md
+++ b/pages/release-notes/10.0.0.md
@@ -883,6 +883,16 @@ Requests without an `id` are treated as JSON-RPC
notifications: handlers run, ex
See [juneau-rest-server-mcp-2025-06-18](/docs/topics/JuneauRestServerMcp) for
the full topic.
+### MCP `2026-07-28` — cache hints (SEP-2549) + `resources/templates/list`
+
+The `2026-07-28` bean and REST-server adapter modules
(`juneau-bean-mcp-2026-07-28`, `juneau-rest-server-mcp-2026-07-28`) add
[SEP-2549](https://modelcontextprotocol.io/) cache hints and a
resource-template listing endpoint. Both are `2026-07-28`-only — the neutral
`juneau-rest-server-mcp` core and the `2025-06-18` adapter are untouched.
+
+- **Cache hints** — `tools/list`, `prompts/list`, `resources/list`,
`resources/templates/list`, and `resources/read` results can each carry a
nullable, top-level `ttlMs` (`Integer`) and `cacheScope` (`McpCacheScope`:
`public`/`private`) pair, via the new `CacheableResult<T>` CRTP base that
`ListToolsResult`, `ListPromptsResult`, `ListResourcesResult`,
`ListResourceTemplatesResult`, and `ReadResourceResult` all extend. Fields are
omitted from the wire when unset — there is no forced defau [...]
+- **`resources/templates/list`** — a new v2-only endpoint
(`McpMethods.RESOURCES_TEMPLATES_LIST`) listing `ResourceTemplate` descriptors
(`uriTemplate`, `name`, `title`, `description`, `mimeType`) registered via the
neutral `McpServerConfig.addResourceTemplate(McpResourceTemplateSpec)`.
Registering at least one resource template auto-derives the `resources`
capability, same as resources. The pre-built neutral `McpResourceTemplateSpec`
descriptor and this endpoint are designed for reuse b [...]
+- **Static, adapter-owned configuration only** — a server configures cache
hints once, at construction time, via the new `McpCacheConfig`/`McpCacheHint`
types (`createCacheConfig()` on `McpRestServlet`, `cacheConfig()` on
`McpEndpoint`). Precedence is atomic per list method (method-specific hint,
else a shared default, else no cache fields) and, for `resources/read`, adds an
exact-URI override map ahead of a `resourcesRead` default. Juneau does **not**
implement client-side caching, does [...]
+
+See
[juneau-rest-server-mcp](/docs/topics/JuneauRestServerMcp#cache-hints-mcp-2026-07-28-sep-2549)
and
[juneau-bean-mcp-2026-07-28](/docs/topics/JuneauBeanMcp#mcp-2026-07-28-cache-hints-resource-templates)
for the full topics.
+
### Bug Fixes
- **Fixed RRPC method calls never dispatching over POST.** Every HTTP POST to
an `@RestOp(method="RRPC")` operation previously returned a 404 instead of
reaching the target method. `RrpcRestOpSession` derived the RRPC method key by
splitting the request path on the last `/`, but RRPC keys are of the form
`methodName/(paramTypes)` and themselves contain a `/`, so the method name was
stripped off and the lookup always fell through to `NotFound`. The key is now
derived from the already-comp [...]
diff --git a/pages/topics/05.07.JuneauBeanMcp.md
b/pages/topics/05.07.JuneauBeanMcp.md
index 7ab9a7d5aa..70a85b6fe4 100644
--- a/pages/topics/05.07.JuneauBeanMcp.md
+++ b/pages/topics/05.07.JuneauBeanMcp.md
@@ -225,6 +225,27 @@ String yaml = Yaml.of(r);
Set `addBeanTypes` and the discriminator property names on the corresponding
builders to round-trip polymorphic content correctly.
+## MCP `2026-07-28` — Cache Hints & Resource Templates
+
+The sibling `juneau-bean-mcp-2026-07-28` module (package
`org.apache.juneau.bean.mcp.v20260728`) adds SEP-2549 cache hints and a
`resources/templates/list` result to its own revision of the wire beans covered
above. Both are opt-in, top-level, nullable fields/beans — omitted entirely
from the wire when unset.
+
+| Bean | Purpose |
+|---|---|
+| `McpCacheScope` | Enum with exactly two wire values: `public`, `private`. |
+| `CacheableResult<T>` | Abstract CRTP base contributing inherited, nullable,
top-level `ttlMs` (`Integer`) and `cacheScope` (`McpCacheScope`) properties to
a result bean. `ListToolsResult`, `ListPromptsResult`, `ListResourcesResult`,
`ListResourceTemplatesResult`, and `ReadResourceResult` all extend it. |
+| `ResourceTemplate` | Resource-template descriptor: `uriTemplate`, `name`,
`title`, `description`, `mimeType`. |
+| `ListResourceTemplatesResult` | Result of `resources/templates/list`:
`resourceTemplates`, `nextCursor`, plus the inherited cache fields. |
+
+A compact example showing both features on the same result:
+
+```json
+{"resourceTemplates":[{"uriTemplate":"file:///{name}","name":"files"}],"ttlMs":0,"cacheScope":"private"}
+```
+
+`ttlMs: 0` means the result is immediately stale (a valid, explicit hint —
distinct from omitting the field entirely). An absent `cacheScope` is
interpreted by a consumer as public; Juneau never writes a default scope onto
the wire — the property is only serialized when explicitly set. These fields
describe the *whole* result, not individual list items.
+
+`McpMethods.RESOURCES_TEMPLATES_LIST` (`"resources/templates/list"`) is the
JSON-RPC method name for the new endpoint. See
[juneau-rest-server-mcp](/docs/topics/JuneauRestServerMcp#cache-hints-mcp-2026-07-28-sep-2549)
for how a server configures cache hints and registers resource templates.
+
## Related Modules
- **[juneau-bean-jsonrpc](/docs/topics/JuneauBeanJsonRpc)** — The
revision-neutral JSON-RPC 2.0 envelope beans that carry MCP traffic on the wire.
diff --git a/pages/topics/11.JuneauRestServerMcp.md
b/pages/topics/11.JuneauRestServerMcp.md
index 64e9edd7e9..43fb29021f 100644
--- a/pages/topics/11.JuneauRestServerMcp.md
+++ b/pages/topics/11.JuneauRestServerMcp.md
@@ -296,6 +296,57 @@ MCP returns polymorphic content (`Content`,
`ResourceContents`) discriminated by
See [juneau-bean-mcp-2025-06-18](/docs/topics/JuneauBeanMcp) for the full
wire-bean catalog.
+## Cache Hints (MCP `2026-07-28`, SEP-2549)
+
+The `2026-07-28` adapter (`org.apache.juneau.rest.server.mcp.v20260728`) adds
two capabilities on top of the neutral core: SEP-2549 cache hints on five
list/read results, and a `resources/templates/list` endpoint. Both are
configured statically, at server-construction time — there is no
dynamic/per-request cache callback, and neither concept exists on the neutral
`juneau-rest-server-mcp` core or the `2025-06-18` adapter.
+
+### Registering resource templates
+
+Resource templates are registered on the same neutral `McpServerConfig` used
for tools/prompts/resources, via the revision-neutral `McpResourceTemplateSpec`
descriptor (`uriTemplate`, `name`, `title`, `description`, `mimeType`).
Registering at least one resource or resource template auto-derives the
`resources` capability, exactly like resources do today.
+
+### Configuring cache hints
+
+`McpCacheConfig` (adapter-owned, immutable after construction) carries one
`McpCacheHint` (nullable `ttlMs` + `McpCacheScope`) per list method, plus a
`resourcesRead` default and an exact-URI override map for individual resource
reads:
+
+```java
+private final McpCacheConfig cache = new McpCacheConfig()
+ .setDefaultHint(new McpCacheHint().setTtlMs(60_000))
+ .setToolsList(new McpCacheHint().setTtlMs(0))
+ .setResourcesRead(new
McpCacheHint().setCacheScope(McpCacheScope.PUBLIC))
+ .addResourceReadOverride("file:///private",
+ new
McpCacheHint().setTtlMs(5_000).setCacheScope(McpCacheScope.PRIVATE));
+
+@Override protected McpServerConfig createMcpConfig() {
+ return new McpServerConfig().addResourceTemplate(new
McpResourceTemplateSpec()
+
.setUriTemplate("file:///{name}").setName("files").setMimeType("text/plain"));
+}
+
+@Override protected McpCacheConfig createCacheConfig() {
+ return cache;
+}
+```
+
+The `McpEndpoint` mixin path is the same shape, with a stable `cacheConfig()`
override instead of `createCacheConfig()`:
+
+```java
+private final McpCacheConfig cache = new McpCacheConfig().setToolsList(new
McpCacheHint().setTtlMs(0));
+
+@Override public McpCacheConfig cacheConfig() {
+ return cache;
+}
+```
+
+**Precedence is atomic — a matched hint's `ttlMs`/`cacheScope` pair is applied
as a whole, never merged field-by-field with a lower-precedence hint:**
+
+- **List methods** (`tools/list`, `prompts/list`, `resources/list`,
`resources/templates/list`): the method-specific hint (e.g. `toolsList`) if
set, else `defaultHint` if set, else no cache fields are written at all. An
explicitly-set *empty* hint (both fields `null`) at a higher precedence still
suppresses the lower one — it does not fall through.
+- **`resources/read`**: `resourceReadOverrides.get(uri)` (exact string match —
no URI normalization or template expansion) if present, else `resourcesRead` if
set, else `defaultHint` if set, else no cache fields.
+
+Every page of a paginated list result carries an identical cache hint (or an
identical absence of one) — cache hints describe the whole result, not a side
channel keyed by page.
+
+Registering resource templates through the neutral
`McpServerConfig`/`McpResourceTemplateSpec` involves no cache-related types at
all; cache policy is entirely adapter-owned, keeping the neutral core (and
hence any future MCP revision built on it) free of both cache and
dated-revision knowledge.
+
+See
[juneau-bean-mcp-2026-07-28](/docs/topics/JuneauBeanMcp#mcp-2026-07-28-cache-hints-resource-templates)
for the wire-bean side of cache hints (`McpCacheScope`, `CacheableResult<T>`)
and resource templates (`ResourceTemplate`, `ListResourceTemplatesResult`).
+
## Related Modules
- **[juneau-bean-mcp-2025-06-18](/docs/topics/JuneauBeanMcp)** — The
`2025-06-18` wire beans consumed by the adapter module, plus the
revision-neutral JSON-RPC envelope beans (`juneau-bean-jsonrpc`) both modules
build on.