From 0263b3a59e0ec1f977efaed7d36c28d165aadca5 Mon Sep 17 00:00:00 2001 From: Njoyim Peguy Date: Thu, 10 Sep 2026 01:07:19 +0200 Subject: [PATCH 1/2] Update Crucible schema for 0.40.1 (#6330) Crucible 0.40.1 bounds the MCP block: at most 64 servers, and per server at most 256 arguments, 256 environment values and 256 inherited names. A configuration over any of those is now refused by the program, so the served schema marking it valid would point an editor at a file crucible will not load. Co-authored-by: Claude Opus 5 --- .../too-many-mcp-arguments.json | 268 ++++++++++++++++++ .../too-many-mcp-environment-values.json | 268 ++++++++++++++++++ .../too-many-mcp-inherited-names.json | 268 ++++++++++++++++++ .../too-many-mcp-servers.json | 201 +++++++++++++ src/schemas/json/crucible-code-schema.json | 4 + 5 files changed, 1009 insertions(+) create mode 100644 src/negative_test/crucible-code-schema/too-many-mcp-arguments.json create mode 100644 src/negative_test/crucible-code-schema/too-many-mcp-environment-values.json create mode 100644 src/negative_test/crucible-code-schema/too-many-mcp-inherited-names.json create mode 100644 src/negative_test/crucible-code-schema/too-many-mcp-servers.json diff --git a/src/negative_test/crucible-code-schema/too-many-mcp-arguments.json b/src/negative_test/crucible-code-schema/too-many-mcp-arguments.json new file mode 100644 index 00000000000..1459d2a8dac --- /dev/null +++ b/src/negative_test/crucible-code-schema/too-many-mcp-arguments.json @@ -0,0 +1,268 @@ +{ + "mcp": { + "servers": { + "docs": { + "args": [ + "--catalogue-000", + "--catalogue-001", + "--catalogue-002", + "--catalogue-003", + "--catalogue-004", + "--catalogue-005", + "--catalogue-006", + "--catalogue-007", + "--catalogue-008", + "--catalogue-009", + "--catalogue-010", + "--catalogue-011", + "--catalogue-012", + "--catalogue-013", + "--catalogue-014", + "--catalogue-015", + "--catalogue-016", + "--catalogue-017", + "--catalogue-018", + "--catalogue-019", + "--catalogue-020", + "--catalogue-021", + "--catalogue-022", + "--catalogue-023", + "--catalogue-024", + "--catalogue-025", + "--catalogue-026", + "--catalogue-027", + "--catalogue-028", + "--catalogue-029", + "--catalogue-030", + "--catalogue-031", + "--catalogue-032", + "--catalogue-033", + "--catalogue-034", + "--catalogue-035", + "--catalogue-036", + "--catalogue-037", + "--catalogue-038", + "--catalogue-039", + "--catalogue-040", + "--catalogue-041", + "--catalogue-042", + "--catalogue-043", + "--catalogue-044", + "--catalogue-045", + "--catalogue-046", + "--catalogue-047", + "--catalogue-048", + "--catalogue-049", + "--catalogue-050", + "--catalogue-051", + "--catalogue-052", + "--catalogue-053", + "--catalogue-054", + "--catalogue-055", + "--catalogue-056", + "--catalogue-057", + "--catalogue-058", + "--catalogue-059", + "--catalogue-060", + "--catalogue-061", + "--catalogue-062", + "--catalogue-063", + "--catalogue-064", + "--catalogue-065", + "--catalogue-066", + "--catalogue-067", + "--catalogue-068", + "--catalogue-069", + "--catalogue-070", + "--catalogue-071", + "--catalogue-072", + "--catalogue-073", + "--catalogue-074", + "--catalogue-075", + "--catalogue-076", + "--catalogue-077", + "--catalogue-078", + "--catalogue-079", + "--catalogue-080", + "--catalogue-081", + "--catalogue-082", + "--catalogue-083", + "--catalogue-084", + "--catalogue-085", + "--catalogue-086", + "--catalogue-087", + "--catalogue-088", + "--catalogue-089", + "--catalogue-090", + "--catalogue-091", + "--catalogue-092", + "--catalogue-093", + "--catalogue-094", + "--catalogue-095", + "--catalogue-096", + "--catalogue-097", + "--catalogue-098", + "--catalogue-099", + "--catalogue-100", + "--catalogue-101", + "--catalogue-102", + "--catalogue-103", + "--catalogue-104", + "--catalogue-105", + "--catalogue-106", + "--catalogue-107", + "--catalogue-108", + "--catalogue-109", + "--catalogue-110", + "--catalogue-111", + "--catalogue-112", + "--catalogue-113", + "--catalogue-114", + "--catalogue-115", + "--catalogue-116", + "--catalogue-117", + "--catalogue-118", + "--catalogue-119", + "--catalogue-120", + "--catalogue-121", + "--catalogue-122", + "--catalogue-123", + "--catalogue-124", + "--catalogue-125", + "--catalogue-126", + "--catalogue-127", + "--catalogue-128", + "--catalogue-129", + "--catalogue-130", + "--catalogue-131", + "--catalogue-132", + "--catalogue-133", + "--catalogue-134", + "--catalogue-135", + "--catalogue-136", + "--catalogue-137", + "--catalogue-138", + "--catalogue-139", + "--catalogue-140", + "--catalogue-141", + "--catalogue-142", + "--catalogue-143", + "--catalogue-144", + "--catalogue-145", + "--catalogue-146", + "--catalogue-147", + "--catalogue-148", + "--catalogue-149", + "--catalogue-150", + "--catalogue-151", + "--catalogue-152", + "--catalogue-153", + "--catalogue-154", + "--catalogue-155", + "--catalogue-156", + "--catalogue-157", + "--catalogue-158", + "--catalogue-159", + "--catalogue-160", + "--catalogue-161", + "--catalogue-162", + "--catalogue-163", + "--catalogue-164", + "--catalogue-165", + "--catalogue-166", + "--catalogue-167", + "--catalogue-168", + "--catalogue-169", + "--catalogue-170", + "--catalogue-171", + "--catalogue-172", + "--catalogue-173", + "--catalogue-174", + "--catalogue-175", + "--catalogue-176", + "--catalogue-177", + "--catalogue-178", + "--catalogue-179", + "--catalogue-180", + "--catalogue-181", + "--catalogue-182", + "--catalogue-183", + "--catalogue-184", + "--catalogue-185", + "--catalogue-186", + "--catalogue-187", + "--catalogue-188", + "--catalogue-189", + "--catalogue-190", + "--catalogue-191", + "--catalogue-192", + "--catalogue-193", + "--catalogue-194", + "--catalogue-195", + "--catalogue-196", + "--catalogue-197", + "--catalogue-198", + "--catalogue-199", + "--catalogue-200", + "--catalogue-201", + "--catalogue-202", + "--catalogue-203", + "--catalogue-204", + "--catalogue-205", + "--catalogue-206", + "--catalogue-207", + "--catalogue-208", + "--catalogue-209", + "--catalogue-210", + "--catalogue-211", + "--catalogue-212", + "--catalogue-213", + "--catalogue-214", + "--catalogue-215", + "--catalogue-216", + "--catalogue-217", + "--catalogue-218", + "--catalogue-219", + "--catalogue-220", + "--catalogue-221", + "--catalogue-222", + "--catalogue-223", + "--catalogue-224", + "--catalogue-225", + "--catalogue-226", + "--catalogue-227", + "--catalogue-228", + "--catalogue-229", + "--catalogue-230", + "--catalogue-231", + "--catalogue-232", + "--catalogue-233", + "--catalogue-234", + "--catalogue-235", + "--catalogue-236", + "--catalogue-237", + "--catalogue-238", + "--catalogue-239", + "--catalogue-240", + "--catalogue-241", + "--catalogue-242", + "--catalogue-243", + "--catalogue-244", + "--catalogue-245", + "--catalogue-246", + "--catalogue-247", + "--catalogue-248", + "--catalogue-249", + "--catalogue-250", + "--catalogue-251", + "--catalogue-252", + "--catalogue-253", + "--catalogue-254", + "--catalogue-255", + "--catalogue-256" + ], + "command": "docs-mcp" + } + } + } +} diff --git a/src/negative_test/crucible-code-schema/too-many-mcp-environment-values.json b/src/negative_test/crucible-code-schema/too-many-mcp-environment-values.json new file mode 100644 index 00000000000..a894523cc1a --- /dev/null +++ b/src/negative_test/crucible-code-schema/too-many-mcp-environment-values.json @@ -0,0 +1,268 @@ +{ + "mcp": { + "servers": { + "docs": { + "command": "docs-mcp", + "env": { + "DOCS_LOCALE_000": "en", + "DOCS_LOCALE_001": "en", + "DOCS_LOCALE_002": "en", + "DOCS_LOCALE_003": "en", + "DOCS_LOCALE_004": "en", + "DOCS_LOCALE_005": "en", + "DOCS_LOCALE_006": "en", + "DOCS_LOCALE_007": "en", + "DOCS_LOCALE_008": "en", + "DOCS_LOCALE_009": "en", + "DOCS_LOCALE_010": "en", + "DOCS_LOCALE_011": "en", + "DOCS_LOCALE_012": "en", + "DOCS_LOCALE_013": "en", + "DOCS_LOCALE_014": "en", + "DOCS_LOCALE_015": "en", + "DOCS_LOCALE_016": "en", + "DOCS_LOCALE_017": "en", + "DOCS_LOCALE_018": "en", + "DOCS_LOCALE_019": "en", + "DOCS_LOCALE_020": "en", + "DOCS_LOCALE_021": "en", + "DOCS_LOCALE_022": "en", + "DOCS_LOCALE_023": "en", + "DOCS_LOCALE_024": "en", + "DOCS_LOCALE_025": "en", + "DOCS_LOCALE_026": "en", + "DOCS_LOCALE_027": "en", + "DOCS_LOCALE_028": "en", + "DOCS_LOCALE_029": "en", + "DOCS_LOCALE_030": "en", + "DOCS_LOCALE_031": "en", + "DOCS_LOCALE_032": "en", + "DOCS_LOCALE_033": "en", + "DOCS_LOCALE_034": "en", + "DOCS_LOCALE_035": "en", + "DOCS_LOCALE_036": "en", + "DOCS_LOCALE_037": "en", + "DOCS_LOCALE_038": "en", + "DOCS_LOCALE_039": "en", + "DOCS_LOCALE_040": "en", + "DOCS_LOCALE_041": "en", + "DOCS_LOCALE_042": "en", + "DOCS_LOCALE_043": "en", + "DOCS_LOCALE_044": "en", + "DOCS_LOCALE_045": "en", + "DOCS_LOCALE_046": "en", + "DOCS_LOCALE_047": "en", + "DOCS_LOCALE_048": "en", + "DOCS_LOCALE_049": "en", + "DOCS_LOCALE_050": "en", + "DOCS_LOCALE_051": "en", + "DOCS_LOCALE_052": "en", + "DOCS_LOCALE_053": "en", + "DOCS_LOCALE_054": "en", + "DOCS_LOCALE_055": "en", + "DOCS_LOCALE_056": "en", + "DOCS_LOCALE_057": "en", + "DOCS_LOCALE_058": "en", + "DOCS_LOCALE_059": "en", + "DOCS_LOCALE_060": "en", + "DOCS_LOCALE_061": "en", + "DOCS_LOCALE_062": "en", + "DOCS_LOCALE_063": "en", + "DOCS_LOCALE_064": "en", + "DOCS_LOCALE_065": "en", + "DOCS_LOCALE_066": "en", + "DOCS_LOCALE_067": "en", + "DOCS_LOCALE_068": "en", + "DOCS_LOCALE_069": "en", + "DOCS_LOCALE_070": "en", + "DOCS_LOCALE_071": "en", + "DOCS_LOCALE_072": "en", + "DOCS_LOCALE_073": "en", + "DOCS_LOCALE_074": "en", + "DOCS_LOCALE_075": "en", + "DOCS_LOCALE_076": "en", + "DOCS_LOCALE_077": "en", + "DOCS_LOCALE_078": "en", + "DOCS_LOCALE_079": "en", + "DOCS_LOCALE_080": "en", + "DOCS_LOCALE_081": "en", + "DOCS_LOCALE_082": "en", + "DOCS_LOCALE_083": "en", + "DOCS_LOCALE_084": "en", + "DOCS_LOCALE_085": "en", + "DOCS_LOCALE_086": "en", + "DOCS_LOCALE_087": "en", + "DOCS_LOCALE_088": "en", + "DOCS_LOCALE_089": "en", + "DOCS_LOCALE_090": "en", + "DOCS_LOCALE_091": "en", + "DOCS_LOCALE_092": "en", + "DOCS_LOCALE_093": "en", + "DOCS_LOCALE_094": "en", + "DOCS_LOCALE_095": "en", + "DOCS_LOCALE_096": "en", + "DOCS_LOCALE_097": "en", + "DOCS_LOCALE_098": "en", + "DOCS_LOCALE_099": "en", + "DOCS_LOCALE_100": "en", + "DOCS_LOCALE_101": "en", + "DOCS_LOCALE_102": "en", + "DOCS_LOCALE_103": "en", + "DOCS_LOCALE_104": "en", + "DOCS_LOCALE_105": "en", + "DOCS_LOCALE_106": "en", + "DOCS_LOCALE_107": "en", + "DOCS_LOCALE_108": "en", + "DOCS_LOCALE_109": "en", + "DOCS_LOCALE_110": "en", + "DOCS_LOCALE_111": "en", + "DOCS_LOCALE_112": "en", + "DOCS_LOCALE_113": "en", + "DOCS_LOCALE_114": "en", + "DOCS_LOCALE_115": "en", + "DOCS_LOCALE_116": "en", + "DOCS_LOCALE_117": "en", + "DOCS_LOCALE_118": "en", + "DOCS_LOCALE_119": "en", + "DOCS_LOCALE_120": "en", + "DOCS_LOCALE_121": "en", + "DOCS_LOCALE_122": "en", + "DOCS_LOCALE_123": "en", + "DOCS_LOCALE_124": "en", + "DOCS_LOCALE_125": "en", + "DOCS_LOCALE_126": "en", + "DOCS_LOCALE_127": "en", + "DOCS_LOCALE_128": "en", + "DOCS_LOCALE_129": "en", + "DOCS_LOCALE_130": "en", + "DOCS_LOCALE_131": "en", + "DOCS_LOCALE_132": "en", + "DOCS_LOCALE_133": "en", + "DOCS_LOCALE_134": "en", + "DOCS_LOCALE_135": "en", + "DOCS_LOCALE_136": "en", + "DOCS_LOCALE_137": "en", + "DOCS_LOCALE_138": "en", + "DOCS_LOCALE_139": "en", + "DOCS_LOCALE_140": "en", + "DOCS_LOCALE_141": "en", + "DOCS_LOCALE_142": "en", + "DOCS_LOCALE_143": "en", + "DOCS_LOCALE_144": "en", + "DOCS_LOCALE_145": "en", + "DOCS_LOCALE_146": "en", + "DOCS_LOCALE_147": "en", + "DOCS_LOCALE_148": "en", + "DOCS_LOCALE_149": "en", + "DOCS_LOCALE_150": "en", + "DOCS_LOCALE_151": "en", + "DOCS_LOCALE_152": "en", + "DOCS_LOCALE_153": "en", + "DOCS_LOCALE_154": "en", + "DOCS_LOCALE_155": "en", + "DOCS_LOCALE_156": "en", + "DOCS_LOCALE_157": "en", + "DOCS_LOCALE_158": "en", + "DOCS_LOCALE_159": "en", + "DOCS_LOCALE_160": "en", + "DOCS_LOCALE_161": "en", + "DOCS_LOCALE_162": "en", + "DOCS_LOCALE_163": "en", + "DOCS_LOCALE_164": "en", + "DOCS_LOCALE_165": "en", + "DOCS_LOCALE_166": "en", + "DOCS_LOCALE_167": "en", + "DOCS_LOCALE_168": "en", + "DOCS_LOCALE_169": "en", + "DOCS_LOCALE_170": "en", + "DOCS_LOCALE_171": "en", + "DOCS_LOCALE_172": "en", + "DOCS_LOCALE_173": "en", + "DOCS_LOCALE_174": "en", + "DOCS_LOCALE_175": "en", + "DOCS_LOCALE_176": "en", + "DOCS_LOCALE_177": "en", + "DOCS_LOCALE_178": "en", + "DOCS_LOCALE_179": "en", + "DOCS_LOCALE_180": "en", + "DOCS_LOCALE_181": "en", + "DOCS_LOCALE_182": "en", + "DOCS_LOCALE_183": "en", + "DOCS_LOCALE_184": "en", + "DOCS_LOCALE_185": "en", + "DOCS_LOCALE_186": "en", + "DOCS_LOCALE_187": "en", + "DOCS_LOCALE_188": "en", + "DOCS_LOCALE_189": "en", + "DOCS_LOCALE_190": "en", + "DOCS_LOCALE_191": "en", + "DOCS_LOCALE_192": "en", + "DOCS_LOCALE_193": "en", + "DOCS_LOCALE_194": "en", + "DOCS_LOCALE_195": "en", + "DOCS_LOCALE_196": "en", + "DOCS_LOCALE_197": "en", + "DOCS_LOCALE_198": "en", + "DOCS_LOCALE_199": "en", + "DOCS_LOCALE_200": "en", + "DOCS_LOCALE_201": "en", + "DOCS_LOCALE_202": "en", + "DOCS_LOCALE_203": "en", + "DOCS_LOCALE_204": "en", + "DOCS_LOCALE_205": "en", + "DOCS_LOCALE_206": "en", + "DOCS_LOCALE_207": "en", + "DOCS_LOCALE_208": "en", + "DOCS_LOCALE_209": "en", + "DOCS_LOCALE_210": "en", + "DOCS_LOCALE_211": "en", + "DOCS_LOCALE_212": "en", + "DOCS_LOCALE_213": "en", + "DOCS_LOCALE_214": "en", + "DOCS_LOCALE_215": "en", + "DOCS_LOCALE_216": "en", + "DOCS_LOCALE_217": "en", + "DOCS_LOCALE_218": "en", + "DOCS_LOCALE_219": "en", + "DOCS_LOCALE_220": "en", + "DOCS_LOCALE_221": "en", + "DOCS_LOCALE_222": "en", + "DOCS_LOCALE_223": "en", + "DOCS_LOCALE_224": "en", + "DOCS_LOCALE_225": "en", + "DOCS_LOCALE_226": "en", + "DOCS_LOCALE_227": "en", + "DOCS_LOCALE_228": "en", + "DOCS_LOCALE_229": "en", + "DOCS_LOCALE_230": "en", + "DOCS_LOCALE_231": "en", + "DOCS_LOCALE_232": "en", + "DOCS_LOCALE_233": "en", + "DOCS_LOCALE_234": "en", + "DOCS_LOCALE_235": "en", + "DOCS_LOCALE_236": "en", + "DOCS_LOCALE_237": "en", + "DOCS_LOCALE_238": "en", + "DOCS_LOCALE_239": "en", + "DOCS_LOCALE_240": "en", + "DOCS_LOCALE_241": "en", + "DOCS_LOCALE_242": "en", + "DOCS_LOCALE_243": "en", + "DOCS_LOCALE_244": "en", + "DOCS_LOCALE_245": "en", + "DOCS_LOCALE_246": "en", + "DOCS_LOCALE_247": "en", + "DOCS_LOCALE_248": "en", + "DOCS_LOCALE_249": "en", + "DOCS_LOCALE_250": "en", + "DOCS_LOCALE_251": "en", + "DOCS_LOCALE_252": "en", + "DOCS_LOCALE_253": "en", + "DOCS_LOCALE_254": "en", + "DOCS_LOCALE_255": "en", + "DOCS_LOCALE_256": "en" + } + } + } + } +} diff --git a/src/negative_test/crucible-code-schema/too-many-mcp-inherited-names.json b/src/negative_test/crucible-code-schema/too-many-mcp-inherited-names.json new file mode 100644 index 00000000000..c939940d806 --- /dev/null +++ b/src/negative_test/crucible-code-schema/too-many-mcp-inherited-names.json @@ -0,0 +1,268 @@ +{ + "mcp": { + "servers": { + "docs": { + "command": "docs-mcp", + "envFrom": { + "DOCS_TOKEN_000": "MY_DOCS_TOKEN_000", + "DOCS_TOKEN_001": "MY_DOCS_TOKEN_001", + "DOCS_TOKEN_002": "MY_DOCS_TOKEN_002", + "DOCS_TOKEN_003": "MY_DOCS_TOKEN_003", + "DOCS_TOKEN_004": "MY_DOCS_TOKEN_004", + "DOCS_TOKEN_005": "MY_DOCS_TOKEN_005", + "DOCS_TOKEN_006": "MY_DOCS_TOKEN_006", + "DOCS_TOKEN_007": "MY_DOCS_TOKEN_007", + "DOCS_TOKEN_008": "MY_DOCS_TOKEN_008", + "DOCS_TOKEN_009": "MY_DOCS_TOKEN_009", + "DOCS_TOKEN_010": "MY_DOCS_TOKEN_010", + "DOCS_TOKEN_011": "MY_DOCS_TOKEN_011", + "DOCS_TOKEN_012": "MY_DOCS_TOKEN_012", + "DOCS_TOKEN_013": "MY_DOCS_TOKEN_013", + "DOCS_TOKEN_014": "MY_DOCS_TOKEN_014", + "DOCS_TOKEN_015": "MY_DOCS_TOKEN_015", + "DOCS_TOKEN_016": "MY_DOCS_TOKEN_016", + "DOCS_TOKEN_017": "MY_DOCS_TOKEN_017", + "DOCS_TOKEN_018": "MY_DOCS_TOKEN_018", + "DOCS_TOKEN_019": "MY_DOCS_TOKEN_019", + "DOCS_TOKEN_020": "MY_DOCS_TOKEN_020", + "DOCS_TOKEN_021": "MY_DOCS_TOKEN_021", + "DOCS_TOKEN_022": "MY_DOCS_TOKEN_022", + "DOCS_TOKEN_023": "MY_DOCS_TOKEN_023", + "DOCS_TOKEN_024": "MY_DOCS_TOKEN_024", + "DOCS_TOKEN_025": "MY_DOCS_TOKEN_025", + "DOCS_TOKEN_026": "MY_DOCS_TOKEN_026", + "DOCS_TOKEN_027": "MY_DOCS_TOKEN_027", + "DOCS_TOKEN_028": "MY_DOCS_TOKEN_028", + "DOCS_TOKEN_029": "MY_DOCS_TOKEN_029", + "DOCS_TOKEN_030": "MY_DOCS_TOKEN_030", + "DOCS_TOKEN_031": "MY_DOCS_TOKEN_031", + "DOCS_TOKEN_032": "MY_DOCS_TOKEN_032", + "DOCS_TOKEN_033": "MY_DOCS_TOKEN_033", + "DOCS_TOKEN_034": "MY_DOCS_TOKEN_034", + "DOCS_TOKEN_035": "MY_DOCS_TOKEN_035", + "DOCS_TOKEN_036": "MY_DOCS_TOKEN_036", + "DOCS_TOKEN_037": "MY_DOCS_TOKEN_037", + "DOCS_TOKEN_038": "MY_DOCS_TOKEN_038", + "DOCS_TOKEN_039": "MY_DOCS_TOKEN_039", + "DOCS_TOKEN_040": "MY_DOCS_TOKEN_040", + "DOCS_TOKEN_041": "MY_DOCS_TOKEN_041", + "DOCS_TOKEN_042": "MY_DOCS_TOKEN_042", + "DOCS_TOKEN_043": "MY_DOCS_TOKEN_043", + "DOCS_TOKEN_044": "MY_DOCS_TOKEN_044", + "DOCS_TOKEN_045": "MY_DOCS_TOKEN_045", + "DOCS_TOKEN_046": "MY_DOCS_TOKEN_046", + "DOCS_TOKEN_047": "MY_DOCS_TOKEN_047", + "DOCS_TOKEN_048": "MY_DOCS_TOKEN_048", + "DOCS_TOKEN_049": "MY_DOCS_TOKEN_049", + "DOCS_TOKEN_050": "MY_DOCS_TOKEN_050", + "DOCS_TOKEN_051": "MY_DOCS_TOKEN_051", + "DOCS_TOKEN_052": "MY_DOCS_TOKEN_052", + "DOCS_TOKEN_053": "MY_DOCS_TOKEN_053", + "DOCS_TOKEN_054": "MY_DOCS_TOKEN_054", + "DOCS_TOKEN_055": "MY_DOCS_TOKEN_055", + "DOCS_TOKEN_056": "MY_DOCS_TOKEN_056", + "DOCS_TOKEN_057": "MY_DOCS_TOKEN_057", + "DOCS_TOKEN_058": "MY_DOCS_TOKEN_058", + "DOCS_TOKEN_059": "MY_DOCS_TOKEN_059", + "DOCS_TOKEN_060": "MY_DOCS_TOKEN_060", + "DOCS_TOKEN_061": "MY_DOCS_TOKEN_061", + "DOCS_TOKEN_062": "MY_DOCS_TOKEN_062", + "DOCS_TOKEN_063": "MY_DOCS_TOKEN_063", + "DOCS_TOKEN_064": "MY_DOCS_TOKEN_064", + "DOCS_TOKEN_065": "MY_DOCS_TOKEN_065", + "DOCS_TOKEN_066": "MY_DOCS_TOKEN_066", + "DOCS_TOKEN_067": "MY_DOCS_TOKEN_067", + "DOCS_TOKEN_068": "MY_DOCS_TOKEN_068", + "DOCS_TOKEN_069": "MY_DOCS_TOKEN_069", + "DOCS_TOKEN_070": "MY_DOCS_TOKEN_070", + "DOCS_TOKEN_071": "MY_DOCS_TOKEN_071", + "DOCS_TOKEN_072": "MY_DOCS_TOKEN_072", + "DOCS_TOKEN_073": "MY_DOCS_TOKEN_073", + "DOCS_TOKEN_074": "MY_DOCS_TOKEN_074", + "DOCS_TOKEN_075": "MY_DOCS_TOKEN_075", + "DOCS_TOKEN_076": "MY_DOCS_TOKEN_076", + "DOCS_TOKEN_077": "MY_DOCS_TOKEN_077", + "DOCS_TOKEN_078": "MY_DOCS_TOKEN_078", + "DOCS_TOKEN_079": "MY_DOCS_TOKEN_079", + "DOCS_TOKEN_080": "MY_DOCS_TOKEN_080", + "DOCS_TOKEN_081": "MY_DOCS_TOKEN_081", + "DOCS_TOKEN_082": "MY_DOCS_TOKEN_082", + "DOCS_TOKEN_083": "MY_DOCS_TOKEN_083", + "DOCS_TOKEN_084": "MY_DOCS_TOKEN_084", + "DOCS_TOKEN_085": "MY_DOCS_TOKEN_085", + "DOCS_TOKEN_086": "MY_DOCS_TOKEN_086", + "DOCS_TOKEN_087": "MY_DOCS_TOKEN_087", + "DOCS_TOKEN_088": "MY_DOCS_TOKEN_088", + "DOCS_TOKEN_089": "MY_DOCS_TOKEN_089", + "DOCS_TOKEN_090": "MY_DOCS_TOKEN_090", + "DOCS_TOKEN_091": "MY_DOCS_TOKEN_091", + "DOCS_TOKEN_092": "MY_DOCS_TOKEN_092", + "DOCS_TOKEN_093": "MY_DOCS_TOKEN_093", + "DOCS_TOKEN_094": "MY_DOCS_TOKEN_094", + "DOCS_TOKEN_095": "MY_DOCS_TOKEN_095", + "DOCS_TOKEN_096": "MY_DOCS_TOKEN_096", + "DOCS_TOKEN_097": "MY_DOCS_TOKEN_097", + "DOCS_TOKEN_098": "MY_DOCS_TOKEN_098", + "DOCS_TOKEN_099": "MY_DOCS_TOKEN_099", + "DOCS_TOKEN_100": "MY_DOCS_TOKEN_100", + "DOCS_TOKEN_101": "MY_DOCS_TOKEN_101", + "DOCS_TOKEN_102": "MY_DOCS_TOKEN_102", + "DOCS_TOKEN_103": "MY_DOCS_TOKEN_103", + "DOCS_TOKEN_104": "MY_DOCS_TOKEN_104", + "DOCS_TOKEN_105": "MY_DOCS_TOKEN_105", + "DOCS_TOKEN_106": "MY_DOCS_TOKEN_106", + "DOCS_TOKEN_107": "MY_DOCS_TOKEN_107", + "DOCS_TOKEN_108": "MY_DOCS_TOKEN_108", + "DOCS_TOKEN_109": "MY_DOCS_TOKEN_109", + "DOCS_TOKEN_110": "MY_DOCS_TOKEN_110", + "DOCS_TOKEN_111": "MY_DOCS_TOKEN_111", + "DOCS_TOKEN_112": "MY_DOCS_TOKEN_112", + "DOCS_TOKEN_113": "MY_DOCS_TOKEN_113", + "DOCS_TOKEN_114": "MY_DOCS_TOKEN_114", + "DOCS_TOKEN_115": "MY_DOCS_TOKEN_115", + "DOCS_TOKEN_116": "MY_DOCS_TOKEN_116", + "DOCS_TOKEN_117": "MY_DOCS_TOKEN_117", + "DOCS_TOKEN_118": "MY_DOCS_TOKEN_118", + "DOCS_TOKEN_119": "MY_DOCS_TOKEN_119", + "DOCS_TOKEN_120": "MY_DOCS_TOKEN_120", + "DOCS_TOKEN_121": "MY_DOCS_TOKEN_121", + "DOCS_TOKEN_122": "MY_DOCS_TOKEN_122", + "DOCS_TOKEN_123": "MY_DOCS_TOKEN_123", + "DOCS_TOKEN_124": "MY_DOCS_TOKEN_124", + "DOCS_TOKEN_125": "MY_DOCS_TOKEN_125", + "DOCS_TOKEN_126": "MY_DOCS_TOKEN_126", + "DOCS_TOKEN_127": "MY_DOCS_TOKEN_127", + "DOCS_TOKEN_128": "MY_DOCS_TOKEN_128", + "DOCS_TOKEN_129": "MY_DOCS_TOKEN_129", + "DOCS_TOKEN_130": "MY_DOCS_TOKEN_130", + "DOCS_TOKEN_131": "MY_DOCS_TOKEN_131", + "DOCS_TOKEN_132": "MY_DOCS_TOKEN_132", + "DOCS_TOKEN_133": "MY_DOCS_TOKEN_133", + "DOCS_TOKEN_134": "MY_DOCS_TOKEN_134", + "DOCS_TOKEN_135": "MY_DOCS_TOKEN_135", + "DOCS_TOKEN_136": "MY_DOCS_TOKEN_136", + "DOCS_TOKEN_137": "MY_DOCS_TOKEN_137", + "DOCS_TOKEN_138": "MY_DOCS_TOKEN_138", + "DOCS_TOKEN_139": "MY_DOCS_TOKEN_139", + "DOCS_TOKEN_140": "MY_DOCS_TOKEN_140", + "DOCS_TOKEN_141": "MY_DOCS_TOKEN_141", + "DOCS_TOKEN_142": "MY_DOCS_TOKEN_142", + "DOCS_TOKEN_143": "MY_DOCS_TOKEN_143", + "DOCS_TOKEN_144": "MY_DOCS_TOKEN_144", + "DOCS_TOKEN_145": "MY_DOCS_TOKEN_145", + "DOCS_TOKEN_146": "MY_DOCS_TOKEN_146", + "DOCS_TOKEN_147": "MY_DOCS_TOKEN_147", + "DOCS_TOKEN_148": "MY_DOCS_TOKEN_148", + "DOCS_TOKEN_149": "MY_DOCS_TOKEN_149", + "DOCS_TOKEN_150": "MY_DOCS_TOKEN_150", + "DOCS_TOKEN_151": "MY_DOCS_TOKEN_151", + "DOCS_TOKEN_152": "MY_DOCS_TOKEN_152", + "DOCS_TOKEN_153": "MY_DOCS_TOKEN_153", + "DOCS_TOKEN_154": "MY_DOCS_TOKEN_154", + "DOCS_TOKEN_155": "MY_DOCS_TOKEN_155", + "DOCS_TOKEN_156": "MY_DOCS_TOKEN_156", + "DOCS_TOKEN_157": "MY_DOCS_TOKEN_157", + "DOCS_TOKEN_158": "MY_DOCS_TOKEN_158", + "DOCS_TOKEN_159": "MY_DOCS_TOKEN_159", + "DOCS_TOKEN_160": "MY_DOCS_TOKEN_160", + "DOCS_TOKEN_161": "MY_DOCS_TOKEN_161", + "DOCS_TOKEN_162": "MY_DOCS_TOKEN_162", + "DOCS_TOKEN_163": "MY_DOCS_TOKEN_163", + "DOCS_TOKEN_164": "MY_DOCS_TOKEN_164", + "DOCS_TOKEN_165": "MY_DOCS_TOKEN_165", + "DOCS_TOKEN_166": "MY_DOCS_TOKEN_166", + "DOCS_TOKEN_167": "MY_DOCS_TOKEN_167", + "DOCS_TOKEN_168": "MY_DOCS_TOKEN_168", + "DOCS_TOKEN_169": "MY_DOCS_TOKEN_169", + "DOCS_TOKEN_170": "MY_DOCS_TOKEN_170", + "DOCS_TOKEN_171": "MY_DOCS_TOKEN_171", + "DOCS_TOKEN_172": "MY_DOCS_TOKEN_172", + "DOCS_TOKEN_173": "MY_DOCS_TOKEN_173", + "DOCS_TOKEN_174": "MY_DOCS_TOKEN_174", + "DOCS_TOKEN_175": "MY_DOCS_TOKEN_175", + "DOCS_TOKEN_176": "MY_DOCS_TOKEN_176", + "DOCS_TOKEN_177": "MY_DOCS_TOKEN_177", + "DOCS_TOKEN_178": "MY_DOCS_TOKEN_178", + "DOCS_TOKEN_179": "MY_DOCS_TOKEN_179", + "DOCS_TOKEN_180": "MY_DOCS_TOKEN_180", + "DOCS_TOKEN_181": "MY_DOCS_TOKEN_181", + "DOCS_TOKEN_182": "MY_DOCS_TOKEN_182", + "DOCS_TOKEN_183": "MY_DOCS_TOKEN_183", + "DOCS_TOKEN_184": "MY_DOCS_TOKEN_184", + "DOCS_TOKEN_185": "MY_DOCS_TOKEN_185", + "DOCS_TOKEN_186": "MY_DOCS_TOKEN_186", + "DOCS_TOKEN_187": "MY_DOCS_TOKEN_187", + "DOCS_TOKEN_188": "MY_DOCS_TOKEN_188", + "DOCS_TOKEN_189": "MY_DOCS_TOKEN_189", + "DOCS_TOKEN_190": "MY_DOCS_TOKEN_190", + "DOCS_TOKEN_191": "MY_DOCS_TOKEN_191", + "DOCS_TOKEN_192": "MY_DOCS_TOKEN_192", + "DOCS_TOKEN_193": "MY_DOCS_TOKEN_193", + "DOCS_TOKEN_194": "MY_DOCS_TOKEN_194", + "DOCS_TOKEN_195": "MY_DOCS_TOKEN_195", + "DOCS_TOKEN_196": "MY_DOCS_TOKEN_196", + "DOCS_TOKEN_197": "MY_DOCS_TOKEN_197", + "DOCS_TOKEN_198": "MY_DOCS_TOKEN_198", + "DOCS_TOKEN_199": "MY_DOCS_TOKEN_199", + "DOCS_TOKEN_200": "MY_DOCS_TOKEN_200", + "DOCS_TOKEN_201": "MY_DOCS_TOKEN_201", + "DOCS_TOKEN_202": "MY_DOCS_TOKEN_202", + "DOCS_TOKEN_203": "MY_DOCS_TOKEN_203", + "DOCS_TOKEN_204": "MY_DOCS_TOKEN_204", + "DOCS_TOKEN_205": "MY_DOCS_TOKEN_205", + "DOCS_TOKEN_206": "MY_DOCS_TOKEN_206", + "DOCS_TOKEN_207": "MY_DOCS_TOKEN_207", + "DOCS_TOKEN_208": "MY_DOCS_TOKEN_208", + "DOCS_TOKEN_209": "MY_DOCS_TOKEN_209", + "DOCS_TOKEN_210": "MY_DOCS_TOKEN_210", + "DOCS_TOKEN_211": "MY_DOCS_TOKEN_211", + "DOCS_TOKEN_212": "MY_DOCS_TOKEN_212", + "DOCS_TOKEN_213": "MY_DOCS_TOKEN_213", + "DOCS_TOKEN_214": "MY_DOCS_TOKEN_214", + "DOCS_TOKEN_215": "MY_DOCS_TOKEN_215", + "DOCS_TOKEN_216": "MY_DOCS_TOKEN_216", + "DOCS_TOKEN_217": "MY_DOCS_TOKEN_217", + "DOCS_TOKEN_218": "MY_DOCS_TOKEN_218", + "DOCS_TOKEN_219": "MY_DOCS_TOKEN_219", + "DOCS_TOKEN_220": "MY_DOCS_TOKEN_220", + "DOCS_TOKEN_221": "MY_DOCS_TOKEN_221", + "DOCS_TOKEN_222": "MY_DOCS_TOKEN_222", + "DOCS_TOKEN_223": "MY_DOCS_TOKEN_223", + "DOCS_TOKEN_224": "MY_DOCS_TOKEN_224", + "DOCS_TOKEN_225": "MY_DOCS_TOKEN_225", + "DOCS_TOKEN_226": "MY_DOCS_TOKEN_226", + "DOCS_TOKEN_227": "MY_DOCS_TOKEN_227", + "DOCS_TOKEN_228": "MY_DOCS_TOKEN_228", + "DOCS_TOKEN_229": "MY_DOCS_TOKEN_229", + "DOCS_TOKEN_230": "MY_DOCS_TOKEN_230", + "DOCS_TOKEN_231": "MY_DOCS_TOKEN_231", + "DOCS_TOKEN_232": "MY_DOCS_TOKEN_232", + "DOCS_TOKEN_233": "MY_DOCS_TOKEN_233", + "DOCS_TOKEN_234": "MY_DOCS_TOKEN_234", + "DOCS_TOKEN_235": "MY_DOCS_TOKEN_235", + "DOCS_TOKEN_236": "MY_DOCS_TOKEN_236", + "DOCS_TOKEN_237": "MY_DOCS_TOKEN_237", + "DOCS_TOKEN_238": "MY_DOCS_TOKEN_238", + "DOCS_TOKEN_239": "MY_DOCS_TOKEN_239", + "DOCS_TOKEN_240": "MY_DOCS_TOKEN_240", + "DOCS_TOKEN_241": "MY_DOCS_TOKEN_241", + "DOCS_TOKEN_242": "MY_DOCS_TOKEN_242", + "DOCS_TOKEN_243": "MY_DOCS_TOKEN_243", + "DOCS_TOKEN_244": "MY_DOCS_TOKEN_244", + "DOCS_TOKEN_245": "MY_DOCS_TOKEN_245", + "DOCS_TOKEN_246": "MY_DOCS_TOKEN_246", + "DOCS_TOKEN_247": "MY_DOCS_TOKEN_247", + "DOCS_TOKEN_248": "MY_DOCS_TOKEN_248", + "DOCS_TOKEN_249": "MY_DOCS_TOKEN_249", + "DOCS_TOKEN_250": "MY_DOCS_TOKEN_250", + "DOCS_TOKEN_251": "MY_DOCS_TOKEN_251", + "DOCS_TOKEN_252": "MY_DOCS_TOKEN_252", + "DOCS_TOKEN_253": "MY_DOCS_TOKEN_253", + "DOCS_TOKEN_254": "MY_DOCS_TOKEN_254", + "DOCS_TOKEN_255": "MY_DOCS_TOKEN_255", + "DOCS_TOKEN_256": "MY_DOCS_TOKEN_256" + } + } + } + } +} diff --git a/src/negative_test/crucible-code-schema/too-many-mcp-servers.json b/src/negative_test/crucible-code-schema/too-many-mcp-servers.json new file mode 100644 index 00000000000..9817e6f9aac --- /dev/null +++ b/src/negative_test/crucible-code-schema/too-many-mcp-servers.json @@ -0,0 +1,201 @@ +{ + "mcp": { + "servers": { + "docs-00": { + "command": "docs-mcp" + }, + "docs-01": { + "command": "docs-mcp" + }, + "docs-02": { + "command": "docs-mcp" + }, + "docs-03": { + "command": "docs-mcp" + }, + "docs-04": { + "command": "docs-mcp" + }, + "docs-05": { + "command": "docs-mcp" + }, + "docs-06": { + "command": "docs-mcp" + }, + "docs-07": { + "command": "docs-mcp" + }, + "docs-08": { + "command": "docs-mcp" + }, + "docs-09": { + "command": "docs-mcp" + }, + "docs-10": { + "command": "docs-mcp" + }, + "docs-11": { + "command": "docs-mcp" + }, + "docs-12": { + "command": "docs-mcp" + }, + "docs-13": { + "command": "docs-mcp" + }, + "docs-14": { + "command": "docs-mcp" + }, + "docs-15": { + "command": "docs-mcp" + }, + "docs-16": { + "command": "docs-mcp" + }, + "docs-17": { + "command": "docs-mcp" + }, + "docs-18": { + "command": "docs-mcp" + }, + "docs-19": { + "command": "docs-mcp" + }, + "docs-20": { + "command": "docs-mcp" + }, + "docs-21": { + "command": "docs-mcp" + }, + "docs-22": { + "command": "docs-mcp" + }, + "docs-23": { + "command": "docs-mcp" + }, + "docs-24": { + "command": "docs-mcp" + }, + "docs-25": { + "command": "docs-mcp" + }, + "docs-26": { + "command": "docs-mcp" + }, + "docs-27": { + "command": "docs-mcp" + }, + "docs-28": { + "command": "docs-mcp" + }, + "docs-29": { + "command": "docs-mcp" + }, + "docs-30": { + "command": "docs-mcp" + }, + "docs-31": { + "command": "docs-mcp" + }, + "docs-32": { + "command": "docs-mcp" + }, + "docs-33": { + "command": "docs-mcp" + }, + "docs-34": { + "command": "docs-mcp" + }, + "docs-35": { + "command": "docs-mcp" + }, + "docs-36": { + "command": "docs-mcp" + }, + "docs-37": { + "command": "docs-mcp" + }, + "docs-38": { + "command": "docs-mcp" + }, + "docs-39": { + "command": "docs-mcp" + }, + "docs-40": { + "command": "docs-mcp" + }, + "docs-41": { + "command": "docs-mcp" + }, + "docs-42": { + "command": "docs-mcp" + }, + "docs-43": { + "command": "docs-mcp" + }, + "docs-44": { + "command": "docs-mcp" + }, + "docs-45": { + "command": "docs-mcp" + }, + "docs-46": { + "command": "docs-mcp" + }, + "docs-47": { + "command": "docs-mcp" + }, + "docs-48": { + "command": "docs-mcp" + }, + "docs-49": { + "command": "docs-mcp" + }, + "docs-50": { + "command": "docs-mcp" + }, + "docs-51": { + "command": "docs-mcp" + }, + "docs-52": { + "command": "docs-mcp" + }, + "docs-53": { + "command": "docs-mcp" + }, + "docs-54": { + "command": "docs-mcp" + }, + "docs-55": { + "command": "docs-mcp" + }, + "docs-56": { + "command": "docs-mcp" + }, + "docs-57": { + "command": "docs-mcp" + }, + "docs-58": { + "command": "docs-mcp" + }, + "docs-59": { + "command": "docs-mcp" + }, + "docs-60": { + "command": "docs-mcp" + }, + "docs-61": { + "command": "docs-mcp" + }, + "docs-62": { + "command": "docs-mcp" + }, + "docs-63": { + "command": "docs-mcp" + }, + "docs-64": { + "command": "docs-mcp" + } + } + } +} diff --git a/src/schemas/json/crucible-code-schema.json b/src/schemas/json/crucible-code-schema.json index 1118ff5cd15..6b3a17490d9 100644 --- a/src/schemas/json/crucible-code-schema.json +++ b/src/schemas/json/crucible-code-schema.json @@ -177,6 +177,7 @@ "examples": ["-y", "@example/docs-mcp"], "type": "string" }, + "maxItems": 256, "type": "array" }, "command": { @@ -197,6 +198,7 @@ "type": "string" }, "description": "Environment variables for this server, applied verbatim — values, so nothing secret belongs here. Read only from the configuration file in your home directory", + "maxProperties": 256, "properties": { "$schema": { "type": "string" @@ -222,6 +224,7 @@ "type": "string" }, "description": "Environment variables for this server taken from crucible's own, keyed by the name the server reads and holding the name crucible reads — names, never secrets. Read only from the configuration file in your home directory", + "maxProperties": 256, "properties": { "$schema": { "type": "string" @@ -276,6 +279,7 @@ "type": "object" }, "description": "MCP servers that may be selected, keyed by the identifier their tools are qualified by. Nothing is started by being written here", + "maxProperties": 64, "properties": { "$schema": { "type": "string" From 4ddb15055a851a1acc5ee66ccce4f1f7eba6a4bc Mon Sep 17 00:00:00 2001 From: Becca Petrin Date: Wed, 9 Sep 2026 16:07:22 -0700 Subject: [PATCH 2/2] Add Defakto CI configuration to catalog.json (#6331) --- src/api/json/catalog.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index f312ffae0de..551fa7d3ecb 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -11675,6 +11675,12 @@ "description": "Rights-labelled video-production delivery manifest", "fileMatch": ["production-delivery-manifest.json"], "url": "https://raw.githubusercontent.com/SHARProduction/production-delivery-manifest-schema/v1.0.0/schema.json" + }, + { + "name": "Defakto CI", + "description": "CI configuration files used at Defakto Security", + "fileMatch": ["**/.defakto/ci.yaml"], + "url": "https://defakto-security.github.io/build-actions/ci.schema.json" } ] }