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.
- package/README.md +135 -0
- package/dist/config/index.js +45 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/auth.js +22 -0
- package/dist/resources/auth.js.map +1 -0
- package/dist/resources/game.js +85 -0
- package/dist/resources/game.js.map +1 -0
- package/dist/resources/index.js +56 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/user.js +23 -0
- package/dist/resources/user.js.map +1 -0
- package/dist/server/screeps.js +50 -0
- package/dist/server/screeps.js.map +1 -0
- package/dist/tools/index.js +152 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/market.js +107 -0
- package/dist/tools/market.js.map +1 -0
- package/dist/tools/misc.js +37 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/room.js +151 -0
- package/dist/tools/room.js.map +1 -0
- package/dist/tools/user.js +179 -0
- package/dist/tools/user.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/api.js +558 -0
- package/dist/utils/api.js.map +1 -0
- package/package.json +53 -0
|
@@ -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
|
+
}
|