ftc-mcp 1.0.0 → 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/build/knowledge/index.d.ts +32 -0
- package/build/knowledge/index.js +313 -0
- package/build/prompts/registry.js +15 -15
- package/build/resources/registry.d.ts +11 -0
- package/build/resources/registry.js +46 -515
- package/build/server.js +1 -1
- package/build/tools/registry.d.ts +13 -0
- package/build/tools/registry.js +99 -357
- package/package.json +1 -1
|
@@ -1,520 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Resource Registration — Template-Based
|
|
4
|
+
*
|
|
5
|
+
* Inspired by Cloudflare's progressive discovery pattern: instead of registering
|
|
6
|
+
* 70+ individual resources (each adding to context window overhead), we register
|
|
7
|
+
* 9 category-level resource templates. Each template provides a list callback for
|
|
8
|
+
* resource discovery and a read callback for content retrieval.
|
|
9
|
+
*
|
|
10
|
+
* This reduces the resource listing from ~70 entries to 9 templates, saving
|
|
11
|
+
* significant tokens in the MCP protocol's resource listing.
|
|
12
|
+
*/
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
14
|
exports.registerResources = registerResources;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const hardware_js_1 = require("../knowledge/hardware.js");
|
|
7
|
-
const ftc_sdk_js_1 = require("../knowledge/ftc-sdk.js");
|
|
8
|
-
const gradle_js_1 = require("../knowledge/gradle.js");
|
|
9
|
-
const roadrunner_js_1 = require("../knowledge/roadrunner.js");
|
|
10
|
-
const ftclib_js_1 = require("../knowledge/ftclib.js");
|
|
11
|
-
const vision_js_1 = require("../knowledge/vision.js");
|
|
12
|
-
const panels_js_1 = require("../knowledge/panels.js");
|
|
15
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
16
|
+
const index_js_1 = require("../knowledge/index.js");
|
|
13
17
|
function registerResources(server) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
text: ftc_sdk_js_1.FTC_SDK_KNOWLEDGE.bestPractices
|
|
48
|
-
}]
|
|
49
|
-
}));
|
|
50
|
-
server.resource("Dev Environment Setup", "ftc://sdk/dev-environment", async (uri) => ({
|
|
51
|
-
contents: [{
|
|
52
|
-
uri: uri.href,
|
|
53
|
-
mimeType: "text/plain",
|
|
54
|
-
text: ftc_sdk_js_1.FTC_SDK_KNOWLEDGE.devEnvironment
|
|
55
|
-
}]
|
|
56
|
-
}));
|
|
57
|
-
// ── Pedro Pathing (PEDRO_KNOWLEDGE) ───────────────────────────────────
|
|
58
|
-
server.resource("Pedro API Reference", "ftc://pedro/api-reference", async (uri) => ({
|
|
59
|
-
contents: [{
|
|
60
|
-
uri: uri.href,
|
|
61
|
-
mimeType: "text/plain",
|
|
62
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.apiReference
|
|
63
|
-
}]
|
|
64
|
-
}));
|
|
65
|
-
server.resource("Pedro Constants Pattern", "ftc://pedro/constants-pattern", async (uri) => ({
|
|
66
|
-
contents: [{
|
|
67
|
-
uri: uri.href,
|
|
68
|
-
mimeType: "text/plain",
|
|
69
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.constantsPattern
|
|
70
|
-
}]
|
|
71
|
-
}));
|
|
72
|
-
server.resource("Pedro Coordinate System", "ftc://pedro/coordinate-system", async (uri) => ({
|
|
73
|
-
contents: [{
|
|
74
|
-
uri: uri.href,
|
|
75
|
-
mimeType: "text/plain",
|
|
76
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.coordinateSystem
|
|
77
|
-
}]
|
|
78
|
-
}));
|
|
79
|
-
server.resource("Pedro Auto Structure", "ftc://pedro/auto-structure", async (uri) => ({
|
|
80
|
-
contents: [{
|
|
81
|
-
uri: uri.href,
|
|
82
|
-
mimeType: "text/plain",
|
|
83
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.autoStructure
|
|
84
|
-
}]
|
|
85
|
-
}));
|
|
86
|
-
server.resource("Pedro TeleOp Structure", "ftc://pedro/teleop-structure", async (uri) => ({
|
|
87
|
-
contents: [{
|
|
88
|
-
uri: uri.href,
|
|
89
|
-
mimeType: "text/plain",
|
|
90
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.teleopStructure
|
|
91
|
-
}]
|
|
92
|
-
}));
|
|
93
|
-
server.resource("Pedro Callbacks", "ftc://pedro/callbacks", async (uri) => ({
|
|
94
|
-
contents: [{
|
|
95
|
-
uri: uri.href,
|
|
96
|
-
mimeType: "text/plain",
|
|
97
|
-
text: pedro_js_1.PEDRO_KNOWLEDGE.callbacks
|
|
98
|
-
}]
|
|
99
|
-
}));
|
|
100
|
-
// ── Dashboard (DASHBOARD_KNOWLEDGE) ───────────────────────────────────
|
|
101
|
-
server.resource("Dashboard Config Pattern", "ftc://dashboard/config-pattern", async (uri) => ({
|
|
102
|
-
contents: [{
|
|
103
|
-
uri: uri.href,
|
|
104
|
-
mimeType: "text/plain",
|
|
105
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.configPattern
|
|
106
|
-
}]
|
|
107
|
-
}));
|
|
108
|
-
server.resource("Dashboard Telemetry", "ftc://dashboard/telemetry", async (uri) => ({
|
|
109
|
-
contents: [{
|
|
110
|
-
uri: uri.href,
|
|
111
|
-
mimeType: "text/plain",
|
|
112
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.telemetry
|
|
113
|
-
}]
|
|
114
|
-
}));
|
|
115
|
-
server.resource("Dashboard Canvas", "ftc://dashboard/canvas", async (uri) => ({
|
|
116
|
-
contents: [{
|
|
117
|
-
uri: uri.href,
|
|
118
|
-
mimeType: "text/plain",
|
|
119
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.canvas
|
|
120
|
-
}]
|
|
121
|
-
}));
|
|
122
|
-
server.resource("Dashboard Camera", "ftc://dashboard/camera", async (uri) => ({
|
|
123
|
-
contents: [{
|
|
124
|
-
uri: uri.href,
|
|
125
|
-
mimeType: "text/plain",
|
|
126
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.camera
|
|
127
|
-
}]
|
|
128
|
-
}));
|
|
129
|
-
server.resource("Dashboard Setup", "ftc://dashboard/setup", async (uri) => ({
|
|
130
|
-
contents: [{
|
|
131
|
-
uri: uri.href,
|
|
132
|
-
mimeType: "text/plain",
|
|
133
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.setup
|
|
134
|
-
}]
|
|
135
|
-
}));
|
|
136
|
-
server.resource("Dashboard API", "ftc://dashboard/api", async (uri) => ({
|
|
137
|
-
contents: [{
|
|
138
|
-
uri: uri.href,
|
|
139
|
-
mimeType: "text/plain",
|
|
140
|
-
text: dashboard_js_1.DASHBOARD_KNOWLEDGE.api
|
|
141
|
-
}]
|
|
142
|
-
}));
|
|
143
|
-
// ── Gradle (GRADLE_KNOWLEDGE) ─────────────────────────────────────────
|
|
144
|
-
server.resource("Gradle Project Structure", "ftc://gradle/project-structure", async (uri) => ({
|
|
145
|
-
contents: [{
|
|
146
|
-
uri: uri.href,
|
|
147
|
-
mimeType: "text/plain",
|
|
148
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.projectStructure
|
|
149
|
-
}]
|
|
150
|
-
}));
|
|
151
|
-
server.resource("Adding Libraries", "ftc://gradle/adding-libraries", async (uri) => ({
|
|
152
|
-
contents: [{
|
|
153
|
-
uri: uri.href,
|
|
154
|
-
mimeType: "text/plain",
|
|
155
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.addingLibraries
|
|
156
|
-
}]
|
|
157
|
-
}));
|
|
158
|
-
server.resource("All Library Coordinates", "ftc://gradle/all-library-coords", async (uri) => ({
|
|
159
|
-
contents: [{
|
|
160
|
-
uri: uri.href,
|
|
161
|
-
mimeType: "text/plain",
|
|
162
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.allLibraryCoords
|
|
163
|
-
}]
|
|
164
|
-
}));
|
|
165
|
-
server.resource("Common Gradle Issues", "ftc://gradle/common-issues", async (uri) => ({
|
|
166
|
-
contents: [{
|
|
167
|
-
uri: uri.href,
|
|
168
|
-
mimeType: "text/plain",
|
|
169
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.commonIssues
|
|
170
|
-
}]
|
|
171
|
-
}));
|
|
172
|
-
server.resource("Build Process", "ftc://gradle/build-process", async (uri) => ({
|
|
173
|
-
contents: [{
|
|
174
|
-
uri: uri.href,
|
|
175
|
-
mimeType: "text/plain",
|
|
176
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.buildProcess
|
|
177
|
-
}]
|
|
178
|
-
}));
|
|
179
|
-
server.resource("Build and Deploy", "ftc://gradle/build-and-deploy", async (uri) => ({
|
|
180
|
-
contents: [{
|
|
181
|
-
uri: uri.href,
|
|
182
|
-
mimeType: "text/plain",
|
|
183
|
-
text: gradle_js_1.GRADLE_KNOWLEDGE.buildAndDeploy
|
|
184
|
-
}]
|
|
185
|
-
}));
|
|
186
|
-
// ── Hardware (HARDWARE_KNOWLEDGE) ─────────────────────────────────────
|
|
187
|
-
server.resource("Motors API", "ftc://hardware/motors/api", async (uri) => ({
|
|
188
|
-
contents: [{
|
|
189
|
-
uri: uri.href,
|
|
190
|
-
mimeType: "text/plain",
|
|
191
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.motorsApi
|
|
192
|
-
}]
|
|
193
|
-
}));
|
|
194
|
-
server.resource("Motor Run Modes", "ftc://hardware/motors/run-modes", async (uri) => ({
|
|
195
|
-
contents: [{
|
|
196
|
-
uri: uri.href,
|
|
197
|
-
mimeType: "text/plain",
|
|
198
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.motorRunModes
|
|
199
|
-
}]
|
|
200
|
-
}));
|
|
201
|
-
server.resource("Motor Specs", "ftc://hardware/motors/specs", async (uri) => ({
|
|
202
|
-
contents: [{
|
|
203
|
-
uri: uri.href,
|
|
204
|
-
mimeType: "text/plain",
|
|
205
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.motorSpecs
|
|
206
|
-
}]
|
|
207
|
-
}));
|
|
208
|
-
server.resource("Servos API", "ftc://hardware/servos/api", async (uri) => ({
|
|
209
|
-
contents: [{
|
|
210
|
-
uri: uri.href,
|
|
211
|
-
mimeType: "text/plain",
|
|
212
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.servosApi
|
|
213
|
-
}]
|
|
214
|
-
}));
|
|
215
|
-
server.resource("IMU Sensor", "ftc://hardware/sensors/imu", async (uri) => ({
|
|
216
|
-
contents: [{
|
|
217
|
-
uri: uri.href,
|
|
218
|
-
mimeType: "text/plain",
|
|
219
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.sensorsImu
|
|
220
|
-
}]
|
|
221
|
-
}));
|
|
222
|
-
server.resource("Distance Sensor", "ftc://hardware/sensors/distance", async (uri) => ({
|
|
223
|
-
contents: [{
|
|
224
|
-
uri: uri.href,
|
|
225
|
-
mimeType: "text/plain",
|
|
226
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.sensorsDistance
|
|
227
|
-
}]
|
|
228
|
-
}));
|
|
229
|
-
server.resource("Color Sensor", "ftc://hardware/sensors/color", async (uri) => ({
|
|
230
|
-
contents: [{
|
|
231
|
-
uri: uri.href,
|
|
232
|
-
mimeType: "text/plain",
|
|
233
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.sensorsColor
|
|
234
|
-
}]
|
|
235
|
-
}));
|
|
236
|
-
server.resource("Digital Sensors", "ftc://hardware/sensors/digital", async (uri) => ({
|
|
237
|
-
contents: [{
|
|
238
|
-
uri: uri.href,
|
|
239
|
-
mimeType: "text/plain",
|
|
240
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.sensorsDigital
|
|
241
|
-
}]
|
|
242
|
-
}));
|
|
243
|
-
server.resource("Encoders", "ftc://hardware/sensors/encoder", async (uri) => ({
|
|
244
|
-
contents: [{
|
|
245
|
-
uri: uri.href,
|
|
246
|
-
mimeType: "text/plain",
|
|
247
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.sensorsEncoder
|
|
248
|
-
}]
|
|
249
|
-
}));
|
|
250
|
-
server.resource("GoBilda Pinpoint", "ftc://hardware/pinpoint", async (uri) => ({
|
|
251
|
-
contents: [{
|
|
252
|
-
uri: uri.href,
|
|
253
|
-
mimeType: "text/plain",
|
|
254
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.pinpoint
|
|
255
|
-
}]
|
|
256
|
-
}));
|
|
257
|
-
server.resource("SparkFun OTOS", "ftc://hardware/otos", async (uri) => ({
|
|
258
|
-
contents: [{
|
|
259
|
-
uri: uri.href,
|
|
260
|
-
mimeType: "text/plain",
|
|
261
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.otos
|
|
262
|
-
}]
|
|
263
|
-
}));
|
|
264
|
-
server.resource("REV Hub", "ftc://hardware/rev-hub", async (uri) => ({
|
|
265
|
-
contents: [{
|
|
266
|
-
uri: uri.href,
|
|
267
|
-
mimeType: "text/plain",
|
|
268
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.revHub
|
|
269
|
-
}]
|
|
270
|
-
}));
|
|
271
|
-
server.resource("Bulk Reads", "ftc://hardware/bulk-reads", async (uri) => ({
|
|
272
|
-
contents: [{
|
|
273
|
-
uri: uri.href,
|
|
274
|
-
mimeType: "text/plain",
|
|
275
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.bulkReads
|
|
276
|
-
}]
|
|
277
|
-
}));
|
|
278
|
-
server.resource("Caching Hardware", "ftc://hardware/caching-hardware", async (uri) => ({
|
|
279
|
-
contents: [{
|
|
280
|
-
uri: uri.href,
|
|
281
|
-
mimeType: "text/plain",
|
|
282
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.cachingHardware
|
|
283
|
-
}]
|
|
284
|
-
}));
|
|
285
|
-
server.resource("Optimization Summary", "ftc://hardware/optimization-summary", async (uri) => ({
|
|
286
|
-
contents: [{
|
|
287
|
-
uri: uri.href,
|
|
288
|
-
mimeType: "text/plain",
|
|
289
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.optimizationSummary
|
|
290
|
-
}]
|
|
291
|
-
}));
|
|
292
|
-
server.resource("Custom Wrappers", "ftc://hardware/custom-wrappers", async (uri) => ({
|
|
293
|
-
contents: [{
|
|
294
|
-
uri: uri.href,
|
|
295
|
-
mimeType: "text/plain",
|
|
296
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.customWrappers
|
|
297
|
-
}]
|
|
298
|
-
}));
|
|
299
|
-
server.resource("Command Pipeline", "ftc://hardware/command-pipeline", async (uri) => ({
|
|
300
|
-
contents: [{
|
|
301
|
-
uri: uri.href,
|
|
302
|
-
mimeType: "text/plain",
|
|
303
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.commandPipeline
|
|
304
|
-
}]
|
|
305
|
-
}));
|
|
306
|
-
server.resource("Write Optimization", "ftc://hardware/write-optimization", async (uri) => ({
|
|
307
|
-
contents: [{
|
|
308
|
-
uri: uri.href,
|
|
309
|
-
mimeType: "text/plain",
|
|
310
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.writeOptimization
|
|
311
|
-
}]
|
|
312
|
-
}));
|
|
313
|
-
server.resource("Loop Time Budget", "ftc://hardware/loop-time-budget", async (uri) => ({
|
|
314
|
-
contents: [{
|
|
315
|
-
uri: uri.href,
|
|
316
|
-
mimeType: "text/plain",
|
|
317
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.loopTimeBudget
|
|
318
|
-
}]
|
|
319
|
-
}));
|
|
320
|
-
server.resource("Vision", "ftc://hardware/vision", async (uri) => ({
|
|
321
|
-
contents: [{
|
|
322
|
-
uri: uri.href,
|
|
323
|
-
mimeType: "text/plain",
|
|
324
|
-
text: hardware_js_1.HARDWARE_KNOWLEDGE.vision
|
|
325
|
-
}]
|
|
326
|
-
}));
|
|
327
|
-
// ── Road Runner (ROADRUNNER_KNOWLEDGE) ────────────────────────────────
|
|
328
|
-
server.resource("Road Runner API", "ftc://roadrunner/api-reference", async (uri) => ({
|
|
329
|
-
contents: [{
|
|
330
|
-
uri: uri.href,
|
|
331
|
-
mimeType: "text/plain",
|
|
332
|
-
text: roadrunner_js_1.ROADRUNNER_KNOWLEDGE.apiReference
|
|
333
|
-
}]
|
|
334
|
-
}));
|
|
335
|
-
// ── Command-Based / SolversLib (FTCLIB_KNOWLEDGE) ──────────────────────
|
|
336
|
-
server.resource("Command-Base Setup", "ftc://command-base/setup", async (uri) => ({
|
|
337
|
-
contents: [{
|
|
338
|
-
uri: uri.href,
|
|
339
|
-
mimeType: "text/plain",
|
|
340
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.setup
|
|
341
|
-
}]
|
|
342
|
-
}));
|
|
343
|
-
server.resource("Command-Base API", "ftc://command-base/api", async (uri) => ({
|
|
344
|
-
contents: [{
|
|
345
|
-
uri: uri.href,
|
|
346
|
-
mimeType: "text/plain",
|
|
347
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.apiReference
|
|
348
|
-
}]
|
|
349
|
-
}));
|
|
350
|
-
server.resource("Command-Base Subsystem Patterns", "ftc://command-base/subsystems", async (uri) => ({
|
|
351
|
-
contents: [{
|
|
352
|
-
uri: uri.href,
|
|
353
|
-
mimeType: "text/plain",
|
|
354
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.subsystemPatterns
|
|
355
|
-
}]
|
|
356
|
-
}));
|
|
357
|
-
server.resource("Command-Base Command Patterns", "ftc://command-base/commands", async (uri) => ({
|
|
358
|
-
contents: [{
|
|
359
|
-
uri: uri.href,
|
|
360
|
-
mimeType: "text/plain",
|
|
361
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.commandPatterns
|
|
362
|
-
}]
|
|
363
|
-
}));
|
|
364
|
-
server.resource("Command-Base Triggers & GamepadEx", "ftc://command-base/triggers", async (uri) => ({
|
|
365
|
-
contents: [{
|
|
366
|
-
uri: uri.href,
|
|
367
|
-
mimeType: "text/plain",
|
|
368
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.triggers
|
|
369
|
-
}]
|
|
370
|
-
}));
|
|
371
|
-
server.resource("Command-Base Project Organization", "ftc://command-base/organization", async (uri) => ({
|
|
372
|
-
contents: [{
|
|
373
|
-
uri: uri.href,
|
|
374
|
-
mimeType: "text/plain",
|
|
375
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.organization
|
|
376
|
-
}]
|
|
377
|
-
}));
|
|
378
|
-
server.resource("Command-Base Pedro Integration", "ftc://command-base/pedro-integration", async (uri) => ({
|
|
379
|
-
contents: [{
|
|
380
|
-
uri: uri.href,
|
|
381
|
-
mimeType: "text/plain",
|
|
382
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.pedroIntegration
|
|
383
|
-
}]
|
|
384
|
-
}));
|
|
385
|
-
server.resource("Command-Base SolversLib Extras", "ftc://command-base/extras", async (uri) => ({
|
|
386
|
-
contents: [{
|
|
387
|
-
uri: uri.href,
|
|
388
|
-
mimeType: "text/plain",
|
|
389
|
-
text: ftclib_js_1.FTCLIB_KNOWLEDGE.extras
|
|
390
|
-
}]
|
|
391
|
-
}));
|
|
392
|
-
// ── Vision (VISION_KNOWLEDGE) ─────────────────────────────────────────
|
|
393
|
-
server.resource("Vision Overview", "ftc://vision/overview", async (uri) => ({
|
|
394
|
-
contents: [{
|
|
395
|
-
uri: uri.href,
|
|
396
|
-
mimeType: "text/plain",
|
|
397
|
-
text: vision_js_1.VISION_KNOWLEDGE.overview
|
|
398
|
-
}]
|
|
399
|
-
}));
|
|
400
|
-
server.resource("VisionPortal Setup", "ftc://vision/visionportal-setup", async (uri) => ({
|
|
401
|
-
contents: [{
|
|
402
|
-
uri: uri.href,
|
|
403
|
-
mimeType: "text/plain",
|
|
404
|
-
text: vision_js_1.VISION_KNOWLEDGE.visionPortalSetup
|
|
405
|
-
}]
|
|
406
|
-
}));
|
|
407
|
-
server.resource("AprilTag Detection", "ftc://vision/apriltag-detection", async (uri) => ({
|
|
408
|
-
contents: [{
|
|
409
|
-
uri: uri.href,
|
|
410
|
-
mimeType: "text/plain",
|
|
411
|
-
text: vision_js_1.VISION_KNOWLEDGE.aprilTagDetection
|
|
412
|
-
}]
|
|
413
|
-
}));
|
|
414
|
-
server.resource("Camera Controls", "ftc://vision/camera-controls", async (uri) => ({
|
|
415
|
-
contents: [{
|
|
416
|
-
uri: uri.href,
|
|
417
|
-
mimeType: "text/plain",
|
|
418
|
-
text: vision_js_1.VISION_KNOWLEDGE.cameraControls
|
|
419
|
-
}]
|
|
420
|
-
}));
|
|
421
|
-
server.resource("Limelight 3A Guide", "ftc://vision/limelight", async (uri) => ({
|
|
422
|
-
contents: [{
|
|
423
|
-
uri: uri.href,
|
|
424
|
-
mimeType: "text/plain",
|
|
425
|
-
text: vision_js_1.VISION_KNOWLEDGE.limelight
|
|
426
|
-
}]
|
|
427
|
-
}));
|
|
428
|
-
server.resource("MegaTag Localization", "ftc://vision/megatag", async (uri) => ({
|
|
429
|
-
contents: [{
|
|
430
|
-
uri: uri.href,
|
|
431
|
-
mimeType: "text/plain",
|
|
432
|
-
text: vision_js_1.VISION_KNOWLEDGE.megaTag
|
|
433
|
-
}]
|
|
434
|
-
}));
|
|
435
|
-
server.resource("Color Detection", "ftc://vision/color-detection", async (uri) => ({
|
|
436
|
-
contents: [{
|
|
437
|
-
uri: uri.href,
|
|
438
|
-
mimeType: "text/plain",
|
|
439
|
-
text: vision_js_1.VISION_KNOWLEDGE.colorDetection
|
|
440
|
-
}]
|
|
441
|
-
}));
|
|
442
|
-
server.resource("Vision Optimization", "ftc://vision/optimization", async (uri) => ({
|
|
443
|
-
contents: [{
|
|
444
|
-
uri: uri.href,
|
|
445
|
-
mimeType: "text/plain",
|
|
446
|
-
text: vision_js_1.VISION_KNOWLEDGE.visionOptimization
|
|
447
|
-
}]
|
|
448
|
-
}));
|
|
449
|
-
server.resource("Multi-Camera Setup", "ftc://vision/multi-camera", async (uri) => ({
|
|
450
|
-
contents: [{
|
|
451
|
-
uri: uri.href,
|
|
452
|
-
mimeType: "text/plain",
|
|
453
|
-
text: vision_js_1.VISION_KNOWLEDGE.multiCamera
|
|
454
|
-
}]
|
|
455
|
-
}));
|
|
456
|
-
server.resource("Vision Patterns", "ftc://vision/patterns", async (uri) => ({
|
|
457
|
-
contents: [{
|
|
458
|
-
uri: uri.href,
|
|
459
|
-
mimeType: "text/plain",
|
|
460
|
-
text: vision_js_1.VISION_KNOWLEDGE.visionPatterns
|
|
461
|
-
}]
|
|
462
|
-
}));
|
|
463
|
-
// ── Panels (PANELS_KNOWLEDGE) ─────────────────────────────────────────
|
|
464
|
-
server.resource("Panels Overview", "ftc://panels/overview", async (uri) => ({
|
|
465
|
-
contents: [{
|
|
466
|
-
uri: uri.href,
|
|
467
|
-
mimeType: "text/plain",
|
|
468
|
-
text: panels_js_1.PANELS_KNOWLEDGE.overview
|
|
469
|
-
}]
|
|
470
|
-
}));
|
|
471
|
-
server.resource("Panels Setup", "ftc://panels/setup", async (uri) => ({
|
|
472
|
-
contents: [{
|
|
473
|
-
uri: uri.href,
|
|
474
|
-
mimeType: "text/plain",
|
|
475
|
-
text: panels_js_1.PANELS_KNOWLEDGE.setup
|
|
476
|
-
}]
|
|
477
|
-
}));
|
|
478
|
-
server.resource("Panels Configurables", "ftc://panels/configurables", async (uri) => ({
|
|
479
|
-
contents: [{
|
|
480
|
-
uri: uri.href,
|
|
481
|
-
mimeType: "text/plain",
|
|
482
|
-
text: panels_js_1.PANELS_KNOWLEDGE.configurables
|
|
483
|
-
}]
|
|
484
|
-
}));
|
|
485
|
-
server.resource("Panels Telemetry", "ftc://panels/telemetry", async (uri) => ({
|
|
486
|
-
contents: [{
|
|
487
|
-
uri: uri.href,
|
|
488
|
-
mimeType: "text/plain",
|
|
489
|
-
text: panels_js_1.PANELS_KNOWLEDGE.telemetry
|
|
490
|
-
}]
|
|
491
|
-
}));
|
|
492
|
-
server.resource("Panels Field Drawing", "ftc://panels/field", async (uri) => ({
|
|
493
|
-
contents: [{
|
|
494
|
-
uri: uri.href,
|
|
495
|
-
mimeType: "text/plain",
|
|
496
|
-
text: panels_js_1.PANELS_KNOWLEDGE.field
|
|
497
|
-
}]
|
|
498
|
-
}));
|
|
499
|
-
server.resource("Panels Limelight", "ftc://panels/limelight", async (uri) => ({
|
|
500
|
-
contents: [{
|
|
501
|
-
uri: uri.href,
|
|
502
|
-
mimeType: "text/plain",
|
|
503
|
-
text: panels_js_1.PANELS_KNOWLEDGE.limelight
|
|
504
|
-
}]
|
|
505
|
-
}));
|
|
506
|
-
server.resource("Panels Plugins", "ftc://panels/plugins", async (uri) => ({
|
|
507
|
-
contents: [{
|
|
508
|
-
uri: uri.href,
|
|
509
|
-
mimeType: "text/plain",
|
|
510
|
-
text: panels_js_1.PANELS_KNOWLEDGE.plugins
|
|
511
|
-
}]
|
|
512
|
-
}));
|
|
513
|
-
server.resource("Panels Gamepads", "ftc://panels/gamepads", async (uri) => ({
|
|
514
|
-
contents: [{
|
|
515
|
-
uri: uri.href,
|
|
516
|
-
mimeType: "text/plain",
|
|
517
|
-
text: panels_js_1.PANELS_KNOWLEDGE.gamepads
|
|
518
|
-
}]
|
|
519
|
-
}));
|
|
18
|
+
for (const [category, catDef] of Object.entries(index_js_1.CATEGORIES)) {
|
|
19
|
+
server.resource(catDef.label, new mcp_js_1.ResourceTemplate(`ftc://${category}/{topic}`, {
|
|
20
|
+
list: async () => ({
|
|
21
|
+
resources: (0, index_js_1.listResources)(category).map(r => ({
|
|
22
|
+
uri: r.uri,
|
|
23
|
+
name: r.name,
|
|
24
|
+
mimeType: "text/plain",
|
|
25
|
+
})),
|
|
26
|
+
}),
|
|
27
|
+
}), async (uri, { topic }) => {
|
|
28
|
+
const topicStr = Array.isArray(topic) ? topic[0] : topic;
|
|
29
|
+
const content = (0, index_js_1.getResource)(category, topicStr);
|
|
30
|
+
if (content) {
|
|
31
|
+
return {
|
|
32
|
+
contents: [{
|
|
33
|
+
uri: uri.href,
|
|
34
|
+
mimeType: "text/plain",
|
|
35
|
+
text: content,
|
|
36
|
+
}],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Topic not found — return available topics for this category
|
|
40
|
+
const available = (0, index_js_1.listResources)(category);
|
|
41
|
+
const topicList = available.map(r => ` - ${r.uri} (${r.name})`).join("\n");
|
|
42
|
+
return {
|
|
43
|
+
contents: [{
|
|
44
|
+
uri: uri.href,
|
|
45
|
+
mimeType: "text/plain",
|
|
46
|
+
text: `Topic "${topicStr}" not found in ${category}.\n\nAvailable:\n${topicList}`,
|
|
47
|
+
}],
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
}
|
|
520
51
|
}
|
package/build/server.js
CHANGED
|
@@ -8,7 +8,7 @@ const registry_js_3 = require("./prompts/registry.js");
|
|
|
8
8
|
function createServer() {
|
|
9
9
|
const server = new mcp_js_1.McpServer({
|
|
10
10
|
name: "ftc-mcp",
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1.0",
|
|
12
12
|
});
|
|
13
13
|
(0, registry_js_1.registerResources)(server);
|
|
14
14
|
(0, registry_js_2.registerTools)(server);
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Registration — Context-Optimized
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Cloudflare's Code Mode approach to reducing context window usage:
|
|
5
|
+
* - Consolidated from 6 tools → 3 tools (fewer tool definitions in context)
|
|
6
|
+
* - Compressed descriptions (no enumerated value lists in schemas)
|
|
7
|
+
* - Progressive discovery (available options returned at runtime, not upfront)
|
|
8
|
+
*
|
|
9
|
+
* Tools:
|
|
10
|
+
* 1. scan_project — merged scan_ftc_project + scan_hardware_config
|
|
11
|
+
* 2. search_knowledge — merged search_ftc_docs + get_ftc_example + get_hardware_reference
|
|
12
|
+
* 3. validate_ftc_code — same logic, shorter description
|
|
13
|
+
*/
|
|
1
14
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
15
|
export declare function registerTools(server: McpServer): void;
|