This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git

commit d11383fe81bea68628dbb48c0ada3750ee6ffcb8
Author: James Bognar <[email protected]>
AuthorDate: Fri May 8 10:16:37 2026 -0400

    refactor(inject): TODO-15 phase-3 batch 2 — javadoc, deprecations, 
microservice survey, MCP migration
    
    Four small follow-on tasks bundled into one commit. Build + tests + 
jetty-ftest verified green at each step.
    
    (d) Javadoc-only refs updated to v2 — Name, Named, RestInit, RestInject now 
point at
    `org.apache.juneau.commons.inject.BeanStore` (with `WritableBeanStore` 
paired in
    the RestInject injectables table). The user-facing example field type in 
RestInject
    was flipped from `BasicBeanStore` to `BeanStore`. Removed the legacy
    `BasicBeanStore.Builder#overridingParent(...)` link in favor of 
impl-neutral prose.
    
    (f) Phase 0 deprecations — `@Deprecated(since = "9.5.0")` + `@deprecated` 
Javadoc
    added to the four legacy injection classes:
    * `cp.BasicBeanStore` → BeanStore / WritableBeanStore / BasicBeanStore2
    * `cp.BeanCreator` → BeanInstantiator
    * `cp.BeanCreateMethodFinder` → BeanStore.createBeanFromMethod(...)
    * `cp.ContextBeanCreator` → BeanInstantiator (deferred until v2 grows
      context-builder hooks; still extended by 
HttpPart{Parser,Serializer}.Creator)
    `forRemoval = true` deliberately not set — final removal happens in Phase 4.
    `org.apache.juneau.BeanBuilder` is intentionally not deprecated 
(consumer-facing
    builder superclass; internals widened to v2 in the previous commit).
    
    (e) Microservice / config survey — `juneau-microservice-core`,
    `juneau-microservice-jetty`, and `juneau-config` confirmed clean. Zero 
references
    to `BasicBeanStore`, `BeanCreator`, `BeanCreateMethodFinder`, or
    `ContextBeanCreator` across all 52 source files. No phase-3 migration work
    needed in those modules.
    
    (b) rest-server-mcp migration to v2 BeanStore. Public handler interfaces
    (`McpToolHandler`, `McpPromptHandler`, `McpResourceHandler`, 
`McpTypedToolHandler`,
    `McpTypedPromptHandler`, `McpCursor`) and their associated dispatch surfaces
    (`Mcp.handle`, `McpDispatcher.dispatch` + 7 internal methods, 
`McpTypedHandlers`
    adapters) now take `BeanStore ctx` instead of `BasicBeanStore ctx`. The 
read-only
    interface was chosen over `WritableBeanStore` because handlers don't mutate 
the
    store. Servlet wrap-and-add patterns in `McpRestServlet` and `McpEndpoint`
    simplified from `BasicBeanStore.of((BasicBeanStore) 
restReq.getContext().getBeanStore())`
    to `new BasicBeanStore2(restReq.getContext().getBeanStore())` — both 
pre-existing
    `// TODO: Why do we need a cast?` comments are now obsolete and gone. Six 
unit-test
    files updated in lockstep; `BasicBeanStore.create().build()` test ctx 
instances
    replaced with `new BasicBeanStore2()`. Added a no-arg `BasicBeanStore2()`
    constructor (equivalent to `new BasicBeanStore2(null)`) for standalone 
parent-less
    stores.
    
    This is a breaking change for any external consumer implementing the MCP
    handler interfaces — `BasicBeanStore ctx` → `BeanStore ctx`. Acceptable 
under
    9.5.0's semi-major release stance.
    
    TODO-15 plan updated: microservice survey, MCP migration, and Phase-0
    deprecations all marked DONE with detailed records.
    
    Co-authored-by: Cursor <[email protected]>
---
 .../juneau/commons/inject/BasicBeanStore2.java     | 11 +++++++++
 .../java/org/apache/juneau/annotation/Name.java    |  4 ++--
 .../java/org/apache/juneau/annotation/Named.java   |  6 ++---
 .../java/org/apache/juneau/cp/BasicBeanStore.java  | 15 ++++++++++++
 .../apache/juneau/cp/BeanCreateMethodFinder.java   |  8 +++++++
 .../java/org/apache/juneau/cp/BeanCreator.java     |  9 ++++++++
 .../org/apache/juneau/cp/ContextBeanCreator.java   |  7 ++++++
 .../main/java/org/apache/juneau/rest/mcp/Mcp.java  |  4 ++--
 .../java/org/apache/juneau/rest/mcp/McpCursor.java |  8 +++----
 .../org/apache/juneau/rest/mcp/McpDispatcher.java  | 20 ++++++++--------
 .../org/apache/juneau/rest/mcp/McpEndpoint.java    |  9 ++++----
 .../java/org/apache/juneau/rest/mcp/McpPage.java   |  2 +-
 .../apache/juneau/rest/mcp/McpPromptHandler.java   |  6 ++---
 .../apache/juneau/rest/mcp/McpResourceHandler.java |  6 ++---
 .../org/apache/juneau/rest/mcp/McpRestServlet.java |  4 ++--
 .../org/apache/juneau/rest/mcp/McpToolHandler.java |  8 +++----
 .../apache/juneau/rest/mcp/McpTypedHandlers.java   |  5 ++--
 .../juneau/rest/mcp/McpTypedPromptHandler.java     |  4 ++--
 .../juneau/rest/mcp/McpTypedToolHandler.java       |  4 ++--
 .../apache/juneau/rest/annotation/RestInit.java    |  2 +-
 .../apache/juneau/rest/annotation/RestInject.java  |  7 +++---
 .../org/apache/juneau/rest/mcp/McpCursor_Test.java |  5 ++--
 .../apache/juneau/rest/mcp/McpDispatcher_Test.java | 11 +++++----
 .../juneau/rest/mcp/McpHandlerDefaults_Test.java   |  9 ++++----
 .../juneau/rest/mcp/McpRestServlet_Test.java       |  6 ++---
 .../juneau/rest/mcp/McpServerConfig_Test.java      |  7 +++---
 .../juneau/rest/mcp/McpTypedHandlers_Test.java     | 27 +++++++++++-----------
 todo/TODO-15-replace-basicbeanstore-with-v2.md     | 18 +++++++--------
 28 files changed, 145 insertions(+), 87 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
