@kywi-software/mcp 0.15.1 → 0.15.2
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/AGENT-PATTERNS.md
CHANGED
|
@@ -489,7 +489,10 @@ already answered.
|
|
|
489
489
|
When consent is required and no page places the module, the API logs a one-time
|
|
490
490
|
warning on its first request: nobody can grant consent, so every personalization
|
|
491
491
|
cookie stays suppressed and audiences, A/B bucketing and UTM attribution serve
|
|
492
|
-
default content to everyone.
|
|
492
|
+
default content to everyone. A host that mounts the banner itself in app chrome
|
|
493
|
+
instead of a page or blueprint layout (kywi-cms#193) is invisible to that scan,
|
|
494
|
+
so set `theme.personalization.consentBanner: 'host'` to declare the placement
|
|
495
|
+
and skip the check.
|
|
493
496
|
|
|
494
497
|
### Which do I reach for? (in order)
|
|
495
498
|
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { KywiSdkScope } from '@kywi-software/sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Execute a saved feed by slug, or run an ad-hoc query (kywi-cms#209).
|
|
5
|
+
*
|
|
6
|
+
* The slug path stays on `feeds.get()` — `GET /feeds/:slug`, which runs the
|
|
7
|
+
* feed's OWN stored query. "Execute this feed" has to mean the feed as
|
|
8
|
+
* configured: a feed deliberately set up to include drafts is a legitimate
|
|
9
|
+
* authoring tool, and quietly re-running it published-only would answer a
|
|
10
|
+
* different question than the one asked. The public, published-only read added
|
|
11
|
+
* alongside it (`GET /feeds/:slug/items`) is a separate capability for checking
|
|
12
|
+
* what a live site's readers actually see.
|
|
13
|
+
*
|
|
14
|
+
* Both paths can fail on the server — an unknown slug most obviously — and an
|
|
15
|
+
* agent needs the reason ("Feed not found") rather than a stack trace from
|
|
16
|
+
* inside its own tool loop.
|
|
17
|
+
*/
|
|
3
18
|
export declare function handleExecuteFeed(sdk: KywiSdkScope, args: {
|
|
4
19
|
slug?: string | undefined;
|
|
5
20
|
query?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../../src/site/tools/feeds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,oBAAoB,CAAA;AAKjE,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,GAAG,SAAS,CAAA;CACd;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../../src/site/tools/feeds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,oBAAoB,CAAA;AAKjE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,GAAG,SAAS,CAAA;CACd;;;;;;;;;;;;GAoBF;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAWjI;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAS3J;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;GAMtC;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAkD5E"}
|
package/dist/site/tools/feeds.js
CHANGED
|
@@ -1,27 +1,46 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { textResult, errorResult } from '../../shared.js';
|
|
3
3
|
// ─── Exported handler functions (testable without server) ───────────────────
|
|
4
|
+
/**
|
|
5
|
+
* Execute a saved feed by slug, or run an ad-hoc query (kywi-cms#209).
|
|
6
|
+
*
|
|
7
|
+
* The slug path stays on `feeds.get()` — `GET /feeds/:slug`, which runs the
|
|
8
|
+
* feed's OWN stored query. "Execute this feed" has to mean the feed as
|
|
9
|
+
* configured: a feed deliberately set up to include drafts is a legitimate
|
|
10
|
+
* authoring tool, and quietly re-running it published-only would answer a
|
|
11
|
+
* different question than the one asked. The public, published-only read added
|
|
12
|
+
* alongside it (`GET /feeds/:slug/items`) is a separate capability for checking
|
|
13
|
+
* what a live site's readers actually see.
|
|
14
|
+
*
|
|
15
|
+
* Both paths can fail on the server — an unknown slug most obviously — and an
|
|
16
|
+
* agent needs the reason ("Feed not found") rather than a stack trace from
|
|
17
|
+
* inside its own tool loop.
|
|
18
|
+
*/
|
|
4
19
|
export async function handleExecuteFeed(sdk, args) {
|
|
5
|
-
if (args.slug) {
|
|
6
|
-
|
|
7
|
-
return textResult(result);
|
|
20
|
+
if (!args.slug && !args.query) {
|
|
21
|
+
return errorResult('Either slug or query must be provided');
|
|
8
22
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
q.
|
|
17
|
-
if (
|
|
18
|
-
q.
|
|
19
|
-
if (
|
|
20
|
-
q.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
try {
|
|
24
|
+
if (args.slug) {
|
|
25
|
+
return textResult(await sdk.feeds.get(args.slug));
|
|
26
|
+
}
|
|
27
|
+
const source = args.query;
|
|
28
|
+
const q = { contentType: source.contentType };
|
|
29
|
+
if (source.search)
|
|
30
|
+
q.search = source.search;
|
|
31
|
+
if (source.status)
|
|
32
|
+
q.status = source.status;
|
|
33
|
+
if (source.sort)
|
|
34
|
+
q.sort = { field: source.sort, direction: 'asc' };
|
|
35
|
+
if (source.limit !== undefined)
|
|
36
|
+
q.limit = source.limit;
|
|
37
|
+
if (source.page !== undefined)
|
|
38
|
+
q.page = source.page;
|
|
39
|
+
return textResult(await sdk.feeds.query(q));
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return errorResult(`Failed to execute feed: ${err instanceof Error ? err.message : String(err)}`);
|
|
23
43
|
}
|
|
24
|
-
return errorResult('Either slug or query must be provided');
|
|
25
44
|
}
|
|
26
45
|
export async function handleCreateFeed(sdk, args) {
|
|
27
46
|
const feedQuery = args.query;
|
|
@@ -56,7 +75,10 @@ export async function handleListFeeds(sdk, args) {
|
|
|
56
75
|
// ─── Registration ───────────────────────────────────────────────────────────
|
|
57
76
|
export function registerFeedTools(server, sdk) {
|
|
58
77
|
server.registerTool('execute_feed', {
|
|
59
|
-
description: 'Execute a saved feed by slug or run an ad-hoc feed query'
|
|
78
|
+
description: 'Execute a saved feed by slug, or run an ad-hoc feed query. A saved feed runs as configured, '
|
|
79
|
+
+ 'including its own status filter and item limit. The result carries `items` alongside `total`, '
|
|
80
|
+
+ '`page`, `pageSize` and `hasMore` — while `hasMore` is true you have NOT seen every row the feed '
|
|
81
|
+
+ 'matches, only the page it is configured to return, and must request the next `page`.',
|
|
60
82
|
inputSchema: {
|
|
61
83
|
slug: z.string().optional().describe('Saved feed slug'),
|
|
62
84
|
query: z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../src/site/tools/feeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEzD,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAiB,EACjB,IAUC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../../../src/site/tools/feeds.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kywi-software/mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.2",
|
|
4
4
|
"description": "Model Context Protocol servers for Kywi CMS — a site server (content/nav/media over the REST API) and a developer server (kywi.config.ts scaffolding and mutation).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
49
49
|
"zod": "^3.25.0",
|
|
50
|
-
"@kywi-software/
|
|
51
|
-
"@kywi-software/
|
|
50
|
+
"@kywi-software/core": "0.15.2",
|
|
51
|
+
"@kywi-software/sdk": "0.15.2"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^20.0.0",
|