@atlas-kitchen/atlas-mcp 1.0.2 → 1.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/.env.example +7 -3
- package/CLAUDE.md +72 -63
- package/README.md +85 -102
- package/dist/auth.d.ts +1 -7
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +1 -26
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +9 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +117 -806
- package/dist/client.js.map +1 -1
- package/dist/index.js +112 -57
- package/dist/index.js.map +1 -1
- package/dist/token-cache.d.ts +11 -0
- package/dist/token-cache.d.ts.map +1 -0
- package/dist/token-cache.js +34 -0
- package/dist/token-cache.js.map +1 -0
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +74 -84
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/menu.d.ts +1 -2
- package/dist/tools/menu.d.ts.map +1 -1
- package/dist/tools/menu.js +6 -121
- package/dist/tools/menu.js.map +1 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +29 -41
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/reports.d.ts +1 -2
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +24 -82
- package/dist/tools/reports.js.map +1 -1
- package/dist/types/atlas.d.ts +4 -0
- package/dist/types/atlas.d.ts.map +1 -1
- package/package.json +12 -2
- package/dist/polyfills.d.ts +0 -2
- package/dist/polyfills.d.ts.map +0 -1
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,OAAO,WAAW;IACd,gBAAgB,CAAgB;IAChC,aAAa,CAAgB;IAC7B,WAAW,CAAc;IACzB,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,62 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
// Check Node.js version before proceeding
|
|
3
|
+
const nodeVersion = process.versions.node;
|
|
4
|
+
const major = parseInt(nodeVersion.split('.')[0], 10);
|
|
5
|
+
if (major < 18) {
|
|
6
|
+
console.error(`Error: Node.js version ${nodeVersion} is not supported.`);
|
|
7
|
+
console.error('This package requires Node.js 18.0.0 or higher.');
|
|
8
|
+
console.error('Please upgrade your Node.js version.');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
2
11
|
// Load environment variables before any other imports
|
|
3
12
|
import dotenv from 'dotenv';
|
|
4
13
|
dotenv.config();
|
|
5
|
-
//
|
|
6
|
-
if (typeof Headers === 'undefined') {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (init) {
|
|
12
|
-
if (Array.isArray(init)) {
|
|
13
|
-
init.forEach(([key, value]) => {
|
|
14
|
-
this.headers[key.toLowerCase()] = value;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
Object.entries(init).forEach(([key, value]) => {
|
|
19
|
-
this.headers[key.toLowerCase()] = value;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
append(key, value) {
|
|
25
|
-
this.headers[key.toLowerCase()] = value;
|
|
26
|
-
}
|
|
27
|
-
get(key) {
|
|
28
|
-
return this.headers[key.toLowerCase()];
|
|
29
|
-
}
|
|
30
|
-
set(key, value) {
|
|
31
|
-
this.headers[key.toLowerCase()] = value;
|
|
32
|
-
}
|
|
33
|
-
has(key) {
|
|
34
|
-
return key.toLowerCase() in this.headers;
|
|
35
|
-
}
|
|
36
|
-
delete(key) {
|
|
37
|
-
delete this.headers[key.toLowerCase()];
|
|
38
|
-
}
|
|
39
|
-
forEach(callback) {
|
|
40
|
-
Object.entries(this.headers).forEach(([key, value]) => {
|
|
41
|
-
callback(value, key);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
entries() {
|
|
45
|
-
return Object.entries(this.headers);
|
|
46
|
-
}
|
|
47
|
-
keys() {
|
|
48
|
-
return Object.keys(this.headers);
|
|
49
|
-
}
|
|
50
|
-
values() {
|
|
51
|
-
return Object.values(this.headers);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
14
|
+
// Verify that fetch and Headers are available
|
|
15
|
+
if (typeof fetch === 'undefined' || typeof Headers === 'undefined') {
|
|
16
|
+
console.error('Error: fetch or Headers API is not available.');
|
|
17
|
+
console.error('Please ensure you are using Node.js 18.0.0 or higher with --experimental-fetch flag if needed.');
|
|
18
|
+
console.error(`Current Node.js version: ${nodeVersion}`);
|
|
19
|
+
process.exit(1);
|
|
54
20
|
}
|
|
55
21
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
56
22
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
57
23
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
58
24
|
import { AuthManager } from './auth.js';
|
|
59
25
|
import { AtlasClient } from './client.js';
|
|
26
|
+
import { saveCache, loadCache, clearCache } from './token-cache.js';
|
|
60
27
|
import { createAuthTools } from './tools/auth.js';
|
|
61
28
|
import { createOrderTools } from './tools/orders.js';
|
|
62
29
|
import { createMenuTools } from './tools/menu.js';
|
|
@@ -69,17 +36,74 @@ const server = new Server({
|
|
|
69
36
|
tools: {},
|
|
70
37
|
},
|
|
71
38
|
});
|
|
72
|
-
// Initialize auth manager and client
|
|
73
39
|
const authManager = new AuthManager();
|
|
74
40
|
const atlasClient = new AtlasClient(authManager);
|
|
75
|
-
//
|
|
41
|
+
// --- Auth helpers ---
|
|
42
|
+
async function authenticate() {
|
|
43
|
+
const apiKey = process.env.ATLAS_API_KEY;
|
|
44
|
+
if (!apiKey) {
|
|
45
|
+
console.error('ATLAS_API_KEY is not set. Authentication will not be attempted.');
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const result = await atlasClient.apiKeyLogin(apiKey);
|
|
50
|
+
authManager.setTokens({
|
|
51
|
+
accessToken: result.accessToken,
|
|
52
|
+
refreshToken: result.refreshToken,
|
|
53
|
+
});
|
|
54
|
+
// Persist tokens (and existing context if any)
|
|
55
|
+
const cached = loadCache();
|
|
56
|
+
saveCache({
|
|
57
|
+
accessToken: result.accessToken,
|
|
58
|
+
refreshToken: result.refreshToken,
|
|
59
|
+
merchantId: cached?.merchantId,
|
|
60
|
+
outletId: cached?.outletId,
|
|
61
|
+
});
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('API key authentication failed:', error.message);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function tryRefreshToken() {
|
|
70
|
+
const tokens = authManager.getTokens();
|
|
71
|
+
if (!tokens?.refreshToken)
|
|
72
|
+
return false;
|
|
73
|
+
try {
|
|
74
|
+
const result = await atlasClient.refreshToken(tokens.refreshToken);
|
|
75
|
+
authManager.setTokens({
|
|
76
|
+
accessToken: result.accessToken,
|
|
77
|
+
refreshToken: result.refreshToken,
|
|
78
|
+
});
|
|
79
|
+
const cached = loadCache();
|
|
80
|
+
saveCache({
|
|
81
|
+
accessToken: result.accessToken,
|
|
82
|
+
refreshToken: result.refreshToken,
|
|
83
|
+
merchantId: cached?.merchantId,
|
|
84
|
+
outletId: cached?.outletId,
|
|
85
|
+
});
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Wire auto-recovery: refresh → re-auth with API key
|
|
93
|
+
atlasClient.onAuthFailure = async () => {
|
|
94
|
+
const refreshed = await tryRefreshToken();
|
|
95
|
+
if (refreshed)
|
|
96
|
+
return true;
|
|
97
|
+
clearCache();
|
|
98
|
+
return await authenticate();
|
|
99
|
+
};
|
|
100
|
+
// --- Tool registration ---
|
|
76
101
|
const allTools = [
|
|
77
102
|
...createAuthTools(atlasClient, authManager),
|
|
78
103
|
...createOrderTools(atlasClient, authManager),
|
|
79
|
-
...createMenuTools(atlasClient
|
|
80
|
-
...createReportingTools(atlasClient
|
|
104
|
+
...createMenuTools(atlasClient),
|
|
105
|
+
...createReportingTools(atlasClient),
|
|
81
106
|
];
|
|
82
|
-
// Handle tool calls
|
|
83
107
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
84
108
|
const tool = allTools.find(t => t.name === request.params.name);
|
|
85
109
|
if (!tool) {
|
|
@@ -109,7 +133,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
109
133
|
};
|
|
110
134
|
}
|
|
111
135
|
});
|
|
112
|
-
// Handle tool list requests
|
|
113
136
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
114
137
|
return {
|
|
115
138
|
tools: allTools.map(tool => ({
|
|
@@ -119,11 +142,43 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
119
142
|
})),
|
|
120
143
|
};
|
|
121
144
|
});
|
|
122
|
-
//
|
|
145
|
+
// --- Startup ---
|
|
123
146
|
async function main() {
|
|
147
|
+
// 1. Try loading cached tokens + context
|
|
148
|
+
const cached = loadCache();
|
|
149
|
+
if (cached) {
|
|
150
|
+
authManager.setTokens({
|
|
151
|
+
accessToken: cached.accessToken,
|
|
152
|
+
refreshToken: cached.refreshToken,
|
|
153
|
+
});
|
|
154
|
+
if (cached.merchantId) {
|
|
155
|
+
authManager.setMerchantContext(cached.merchantId, cached.outletId);
|
|
156
|
+
}
|
|
157
|
+
console.error('Loaded cached tokens and context.');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// 2. No cache — authenticate with API key
|
|
161
|
+
const ok = await authenticate();
|
|
162
|
+
if (ok) {
|
|
163
|
+
console.error('Authenticated with API key.');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// 3. Override merchant context from env vars (first run only — if no cached context)
|
|
167
|
+
if (!authManager.getMerchantId() && process.env.ATLAS_MERCHANT_ID) {
|
|
168
|
+
authManager.setMerchantContext(process.env.ATLAS_MERCHANT_ID, process.env.ATLAS_OUTLET_ID);
|
|
169
|
+
// Persist the env-derived context
|
|
170
|
+
const tokens = authManager.getTokens();
|
|
171
|
+
if (tokens) {
|
|
172
|
+
saveCache({
|
|
173
|
+
accessToken: tokens.accessToken,
|
|
174
|
+
refreshToken: tokens.refreshToken,
|
|
175
|
+
merchantId: process.env.ATLAS_MERCHANT_ID,
|
|
176
|
+
outletId: process.env.ATLAS_OUTLET_ID,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
124
180
|
const transport = new StdioServerTransport();
|
|
125
181
|
await server.connect(transport);
|
|
126
|
-
// Keep the process alive
|
|
127
182
|
process.stdin.resume();
|
|
128
183
|
}
|
|
129
184
|
main().catch((error) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface CachedData {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
merchantId?: string;
|
|
5
|
+
outletId?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function saveCache(data: CachedData): void;
|
|
8
|
+
export declare function loadCache(): CachedData | null;
|
|
9
|
+
export declare function clearCache(): void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=token-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-cache.d.ts","sourceRoot":"","sources":["../src/token-cache.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAGhD;AAED,wBAAgB,SAAS,IAAI,UAAU,GAAG,IAAI,CAW7C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
const CACHE_DIR = join(homedir(), '.atlas-mcp');
|
|
5
|
+
const CACHE_FILE = join(CACHE_DIR, 'cache.json');
|
|
6
|
+
function ensureDir() {
|
|
7
|
+
mkdirSync(CACHE_DIR, { recursive: true, mode: 0o700 });
|
|
8
|
+
}
|
|
9
|
+
export function saveCache(data) {
|
|
10
|
+
ensureDir();
|
|
11
|
+
writeFileSync(CACHE_FILE, JSON.stringify(data), { mode: 0o600 });
|
|
12
|
+
}
|
|
13
|
+
export function loadCache() {
|
|
14
|
+
try {
|
|
15
|
+
const raw = readFileSync(CACHE_FILE, 'utf-8');
|
|
16
|
+
const data = JSON.parse(raw);
|
|
17
|
+
if (data && typeof data.accessToken === 'string' && typeof data.refreshToken === 'string') {
|
|
18
|
+
return data;
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function clearCache() {
|
|
27
|
+
try {
|
|
28
|
+
unlinkSync(CACHE_FILE);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ignore if file doesn't exist
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=token-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-cache.js","sourceRoot":"","sources":["../src/token-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAS7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEjD,SAAS,SAAS;IAChB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC1F,OAAO,IAAkB,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,UAAU,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
package/dist/tools/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAOD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,EAAE,CAuJrF"}
|
package/dist/tools/auth.js
CHANGED
|
@@ -1,152 +1,142 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
email: z.string().email(),
|
|
4
|
-
password: z.string(),
|
|
5
|
-
});
|
|
6
|
-
const RefreshTokenSchema = z.object({
|
|
7
|
-
refreshToken: z.string().optional(),
|
|
8
|
-
});
|
|
2
|
+
import { saveCache, loadCache } from '../token-cache.js';
|
|
9
3
|
const SwitchMerchantSchema = z.object({
|
|
10
|
-
|
|
4
|
+
merchant: z.string(),
|
|
11
5
|
outletId: z.string().optional(),
|
|
12
|
-
brandId: z.string().optional(),
|
|
13
6
|
});
|
|
14
7
|
export function createAuthTools(client, authManager) {
|
|
15
8
|
return [
|
|
16
9
|
{
|
|
17
|
-
name: '
|
|
18
|
-
description: '
|
|
10
|
+
name: 'atlas_switch_merchant',
|
|
11
|
+
description: 'Switch active merchant context. Accepts a merchant name, identifier, or ID - fuzzy matching is supported. Optionally set an outlet ID for POS operations.',
|
|
19
12
|
inputSchema: {
|
|
20
13
|
type: 'object',
|
|
21
14
|
properties: {
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
merchant: { type: 'string', description: 'Merchant name, identifier, or ID to switch to (fuzzy matched)' },
|
|
16
|
+
outletId: { type: 'string', description: 'Outlet ID (optional)' },
|
|
24
17
|
},
|
|
25
|
-
required: ['
|
|
18
|
+
required: ['merchant'],
|
|
26
19
|
},
|
|
27
20
|
handler: async (input) => {
|
|
28
|
-
const {
|
|
21
|
+
const { merchant, outletId } = SwitchMerchantSchema.parse(input);
|
|
29
22
|
try {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
23
|
+
const merchants = await client.getMerchants();
|
|
24
|
+
const needle = merchant.toLowerCase();
|
|
25
|
+
// Try exact match first (id or identifier), then fuzzy name match
|
|
26
|
+
const match = merchants.find((m) => m.id === merchant ||
|
|
27
|
+
m.identifier === merchant ||
|
|
28
|
+
m.identifier?.toLowerCase() === needle ||
|
|
29
|
+
m.name?.toLowerCase() === needle) || merchants.find((m) => m.name?.toLowerCase().includes(needle) ||
|
|
30
|
+
m.identifier?.toLowerCase().includes(needle) ||
|
|
31
|
+
m.brandAndEntityNames?.some((b) => b.toLowerCase().includes(needle)));
|
|
32
|
+
if (!match) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: `No merchant matching "${merchant}". Available merchants: ${merchants.map((m) => `${m.name} (${m.identifier})`).join(', ')}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
authManager.setMerchantContext(match.identifier, outletId);
|
|
39
|
+
// Persist context to cache
|
|
40
|
+
const tokens = authManager.getTokens();
|
|
41
|
+
if (tokens) {
|
|
42
|
+
saveCache({
|
|
43
|
+
accessToken: tokens.accessToken,
|
|
44
|
+
refreshToken: tokens.refreshToken,
|
|
45
|
+
merchantId: match.identifier,
|
|
46
|
+
outletId: outletId,
|
|
47
|
+
});
|
|
39
48
|
}
|
|
40
49
|
return {
|
|
41
50
|
success: true,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
message: `Switched to merchant: ${match.name} (${match.identifier})`,
|
|
52
|
+
context: {
|
|
53
|
+
merchantId: match.id,
|
|
54
|
+
merchantName: match.name,
|
|
55
|
+
merchantIdentifier: match.identifier,
|
|
56
|
+
outletId: authManager.getOutletId(),
|
|
57
|
+
},
|
|
45
58
|
};
|
|
46
59
|
}
|
|
47
60
|
catch (error) {
|
|
48
61
|
return {
|
|
49
62
|
success: false,
|
|
50
|
-
error: error.message || '
|
|
63
|
+
error: error.message || 'Failed to switch merchant',
|
|
51
64
|
};
|
|
52
65
|
}
|
|
53
66
|
},
|
|
54
67
|
},
|
|
55
68
|
{
|
|
56
|
-
name: '
|
|
57
|
-
description: '
|
|
69
|
+
name: 'atlas_list_merchants',
|
|
70
|
+
description: 'List all merchants the authenticated user can access, showing each merchant\'s name, identifier, and ID. Use this to find the right merchant before calling atlas_switch_merchant.',
|
|
58
71
|
inputSchema: {
|
|
59
72
|
type: 'object',
|
|
60
73
|
properties: {},
|
|
61
74
|
},
|
|
62
75
|
handler: async () => {
|
|
63
76
|
try {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
authManager.clear();
|
|
77
|
+
const merchants = await client.getMerchants();
|
|
78
|
+
const currentMerchantId = authManager.getMerchantId();
|
|
68
79
|
return {
|
|
69
80
|
success: true,
|
|
70
|
-
|
|
81
|
+
currentMerchantId,
|
|
82
|
+
merchants: merchants.map((m) => ({
|
|
83
|
+
id: m.id,
|
|
84
|
+
name: m.name,
|
|
85
|
+
identifier: m.identifier,
|
|
86
|
+
brandAndEntityNames: m.brandAndEntityNames,
|
|
87
|
+
})),
|
|
71
88
|
};
|
|
72
89
|
}
|
|
73
90
|
catch (error) {
|
|
74
|
-
// Even if logout fails, clear local auth
|
|
75
|
-
authManager.clear();
|
|
76
91
|
return {
|
|
77
|
-
success:
|
|
78
|
-
|
|
92
|
+
success: false,
|
|
93
|
+
error: error.message || 'Failed to list merchants',
|
|
79
94
|
};
|
|
80
95
|
}
|
|
81
96
|
},
|
|
82
97
|
},
|
|
83
98
|
{
|
|
84
|
-
name: '
|
|
85
|
-
description: '
|
|
99
|
+
name: 'atlas_list_outlets',
|
|
100
|
+
description: 'List all outlets for the current merchant, showing each outlet\'s id, identifier, label, archived status, and config. Use this to find outlet IDs for operations that require a specific outlet context.',
|
|
86
101
|
inputSchema: {
|
|
87
102
|
type: 'object',
|
|
88
|
-
properties: {
|
|
89
|
-
refreshToken: { type: 'string', description: 'Refresh token (uses stored token if not provided)' },
|
|
90
|
-
},
|
|
103
|
+
properties: {},
|
|
91
104
|
},
|
|
92
|
-
handler: async (
|
|
93
|
-
const { refreshToken } = RefreshTokenSchema.parse(input);
|
|
105
|
+
handler: async () => {
|
|
94
106
|
try {
|
|
95
|
-
const
|
|
96
|
-
if (!tokenToUse) {
|
|
97
|
-
return {
|
|
98
|
-
success: false,
|
|
99
|
-
error: 'No refresh token available',
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
const response = await client.refreshToken(tokenToUse);
|
|
103
|
-
// Update tokens
|
|
104
|
-
authManager.setTokens({
|
|
105
|
-
accessToken: response.accessToken,
|
|
106
|
-
refreshToken: response.refreshToken,
|
|
107
|
-
});
|
|
107
|
+
const outlets = await client.getOutlets();
|
|
108
108
|
return {
|
|
109
109
|
success: true,
|
|
110
|
-
|
|
110
|
+
outlets,
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
catch (error) {
|
|
114
114
|
return {
|
|
115
115
|
success: false,
|
|
116
|
-
error: error.message || '
|
|
116
|
+
error: error.message || 'Failed to list outlets',
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
|
-
name: '
|
|
123
|
-
description: '
|
|
122
|
+
name: 'atlas_auth_status',
|
|
123
|
+
description: 'Show current authentication state, active merchant ID, outlet ID, and whether cached tokens exist. Use this to verify which merchant/outlet context is active before making API calls.',
|
|
124
124
|
inputSchema: {
|
|
125
125
|
type: 'object',
|
|
126
|
-
properties: {
|
|
127
|
-
merchantId: { type: 'string', description: 'Merchant ID to switch to' },
|
|
128
|
-
outletId: { type: 'string', description: 'Outlet ID (REQUIRED for POS operations like atlas_get_pos_carts and atlas_get_product_insights)' },
|
|
129
|
-
brandId: { type: 'string', description: 'Brand ID (optional)' },
|
|
130
|
-
},
|
|
131
|
-
required: ['merchantId'],
|
|
126
|
+
properties: {},
|
|
132
127
|
},
|
|
133
|
-
handler: async (
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
error: 'Not authenticated. Please login first.',
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
authManager.setMerchantContext(merchantId, outletId, brandId);
|
|
128
|
+
handler: async () => {
|
|
129
|
+
const authenticated = authManager.isAuthenticated();
|
|
130
|
+
const merchantId = authManager.getMerchantId();
|
|
131
|
+
const outletId = authManager.getOutletId();
|
|
132
|
+
const cached = loadCache();
|
|
142
133
|
return {
|
|
143
134
|
success: true,
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
},
|
|
135
|
+
authenticated,
|
|
136
|
+
merchantId,
|
|
137
|
+
outletId,
|
|
138
|
+
hasCachedTokens: cached !== null,
|
|
139
|
+
hasCachedContext: cached?.merchantId != null,
|
|
150
140
|
};
|
|
151
141
|
},
|
|
152
142
|
},
|
package/dist/tools/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AASzD,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,MAAmB,EAAE,WAAwB;IAC3E,OAAO;QACL;YACE,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,2JAA2J;YACxK,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;oBAC1G,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;iBAClE;gBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;aACvB;YACD,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE;gBAChC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEjE,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAEtC,kEAAkE;oBAClE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAC1B,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,EAAE,KAAK,QAAQ;wBACjB,CAAC,CAAC,UAAU,KAAK,QAAQ;wBACzB,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,MAAM;wBACtC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,MAAM,CACnC,IAAI,SAAS,CAAC,IAAI,CACjB,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;wBACtC,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAC5C,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC/E,CAAC;oBAEF,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,OAAO;4BACL,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,yBAAyB,QAAQ,2BAA2B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;yBACzI,CAAC;oBACJ,CAAC;oBAED,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBAE3D,2BAA2B;oBAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;oBACvC,IAAI,MAAM,EAAE,CAAC;wBACX,SAAS,CAAC;4BACR,WAAW,EAAE,MAAM,CAAC,WAAW;4BAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;4BACjC,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,QAAQ,EAAE,QAAQ;yBACnB,CAAC,CAAC;oBACL,CAAC;oBAED,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,yBAAyB,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,GAAG;wBACpE,OAAO,EAAE;4BACP,UAAU,EAAE,KAAK,CAAC,EAAE;4BACpB,YAAY,EAAE,KAAK,CAAC,IAAI;4BACxB,kBAAkB,EAAE,KAAK,CAAC,UAAU;4BACpC,QAAQ,EAAE,WAAW,CAAC,WAAW,EAAE;yBACpC;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,2BAA2B;qBACpD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF;QAED;YACE,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,oLAAoL;YACjM,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC9C,MAAM,iBAAiB,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;oBAEtD,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,iBAAiB;wBACjB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;4BACpC,EAAE,EAAE,CAAC,CAAC,EAAE;4BACR,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,UAAU,EAAE,CAAC,CAAC,UAAU;4BACxB,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;yBAC3C,CAAC,CAAC;qBACJ,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,0BAA0B;qBACnD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF;QAED;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,0MAA0M;YACvN,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;oBAC1C,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO;qBACR,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,wBAAwB;qBACjD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF;QAED;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,wLAAwL;YACrM,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,aAAa,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAE3B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,aAAa;oBACb,UAAU;oBACV,QAAQ;oBACR,eAAe,EAAE,MAAM,KAAK,IAAI;oBAChC,gBAAgB,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;iBAC7C,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/menu.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { AtlasClient } from '../client.js';
|
|
2
|
-
import { AuthManager } from '../auth.js';
|
|
3
2
|
interface Tool {
|
|
4
3
|
name: string;
|
|
5
4
|
description: string;
|
|
6
5
|
inputSchema: any;
|
|
7
6
|
handler: (input: unknown) => Promise<any>;
|
|
8
7
|
}
|
|
9
|
-
export declare function createMenuTools(client: AtlasClient
|
|
8
|
+
export declare function createMenuTools(client: AtlasClient): Tool[];
|
|
10
9
|
export {};
|
|
11
10
|
//# sourceMappingURL=menu.d.ts.map
|
package/dist/tools/menu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/tools/menu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/tools/menu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAUD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,CAqC3D"}
|