Skip to content

Commit c2e80ad

Browse files
authored
Merge main into dev after beta.11 release (#46)
* Release 17.0.0-beta.9 (#37)
1 parent 4c7b772 commit c2e80ad

17 files changed

Lines changed: 141 additions & 81 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
},
77
"metadata": {
88
"description": "Claude Code plugins for the Umbraco MCP Toolkit - professional skills for building MCP servers, testing, and API integration",
9-
"version": "17.0.0-beta.9",
9+
"version": "17.0.0-beta.11",
1010
"homepage": "https://github.com/umbraco/Umbraco-MCP-Base"
1111
},
1212
"plugins": [
1313
{
1414
"name": "umbraco-mcp-skills",
1515
"source": "./plugins",
1616
"description": "Professional skills for building Umbraco MCP servers - tool creation, testing, API patterns, and eval testing",
17-
"version": "17.0.0-beta.9",
17+
"version": "17.0.0-beta.11",
1818
"category": "development",
1919
"author": {
2020
"name": "Phil W",
@@ -35,7 +35,7 @@
3535
"name": "umbraco-mcp-server",
3636
"source": "./plugins-server",
3737
"description": "Skills for CLI operation of Umbraco MCP servers - CLI setup, tool filtering, introspection, and runtime modes",
38-
"version": "17.0.0-beta.9",
38+
"version": "17.0.0-beta.11",
3939
"category": "operations",
4040
"author": {
4141
"name": "Phil W",

.github/workflows/test.yml

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -247,49 +247,51 @@ jobs:
247247
env:
248248
KEEP_E2E_ASSETS: 'true'
249249

250-
- name: Skill E2E (build tool + integration test)
251-
if: >-
252-
github.event.pull_request.base.ref == 'main' &&
253-
startsWith(github.event.pull_request.head.ref, 'release/')
254-
run: npm run test:e2e:skills -w packages/create-mcp-server
255-
timeout-minutes: 10
256-
env:
257-
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
258-
CLAUDECODE: ''
250+
# Temporarily disabled — API credit balance exhausted
251+
# - name: Skill E2E (build tool + integration test)
252+
# if: >-
253+
# github.event.pull_request.base.ref == 'main' &&
254+
# startsWith(github.event.pull_request.head.ref, 'release/')
255+
# run: npm run test:e2e:skills -w packages/create-mcp-server
256+
# timeout-minutes: 10
257+
# env:
258+
# ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
259+
# CLAUDECODE: ''
259260

260261
- name: Clean up E2E assets
261262
if: always()
262263
run: npm run test:e2e:cleanup -w packages/create-mcp-server || true
263264

264-
evals:
265-
name: LLM Eval Tests
266-
if: >-
267-
github.event.pull_request.base.ref == 'main' &&
268-
startsWith(github.event.pull_request.head.ref, 'release/')
269-
runs-on: ubuntu-latest
270-
271-
env:
272-
NODE_TLS_REJECT_UNAUTHORIZED: '0'
273-
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
274-
275-
steps:
276-
- name: Checkout
277-
uses: actions/checkout@v4
278-
279-
- name: Setup Node.js
280-
uses: actions/setup-node@v4
281-
with:
282-
node-version: '22'
283-
cache: 'npm'
284-
285-
- name: Install npm dependencies
286-
run: npm ci
287-
288-
- name: Build SDK
289-
run: npm run build
290-
291-
- name: Build template
292-
run: npm run build -w template
293-
294-
- name: Run CLI eval tests
295-
run: npm run test:cli:evals
265+
# Temporarily disabled — API credit balance exhausted
266+
# evals:
267+
# name: LLM Eval Tests
268+
# if: >-
269+
# github.event.pull_request.base.ref == 'main' &&
270+
# startsWith(github.event.pull_request.head.ref, 'release/')
271+
# runs-on: ubuntu-latest
272+
#
273+
# env:
274+
# NODE_TLS_REJECT_UNAUTHORIZED: '0'
275+
# ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
276+
#
277+
# steps:
278+
# - name: Checkout
279+
# uses: actions/checkout@v4
280+
#
281+
# - name: Setup Node.js
282+
# uses: actions/setup-node@v4
283+
# with:
284+
# node-version: '22'
285+
# cache: 'npm'
286+
#
287+
# - name: Install npm dependencies
288+
# run: npm ci
289+
#
290+
# - name: Build SDK
291+
# run: npm run build
292+
#
293+
# - name: Build template
294+
# run: npm run build -w template
295+
#
296+
# - name: Run CLI eval tests
297+
# run: npm run test:cli:evals

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "umbraco-mcp-server-sdk-monorepo",
3-
"version": "17.0.0-beta.9",
3+
"version": "17.0.0-beta.11",
44
"private": true,
55
"description": "Umbraco MCP Server SDK monorepo",
66
"workspaces": [

packages/create-mcp-server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@umbraco-cms/create-umbraco-mcp-server",
3-
"version": "17.0.0-beta.9",
3+
"version": "17.0.0-beta.11",
44
"type": "module",
55
"description": "Create a new Umbraco MCP server project",
66
"bin": {

packages/hosted-mcp/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@umbraco-cms/mcp-hosted",
3-
"version": "17.0.0-beta.9",
3+
"version": "17.0.0-beta.11",
44
"description": "Hosted MCP server infrastructure for Umbraco on Cloudflare Workers",
55
"type": "module",
66
"main": "dist/index.js",

packages/mcp-server-sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@umbraco-cms/mcp-server-sdk",
3-
"version": "17.0.0-beta.9",
3+
"version": "17.0.0-beta.11",
44
"type": "module",
55
"description": "Umbraco-specific MCP infrastructure and patterns for building MCP servers",
66
"main": "dist/index.js",

packages/mcp-server-sdk/src/helpers/__tests__/cursor-pagination.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,33 @@ describe("withCursorPagination", () => {
167167
});
168168

169169
describe("output schema transformation", () => {
170-
it("should add nextCursor to output schema", () => {
170+
it("should add nextCursor to output schema (raw shape)", () => {
171171
const tool = createMockTool();
172172
const result = withCursorPagination(tool);
173173

174174
expect(result.outputSchema).toHaveProperty("nextCursor");
175175
expect(result.outputSchema).toHaveProperty("total");
176176
expect(result.outputSchema).toHaveProperty("items");
177177
});
178+
179+
it("should add nextCursor to output schema (ZodObject)", () => {
180+
const tool = createMockTool({
181+
outputSchema: z.object({
182+
total: z.number(),
183+
items: z.array(z.object({ id: z.string() })),
184+
}),
185+
});
186+
const result = withCursorPagination(tool);
187+
188+
// Should be a ZodObject with nextCursor field
189+
expect(result.outputSchema).toBeDefined();
190+
const parsed = (result.outputSchema as z.ZodObject<any>).parse({
191+
total: 10,
192+
items: [],
193+
nextCursor: "abc",
194+
});
195+
expect(parsed).toHaveProperty("nextCursor", "abc");
196+
});
178197
});
179198

180199
describe("handler", () => {

packages/mcp-server-sdk/src/helpers/cursor-pagination.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { z, type ZodRawShape, type ZodType } from "zod";
1313
import type { ToolDefinition } from "../types/tool-definition.js";
1414
import { createToolResultError } from "./tool-result.js";
1515

16+
1617
// ============================================================================
1718
// Cursor State
1819
// ============================================================================
@@ -145,7 +146,7 @@ export function withCursorPagination<
145146
>(
146147
tool: ToolDefinition<InputArgs, OutputArgs>,
147148
options?: CursorPaginationOptions
148-
): ToolDefinition<any, any> {
149+
): ToolDefinition<ZodRawShape, OutputArgs> {
149150
// Detection: only apply if inputSchema has both skip and take
150151
if (
151152
!tool.inputSchema ||
@@ -176,18 +177,28 @@ export function withCursorPagination<
176177
};
177178

178179
// Build new output schema: add nextCursor
180+
const nextCursorSchema = z
181+
.string()
182+
.nullish()
183+
.describe(
184+
"Cursor for the next page. Pass as the cursor parameter to fetch more results. Absent when on the last page."
185+
);
186+
179187
let newOutputSchema = tool.outputSchema;
180-
if (tool.outputSchema && typeof tool.outputSchema === "object" && !("_def" in tool.outputSchema)) {
181-
// It's a ZodRawShape (object shape), add nextCursor field
182-
newOutputSchema = {
183-
...(tool.outputSchema as ZodRawShape),
184-
nextCursor: z
185-
.string()
186-
.nullish()
187-
.describe(
188-
"Cursor for the next page. Pass as the cursor parameter to fetch more results. Absent when on the last page."
189-
),
190-
} as any;
188+
if (tool.outputSchema && typeof tool.outputSchema === "object") {
189+
if ("_def" in tool.outputSchema) {
190+
// It's a ZodType (e.g. z.object({...})) — extend it
191+
const zodObj = tool.outputSchema as z.ZodObject<any>;
192+
if (typeof zodObj.extend === "function") {
193+
newOutputSchema = zodObj.extend({ nextCursor: nextCursorSchema }) as any;
194+
}
195+
} else {
196+
// It's a ZodRawShape (plain object), add nextCursor field
197+
newOutputSchema = {
198+
...(tool.outputSchema as ZodRawShape),
199+
nextCursor: nextCursorSchema,
200+
} as any;
201+
}
191202
}
192203

193204
return {

packages/mcp-server-sdk/src/helpers/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export {
9595
// Chained result extraction
9696
export { extractChainedResult } from "./chained-result.js";
9797

98+
9899
// Cursor-based pagination
99100
export {
100101
withCursorPagination,

0 commit comments

Comments
 (0)