@react-webmcp-kit/redux 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 react-webmcp-kit contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,100 @@
1
- # Temporary Holding Version
1
+ # @react-webmcp-kit/redux
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **[WebMCP](https://developer.chrome.com/docs/ai/webmcp)** adapters for **Redux Toolkit** slice/thunk actions and **RTK Query** endpoints.
4
+
5
+ Requires [`@react-webmcp-kit/core`](https://www.npmjs.com/package/@react-webmcp-kit/core). Render inside Redux `<Provider>` and `McpProvider`.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @react-webmcp-kit/redux @react-webmcp-kit/core @reduxjs/toolkit react-redux use-webmcp-tool zod
11
+ ```
12
+
13
+ ## Slice / thunk tools
14
+
15
+ Hoist tool defs and Zod schemas at module scope.
16
+
17
+ ```tsx
18
+ 'use client';
19
+
20
+ import { z } from 'zod';
21
+ import { McpReduxTools } from '@react-webmcp-kit/redux';
22
+ import { cartSlice, selectCart } from './cartSlice';
23
+
24
+ const addToCartSchema = z.object({
25
+ productId: z.string(),
26
+ qty: z.number().int().min(1),
27
+ });
28
+
29
+ const cartTools = [
30
+ {
31
+ name: 'add_to_cart',
32
+ description: 'Add a line item to the cart',
33
+ schema: addToCartSchema,
34
+ execute: (args, { dispatch, getState, signal }) => {
35
+ if (signal.aborted) throw new Error('Aborted');
36
+ dispatch(cartSlice.actions.addItem(args));
37
+ return { success: true, cart: selectCart(getState()) };
38
+ },
39
+ },
40
+ ];
41
+
42
+ export function CartMcpTools() {
43
+ return <McpReduxTools tools={cartTools} />;
44
+ }
45
+ ```
46
+
47
+ `execute` receives `{ dispatch, getState, signal }`.
48
+
49
+ ## RTK Query tools
50
+
51
+ Bind `endpoint.initiate(args)`. For one-shot agent reads:
52
+
53
+ ```tsx
54
+ initiate: (args) =>
55
+ ordersApi.endpoints.getOrder.initiate(args, { subscribe: false, forceRefetch: true }),
56
+ ```
57
+
58
+ ```tsx
59
+ import { z } from 'zod';
60
+ import { McpRtkQueryTools } from '@react-webmcp-kit/redux';
61
+
62
+ <McpRtkQueryTools
63
+ tools={[
64
+ {
65
+ name: 'fetch_order',
66
+ description: 'Load order by id',
67
+ schema: z.object({ orderId: z.string() }),
68
+ kind: 'query',
69
+ initiate: (args) => ordersApi.endpoints.getOrder.initiate(args),
70
+ },
71
+ {
72
+ name: 'update_order',
73
+ description: 'Patch an order',
74
+ schema: patchOrderSchema,
75
+ kind: 'mutation',
76
+ initiate: (args) => ordersApi.endpoints.updateOrder.initiate(args),
77
+ },
78
+ ]}
79
+ />
80
+ ```
81
+
82
+ - `kind: 'query'` → `readOnlyHint: true`
83
+ - `kind: 'mutation'` → `consequentialHint: true`
84
+ - Results normalized with `formatRtkQueryResult` → `{ success, data }` / `{ success: false, error }`
85
+
86
+ ## API
87
+
88
+ | Export | Purpose |
89
+ |--------|---------|
90
+ | `McpReduxTools` | Dispatch-based tools |
91
+ | `McpRtkQueryTools` | RTK Query `initiate` tools |
92
+ | `formatRtkQueryResult` | Normalize RTK results for agents |
93
+
94
+ ## Demo
95
+
96
+ See `apps/demo-concierge` in [webmcp-kit-react](https://github.com/stubbies/webmcp-kit-react).
97
+
98
+ ## License
99
+
100
+ MIT
@@ -0,0 +1,67 @@
1
+ import * as react from 'react';
2
+ import { Dispatch, UnknownAction } from '@reduxjs/toolkit';
3
+ import { z } from 'zod';
4
+
5
+ type ToolAnnotations = {
6
+ readOnlyHint?: boolean;
7
+ untrustedContentHint?: boolean;
8
+ consequentialHint?: boolean;
9
+ };
10
+ type ReduxToolContext<RootState = unknown, AppDispatch extends Dispatch = Dispatch> = {
11
+ dispatch: AppDispatch;
12
+ getState: () => RootState;
13
+ signal: AbortSignal;
14
+ };
15
+ type McpReduxToolDef<TArgs = unknown, TResult = unknown, RootState = unknown, AppDispatch extends Dispatch = Dispatch> = {
16
+ name: string;
17
+ description: string;
18
+ schema: z.ZodType<TArgs>;
19
+ execute: (args: TArgs, ctx: ReduxToolContext<RootState, AppDispatch>) => TResult | Promise<TResult>;
20
+ enabled?: boolean;
21
+ annotations?: ToolAnnotations;
22
+ };
23
+ type McpRtkQueryToolDef<TArgs = unknown> = {
24
+ name: string;
25
+ description: string;
26
+ schema: z.ZodType<TArgs>;
27
+ kind: 'query' | 'mutation';
28
+ /** Returns the RTK Query initiate thunk/action for the given args. */
29
+ initiate: (args: TArgs) => UnknownAction;
30
+ enabled?: boolean;
31
+ annotations?: ToolAnnotations;
32
+ };
33
+
34
+ /** Minimal shape returned from `dispatch(api.endpoints.x.initiate(...))`. */
35
+ type RtkQueryDispatchResult = {
36
+ data?: unknown;
37
+ error?: unknown;
38
+ isSuccess?: boolean;
39
+ isError?: boolean;
40
+ };
41
+ type FormattedRtkSuccess = {
42
+ success: true;
43
+ data: unknown;
44
+ };
45
+ type FormattedRtkFailure = {
46
+ success: false;
47
+ error: {
48
+ status?: number | string;
49
+ message: string;
50
+ data?: unknown;
51
+ };
52
+ };
53
+ type FormattedRtkQueryResult = FormattedRtkSuccess | FormattedRtkFailure;
54
+ declare function formatRtkQueryResult(result: RtkQueryDispatchResult): FormattedRtkQueryResult;
55
+
56
+ type McpReduxToolsProps<RootState = unknown, AppDispatch extends Dispatch = Dispatch> = {
57
+ tools: McpReduxToolDef<any, any, RootState, AppDispatch>[];
58
+ };
59
+ /** Register WebMCP tools that dispatch Redux actions (render inside McpProvider + Provider). */
60
+ declare function McpReduxTools<RootState = unknown, AppDispatch extends Dispatch = Dispatch>({ tools, }: McpReduxToolsProps<RootState, AppDispatch>): react.JSX.Element;
61
+ type McpRtkQueryToolsProps = {
62
+ tools: McpRtkQueryToolDef<any>[];
63
+ };
64
+ /** Register WebMCP tools bound to RTK Query `endpoint.initiate()` (render inside McpProvider + Provider). */
65
+ declare function McpRtkQueryTools({ tools }: McpRtkQueryToolsProps): react.JSX.Element;
66
+
67
+ export { type FormattedRtkFailure, type FormattedRtkQueryResult, type FormattedRtkSuccess, type McpReduxToolDef, McpReduxTools, type McpReduxToolsProps, type McpRtkQueryToolDef, McpRtkQueryTools, type McpRtkQueryToolsProps, type ReduxToolContext, type RtkQueryDispatchResult, type ToolAnnotations, formatRtkQueryResult };
package/dist/index.js ADDED
@@ -0,0 +1,105 @@
1
+ 'use client';
2
+
3
+ // src/index.tsx
4
+ import { useMcpTool } from "@react-webmcp-kit/core";
5
+ import { useDispatch, useStore } from "react-redux";
6
+
7
+ // src/formatRtkQueryResult.ts
8
+ function serializeRtkError(error) {
9
+ if (error == null) {
10
+ return { message: "Unknown RTK Query error" };
11
+ }
12
+ if (typeof error === "string") {
13
+ return { message: error };
14
+ }
15
+ if (typeof error === "object") {
16
+ const err = error;
17
+ const status = err.status;
18
+ const data = err.data;
19
+ const message = typeof err.error === "string" ? err.error : typeof err.message === "string" ? err.message : status !== void 0 ? `Request failed (${String(status)})` : "Request failed";
20
+ return { status, message, data };
21
+ }
22
+ return { message: String(error) };
23
+ }
24
+ function formatRtkQueryResult(result) {
25
+ if (result.error !== void 0 && result.error !== null) {
26
+ return { success: false, error: serializeRtkError(result.error) };
27
+ }
28
+ if (result.data !== void 0) {
29
+ return { success: true, data: result.data };
30
+ }
31
+ if (result.isError) {
32
+ return { success: false, error: serializeRtkError(result.error) };
33
+ }
34
+ return { success: true, data: null };
35
+ }
36
+
37
+ // src/index.tsx
38
+ import { Fragment, jsx } from "react/jsx-runtime";
39
+ function McpReduxToolRegistrar({
40
+ def,
41
+ dispatch,
42
+ getState
43
+ }) {
44
+ useMcpTool({
45
+ name: def.name,
46
+ description: def.description,
47
+ schema: def.schema,
48
+ enabled: def.enabled ?? true,
49
+ annotations: def.annotations,
50
+ execute: (args, { signal }) => {
51
+ const ctx = { dispatch, getState, signal };
52
+ return def.execute(args, ctx);
53
+ }
54
+ });
55
+ return null;
56
+ }
57
+ function McpReduxTools({
58
+ tools
59
+ }) {
60
+ const dispatch = useDispatch();
61
+ const store = useStore();
62
+ const getState = store.getState.bind(store);
63
+ return /* @__PURE__ */ jsx(Fragment, { children: tools.map((def) => /* @__PURE__ */ jsx(
64
+ McpReduxToolRegistrar,
65
+ {
66
+ def,
67
+ dispatch,
68
+ getState
69
+ },
70
+ def.name
71
+ )) });
72
+ }
73
+ function rtkAnnotations(kind, extra) {
74
+ const base = kind === "query" ? { readOnlyHint: true } : { consequentialHint: true };
75
+ return { ...base, ...extra };
76
+ }
77
+ function McpRtkQueryToolRegistrar({
78
+ def,
79
+ dispatch
80
+ }) {
81
+ useMcpTool({
82
+ name: def.name,
83
+ description: def.description,
84
+ schema: def.schema,
85
+ enabled: def.enabled ?? true,
86
+ annotations: rtkAnnotations(def.kind, def.annotations),
87
+ execute: async (args, { signal }) => {
88
+ if (signal.aborted) throw new Error("Aborted");
89
+ const action = def.initiate(args);
90
+ const result = await dispatch(action);
91
+ return formatRtkQueryResult(result);
92
+ }
93
+ });
94
+ return null;
95
+ }
96
+ function McpRtkQueryTools({ tools }) {
97
+ const dispatch = useDispatch();
98
+ return /* @__PURE__ */ jsx(Fragment, { children: tools.map((def) => /* @__PURE__ */ jsx(McpRtkQueryToolRegistrar, { def, dispatch }, def.name)) });
99
+ }
100
+ export {
101
+ McpReduxTools,
102
+ McpRtkQueryTools,
103
+ formatRtkQueryResult
104
+ };
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/formatRtkQueryResult.ts"],"sourcesContent":["import type { Dispatch } from '@reduxjs/toolkit';\nimport { useMcpTool } from '@react-webmcp-kit/core';\nimport { useDispatch, useStore } from 'react-redux';\nimport { formatRtkQueryResult } from './formatRtkQueryResult';\nimport type { McpReduxToolDef, McpRtkQueryToolDef, ReduxToolContext } from './types';\n\nexport { formatRtkQueryResult } from './formatRtkQueryResult';\nexport type {\n FormattedRtkQueryResult,\n FormattedRtkFailure,\n FormattedRtkSuccess,\n RtkQueryDispatchResult,\n} from './formatRtkQueryResult';\nexport type {\n McpReduxToolDef,\n McpRtkQueryToolDef,\n ReduxToolContext,\n ToolAnnotations,\n} from './types';\n\nfunction McpReduxToolRegistrar<\n TArgs,\n TResult,\n RootState,\n AppDispatch extends Dispatch,\n>({\n def,\n dispatch,\n getState,\n}: {\n def: McpReduxToolDef<TArgs, TResult, RootState, AppDispatch>;\n dispatch: AppDispatch;\n getState: () => RootState;\n}) {\n useMcpTool({\n name: def.name,\n description: def.description,\n schema: def.schema,\n enabled: def.enabled ?? true,\n annotations: def.annotations,\n execute: (args: TArgs, { signal }) => {\n const ctx: ReduxToolContext<RootState, AppDispatch> = { dispatch, getState, signal };\n return def.execute(args, ctx);\n },\n });\n return null;\n}\n\nexport type McpReduxToolsProps<\n RootState = unknown,\n AppDispatch extends Dispatch = Dispatch,\n> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tools: McpReduxToolDef<any, any, RootState, AppDispatch>[];\n};\n\n/** Register WebMCP tools that dispatch Redux actions (render inside McpProvider + Provider). */\nexport function McpReduxTools<RootState = unknown, AppDispatch extends Dispatch = Dispatch>({\n tools,\n}: McpReduxToolsProps<RootState, AppDispatch>) {\n const dispatch = useDispatch<AppDispatch>();\n const store = useStore<RootState>();\n const getState = store.getState.bind(store);\n\n return (\n <>\n {tools.map((def) => (\n <McpReduxToolRegistrar\n key={def.name}\n def={def}\n dispatch={dispatch}\n getState={getState}\n />\n ))}\n </>\n );\n}\n\nfunction rtkAnnotations(kind: 'query' | 'mutation', extra?: McpRtkQueryToolDef['annotations']) {\n const base =\n kind === 'query'\n ? { readOnlyHint: true as const }\n : { consequentialHint: true as const };\n return { ...base, ...extra };\n}\n\nfunction McpRtkQueryToolRegistrar<TArgs>({\n def,\n dispatch,\n}: {\n def: McpRtkQueryToolDef<TArgs>;\n dispatch: Dispatch;\n}) {\n useMcpTool({\n name: def.name,\n description: def.description,\n schema: def.schema,\n enabled: def.enabled ?? true,\n annotations: rtkAnnotations(def.kind, def.annotations),\n execute: async (args: TArgs, { signal }) => {\n if (signal.aborted) throw new Error('Aborted');\n const action = def.initiate(args);\n const result = await dispatch(action as Parameters<typeof dispatch>[0]);\n return formatRtkQueryResult(result as { data?: unknown; error?: unknown; isError?: boolean });\n },\n });\n return null;\n}\n\nexport type McpRtkQueryToolsProps = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tools: McpRtkQueryToolDef<any>[];\n};\n\n/** Register WebMCP tools bound to RTK Query `endpoint.initiate()` (render inside McpProvider + Provider). */\nexport function McpRtkQueryTools({ tools }: McpRtkQueryToolsProps) {\n const dispatch = useDispatch();\n\n return (\n <>\n {tools.map((def) => (\n <McpRtkQueryToolRegistrar key={def.name} def={def} dispatch={dispatch} />\n ))}\n </>\n );\n}\n","/** Minimal shape returned from `dispatch(api.endpoints.x.initiate(...))`. */\nexport type RtkQueryDispatchResult = {\n data?: unknown;\n error?: unknown;\n isSuccess?: boolean;\n isError?: boolean;\n};\n\nexport type FormattedRtkSuccess = { success: true; data: unknown };\nexport type FormattedRtkFailure = {\n success: false;\n error: { status?: number | string; message: string; data?: unknown };\n};\nexport type FormattedRtkQueryResult = FormattedRtkSuccess | FormattedRtkFailure;\n\nfunction serializeRtkError(error: unknown): FormattedRtkFailure['error'] {\n if (error == null) {\n return { message: 'Unknown RTK Query error' };\n }\n if (typeof error === 'string') {\n return { message: error };\n }\n if (typeof error === 'object') {\n const err = error as Record<string, unknown>;\n const status = err.status as number | string | undefined;\n const data = err.data;\n const message =\n typeof err.error === 'string'\n ? err.error\n : typeof err.message === 'string'\n ? err.message\n : status !== undefined\n ? `Request failed (${String(status)})`\n : 'Request failed';\n return { status, message, data };\n }\n return { message: String(error) };\n}\n\nexport function formatRtkQueryResult(result: RtkQueryDispatchResult): FormattedRtkQueryResult {\n if (result.error !== undefined && result.error !== null) {\n return { success: false, error: serializeRtkError(result.error) };\n }\n if (result.data !== undefined) {\n return { success: true, data: result.data };\n }\n if (result.isError) {\n return { success: false, error: serializeRtkError(result.error) };\n }\n return { success: true, data: null };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,67 @@
1
1
  {
2
2
  "name": "@react-webmcp-kit/redux",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Redux Toolkit and RTK Query adapters that expose actions and endpoints as WebMCP tools",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/stubbies/webmcp-kit-react.git",
11
+ "directory": "packages/redux"
12
+ },
13
+ "homepage": "https://github.com/stubbies/webmcp-kit-react/tree/main/packages/redux#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/stubbies/webmcp-kit-react/issues"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "LICENSE",
29
+ "README.md"
30
+ ],
31
+ "peerDependencies": {
32
+ "@reduxjs/toolkit": ">=2",
33
+ "@react-webmcp-kit/core": "^0.1.0",
34
+ "react": ">=18",
35
+ "react-redux": ">=8",
36
+ "zod": ">=3"
37
+ },
38
+ "devDependencies": {
39
+ "@reduxjs/toolkit": "^2.5.0",
40
+ "@testing-library/react": "^16.3.0",
41
+ "@types/react": "^19.0.0",
42
+ "jsdom": "^26.0.0",
43
+ "react": "^19.0.0",
44
+ "react-dom": "^19.0.0",
45
+ "react-redux": "^9.2.0",
46
+ "tsup": "^8.3.5",
47
+ "typescript": "^5.7.2",
48
+ "use-webmcp-tool": "^0.3.0",
49
+ "vitest": "^3.0.0",
50
+ "zod": "^3.24.1",
51
+ "@react-webmcp-kit/core": "0.1.0"
52
+ },
53
+ "keywords": [
54
+ "webmcp",
55
+ "mcp",
56
+ "react",
57
+ "redux",
58
+ "rtk-query",
59
+ "ai-agents"
60
+ ],
61
+ "scripts": {
62
+ "build": "tsup",
63
+ "test": "vitest run",
64
+ "typecheck": "tsc --noEmit",
65
+ "lint": "tsc --noEmit"
66
+ }
6
67
  }