@alpic-ai/api 0.0.0-dev.ge78b722 → 0.0.0-dev.ge796b9a
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/dist/index.d.mts +1065 -46
- package/dist/index.mjs +378 -152
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import * as z$1 from "zod/v4";
|
|
3
3
|
import { oc } from "@orpc/contract";
|
|
4
4
|
import ms from "ms";
|
|
5
|
-
//#region ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.
|
|
5
|
+
//#region ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.30.0_supports-color@7.2.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/auth.js
|
|
6
6
|
/**
|
|
7
7
|
* Reusable URL validation that disallows javascript: scheme
|
|
8
8
|
*/
|
|
@@ -169,11 +169,21 @@ z$1.object({
|
|
|
169
169
|
token: z$1.string(),
|
|
170
170
|
token_type_hint: z$1.string().optional()
|
|
171
171
|
}).strip();
|
|
172
|
-
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region ../domains/dist/index.mjs
|
|
174
|
+
const AI_PLATFORMS = ["chatgpt", "claudeai"];
|
|
175
|
+
const platformSchema = z.enum(AI_PLATFORMS);
|
|
173
176
|
const PLATFORM_LABELS = {
|
|
174
177
|
chatgpt: "ChatGPT",
|
|
175
178
|
claudeai: "Claude.ai"
|
|
176
179
|
};
|
|
180
|
+
const WAF_PLATFORMS = [
|
|
181
|
+
"akamai",
|
|
182
|
+
"cloudflare",
|
|
183
|
+
"fastly"
|
|
184
|
+
];
|
|
185
|
+
const ALLOWED_PLATFORMS = [...AI_PLATFORMS, ...WAF_PLATFORMS];
|
|
186
|
+
const allowedPlatformSchema = z.enum(ALLOWED_PLATFORMS);
|
|
177
187
|
const auditStatusSchema = z.enum([
|
|
178
188
|
"pending",
|
|
179
189
|
"partial",
|
|
@@ -273,34 +283,51 @@ const deploymentSummarySchema = z.object({
|
|
|
273
283
|
createdAt: z.coerce.date(),
|
|
274
284
|
updatedAt: z.coerce.date()
|
|
275
285
|
});
|
|
276
|
-
/**
|
|
277
|
-
* Public environment
|
|
278
|
-
*
|
|
279
|
-
* No OAuth metadata exposed.
|
|
280
|
-
*/
|
|
286
|
+
/** Public environment: answers anonymously and exposes no OAuth metadata. */
|
|
281
287
|
const publicEnvironmentSchema = z.object({
|
|
288
|
+
allowsAnonymous: z.literal(true),
|
|
289
|
+
oAuthMetadata: z.strictObject({})
|
|
290
|
+
});
|
|
291
|
+
/** Protected environment whose external resource metadata URL is returned in the WWW-Authenticate header on the first 401; everything after is handled outside the MCP server scope. */
|
|
292
|
+
const externalResourceMetadataEnvironmentSchema = z.object({
|
|
293
|
+
allowsAnonymous: z.boolean(),
|
|
294
|
+
oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
|
|
295
|
+
scope: z.string().optional()
|
|
296
|
+
});
|
|
297
|
+
/** Protected environment whose own /.well-known/oauth-protected-resource endpoint points at an external authorization server; everything after is handled outside the MCP server scope. */
|
|
298
|
+
const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
299
|
+
allowsAnonymous: z.boolean(),
|
|
300
|
+
oAuthMetadata: z.object({
|
|
301
|
+
externalAuthorizationServerUrl: z.url(),
|
|
302
|
+
resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
|
|
303
|
+
}),
|
|
304
|
+
scope: z.string().optional()
|
|
305
|
+
});
|
|
306
|
+
/** Standalone protected environment: the server itself exposes both the /.well-known/oauth-protected-resource and /.well-known/oauth-authorization-server endpoints. */
|
|
307
|
+
const standaloneEnvironmentSchema = z.object({
|
|
308
|
+
allowsAnonymous: z.boolean(),
|
|
309
|
+
oAuthMetadata: z.object({
|
|
310
|
+
authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
|
|
311
|
+
resourceMetadata: OAuthProtectedResourceMetadataSchema.optional()
|
|
312
|
+
}),
|
|
313
|
+
scope: z.string().optional()
|
|
314
|
+
});
|
|
315
|
+
/** Protected environment that enforces authentication but advertises no OAuth discovery metadata; clients must obtain credentials out-of-band. */
|
|
316
|
+
const protectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
317
|
+
allowsAnonymous: z.literal(false),
|
|
318
|
+
oAuthMetadata: z.strictObject({}),
|
|
319
|
+
scope: z.string().optional()
|
|
320
|
+
});
|
|
321
|
+
const legacyPublicEnvironmentSchema = z.object({
|
|
282
322
|
isPublic: z.literal(true),
|
|
283
323
|
oAuthMetadata: z.undefined().optional()
|
|
284
324
|
});
|
|
285
|
-
|
|
286
|
-
* Protected environment with an external resource metadata URL
|
|
287
|
-
*
|
|
288
|
-
* An external resource metadata URL is returned in the WWW-Authenticate header during the first 401 response.
|
|
289
|
-
* Everything that follows is handled outside of the MCP server scope.
|
|
290
|
-
*/
|
|
291
|
-
const externalResourceMetadataEnvironmentSchema = z.object({
|
|
325
|
+
const legacyExternalResourceMetadataEnvironmentSchema = z.object({
|
|
292
326
|
isPublic: z.literal(false),
|
|
293
327
|
oAuthMetadata: z.object({ externalResourceMetadataUrl: z.url() }),
|
|
294
328
|
scope: z.string().optional()
|
|
295
329
|
});
|
|
296
|
-
|
|
297
|
-
* Protected environment with an external authorization server URL
|
|
298
|
-
*
|
|
299
|
-
* The server itself exposes the /.well-known/oauth-protected-resource endpoint.
|
|
300
|
-
* An external authorization server URL is returned when requesting the endpoint.
|
|
301
|
-
* Everything that follows is handled outside of the MCP server scope.
|
|
302
|
-
*/
|
|
303
|
-
const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
330
|
+
const legacyExternalAuthorizationServerEnvironmentSchema = z.object({
|
|
304
331
|
isPublic: z.literal(false),
|
|
305
332
|
oAuthMetadata: z.object({
|
|
306
333
|
externalAuthorizationServerUrl: z.url(),
|
|
@@ -308,13 +335,7 @@ const externalAuthorizationServerEnvironmentSchema = z.object({
|
|
|
308
335
|
}),
|
|
309
336
|
scope: z.string().optional()
|
|
310
337
|
});
|
|
311
|
-
|
|
312
|
-
* Standalone protected environment
|
|
313
|
-
*
|
|
314
|
-
* The server itself exposes the /.well-known/oauth-protected-resource endpoint.
|
|
315
|
-
* The server itself exposes the /.well-known/oauth-authorization-server endpoint.
|
|
316
|
-
*/
|
|
317
|
-
const standaloneEnvironmentSchema = z.object({
|
|
338
|
+
const legacyStandaloneEnvironmentSchema = z.object({
|
|
318
339
|
isPublic: z.literal(false),
|
|
319
340
|
oAuthMetadata: z.object({
|
|
320
341
|
authorizationServerMetadata: z.union([OAuthMetadataSchema, OpenIdProviderDiscoveryMetadataSchema]),
|
|
@@ -322,14 +343,7 @@ const standaloneEnvironmentSchema = z.object({
|
|
|
322
343
|
}),
|
|
323
344
|
scope: z.string().optional()
|
|
324
345
|
});
|
|
325
|
-
|
|
326
|
-
* Protected environment without OAuth discovery
|
|
327
|
-
*
|
|
328
|
-
* The server enforces authentication but exposes no OAuth discovery metadata.
|
|
329
|
-
* Neither /.well-known/oauth-protected-resource nor /.well-known/oauth-authorization-server
|
|
330
|
-
* are advertised. Clients must obtain credentials out-of-band.
|
|
331
|
-
*/
|
|
332
|
-
const protectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
346
|
+
const legacyProtectedWithoutDiscoveryEnvironmentSchema = z.object({
|
|
333
347
|
isPublic: z.literal(false),
|
|
334
348
|
oAuthMetadata: z.strictObject({}),
|
|
335
349
|
scope: z.string().optional()
|
|
@@ -339,9 +353,13 @@ z.union([
|
|
|
339
353
|
externalResourceMetadataEnvironmentSchema,
|
|
340
354
|
externalAuthorizationServerEnvironmentSchema,
|
|
341
355
|
standaloneEnvironmentSchema,
|
|
342
|
-
protectedWithoutDiscoveryEnvironmentSchema
|
|
356
|
+
protectedWithoutDiscoveryEnvironmentSchema,
|
|
357
|
+
legacyPublicEnvironmentSchema,
|
|
358
|
+
legacyExternalResourceMetadataEnvironmentSchema,
|
|
359
|
+
legacyExternalAuthorizationServerEnvironmentSchema,
|
|
360
|
+
legacyStandaloneEnvironmentSchema,
|
|
361
|
+
legacyProtectedWithoutDiscoveryEnvironmentSchema
|
|
343
362
|
]);
|
|
344
|
-
const allowedPlatformSchema = platformSchema;
|
|
345
363
|
const playgroundModelSchema = z.enum([
|
|
346
364
|
"global.anthropic.claude-haiku-4-5-20251001-v1:0",
|
|
347
365
|
"global.anthropic.claude-sonnet-4-5-20250929-v1:0",
|
|
@@ -381,14 +399,16 @@ z.object({
|
|
|
381
399
|
collectRequestPayload: z.boolean(),
|
|
382
400
|
collectResponsePayload: z.boolean(),
|
|
383
401
|
collectErrorMessage: z.boolean(),
|
|
384
|
-
collectUserData: z.boolean()
|
|
402
|
+
collectUserData: z.boolean(),
|
|
403
|
+
identityTraitKey: z.string().min(1).max(200).nullable()
|
|
385
404
|
});
|
|
386
405
|
z.object({
|
|
387
406
|
id: z.string(),
|
|
388
407
|
createdAt: z.coerce.date(),
|
|
389
408
|
environmentId: z.string(),
|
|
390
409
|
content: z.string(),
|
|
391
|
-
source: z.enum(["model", "user"])
|
|
410
|
+
source: z.enum(["model", "user"]),
|
|
411
|
+
clientName: z.string().nullable()
|
|
392
412
|
});
|
|
393
413
|
z.object({
|
|
394
414
|
content: z.string(),
|
|
@@ -424,6 +444,7 @@ z.object({
|
|
|
424
444
|
environmentId: z.string(),
|
|
425
445
|
toolName: z.string(),
|
|
426
446
|
message: z.string(),
|
|
447
|
+
clientName: z.string().nullable(),
|
|
427
448
|
categories: z.array(intentCategorySchema)
|
|
428
449
|
});
|
|
429
450
|
const signalCategorySchema = z.object({
|
|
@@ -488,6 +509,246 @@ z.enum([
|
|
|
488
509
|
"DEBUG",
|
|
489
510
|
"ERROR"
|
|
490
511
|
]);
|
|
512
|
+
/** Only names a vendor actually ships belong here: lookalikes like `claude-code-test` are customers' own scripts. */
|
|
513
|
+
const MCP_CLIENT_GROUPS = [
|
|
514
|
+
{
|
|
515
|
+
id: "claude_code",
|
|
516
|
+
label: "Claude Code",
|
|
517
|
+
vendor: "anthropic",
|
|
518
|
+
rawNames: ["claude-code", "Anthropic/ClaudeCodeDesktop"]
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
id: "claude",
|
|
522
|
+
label: "Claude",
|
|
523
|
+
vendor: "anthropic",
|
|
524
|
+
rawNames: [
|
|
525
|
+
"Anthropic/ClaudeAI",
|
|
526
|
+
"claude-ai",
|
|
527
|
+
"claude",
|
|
528
|
+
"Claude",
|
|
529
|
+
"claude-desktop",
|
|
530
|
+
"claude-desktop-3p"
|
|
531
|
+
]
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
id: "claude_mobile",
|
|
535
|
+
label: "Claude mobile",
|
|
536
|
+
vendor: "anthropic",
|
|
537
|
+
rawNames: ["claude-ios", "ClaudeAndroid"]
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
id: "claude_cowork",
|
|
541
|
+
label: "Claude Cowork",
|
|
542
|
+
vendor: "anthropic",
|
|
543
|
+
rawNames: ["Anthropic/Cowork"]
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
id: "claude_toolbox",
|
|
547
|
+
label: "Claude Toolbox",
|
|
548
|
+
vendor: "anthropic",
|
|
549
|
+
rawNames: ["Anthropic/Toolbox", "Anthropic/toolbox-bootstrap"]
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
id: "anthropic_api",
|
|
553
|
+
label: "Anthropic API",
|
|
554
|
+
vendor: "anthropic",
|
|
555
|
+
rawNames: ["Anthropic/API"]
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
id: "anthropic_connector_refresh",
|
|
559
|
+
label: "Anthropic (connector refresh)",
|
|
560
|
+
vendor: "anthropic",
|
|
561
|
+
rawNames: ["Anthropic"]
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
id: "codex",
|
|
565
|
+
label: "Codex",
|
|
566
|
+
vendor: "openai",
|
|
567
|
+
rawNames: [
|
|
568
|
+
"codex-mcp-client",
|
|
569
|
+
"codex",
|
|
570
|
+
"Codex",
|
|
571
|
+
"codex-cli",
|
|
572
|
+
"openai-mcp (Codex)"
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
id: "chatgpt",
|
|
577
|
+
label: "ChatGPT",
|
|
578
|
+
vendor: "openai",
|
|
579
|
+
rawNames: ["openai-mcp (ChatGPT)"]
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
id: "openai_responses_api",
|
|
583
|
+
label: "OpenAI Responses API",
|
|
584
|
+
vendor: "openai",
|
|
585
|
+
rawNames: ["openai-mcp (Responses API)"]
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
id: "openai_agent_builder",
|
|
589
|
+
label: "OpenAI Agent Builder",
|
|
590
|
+
vendor: "openai",
|
|
591
|
+
rawNames: ["openai-mcp (Agent Builder)"]
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
id: "openai_other",
|
|
595
|
+
label: "OpenAI Other",
|
|
596
|
+
vendor: "openai",
|
|
597
|
+
rawNames: ["openai-mcp"]
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
id: "cursor",
|
|
601
|
+
label: "Cursor",
|
|
602
|
+
vendor: "cursor",
|
|
603
|
+
rawNames: [
|
|
604
|
+
"cursor-vscode",
|
|
605
|
+
"Cursor",
|
|
606
|
+
"cursor"
|
|
607
|
+
]
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
id: "cline",
|
|
611
|
+
label: "Cline",
|
|
612
|
+
vendor: "cline",
|
|
613
|
+
rawNames: [
|
|
614
|
+
"Cline",
|
|
615
|
+
"cline",
|
|
616
|
+
"@cline/core"
|
|
617
|
+
]
|
|
618
|
+
},
|
|
619
|
+
{
|
|
620
|
+
id: "github_copilot",
|
|
621
|
+
label: "GitHub Copilot",
|
|
622
|
+
vendor: "githubCopilot",
|
|
623
|
+
rawNames: [
|
|
624
|
+
"Copilot",
|
|
625
|
+
"github-copilot-developer",
|
|
626
|
+
"Copilot MCP Gateway",
|
|
627
|
+
"Xcode/copilot-xcode"
|
|
628
|
+
]
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
id: "gemini_cli",
|
|
632
|
+
label: "Gemini CLI",
|
|
633
|
+
vendor: "google",
|
|
634
|
+
rawNames: ["gemini-cli-mcp-client", "gemini-cli"]
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
id: "antigravity",
|
|
638
|
+
label: "Antigravity",
|
|
639
|
+
vendor: "google",
|
|
640
|
+
rawNames: ["antigravity-client"]
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
id: "gemini",
|
|
644
|
+
label: "Gemini",
|
|
645
|
+
vendor: "google",
|
|
646
|
+
rawNames: ["Gemini", "google-ai-edge-gallery"]
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
id: "windsurf",
|
|
650
|
+
label: "Windsurf",
|
|
651
|
+
vendor: "windsurf",
|
|
652
|
+
rawNames: ["Windsurf", "windsurf-client"]
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
id: "mistral",
|
|
656
|
+
label: "Mistral / Le Chat",
|
|
657
|
+
vendor: "mistral",
|
|
658
|
+
rawNames: ["Mistral"],
|
|
659
|
+
rawNamePrefixes: ["connector:custom-mcp:"]
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
id: "n8n",
|
|
663
|
+
label: "n8n",
|
|
664
|
+
vendor: "n8n",
|
|
665
|
+
rawNames: [
|
|
666
|
+
"@n8n/n8n-nodes-langchain.mcpClient",
|
|
667
|
+
"@n8n/n8n-nodes-langchain.mcpClientTool",
|
|
668
|
+
"n8n"
|
|
669
|
+
]
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
id: "alpic_playground",
|
|
673
|
+
label: "Alpic Playground",
|
|
674
|
+
vendor: "alpic",
|
|
675
|
+
rawNames: ["alpic-playground", "playground"]
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
id: "opencode",
|
|
679
|
+
label: "opencode",
|
|
680
|
+
vendor: "opencode",
|
|
681
|
+
rawNames: ["opencode"]
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
id: "zed",
|
|
685
|
+
label: "Zed",
|
|
686
|
+
vendor: "zed",
|
|
687
|
+
rawNames: ["Zed", "zed"]
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
id: "zapier",
|
|
691
|
+
label: "Zapier",
|
|
692
|
+
vendor: "zapier",
|
|
693
|
+
rawNames: ["Zapier", "zapier"]
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
id: "make",
|
|
697
|
+
label: "Make",
|
|
698
|
+
vendor: "make",
|
|
699
|
+
rawNames: ["Make", "make"]
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
id: "librechat",
|
|
703
|
+
label: "LibreChat",
|
|
704
|
+
vendor: "mcp",
|
|
705
|
+
rawNames: ["LibreChat", "librechat"]
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
id: "jan",
|
|
709
|
+
label: "Jan",
|
|
710
|
+
vendor: "mcp",
|
|
711
|
+
rawNames: ["Jan", "jan"]
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
id: "goose",
|
|
715
|
+
label: "goose",
|
|
716
|
+
vendor: "mcp",
|
|
717
|
+
rawNames: ["goose", "Goose"]
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
id: "mcphost",
|
|
721
|
+
label: "mcphost",
|
|
722
|
+
vendor: "mcp",
|
|
723
|
+
rawNames: ["mcphost"]
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
id: "mcporter",
|
|
727
|
+
label: "mcporter",
|
|
728
|
+
vendor: "mcp",
|
|
729
|
+
rawNames: ["mcporter"]
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
id: "rmcp",
|
|
733
|
+
label: "rmcp",
|
|
734
|
+
vendor: "mcp",
|
|
735
|
+
rawNames: ["rmcp"]
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
id: "unnamed_client",
|
|
739
|
+
label: "Unnamed client",
|
|
740
|
+
vendor: "mcp",
|
|
741
|
+
rawNames: [
|
|
742
|
+
"mcp",
|
|
743
|
+
"unknown",
|
|
744
|
+
""
|
|
745
|
+
]
|
|
746
|
+
}
|
|
747
|
+
];
|
|
748
|
+
/** A source pattern, not a RegExp, because analytics renders the same rule into ClickHouse RE2, which shares this syntax. */
|
|
749
|
+
const MCP_REMOTE_WRAPPER_SUFFIX = String.raw` \(via mcp-remote [^\n]+?\)$`;
|
|
750
|
+
new RegExp(MCP_REMOTE_WRAPPER_SUFFIX);
|
|
751
|
+
new Map(MCP_CLIENT_GROUPS.map((group) => [group.id, group]));
|
|
491
752
|
const runtimeSchema = z.enum([
|
|
492
753
|
"python3.13",
|
|
493
754
|
"python3.14",
|
|
@@ -565,15 +826,7 @@ z.object({
|
|
|
565
826
|
serverFields: serverFieldsSchema$1,
|
|
566
827
|
source: z.enum(["registry", "defaults"])
|
|
567
828
|
});
|
|
568
|
-
/**
|
|
569
|
-
* Returns a variant of a `maxLength`-constrained string that clamps (truncates) instead of
|
|
570
|
-
* rejecting on overflow — used for AI-generated copy where the model routinely overshoots.
|
|
571
|
-
*
|
|
572
|
-
* NOTE: this rebuilds the schema from scratch, carrying over only `maxLength` (as a clamp),
|
|
573
|
-
* `minLength`, and the description. Any other validators on the source field (`.regex()`,
|
|
574
|
-
* `.email()`, custom refinements) are intentionally dropped — this helper is meant for plain
|
|
575
|
-
* free-text length caps only. A field with `null` `maxLength` is returned unchanged.
|
|
576
|
-
*/
|
|
829
|
+
/** Clamps instead of rejecting on max-length overflow (for AI-generated copy that overshoots); intentionally carries over only maxLength, minLength, and description, dropping any other validators. */
|
|
577
830
|
const clampStringField = (field) => {
|
|
578
831
|
const max = field.maxLength;
|
|
579
832
|
if (max === null) return field;
|
|
@@ -919,11 +1172,7 @@ const chatgptToolJustificationSchema = z.object({
|
|
|
919
1172
|
openWorldJustification: z.string().describe("One sentence on whether the tool reaches external systems beyond your own service."),
|
|
920
1173
|
destructiveJustification: z.string().describe("One sentence on whether the tool changes data. For a read-only tool, state the full triad: \"No data is created, modified, or deleted.\"")
|
|
921
1174
|
}).describe("Per-tool justification of each MCP annotation value (one specific sentence per hint).");
|
|
922
|
-
/**
|
|
923
|
-
* Base copy fields, defined once and reused by both the submission form and per-locale
|
|
924
|
-
* translations so the constraints (tagline ≤ 30 chars) never drift. The translation generation
|
|
925
|
-
* path wraps these in {@link clampStringField} since the LLM tends to overshoot the limit.
|
|
926
|
-
*/
|
|
1175
|
+
/** Defined once and reused by both the submission form and per-locale translations so the tagline ≤ 30 chars constraint never drifts. */
|
|
927
1176
|
const chatgptTaglineSchema = z.string().max(30);
|
|
928
1177
|
const chatgptDescriptionSchema = z.string();
|
|
929
1178
|
const chatgptTranslationSchema = z.object({
|
|
@@ -932,10 +1181,7 @@ const chatgptTranslationSchema = z.object({
|
|
|
932
1181
|
description: chatgptDescriptionSchema
|
|
933
1182
|
}).describe("Locale-scoped override for tagline + description. English (US) is the default.");
|
|
934
1183
|
chatgptTranslationSchema.extend({ tagline: clampStringField(chatgptTaglineSchema) });
|
|
935
|
-
/**
|
|
936
|
-
* Field order mirrors the ChatGPT (OpenAI) submission spreadsheet, grouped by section.
|
|
937
|
-
* When adding/removing/reordering fields, keep this in sync with the sheet.
|
|
938
|
-
*/
|
|
1184
|
+
/** Field order mirrors the ChatGPT (OpenAI) submission spreadsheet, grouped by section; keep it in sync with the sheet. */
|
|
939
1185
|
const chatgptSubmissionFormDataSchema = z.object({
|
|
940
1186
|
logoLight: z.string().describe("Logo icon for light mode. Square PNG, no borders or rounded corners (clients apply circular cropping)."),
|
|
941
1187
|
logoDark: z.string().optional().describe("Optional dark-mode logo icon. Square PNG, same specs as the light icon. Leave empty if the light icon also works on dark backgrounds."),
|
|
@@ -1032,11 +1278,7 @@ const claudePolicyAcknowledgementSchema = z.enum([
|
|
|
1032
1278
|
"My connector does not collect conversation data beyond what is needed for its function.",
|
|
1033
1279
|
"Public documentation for this connector will be live by the publish date."
|
|
1034
1280
|
]);
|
|
1035
|
-
/**
|
|
1036
|
-
* Field order mirrors the claude.ai directory submission wizard
|
|
1037
|
-
* (`claude.ai/admin-settings/directory/submissions/new`), grouped by step.
|
|
1038
|
-
* When adding/removing/reordering fields, keep this in sync with the wizard.
|
|
1039
|
-
*/
|
|
1281
|
+
/** Field order mirrors the claude.ai directory submission wizard (`claude.ai/admin-settings/directory/submissions/new`), grouped by step; keep it in sync with the wizard. */
|
|
1040
1282
|
const claudeSubmissionFormDataSchema = z.object({
|
|
1041
1283
|
serverUrl: z.url().describe(`The full https:// URL where your MCP server is hosted and reachable. In the claude.ai wizard this is read live
|
|
1042
1284
|
from the custom connector you select — the connection is used to verify the URL and the tool list at submission time.
|
|
@@ -1128,12 +1370,7 @@ claudeSubmissionFormDataSchema.pick({
|
|
|
1128
1370
|
connectionRequirements: claudeSubmissionFormDataSchema.shape.connectionRequirements.optional(),
|
|
1129
1371
|
testInstructions: claudeSubmissionFormDataSchema.shape.testInstructions.optional()
|
|
1130
1372
|
});
|
|
1131
|
-
/**
|
|
1132
|
-
* Narrative fields the LLM-backed generation step produces for Claude submissions.
|
|
1133
|
-
* This schema accepts the slightly loose shape returned by AI generation, then normalizes it into
|
|
1134
|
-
* the strict form shape. Keep transforms here rather than in callers so generation leniency is
|
|
1135
|
-
* colocated with the Claude contract.
|
|
1136
|
-
*/
|
|
1373
|
+
/** Loose shape returned by AI generation for Claude narrative fields; transforms live here so generation leniency stays colocated with the Claude contract. */
|
|
1137
1374
|
const claudeAiGeneratedFormDataRawSchema = z.object({
|
|
1138
1375
|
oneLiner: claudeSubmissionFormDataSchema.shape.oneLiner,
|
|
1139
1376
|
description: claudeSubmissionFormDataSchema.shape.description,
|
|
@@ -1178,6 +1415,7 @@ const customerUsageSchema = z.object({
|
|
|
1178
1415
|
periodEnd: z.number()
|
|
1179
1416
|
});
|
|
1180
1417
|
const partnerDiscountSchema = z.object({ endsAt: z.number() });
|
|
1418
|
+
z.object({ balanceInNanoUSD: z.number() });
|
|
1181
1419
|
z.object({
|
|
1182
1420
|
customerCredits: customerCreditsSchema.nullable(),
|
|
1183
1421
|
customerUsage: customerUsageSchema.nullable(),
|
|
@@ -1225,7 +1463,10 @@ const RESERVED_KEYS = [
|
|
|
1225
1463
|
"BUILD_ARG_START_COMMAND",
|
|
1226
1464
|
"ALPIC_HOST",
|
|
1227
1465
|
"ALPIC_CUSTOM_DOMAINS",
|
|
1228
|
-
"ALPIC_INTENT_META_KEY"
|
|
1466
|
+
"ALPIC_INTENT_META_KEY",
|
|
1467
|
+
"ALPIC_FEEDBACK_META_KEY",
|
|
1468
|
+
"ALPIC_EVENTS_META_KEY",
|
|
1469
|
+
"ALPIC_IDENTIFY_META_KEY"
|
|
1229
1470
|
];
|
|
1230
1471
|
const environmentVariableSchema = z.object({
|
|
1231
1472
|
key: z.string().min(2, "Key must be at least 2 characters").regex(/^[a-zA-Z]([a-zA-Z0-9_])+$/, "Key must start with a letter and contain only letters, numbers, and underscores").refine((key) => !RESERVED_KEYS.includes(key), "This key is reserved and cannot be used as an environment variable key"),
|
|
@@ -1310,17 +1551,15 @@ const isValidLogTimeInput = (value) => {
|
|
|
1310
1551
|
if (ms(value) !== void 0) return true;
|
|
1311
1552
|
return !Number.isNaN(new Date(value).getTime());
|
|
1312
1553
|
};
|
|
1313
|
-
const
|
|
1554
|
+
const base = oc.errors({ BAD_REQUEST: {} });
|
|
1555
|
+
const createEnvironmentContractV1 = base.route({
|
|
1314
1556
|
path: "/v1/environments",
|
|
1315
1557
|
method: "POST",
|
|
1316
1558
|
summary: "Create an environment",
|
|
1317
1559
|
description: "Create an environment for a project",
|
|
1318
1560
|
tags: ["environments"],
|
|
1319
1561
|
successDescription: "The environment has been created successfully"
|
|
1320
|
-
}).errors({
|
|
1321
|
-
NOT_FOUND: {},
|
|
1322
|
-
BAD_REQUEST: {}
|
|
1323
|
-
}).input(z.object({
|
|
1562
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1324
1563
|
projectId: z.string().describe("The ID of the project to create the environment for"),
|
|
1325
1564
|
name: z.string().min(1).describe("The name of the environment"),
|
|
1326
1565
|
sourceBranch: z.string().min(1).describe("The branch used to build the environment"),
|
|
@@ -1333,7 +1572,7 @@ const createEnvironmentContractV1 = oc.route({
|
|
|
1333
1572
|
createdAt: z.coerce.date(),
|
|
1334
1573
|
projectId: z.string().describe("The ID of the project the environment belongs to")
|
|
1335
1574
|
}));
|
|
1336
|
-
const getEnvironmentContractV1 =
|
|
1575
|
+
const getEnvironmentContractV1 = base.route({
|
|
1337
1576
|
path: "/v1/environments/{environmentId}",
|
|
1338
1577
|
method: "GET",
|
|
1339
1578
|
summary: "Get an environment",
|
|
@@ -1390,7 +1629,7 @@ const projectOutputSchema = z.object({
|
|
|
1390
1629
|
productionEnvironment: productionEnvironmentSchema.nullable(),
|
|
1391
1630
|
environments: z.array(environmentSchema)
|
|
1392
1631
|
});
|
|
1393
|
-
const getProjectContractV1 =
|
|
1632
|
+
const getProjectContractV1 = base.route({
|
|
1394
1633
|
path: "/v1/projects/{projectId}",
|
|
1395
1634
|
method: "GET",
|
|
1396
1635
|
summary: "Get a project",
|
|
@@ -1398,18 +1637,15 @@ const getProjectContractV1 = oc.route({
|
|
|
1398
1637
|
tags: ["projects"],
|
|
1399
1638
|
successDescription: "The project details"
|
|
1400
1639
|
}).errors({ NOT_FOUND: {} }).input(z.object({ projectId: z.string().describe("The ID of the project") })).output(projectOutputSchema);
|
|
1401
|
-
const listProjectsContractV1 =
|
|
1640
|
+
const listProjectsContractV1 = base.route({
|
|
1402
1641
|
path: "/v1/projects",
|
|
1403
1642
|
method: "GET",
|
|
1404
1643
|
summary: "List projects",
|
|
1405
1644
|
description: "List all projects for a team",
|
|
1406
1645
|
tags: ["projects"],
|
|
1407
1646
|
successDescription: "The list of projects"
|
|
1408
|
-
}).errors({
|
|
1409
|
-
|
|
1410
|
-
BAD_REQUEST: {}
|
|
1411
|
-
}).input(z.object({ teamId: z.string().optional() }).optional()).output(z.array(projectOutputSchema));
|
|
1412
|
-
const createProjectContractV1 = oc.route({
|
|
1647
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.array(projectOutputSchema));
|
|
1648
|
+
const createProjectContractV1 = base.route({
|
|
1413
1649
|
path: "/v1/projects",
|
|
1414
1650
|
method: "POST",
|
|
1415
1651
|
summary: "Create a project",
|
|
@@ -1418,7 +1654,6 @@ const createProjectContractV1 = oc.route({
|
|
|
1418
1654
|
successDescription: "The project has been created successfully"
|
|
1419
1655
|
}).errors({
|
|
1420
1656
|
NOT_FOUND: {},
|
|
1421
|
-
BAD_REQUEST: {},
|
|
1422
1657
|
FORBIDDEN: {}
|
|
1423
1658
|
}).input(z.object({
|
|
1424
1659
|
teamId: z.string().optional(),
|
|
@@ -1459,7 +1694,7 @@ const environmentVariableOutputSchema = z.object({
|
|
|
1459
1694
|
isSecret: z.boolean(),
|
|
1460
1695
|
createdAt: z.coerce.date()
|
|
1461
1696
|
});
|
|
1462
|
-
const listEnvironmentVariablesContractV1 =
|
|
1697
|
+
const listEnvironmentVariablesContractV1 = base.route({
|
|
1463
1698
|
path: "/v1/environments/{environmentId}/environment-variables",
|
|
1464
1699
|
method: "GET",
|
|
1465
1700
|
summary: "List environment variables",
|
|
@@ -1467,48 +1702,39 @@ const listEnvironmentVariablesContractV1 = oc.route({
|
|
|
1467
1702
|
tags: ["environments"],
|
|
1468
1703
|
successDescription: "The list of environment variables"
|
|
1469
1704
|
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentId: z.string().describe("The ID of the environment") })).output(z.array(environmentVariableOutputSchema));
|
|
1470
|
-
const createEnvironmentVariablesContractV1 =
|
|
1705
|
+
const createEnvironmentVariablesContractV1 = base.route({
|
|
1471
1706
|
path: "/v1/environments/{environmentId}/environment-variables",
|
|
1472
1707
|
method: "POST",
|
|
1473
1708
|
summary: "Add environment variables",
|
|
1474
1709
|
description: "Add one or more environment variables to an environment",
|
|
1475
1710
|
tags: ["environments"],
|
|
1476
1711
|
successDescription: "The environment variables have been added successfully"
|
|
1477
|
-
}).errors({
|
|
1478
|
-
NOT_FOUND: {},
|
|
1479
|
-
BAD_REQUEST: {}
|
|
1480
|
-
}).input(z.object({
|
|
1712
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1481
1713
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1482
1714
|
environmentVariables: environmentVariablesSchema
|
|
1483
1715
|
})).output(z.object({ success: z.literal(true) }));
|
|
1484
|
-
const updateEnvironmentVariableContractV1 =
|
|
1716
|
+
const updateEnvironmentVariableContractV1 = base.route({
|
|
1485
1717
|
path: "/v1/environment-variables/{environmentVariableId}",
|
|
1486
1718
|
method: "PATCH",
|
|
1487
1719
|
summary: "Update an environment variable",
|
|
1488
1720
|
description: "Update an environment variable by ID",
|
|
1489
1721
|
tags: ["environments"],
|
|
1490
1722
|
successDescription: "The environment variable has been updated successfully"
|
|
1491
|
-
}).errors({
|
|
1492
|
-
NOT_FOUND: {},
|
|
1493
|
-
BAD_REQUEST: {}
|
|
1494
|
-
}).input(z.object({
|
|
1723
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1495
1724
|
environmentVariableId: z.string().describe("The ID of the environment variable"),
|
|
1496
1725
|
key: environmentVariableSchema.shape.key,
|
|
1497
1726
|
value: environmentVariableSchema.shape.value.optional(),
|
|
1498
1727
|
isSecret: environmentVariableSchema.shape.isSecret.optional()
|
|
1499
1728
|
})).output(z.object({ success: z.literal(true) }));
|
|
1500
|
-
const deleteEnvironmentVariableContractV1 =
|
|
1729
|
+
const deleteEnvironmentVariableContractV1 = base.route({
|
|
1501
1730
|
path: "/v1/environment-variables/{environmentVariableId}",
|
|
1502
1731
|
method: "DELETE",
|
|
1503
1732
|
summary: "Delete an environment variable",
|
|
1504
1733
|
description: "Delete an environment variable by ID",
|
|
1505
1734
|
tags: ["environments"],
|
|
1506
1735
|
successDescription: "The environment variable has been deleted successfully"
|
|
1507
|
-
}).errors({
|
|
1508
|
-
|
|
1509
|
-
BAD_REQUEST: {}
|
|
1510
|
-
}).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
|
|
1511
|
-
const deleteProjectContractV1 = oc.route({
|
|
1736
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentVariableId: z.string().describe("The ID of the environment variable") })).output(z.object({ success: z.literal(true) }));
|
|
1737
|
+
const deleteProjectContractV1 = base.route({
|
|
1512
1738
|
path: "/v1/projects/{projectId}",
|
|
1513
1739
|
method: "DELETE",
|
|
1514
1740
|
summary: "Delete a project",
|
|
@@ -1516,7 +1742,7 @@ const deleteProjectContractV1 = oc.route({
|
|
|
1516
1742
|
tags: ["projects"],
|
|
1517
1743
|
successDescription: "The project has been deleted successfully"
|
|
1518
1744
|
}).errors({ NOT_FOUND: {} }).input(z.object({ projectId: z.string().describe("The ID of the project") })).output(z.object({ success: z.literal(true) }));
|
|
1519
|
-
const updateProjectContractV1 =
|
|
1745
|
+
const updateProjectContractV1 = base.route({
|
|
1520
1746
|
path: "/v1/projects/{projectId}",
|
|
1521
1747
|
method: "PATCH",
|
|
1522
1748
|
summary: "Update a project",
|
|
@@ -1525,14 +1751,13 @@ const updateProjectContractV1 = oc.route({
|
|
|
1525
1751
|
successDescription: "The project has been updated successfully"
|
|
1526
1752
|
}).errors({
|
|
1527
1753
|
NOT_FOUND: {},
|
|
1528
|
-
BAD_REQUEST: {},
|
|
1529
1754
|
FORBIDDEN: {}
|
|
1530
1755
|
}).input(z.object({
|
|
1531
1756
|
projectId: z.string().describe("The ID of the project"),
|
|
1532
1757
|
name: z.string().min(1).max(100).optional().describe("The new name for the project"),
|
|
1533
1758
|
sourceRepository: z.string().nullable().optional().describe("The source repository to connect to the project")
|
|
1534
1759
|
})).output(projectOutputSchema);
|
|
1535
|
-
const deployEnvironmentContractV1 =
|
|
1760
|
+
const deployEnvironmentContractV1 = base.route({
|
|
1536
1761
|
path: "/v1/environments/{environmentId}/deploy",
|
|
1537
1762
|
method: "POST",
|
|
1538
1763
|
summary: "Deploy an environment",
|
|
@@ -1541,28 +1766,25 @@ const deployEnvironmentContractV1 = oc.route({
|
|
|
1541
1766
|
successDescription: "The environment has been deployed successfully"
|
|
1542
1767
|
}).errors({
|
|
1543
1768
|
NOT_FOUND: {},
|
|
1544
|
-
|
|
1769
|
+
CONFLICT: {}
|
|
1545
1770
|
}).input(z.object({
|
|
1546
1771
|
environmentId: z.string().describe("The ID of the environment to deploy"),
|
|
1547
1772
|
token: z.string().describe("The token to identify the source archive").optional(),
|
|
1548
1773
|
settings: buildSettingsSchema.extend({ transport: transportSchema }).optional().describe("Project settings detected by the client from the source. When provided, the server skips downloading and extracting the source archive to detect them.")
|
|
1549
1774
|
})).output(deploymentSchema);
|
|
1550
|
-
const uploadDeploymentArtifactContractV1 =
|
|
1775
|
+
const uploadDeploymentArtifactContractV1 = base.route({
|
|
1551
1776
|
path: "/v1/deployments/upload",
|
|
1552
1777
|
method: "POST",
|
|
1553
1778
|
summary: "Upload deployment artifacts",
|
|
1554
1779
|
description: "Return a presigned S3 URL to upload a deployment artifact",
|
|
1555
1780
|
tags: ["deployments"],
|
|
1556
1781
|
successDescription: "The presigned upload URL has been generated successfully"
|
|
1557
|
-
}).errors({
|
|
1558
|
-
NOT_FOUND: {},
|
|
1559
|
-
BAD_REQUEST: {}
|
|
1560
|
-
}).input(z.object({ teamId: z.string().optional() }).optional()).output(z.object({
|
|
1782
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().optional() }).optional()).output(z.object({
|
|
1561
1783
|
uploadUrl: z.url().describe("Presigned S3 URL to upload the source archive with HTTP PUT"),
|
|
1562
1784
|
token: z.string().describe("Token to identify the source archive"),
|
|
1563
1785
|
expiresAt: z.coerce.date().describe("Expiration date of the presigned URL")
|
|
1564
1786
|
}));
|
|
1565
|
-
const listDeploymentsContractV1 =
|
|
1787
|
+
const listDeploymentsContractV1 = base.route({
|
|
1566
1788
|
path: "/v1/projects/{projectId}/deployments",
|
|
1567
1789
|
method: "GET",
|
|
1568
1790
|
summary: "List project deployments",
|
|
@@ -1574,7 +1796,7 @@ const listDeploymentsContractV1 = oc.route({
|
|
|
1574
1796
|
status: z.array(deploymentStatusSchema).optional().describe("Filter by one or more statuses"),
|
|
1575
1797
|
environmentId: z.string().optional().describe("Filter by environment ID")
|
|
1576
1798
|
})).output(z.array(deploymentSchema));
|
|
1577
|
-
const getDeploymentContractV1 =
|
|
1799
|
+
const getDeploymentContractV1 = base.route({
|
|
1578
1800
|
path: "/v1/deployments/{deploymentId}",
|
|
1579
1801
|
method: "GET",
|
|
1580
1802
|
summary: "Get a deployment",
|
|
@@ -1597,17 +1819,14 @@ const logEntrySchema = z.object({
|
|
|
1597
1819
|
method: z.string().optional(),
|
|
1598
1820
|
durationInMs: z.number().optional()
|
|
1599
1821
|
});
|
|
1600
|
-
const getLogsContractV1 =
|
|
1822
|
+
const getLogsContractV1 = base.route({
|
|
1601
1823
|
path: "/v1/environments/{environmentId}/logs",
|
|
1602
1824
|
method: "GET",
|
|
1603
1825
|
summary: "Get logs",
|
|
1604
1826
|
description: "Get logs for an environment",
|
|
1605
1827
|
tags: ["environments"],
|
|
1606
1828
|
successDescription: "The logs"
|
|
1607
|
-
}).errors({
|
|
1608
|
-
NOT_FOUND: {},
|
|
1609
|
-
BAD_REQUEST: {}
|
|
1610
|
-
}).input(z.object({
|
|
1829
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1611
1830
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1612
1831
|
since: z.string().refine(isValidLogTimeInput, { message: "Invalid time. Use relative (1h, 30m, 2d) or ISO 8601 format." }).optional().describe("Start time — ISO 8601 (2024-01-01T00:00:00Z) or relative (1h, 30m, 2d)"),
|
|
1613
1832
|
until: z.string().refine(isValidLogTimeInput, { message: "Invalid time. Use relative (1h, 30m, 2d) or ISO 8601 format." }).optional().describe("End time — ISO 8601 or relative"),
|
|
@@ -1624,17 +1843,14 @@ const getLogsContractV1 = oc.route({
|
|
|
1624
1843
|
logs: z.array(logEntrySchema),
|
|
1625
1844
|
nextToken: z.string().nullable()
|
|
1626
1845
|
}));
|
|
1627
|
-
const getLatestLogsContractV1 =
|
|
1846
|
+
const getLatestLogsContractV1 = base.route({
|
|
1628
1847
|
path: "/v1/environments/{environmentId}/latest-logs",
|
|
1629
1848
|
method: "GET",
|
|
1630
1849
|
summary: "Get latest logs",
|
|
1631
1850
|
description: "Get the N most recent logs for an environment",
|
|
1632
1851
|
tags: ["environments"],
|
|
1633
1852
|
successDescription: "The latest logs"
|
|
1634
|
-
}).errors({
|
|
1635
|
-
NOT_FOUND: {},
|
|
1636
|
-
BAD_REQUEST: {}
|
|
1637
|
-
}).input(z.object({
|
|
1853
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1638
1854
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1639
1855
|
limit: z.coerce.number().int().min(1).max(1e3).default(100).describe("Number of most recent log entries to return"),
|
|
1640
1856
|
level: z.array(z.enum([
|
|
@@ -1645,7 +1861,7 @@ const getLatestLogsContractV1 = oc.route({
|
|
|
1645
1861
|
])).optional().describe("Filter by log level"),
|
|
1646
1862
|
search: z.string().optional().describe("Filter pattern to search for in log content")
|
|
1647
1863
|
})).output(z.object({ logs: z.array(logEntrySchema) }));
|
|
1648
|
-
const getDeploymentLogsContractV1 =
|
|
1864
|
+
const getDeploymentLogsContractV1 = base.route({
|
|
1649
1865
|
path: "/v1/deployments/{deploymentId}/logs",
|
|
1650
1866
|
method: "GET",
|
|
1651
1867
|
summary: "Get deployment logs",
|
|
@@ -1672,17 +1888,14 @@ const analyticsTimeSeriesSchema = z.object({
|
|
|
1672
1888
|
output_token_mean: z.array(analyticsDataPointSchema),
|
|
1673
1889
|
task_count: z.array(analyticsDataPointSchema)
|
|
1674
1890
|
});
|
|
1675
|
-
const getProjectAnalyticsContractV1 =
|
|
1891
|
+
const getProjectAnalyticsContractV1 = base.route({
|
|
1676
1892
|
path: "/v1/analytics/{projectId}",
|
|
1677
1893
|
method: "GET",
|
|
1678
1894
|
summary: "Get project analytics",
|
|
1679
1895
|
description: "Get analytics data for a project over a time range",
|
|
1680
1896
|
tags: ["analytics"],
|
|
1681
1897
|
successDescription: "The project analytics data"
|
|
1682
|
-
}).errors({
|
|
1683
|
-
NOT_FOUND: {},
|
|
1684
|
-
BAD_REQUEST: {}
|
|
1685
|
-
}).input(z.object({
|
|
1898
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1686
1899
|
projectId: z.string().describe("The ID of the project"),
|
|
1687
1900
|
startTimestamp: z.coerce.number().describe("Start timestamp in milliseconds"),
|
|
1688
1901
|
endTimestamp: z.coerce.number().describe("End timestamp in milliseconds"),
|
|
@@ -1697,7 +1910,7 @@ const getProjectAnalyticsContractV1 = oc.route({
|
|
|
1697
1910
|
}),
|
|
1698
1911
|
timeSeries: analyticsTimeSeriesSchema
|
|
1699
1912
|
}));
|
|
1700
|
-
const listTeamsContractV1 =
|
|
1913
|
+
const listTeamsContractV1 = base.route({
|
|
1701
1914
|
path: "/v1/teams",
|
|
1702
1915
|
method: "GET",
|
|
1703
1916
|
summary: "List teams",
|
|
@@ -1710,7 +1923,22 @@ const listTeamsContractV1 = oc.route({
|
|
|
1710
1923
|
createdAt: z.coerce.date(),
|
|
1711
1924
|
hasStripeAccount: z.boolean()
|
|
1712
1925
|
})));
|
|
1713
|
-
const
|
|
1926
|
+
const getTeamUsageContractV1 = base.route({
|
|
1927
|
+
path: "/v1/teams/{teamId}/usage",
|
|
1928
|
+
method: "GET",
|
|
1929
|
+
summary: "Get team usage",
|
|
1930
|
+
description: "Get the MCP request usage of a team for its current billing window. A team that has made no request in the window reports zero.",
|
|
1931
|
+
tags: ["teams"],
|
|
1932
|
+
successDescription: "The current billing window usage"
|
|
1933
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({ teamId: z.string().describe("The ID of the team") })).output(z.object({
|
|
1934
|
+
teamId: z.string(),
|
|
1935
|
+
plan: subscriptionPlanSchema.nullable().describe("The plan in force for the window, null on the Free plan"),
|
|
1936
|
+
periodStart: z.coerce.date().describe("Start of the current billing window"),
|
|
1937
|
+
periodEnd: z.coerce.date().describe("End of the current billing window"),
|
|
1938
|
+
requestCount: z.number().int().describe("MCP requests settled during the current billing window"),
|
|
1939
|
+
includedRequests: z.number().int().nullable().describe("Requests included in the plan for one window, null when the allowance is contract-specific")
|
|
1940
|
+
}));
|
|
1941
|
+
const getTunnelTicketContractV1 = base.route({
|
|
1714
1942
|
path: "/v1/tunnels/ticket",
|
|
1715
1943
|
method: "GET",
|
|
1716
1944
|
summary: "Get a tunnel ticket",
|
|
@@ -1722,16 +1950,13 @@ const getTunnelTicketContractV1 = oc.route({
|
|
|
1722
1950
|
ticket: z.string().describe("The signed tunnel ticket"),
|
|
1723
1951
|
tunnelHost: z.string().describe("The tunnel host to connect to")
|
|
1724
1952
|
}));
|
|
1725
|
-
const publishServerContractV1 =
|
|
1953
|
+
const publishServerContractV1 = base.route({
|
|
1726
1954
|
path: "/v1/distribution/publish",
|
|
1727
1955
|
method: "POST",
|
|
1728
1956
|
summary: "Publish a server to the MCP registry",
|
|
1729
1957
|
tags: ["distribution"],
|
|
1730
1958
|
successDescription: "The server has been published successfully"
|
|
1731
|
-
}).errors({
|
|
1732
|
-
NOT_FOUND: {},
|
|
1733
|
-
BAD_REQUEST: {}
|
|
1734
|
-
}).input(z.object({
|
|
1959
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1735
1960
|
projectId: z.string(),
|
|
1736
1961
|
domain: z.string(),
|
|
1737
1962
|
title: z.string().min(1).max(100),
|
|
@@ -1740,17 +1965,14 @@ const publishServerContractV1 = oc.route({
|
|
|
1740
1965
|
iconSrc: z.url().max(255).optional(),
|
|
1741
1966
|
dryRun: z.boolean().optional()
|
|
1742
1967
|
})).output(z.object({ serverFields: serverFieldsSchema }));
|
|
1743
|
-
const getServerInfoContractV1 =
|
|
1968
|
+
const getServerInfoContractV1 = base.route({
|
|
1744
1969
|
path: "/v1/distribution/get",
|
|
1745
1970
|
method: "GET",
|
|
1746
1971
|
summary: "Get server info",
|
|
1747
1972
|
description: "Get info about a server",
|
|
1748
1973
|
tags: ["distribution"],
|
|
1749
1974
|
successDescription: "The server info"
|
|
1750
|
-
}).errors({
|
|
1751
|
-
NOT_FOUND: {},
|
|
1752
|
-
BAD_REQUEST: {}
|
|
1753
|
-
}).input(z.object({
|
|
1975
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1754
1976
|
projectId: z.string(),
|
|
1755
1977
|
domain: z.string()
|
|
1756
1978
|
})).output(z.object({ serverFields: serverFieldsSchema }));
|
|
@@ -1769,7 +1991,7 @@ const playgroundOutputSchema = z.object({
|
|
|
1769
1991
|
isPlaygroundEnabled: z.boolean(),
|
|
1770
1992
|
serverMetadata: playgroundServerMetadataOutputSchema.nullable()
|
|
1771
1993
|
});
|
|
1772
|
-
const getPlaygroundContractV1 =
|
|
1994
|
+
const getPlaygroundContractV1 = base.route({
|
|
1773
1995
|
path: "/v1/environments/{environmentId}/playground",
|
|
1774
1996
|
method: "GET",
|
|
1775
1997
|
summary: "Get playground configuration",
|
|
@@ -1777,17 +1999,14 @@ const getPlaygroundContractV1 = oc.route({
|
|
|
1777
1999
|
tags: ["environments"],
|
|
1778
2000
|
successDescription: "The playground configuration"
|
|
1779
2001
|
}).errors({ NOT_FOUND: {} }).input(z.object({ environmentId: z.string().describe("The ID of the environment") })).output(playgroundOutputSchema);
|
|
1780
|
-
const upsertPlaygroundContractV1 =
|
|
2002
|
+
const upsertPlaygroundContractV1 = base.route({
|
|
1781
2003
|
path: "/v1/environments/{environmentId}/playground",
|
|
1782
2004
|
method: "PUT",
|
|
1783
2005
|
summary: "Update playground configuration",
|
|
1784
2006
|
description: "Update the playground configuration for an environment. All fields are optional — only provided fields are updated.",
|
|
1785
2007
|
tags: ["environments"],
|
|
1786
2008
|
successDescription: "The updated playground configuration"
|
|
1787
|
-
}).errors({
|
|
1788
|
-
NOT_FOUND: {},
|
|
1789
|
-
BAD_REQUEST: {}
|
|
1790
|
-
}).input(z.object({
|
|
2009
|
+
}).errors({ NOT_FOUND: {} }).input(z.object({
|
|
1791
2010
|
environmentId: z.string().describe("The ID of the environment"),
|
|
1792
2011
|
isPlaygroundEnabled: z.boolean().optional(),
|
|
1793
2012
|
name: z.string().min(1).max(100).optional(),
|
|
@@ -1795,7 +2014,7 @@ const upsertPlaygroundContractV1 = oc.route({
|
|
|
1795
2014
|
headers: z.array(playgroundHeaderSchema).optional(),
|
|
1796
2015
|
examplePrompts: z.array(playgroundExamplePromptSchema).max(5).optional()
|
|
1797
2016
|
})).output(playgroundOutputSchema);
|
|
1798
|
-
const createBeaconContractV1 =
|
|
2017
|
+
const createBeaconContractV1 = base.route({
|
|
1799
2018
|
path: "/v1/beacon/audits",
|
|
1800
2019
|
method: "POST",
|
|
1801
2020
|
summary: "Create a beacon audit",
|
|
@@ -1804,7 +2023,6 @@ const createBeaconContractV1 = oc.route({
|
|
|
1804
2023
|
successDescription: "The audit has been created"
|
|
1805
2024
|
}).errors({
|
|
1806
2025
|
NOT_FOUND: {},
|
|
1807
|
-
BAD_REQUEST: {},
|
|
1808
2026
|
DNS_RESOLUTION_FAILED: { status: 400 }
|
|
1809
2027
|
}).input(z.object({
|
|
1810
2028
|
targetUrl: z.url().describe("The HTTPS URL of the MCP server to audit"),
|
|
@@ -1812,7 +2030,7 @@ const createBeaconContractV1 = oc.route({
|
|
|
1812
2030
|
projectId: z.string().optional().describe("The project ID to associate the audit with"),
|
|
1813
2031
|
excludeCategories: z.array(checkCategorySchema).optional().describe("Check categories to exclude from the audit")
|
|
1814
2032
|
})).output(z.object({ id: z.string() }));
|
|
1815
|
-
const getBeaconContractV1 =
|
|
2033
|
+
const getBeaconContractV1 = base.route({
|
|
1816
2034
|
path: "/v1/beacon/audits/{auditId}",
|
|
1817
2035
|
method: "GET",
|
|
1818
2036
|
summary: "Get a beacon audit",
|
|
@@ -1828,7 +2046,10 @@ const getBeaconContractV1 = oc.route({
|
|
|
1828
2046
|
report: auditReportWithScreenshotsSchema.nullable()
|
|
1829
2047
|
}));
|
|
1830
2048
|
const contract = {
|
|
1831
|
-
teams: {
|
|
2049
|
+
teams: {
|
|
2050
|
+
list: { v1: listTeamsContractV1 },
|
|
2051
|
+
getUsage: { v1: getTeamUsageContractV1 }
|
|
2052
|
+
},
|
|
1832
2053
|
analytics: { get: { v1: getProjectAnalyticsContractV1 } },
|
|
1833
2054
|
deployments: {
|
|
1834
2055
|
list: { v1: listDeploymentsContractV1 },
|
|
@@ -1870,5 +2091,10 @@ const contract = {
|
|
|
1870
2091
|
get: { v1: getBeaconContractV1 }
|
|
1871
2092
|
}
|
|
1872
2093
|
};
|
|
2094
|
+
const { uploadArtifact: _discard, ...deploymentsForDocs } = contract.deployments;
|
|
2095
|
+
const contractForDocs = {
|
|
2096
|
+
...contract,
|
|
2097
|
+
deployments: deploymentsForDocs
|
|
2098
|
+
};
|
|
1873
2099
|
//#endregion
|
|
1874
|
-
export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, PLATFORM_LABELS, buildSettingsSchema, contract, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };
|
|
2100
|
+
export { AUTH_SCOPE_ANY, AUTH_SCOPE_USER, PLATFORM_LABELS, buildSettingsSchema, contract, contractForDocs, createEnvironmentContractV1, deploymentStatusSchema, environmentVariableSchema, environmentVariablesSchema, playgroundExamplePromptSchema, playgroundHeaderSchema, runtimeSchema, serverFieldsSchema, transportSchema, updateEnvironmentVariableSchema };
|