@homespunapps/mcp 1.6.67 → 1.6.69
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/dist/tools.js +42 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/server.json +2 -2
package/dist/tools.js
CHANGED
|
@@ -422,12 +422,15 @@ const appsShape = {
|
|
|
422
422
|
"update",
|
|
423
423
|
"share_link_rotate",
|
|
424
424
|
"delete",
|
|
425
|
+
"list_deleted",
|
|
426
|
+
"restore",
|
|
427
|
+
"purge",
|
|
425
428
|
"wake",
|
|
426
429
|
"domain_set",
|
|
427
430
|
"domain_status",
|
|
428
431
|
"domain_remove",
|
|
429
432
|
])
|
|
430
|
-
.describe("list: the caller's owning human's apps. show/update/delete/wake: act on one app (app_id). audit: read-only security review of every app the caller owns. share_link_rotate: rotate a 'link' app's share token, returning a new share_url (the old link stops working); also generates one if the app has none yet. domain_set/domain_status/domain_remove: manage the app's custom domains (app_id; domain_set also needs domain)."),
|
|
433
|
+
.describe("list: the caller's owning human's apps. show/update/delete/wake: act on one app (app_id). audit: read-only security review of every app the caller owns. share_link_rotate: rotate a 'link' app's share token, returning a new share_url (the old link stops working); also generates one if the app has none yet. list_deleted: the apps in the trash, each with when it is purged for good. restore: bring a deleted app back with all its data (app_id). purge: destroy a deleted app forever, now (app_id). domain_set/domain_status/domain_remove: manage the app's custom domains (app_id; domain_set also needs domain)."),
|
|
431
434
|
severity: z
|
|
432
435
|
.enum(["high", "medium", "low"])
|
|
433
436
|
.optional()
|
|
@@ -435,11 +438,11 @@ const appsShape = {
|
|
|
435
438
|
app_id: z
|
|
436
439
|
.string()
|
|
437
440
|
.optional()
|
|
438
|
-
.describe("Required for show/update/share_link_rotate/delete/wake/domain_set/domain_status/domain_remove."),
|
|
441
|
+
.describe("Required for show/update/share_link_rotate/delete/restore/purge/wake/domain_set/domain_status/domain_remove."),
|
|
439
442
|
status: z
|
|
440
|
-
.enum(["active", "dormant", "archived", "all"])
|
|
443
|
+
.enum(["active", "dormant", "archived", "suspended", "all"])
|
|
441
444
|
.optional()
|
|
442
|
-
.describe("list only. Default: active."),
|
|
445
|
+
.describe("list only. Default: active. 'all' means every live status; deleted apps are never in this list, use action list_deleted for those."),
|
|
443
446
|
limit: z
|
|
444
447
|
.number()
|
|
445
448
|
.int()
|
|
@@ -1342,14 +1345,17 @@ export const TOOLS = [
|
|
|
1342
1345
|
},
|
|
1343
1346
|
{
|
|
1344
1347
|
name: "apps",
|
|
1345
|
-
description: "The v2 app lifecycle apart from creation and redeploy, which deploy_app covers. Actions: list returns the owning human's apps; show returns full detail including manifest, timezone and has_share_token; audit is a read-only security review of every app the caller owns, computed from each app's stored manifest, which is what makes it see apps that were deployed once and never redeployed (a deploy-time warning never reaches those). It reports collections whose declared permissions expose them, worst first: severity 'high' means an anonymous visitor can exploit it today, typically a collection that admits \"anyone\" to write with no separate 'update' list, so any visitor can overwrite rows other people created rather than only adding their own. It changes nothing; the fix is a redeploy declaring the missing list, and the right list differs per app, so read the app before proposing one. update changes visibility and timezone, the slug being immutable, and switching to 'link' returns a share_url once; share_link_rotate issues a new share token for a 'link' app, returning a new share_url and revoking the old link, and generates one if the app has none; delete is an idempotent soft-delete; wake wakes a dormant app and is otherwise a no-op that reports the actual status; domain_set binds a custom domain and returns the DNS records the domain owner must publish, where the first domain bound serves the app and every later one redirects to it, which is how apex plus www is configured; domain_status returns the serving domain and its `aliases`, live-refreshed against Cloudflare when that is enabled, with last_error carrying the reason a domain is not activating; domain_remove unbinds one domain, or all of them when no `domain` is given, and is idempotent.",
|
|
1348
|
+
description: "The v2 app lifecycle apart from creation and redeploy, which deploy_app covers. Actions: list returns the owning human's apps; show returns full detail including manifest, timezone and has_share_token; audit is a read-only security review of every app the caller owns, computed from each app's stored manifest, which is what makes it see apps that were deployed once and never redeployed (a deploy-time warning never reaches those). It reports collections whose declared permissions expose them, worst first: severity 'high' means an anonymous visitor can exploit it today, typically a collection that admits \"anyone\" to write with no separate 'update' list, so any visitor can overwrite rows other people created rather than only adding their own. It changes nothing; the fix is a redeploy declaring the missing list, and the right list differs per app, so read the app before proposing one. update changes visibility and timezone, the slug being immutable, and switching to 'link' returns a share_url once; share_link_rotate issues a new share token for a 'link' app, returning a new share_url and revoking the old link, and generates one if the app has none; delete is an idempotent soft-delete, and it is recoverable: the app stops serving at once but keeps every version, collection, row, attachment, member and grant, and restore brings all of it back until the retention window elapses (list_deleted shows what is in the trash and each app's purges_at deadline, which is null when the account is never purged). restore is idempotent on a live app, and refuses with 409 when the account is at its app limit, when the app was an expired trial, or when the owning account is itself deleted; an app an operator suspended comes back suspended, not active. purge destroys a deleted app and all its data immediately and forever, with no restore afterwards, and requires the app to already be deleted, so no single call takes a serving app to unrecoverable; wake wakes a dormant app and is otherwise a no-op that reports the actual status; domain_set binds a custom domain and returns the DNS records the domain owner must publish, where the first domain bound serves the app and every later one redirects to it, which is how apex plus www is configured; domain_status returns the serving domain and its `aliases`, live-refreshed against Cloudflare when that is enabled, with last_error carrying the reason a domain is not activating; domain_remove unbinds one domain, or all of them when no `domain` is given, and is idempotent.",
|
|
1346
1349
|
inputSchema: appsShape,
|
|
1347
|
-
// Consolidated tool: read actions (list/show) + mutating ones
|
|
1348
|
-
// delete/wake). Hint reflects
|
|
1350
|
+
// Consolidated tool: read actions (list/show/list_deleted) + mutating ones
|
|
1351
|
+
// (update/delete/restore/purge/wake). Hint reflects purge, the most-
|
|
1352
|
+
// privileged action.
|
|
1349
1353
|
annotations: {
|
|
1350
1354
|
title: "Manage Apps",
|
|
1351
1355
|
readOnlyHint: false,
|
|
1352
|
-
// Destructive: `
|
|
1356
|
+
// Destructive: `purge` destroys an app and all its data irreversibly.
|
|
1357
|
+
// `delete` is only soft, but the hint is a per-TOOL boolean and has to
|
|
1358
|
+
// describe the worst action reachable through it.
|
|
1353
1359
|
destructiveHint: true,
|
|
1354
1360
|
// NOT idempotent: `share_link_rotate` issues a new share token and
|
|
1355
1361
|
// revokes the old link on every call, so a retried call invalidates a
|
|
@@ -1410,7 +1416,34 @@ export const TOOLS = [
|
|
|
1410
1416
|
return invalidArgs("delete requires `app_id`");
|
|
1411
1417
|
}
|
|
1412
1418
|
await client.deleteApp(String(args["app_id"]));
|
|
1413
|
-
|
|
1419
|
+
// `restorable` so a caller reading only this result knows the app
|
|
1420
|
+
// is recoverable, without having to have read the tool description.
|
|
1421
|
+
return jsonResult({
|
|
1422
|
+
app_id: args["app_id"],
|
|
1423
|
+
deleted: true,
|
|
1424
|
+
restorable: true,
|
|
1425
|
+
});
|
|
1426
|
+
case "list_deleted":
|
|
1427
|
+
return jsonResult(await client.listApps({
|
|
1428
|
+
status: "deleted",
|
|
1429
|
+
...(args["limit"] !== undefined
|
|
1430
|
+
? { limit: Number(args["limit"]) }
|
|
1431
|
+
: {}),
|
|
1432
|
+
...(str(args, "cursor") !== undefined
|
|
1433
|
+
? { cursor: String(args["cursor"]) }
|
|
1434
|
+
: {}),
|
|
1435
|
+
}));
|
|
1436
|
+
case "restore":
|
|
1437
|
+
if (str(args, "app_id") === undefined) {
|
|
1438
|
+
return invalidArgs("restore requires `app_id`");
|
|
1439
|
+
}
|
|
1440
|
+
return jsonResult(await client.restoreApp(String(args["app_id"])));
|
|
1441
|
+
case "purge":
|
|
1442
|
+
if (str(args, "app_id") === undefined) {
|
|
1443
|
+
return invalidArgs("purge requires `app_id`");
|
|
1444
|
+
}
|
|
1445
|
+
await client.purgeApp(String(args["app_id"]));
|
|
1446
|
+
return jsonResult({ app_id: args["app_id"], purged: true });
|
|
1414
1447
|
case "share_link_rotate":
|
|
1415
1448
|
if (str(args, "app_id") === undefined) {
|
|
1416
1449
|
return invalidArgs("share_link_rotate requires `app_id`");
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.6.
|
|
1
|
+
export declare const VERSION = "1.6.69";
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homespunapps/mcp",
|
|
3
3
|
"mcpName": "dev.homespun/homespun",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.69",
|
|
5
5
|
"description": "Model Context Protocol (stdio) server for Homespun: lets any MCP client (Claude Desktop, Cursor, …) deploy a multi-user web app with hosting, auth, a shared database and permissions included.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
49
|
-
"@homespunapps/core": "^1.6.
|
|
49
|
+
"@homespunapps/core": "^1.6.69",
|
|
50
50
|
"zod": "^4.4.3"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@types/node": "^26.
|
|
53
|
+
"@types/node": "^26.2.0",
|
|
54
54
|
"typescript": "^7.0.2",
|
|
55
|
-
"vitest": "^4.1.
|
|
55
|
+
"vitest": "^4.1.11"
|
|
56
56
|
},
|
|
57
57
|
"repository": {
|
|
58
58
|
"type": "git",
|
package/server.json
CHANGED
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
"name": "dev.homespun/homespun",
|
|
4
4
|
"title": "Homespun",
|
|
5
5
|
"description": "Deploy a multi-user web app from your agent: hosting, auth, database, and permissions.",
|
|
6
|
-
"version": "1.6.
|
|
6
|
+
"version": "1.6.69",
|
|
7
7
|
"websiteUrl": "https://homespun.dev",
|
|
8
8
|
"packages": [
|
|
9
9
|
{
|
|
10
10
|
"registryType": "npm",
|
|
11
11
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
12
12
|
"identifier": "@homespunapps/mcp",
|
|
13
|
-
"version": "1.6.
|
|
13
|
+
"version": "1.6.69",
|
|
14
14
|
"transport": {
|
|
15
15
|
"type": "stdio"
|
|
16
16
|
},
|