index 6dffc3d6d4..bf9e65edd1 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/inject/BasicBeanStore2.java
@@ -78,6 +78,17 @@ public class BasicBeanStore2 implements WritableBeanStore {
        private final BeanStore parent;
        private final BeanStore overridingParent;
 
+       /**
+        * No-arg constructor.  Equivalent to {@code new BasicBeanStore2(null)}.
+        *
+        * <p>
+        * Creates a standalone, parent-less bean store.  All lookups consult 
only locally-registered beans and
+        * default suppliers.
+        */
+       public BasicBeanStore2() {
+               this(null, null);
+       }
+
        /**
         * Constructor.
         *
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java
index 615ba45575..24136e5ad9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Name.java
@@ -62,13 +62,13 @@ import java.lang.annotation.*;
  *
  *     <jc>// @Named - for bean injection</jc>
  *     <jk>public</jk> MyService(<ja>@Named</ja>(<js>"primaryDb"</js>) 
Database <jv>db</jv>) {
- *             <jc>// Injects the bean named "primaryDb" from 
BasicBeanStore</jc>
+ *             <jc>// Injects the bean named "primaryDb" from the 
BeanStore</jc>
  *     }
  * </p>
  *
  * <h5 class='section'>See Also:</h5><ul>
  *     <li class='ja'>{@link Named}
- *     <li class='jc'>{@link org.apache.juneau.cp.BasicBeanStore}
+ *     <li class='jc'>{@link org.apache.juneau.commons.inject.BeanStore}
  * </ul>
  */
 @Documented
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java
index ea66a6b6fe..def1f6d446 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Named.java
@@ -28,7 +28,7 @@ import java.lang.annotation.*;
  * <h5 class='section'>Example:</h5>
  * <p class='bjava'>
  *     <jk>public</jk> MyClass(<ja>@Named</ja>(<js>"myBean"</js>) MyBean 
<jv>bean</jv>) {
- *             <jc>// Constructor will receive the bean named "myBean" from 
the BasicBeanStore</jc>
+ *             <jc>// Constructor will receive the bean named "myBean" from 
the BeanStore</jc>
  *     }
  *
  *     <ja>@Inject</ja>
@@ -49,7 +49,7 @@ import java.lang.annotation.*;
  * <p class='bjava'>
  *     <jc>// @Named - for bean injection</jc>
  *     <jk>public</jk> MyService(<ja>@Named</ja>(<js>"primaryDb"</js>) 
Database <jv>db</jv>) {
- *             <jc>// Injects the bean named "primaryDb" from 
BasicBeanStore</jc>
+ *             <jc>// Injects the bean named "primaryDb" from the 
BeanStore</jc>
  *     }
  *
  *     <jc>// @Name - for parameter naming (when bytecode names 
unavailable)</jc>
@@ -61,7 +61,7 @@ import java.lang.annotation.*;
  *
  * <h5 class='section'>See Also:</h5><ul>
  *     <li class='ja'>{@link Name}
- *     <li class='jc'>{@link org.apache.juneau.cp.BasicBeanStore}
+ *     <li class='jc'>{@link org.apache.juneau.commons.inject.BeanStore}
  * </ul>
  */
 @Documented
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java
index 48ee0990e1..1c4bca7f5f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BasicBeanStore.java
@@ -97,7 +97,22 @@ import org.apache.juneau.commons.reflect.*;
  *     <li class='note'>Bean stores can be made thread-safe using {@link 
Builder#threadSafe()}.
  * </ul>
  *
+ * @deprecated Since 9.5.0 — replaced by the v2 injection surface in
+ * {@link org.apache.juneau.commons.inject}:
+ * <ul>
+ *   <li>{@link org.apache.juneau.commons.inject.BeanStore BeanStore} — 
read-only interface (most common consumer surface).
+ *   <li>{@link org.apache.juneau.commons.inject.WritableBeanStore 
WritableBeanStore} — adds {@code addBean}, {@code addSupplier}, {@code 
addBeanType}, etc.
+ *   <li>{@link org.apache.juneau.commons.inject.BasicBeanStore2 
BasicBeanStore2} — concrete writable implementation (will be renamed to {@code 
BasicBeanStore} once this legacy class is removed in Phase 4).
+ * </ul>
+ * Bean instantiation moves from {@link BeanCreator#of(Class, BasicBeanStore)} 
to
+ * {@link org.apache.juneau.commons.inject.BeanInstantiator#of(Class, 
org.apache.juneau.commons.inject.BeanStore) BeanInstantiator.of(Class, 
BeanStore)}.
+ * Method-creator lookups ({@link BeanCreateMethodFinder}) move to
+ * {@link 
org.apache.juneau.commons.inject.BeanStore#createBeanFromMethod(Class, Object, 
String) BeanStore.createBeanFromMethod(...)}.
+ * <p>
+ * This class still {@code implements WritableBeanStore} as a transitional 
bridge so existing legacy callers compile unchanged
+ * during the migration. {@code forRemoval=true} is intentionally not set yet 
— final removal happens in Phase 4 of TODO-15.
  */
+@Deprecated(since = "9.5.0")
 @SuppressWarnings({
        "java:S115" // Constants use UPPER_snakeCase convention
 })
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
index e98ce3a2c7..76f05ed085 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
@@ -78,7 +78,15 @@ import org.apache.juneau.commons.reflect.*;
  * </ul>
  *
  * @param <T> The bean type being created.
+ *
+ * @deprecated Since 9.5.0 — replaced by
+ * {@link 
org.apache.juneau.commons.inject.BeanStore#createBeanFromMethod(Class, Object, 
String) BeanStore.createBeanFromMethod(beanType, resource, methodName)}.
+ * The v2 API returns an {@link java.util.Optional Optional} that callers 
chain with {@code .ifPresent(...)} / {@code .orElseGet(...)} —
+ * no separate {@code .find(...).thenFind(...).withDefault(...).run()} fluent 
chain is needed. See TODO-15 phase 3 for the bulk
+ * migration that already moved 49 internal call sites in {@code 
RestContext}/{@code RestOpContext} to the v2 surface.
+ * {@code forRemoval=true} is intentionally not set yet; final deletion 
happens in Phase 4 of TODO-15.
  */
