screeps-world-mcp 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,558 @@
1
+ export class ApiClient {
2
+ configManager;
3
+ responseCache = new Map();
4
+ lastRateLimitInfo;
5
+ recentCalls = [];
6
+ maxRecentCalls = 20; // Track last 20 calls
7
+ constructor(configManager) {
8
+ this.configManager = configManager;
9
+ }
10
+ async makeApiCall(endpoint, options = {}) {
11
+ // Check cache first
12
+ const cacheKey = this.generateCacheKey(endpoint, options);
13
+ const cachedResult = this.getCachedResult(cacheKey);
14
+ // Track this call for loop detection BEFORE checking cache
15
+ this.trackCall(endpoint, cacheKey);
16
+ // Detect loops early and block the call
17
+ const loopDetection = this.detectLoops();
18
+ if (loopDetection.isLoop) {
19
+ throw new Error(`🚨 LOOP DETECTED: This identical API call has been made multiple times recently. ` +
20
+ `Please analyze the existing data instead of making repeated calls. ` +
21
+ `Endpoint: ${endpoint}`);
22
+ }
23
+ if (cachedResult) {
24
+ // Add cache hit indicator
25
+ this.lastRateLimitInfo = undefined; // No rate limit info for cached results
26
+ return {
27
+ ...cachedResult,
28
+ _cacheHit: true,
29
+ _cachedAt: new Date().toISOString(),
30
+ };
31
+ }
32
+ const url = `${this.configManager.getBaseUrl()}${endpoint}`;
33
+ const headers = {
34
+ ...this.configManager.getAuthHeaders(),
35
+ ...options.headers,
36
+ };
37
+ try {
38
+ const response = await fetch(url, {
39
+ ...options,
40
+ headers,
41
+ });
42
+ // Extract rate limit information
43
+ this.lastRateLimitInfo = this.extractRateLimitInfo(response);
44
+ if (!response.ok) {
45
+ if (response.status === 429) {
46
+ const retryAfter = response.headers.get('Retry-After');
47
+ throw new Error(`Rate limit exceeded. Retry after ${retryAfter || 'unknown'} seconds. Consider reducing API call frequency.`);
48
+ }
49
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
50
+ }
51
+ const data = await response.json();
52
+ // Cache the result
53
+ this.setCachedResult(cacheKey, data, this.getCacheTTL(endpoint));
54
+ return data;
55
+ }
56
+ catch (error) {
57
+ console.error(`API call failed for ${endpoint}:`, error);
58
+ throw error;
59
+ }
60
+ }
61
+ trackCall(endpoint, cacheKey) {
62
+ this.recentCalls.push({
63
+ endpoint,
64
+ cacheKey,
65
+ timestamp: Date.now(),
66
+ });
67
+ // Keep only recent calls
68
+ if (this.recentCalls.length > this.maxRecentCalls) {
69
+ this.recentCalls.shift();
70
+ }
71
+ }
72
+ detectLoops() {
73
+ const warnings = [];
74
+ let isLoop = false;
75
+ // Check for identical calls within last 5 minutes
76
+ const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
77
+ const recentIdenticalCalls = new Map();
78
+ this.recentCalls
79
+ .filter((call) => call.timestamp > fiveMinutesAgo)
80
+ .forEach((call) => {
81
+ const count = recentIdenticalCalls.get(call.cacheKey) || 0;
82
+ recentIdenticalCalls.set(call.cacheKey, count + 1);
83
+ });
84
+ // Check for repetitive patterns - be more aggressive
85
+ for (const [cacheKey, count] of recentIdenticalCalls.entries()) {
86
+ if (count >= 2) {
87
+ isLoop = true;
88
+ warnings.push(`🚨 CRITICAL LOOP DETECTED: Identical call made ${count} times in the last 5 minutes`);
89
+ warnings.push(`🛑 STOP IMMEDIATELY: You already have all the data from this endpoint`);
90
+ warnings.push(`💡 MANDATORY: Analyze the existing data - DO NOT make more calls`);
91
+ warnings.push(`⚠️ SYSTEM: Further identical calls will be blocked`);
92
+ }
93
+ }
94
+ // Check for endpoint overuse
95
+ const endpointCounts = new Map();
96
+ this.recentCalls.forEach((call) => {
97
+ const count = endpointCounts.get(call.endpoint) || 0;
98
+ endpointCounts.set(call.endpoint, count + 1);
99
+ });
100
+ for (const [endpoint, count] of endpointCounts.entries()) {
101
+ if (count >= 5) {
102
+ warnings.push(`⚠️ OVERUSE WARNING: ${endpoint} called ${count} times recently`);
103
+ warnings.push(`🎯 SUGGESTION: Consider using different endpoints or analyzing existing data`);
104
+ }
105
+ }
106
+ return { isLoop, warnings };
107
+ }
108
+ generateCacheKey(endpoint, options) {
109
+ const method = options.method || 'GET';
110
+ const body = options.body ? JSON.stringify(options.body) : '';
111
+ return `${method}:${endpoint}:${body}`;
112
+ }
113
+ getCachedResult(cacheKey) {
114
+ const cached = this.responseCache.get(cacheKey);
115
+ if (cached && Date.now() < cached.timestamp + cached.ttl) {
116
+ return cached.data;
117
+ }
118
+ if (cached) {
119
+ // Clean up expired cache entry
120
+ this.responseCache.delete(cacheKey);
121
+ }
122
+ return null;
123
+ }
124
+ setCachedResult(cacheKey, data, ttl) {
125
+ this.responseCache.set(cacheKey, {
126
+ data,
127
+ timestamp: Date.now(),
128
+ ttl,
129
+ });
130
+ }
131
+ getCacheTTL(endpoint) {
132
+ // Cache TTL in milliseconds based on endpoint type
133
+ // Resource endpoints (more static data)
134
+ if (endpoint.includes('/auth/me')) {
135
+ return 15 * 60 * 1000; // 15 minutes - user info rarely changes
136
+ }
137
+ if (endpoint.includes('/version')) {
138
+ return 60 * 60 * 1000; // 1 hour - version changes only on server updates
139
+ }
140
+ if (endpoint.includes('/game/world-size')) {
141
+ return 60 * 60 * 1000; // 1 hour - world size never changes
142
+ }
143
+ if (endpoint.includes('/game/shards/info')) {
144
+ return 10 * 60 * 1000; // 10 minutes - shard list changes rarely
145
+ }
146
+ if (endpoint.includes('/user/world-status')) {
147
+ return 2 * 60 * 1000; // 2 minutes - user status updates periodically
148
+ }
149
+ if (endpoint.includes('/game/time')) {
150
+ return 5 * 1000; // 5 seconds - game time updates every tick
151
+ }
152
+ if (endpoint.includes('/game/market/stats')) {
153
+ return 60 * 1000; // 1 minute - market stats update regularly
154
+ }
155
+ // Tool endpoints (more dynamic data)
156
+ if (endpoint.includes('room-terrain')) {
157
+ return 5 * 60 * 1000; // 5 minutes - terrain rarely changes
158
+ }
159
+ if (endpoint.includes('room-status')) {
160
+ return 60 * 1000; // 1 minute - status changes occasionally
161
+ }
162
+ if (endpoint.includes('room-objects')) {
163
+ return 10 * 1000; // 10 seconds - objects change frequently
164
+ }
165
+ if (endpoint.includes('user/stats') || endpoint.includes('user/overview')) {
166
+ return 30 * 1000; // 30 seconds - stats update periodically
167
+ }
168
+ if (endpoint.includes('market')) {
169
+ return 15 * 1000; // 15 seconds - market data changes frequently
170
+ }
171
+ return 30 * 1000; // Default 30 seconds
172
+ }
173
+ extractRateLimitInfo(response) {
174
+ const limit = response.headers.get('X-RateLimit-Limit');
175
+ const remaining = response.headers.get('X-RateLimit-Remaining');
176
+ const reset = response.headers.get('X-RateLimit-Reset');
177
+ if (limit && remaining && reset) {
178
+ return {
179
+ limit: parseInt(limit),
180
+ remaining: parseInt(remaining),
181
+ resetTime: parseInt(reset),
182
+ };
183
+ }
184
+ return undefined;
185
+ }
186
+ createEnhancedToolResult(data, endpoint, description, isError = false, additionalGuidance) {
187
+ // Detect loops and add warnings
188
+ const loopDetection = this.detectLoops();
189
+ const metadata = {
190
+ endpoint,
191
+ timestamp: new Date().toISOString(),
192
+ rateLimitInfo: this.lastRateLimitInfo,
193
+ dataCompleteness: this.assessDataCompleteness(data),
194
+ suggestedNextActions: this.generateSuggestedActions(data, endpoint),
195
+ warnings: [...this.generateWarnings(data, endpoint), ...loopDetection.warnings],
196
+ };
197
+ if (additionalGuidance) {
198
+ metadata.suggestedNextActions = [...(metadata.suggestedNextActions || []), ...additionalGuidance];
199
+ }
200
+ // Add loop-specific guidance
201
+ if (loopDetection.isLoop) {
202
+ metadata.suggestedNextActions = [
203
+ '🚨 CRITICAL: Loop detected - DO NOT make more API calls',
204
+ '📊 ANALYZE: Use the data you already have',
205
+ '🎯 FOCUS: Draw conclusions from existing information',
206
+ ...(metadata.suggestedNextActions || []),
207
+ ];
208
+ }
209
+ const formattedResponse = this.formatResponse(data, metadata, description);
210
+ return {
211
+ content: [
212
+ {
213
+ type: 'text',
214
+ text: formattedResponse,
215
+ },
216
+ ],
217
+ isError: isError || loopDetection.isLoop, // Mark as error if loop detected
218
+ };
219
+ }
220
+ assessDataCompleteness(data) {
221
+ if (!data ||
222
+ (Array.isArray(data) && data.length === 0) ||
223
+ (typeof data === 'object' && Object.keys(data).length === 0)) {
224
+ return 'empty';
225
+ }
226
+ // Check for common pagination indicators
227
+ if (data.hasMore || data.nextPage || data.continuation) {
228
+ return 'partial';
229
+ }
230
+ return 'complete';
231
+ }
232
+ generateSuggestedActions(data, endpoint) {
233
+ const actions = [];
234
+ // Rate limit guidance
235
+ if (this.lastRateLimitInfo && this.lastRateLimitInfo.remaining < 10) {
236
+ actions.push(`⚠️ Rate limit warning: Only ${this.lastRateLimitInfo.remaining} requests remaining. Consider using other endpoints or waiting.`);
237
+ }
238
+ // Endpoint-specific guidance with completion indicators
239
+ if (endpoint.includes('room-terrain') && data?.terrain) {
240
+ actions.push('✅ Room terrain data retrieved successfully. You can now analyze room layout, find exits, or plan paths.');
241
+ actions.push('🎯 NEXT STEPS: Use this terrain data for pathfinding analysis - no need to fetch terrain again');
242
+ }
243
+ if (endpoint.includes('room-objects') && data?.objects) {
244
+ actions.push('✅ Room objects data retrieved successfully. You can now analyze structures, creeps, and resources in the room.');
245
+ actions.push('🎯 NEXT STEPS: Process the objects data to understand room composition - additional calls not needed');
246
+ }
247
+ if (endpoint.includes('room-overview') && data?.stats) {
248
+ actions.push('✅ Room overview statistics retrieved successfully. You can now analyze room performance trends.');
249
+ actions.push('🎯 NEXT STEPS: Compare these statistics with other rooms or time periods using the data provided');
250
+ }
251
+ if (endpoint.includes('room-status') && data?.status) {
252
+ actions.push('✅ Room status information retrieved successfully. You can now understand room accessibility and type.');
253
+ actions.push('🎯 NEXT STEPS: Use this status information for planning - no additional status calls needed');
254
+ }
255
+ if (endpoint.includes('market/orders') && data?.list) {
256
+ actions.push(`✅ Market orders retrieved (${data.list.length} orders). You can now analyze market trends or find trading opportunities.`);
257
+ actions.push('🎯 NEXT STEPS: Analyze the price trends and order volumes from this data - market data is complete');
258
+ }
259
+ if (endpoint.includes('user/stats') && data?.stats) {
260
+ actions.push('✅ User statistics retrieved successfully. You can now analyze performance trends or compare different time periods.');
261
+ actions.push('🎯 NEXT STEPS: Calculate trends and insights from this statistical data - no more stats calls needed');
262
+ }
263
+ if (endpoint.includes('user/memory') && data?.data) {
264
+ actions.push('✅ User memory data retrieved successfully. You can now access stored game state information.');
265
+ actions.push('🎯 NEXT STEPS: Parse and analyze the memory data structure - memory data is complete');
266
+ }
267
+ if (endpoint.includes('calculate_distance')) {
268
+ actions.push('✅ Distance calculation completed successfully. All distance metrics have been calculated.');
269
+ actions.push('🎯 NEXT STEPS: Use the calculated distances for planning - no additional distance calculations needed');
270
+ }
271
+ // Data completeness guidance
272
+ if (this.assessDataCompleteness(data) === 'empty') {
273
+ actions.push('ℹ️ No data found for this query. Consider checking different parameters or trying a different endpoint.');
274
+ actions.push("🎯 NEXT STEPS: Verify your query parameters or try a different approach - repeated calls won't help");
275
+ }
276
+ else if (this.assessDataCompleteness(data) === 'complete') {
277
+ actions.push('✅ COMPLETE: All requested data has been successfully retrieved');
278
+ actions.push('🎯 STOP: No additional API calls needed - proceed with data analysis');
279
+ }
280
+ // General completion guidance
281
+ if (data && typeof data === 'object' && !Array.isArray(data)) {
282
+ const dataKeys = Object.keys(data);
283
+ if (dataKeys.length > 0) {
284
+ actions.push(`📊 DATA READY: Response contains ${dataKeys.length} data fields - sufficient for analysis`);
285
+ }
286
+ }
287
+ return actions;
288
+ }
289
+ generateWarnings(data, endpoint) {
290
+ const warnings = [];
291
+ // Rate limit warnings
292
+ if (this.lastRateLimitInfo) {
293
+ if (this.lastRateLimitInfo.remaining < 5) {
294
+ warnings.push(`🚨 CRITICAL: Only ${this.lastRateLimitInfo.remaining} API calls remaining before rate limit!`);
295
+ }
296
+ else if (this.lastRateLimitInfo.remaining < 20) {
297
+ warnings.push(`⚠️ WARNING: Low API calls remaining (${this.lastRateLimitInfo.remaining}). Plan your next calls carefully.`);
298
+ }
299
+ }
300
+ // Data-specific warnings
301
+ if (endpoint.includes('room-objects') && data?.objects && data.objects.length > 100) {
302
+ warnings.push('⚠️ Large dataset returned. Consider filtering or processing in smaller chunks.');
303
+ }
304
+ return warnings;
305
+ }
306
+ formatResponse(data, metadata, description) {
307
+ const sections = [];
308
+ // Header with description
309
+ sections.push(`# ${description}`);
310
+ sections.push(`📅 **Timestamp**: ${metadata.timestamp}`);
311
+ sections.push(`🔗 **Endpoint**: ${metadata.endpoint}`);
312
+ // Cache information
313
+ if (data._cacheHit) {
314
+ sections.push(`\n## 🚀 Cache Status`);
315
+ sections.push(`- **Status**: ✅ Cache HIT - Data served from cache`);
316
+ sections.push(`- **Cached At**: ${data._cachedAt}`);
317
+ sections.push(`- **Performance**: This request used cached data, saving API rate limits`);
318
+ }
319
+ else {
320
+ sections.push(`\n## 🚀 Cache Status`);
321
+ sections.push(`- **Status**: 🔄 Cache MISS - Fresh data retrieved from API`);
322
+ sections.push(`- **Performance**: This request consumed API rate limits`);
323
+ }
324
+ // Rate limit info (only for non-cached responses)
325
+ if (metadata.rateLimitInfo && !data._cacheHit) {
326
+ sections.push(`\n## 🚦 Rate Limit Status`);
327
+ sections.push(`- **Remaining**: ${metadata.rateLimitInfo.remaining}/${metadata.rateLimitInfo.limit}`);
328
+ sections.push(`- **Resets at**: ${new Date(metadata.rateLimitInfo.resetTime * 1000).toISOString()}`);
329
+ }
330
+ // Data completeness
331
+ sections.push(`\n## 📊 Data Status`);
332
+ sections.push(`- **Completeness**: ${metadata.dataCompleteness}`);
333
+ // Warnings
334
+ if (metadata.warnings && metadata.warnings.length > 0) {
335
+ sections.push(`\n## ⚠️ Warnings`);
336
+ metadata.warnings.forEach((warning) => sections.push(`- ${warning}`));
337
+ }
338
+ // Main data (clean up cache metadata)
339
+ const cleanData = { ...data };
340
+ delete cleanData._cacheHit;
341
+ delete cleanData._cachedAt;
342
+ sections.push(`\n## 📋 Data`);
343
+ sections.push(`\`\`\`json`);
344
+ sections.push(JSON.stringify(cleanData, null, 2));
345
+ sections.push(`\`\`\``);
346
+ // Suggested actions
347
+ if (metadata.suggestedNextActions && metadata.suggestedNextActions.length > 0) {
348
+ sections.push(`\n## 🎯 Suggested Next Actions`);
349
+ metadata.suggestedNextActions.forEach((action) => sections.push(`- ${action}`));
350
+ }
351
+ // Add cache-specific guidance
352
+ if (data._cacheHit) {
353
+ sections.push(`\n## 💡 Cache Guidance`);
354
+ sections.push(`- ✅ This data was served from cache - no need to call the same endpoint again immediately`);
355
+ sections.push(`- 🔄 If you need fresher data, wait for cache to expire or use a different endpoint`);
356
+ sections.push(`- 💰 Cache hits help preserve your API rate limits`);
357
+ }
358
+ // Clear completion indicator
359
+ sections.push(`\n## ✅ Query Complete`);
360
+ sections.push(`This query has been completed successfully. All requested data has been retrieved and formatted above.`);
361
+ return sections.join('\n');
362
+ }
363
+ // Legacy method for backward compatibility
364
+ createToolResult(text, isError = false) {
365
+ return {
366
+ content: [
367
+ {
368
+ type: 'text',
369
+ text,
370
+ },
371
+ ],
372
+ isError,
373
+ };
374
+ }
375
+ createResourceContent(uri, data) {
376
+ return {
377
+ contents: [
378
+ {
379
+ uri: uri,
380
+ mimeType: 'application/json',
381
+ text: JSON.stringify(data, null, 2),
382
+ },
383
+ ],
384
+ };
385
+ }
386
+ createErrorResourceContent(uri, error) {
387
+ return {
388
+ contents: [
389
+ {
390
+ uri: uri,
391
+ mimeType: 'application/json',
392
+ text: JSON.stringify({
393
+ error: error instanceof Error ? error.message : String(error),
394
+ }, null, 2),
395
+ },
396
+ ],
397
+ };
398
+ }
399
+ async handleToolCall(endpoint, params, description, options = {}) {
400
+ try {
401
+ const data = await this.makeApiCall(endpoint, options);
402
+ return this.createToolResult(`${description}:\n${JSON.stringify(data, null, 2)}`);
403
+ }
404
+ catch (error) {
405
+ return this.createToolResult(`Error ${description.toLowerCase()}: ${error instanceof Error ? error.message : String(error)}`, true);
406
+ }
407
+ }
408
+ buildQueryParams(params) {
409
+ const urlParams = new URLSearchParams();
410
+ Object.entries(params).forEach(([key, value]) => {
411
+ if (value !== undefined && value !== null) {
412
+ urlParams.append(key, String(value));
413
+ }
414
+ });
415
+ return urlParams;
416
+ }
417
+ buildEndpointWithQuery(baseEndpoint, params) {
418
+ const queryParams = this.buildQueryParams(params);
419
+ const queryString = queryParams.toString();
420
+ return queryString ? `${baseEndpoint}?${queryString}` : baseEndpoint;
421
+ }
422
+ // Enhanced resource content with metadata
423
+ createEnhancedResourceContent(uri, data, endpoint, description, additionalGuidance) {
424
+ // Detect loops and add warnings for resources too
425
+ const loopDetection = this.detectLoops();
426
+ const metadata = {
427
+ endpoint,
428
+ timestamp: new Date().toISOString(),
429
+ rateLimitInfo: this.lastRateLimitInfo,
430
+ dataCompleteness: this.assessDataCompleteness(data),
431
+ suggestedNextActions: this.generateResourceGuidance(data, endpoint),
432
+ warnings: [...this.generateWarnings(data, endpoint), ...loopDetection.warnings],
433
+ };
434
+ if (additionalGuidance) {
435
+ metadata.suggestedNextActions = [...(metadata.suggestedNextActions || []), ...additionalGuidance];
436
+ }
437
+ // Add loop-specific guidance for resources
438
+ if (loopDetection.isLoop) {
439
+ metadata.suggestedNextActions = [
440
+ '🚨 CRITICAL: Loop detected - STOP accessing this resource repeatedly',
441
+ '📊 ANALYZE: Use the resource data you already have',
442
+ '🎯 FOCUS: This resource data is static/semi-static - no need to refetch',
443
+ ...(metadata.suggestedNextActions || []),
444
+ ];
445
+ }
446
+ const formattedResponse = this.formatResourceResponse(data, metadata, description, uri);
447
+ return {
448
+ contents: [
449
+ {
450
+ uri: uri,
451
+ mimeType: 'text/markdown',
452
+ text: formattedResponse,
453
+ },
454
+ ],
455
+ };
456
+ }
457
+ generateResourceGuidance(data, endpoint) {
458
+ const actions = [];
459
+ // Rate limit guidance
460
+ if (this.lastRateLimitInfo && this.lastRateLimitInfo.remaining < 10) {
461
+ actions.push(`⚠️ Rate limit warning: Only ${this.lastRateLimitInfo.remaining} requests remaining. Resources are cached - use them efficiently.`);
462
+ }
463
+ // Resource-specific guidance
464
+ if (endpoint.includes('/auth/me') && data?.username) {
465
+ actions.push('✅ User authentication verified successfully');
466
+ actions.push('🎯 STATIC DATA: This user info rarely changes - no need to refetch frequently');
467
+ }
468
+ if (endpoint.includes('/game/time') && data?.time) {
469
+ actions.push('✅ Game time retrieved successfully');
470
+ actions.push('🎯 DYNAMIC DATA: Game time updates every tick but is cached appropriately');
471
+ }
472
+ if (endpoint.includes('/game/world-size') && data?.width) {
473
+ actions.push('✅ World size information retrieved successfully');
474
+ actions.push('🎯 STATIC DATA: World size never changes - cache this data locally');
475
+ }
476
+ if (endpoint.includes('/game/shards/info') && data?.shards) {
477
+ actions.push(`✅ Shard information retrieved (${data.shards?.length || 0} shards available)`);
478
+ actions.push('🎯 SEMI-STATIC DATA: Shard list changes rarely - safe to cache long-term');
479
+ }
480
+ if (endpoint.includes('/version') && data?.version) {
481
+ actions.push('✅ Server version and features retrieved successfully');
482
+ actions.push('🎯 STATIC DATA: Version info changes only during server updates - cache indefinitely');
483
+ }
484
+ if (endpoint.includes('/game/market/stats') && data?.credits) {
485
+ actions.push('✅ Market statistics retrieved successfully');
486
+ actions.push('🎯 DYNAMIC DATA: Market stats update regularly but are cached appropriately');
487
+ }
488
+ if (endpoint.includes('/user/world-status') && data?.status) {
489
+ actions.push('✅ User world status retrieved successfully');
490
+ actions.push('🎯 SEMI-DYNAMIC DATA: User status changes periodically - cached for efficiency');
491
+ }
492
+ // General resource completion guidance
493
+ actions.push('📊 RESOURCE COMPLETE: All data loaded successfully');
494
+ actions.push('💡 EFFICIENCY TIP: Resources are designed to be accessed once and cached');
495
+ return actions;
496
+ }
497
+ formatResourceResponse(data, metadata, description, uri) {
498
+ const sections = [];
499
+ // Header with description
500
+ sections.push(`# 📚 ${description}`);
501
+ sections.push(`📅 **Timestamp**: ${metadata.timestamp}`);
502
+ sections.push(`🔗 **Resource URI**: ${uri}`);
503
+ sections.push(`🔗 **API Endpoint**: ${metadata.endpoint}`);
504
+ // Cache information
505
+ if (data._cacheHit) {
506
+ sections.push(`\n## 🚀 Cache Status`);
507
+ sections.push(`- **Status**: ✅ Cache HIT - Resource served from cache`);
508
+ sections.push(`- **Cached At**: ${data._cachedAt}`);
509
+ sections.push(`- **Performance**: This resource used cached data, optimizing performance`);
510
+ }
511
+ else {
512
+ sections.push(`\n## 🚀 Cache Status`);
513
+ sections.push(`- **Status**: 🔄 Cache MISS - Fresh resource data retrieved`);
514
+ sections.push(`- **Performance**: This resource consumed API rate limits`);
515
+ }
516
+ // Rate limit info (only for non-cached responses)
517
+ if (metadata.rateLimitInfo && !data._cacheHit) {
518
+ sections.push(`\n## 🚦 Rate Limit Status`);
519
+ sections.push(`- **Remaining**: ${metadata.rateLimitInfo.remaining}/${metadata.rateLimitInfo.limit}`);
520
+ sections.push(`- **Resets at**: ${new Date(metadata.rateLimitInfo.resetTime * 1000).toISOString()}`);
521
+ }
522
+ // Data completeness
523
+ sections.push(`\n## 📊 Resource Status`);
524
+ sections.push(`- **Completeness**: ${metadata.dataCompleteness}`);
525
+ sections.push(`- **Type**: MCP Resource (static/semi-static data)`);
526
+ // Warnings
527
+ if (metadata.warnings && metadata.warnings.length > 0) {
528
+ sections.push(`\n## ⚠️ Warnings`);
529
+ metadata.warnings.forEach((warning) => sections.push(`- ${warning}`));
530
+ }
531
+ // Main data (clean up cache metadata)
532
+ const cleanData = { ...data };
533
+ delete cleanData._cacheHit;
534
+ delete cleanData._cachedAt;
535
+ sections.push(`\n## 📋 Resource Data`);
536
+ sections.push(`\`\`\`json`);
537
+ sections.push(JSON.stringify(cleanData, null, 2));
538
+ sections.push(`\`\`\``);
539
+ // Suggested actions
540
+ if (metadata.suggestedNextActions && metadata.suggestedNextActions.length > 0) {
541
+ sections.push(`\n## 🎯 Resource Guidance`);
542
+ metadata.suggestedNextActions.forEach((action) => sections.push(`- ${action}`));
543
+ }
544
+ // Resource-specific guidance
545
+ if (data._cacheHit) {
546
+ sections.push(`\n## 💡 Cache Optimization`);
547
+ sections.push(`- ✅ This resource was served from cache - excellent performance`);
548
+ sections.push(`- 🔄 Resources are designed to be accessed efficiently`);
549
+ sections.push(`- 💰 Cache hits preserve your API rate limits for tools that need fresh data`);
550
+ }
551
+ // Clear completion indicator
552
+ sections.push(`\n## ✅ Resource Complete`);
553
+ sections.push(`This resource has been loaded successfully. Resource data is now available for use.`);
554
+ sections.push(`📌 **Remember**: Resources provide foundational data - use tools for dynamic queries.`);
555
+ return sections.join('\n');
556
+ }
557
+ }
558
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "screeps-world-mcp",
3
+ "version": "1.0.0",
4
+ "description": "Experimental MCP (Model Context Protocol) service for Screeps World",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "screeps-world-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "engines": {
14
+ "node": ">=18"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsc --watch",
19
+ "format": "prettier --write src/**/*.ts",
20
+ "start": "node dist/index.js",
21
+ "prepare": "npm run build",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.15.0",
26
+ "typescript": "^5.8.3",
27
+ "zod": "^3.25.72"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.10.0",
31
+ "prettier": "^3.6.2",
32
+ "semantic-release": "^24.0.0"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/skbki/screeps-world-mcp.git"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/skbki/screeps-world-mcp/issues"
40
+ },
41
+ "homepage": "https://github.com/skbki/screeps-world-mcp#readme",
42
+ "keywords": [
43
+ "screeps",
44
+ "mcp",
45
+ "model-context-protocol"
46
+ ],
47
+ "publishConfig": {
48
+ "access": "public",
49
+ "provenance": true
50
+ },
51
+ "author": "admon84",
52
+ "license": "MIT"
53
+ }