@frihet/mcp-server 1.16.3 → 1.16.4
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 +1 -1
- package/dist/openai-profile.js +1 -1
- package/package.json +7 -4
- package/scripts/postinstall.js +30 -8
- package/dist/__tests__/audit-server-version.test.d.ts +0 -13
- package/dist/__tests__/audit-server-version.test.d.ts.map +0 -1
- package/dist/__tests__/audit-server-version.test.js +0 -96
- package/dist/__tests__/audit-server-version.test.js.map +0 -1
- package/dist/__tests__/banking-client-contract.test.d.ts +0 -20
- package/dist/__tests__/banking-client-contract.test.d.ts.map +0 -1
- package/dist/__tests__/banking-client-contract.test.js +0 -133
- package/dist/__tests__/banking-client-contract.test.js.map +0 -1
- package/dist/__tests__/banking-tools.test.d.ts +0 -18
- package/dist/__tests__/banking-tools.test.d.ts.map +0 -1
- package/dist/__tests__/banking-tools.test.js +0 -252
- package/dist/__tests__/banking-tools.test.js.map +0 -1
- package/dist/__tests__/contract.test.d.ts +0 -33
- package/dist/__tests__/contract.test.d.ts.map +0 -1
- package/dist/__tests__/contract.test.js +0 -208
- package/dist/__tests__/contract.test.js.map +0 -1
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts +0 -13
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +0 -1
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +0 -420
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +0 -1
- package/dist/__tests__/demo-mode.test.d.ts +0 -11
- package/dist/__tests__/demo-mode.test.d.ts.map +0 -1
- package/dist/__tests__/demo-mode.test.js +0 -119
- package/dist/__tests__/demo-mode.test.js.map +0 -1
- package/dist/__tests__/einvoice-day4-tools.test.d.ts +0 -16
- package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-day4-tools.test.js +0 -421
- package/dist/__tests__/einvoice-day4-tools.test.js.map +0 -1
- package/dist/__tests__/einvoice-integration.test.d.ts +0 -24
- package/dist/__tests__/einvoice-integration.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-integration.test.js +0 -142
- package/dist/__tests__/einvoice-integration.test.js.map +0 -1
- package/dist/__tests__/einvoice-tools.test.d.ts +0 -16
- package/dist/__tests__/einvoice-tools.test.d.ts.map +0 -1
- package/dist/__tests__/einvoice-tools.test.js +0 -411
- package/dist/__tests__/einvoice-tools.test.js.map +0 -1
- package/dist/__tests__/fiscal-tools.test.d.ts +0 -21
- package/dist/__tests__/fiscal-tools.test.d.ts.map +0 -1
- package/dist/__tests__/fiscal-tools.test.js +0 -271
- package/dist/__tests__/fiscal-tools.test.js.map +0 -1
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +0 -27
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +0 -1
- package/dist/__tests__/get-envelope-unwrap-regression.test.js +0 -223
- package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +0 -1
- package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts +0 -14
- package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts.map +0 -1
- package/dist/__tests__/intelligence-duplicate-invoice.test.js +0 -108
- package/dist/__tests__/intelligence-duplicate-invoice.test.js.map +0 -1
- package/dist/__tests__/kitchen-tools.test.d.ts +0 -18
- package/dist/__tests__/kitchen-tools.test.d.ts.map +0 -1
- package/dist/__tests__/kitchen-tools.test.js +0 -399
- package/dist/__tests__/kitchen-tools.test.js.map +0 -1
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +0 -30
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +0 -1
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +0 -164
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +0 -1
- package/dist/__tests__/observability-redaction.test.d.ts +0 -13
- package/dist/__tests__/observability-redaction.test.d.ts.map +0 -1
- package/dist/__tests__/observability-redaction.test.js +0 -94
- package/dist/__tests__/observability-redaction.test.js.map +0 -1
- package/dist/__tests__/openai-grouped-compose.test.d.ts +0 -26
- package/dist/__tests__/openai-grouped-compose.test.d.ts.map +0 -1
- package/dist/__tests__/openai-grouped-compose.test.js +0 -245
- package/dist/__tests__/openai-grouped-compose.test.js.map +0 -1
- package/dist/__tests__/openai-profile.test.d.ts +0 -10
- package/dist/__tests__/openai-profile.test.d.ts.map +0 -1
- package/dist/__tests__/openai-profile.test.js +0 -168
- package/dist/__tests__/openai-profile.test.js.map +0 -1
- package/dist/__tests__/pagination-cursor-param.test.d.ts +0 -27
- package/dist/__tests__/pagination-cursor-param.test.d.ts.map +0 -1
- package/dist/__tests__/pagination-cursor-param.test.js +0 -96
- package/dist/__tests__/pagination-cursor-param.test.js.map +0 -1
- package/dist/__tests__/pos-tools.test.d.ts +0 -16
- package/dist/__tests__/pos-tools.test.d.ts.map +0 -1
- package/dist/__tests__/pos-tools.test.js +0 -244
- package/dist/__tests__/pos-tools.test.js.map +0 -1
- package/dist/__tests__/recurring-tools.test.d.ts +0 -23
- package/dist/__tests__/recurring-tools.test.d.ts.map +0 -1
- package/dist/__tests__/recurring-tools.test.js +0 -352
- package/dist/__tests__/recurring-tools.test.js.map +0 -1
- package/dist/__tests__/schema-envelope-guard.test.d.ts +0 -18
- package/dist/__tests__/schema-envelope-guard.test.d.ts.map +0 -1
- package/dist/__tests__/schema-envelope-guard.test.js +0 -56
- package/dist/__tests__/schema-envelope-guard.test.js.map +0 -1
- package/dist/__tests__/stay-tools.test.d.ts +0 -17
- package/dist/__tests__/stay-tools.test.d.ts.map +0 -1
- package/dist/__tests__/stay-tools.test.js +0 -259
- package/dist/__tests__/stay-tools.test.js.map +0 -1
- package/dist/__tests__/team-tools.test.d.ts +0 -18
- package/dist/__tests__/team-tools.test.d.ts.map +0 -1
- package/dist/__tests__/team-tools.test.js +0 -228
- package/dist/__tests__/team-tools.test.js.map +0 -1
- package/dist/__tests__/time-tools.test.d.ts +0 -19
- package/dist/__tests__/time-tools.test.d.ts.map +0 -1
- package/dist/__tests__/time-tools.test.js +0 -286
- package/dist/__tests__/time-tools.test.js.map +0 -1
- package/dist/__tests__/tool-exposure.test.d.ts +0 -11
- package/dist/__tests__/tool-exposure.test.d.ts.map +0 -1
- package/dist/__tests__/tool-exposure.test.js +0 -264
- package/dist/__tests__/tool-exposure.test.js.map +0 -1
- package/dist/client-interface.d.ts.map +0 -1
- package/dist/client-interface.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/demo-client.d.ts.map +0 -1
- package/dist/demo-client.js.map +0 -1
- package/dist/demo-fixtures.d.ts.map +0 -1
- package/dist/demo-fixtures.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js.map +0 -1
- package/dist/observability.d.ts.map +0 -1
- package/dist/observability.js.map +0 -1
- package/dist/openai-profile.d.ts.map +0 -1
- package/dist/openai-profile.js.map +0 -1
- package/dist/prompts/register-all.d.ts.map +0 -1
- package/dist/prompts/register-all.js.map +0 -1
- package/dist/redaction.d.ts.map +0 -1
- package/dist/redaction.js.map +0 -1
- package/dist/resources/register-all.d.ts.map +0 -1
- package/dist/resources/register-all.js.map +0 -1
- package/dist/tool-exposure.d.ts.map +0 -1
- package/dist/tool-exposure.js.map +0 -1
- package/dist/tools/accountingClose.d.ts.map +0 -1
- package/dist/tools/accountingClose.js.map +0 -1
- package/dist/tools/audit_gl.d.ts.map +0 -1
- package/dist/tools/audit_gl.js.map +0 -1
- package/dist/tools/backend-availability.d.ts.map +0 -1
- package/dist/tools/backend-availability.js.map +0 -1
- package/dist/tools/bank_rules.d.ts.map +0 -1
- package/dist/tools/bank_rules.js.map +0 -1
- package/dist/tools/banking.d.ts.map +0 -1
- package/dist/tools/banking.js.map +0 -1
- package/dist/tools/clients.d.ts.map +0 -1
- package/dist/tools/clients.js.map +0 -1
- package/dist/tools/crm.d.ts.map +0 -1
- package/dist/tools/crm.js.map +0 -1
- package/dist/tools/deposits.d.ts.map +0 -1
- package/dist/tools/deposits.js.map +0 -1
- package/dist/tools/einvoice.d.ts.map +0 -1
- package/dist/tools/einvoice.js.map +0 -1
- package/dist/tools/expenses.d.ts.map +0 -1
- package/dist/tools/expenses.js.map +0 -1
- package/dist/tools/fiscal.d.ts.map +0 -1
- package/dist/tools/fiscal.js.map +0 -1
- package/dist/tools/gestoria.d.ts.map +0 -1
- package/dist/tools/gestoria.js.map +0 -1
- package/dist/tools/hr.d.ts.map +0 -1
- package/dist/tools/hr.js.map +0 -1
- package/dist/tools/igic.d.ts.map +0 -1
- package/dist/tools/igic.js.map +0 -1
- package/dist/tools/impuesto_sociedades.d.ts.map +0 -1
- package/dist/tools/impuesto_sociedades.js.map +0 -1
- package/dist/tools/intelligence.d.ts.map +0 -1
- package/dist/tools/intelligence.js.map +0 -1
- package/dist/tools/invoices.d.ts.map +0 -1
- package/dist/tools/invoices.js.map +0 -1
- package/dist/tools/kitchen.d.ts.map +0 -1
- package/dist/tools/kitchen.js.map +0 -1
- package/dist/tools/onboard_vies.d.ts.map +0 -1
- package/dist/tools/onboard_vies.js.map +0 -1
- package/dist/tools/onboarding.d.ts.map +0 -1
- package/dist/tools/onboarding.js.map +0 -1
- package/dist/tools/payroll.d.ts.map +0 -1
- package/dist/tools/payroll.js.map +0 -1
- package/dist/tools/permissions.d.ts.map +0 -1
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/portal_domain.d.ts.map +0 -1
- package/dist/tools/portal_domain.js.map +0 -1
- package/dist/tools/pos.d.ts.map +0 -1
- package/dist/tools/pos.js.map +0 -1
- package/dist/tools/products.d.ts.map +0 -1
- package/dist/tools/products.js.map +0 -1
- package/dist/tools/quotes.d.ts.map +0 -1
- package/dist/tools/quotes.js.map +0 -1
- package/dist/tools/recurring.d.ts.map +0 -1
- package/dist/tools/recurring.js.map +0 -1
- package/dist/tools/register-all.d.ts.map +0 -1
- package/dist/tools/register-all.js.map +0 -1
- package/dist/tools/shared.d.ts.map +0 -1
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/stay.d.ts.map +0 -1
- package/dist/tools/stay.js.map +0 -1
- package/dist/tools/team.d.ts.map +0 -1
- package/dist/tools/team.js.map +0 -1
- package/dist/tools/time.d.ts.map +0 -1
- package/dist/tools/time.js.map +0 -1
- package/dist/tools/vendors.d.ts.map +0 -1
- package/dist/tools/vendors.js.map +0 -1
- package/dist/tools/webhooks.d.ts.map +0 -1
- package/dist/tools/webhooks.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/scripts/audit-mcp-refs.mjs +0 -402
- package/scripts/no-public-leak.sh +0 -60
- package/scripts/test-openai-grouped-compose.mjs +0 -173
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Stay MCP tools — Wave 4 (5 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
-
* Run: npm test (after build)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 5 tools registered on McpServer
|
|
9
|
-
* 2. list_reservations — success path + structuredContent shape
|
|
10
|
-
* 3. get_reservation — success path + structuredContent shape
|
|
11
|
-
* 4. create_reservation — success path + structuredContent shape
|
|
12
|
-
* 5. list_properties — success path + structuredContent shape
|
|
13
|
-
* 6. sync_channel — success path + structuredContent shape
|
|
14
|
-
* 7. API error path — 404 propagated through handleToolError
|
|
15
|
-
*/
|
|
16
|
-
import { test, describe, beforeEach } from "node:test";
|
|
17
|
-
import assert from "node:assert/strict";
|
|
18
|
-
class StubMcpServer {
|
|
19
|
-
tools = new Map();
|
|
20
|
-
registerTool(name, config, handler) {
|
|
21
|
-
this.tools.set(name, { name, config, handler });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
25
|
-
const MOCK_RESERVATION = {
|
|
26
|
-
id: "res_abc123",
|
|
27
|
-
propertyId: "prop_xyz",
|
|
28
|
-
guestId: "guest_def456",
|
|
29
|
-
status: "confirmed",
|
|
30
|
-
checkIn: "2026-06-01",
|
|
31
|
-
checkOut: "2026-06-08",
|
|
32
|
-
nights: 7,
|
|
33
|
-
guestCount: 2,
|
|
34
|
-
channelId: "ch_direct",
|
|
35
|
-
totalAmount: 840,
|
|
36
|
-
currency: "EUR",
|
|
37
|
-
createdAt: "2026-05-10T10:00:00Z",
|
|
38
|
-
updatedAt: "2026-05-10T10:00:00Z",
|
|
39
|
-
};
|
|
40
|
-
const MOCK_RESERVATIONS_LIST = {
|
|
41
|
-
data: [MOCK_RESERVATION],
|
|
42
|
-
total: 1,
|
|
43
|
-
limit: 20,
|
|
44
|
-
offset: 0,
|
|
45
|
-
};
|
|
46
|
-
const MOCK_PROPERTY = {
|
|
47
|
-
id: "prop_xyz",
|
|
48
|
-
name: "Casa Marina",
|
|
49
|
-
address: { street: "Calle del Mar 1", city: "Tenerife", country: "ES" },
|
|
50
|
-
capacity: 4,
|
|
51
|
-
ownerName: "Ana Garcia",
|
|
52
|
-
licenseNumber: "VV-TF-12345",
|
|
53
|
-
isActive: true,
|
|
54
|
-
createdAt: "2026-01-01T00:00:00Z",
|
|
55
|
-
updatedAt: "2026-01-01T00:00:00Z",
|
|
56
|
-
};
|
|
57
|
-
const MOCK_PROPERTIES_LIST = {
|
|
58
|
-
data: [MOCK_PROPERTY],
|
|
59
|
-
total: 1,
|
|
60
|
-
limit: 20,
|
|
61
|
-
offset: 0,
|
|
62
|
-
};
|
|
63
|
-
const MOCK_SYNC_RESULT = {
|
|
64
|
-
channelId: "ch_airbnb_001",
|
|
65
|
-
status: "ok",
|
|
66
|
-
pulledCount: 3,
|
|
67
|
-
pushedCount: 1,
|
|
68
|
-
lastSyncAt: "2026-05-10T10:00:00Z",
|
|
69
|
-
};
|
|
70
|
-
function makeSuccessClient() {
|
|
71
|
-
return {
|
|
72
|
-
listReservations: async () => MOCK_RESERVATIONS_LIST,
|
|
73
|
-
getReservation: async (_id) => MOCK_RESERVATION,
|
|
74
|
-
createReservation: async (_data) => MOCK_RESERVATION,
|
|
75
|
-
listProperties: async () => MOCK_PROPERTIES_LIST,
|
|
76
|
-
syncChannel: async (_channelId, _direction) => MOCK_SYNC_RESULT,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
function make404Client() {
|
|
80
|
-
const notFound = () => {
|
|
81
|
-
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
82
|
-
return Promise.reject(err);
|
|
83
|
-
};
|
|
84
|
-
return {
|
|
85
|
-
listReservations: notFound,
|
|
86
|
-
getReservation: notFound,
|
|
87
|
-
createReservation: notFound,
|
|
88
|
-
listProperties: notFound,
|
|
89
|
-
syncChannel: notFound,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
// ── Helper ───────────────────────────────────────────────────────────────────
|
|
93
|
-
async function makeServer(clientFn) {
|
|
94
|
-
const server = new StubMcpServer();
|
|
95
|
-
const { registerStayTools } = await import("../tools/stay.js");
|
|
96
|
-
registerStayTools(server, clientFn());
|
|
97
|
-
return server;
|
|
98
|
-
}
|
|
99
|
-
// ── Registration tests ───────────────────────────────────────────────────────
|
|
100
|
-
describe("Stay Tools — Registration", () => {
|
|
101
|
-
let server;
|
|
102
|
-
beforeEach(async () => {
|
|
103
|
-
server = await makeServer(makeSuccessClient);
|
|
104
|
-
});
|
|
105
|
-
test("registers exactly 5 stay tools", () => {
|
|
106
|
-
assert.equal(server.tools.size, 5);
|
|
107
|
-
});
|
|
108
|
-
test("registers list_reservations", () => {
|
|
109
|
-
assert.ok(server.tools.has("list_reservations"), "list_reservations not registered");
|
|
110
|
-
});
|
|
111
|
-
test("registers get_reservation", () => {
|
|
112
|
-
assert.ok(server.tools.has("get_reservation"), "get_reservation not registered");
|
|
113
|
-
});
|
|
114
|
-
test("registers create_reservation", () => {
|
|
115
|
-
assert.ok(server.tools.has("create_reservation"), "create_reservation not registered");
|
|
116
|
-
});
|
|
117
|
-
test("registers list_properties", () => {
|
|
118
|
-
assert.ok(server.tools.has("list_properties"), "list_properties not registered");
|
|
119
|
-
});
|
|
120
|
-
test("registers sync_channel", () => {
|
|
121
|
-
assert.ok(server.tools.has("sync_channel"), "sync_channel not registered");
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
// ── list_reservations ────────────────────────────────────────────────────────
|
|
125
|
-
describe("list_reservations — success path", () => {
|
|
126
|
-
test("returns structuredContent with data array", async () => {
|
|
127
|
-
const server = await makeServer(makeSuccessClient);
|
|
128
|
-
const tool = server.tools.get("list_reservations");
|
|
129
|
-
const result = await tool.handler({ limit: 20, offset: 0 });
|
|
130
|
-
assert.ok(!result.isError, "should not be an error");
|
|
131
|
-
assert.ok(result.structuredContent, "structuredContent missing");
|
|
132
|
-
const sc = result.structuredContent;
|
|
133
|
-
assert.ok(Array.isArray(sc["data"]), "data should be an array");
|
|
134
|
-
assert.equal(sc["data"].length, 1);
|
|
135
|
-
assert.equal(sc["total"], 1);
|
|
136
|
-
});
|
|
137
|
-
test("first reservation has expected fields", async () => {
|
|
138
|
-
const server = await makeServer(makeSuccessClient);
|
|
139
|
-
const tool = server.tools.get("list_reservations");
|
|
140
|
-
const result = await tool.handler({});
|
|
141
|
-
const sc = result.structuredContent;
|
|
142
|
-
const first = sc["data"][0];
|
|
143
|
-
assert.equal(first["id"], "res_abc123");
|
|
144
|
-
assert.equal(first["status"], "confirmed");
|
|
145
|
-
assert.equal(first["checkIn"], "2026-06-01");
|
|
146
|
-
assert.equal(first["checkOut"], "2026-06-08");
|
|
147
|
-
assert.equal(first["guestCount"], 2);
|
|
148
|
-
});
|
|
149
|
-
test("content block has type text", async () => {
|
|
150
|
-
const server = await makeServer(makeSuccessClient);
|
|
151
|
-
const tool = server.tools.get("list_reservations");
|
|
152
|
-
const result = await tool.handler({});
|
|
153
|
-
assert.ok(Array.isArray(result.content), "content should be array");
|
|
154
|
-
assert.equal(result.content[0].type, "text");
|
|
155
|
-
assert.ok(typeof result.content[0].text === "string");
|
|
156
|
-
assert.ok(result.content[0].text.includes("reservations"));
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
// ── get_reservation ──────────────────────────────────────────────────────────
|
|
160
|
-
describe("get_reservation — success path", () => {
|
|
161
|
-
test("returns single reservation by ID", async () => {
|
|
162
|
-
const server = await makeServer(makeSuccessClient);
|
|
163
|
-
const tool = server.tools.get("get_reservation");
|
|
164
|
-
const result = await tool.handler({ id: "res_abc123" });
|
|
165
|
-
assert.ok(!result.isError, "should not be an error");
|
|
166
|
-
const sc = result.structuredContent;
|
|
167
|
-
assert.equal(sc["id"], "res_abc123");
|
|
168
|
-
assert.equal(sc["propertyId"], "prop_xyz");
|
|
169
|
-
assert.equal(sc["status"], "confirmed");
|
|
170
|
-
});
|
|
171
|
-
test("404 error propagates as isError=true", async () => {
|
|
172
|
-
const server = await makeServer(make404Client);
|
|
173
|
-
const tool = server.tools.get("get_reservation");
|
|
174
|
-
const result = await tool.handler({ id: "res_missing" });
|
|
175
|
-
assert.ok(result.isError, "should be an error on 404");
|
|
176
|
-
assert.ok(result.content[0].text.includes("Error:"), "error message should start with Error:");
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
// ── create_reservation ───────────────────────────────────────────────────────
|
|
180
|
-
describe("create_reservation — success path", () => {
|
|
181
|
-
test("returns created reservation", async () => {
|
|
182
|
-
const server = await makeServer(makeSuccessClient);
|
|
183
|
-
const tool = server.tools.get("create_reservation");
|
|
184
|
-
const result = await tool.handler({
|
|
185
|
-
propertyId: "prop_xyz",
|
|
186
|
-
checkIn: "2026-06-01",
|
|
187
|
-
checkOut: "2026-06-08",
|
|
188
|
-
guestCount: 2,
|
|
189
|
-
});
|
|
190
|
-
assert.ok(!result.isError, "should not be an error");
|
|
191
|
-
const sc = result.structuredContent;
|
|
192
|
-
assert.equal(sc["id"], "res_abc123");
|
|
193
|
-
assert.equal(sc["status"], "confirmed");
|
|
194
|
-
});
|
|
195
|
-
test("content block is a mutate-type annotated text", async () => {
|
|
196
|
-
const server = await makeServer(makeSuccessClient);
|
|
197
|
-
const tool = server.tools.get("create_reservation");
|
|
198
|
-
const result = await tool.handler({
|
|
199
|
-
propertyId: "prop_xyz",
|
|
200
|
-
checkIn: "2026-06-01",
|
|
201
|
-
checkOut: "2026-06-08",
|
|
202
|
-
guestCount: 2,
|
|
203
|
-
});
|
|
204
|
-
assert.equal(result.content[0].type, "text");
|
|
205
|
-
assert.ok(result.content[0].text.includes("Reservation created"));
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
// ── list_properties ──────────────────────────────────────────────────────────
|
|
209
|
-
describe("list_properties — success path", () => {
|
|
210
|
-
test("returns properties list with total", async () => {
|
|
211
|
-
const server = await makeServer(makeSuccessClient);
|
|
212
|
-
const tool = server.tools.get("list_properties");
|
|
213
|
-
const result = await tool.handler({});
|
|
214
|
-
assert.ok(!result.isError);
|
|
215
|
-
const sc = result.structuredContent;
|
|
216
|
-
assert.ok(Array.isArray(sc["data"]));
|
|
217
|
-
assert.equal(sc["total"], 1);
|
|
218
|
-
});
|
|
219
|
-
test("first property has expected fields", async () => {
|
|
220
|
-
const server = await makeServer(makeSuccessClient);
|
|
221
|
-
const tool = server.tools.get("list_properties");
|
|
222
|
-
const result = await tool.handler({});
|
|
223
|
-
const first = result.structuredContent["data"][0];
|
|
224
|
-
assert.equal(first["id"], "prop_xyz");
|
|
225
|
-
assert.equal(first["name"], "Casa Marina");
|
|
226
|
-
assert.equal(first["capacity"], 4);
|
|
227
|
-
assert.equal(first["licenseNumber"], "VV-TF-12345");
|
|
228
|
-
assert.equal(first["isActive"], true);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
// ── sync_channel ─────────────────────────────────────────────────────────────
|
|
232
|
-
describe("sync_channel — success path", () => {
|
|
233
|
-
test("returns sync status with counts", async () => {
|
|
234
|
-
const server = await makeServer(makeSuccessClient);
|
|
235
|
-
const tool = server.tools.get("sync_channel");
|
|
236
|
-
const result = await tool.handler({ channelId: "ch_airbnb_001", direction: "both" });
|
|
237
|
-
assert.ok(!result.isError);
|
|
238
|
-
const sc = result.structuredContent;
|
|
239
|
-
assert.equal(sc["channelId"], "ch_airbnb_001");
|
|
240
|
-
assert.equal(sc["status"], "ok");
|
|
241
|
-
assert.equal(sc["pulledCount"], 3);
|
|
242
|
-
assert.equal(sc["pushedCount"], 1);
|
|
243
|
-
assert.ok(typeof sc["lastSyncAt"] === "string");
|
|
244
|
-
});
|
|
245
|
-
test("direction defaults to both (omitted in input)", async () => {
|
|
246
|
-
const server = await makeServer(makeSuccessClient);
|
|
247
|
-
const tool = server.tools.get("sync_channel");
|
|
248
|
-
// direction is optional — tool should still call syncChannel with "both"
|
|
249
|
-
const result = await tool.handler({ channelId: "ch_booking_002" });
|
|
250
|
-
assert.ok(!result.isError);
|
|
251
|
-
});
|
|
252
|
-
test("404 error propagates as isError=true", async () => {
|
|
253
|
-
const server = await makeServer(make404Client);
|
|
254
|
-
const tool = server.tools.get("sync_channel");
|
|
255
|
-
const result = await tool.handler({ channelId: "ch_missing" });
|
|
256
|
-
assert.ok(result.isError, "should be an error on 404");
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
//# sourceMappingURL=stay-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stay-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/stay-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAwBxC,MAAM,aAAa;IACjB,KAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE/C,YAAY,CAAC,IAAY,EAAE,MAAkB,EAAE,OAAoB;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG;IACvB,EAAE,EAAE,YAAY;IAChB,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,GAAG;IAChB,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,sBAAsB;CAClC,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,IAAI,EAAE,CAAC,gBAAgB,CAAC;IACxB,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE;IACvE,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE,aAAa;IAC5B,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,sBAAsB;CAClC,CAAC;AAEF,MAAM,oBAAoB,GAAG;IAC3B,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,sBAAsB;CACnC,CAAC;AAEF,SAAS,iBAAiB;IACxB,OAAO;QACL,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,sBAAsB;QACpD,cAAc,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,gBAAgB;QACvD,iBAAiB,EAAE,KAAK,EAAE,KAA8B,EAAE,EAAE,CAAC,gBAAgB;QAC7E,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,oBAAoB;QAChD,WAAW,EAAE,KAAK,EAAE,UAAkB,EAAE,UAAoC,EAAE,EAAE,CAAC,gBAAgB;KACrC,CAAC;AACjE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,OAAO;QACL,gBAAgB,EAAE,QAAQ;QAC1B,cAAc,EAAE,QAAQ;QACxB,iBAAiB,EAAE,QAAQ;QAC3B,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,QAAQ;KACuC,CAAC;AACjE,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,UAAU,CACvB,QAA8D;IAE9D,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/D,iBAAiB,CACf,MAAgF,EAChF,QAAQ,EAAE,CACX,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,MAAqB,CAAC;IAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,kCAAkC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,mCAAmC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAE5D,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAE,EAAE,CAAC,MAAM,CAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,KAAK,GAAI,EAAE,CAAC,MAAM,CAA+B,CAAC,CAAC,CAAE,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAE,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAEzD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,wCAAwC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAE,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAE,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAI,MAAM,CAAC,iBAAkB,CAAC,MAAM,CAA+B,CAAC,CAAC,CAAE,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAErF,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAkB,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QAC/C,yEAAyE;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Team Management MCP tools — Wave Mature 3 (4 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
-
* Run: npm test (after build)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 4 team tools registered
|
|
9
|
-
* 2. list_team_members — success path + structuredContent shape
|
|
10
|
-
* 3. list_team_members — role filter accepted
|
|
11
|
-
* 4. invite_team_member — success path
|
|
12
|
-
* 5. update_team_member_role — success path
|
|
13
|
-
* 6. remove_team_member — confirm=false gate
|
|
14
|
-
* 7. remove_team_member — confirm=true success path
|
|
15
|
-
* 8. API error — 404 propagated as isError=true
|
|
16
|
-
*/
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=team-tools.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"team-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/team-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Team Management MCP tools — Wave Mature 3 (4 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
-
* Run: npm test (after build)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 4 team tools registered
|
|
9
|
-
* 2. list_team_members — success path + structuredContent shape
|
|
10
|
-
* 3. list_team_members — role filter accepted
|
|
11
|
-
* 4. invite_team_member — success path
|
|
12
|
-
* 5. update_team_member_role — success path
|
|
13
|
-
* 6. remove_team_member — confirm=false gate
|
|
14
|
-
* 7. remove_team_member — confirm=true success path
|
|
15
|
-
* 8. API error — 404 propagated as isError=true
|
|
16
|
-
*/
|
|
17
|
-
import { test, describe, beforeEach } from "node:test";
|
|
18
|
-
import assert from "node:assert/strict";
|
|
19
|
-
class StubMcpServer {
|
|
20
|
-
tools = new Map();
|
|
21
|
-
registerTool(name, config, handler) {
|
|
22
|
-
this.tools.set(name, { name, config, handler });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// ── Mock data ────────────────────────────────────────────────────────────────
|
|
26
|
-
const MOCK_MEMBER = {
|
|
27
|
-
id: "mbr_abc123",
|
|
28
|
-
name: "Ana Aurora",
|
|
29
|
-
email: "ana@example.com",
|
|
30
|
-
role: "member",
|
|
31
|
-
status: "active",
|
|
32
|
-
joinedAt: "2026-01-15T10:00:00Z",
|
|
33
|
-
createdAt: "2026-01-15T10:00:00Z",
|
|
34
|
-
};
|
|
35
|
-
const MOCK_PENDING_MEMBER = {
|
|
36
|
-
id: "mbr_def456",
|
|
37
|
-
name: "Carlos Nuevo",
|
|
38
|
-
email: "carlos@example.com",
|
|
39
|
-
role: "viewer",
|
|
40
|
-
status: "pending",
|
|
41
|
-
invitedAt: "2026-05-10T09:00:00Z",
|
|
42
|
-
};
|
|
43
|
-
const MOCK_MEMBERS_LIST = {
|
|
44
|
-
data: [MOCK_MEMBER, MOCK_PENDING_MEMBER],
|
|
45
|
-
total: 2,
|
|
46
|
-
limit: 20,
|
|
47
|
-
offset: 0,
|
|
48
|
-
};
|
|
49
|
-
const MOCK_ACTION_RESULT = {
|
|
50
|
-
success: true,
|
|
51
|
-
id: "mbr_abc123",
|
|
52
|
-
message: "Operation completed",
|
|
53
|
-
};
|
|
54
|
-
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
55
|
-
function makeSuccessClient() {
|
|
56
|
-
return {
|
|
57
|
-
listTeamMembers: async () => MOCK_MEMBERS_LIST,
|
|
58
|
-
inviteTeamMember: async (_data) => MOCK_PENDING_MEMBER,
|
|
59
|
-
updateTeamMemberRole: async (_id, _role) => MOCK_ACTION_RESULT,
|
|
60
|
-
removeTeamMember: async (_id) => undefined,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function make404Client() {
|
|
64
|
-
const notFound = () => {
|
|
65
|
-
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
66
|
-
return Promise.reject(err);
|
|
67
|
-
};
|
|
68
|
-
return {
|
|
69
|
-
listTeamMembers: notFound,
|
|
70
|
-
inviteTeamMember: notFound,
|
|
71
|
-
updateTeamMemberRole: notFound,
|
|
72
|
-
removeTeamMember: notFound,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
// ── Helper ───────────────────────────────────────────────────────────────────
|
|
76
|
-
async function makeServer(clientFn) {
|
|
77
|
-
const server = new StubMcpServer();
|
|
78
|
-
const { registerTeamTools } = await import("../tools/team.js");
|
|
79
|
-
registerTeamTools(server, clientFn());
|
|
80
|
-
return server;
|
|
81
|
-
}
|
|
82
|
-
// ── Registration tests ───────────────────────────────────────────────────────
|
|
83
|
-
describe("Team Tools — Registration", () => {
|
|
84
|
-
let server;
|
|
85
|
-
beforeEach(async () => {
|
|
86
|
-
server = await makeServer(makeSuccessClient);
|
|
87
|
-
});
|
|
88
|
-
test("registers exactly 4 team tools", () => {
|
|
89
|
-
assert.equal(server.tools.size, 4);
|
|
90
|
-
});
|
|
91
|
-
test("registers list_team_members", () => {
|
|
92
|
-
assert.ok(server.tools.has("list_team_members"));
|
|
93
|
-
});
|
|
94
|
-
test("registers invite_team_member", () => {
|
|
95
|
-
assert.ok(server.tools.has("invite_team_member"));
|
|
96
|
-
});
|
|
97
|
-
test("registers update_team_member_role", () => {
|
|
98
|
-
assert.ok(server.tools.has("update_team_member_role"));
|
|
99
|
-
});
|
|
100
|
-
test("registers remove_team_member", () => {
|
|
101
|
-
assert.ok(server.tools.has("remove_team_member"));
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
// ── list_team_members ────────────────────────────────────────────────────────
|
|
105
|
-
describe("list_team_members — success path", () => {
|
|
106
|
-
test("returns structuredContent with data array", async () => {
|
|
107
|
-
const server = await makeServer(makeSuccessClient);
|
|
108
|
-
const tool = server.tools.get("list_team_members");
|
|
109
|
-
const result = await tool.handler({});
|
|
110
|
-
assert.ok(!result.isError);
|
|
111
|
-
const sc = result.structuredContent;
|
|
112
|
-
assert.ok(Array.isArray(sc["data"]));
|
|
113
|
-
assert.equal(sc["total"], 2);
|
|
114
|
-
});
|
|
115
|
-
test("first member has expected fields", async () => {
|
|
116
|
-
const server = await makeServer(makeSuccessClient);
|
|
117
|
-
const tool = server.tools.get("list_team_members");
|
|
118
|
-
const result = await tool.handler({});
|
|
119
|
-
const first = result.structuredContent["data"][0];
|
|
120
|
-
assert.equal(first["id"], "mbr_abc123");
|
|
121
|
-
assert.equal(first["email"], "ana@example.com");
|
|
122
|
-
assert.equal(first["role"], "member");
|
|
123
|
-
assert.equal(first["status"], "active");
|
|
124
|
-
});
|
|
125
|
-
test("content block has type text and mentions team_members", async () => {
|
|
126
|
-
const server = await makeServer(makeSuccessClient);
|
|
127
|
-
const tool = server.tools.get("list_team_members");
|
|
128
|
-
const result = await tool.handler({});
|
|
129
|
-
assert.equal(result.content[0].type, "text");
|
|
130
|
-
assert.ok(result.content[0].text.includes("team_members"));
|
|
131
|
-
});
|
|
132
|
-
test("role filter accepted without error", async () => {
|
|
133
|
-
const server = await makeServer(makeSuccessClient);
|
|
134
|
-
const tool = server.tools.get("list_team_members");
|
|
135
|
-
const result = await tool.handler({ role: "admin" });
|
|
136
|
-
assert.ok(!result.isError);
|
|
137
|
-
});
|
|
138
|
-
test("status=pending filter accepted without error", async () => {
|
|
139
|
-
const server = await makeServer(makeSuccessClient);
|
|
140
|
-
const tool = server.tools.get("list_team_members");
|
|
141
|
-
const result = await tool.handler({ status: "pending" });
|
|
142
|
-
assert.ok(!result.isError);
|
|
143
|
-
});
|
|
144
|
-
test("404 propagates as isError=true", async () => {
|
|
145
|
-
const server = await makeServer(make404Client);
|
|
146
|
-
const tool = server.tools.get("list_team_members");
|
|
147
|
-
const result = await tool.handler({});
|
|
148
|
-
assert.ok(result.isError);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
// ── invite_team_member ───────────────────────────────────────────────────────
|
|
152
|
-
describe("invite_team_member — success path", () => {
|
|
153
|
-
test("returns invited member with expected fields", async () => {
|
|
154
|
-
const server = await makeServer(makeSuccessClient);
|
|
155
|
-
const tool = server.tools.get("invite_team_member");
|
|
156
|
-
const result = await tool.handler({ email: "carlos@example.com", role: "viewer" });
|
|
157
|
-
assert.ok(!result.isError);
|
|
158
|
-
const sc = result.structuredContent;
|
|
159
|
-
assert.equal(sc["email"], "carlos@example.com");
|
|
160
|
-
assert.equal(sc["status"], "pending");
|
|
161
|
-
});
|
|
162
|
-
test("content block mentions invited", async () => {
|
|
163
|
-
const server = await makeServer(makeSuccessClient);
|
|
164
|
-
const tool = server.tools.get("invite_team_member");
|
|
165
|
-
const result = await tool.handler({ email: "test@example.com", role: "member" });
|
|
166
|
-
assert.ok(result.content[0].text.includes("invited"));
|
|
167
|
-
});
|
|
168
|
-
test("invite with name accepted without error", async () => {
|
|
169
|
-
const server = await makeServer(makeSuccessClient);
|
|
170
|
-
const tool = server.tools.get("invite_team_member");
|
|
171
|
-
const result = await tool.handler({ email: "newuser@example.com", role: "admin", name: "New User" });
|
|
172
|
-
assert.ok(!result.isError);
|
|
173
|
-
});
|
|
174
|
-
test("404 propagates as isError=true", async () => {
|
|
175
|
-
const server = await makeServer(make404Client);
|
|
176
|
-
const tool = server.tools.get("invite_team_member");
|
|
177
|
-
const result = await tool.handler({ email: "test@example.com", role: "member" });
|
|
178
|
-
assert.ok(result.isError);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
// ── update_team_member_role ──────────────────────────────────────────────────
|
|
182
|
-
describe("update_team_member_role — success path", () => {
|
|
183
|
-
test("returns action result with success=true", async () => {
|
|
184
|
-
const server = await makeServer(makeSuccessClient);
|
|
185
|
-
const tool = server.tools.get("update_team_member_role");
|
|
186
|
-
const result = await tool.handler({ memberId: "mbr_abc123", role: "admin" });
|
|
187
|
-
assert.ok(!result.isError);
|
|
188
|
-
const sc = result.structuredContent;
|
|
189
|
-
assert.equal(sc["success"], true);
|
|
190
|
-
});
|
|
191
|
-
test("content block mentions role updated", async () => {
|
|
192
|
-
const server = await makeServer(makeSuccessClient);
|
|
193
|
-
const tool = server.tools.get("update_team_member_role");
|
|
194
|
-
const result = await tool.handler({ memberId: "mbr_abc123", role: "viewer" });
|
|
195
|
-
assert.ok(result.content[0].text.includes("updated"));
|
|
196
|
-
});
|
|
197
|
-
test("404 propagates as isError=true", async () => {
|
|
198
|
-
const server = await makeServer(make404Client);
|
|
199
|
-
const tool = server.tools.get("update_team_member_role");
|
|
200
|
-
const result = await tool.handler({ memberId: "mbr_missing", role: "member" });
|
|
201
|
-
assert.ok(result.isError);
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
// ── remove_team_member ───────────────────────────────────────────────────────
|
|
205
|
-
describe("remove_team_member — trust area gate", () => {
|
|
206
|
-
test("confirm=false returns isError=true without calling API", async () => {
|
|
207
|
-
const server = await makeServer(makeSuccessClient);
|
|
208
|
-
const tool = server.tools.get("remove_team_member");
|
|
209
|
-
const result = await tool.handler({ memberId: "mbr_abc123", confirm: false });
|
|
210
|
-
assert.ok(result.isError);
|
|
211
|
-
assert.ok(result.content[0].text.includes("confirm=true"));
|
|
212
|
-
});
|
|
213
|
-
test("confirm=true succeeds and returns success=true with id", async () => {
|
|
214
|
-
const server = await makeServer(makeSuccessClient);
|
|
215
|
-
const tool = server.tools.get("remove_team_member");
|
|
216
|
-
const result = await tool.handler({ memberId: "mbr_abc123", confirm: true });
|
|
217
|
-
assert.ok(!result.isError);
|
|
218
|
-
assert.equal(result.structuredContent["success"], true);
|
|
219
|
-
assert.equal(result.structuredContent["id"], "mbr_abc123");
|
|
220
|
-
});
|
|
221
|
-
test("confirm=true with 404 propagates isError=true", async () => {
|
|
222
|
-
const server = await makeServer(make404Client);
|
|
223
|
-
const tool = server.tools.get("remove_team_member");
|
|
224
|
-
const result = await tool.handler({ memberId: "mbr_missing", confirm: true });
|
|
225
|
-
assert.ok(result.isError);
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
//# sourceMappingURL=team-tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"team-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/team-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Time Tracking MCP tools — Wave Mature 3 (6 tools).
|
|
3
|
-
*
|
|
4
|
-
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
-
* Run: npm test (after build)
|
|
6
|
-
*
|
|
7
|
-
* Coverage:
|
|
8
|
-
* 1. Tool registration — all 6 time tools registered
|
|
9
|
-
* 2. list_time_entries — success path + structuredContent shape
|
|
10
|
-
* 3. get_time_entry — success path
|
|
11
|
-
* 4. create_time_entry — success path
|
|
12
|
-
* 5. update_time_entry — success path + partial update
|
|
13
|
-
* 6. delete_time_entry — confirm=false gate
|
|
14
|
-
* 7. delete_time_entry — confirm=true success path
|
|
15
|
-
* 8. get_time_summary — success path + aggregation fields
|
|
16
|
-
* 9. API error — 404 propagated as isError=true
|
|
17
|
-
*/
|
|
18
|
-
export {};
|
|
19
|
-
//# sourceMappingURL=time-tools.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"time-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/time-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|