@kivimedia/kmhub 2.9.1 → 2.11.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/README.md +170 -170
- package/bin/kmhub.mjs +896 -896
- package/coach-book-output-guard.mjs +760 -760
- package/index.mjs +57 -57
- package/package.json +56 -56
- package/prompts/briefing.md +29 -29
- package/prompts/luxury.md +70 -70
- package/prompts/play.md +49 -49
- package/prompts/run.md +37 -36
- package/prompts/setup.md +33 -33
- package/prompts/vs-booked.md +46 -46
- package/prompts/what-can-you-do.md +40 -40
- package/prompts.mjs +110 -110
- package/read-only-tools.json +143 -142
- package/remote.mjs +929 -929
- package/tools/balloon-costing.mjs +80 -80
- package/tools/booking-equipment.mjs +110 -110
- package/tools/bridges.mjs +54 -54
- package/tools/briefing.mjs +91 -91
- package/tools/calendar.mjs +170 -170
- package/tools/capabilities.mjs +155 -155
- package/tools/catalog.mjs +288 -288
- package/tools/clubs.mjs +176 -176
- package/tools/coach.mjs +771 -771
- package/tools/compare.mjs +76 -76
- package/tools/core.mjs +244 -244
- package/tools/crm.mjs +209 -209
- package/tools/dubsado.mjs +137 -137
- package/tools/exports.mjs +128 -128
- package/tools/fact-review.mjs +125 -125
- package/tools/flows.mjs +261 -261
- package/tools/forms.mjs +158 -158
- package/tools/gols.mjs +144 -134
- package/tools/hr.mjs +162 -162
- package/tools/knowledge.mjs +129 -125
- package/tools/marketing.mjs +396 -396
- package/tools/meta.mjs +245 -245
- package/tools/military.mjs +244 -244
- package/tools/money.mjs +235 -197
- package/tools/outreach.mjs +238 -238
- package/tools/pending.mjs +122 -122
- package/tools/photos.mjs +140 -140
- package/tools/plays.mjs +244 -244
- package/tools/profile.mjs +118 -118
- package/tools/radar.mjs +173 -173
- package/tools/recurring-invoices.mjs +149 -149
- package/tools/reengage.mjs +434 -434
- package/tools/schedules.mjs +55 -55
- package/tools/setup.mjs +168 -168
- package/tools/sops-bridges.mjs +86 -86
- package/tools/sops.mjs +314 -314
- package/tools/sourcing.mjs +268 -268
- package/tools/strategy.mjs +146 -146
- package/tools/studio.mjs +132 -132
- package/tools/venueradar.mjs +151 -151
- package/tools/voice.mjs +137 -134
- package/tools.mjs +407 -407
package/index.mjs
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* kmhub-mcp (C9) - a standalone LOCAL (stdio) MCP server that wraps the KM Hub public
|
|
4
|
-
* REST API (the kmhub-api edge function) as MCP tools. Any MCP client (Claude Desktop,
|
|
5
|
-
* Claude Code, IDEs) can then read your queue and create leads, authenticated with a
|
|
6
|
-
* single KM Hub API key from the environment.
|
|
7
|
-
*
|
|
8
|
-
* For the multi-tenant, zero-local-install variant (one VPS process serving many orgs
|
|
9
|
-
* over Streamable HTTP, each request scoped by its own Bearer token), see remote.mjs.
|
|
10
|
-
*
|
|
11
|
-
* Setup:
|
|
12
|
-
* 1. In KM Hub: Settings > Developer & API > create an API key (kmh_live_...).
|
|
13
|
-
* 2. npm install (in this folder).
|
|
14
|
-
* 3. Add to your MCP client config with env KMHUB_API_KEY=kmh_live_...
|
|
15
|
-
*
|
|
16
|
-
* Env:
|
|
17
|
-
* KMHUB_API_KEY required, the org's key
|
|
18
|
-
* KMHUB_API_BASE override the kmhub-api base URL
|
|
19
|
-
* KMHUB_PROFILE which tool families to load: core, outreach, money, content, full.
|
|
20
|
-
* Default full (everything). A narrower profile means fewer tool
|
|
21
|
-
* schemas in every turn, which is real context back for the model.
|
|
22
|
-
*
|
|
23
|
-
* One org-scoped auth substrate: the same key + routes the Telegram bot / Zapier use.
|
|
24
|
-
*/
|
|
25
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
26
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
27
|
-
import { registerPrompts } from './prompts.mjs';
|
|
28
|
-
import {
|
|
29
|
-
DEFAULT_BASE,
|
|
30
|
-
SERVER_NAME,
|
|
31
|
-
SERVER_VERSION,
|
|
32
|
-
makeCaller,
|
|
33
|
-
registerTools,
|
|
34
|
-
resolveProfile,
|
|
35
|
-
} from './tools.mjs';
|
|
36
|
-
|
|
37
|
-
const BASE = DEFAULT_BASE;
|
|
38
|
-
const KEY = process.env.KMHUB_API_KEY;
|
|
39
|
-
if (!KEY) {
|
|
40
|
-
console.error('kmhub-mcp: set KMHUB_API_KEY (create one in KM Hub > Settings > Developer & API).');
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// An unknown KMHUB_PROFILE falls back to full rather than failing to start: a typo in
|
|
45
|
-
// a config file should never cost someone their whole toolset.
|
|
46
|
-
const PROFILE = resolveProfile(process.env.KMHUB_PROFILE);
|
|
47
|
-
|
|
48
|
-
const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
|
|
49
|
-
const { families, tools } = registerTools(server, makeCaller(BASE, KEY), { profile: PROFILE });
|
|
50
|
-
const prompts = registerPrompts(server);
|
|
51
|
-
|
|
52
|
-
const transport = new StdioServerTransport();
|
|
53
|
-
await server.connect(transport);
|
|
54
|
-
console.error(
|
|
55
|
-
`kmhub-mcp ${SERVER_VERSION}: connected (stdio), profile '${PROFILE}' ` +
|
|
56
|
-
`(families: ${families.join(', ')}). Tools: ${tools.join(', ')}.`,
|
|
57
|
-
);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* kmhub-mcp (C9) - a standalone LOCAL (stdio) MCP server that wraps the KM Hub public
|
|
4
|
+
* REST API (the kmhub-api edge function) as MCP tools. Any MCP client (Claude Desktop,
|
|
5
|
+
* Claude Code, IDEs) can then read your queue and create leads, authenticated with a
|
|
6
|
+
* single KM Hub API key from the environment.
|
|
7
|
+
*
|
|
8
|
+
* For the multi-tenant, zero-local-install variant (one VPS process serving many orgs
|
|
9
|
+
* over Streamable HTTP, each request scoped by its own Bearer token), see remote.mjs.
|
|
10
|
+
*
|
|
11
|
+
* Setup:
|
|
12
|
+
* 1. In KM Hub: Settings > Developer & API > create an API key (kmh_live_...).
|
|
13
|
+
* 2. npm install (in this folder).
|
|
14
|
+
* 3. Add to your MCP client config with env KMHUB_API_KEY=kmh_live_...
|
|
15
|
+
*
|
|
16
|
+
* Env:
|
|
17
|
+
* KMHUB_API_KEY required, the org's key
|
|
18
|
+
* KMHUB_API_BASE override the kmhub-api base URL
|
|
19
|
+
* KMHUB_PROFILE which tool families to load: core, outreach, money, content, full.
|
|
20
|
+
* Default full (everything). A narrower profile means fewer tool
|
|
21
|
+
* schemas in every turn, which is real context back for the model.
|
|
22
|
+
*
|
|
23
|
+
* One org-scoped auth substrate: the same key + routes the Telegram bot / Zapier use.
|
|
24
|
+
*/
|
|
25
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
26
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
27
|
+
import { registerPrompts } from './prompts.mjs';
|
|
28
|
+
import {
|
|
29
|
+
DEFAULT_BASE,
|
|
30
|
+
SERVER_NAME,
|
|
31
|
+
SERVER_VERSION,
|
|
32
|
+
makeCaller,
|
|
33
|
+
registerTools,
|
|
34
|
+
resolveProfile,
|
|
35
|
+
} from './tools.mjs';
|
|
36
|
+
|
|
37
|
+
const BASE = DEFAULT_BASE;
|
|
38
|
+
const KEY = process.env.KMHUB_API_KEY;
|
|
39
|
+
if (!KEY) {
|
|
40
|
+
console.error('kmhub-mcp: set KMHUB_API_KEY (create one in KM Hub > Settings > Developer & API).');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// An unknown KMHUB_PROFILE falls back to full rather than failing to start: a typo in
|
|
45
|
+
// a config file should never cost someone their whole toolset.
|
|
46
|
+
const PROFILE = resolveProfile(process.env.KMHUB_PROFILE);
|
|
47
|
+
|
|
48
|
+
const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
|
|
49
|
+
const { families, tools } = registerTools(server, makeCaller(BASE, KEY), { profile: PROFILE });
|
|
50
|
+
const prompts = registerPrompts(server);
|
|
51
|
+
|
|
52
|
+
const transport = new StdioServerTransport();
|
|
53
|
+
await server.connect(transport);
|
|
54
|
+
console.error(
|
|
55
|
+
`kmhub-mcp ${SERVER_VERSION}: connected (stdio), profile '${PROFILE}' ` +
|
|
56
|
+
`(families: ${families.join(', ')}). Tools: ${tools.join(', ')}.`,
|
|
57
|
+
);
|
package/package.json
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@kivimedia/kmhub",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "KM Hub Terminal Mode. Installs the KM Hub MCP connector into your own Claude Code on your own machine, and ships the kmhub CLI that registers, updates and diagnoses it.",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"kmhub",
|
|
7
|
-
"kivimedia",
|
|
8
|
-
"mcp",
|
|
9
|
-
"model-context-protocol",
|
|
10
|
-
"claude-code",
|
|
11
|
-
"terminal-mode",
|
|
12
|
-
"crm"
|
|
13
|
-
],
|
|
14
|
-
"homepage": "https://hub.kivimedia.co",
|
|
15
|
-
"license": "UNLICENSED",
|
|
16
|
-
"author": "Kivi Media (https://hub.kivimedia.co)",
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/kivimedia/kmhub.git",
|
|
20
|
-
"directory": "mcp-server"
|
|
21
|
-
},
|
|
22
|
-
"type": "module",
|
|
23
|
-
"engines": {
|
|
24
|
-
"node": ">=18.17"
|
|
25
|
-
},
|
|
26
|
-
"publishConfig": {
|
|
27
|
-
"access": "public"
|
|
28
|
-
},
|
|
29
|
-
"bin": {
|
|
30
|
-
"kmhub": "bin/kmhub.mjs",
|
|
31
|
-
"kmhub-mcp": "index.mjs",
|
|
32
|
-
"kmhub-mcp-remote": "remote.mjs"
|
|
33
|
-
},
|
|
34
|
-
"files": [
|
|
35
|
-
"bin/kmhub.mjs",
|
|
36
|
-
"index.mjs",
|
|
37
|
-
"remote.mjs",
|
|
38
|
-
"tools.mjs",
|
|
39
|
-
"coach-book-output-guard.mjs",
|
|
40
|
-
"tools/*.mjs",
|
|
41
|
-
"prompts.mjs",
|
|
42
|
-
"prompts/*.md",
|
|
43
|
-
"read-only-tools.json"
|
|
44
|
-
],
|
|
45
|
-
"scripts": {
|
|
46
|
-
"start": "node index.mjs",
|
|
47
|
-
"start:remote": "node remote.mjs",
|
|
48
|
-
"check:version": "node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json','utf8'));const t=fs.readFileSync('tools.mjs','utf8');const m=t.match(/SERVER_VERSION\\s*=\\s*'([^']+)'/);if(!m){console.error('kmhub: could not find SERVER_VERSION in tools.mjs, so the two identities cannot be compared.');process.exit(1)}if(m[1]!==p.version){console.error('kmhub: version mismatch. package.json is '+p.version+' and tools.mjs SERVER_VERSION is '+m[1]+'. Make them the same string in one commit, then publish.');process.exit(1)}console.log('kmhub: version check ok, both say '+p.version)\"",
|
|
49
|
-
"prepublishOnly": "npm run check:version"
|
|
50
|
-
},
|
|
51
|
-
"dependencies": {
|
|
52
|
-
"@hono/node-server": "1.19.15",
|
|
53
|
-
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
54
|
-
"zod": "^3.23.8"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@kivimedia/kmhub",
|
|
3
|
+
"version": "2.11.0",
|
|
4
|
+
"description": "KM Hub Terminal Mode. Installs the KM Hub MCP connector into your own Claude Code on your own machine, and ships the kmhub CLI that registers, updates and diagnoses it.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"kmhub",
|
|
7
|
+
"kivimedia",
|
|
8
|
+
"mcp",
|
|
9
|
+
"model-context-protocol",
|
|
10
|
+
"claude-code",
|
|
11
|
+
"terminal-mode",
|
|
12
|
+
"crm"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://hub.kivimedia.co",
|
|
15
|
+
"license": "UNLICENSED",
|
|
16
|
+
"author": "Kivi Media (https://hub.kivimedia.co)",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/kivimedia/kmhub.git",
|
|
20
|
+
"directory": "mcp-server"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18.17"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"kmhub": "bin/kmhub.mjs",
|
|
31
|
+
"kmhub-mcp": "index.mjs",
|
|
32
|
+
"kmhub-mcp-remote": "remote.mjs"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"bin/kmhub.mjs",
|
|
36
|
+
"index.mjs",
|
|
37
|
+
"remote.mjs",
|
|
38
|
+
"tools.mjs",
|
|
39
|
+
"coach-book-output-guard.mjs",
|
|
40
|
+
"tools/*.mjs",
|
|
41
|
+
"prompts.mjs",
|
|
42
|
+
"prompts/*.md",
|
|
43
|
+
"read-only-tools.json"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"start": "node index.mjs",
|
|
47
|
+
"start:remote": "node remote.mjs",
|
|
48
|
+
"check:version": "node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json','utf8'));const t=fs.readFileSync('tools.mjs','utf8');const m=t.match(/SERVER_VERSION\\s*=\\s*'([^']+)'/);if(!m){console.error('kmhub: could not find SERVER_VERSION in tools.mjs, so the two identities cannot be compared.');process.exit(1)}if(m[1]!==p.version){console.error('kmhub: version mismatch. package.json is '+p.version+' and tools.mjs SERVER_VERSION is '+m[1]+'. Make them the same string in one commit, then publish.');process.exit(1)}console.log('kmhub: version check ok, both say '+p.version)\"",
|
|
49
|
+
"prepublishOnly": "npm run check:version"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@hono/node-server": "1.19.15",
|
|
53
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
54
|
+
"zod": "^3.23.8"
|
|
55
|
+
}
|
|
56
|
+
}
|
package/prompts/briefing.md
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "The KM Hub day briefing: what needs you today, ranked, with the reason each thing is on the list. Use for /kmhub-briefing, or when the user says what needs me today, what have I got on, morning, catch me up, where are we, what should I do first, anything urgent, what did I miss, or opens a session with no specific task."
|
|
3
|
-
disable-model-invocation: false
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# The KM Hub briefing
|
|
7
|
-
|
|
8
|
-
Call `km_briefing`. Answer from what it returns. That single call already replaces `km_waiting` plus `km_list_outreach_drafts` plus `km_list_outreach_replies` plus `km_list_tasks` plus `km_list_invoices` plus `km_my_schedule`, so do not run those first and do not run them afterwards to check its work.
|
|
9
|
-
|
|
10
|
-
## Read it out in this shape
|
|
11
|
-
|
|
12
|
-
1. **The headline.** It is written to be said out loud. Say it.
|
|
13
|
-
2. **The ranked list**, in the order it came back. Each item carries a plain `why`. Use it. "This has been sitting 47 days and sends nothing until you release it" is the whole point; "draft pending" is not.
|
|
14
|
-
3. **The diary**, including anything only pencilled in with nothing signed behind it. A free day is worth saying out loud too.
|
|
15
|
-
4. **Money that is already late**, if there is any.
|
|
16
|
-
|
|
17
|
-
## Do not re-sort it
|
|
18
|
-
|
|
19
|
-
The ranking is deliberate. A new enquiry nobody has answered and a reply nobody has handled sit near the top because they stop being worth anything if left. Late money worth a real amount outranks something merely unread. A gig today is high, but as a fact to absorb, not a decision to make. Every item carries `score` so the order is inspectable. Work down it.
|
|
20
|
-
|
|
21
|
-
## Before you finish
|
|
22
|
-
|
|
23
|
-
- Read the `notes` array and the `complete` flag. When a part of the workspace could not be read, the briefing says which part. Pass that on rather than presenting a partial day as the whole day.
|
|
24
|
-
- `counts.truncated` means there was more than you were shown. Say how many.
|
|
25
|
-
- If `suggested_play` came back, offer it in one line and name `/kmhub-play`. Offer it; do not start it.
|
|
26
|
-
|
|
27
|
-
## Then stop
|
|
28
|
-
|
|
29
|
-
The briefing is a briefing. Do not start working the list, draft anything, or change a record because an item looked urgent. Wait to be asked.
|
|
1
|
+
---
|
|
2
|
+
description: "The KM Hub day briefing: what needs you today, ranked, with the reason each thing is on the list. Use for /kmhub-briefing, or when the user says what needs me today, what have I got on, morning, catch me up, where are we, what should I do first, anything urgent, what did I miss, or opens a session with no specific task."
|
|
3
|
+
disable-model-invocation: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# The KM Hub briefing
|
|
7
|
+
|
|
8
|
+
Call `km_briefing`. Answer from what it returns. That single call already replaces `km_waiting` plus `km_list_outreach_drafts` plus `km_list_outreach_replies` plus `km_list_tasks` plus `km_list_invoices` plus `km_my_schedule`, so do not run those first and do not run them afterwards to check its work.
|
|
9
|
+
|
|
10
|
+
## Read it out in this shape
|
|
11
|
+
|
|
12
|
+
1. **The headline.** It is written to be said out loud. Say it.
|
|
13
|
+
2. **The ranked list**, in the order it came back. Each item carries a plain `why`. Use it. "This has been sitting 47 days and sends nothing until you release it" is the whole point; "draft pending" is not.
|
|
14
|
+
3. **The diary**, including anything only pencilled in with nothing signed behind it. A free day is worth saying out loud too.
|
|
15
|
+
4. **Money that is already late**, if there is any.
|
|
16
|
+
|
|
17
|
+
## Do not re-sort it
|
|
18
|
+
|
|
19
|
+
The ranking is deliberate. A new enquiry nobody has answered and a reply nobody has handled sit near the top because they stop being worth anything if left. Late money worth a real amount outranks something merely unread. A gig today is high, but as a fact to absorb, not a decision to make. Every item carries `score` so the order is inspectable. Work down it.
|
|
20
|
+
|
|
21
|
+
## Before you finish
|
|
22
|
+
|
|
23
|
+
- Read the `notes` array and the `complete` flag. When a part of the workspace could not be read, the briefing says which part. Pass that on rather than presenting a partial day as the whole day.
|
|
24
|
+
- `counts.truncated` means there was more than you were shown. Say how many.
|
|
25
|
+
- If `suggested_play` came back, offer it in one line and name `/kmhub-play`. Offer it; do not start it.
|
|
26
|
+
|
|
27
|
+
## Then stop
|
|
28
|
+
|
|
29
|
+
The briefing is a briefing. Do not start working the list, draft anything, or change a record because an item looked urgent. Wait to be asked.
|
package/prompts/luxury.md
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Explain and run the luxury plays: the brand and pricing family built from The Luxury Strategy. Use for /kmhub-luxury, or when the user asks what the luxury plays are, which one to run first, in what order, or says their prices feel too low, their website undersells them, they are thinking of discounting, adding a service, or wondering what to say about price on a call."
|
|
3
|
-
argument-hint: nothing for the tour, or the play to run
|
|
4
|
-
disable-model-invocation: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# The luxury plays
|
|
8
|
-
|
|
9
|
-
Fifteen plays in the catalog carry the method from The Luxury Strategy by Kapferer and
|
|
10
|
-
Bastien. They are about what a business charges, what it says, and who it says it to.
|
|
11
|
-
|
|
12
|
-
The user typed `$ARGUMENTS`. If that names a play, run it with `km_play_run`. If it is empty,
|
|
13
|
-
give the tour below in your own words, keep it short, and end by offering to run the first one.
|
|
14
|
-
|
|
15
|
-
## The idea the whole family rests on
|
|
16
|
-
|
|
17
|
-
The book's first claim is that luxury, premium and fashion are three different businesses,
|
|
18
|
-
not three points on one scale, and that mixing their rules is what costs money.
|
|
19
|
-
|
|
20
|
-
- **Luxury** never compares itself, sets its own price, and makes buying it take effort.
|
|
21
|
-
- **Premium** is comparative: pay more, get more, and the price is justified by what it does.
|
|
22
|
-
- **Fashion** runs on trends and speed.
|
|
23
|
-
|
|
24
|
-
Most businesses here are premium, and that is a legitimate place to be. It is not a lesser
|
|
25
|
-
answer, it is a different rulebook. The owner picks which one they want to run.
|
|
26
|
-
|
|
27
|
-
## An optional second opinion
|
|
28
|
-
|
|
29
|
-
`luxury-positioning-check` reads the real offers, prices, win rate, diary and past clients,
|
|
30
|
-
then says which of the three the evidence shows today. It is advice, not a gate: nothing else
|
|
31
|
-
waits for it. If the owner wants luxury, every play runs full luxury rules, whatever the check
|
|
32
|
-
said, and the check can record that choice. With no verdict on file, the plays ask once
|
|
33
|
-
"luxury or premium rules?" or default to luxury.
|
|
34
|
-
|
|
35
|
-
## A sensible order
|
|
36
|
-
|
|
37
|
-
1. `brand-archaeology` - what this brand actually is: its story, its icons, the signatures that
|
|
38
|
-
should appear everywhere.
|
|
39
|
-
2. `offer-ladder-architect` - the shape of the range: one signature offer, a tier above it, the
|
|
40
|
-
core that makes the money, one honest way in.
|
|
41
|
-
3. `anti-law-copy-review` - the lines on the website and in emails that make the business look
|
|
42
|
-
cheaper than it is, rewritten in its own voice.
|
|
43
|
-
4. `rarity-storyteller` - turning real limits, dates left, prep hours, credentials, into copy,
|
|
44
|
-
using only what the calendar can back.
|
|
45
|
-
5. `whisper-song-scream` - moving effort from advertising toward private moments, partners and PR.
|
|
46
|
-
6. `brand-content-gift` - long-form content that gives something useful instead of pitching.
|
|
47
|
-
7. `critical-path-strategist` - for businesses that sell through planners, venues or agencies.
|
|
48
|
-
|
|
49
|
-
## The ones that wait for a moment
|
|
50
|
-
|
|
51
|
-
- `sell-the-price-coach` before a consultation.
|
|
52
|
-
- `discount-interceptor` before any discount goes out.
|
|
53
|
-
- `anticipation-concierge` once a booking is confirmed.
|
|
54
|
-
- `clienteling-memory` every month or so.
|
|
55
|
-
- `sensitive-occasion-advisor` for memorials, celebrations of life and charity work.
|
|
56
|
-
- `brand-stretch-gate` when tempted to add a new service or product.
|
|
57
|
-
- `automation-check` before switching on any automation.
|
|
58
|
-
|
|
59
|
-
## What to tell the user plainly
|
|
60
|
-
|
|
61
|
-
- Nothing sends. Every one of these ends at a draft, a task or a proposed fact, and a person
|
|
62
|
-
approves it.
|
|
63
|
-
- None of them invents a number, a price, a famous client or a scarcity claim. If the workspace
|
|
64
|
-
cannot back a line, the play refuses to write it.
|
|
65
|
-
- The owner's choice of strategy wins. If they want luxury, they get luxury; the positioning
|
|
66
|
-
check, if they ran it, is mentioned once as advice and never holds them back.
|
|
67
|
-
|
|
68
|
-
Ask what they want to work on and offer the matching play; mention `luxury-positioning-check` as optional. Do not describe the inside of any play beyond what
|
|
69
|
-
is written here, because the method arrives from `km_play_run` and only while the subscription
|
|
70
|
-
is live.
|
|
1
|
+
---
|
|
2
|
+
description: "Explain and run the luxury plays: the brand and pricing family built from The Luxury Strategy. Use for /kmhub-luxury, or when the user asks what the luxury plays are, which one to run first, in what order, or says their prices feel too low, their website undersells them, they are thinking of discounting, adding a service, or wondering what to say about price on a call."
|
|
3
|
+
argument-hint: nothing for the tour, or the play to run
|
|
4
|
+
disable-model-invocation: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# The luxury plays
|
|
8
|
+
|
|
9
|
+
Fifteen plays in the catalog carry the method from The Luxury Strategy by Kapferer and
|
|
10
|
+
Bastien. They are about what a business charges, what it says, and who it says it to.
|
|
11
|
+
|
|
12
|
+
The user typed `$ARGUMENTS`. If that names a play, run it with `km_play_run`. If it is empty,
|
|
13
|
+
give the tour below in your own words, keep it short, and end by offering to run the first one.
|
|
14
|
+
|
|
15
|
+
## The idea the whole family rests on
|
|
16
|
+
|
|
17
|
+
The book's first claim is that luxury, premium and fashion are three different businesses,
|
|
18
|
+
not three points on one scale, and that mixing their rules is what costs money.
|
|
19
|
+
|
|
20
|
+
- **Luxury** never compares itself, sets its own price, and makes buying it take effort.
|
|
21
|
+
- **Premium** is comparative: pay more, get more, and the price is justified by what it does.
|
|
22
|
+
- **Fashion** runs on trends and speed.
|
|
23
|
+
|
|
24
|
+
Most businesses here are premium, and that is a legitimate place to be. It is not a lesser
|
|
25
|
+
answer, it is a different rulebook. The owner picks which one they want to run.
|
|
26
|
+
|
|
27
|
+
## An optional second opinion
|
|
28
|
+
|
|
29
|
+
`luxury-positioning-check` reads the real offers, prices, win rate, diary and past clients,
|
|
30
|
+
then says which of the three the evidence shows today. It is advice, not a gate: nothing else
|
|
31
|
+
waits for it. If the owner wants luxury, every play runs full luxury rules, whatever the check
|
|
32
|
+
said, and the check can record that choice. With no verdict on file, the plays ask once
|
|
33
|
+
"luxury or premium rules?" or default to luxury.
|
|
34
|
+
|
|
35
|
+
## A sensible order
|
|
36
|
+
|
|
37
|
+
1. `brand-archaeology` - what this brand actually is: its story, its icons, the signatures that
|
|
38
|
+
should appear everywhere.
|
|
39
|
+
2. `offer-ladder-architect` - the shape of the range: one signature offer, a tier above it, the
|
|
40
|
+
core that makes the money, one honest way in.
|
|
41
|
+
3. `anti-law-copy-review` - the lines on the website and in emails that make the business look
|
|
42
|
+
cheaper than it is, rewritten in its own voice.
|
|
43
|
+
4. `rarity-storyteller` - turning real limits, dates left, prep hours, credentials, into copy,
|
|
44
|
+
using only what the calendar can back.
|
|
45
|
+
5. `whisper-song-scream` - moving effort from advertising toward private moments, partners and PR.
|
|
46
|
+
6. `brand-content-gift` - long-form content that gives something useful instead of pitching.
|
|
47
|
+
7. `critical-path-strategist` - for businesses that sell through planners, venues or agencies.
|
|
48
|
+
|
|
49
|
+
## The ones that wait for a moment
|
|
50
|
+
|
|
51
|
+
- `sell-the-price-coach` before a consultation.
|
|
52
|
+
- `discount-interceptor` before any discount goes out.
|
|
53
|
+
- `anticipation-concierge` once a booking is confirmed.
|
|
54
|
+
- `clienteling-memory` every month or so.
|
|
55
|
+
- `sensitive-occasion-advisor` for memorials, celebrations of life and charity work.
|
|
56
|
+
- `brand-stretch-gate` when tempted to add a new service or product.
|
|
57
|
+
- `automation-check` before switching on any automation.
|
|
58
|
+
|
|
59
|
+
## What to tell the user plainly
|
|
60
|
+
|
|
61
|
+
- Nothing sends. Every one of these ends at a draft, a task or a proposed fact, and a person
|
|
62
|
+
approves it.
|
|
63
|
+
- None of them invents a number, a price, a famous client or a scarcity claim. If the workspace
|
|
64
|
+
cannot back a line, the play refuses to write it.
|
|
65
|
+
- The owner's choice of strategy wins. If they want luxury, they get luxury; the positioning
|
|
66
|
+
check, if they ran it, is mentioned once as advice and never holds them back.
|
|
67
|
+
|
|
68
|
+
Ask what they want to work on and offer the matching play; mention `luxury-positioning-check` as optional. Do not describe the inside of any play beyond what
|
|
69
|
+
is written here, because the method arrives from `km_play_run` and only while the subscription
|
|
70
|
+
is live.
|
package/prompts/play.md
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Browse and run a KM Hub play: the operating method behind a named piece of work, leased one step at a time. Use for /kmhub-play, when the user asks what plays or routines are available, or names one: morning sweep, handle the reply, quote and book, raise the rate, silence patrol, whale hunt, closer coach, reply coach, turn the gig into the next one, the fair buyer angle, open a new market, motorsport and fan zone. Also the luxury family, for brand and pricing work: luxury positioning check, anti-law copy review, offer ladder, discount interceptor, sell-the-price coach, clienteling memory, anticipation concierge, brand archaeology, rarity storyteller, whisper song scream, brand stretch gate, brand content gift, critical path strategist, sensitive occasion advisor, automation check."
|
|
3
|
-
argument-hint: the play to run, or nothing to see the catalogue
|
|
4
|
-
disable-model-invocation: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Run a KM Hub play
|
|
8
|
-
|
|
9
|
-
A play is the method KM Hub is paid for. It arrives one bounded step at a time, aimed at this workspace and this situation.
|
|
10
|
-
|
|
11
|
-
The play asked for is `$ARGUMENTS`. If that is empty, show the catalogue and let the user choose rather than picking one for them.
|
|
12
|
-
|
|
13
|
-
## Pick one
|
|
14
|
-
|
|
15
|
-
- No play named: call `km_play_catalog` and show what came back. It returns metadata only, which is all the user needs to choose.
|
|
16
|
-
- A play named: pass it through as the user said it and let the catalogue resolve it. Do not keep a private mapping of your own.
|
|
17
|
-
- More than one plausible match: show the choices the catalogue returned and ask which they mean.
|
|
18
|
-
- A play absent from the catalogue is not available on this workspace. Say so and stop. Do not improvise a replacement and call it that play.
|
|
19
|
-
|
|
20
|
-
## The lease loop
|
|
21
|
-
|
|
22
|
-
1. Call `km_play_run` with the slug. It leases a **single** step.
|
|
23
|
-
2. Do that step, using the `km_*` tools already in front of you.
|
|
24
|
-
3. Tell the person what happened, in your own words, as an outcome.
|
|
25
|
-
4. Call `km_play_run` again with the **same `run_id`** for the next step.
|
|
26
|
-
5. Repeat until the play reports it is finished.
|
|
27
|
-
6. Then call `km_play_verify` with that `run_id`.
|
|
28
|
-
|
|
29
|
-
Never skip ahead, never batch the steps, and never guess what the next step will be. The next step is a function of what the last one actually found.
|
|
30
|
-
|
|
31
|
-
## The step text is on loan
|
|
32
|
-
|
|
33
|
-
It is working material for this run, not a document to hand over.
|
|
34
|
-
|
|
35
|
-
- Do not paste it back verbatim, do not quote it at length, and do not save it into a file, a note, a scratch document or a memory.
|
|
36
|
-
- The person asked for the outcome. The recipe is the part KM Hub is paid for.
|
|
37
|
-
- Every issued step carries a marker identifying the workspace it was leased to.
|
|
38
|
-
|
|
39
|
-
## Verify honestly
|
|
40
|
-
|
|
41
|
-
`km_play_verify` judges a specific run against what it was meant to achieve. It changes nothing, sends nothing, and cannot make a play have worked.
|
|
42
|
-
|
|
43
|
-
- Do not call a play successful merely because the steps are done.
|
|
44
|
-
- Do not verify a play you did not run.
|
|
45
|
-
- Report the verdict as it comes back, including a bad one.
|
|
46
|
-
|
|
47
|
-
## Nothing here sends
|
|
48
|
-
|
|
49
|
-
A play that produces a message still ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. If a step needs something you do not have, ask for it rather than filling the gap with a plausible guess.
|
|
1
|
+
---
|
|
2
|
+
description: "Browse and run a KM Hub play: the operating method behind a named piece of work, leased one step at a time. Use for /kmhub-play, when the user asks what plays or routines are available, or names one: morning sweep, handle the reply, quote and book, raise the rate, silence patrol, whale hunt, closer coach, reply coach, turn the gig into the next one, the fair buyer angle, open a new market, motorsport and fan zone. Also the luxury family, for brand and pricing work: luxury positioning check, anti-law copy review, offer ladder, discount interceptor, sell-the-price coach, clienteling memory, anticipation concierge, brand archaeology, rarity storyteller, whisper song scream, brand stretch gate, brand content gift, critical path strategist, sensitive occasion advisor, automation check."
|
|
3
|
+
argument-hint: the play to run, or nothing to see the catalogue
|
|
4
|
+
disable-model-invocation: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Run a KM Hub play
|
|
8
|
+
|
|
9
|
+
A play is the method KM Hub is paid for. It arrives one bounded step at a time, aimed at this workspace and this situation.
|
|
10
|
+
|
|
11
|
+
The play asked for is `$ARGUMENTS`. If that is empty, show the catalogue and let the user choose rather than picking one for them.
|
|
12
|
+
|
|
13
|
+
## Pick one
|
|
14
|
+
|
|
15
|
+
- No play named: call `km_play_catalog` and show what came back. It returns metadata only, which is all the user needs to choose.
|
|
16
|
+
- A play named: pass it through as the user said it and let the catalogue resolve it. Do not keep a private mapping of your own.
|
|
17
|
+
- More than one plausible match: show the choices the catalogue returned and ask which they mean.
|
|
18
|
+
- A play absent from the catalogue is not available on this workspace. Say so and stop. Do not improvise a replacement and call it that play.
|
|
19
|
+
|
|
20
|
+
## The lease loop
|
|
21
|
+
|
|
22
|
+
1. Call `km_play_run` with the slug. It leases a **single** step.
|
|
23
|
+
2. Do that step, using the `km_*` tools already in front of you.
|
|
24
|
+
3. Tell the person what happened, in your own words, as an outcome.
|
|
25
|
+
4. Call `km_play_run` again with the **same `run_id`** for the next step.
|
|
26
|
+
5. Repeat until the play reports it is finished.
|
|
27
|
+
6. Then call `km_play_verify` with that `run_id`.
|
|
28
|
+
|
|
29
|
+
Never skip ahead, never batch the steps, and never guess what the next step will be. The next step is a function of what the last one actually found.
|
|
30
|
+
|
|
31
|
+
## The step text is on loan
|
|
32
|
+
|
|
33
|
+
It is working material for this run, not a document to hand over.
|
|
34
|
+
|
|
35
|
+
- Do not paste it back verbatim, do not quote it at length, and do not save it into a file, a note, a scratch document or a memory.
|
|
36
|
+
- The person asked for the outcome. The recipe is the part KM Hub is paid for.
|
|
37
|
+
- Every issued step carries a marker identifying the workspace it was leased to.
|
|
38
|
+
|
|
39
|
+
## Verify honestly
|
|
40
|
+
|
|
41
|
+
`km_play_verify` judges a specific run against what it was meant to achieve. It changes nothing, sends nothing, and cannot make a play have worked.
|
|
42
|
+
|
|
43
|
+
- Do not call a play successful merely because the steps are done.
|
|
44
|
+
- Do not verify a play you did not run.
|
|
45
|
+
- Report the verdict as it comes back, including a bad one.
|
|
46
|
+
|
|
47
|
+
## Nothing here sends
|
|
48
|
+
|
|
49
|
+
A play that produces a message still ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. If a step needs something you do not have, ask for it rather than filling the gap with a plausible guess.
|
package/prompts/run.md
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Routes any KM Hub workspace request to the connected kmhub MCP tools. Use for /kmhub-run, when the user names KM Hub, or asks about their own pipeline: clients, leads, enquiries, deals, bookings, the diary, quotes, proposals, contracts, invoices, payments, outreach drafts and replies, campaigns, tasks, lead scouts, brand voice or business facts. Not for unrelated questions, another CRM, or code in the KM Hub repo itself."
|
|
3
|
-
argument-hint: what you want from your workspace
|
|
4
|
-
disable-model-invocation: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Run KM Hub
|
|
8
|
-
|
|
9
|
-
One router into a live, subscribed KM Hub workspace. Everything here happens through the connected `kmhub` MCP server. Nothing is answered from memory.
|
|
10
|
-
|
|
11
|
-
The request is `$ARGUMENTS`, in the user's own words. Pass it through as they wrote it. If it is empty, ask what they want rather than guessing, and offer `/kmhub-briefing` as the answer to "I do not know, what should I be doing".
|
|
12
|
-
|
|
13
|
-
## Before anything else
|
|
14
|
-
|
|
15
|
-
1. Call `km_me` once per session. It names the workspace this key opens.
|
|
16
|
-
2. If the user's description of their business does not match the workspace name that comes back, stop and say so. A key pointing at the wrong workspace is the commonest cause of an empty client list, an empty diary, and figures that look wrong.
|
|
17
|
-
|
|
18
|
-
## Route it
|
|
19
|
-
|
|
20
|
-
- **An open question about the day** ("what needs me today", "catch me up", "where are we", "anything urgent", "what did I miss"): call `km_briefing` and answer from what it returns. Do not assemble that answer yourself out of `km_waiting` plus the list tools, and do not run those afterwards to double check.
|
|
21
|
-
- **A named piece of work** (a follow up sweep, a reply to handle, a quote, a rate rise, a silence check, a whale hunt): this is a play. Use `/kmhub-play`, or call `km_play_catalog` then `km_play_run`.
|
|
22
|
-
- **One specific thing** ("show me the Meister invoice", "who has not signed", "what is on Thursday"): go straight to the read tool for it. `km_get_*` for one record, `km_list_*` for a set.
|
|
23
|
-
- **Anything the workspace should know** ("we now charge 2,500 for corporate"): `km_propose_business_fact`. It proposes, a human confirms.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- **
|
|
29
|
-
- **
|
|
30
|
-
- **
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- **
|
|
36
|
-
- **
|
|
1
|
+
---
|
|
2
|
+
description: "Routes any KM Hub workspace request to the connected kmhub MCP tools. Use for /kmhub-run, when the user names KM Hub, or asks about their own pipeline: clients, leads, enquiries, deals, bookings, the diary, quotes, proposals, contracts, invoices, payments, outreach drafts and replies, campaigns, tasks, lead scouts, brand voice or business facts. Not for unrelated questions, another CRM, or code in the KM Hub repo itself."
|
|
3
|
+
argument-hint: what you want from your workspace
|
|
4
|
+
disable-model-invocation: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Run KM Hub
|
|
8
|
+
|
|
9
|
+
One router into a live, subscribed KM Hub workspace. Everything here happens through the connected `kmhub` MCP server. Nothing is answered from memory.
|
|
10
|
+
|
|
11
|
+
The request is `$ARGUMENTS`, in the user's own words. Pass it through as they wrote it. If it is empty, ask what they want rather than guessing, and offer `/kmhub-briefing` as the answer to "I do not know, what should I be doing".
|
|
12
|
+
|
|
13
|
+
## Before anything else
|
|
14
|
+
|
|
15
|
+
1. Call `km_me` once per session. It names the workspace this key opens.
|
|
16
|
+
2. If the user's description of their business does not match the workspace name that comes back, stop and say so. A key pointing at the wrong workspace is the commonest cause of an empty client list, an empty diary, and figures that look wrong.
|
|
17
|
+
|
|
18
|
+
## Route it
|
|
19
|
+
|
|
20
|
+
- **An open question about the day** ("what needs me today", "catch me up", "where are we", "anything urgent", "what did I miss"): call `km_briefing` and answer from what it returns. Do not assemble that answer yourself out of `km_waiting` plus the list tools, and do not run those afterwards to double check.
|
|
21
|
+
- **A named piece of work** (a follow up sweep, a reply to handle, a quote, a rate rise, a silence check, a whale hunt): this is a play. Use `/kmhub-play`, or call `km_play_catalog` then `km_play_run`.
|
|
22
|
+
- **One specific thing** ("show me the Meister invoice", "who has not signed", "what is on Thursday"): go straight to the read tool for it. `km_get_*` for one record, `km_list_*` for a set.
|
|
23
|
+
- **Anything the workspace should know** ("we now charge 2,500 for corporate"): `km_propose_business_fact`. It proposes, a human confirms.
|
|
24
|
+
- **Their voice** ("teach KM Hub my voice", "now that you know my voice make sure KM Hub knows it"): call `km_get_brand_voice`, then `km_update_brand_voice` with the full profile (up to 8000 characters). Never upload a voice profile as a Business Knowledge document: a document is cut down to a short summary, and the brand voice box is the one field every KM Hub writer follows.
|
|
25
|
+
|
|
26
|
+
## The rules that do not bend
|
|
27
|
+
|
|
28
|
+
- **Nothing is sent to anybody.** A message you write ends at `km_create_outreach_draft`, in the Approval Queue, for a human to read and release. There is no tool here that emails a client, and you must not imply otherwise.
|
|
29
|
+
- **Money, client sends, and destructive changes wait for an explicit yes** from the person in front of you, in that turn. Not an assumed yes from earlier in the conversation.
|
|
30
|
+
- **A missing input is a question, not a guess.** If a step needs something you do not have, ask for it. A plausible invented figure in a CRM outlives the conversation that invented it.
|
|
31
|
+
- **Read before you write.** `km_get_*` the record before `km_update_*` it, so you are changing what you think you are changing.
|
|
32
|
+
|
|
33
|
+
## When it will not work
|
|
34
|
+
|
|
35
|
+
- **402** means the workspace subscription is not active. Stop. Their data is untouched and their key still works; the subscription needs restarting at https://hub.kivimedia.co. Do not try another route.
|
|
36
|
+
- **401 or 403** means the key is wrong, revoked, or missing a scope. Point them at `/kmhub-setup`.
|
|
37
|
+
- **The kmhub server is missing entirely** means the connector is not installed in this Claude Code. Point them at https://hub.kivimedia.co/terminal/ and stop. Never ask for a Claude password, a Claude token, or their Claude account.
|