@curless/clubmed-demo 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/README.md +35 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @curless/clubmed-demo
|
|
2
|
+
|
|
3
|
+
A demo "Club Med Europe" storefront MCP server. Browses European Club Med
|
|
4
|
+
resorts and books them through [agentbank](https://gitlab.com/robin-ruan/agentbank)
|
|
5
|
+
acquiring (ACP). For demos/testing only.
|
|
6
|
+
|
|
7
|
+
## Use (Claude Desktop / any MCP client)
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"clubmed": {
|
|
13
|
+
"command": "npx",
|
|
14
|
+
"args": ["-y", "@curless/clubmed-demo"],
|
|
15
|
+
"env": {
|
|
16
|
+
"AGENTBANK_API_URL": "http://localhost:3000",
|
|
17
|
+
"AGENTBANK_AGENT_TOKEN": "agb_test_..."
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`AGENTBANK_AGENT_TOKEN` is an agentbank agent key (`agb_...`) with `agent:execute`.
|
|
25
|
+
|
|
26
|
+
## Tools
|
|
27
|
+
|
|
28
|
+
- `list_clubmed_resorts` — browse resorts (filter by country / ski|sun); shows
|
|
29
|
+
list price + the demo test price (1% of list).
|
|
30
|
+
- `get_clubmed_resort` — one resort by sku.
|
|
31
|
+
- `book_clubmed_resort` — book via an ACP checkout (moves money on the configured
|
|
32
|
+
rail; sandbox default token `pm_card_visa`).
|
|
33
|
+
|
|
34
|
+
Env: `AGENTBANK_API_URL` (default `http://localhost:3000`),
|
|
35
|
+
`CLUBMED_MERCHANT_ID` (default `curless_mch_clubmed_eu`).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
// @curless/clubmed-demo — a SIMULATED "Club Med Europe" storefront MCP. It
|
|
6
|
+
// browses European Club Med resorts + prices and books them through agentbank's
|
|
7
|
+
// acquiring (收单) over ACP. The resort catalog + its demo test pricing live in
|
|
8
|
+
// the agentbank merchant `curless_mch_clubmed_eu`; this server reads that
|
|
9
|
+
// catalog and books via an ACP checkout.
|
|
10
|
+
//
|
|
11
|
+
// Run (Claude Desktop / any MCP client):
|
|
12
|
+
// npx -y @curless/clubmed-demo
|
|
13
|
+
// with env:
|
|
14
|
+
// AGENTBANK_API_URL (default http://localhost:3000)
|
|
15
|
+
// AGENTBANK_AGENT_TOKEN an agentbank agent key (agb_...) with agent:execute
|
|
16
|
+
// CLUBMED_MERCHANT_ID (default curless_mch_clubmed_eu)
|
|
17
|
+
//
|
|
18
|
+
// IMPORTANT: only JSON-RPC may be written to stdout (the MCP stdio transport).
|
|
19
|
+
// Never console.log here — diagnostics go to stderr.
|
|
20
|
+
const API_BASE = process.env.AGENTBANK_API_URL ?? 'http://localhost:3000';
|
|
21
|
+
const TOKEN = process.env.AGENTBANK_AGENT_TOKEN;
|
|
22
|
+
const MERCHANT = process.env.CLUBMED_MERCHANT_ID ?? 'curless_mch_clubmed_eu';
|
|
23
|
+
const api = async (path, init = {}) => {
|
|
24
|
+
const res = await fetch(`${API_BASE}${path}`, {
|
|
25
|
+
...init,
|
|
26
|
+
headers: {
|
|
27
|
+
'content-type': 'application/json',
|
|
28
|
+
...(TOKEN ? { authorization: `Bearer ${TOKEN}` } : {}),
|
|
29
|
+
...(init.headers ?? {}),
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
throw new Error(`agentbank ${path} -> ${res.status}: ${await res.text().catch(() => '')}`);
|
|
34
|
+
}
|
|
35
|
+
return (await res.json());
|
|
36
|
+
};
|
|
37
|
+
const eur = (minor) => `€${(minor / 100).toLocaleString('en-IE', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
38
|
+
const view = (it) => {
|
|
39
|
+
const list = it.attributes.listPriceMinor ?? it.price;
|
|
40
|
+
return {
|
|
41
|
+
sku: it.sku,
|
|
42
|
+
name: it.name,
|
|
43
|
+
country: it.attributes.country,
|
|
44
|
+
kind: it.attributes.kind,
|
|
45
|
+
description: it.description,
|
|
46
|
+
currency: it.currency,
|
|
47
|
+
listPrice: eur(list),
|
|
48
|
+
price: eur(it.price), // demo test charge = 1% of list
|
|
49
|
+
note: 'demo test price = 1% of list (so sandbox charges stay tiny)',
|
|
50
|
+
available: it.available,
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const loadCatalog = async () => {
|
|
54
|
+
const { items } = await api(`/v1/merchants/${encodeURIComponent(MERCHANT)}/catalog`);
|
|
55
|
+
return items;
|
|
56
|
+
};
|
|
57
|
+
const TOOLS = [
|
|
58
|
+
{
|
|
59
|
+
name: 'list_clubmed_resorts',
|
|
60
|
+
description: 'Browse Club Med Europe resorts — shows the list price + the demo test price (1% of list, so sandbox charges stay tiny). Optional country (FR/IT/ES/PT) or kind (ski|sun) filter.',
|
|
61
|
+
inputSchema: {
|
|
62
|
+
type: 'object',
|
|
63
|
+
properties: {
|
|
64
|
+
country: { type: 'string', description: 'ISO-2, e.g. FR / IT / ES / PT' },
|
|
65
|
+
kind: { type: 'string', enum: ['ski', 'sun'] },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'get_clubmed_resort',
|
|
71
|
+
description: 'Get one Club Med Europe resort by its sku (from list_clubmed_resorts).',
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: 'object',
|
|
74
|
+
required: ['sku'],
|
|
75
|
+
properties: { sku: { type: 'string' } },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'book_clubmed_resort',
|
|
80
|
+
description: 'Book a Club Med Europe resort — this MOVES MONEY through agentbank acquiring (ACP). Creates a checkout session for the resort and pays it with a delegated token (sandbox default pm_card_visa). Returns the order. The charged amount is the demo test price (1% of list).',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
required: ['sku'],
|
|
84
|
+
properties: {
|
|
85
|
+
sku: { type: 'string' },
|
|
86
|
+
quantity: { type: 'integer', description: 'number of guests/weeks (default 1)' },
|
|
87
|
+
paymentToken: { type: 'string', description: "delegated token; default 'pm_card_visa'" },
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
const text = (value) => ({
|
|
93
|
+
content: [{ type: 'text', text: JSON.stringify(value, null, 2) }],
|
|
94
|
+
});
|
|
95
|
+
const server = new Server({ name: 'clubmed-europe', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
96
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
97
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
98
|
+
const args = (req.params.arguments ?? {});
|
|
99
|
+
try {
|
|
100
|
+
if (req.params.name === 'list_clubmed_resorts') {
|
|
101
|
+
const country = typeof args.country === 'string' ? args.country.toUpperCase() : undefined;
|
|
102
|
+
const kind = typeof args.kind === 'string' ? args.kind : undefined;
|
|
103
|
+
const resorts = (await loadCatalog())
|
|
104
|
+
.filter((it) => (country ? it.attributes.country === country : true))
|
|
105
|
+
.filter((it) => (kind ? it.attributes.kind === kind : true))
|
|
106
|
+
.map(view);
|
|
107
|
+
return text({ merchant: MERCHANT, currency: 'EUR', count: resorts.length, resorts });
|
|
108
|
+
}
|
|
109
|
+
if (req.params.name === 'get_clubmed_resort') {
|
|
110
|
+
const sku = String(args.sku ?? '');
|
|
111
|
+
const it = (await loadCatalog()).find((r) => r.sku === sku);
|
|
112
|
+
if (!it) {
|
|
113
|
+
return { content: [{ type: 'text', text: `no resort with sku ${sku}` }], isError: true };
|
|
114
|
+
}
|
|
115
|
+
return text(view(it));
|
|
116
|
+
}
|
|
117
|
+
if (req.params.name === 'book_clubmed_resort') {
|
|
118
|
+
const sku = String(args.sku ?? '');
|
|
119
|
+
const quantity = Math.max(Number(args.quantity) || 1, 1);
|
|
120
|
+
const token = typeof args.paymentToken === 'string' ? args.paymentToken : 'pm_card_visa';
|
|
121
|
+
const base = `/acp/${encodeURIComponent(MERCHANT)}/checkout_sessions`;
|
|
122
|
+
const session = await api(base, {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
body: JSON.stringify({ items: [{ id: sku, quantity }] }),
|
|
125
|
+
});
|
|
126
|
+
const order = await api(`${base}/${encodeURIComponent(session.id)}/complete`, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
body: JSON.stringify({ payment_data: { token, provider: 'stripe' } }),
|
|
129
|
+
});
|
|
130
|
+
return text({ booked: true, order });
|
|
131
|
+
}
|
|
132
|
+
return { content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }], isError: true };
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
await server.connect(new StdioServerTransport());
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@curless/clubmed-demo",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Demo Club Med Europe storefront MCP — browse resorts and book them through agentbank acquiring (ACP).",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"clubmed-demo": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "^1.0.4"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^22.10.1",
|
|
21
|
+
"tsx": "^4.19.2",
|
|
22
|
+
"typescript": "^5.6.3"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"mcp",
|
|
29
|
+
"clubmed",
|
|
30
|
+
"agentbank",
|
|
31
|
+
"demo",
|
|
32
|
+
"claude",
|
|
33
|
+
"acp"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://gitlab.com/robin-ruan/agentbank.git",
|
|
38
|
+
"directory": "packages/clubmed-demo"
|
|
39
|
+
},
|
|
40
|
+
"author": "robin",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"dev": "tsx src/index.ts",
|
|
44
|
+
"start": "node dist/index.js",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"clean": "rm -rf dist"
|
|
47
|
+
}
|
|
48
|
+
}
|