@assetlab/mcp-server 1.0.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.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * HTTP client for the AssetLab API Gateway.
3
+ *
4
+ * All requests go through the api-gateway edge function,
5
+ * authenticated via Bearer API key.
6
+ */
7
+ export interface AssetLabConfig {
8
+ apiUrl: string;
9
+ apiKey: string;
10
+ }
11
+ export interface PaginatedResponse<T = Record<string, unknown>> {
12
+ data: T[];
13
+ pagination: {
14
+ page: number;
15
+ per_page: number;
16
+ total: number;
17
+ total_pages: number;
18
+ };
19
+ }
20
+ export interface SingleResponse<T = Record<string, unknown>> {
21
+ data: T;
22
+ }
23
+ export declare class AssetLabClientError extends Error {
24
+ status: number;
25
+ constructor(status: number, message: string);
26
+ }
27
+ export declare class AssetLabClient {
28
+ private baseUrl;
29
+ private apiKey;
30
+ constructor(config: AssetLabConfig);
31
+ get<T = Record<string, unknown>>(path: string, params?: Record<string, string | number | undefined>): Promise<T>;
32
+ list<T = Record<string, unknown>>(resource: string, params?: Record<string, string | number | undefined>): Promise<PaginatedResponse<T>>;
33
+ getOne<T = Record<string, unknown>>(resource: string, id: string): Promise<SingleResponse<T>>;
34
+ }
35
+ export declare function loadConfig(): AssetLabConfig;
package/dist/client.js ADDED
@@ -0,0 +1,86 @@
1
+ /**
2
+ * HTTP client for the AssetLab API Gateway.
3
+ *
4
+ * All requests go through the api-gateway edge function,
5
+ * authenticated via Bearer API key.
6
+ */
7
+ export class AssetLabClientError extends Error {
8
+ status;
9
+ constructor(status, message) {
10
+ super(message);
11
+ this.name = 'AssetLabClientError';
12
+ this.status = status;
13
+ }
14
+ }
15
+ export class AssetLabClient {
16
+ baseUrl;
17
+ apiKey;
18
+ constructor(config) {
19
+ // Ensure base URL ends without trailing slash and includes /v1
20
+ let url = config.apiUrl.replace(/\/+$/, '');
21
+ if (!url.endsWith('/v1')) {
22
+ url += '/v1';
23
+ }
24
+ this.baseUrl = url;
25
+ this.apiKey = config.apiKey;
26
+ }
27
+ async get(path, params) {
28
+ const url = new URL(`${this.baseUrl}${path}`);
29
+ if (params) {
30
+ for (const [k, v] of Object.entries(params)) {
31
+ if (v !== undefined && v !== null && v !== '') {
32
+ url.searchParams.set(k, String(v));
33
+ }
34
+ }
35
+ }
36
+ const res = await fetch(url.toString(), {
37
+ method: 'GET',
38
+ headers: {
39
+ 'Authorization': `Bearer ${this.apiKey}`,
40
+ 'Content-Type': 'application/json',
41
+ },
42
+ });
43
+ if (!res.ok) {
44
+ const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
45
+ const message = body.error || `HTTP ${res.status}`;
46
+ // Map to user-friendly messages
47
+ switch (res.status) {
48
+ case 401:
49
+ throw new AssetLabClientError(401, 'Authentication failed. Check your ASSETLAB_API_KEY.');
50
+ case 403:
51
+ throw new AssetLabClientError(403, message.includes('scope')
52
+ ? message
53
+ : message.includes('expired')
54
+ ? 'API key has expired. Generate a new one in AssetLab Settings > API Keys.'
55
+ : message);
56
+ case 429:
57
+ throw new AssetLabClientError(429, 'Rate limit exceeded. Wait a moment and try again.');
58
+ case 404:
59
+ throw new AssetLabClientError(404, message);
60
+ default:
61
+ throw new AssetLabClientError(res.status, message);
62
+ }
63
+ }
64
+ return res.json();
65
+ }
66
+ async list(resource, params) {
67
+ return this.get(`/${resource}`, params);
68
+ }
69
+ async getOne(resource, id) {
70
+ return this.get(`/${resource}/${id}`);
71
+ }
72
+ }
73
+ export function loadConfig() {
74
+ const apiKey = process.env.ASSETLAB_API_KEY;
75
+ if (!apiKey) {
76
+ throw new Error('ASSETLAB_API_KEY environment variable is required. ' +
77
+ 'Create an API key in AssetLab Settings > API Keys.');
78
+ }
79
+ const apiUrl = process.env.ASSETLAB_API_URL;
80
+ if (!apiUrl) {
81
+ throw new Error('ASSETLAB_API_URL environment variable is required. ' +
82
+ 'Example: https://<project>.supabase.co/functions/v1/api-gateway');
83
+ }
84
+ return { apiKey, apiUrl };
85
+ }
86
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AssetLab MCP Server
4
+ *
5
+ * Connects Claude Desktop / Claude Code to AssetLab via the API Gateway.
6
+ * Runs locally over stdio — no network server exposed.
7
+ *
8
+ * Required env vars:
9
+ * ASSETLAB_API_KEY - API key from AssetLab Settings > API Keys
10
+ * ASSETLAB_API_URL - API Gateway URL (e.g., https://<project>.supabase.co/functions/v1/api-gateway)
11
+ */
12
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AssetLab MCP Server
4
+ *
5
+ * Connects Claude Desktop / Claude Code to AssetLab via the API Gateway.
6
+ * Runs locally over stdio — no network server exposed.
7
+ *
8
+ * Required env vars:
9
+ * ASSETLAB_API_KEY - API key from AssetLab Settings > API Keys
10
+ * ASSETLAB_API_URL - API Gateway URL (e.g., https://<project>.supabase.co/functions/v1/api-gateway)
11
+ */
12
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { AssetLabClient, loadConfig } from './client.js';
15
+ import { registerTools } from './tools.js';
16
+ async function main() {
17
+ const config = loadConfig();
18
+ const client = new AssetLabClient(config);
19
+ const server = new McpServer({
20
+ name: 'assetlab',
21
+ version: '1.0.0',
22
+ });
23
+ registerTools(server, client);
24
+ const transport = new StdioServerTransport();
25
+ await server.connect(transport);
26
+ }
27
+ main().catch((err) => {
28
+ console.error('Fatal:', err.message || err);
29
+ process.exit(1);
30
+ });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IAEzC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE7B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAA;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP tool registrations for AssetLab.
3
+ *
4
+ * All tools are read-only. They map to GET endpoints
5
+ * on the AssetLab API Gateway.
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AssetLabClient } from './client.js';
9
+ export declare function registerTools(server: McpServer, client: AssetLabClient): void;
package/dist/tools.js ADDED
@@ -0,0 +1,301 @@
1
+ /**
2
+ * MCP tool registrations for AssetLab.
3
+ *
4
+ * All tools are read-only. They map to GET endpoints
5
+ * on the AssetLab API Gateway.
6
+ */
7
+ import { z } from 'zod';
8
+ // Shared schema fragments
9
+ const paginationSchema = {
10
+ page: z.number().int().min(1).optional().describe('Page number (default: 1)'),
11
+ per_page: z.number().int().min(1).max(100).optional().describe('Items per page (default: 25, max: 100)'),
12
+ };
13
+ const searchSchema = {
14
+ search: z.string().max(200).optional().describe('Search by name'),
15
+ };
16
+ const uuidParam = z.string().uuid();
17
+ function formatResult(data) {
18
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
19
+ }
20
+ function formatError(err) {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
23
+ }
24
+ export function registerTools(server, client) {
25
+ // ============================================================
26
+ // Assets
27
+ // ============================================================
28
+ server.tool('list_assets', 'List assets in your AssetLab account. Supports filtering by site, building, system, and text search.', {
29
+ ...searchSchema,
30
+ ...paginationSchema,
31
+ site_id: z.string().uuid().optional().describe('Filter by site ID'),
32
+ building_id: z.string().uuid().optional().describe('Filter by building ID'),
33
+ system_id: z.string().uuid().optional().describe('Filter by system ID'),
34
+ }, async (params) => {
35
+ try {
36
+ const result = await client.list('assets', params);
37
+ return formatResult(result);
38
+ }
39
+ catch (err) {
40
+ return formatError(err);
41
+ }
42
+ });
43
+ server.tool('get_asset', 'Get detailed information about a specific asset by its ID.', { id: uuidParam.describe('Asset ID') }, async ({ id }) => {
44
+ try {
45
+ const result = await client.getOne('assets', id);
46
+ return formatResult(result);
47
+ }
48
+ catch (err) {
49
+ return formatError(err);
50
+ }
51
+ });
52
+ // ============================================================
53
+ // Work Orders
54
+ // ============================================================
55
+ server.tool('list_work_orders', 'List work orders. Filter by status (NEW, IN_PROGRESS, ON_HOLD, COMPLETED, CANCELLED), priority (LOW, MEDIUM, HIGH, CRITICAL), type (CORRECTIVE, PREVENTIVE, EMERGENCY, INSPECTION), and site.', {
56
+ ...searchSchema,
57
+ ...paginationSchema,
58
+ status: z.string().optional().describe('Filter by status: NEW, IN_PROGRESS, ON_HOLD, COMPLETED, CANCELLED'),
59
+ priority: z.string().optional().describe('Filter by priority: LOW, MEDIUM, HIGH, CRITICAL'),
60
+ type: z.string().optional().describe('Filter by type: CORRECTIVE, PREVENTIVE, EMERGENCY, INSPECTION'),
61
+ site_id: z.string().uuid().optional().describe('Filter by site ID'),
62
+ }, async (params) => {
63
+ try {
64
+ const result = await client.list('work-orders', params);
65
+ return formatResult(result);
66
+ }
67
+ catch (err) {
68
+ return formatError(err);
69
+ }
70
+ });
71
+ server.tool('get_work_order', 'Get detailed information about a specific work order by its ID, including description, dates, costs, and completion details.', { id: uuidParam.describe('Work order ID') }, async ({ id }) => {
72
+ try {
73
+ const result = await client.getOne('work-orders', id);
74
+ return formatResult(result);
75
+ }
76
+ catch (err) {
77
+ return formatError(err);
78
+ }
79
+ });
80
+ // ============================================================
81
+ // Sites
82
+ // ============================================================
83
+ server.tool('list_sites', 'List all sites (physical locations/campuses) in your organization.', {
84
+ ...searchSchema,
85
+ ...paginationSchema,
86
+ city: z.string().max(100).optional().describe('Filter by city name'),
87
+ }, async (params) => {
88
+ try {
89
+ const result = await client.list('sites', params);
90
+ return formatResult(result);
91
+ }
92
+ catch (err) {
93
+ return formatError(err);
94
+ }
95
+ });
96
+ server.tool('get_site', 'Get detailed information about a specific site including address and description.', { id: uuidParam.describe('Site ID') }, async ({ id }) => {
97
+ try {
98
+ const result = await client.getOne('sites', id);
99
+ return formatResult(result);
100
+ }
101
+ catch (err) {
102
+ return formatError(err);
103
+ }
104
+ });
105
+ // ============================================================
106
+ // Buildings
107
+ // ============================================================
108
+ server.tool('list_buildings', 'List buildings. Optionally filter by site to see all buildings at a specific location.', {
109
+ ...searchSchema,
110
+ ...paginationSchema,
111
+ site_id: z.string().uuid().optional().describe('Filter by site ID'),
112
+ }, async (params) => {
113
+ try {
114
+ const result = await client.list('buildings', params);
115
+ return formatResult(result);
116
+ }
117
+ catch (err) {
118
+ return formatError(err);
119
+ }
120
+ });
121
+ // ============================================================
122
+ // Locations
123
+ // ============================================================
124
+ server.tool('list_locations', 'List locations (rooms, floors, areas within buildings). Optionally filter by building.', {
125
+ ...searchSchema,
126
+ ...paginationSchema,
127
+ building_id: z.string().uuid().optional().describe('Filter by building ID'),
128
+ }, async (params) => {
129
+ try {
130
+ const result = await client.list('locations', params);
131
+ return formatResult(result);
132
+ }
133
+ catch (err) {
134
+ return formatError(err);
135
+ }
136
+ });
137
+ // ============================================================
138
+ // Systems
139
+ // ============================================================
140
+ server.tool('list_systems', 'List systems (e.g., HVAC units, plumbing systems, electrical systems). Optionally filter by system group.', {
141
+ ...searchSchema,
142
+ ...paginationSchema,
143
+ system_group_id: z.string().uuid().optional().describe('Filter by system group ID'),
144
+ }, async (params) => {
145
+ try {
146
+ const result = await client.list('systems', params);
147
+ return formatResult(result);
148
+ }
149
+ catch (err) {
150
+ return formatError(err);
151
+ }
152
+ });
153
+ server.tool('list_system_groups', 'List system groups (categories of systems, e.g., "Heating", "Cooling"). Optionally filter by system class.', {
154
+ ...searchSchema,
155
+ ...paginationSchema,
156
+ system_class_id: z.string().uuid().optional().describe('Filter by system class ID'),
157
+ }, async (params) => {
158
+ try {
159
+ const result = await client.list('system-groups', params);
160
+ return formatResult(result);
161
+ }
162
+ catch (err) {
163
+ return formatError(err);
164
+ }
165
+ });
166
+ server.tool('list_system_classes', 'List system classes (top-level classification, e.g., "HVAC", "Plumbing", "Electrical").', {
167
+ ...searchSchema,
168
+ ...paginationSchema,
169
+ }, async (params) => {
170
+ try {
171
+ const result = await client.list('system-classes', params);
172
+ return formatResult(result);
173
+ }
174
+ catch (err) {
175
+ return formatError(err);
176
+ }
177
+ });
178
+ // ============================================================
179
+ // PM Schedules
180
+ // ============================================================
181
+ server.tool('list_pm_schedules', 'List preventive maintenance schedules. Filter by status, frequency, or site.', {
182
+ ...searchSchema,
183
+ ...paginationSchema,
184
+ status: z.string().optional().describe('Filter by status: active, inactive'),
185
+ site_id: z.string().uuid().optional().describe('Filter by site ID'),
186
+ frequency: z.string().optional().describe('Filter by frequency: DAILY, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, FIVE_YEARLY, CUSTOM'),
187
+ }, async (params) => {
188
+ try {
189
+ const result = await client.list('pm-schedules', params);
190
+ return formatResult(result);
191
+ }
192
+ catch (err) {
193
+ return formatError(err);
194
+ }
195
+ });
196
+ server.tool('get_pm_schedule', 'Get detailed information about a specific PM schedule including tasks, resources, and linked assets.', { id: uuidParam.describe('PM schedule ID') }, async ({ id }) => {
197
+ try {
198
+ const result = await client.getOne('pm-schedules', id);
199
+ return formatResult(result);
200
+ }
201
+ catch (err) {
202
+ return formatError(err);
203
+ }
204
+ });
205
+ // ============================================================
206
+ // PM Templates
207
+ // ============================================================
208
+ server.tool('list_pm_templates', 'List preventive maintenance templates that can be used to create PM schedules.', {
209
+ ...searchSchema,
210
+ ...paginationSchema,
211
+ }, async (params) => {
212
+ try {
213
+ const result = await client.list('pm-templates', params);
214
+ return formatResult(result);
215
+ }
216
+ catch (err) {
217
+ return formatError(err);
218
+ }
219
+ });
220
+ // ============================================================
221
+ // Projects
222
+ // ============================================================
223
+ server.tool('list_projects', 'List capital projects. Filter by status or health status (on_track, at_risk, delayed, critical).', {
224
+ ...searchSchema,
225
+ ...paginationSchema,
226
+ status: z.string().optional().describe('Filter by project status'),
227
+ health_status: z.string().optional().describe('Filter by health: on_track, at_risk, delayed, critical'),
228
+ }, async (params) => {
229
+ try {
230
+ const result = await client.list('projects', params);
231
+ return formatResult(result);
232
+ }
233
+ catch (err) {
234
+ return formatError(err);
235
+ }
236
+ });
237
+ server.tool('get_project', 'Get detailed project information including budget, progress, schedule variance, and linked sites.', { id: uuidParam.describe('Project ID') }, async ({ id }) => {
238
+ try {
239
+ const result = await client.getOne('projects', id);
240
+ return formatResult(result);
241
+ }
242
+ catch (err) {
243
+ return formatError(err);
244
+ }
245
+ });
246
+ // ============================================================
247
+ // Contracts
248
+ // ============================================================
249
+ server.tool('list_contracts', 'List vendor contracts. Filter by category or search by title.', {
250
+ ...searchSchema,
251
+ ...paginationSchema,
252
+ category: z.string().max(100).optional().describe('Filter by contract category'),
253
+ }, async (params) => {
254
+ try {
255
+ const result = await client.list('contracts', params);
256
+ return formatResult(result);
257
+ }
258
+ catch (err) {
259
+ return formatError(err);
260
+ }
261
+ });
262
+ // ============================================================
263
+ // Compliance
264
+ // ============================================================
265
+ server.tool('list_compliance_items', 'List compliance items (regulatory requirements tracked against PM schedules). Filter by status or system.', {
266
+ ...searchSchema,
267
+ ...paginationSchema,
268
+ status: z.string().optional().describe('Filter by status: active, archived'),
269
+ system_id: z.string().uuid().optional().describe('Filter by system ID'),
270
+ }, async (params) => {
271
+ try {
272
+ const result = await client.list('compliance', params);
273
+ return formatResult(result);
274
+ }
275
+ catch (err) {
276
+ return formatError(err);
277
+ }
278
+ });
279
+ server.tool('get_compliance_item', 'Get detailed compliance item including linked PM schedules and their required frequencies.', { id: uuidParam.describe('Compliance item ID') }, async ({ id }) => {
280
+ try {
281
+ const result = await client.getOne('compliance', id);
282
+ return formatResult(result);
283
+ }
284
+ catch (err) {
285
+ return formatError(err);
286
+ }
287
+ });
288
+ // ============================================================
289
+ // Dashboard
290
+ // ============================================================
291
+ server.tool('get_dashboard_summary', 'Get aggregated dashboard statistics: total assets, work orders by status, overdue count, active PM schedules, sites, and buildings.', {}, async () => {
292
+ try {
293
+ const result = await client.get('/dashboard');
294
+ return formatResult(result);
295
+ }
296
+ catch (err) {
297
+ return formatError(err);
298
+ }
299
+ });
300
+ }
301
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@assetlab/mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for AssetLab — connect Claude to your asset management data",
5
+ "type": "module",
6
+ "bin": {
7
+ "assetlab-mcp": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js"
14
+ },
15
+ "keywords": ["mcp", "assetlab", "asset-management", "claude"],
16
+ "license": "UNLICENSED",
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.12.0",
22
+ "zod": "^3.24.0"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.7.0",
26
+ "tsx": "^4.19.0",
27
+ "@types/node": "^22.0.0"
28
+ }
29
+ }