+@Deprecated(since = "9.5.0")
 @SuppressWarnings({
        "java:S115" // Constants use UPPER_snakeCase convention
 })
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
index 0d17576262..53eb75647f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
@@ -119,7 +119,16 @@ import org.apache.juneau.commons.reflect.*;
  * </ul>
  *
  * @param <T> The bean type being created.
+ *
+ * @deprecated Since 9.5.0 — replaced by
+ * {@link org.apache.juneau.commons.inject.BeanInstantiator BeanInstantiator}.
+ * Migrate {@code BeanCreator.of(Type.class, beanStore).type(impl).run()} to
+ * {@code BeanInstantiator.of(Type.class, beanStore).beanSubType(impl).run()}.
+ * The v2 instantiator accepts any {@link 
org.apache.juneau.commons.inject.BeanStore BeanStore} parent
+ * (legacy or v2) — no downcast required at call sites.
+ * {@code forRemoval=true} is intentionally not set yet; final deletion 
happens in Phase 4 of TODO-15.
  */
+@Deprecated(since = "9.5.0")
 public class BeanCreator<T> {
 
        static class Match<T extends ExecutableInfo> {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java
index b88d26b429..ff3f02d2f0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/ContextBeanCreator.java
@@ -33,7 +33,14 @@ import org.apache.juneau.*;
  *
  *
  * @param <T> The bean type.
+ *
+ * @deprecated Since 9.5.0 — slated for removal in Phase 4 of TODO-15. The two 
known consumers
+ * ({@link org.apache.juneau.httppart.HttpPartParser.Creator 
HttpPartParser.Creator} and
+ * {@link org.apache.juneau.httppart.HttpPartSerializer.Creator 
HttpPartSerializer.Creator}) extend this class.
+ * They will migrate to {@link 
org.apache.juneau.commons.inject.BeanInstantiator BeanInstantiator} once the v2 
surface
+ * grows the equivalent context-builder hooks. {@code forRemoval=true} is 
intentionally not set yet.
  */
+@Deprecated(since = "9.5.0")
 public class ContextBeanCreator<T> {
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java
index f5414f1f37..e2f258a32e 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/Mcp.java
@@ -17,7 +17,7 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Static façade over {@link McpDispatcher} for embedders that want a 
single-line dispatch call.
@@ -52,7 +52,7 @@ public final class Mcp {
         * @param ctx Per-request bean store.
         * @return The response, or {@code null} for notification requests.
         */
-       public static JsonRpcResponse handle(JsonRpcRequest req, 
McpServerConfig config, BasicBeanStore ctx) {
+       public static JsonRpcResponse handle(JsonRpcRequest req, 
McpServerConfig config, BeanStore ctx) {
                return DISPATCHER.dispatch(req, config, ctx);
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
index bf56e19b12..c078e3b4df 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpCursor.java
@@ -18,7 +18,7 @@ package org.apache.juneau.rest.mcp;
 
 import java.util.*;
 
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Pagination strategy for MCP {@code list} dispatchers (tools / prompts / 
resources).
@@ -43,14 +43,14 @@ public interface McpCursor {
         * @param <T> Element type.
         * @return A non-{@code null} page.
         */
-       <T> McpPage<T> page(List<T> all, String cursor, BasicBeanStore ctx);
+       <T> McpPage<T> page(List<T> all, String cursor, BeanStore ctx);
 
        /**
         * Returns everything in a single page; emits no {@code nextCursor}.
         */
        McpCursor SINGLE_PAGE = new McpCursor() {
                @Override
-               public <T> McpPage<T> page(List<T> all, String cursor, 
BasicBeanStore ctx) {
+               public <T> McpPage<T> page(List<T> all, String cursor, 
BeanStore ctx) {
                        return new McpPage<>(all == null ? List.of() : all, 
null);
                }
        };
@@ -69,7 +69,7 @@ public interface McpCursor {
                        throw new IllegalArgumentException("pageSize must be 
positive: " + pageSize);
                return new McpCursor() {
                        @Override
-                       public <T> McpPage<T> page(List<T> all, String cursor, 
BasicBeanStore ctx) {
+                       public <T> McpPage<T> page(List<T> all, String cursor, 
BeanStore ctx) {
                                var src = all == null ? List.<T>of() : all;
                                var offset = parseOffset(cursor);
                                if (offset >= src.size())
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
index 6744da45db..5fb9816a99 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpDispatcher.java
@@ -21,7 +21,7 @@ import java.util.stream.*;
 
 import org.apache.juneau.bean.mcp.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Transport-agnostic JSON-RPC dispatcher for the MCP wire protocol.
@@ -30,7 +30,7 @@ import org.apache.juneau.cp.*;
  * The dispatcher contains <em>zero</em> HTTP plumbing; it accepts a parsed 
{@link JsonRpcRequest},
  * routes by {@code method}, and returns a {@link JsonRpcResponse}. {@link 
McpRestServlet} is a thin
  * adapter that wraps this dispatcher in a Juneau REST {@code @RestPost} 
method, but embedders are
- * free to call {@link #dispatch(JsonRpcRequest, McpServerConfig, 
BasicBeanStore)} directly from
+ * free to call {@link #dispatch(JsonRpcRequest, McpServerConfig, BeanStore)} 
directly from
  * tests or from a non-Juneau servlet.
  *
  * <p>
@@ -67,7 +67,7 @@ public class McpDispatcher {
         * @param ctx Per-request bean store (passed through to handlers). 
Never {@code null}.
         * @return The response, or {@code null} for notification requests.
         */
-       public JsonRpcResponse dispatch(JsonRpcRequest req, McpServerConfig 
config, BasicBeanStore ctx) {
+       public JsonRpcResponse dispatch(JsonRpcRequest req, McpServerConfig 
config, BeanStore ctx) {
                if (req == null)
                        return errorResponse(null, CODE_INVALID_REQUEST, 
"Request envelope is null", null);
 
@@ -94,7 +94,7 @@ public class McpDispatcher {
                return id == null;
        }
 
-       private Object invoke(String method, Object params, McpServerConfig 
config, BasicBeanStore ctx) {
+       private Object invoke(String method, Object params, McpServerConfig 
config, BeanStore ctx) {
                switch (method) {
                        case McpMethods.INITIALIZE:
                                return initialize(config);
@@ -146,13 +146,13 @@ public class McpDispatcher {
        // tools
        // 
-------------------------------------------------------------------------------------------
 
-       private static ListToolsResult listTools(McpServerConfig config, Object 
params, BasicBeanStore ctx) {
+       private static ListToolsResult listTools(McpServerConfig config, Object 
params, BeanStore ctx) {
                var descriptors = 
config.getTools().stream().map(McpToolHandler::descriptor).collect(Collectors.toList());
                var page = config.getCursor().page(descriptors, 
cursorOf(params), ctx);
                return new 
ListToolsResult().setTools(page.items()).setNextCursor(page.nextCursor());
        }
 
-       private static CallToolResult callTool(McpServerConfig config, Object 
params, BasicBeanStore ctx) {
+       private static CallToolResult callTool(McpServerConfig config, Object 
params, BeanStore ctx) {
                var p = asMap(params);
                var name = strParam(p, "name");
                if (name == null)
@@ -169,13 +169,13 @@ public class McpDispatcher {
        // prompts
        // 
-------------------------------------------------------------------------------------------
 
-       private static ListPromptsResult listPrompts(McpServerConfig config, 
Object params, BasicBeanStore ctx) {
+       private static ListPromptsResult listPrompts(McpServerConfig config, 
Object params, BeanStore ctx) {
                var descriptors = 
config.getPrompts().stream().map(McpPromptHandler::descriptor).collect(Collectors.toList());
                var page = config.getCursor().page(descriptors, 
cursorOf(params), ctx);
                return new 
ListPromptsResult().setPrompts(page.items()).setNextCursor(page.nextCursor());
        }
 
-       private static GetPromptResult getPrompt(McpServerConfig config, Object 
params, BasicBeanStore ctx) {
+       private static GetPromptResult getPrompt(McpServerConfig config, Object 
params, BeanStore ctx) {
                var p = asMap(params);
                var name = strParam(p, "name");
                if (name == null)
@@ -192,13 +192,13 @@ public class McpDispatcher {
        // resources
        // 
-------------------------------------------------------------------------------------------
 
-       private static ListResourcesResult listResources(McpServerConfig 
config, Object params, BasicBeanStore ctx) {
+       private static ListResourcesResult listResources(McpServerConfig 
config, Object params, BeanStore ctx) {
                var descriptors = 
config.getResources().stream().map(McpResourceHandler::descriptor).collect(Collectors.toList());
                var page = config.getCursor().page(descriptors, 
cursorOf(params), ctx);
                return new 
ListResourcesResult().setResources(page.items()).setNextCursor(page.nextCursor());
        }
 
-       private static ReadResourceResult readResource(McpServerConfig config, 
Object params, BasicBeanStore ctx) {
+       private static ReadResourceResult readResource(McpServerConfig config, 
Object params, BeanStore ctx) {
                var p = asMap(params);
                var uri = strParam(p, "uri");
                if (uri == null)
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java
index c3e6767651..5cf9d153f5 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpEndpoint.java
@@ -17,7 +17,8 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.apache.juneau.http.annotation.Content;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -28,7 +29,7 @@ import org.apache.juneau.rest.annotation.*;
  * <p>
  * Implementing classes provide their {@link McpServerConfig} by implementing 
{@link #getMcpConfig()}; the
  * default {@link #handleMcpRequest(JsonRpcRequest, RestRequest)} method 
dispatches incoming requests through
- * {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BasicBeanStore)}.
+ * {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BeanStore)}.
  *
  * <h5 class='section'>Example:</h5>
  * <pre>
@@ -55,7 +56,7 @@ public interface McpEndpoint {
         *
         * <p>
         * Implementations may override this method to customize routing (path 
/ annotations) but must still
-        * call {@link Mcp#handle(JsonRpcRequest, McpServerConfig, 
BasicBeanStore)} to dispatch.
+        * call {@link Mcp#handle(JsonRpcRequest, McpServerConfig, BeanStore)} 
to dispatch.
         *
         * @param req JSON-RPC request envelope.
         * @param restReq The current REST request.
@@ -63,7 +64,7 @@ public interface McpEndpoint {
         */
        @RestPost(path = "/mcp")
        default JsonRpcResponse handleMcpRequest(@Content JsonRpcRequest req, 
RestRequest restReq) {
-               var bs = BasicBeanStore.of((BasicBeanStore) 
restReq.getContext().getBeanStore())  // TODO - Why do we need a cast?
+               var bs = new 
BasicBeanStore2(restReq.getContext().getBeanStore())
                        .addBean(RestRequest.class, restReq);
                return Mcp.handle(req, getMcpConfig(), bs);
        }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java
index adff62cd59..4138abbf87 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPage.java
@@ -19,7 +19,7 @@ package org.apache.juneau.rest.mcp;
 import java.util.*;
 
 /**
- * Slice of MCP descriptors returned by {@link McpCursor#page(List, String, 
org.apache.juneau.cp.BasicBeanStore)}.
+ * Slice of MCP descriptors returned by {@link McpCursor#page(List, String, 
org.apache.juneau.commons.inject.BeanStore)}.
  *
  * @param <T> Descriptor element type ({@code Tool}, {@code Prompt}, or {@code 
Resource}).
  * @param items Items to return on the current page. Never {@code null}.
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java
index cdd7af34b8..25f53cc92f 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpPromptHandler.java
@@ -19,14 +19,14 @@ package org.apache.juneau.rest.mcp;
 import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Handler for a single MCP prompt.
  *
  * <p>
  * Implementations declare a {@link #descriptor() descriptor} (the {@link 
Prompt} returned by {@code prompts/list})
- * and a {@link #get(Map, BasicBeanStore) get} body invoked when the matching 
{@code prompts/get} method runs.
+ * and a {@link #get(Map, BeanStore) get} body invoked when the matching 
{@code prompts/get} method runs.
  */
 @FunctionalInterface
 public interface McpPromptHandler {
@@ -51,5 +51,5 @@ public interface McpPromptHandler {
         * @param ctx Per-request bean store. Never {@code null}.
         * @return The rendered prompt. Never {@code null}.
         */
-       GetPromptResult get(Map<String, Object> arguments, BasicBeanStore ctx);
+       GetPromptResult get(Map<String, Object> arguments, BeanStore ctx);
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java
index eada0ebfd2..748c224207 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpResourceHandler.java
@@ -17,14 +17,14 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Handler for a single MCP resource.
  *
  * <p>
  * Implementations declare a {@link #descriptor() descriptor} (the {@link 
Resource} returned by {@code resources/list})
- * and a {@link #read(String, BasicBeanStore) read} body invoked when the 
matching {@code resources/read} method runs.
+ * and a {@link #read(String, BeanStore) read} body invoked when the matching 
{@code resources/read} method runs.
  */
 @FunctionalInterface
 public interface McpResourceHandler {
@@ -49,5 +49,5 @@ public interface McpResourceHandler {
         * @param ctx Per-request bean store. Never {@code null}.
         * @return The resource contents. Never {@code null}.
         */
-       ReadResourceResult read(String uri, BasicBeanStore ctx);
+       ReadResourceResult read(String uri, BeanStore ctx);
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java
index 5007a7a42e..ee0ff5415a 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpRestServlet.java
@@ -17,7 +17,7 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
 import org.apache.juneau.http.annotation.Content;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -96,7 +96,7 @@ public abstract class McpRestServlet extends BasicRestServlet 
{
         */
        @RestPost(path = "/")
        public JsonRpcResponse handleMcp(@Content JsonRpcRequest req, 
RestRequest restReq) {
-               var bs = BasicBeanStore.of((BasicBeanStore) 
restReq.getContext().getBeanStore())  // TODO - Why do we need a cast?
+               var bs = new 
BasicBeanStore2(restReq.getContext().getBeanStore())
                        .addBean(RestRequest.class, restReq);
                return Mcp.handle(req, getMcpConfig(), bs);
        }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java
index a569dfa264..92276d61e7 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpToolHandler.java
@@ -19,17 +19,17 @@ package org.apache.juneau.rest.mcp;
 import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Handler for a single MCP tool.
  *
  * <p>
  * Implementations declare a {@link #descriptor() descriptor} (the {@link 
Tool} returned by {@code tools/list})
- * and a {@link #call(Map, BasicBeanStore) call} body invoked when the 
matching {@code tools/call} method runs.
+ * and a {@link #call(Map, BeanStore) call} body invoked when the matching 
{@code tools/call} method runs.
  *
  * <p>
- * The {@link BasicBeanStore} argument is the per-request bean store, allowing 
handlers to look up additional
+ * The {@link BeanStore} argument is the per-request bean store, allowing 
handlers to look up additional
  * services (or the underlying {@code RestRequest}) without making this 
interface depend on REST runtime types.
  */
 @FunctionalInterface
@@ -55,5 +55,5 @@ public interface McpToolHandler {
         * @param ctx Per-request bean store. Never {@code null}.
         * @return The call result. Never {@code null}.
         */
-       CallToolResult call(Map<String, Object> arguments, BasicBeanStore ctx);
+       CallToolResult call(Map<String, Object> arguments, BeanStore ctx);
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java
index 18675f9944..9a1320418a 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedHandlers.java
@@ -19,6 +19,7 @@ package org.apache.juneau.rest.mcp;
 import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.apache.juneau.marshaller.*;
 
 /**
@@ -55,7 +56,7 @@ public final class McpTypedHandlers {
                        }
 
                        @Override
-                       public CallToolResult call(Map<String, Object> 
arguments, org.apache.juneau.cp.BasicBeanStore ctx) {
+                       public CallToolResult call(Map<String, Object> 
arguments, BeanStore ctx) {
                                A bound = bindArguments(arguments, 
typed.argumentType());
                                R result = typed.call(bound, ctx);
                                return wrapToolResult(result);
@@ -82,7 +83,7 @@ public final class McpTypedHandlers {
                        }
 
                        @Override
-                       public GetPromptResult get(Map<String, Object> 
arguments, org.apache.juneau.cp.BasicBeanStore ctx) {
+                       public GetPromptResult get(Map<String, Object> 
arguments, BeanStore ctx) {
                                A bound = bindArguments(arguments, 
typed.argumentType());
                                return typed.get(bound, ctx);
                        }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java
index 45a568b274..b800038ffc 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedPromptHandler.java
@@ -17,7 +17,7 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Typed variant of {@link McpPromptHandler} where MCP {@code prompts/get} 
arguments bind into a Juneau bean.
@@ -47,5 +47,5 @@ public interface McpTypedPromptHandler<A> {
         * @param ctx Per-request bean store.
         * @return The rendered prompt.
         */
-       GetPromptResult get(A arguments, BasicBeanStore ctx);
+       GetPromptResult get(A arguments, BeanStore ctx);
 }
diff --git 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java
 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java
index 1c14f7adcd..33c0a7b553 100644
--- 
a/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java
+++ 
b/juneau-rest/juneau-rest-server-mcp/src/main/java/org/apache/juneau/rest/mcp/McpTypedToolHandler.java
@@ -17,7 +17,7 @@
 package org.apache.juneau.rest.mcp;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 
 /**
  * Typed variant of {@link McpToolHandler} where MCP {@code tools/call} 
arguments bind into a Juneau bean.
@@ -58,5 +58,5 @@ public interface McpTypedToolHandler<A, R> {
         * @param ctx Per-request bean store.
         * @return The call result.
         */
-       R call(A arguments, BasicBeanStore ctx);
+       R call(A arguments, BeanStore ctx);
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java
index edd1618ea7..56dbeea668 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInit.java
@@ -36,7 +36,7 @@ import jakarta.servlet.*;
  *
  * <p>
  * Method parameters are resolved from the
- * {@link org.apache.juneau.cp.BasicBeanStore bean store} the same way as any 
other Juneau-injected
+ * {@link org.apache.juneau.commons.inject.BeanStore bean store} the same way 
as any other Juneau-injected
  * method. {@link jakarta.servlet.ServletConfig}, {@link 
jakarta.servlet.ServletContext}, the resource instance
  * itself, and any bean registered via {@link 
org.apache.juneau.rest.annotation.RestInject @RestInject} or the
  * configured bean-store hooks are all resolvable. Zero-argument variants are 
also supported.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java
index 485ef91f1c..96b1228de4 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestInject.java
@@ -126,7 +126,7 @@ import org.apache.juneau.svl.*;
  * <p class='bcode'>
  *     <jc>// Fields that get set during initialization based on beans found 
in the bean store.</jc>
  *     <ja>@RestInject</ja> CallLogger <jf>callLogger</jf>;
- *     <ja>@RestInject</ja> BasicBeanStore <jf>beanStore</jf>;  <jc>// Note 
that BasicBeanStore itself can be accessed this way.</jc>
+ *     <ja>@RestInject</ja> BeanStore <jf>beanStore</jf>;  <jc>// Note that 
the BeanStore itself can be accessed this way.</jc>
  * </p>
  *
  * <h5 class='section'>Notes:</h5><ul>
@@ -147,7 +147,8 @@ import org.apache.juneau.svl.*;
  * </p>
  * <ol>
  *     <li><b>Overriding-parent bean store</b> — Spring beans (in 
<c>juneau-rest-server-springboot</c> deployments,
- *             via <c>SpringBeanStore</c>), or any bean reachable through 
{@link 
org.apache.juneau.cp.BasicBeanStore.Builder#overridingParent(org.apache.juneau.cp.BasicBeanStore)
 overridingParent(...)}.</li>
+ *             via <c>SpringBeanStore</c>), or any bean reachable through the 
configured overriding-parent
+ *             bean-store chain.</li>
  *     <li><b>{@code @RestInject} method/field on the resource class</b> — 
registered as a regular bean-store
  *             entry, beating the framework default.</li>
  *     <li><b>Memoizer-backed framework default</b> — built into {@link 
RestContext} as a default supplier.</li>
@@ -169,7 +170,7 @@ import org.apache.juneau.svl.*;
  * <table class='w800 styled'>
  *     <tr><th>Bean class</td><th>Bean qualifying names</th><th>Scope</th></tr>
  *     <tr><td>{@link BeanContext}<br>{@link 
org.apache.juneau.BeanContext.Builder}</td><td></td><td>class<br>method</td></tr>
- *     <tr><td>{@link BasicBeanStore}<br>{@link 
org.apache.juneau.cp.BasicBeanStore.Builder}</td><td></td><td>class</td></tr>
+ *     <tr><td>{@link org.apache.juneau.commons.inject.BeanStore 
BeanStore}<br>{@link org.apache.juneau.commons.inject.WritableBeanStore 
WritableBeanStore}</td><td></td><td>class</td></tr>
  *     <tr><td>{@link CallLogger}</td><td></td><td>class</td></tr>
  *     <tr><td>{@link Config}</td><td></td><td>class</td></tr>
  *     <tr><td>{@link DebugEnablement}</td><td></td><td>class</td></tr>
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java
index bc710919cc..beb0194bcf 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpCursor_Test.java
@@ -21,7 +21,8 @@ import static org.junit.jupiter.api.Assertions.*;
 
 import java.util.*;
 
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.junit.jupiter.api.*;
 
 /**
@@ -29,7 +30,7 @@ import org.junit.jupiter.api.*;
  */
 class McpCursor_Test {
 
-       private static final BasicBeanStore CTX = 
BasicBeanStore.create().build();
+       private static final BeanStore CTX = new BasicBeanStore2();
 
        @Test
        void singlePage_returnsAll_withNullCursor() {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java
index 99f6e3b21b..e4be792745 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpDispatcher_Test.java
@@ -23,7 +23,8 @@ import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.junit.jupiter.api.*;
 
 /**
@@ -32,7 +33,7 @@ import org.junit.jupiter.api.*;
 class McpDispatcher_Test {
 
        private final McpDispatcher dispatcher = new McpDispatcher();
-       private final BasicBeanStore ctx = BasicBeanStore.create().build();
+       private final BeanStore ctx = new BasicBeanStore2();
 
        private static McpToolHandler tool(String name, 
java.util.function.Function<Map<String, Object>, CallToolResult> fn) {
                return new McpToolHandler() {
@@ -42,7 +43,7 @@ class McpDispatcher_Test {
                        }
 
                        @Override
-                       public CallToolResult call(Map<String, Object> 
arguments, BasicBeanStore ctx) {
+                       public CallToolResult call(Map<String, Object> 
arguments, BeanStore ctx) {
                                return fn.apply(arguments);
                        }
                };
@@ -56,7 +57,7 @@ class McpDispatcher_Test {
                        }
 
                        @Override
-                       public GetPromptResult get(Map<String, Object> 
arguments, BasicBeanStore ctx) {
+                       public GetPromptResult get(Map<String, Object> 
arguments, BeanStore ctx) {
                                return fn.apply(arguments);
                        }
                };
@@ -70,7 +71,7 @@ class McpDispatcher_Test {
                        }
 
                        @Override
-                       public ReadResourceResult read(String u, BasicBeanStore 
ctx) {
+                       public ReadResourceResult read(String u, BeanStore ctx) 
{
                                return fn.apply(u);
                        }
                };
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java
index 0d78e6583b..928dcb5fc6 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpHandlerDefaults_Test.java
@@ -20,7 +20,8 @@ import static org.apache.juneau.junit.bct.BctAssertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.junit.jupiter.api.*;
 
 /**
@@ -91,12 +92,12 @@ class McpHandlerDefaults_Test {
 
        @Test
        void cursor_passes_ctx_to_strategy() {
-               // Verify ctx parameter reaches the cursor (covers the 
BasicBeanStore parameter passthrough).
-               var bs = BasicBeanStore.create().build();
+               // Verify ctx parameter reaches the cursor (covers the 
BeanStore parameter passthrough).
+               var bs = new BasicBeanStore2();
                var got = new Object[1];
                McpCursor c = new McpCursor() {
                        @Override
-                       public <T> McpPage<T> page(java.util.List<T> all, 
String cursor, BasicBeanStore ctx) {
+                       public <T> McpPage<T> page(java.util.List<T> all, 
String cursor, BeanStore ctx) {
                                got[0] = ctx;
                                return new McpPage<>(all, null);
                        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java
index 025b5702dd..92daf00264 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpRestServlet_Test.java
@@ -23,7 +23,7 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.bean.mcp.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.mock.*;
@@ -54,7 +54,7 @@ class McpRestServlet_Test extends TestBase {
                                        }
 
                                        @Override
-                                       public CallToolResult call(Map<String, 
Object> arguments, BasicBeanStore ctx) {
+                                       public CallToolResult call(Map<String, 
Object> arguments, BeanStore ctx) {
                                                var ctr = new CallToolResult();
                                                ctr.setContent(List.of(new 
TextContent().setText(String.valueOf(arguments.get("text")))));
                                                return ctr;
@@ -121,7 +121,7 @@ class McpRestServlet_Test extends TestBase {
                                public Tool descriptor() { return new 
Tool().setName("ping"); }
 
                                @Override
-                               public CallToolResult call(Map<String, Object> 
arguments, BasicBeanStore ctx) {
+                               public CallToolResult call(Map<String, Object> 
arguments, BeanStore ctx) {
                                        return new 
CallToolResult().setContent(List.of(new TextContent().setText("pong")));
                                }
                        });
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java
index 8e6b44f596..c7ba096a80 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpServerConfig_Test.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.junit.jupiter.api.*;
 
 /**
@@ -37,7 +38,7 @@ class McpServerConfig_Test {
                        }
 
                        @Override
-                       public CallToolResult call(Map<String, Object> 
arguments, org.apache.juneau.cp.BasicBeanStore ctx) {
+                       public CallToolResult call(Map<String, Object> 
arguments, BeanStore ctx) {
                                return new CallToolResult();
                        }
                };
@@ -51,7 +52,7 @@ class McpServerConfig_Test {
                        }
 
                        @Override
-                       public GetPromptResult get(Map<String, Object> 
arguments, org.apache.juneau.cp.BasicBeanStore ctx) {
+                       public GetPromptResult get(Map<String, Object> 
arguments, BeanStore ctx) {
                                return new GetPromptResult();
                        }
                };
@@ -65,7 +66,7 @@ class McpServerConfig_Test {
                        }
 
                        @Override
-                       public ReadResourceResult read(String u, 
org.apache.juneau.cp.BasicBeanStore ctx) {
+                       public ReadResourceResult read(String u, BeanStore ctx) 
{
                                return new ReadResourceResult();
                        }
                };
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java
index 7f92dabe68..f11c9826bd 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/mcp/McpTypedHandlers_Test.java
@@ -23,7 +23,8 @@ import java.util.*;
 
 import org.apache.juneau.bean.mcp.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.cp.*;
+import org.apache.juneau.commons.inject.BasicBeanStore2;
+import org.apache.juneau.commons.inject.BeanStore;
 import org.junit.jupiter.api.*;
 
 /**
@@ -48,7 +49,7 @@ class McpTypedHandlers_Test {
                public EchoResult setText(String text) { this.text = text; 
return this; }
        }
 
-       private final BasicBeanStore ctx = BasicBeanStore.create().build();
+       private final BeanStore ctx = new BasicBeanStore2();
        private final McpDispatcher dispatcher = new McpDispatcher();
 
        @Test
@@ -65,7 +66,7 @@ class McpTypedHandlers_Test {
                        }
 
                        @Override
-                       public EchoResult call(EchoArgs args, BasicBeanStore 
ctx) {
+                       public EchoResult call(EchoArgs args, BeanStore ctx) {
                                return new 
EchoResult().setText(args.getMessage() + ":" + args.getRepeat());
                        }
                };
@@ -98,7 +99,7 @@ class McpTypedHandlers_Test {
                        }
 
                        @Override
-                       public CallToolResult call(EchoArgs args, 
BasicBeanStore ctx) {
+                       public CallToolResult call(EchoArgs args, BeanStore 
ctx) {
                                return ctr;
                        }
                };
@@ -120,7 +121,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public String call(EchoArgs args, BasicBeanStore ctx) { 
return "hello"; }
+                       public String call(EchoArgs args, BeanStore ctx) { 
return "hello"; }
                };
                var config = new 
McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed));
                var resp = dispatcher.dispatch(new JsonRpcRequest()
@@ -138,7 +139,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public EchoResult call(EchoArgs args, BasicBeanStore 
ctx) { return null; }
+                       public EchoResult call(EchoArgs args, BeanStore ctx) { 
return null; }
                };
                var config = new 
McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed));
                var resp = dispatcher.dispatch(new JsonRpcRequest()
@@ -156,7 +157,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public String call(EchoArgs args, BasicBeanStore ctx) {
+                       public String call(EchoArgs args, BeanStore ctx) {
                                return args == null ? "null" : "not-null";
                        }
                };
@@ -176,7 +177,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public String call(EchoArgs args, BasicBeanStore ctx) { 
return "ok"; }
+                       public String call(EchoArgs args, BeanStore ctx) { 
return "ok"; }
                };
                var config = new 
McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed));
                // Bad: 'repeat' should be int, supply a non-numeric value to 
trigger parser failure.
@@ -195,7 +196,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public GetPromptResult get(EchoArgs args, 
BasicBeanStore ctx) {
+                       public GetPromptResult get(EchoArgs args, BeanStore 
ctx) {
                                return new 
GetPromptResult().setDescription(args == null ? "null" : "non-null");
                        }
                };
@@ -222,7 +223,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public String call(EchoArgs args, BasicBeanStore ctx) {
+                       public String call(EchoArgs args, BeanStore ctx) {
                                return args == null ? "null" : "not-null";
                        }
                };
@@ -239,7 +240,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public GetPromptResult get(EchoArgs args, 
BasicBeanStore ctx) {
+                       public GetPromptResult get(EchoArgs args, BeanStore 
ctx) {
                                return new 
GetPromptResult().setDescription(args == null ? "null" : "non-null");
                        }
                };
@@ -256,7 +257,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public Unserializable call(EchoArgs args, 
BasicBeanStore ctx) { return new Unserializable(); }
+                       public Unserializable call(EchoArgs args, BeanStore 
ctx) { return new Unserializable(); }
                };
                var config = new 
McpServerConfig().addTool(McpTypedHandlers.adaptTool(typed));
                var resp = dispatcher.dispatch(new JsonRpcRequest()
@@ -273,7 +274,7 @@ class McpTypedHandlers_Test {
                        @Override
                        public Class<EchoArgs> argumentType() { return 
EchoArgs.class; }
                        @Override
-                       public GetPromptResult get(EchoArgs args, 
BasicBeanStore ctx) {
+                       public GetPromptResult get(EchoArgs args, BeanStore 
ctx) {
                                return new 
GetPromptResult().setDescription(args == null ? "null" : args.getMessage());
                        }
                };
diff --git a/todo/TODO-15-replace-basicbeanstore-with-v2.md 
b/todo/TODO-15-replace-basicbeanstore-with-v2.md
index 0be96c545c..7242b21c70 100644
--- a/todo/TODO-15-replace-basicbeanstore-with-v2.md
+++ b/todo/TODO-15-replace-basicbeanstore-with-v2.md
@@ -60,13 +60,13 @@ Legacy `cp.BasicBeanStore` was made to `implements 
WritableBeanStore` as a trans
 
 Low-risk, independent of the rest of this plan. Can land in an earlier release 
than 9.5 if desired.
 
-- [ ] Annotate with `@Deprecated` and Javadoc pointing at 
`org.apache.juneau.commons.inject`:
-  - `org.apache.juneau.cp.BasicBeanStore`
-  - `org.apache.juneau.cp.BeanCreator`
-  - `org.apache.juneau.cp.BeanBuilder` *(consumer class 
`org.apache.juneau.BeanBuilder` — re-evaluate)*
-  - `org.apache.juneau.cp.BeanCreateMethodFinder`
-  - `org.apache.juneau.cp.ContextBeanCreator`
-- [ ] Do **not** use `forRemoval = true` yet — remaining internal consumers 
still wired to these. Deletion happens in Phase 4.
+- [x] **DONE (2026-05-08).** Annotated with `@Deprecated(since = "9.5.0")` and 
`@deprecated` Javadoc pointing at `org.apache.juneau.commons.inject`:
+  - `org.apache.juneau.cp.BasicBeanStore` → `BeanStore` / `WritableBeanStore` 
/ `BasicBeanStore2`
+  - `org.apache.juneau.cp.BeanCreator` → `BeanInstantiator`
+  - `org.apache.juneau.cp.BeanCreateMethodFinder` → 
`BeanStore.createBeanFromMethod(...)`
+  - `org.apache.juneau.cp.ContextBeanCreator` → migrate to `BeanInstantiator` 
once v2 grows context-builder hooks (still extended by `HttpPartParser.Creator` 
/ `HttpPartSerializer.Creator`)
+- [x] **`forRemoval = true` deliberately not set** — remaining internal 
consumers still wired to these. Deletion happens in Phase 4.
+- ~~`org.apache.juneau.BeanBuilder` (consumer class)~~ — **NOT deprecated.** 
Lives outside `cp` package; it's the user-facing builder superclass. Internals 
widened to `WritableBeanStore` (v2 interface) on 2026-05-08, so it stays as a 
permanent public API.
 
 ---
 
@@ -126,8 +126,8 @@ Net new v2 surface from this decision: none. The `Builder` 
class simply goes awa
 
 Remaining inventory work:
 - ~~Confirm the `BeanCreateMethodFinder` callers in `RestContext` (33) and 
`RestOpContext` (16) are all mechanical once the v2 finder API is settled.~~ — 
**DONE.** All 49 sites migrated.
-- [ ] Check `McpPage.java` / `McpTypedHandlers.java` / `McpEndpoint.java` / 
`McpRestServlet.java` in `rest-server-mcp` — currently compile against legacy 
via `(BasicBeanStore)` casts that bridge from `WritableBeanStore`-typed 
callers. Migrate alongside the cascade or in a follow-up.
-- [ ] Enumerate direct callers in `juneau-microservice-*` and `juneau-config` 
(not yet surveyed).
+- [x] **DONE (2026-05-08).** `rest-server-mcp` migrated to v2 `BeanStore`. 
Public handler interfaces (`McpToolHandler`, `McpPromptHandler`, 
`McpResourceHandler`, `McpTypedToolHandler`, `McpTypedPromptHandler`, 
`McpCursor`) now take `BeanStore ctx` instead of `BasicBeanStore ctx` (chosen 
over `WritableBeanStore` because handlers don't mutate). `Mcp.handle(...)`, 
`McpDispatcher.dispatch(...)` and 7 internal dispatcher methods, plus internal 
`McpTypedHandlers.adaptTool`/`adaptPrompt` flippe [...]
+- [x] **DONE (2026-05-08).** Enumerate direct callers in 
`juneau-microservice-*` and `juneau-config`. **Result: zero.** Neither 
`juneau-microservice-core` (28 source files), `juneau-microservice-jetty`, nor 
`juneau-core/juneau-config` (24 source files) reference `BasicBeanStore`, 
`BeanCreator`, `BeanCreateMethodFinder`, or `ContextBeanCreator`. Both modules 
are already free of legacy injection types — no Phase-3 migration work needed 
there.
 - [ ] List any public API surfaces in `juneau-marshall` that still expose 
`BasicBeanStore` / `BeanCreator` (these are the hard breaking changes). 
`Name.java` / `Named.java` Javadoc refs are trivial.
 - ~~**Cascade-builders inventory.**~~ — **DONE (2026-05-08).** 16 of the 
listed 25 factories flipped (those actually called from `RestContext` / 
`RestOpContext`): `RestConverterList`, `RestGuardList`, `RestMatcherList`, 
`RestOpArgList`, `ResponseProcessorList`, `RestOperations`, `RestChildren`, 
`MethodExecStore`, `ThrownStore`, `FileFinder`, `StaticFiles`, 
`BasicStaticFiles.create(...)`, `DebugEnablement`, `SwaggerProvider`, 
`EncoderSet`, `ParserSet`, `SerializerSet`. The remaining ~9 (` [...]
 

Reply via email to