@alpic-ai/api 0.0.0-staging.c8c7834 → 0.0.0-staging.c8dc87b

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.
Files changed (2) hide show
  1. package/dist/index.mjs +38 -7
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -99,6 +99,8 @@ const positiveTestCaseSchema = z.object({
99
99
  toolTriggered: z.string().optional(),
100
100
  expectedOutput: z.string().optional()
101
101
  }).partial().describe("Each case: Scenario, User prompt, Tool triggered, Expected output.");
102
+ /** Accepts either a valid email or URL. */
103
+ const supportChannelSchema = z.string().refine((value) => z.email().safeParse(value).success || z.url().safeParse(value).success, { error: "Must be a valid email or URL" });
102
104
  const chatgptCategorySchema = z.enum([
103
105
  "BUSINESS",
104
106
  "COLLABORATION",
@@ -144,7 +146,7 @@ const chatgptSubmissionFormDataSchema = z.object({
144
146
  category: chatgptCategorySchema.describe("Category from the OpenAI taxonomy."),
145
147
  developerName: z.string().describe("Developer name shown publicly on the app's directory page."),
146
148
  companyUrl: z.url().describe("Your company's main website URL."),
147
- supportChannel: z.string().describe("Customer support URL or email address."),
149
+ supportChannel: supportChannelSchema.describe("Customer support URL or email address."),
148
150
  privacyPolicyUrl: z.url().describe("URL to your privacy policy."),
149
151
  termsOfServiceUrl: z.url().describe("URL to the app's terms of service."),
150
152
  demoRecordingUrl: z.url().describe("URL to a video demonstrating the app, recorded via OpenAI Developer Mode. Cover all main use cases on web, iOS, and Android."),
@@ -159,6 +161,13 @@ const chatgptSubmissionFormDataSchema = z.object({
159
161
  translations: z.array(chatgptTranslationSchema).describe("Per-locale translation of tagline + description. English (US) is the default."),
160
162
  allowedCountries: chatgptAllowedCountriesSchema.describe("'Allow all' or restrict to a specific list. See OpenAI's supported countries list."),
161
163
  releaseNotes: z.string().describe("Publicly displayed on the app details page.")
164
+ });
165
+ chatgptSubmissionFormDataSchema.pick({
166
+ appName: true,
167
+ developerName: true,
168
+ serverUrl: true,
169
+ tools: true,
170
+ authentication: true
162
171
  }).partial();
163
172
  const claudeCategorySchema = z.enum([
164
173
  "Business & Productivity",
@@ -213,13 +222,24 @@ const claudeSubmissionFormDataSchema = z.object({
213
222
  primaryContactEmail: z.email().describe("Business email for the primary contact. Must be a valid email address. Anthropic uses this to communicate about your submission status, required changes, and post-listing issues. Avoid using personal email addresses."),
214
223
  primaryContactRole: z.string().optional().describe("The job title or role of the primary contact (e.g. 'CTO', 'Developer Relations Lead', 'Founder'). Optional but helps Anthropic route questions to the right person."),
215
224
  anthropicPointOfContact: z.string().optional().describe("If you have a direct contact at Anthropic (e.g. from a partnership or sales conversation), enter their name here. This is optional but can greatly help expedite the review process. Leave blank if you don't have one."),
216
- appName: z.string().describe("The public display name for your connector as it will appear in the Connectors Directory. Rules: (1) Do NOT include the words 'MCP' or 'Server'. these are auto-rejected. (2) Use your brand/product name, e.g. 'Notion', 'Linear', 'Slack'. (3) You must own or have the right to use this brand name. For example, don't call it 'Google Drive Helper' if you're not Google."),
225
+ appName: z.string().describe(`The public display name for your connector as it will appear in the Connectors Directory.
226
+
227
+ Rules:
228
+ (1) Do NOT include the words 'MCP' or 'Server' — these are auto-rejected.
229
+ (2) Use your brand/product name, e.g. 'Notion', 'Linear', 'Slack'.
230
+ (3) You must own or have the right to use this brand name. For example, don't call it 'Google Drive Helper' if you're not Google.`),
217
231
  mcpUrlType: claudeMcpUrlTypeSchema.describe("Universal URL = one URL serves all users. Custom MCP URLs = signup URL + regex matching per-user URLs."),
218
232
  serverUrl: z.url().describe("Production MCP server URL (https). Derived from the project's production environment by default."),
219
233
  tagline: z.string().max(55).describe("Short blurb shown below the server name. 55 chars max."),
220
234
  description: z.string().describe("50–100 words describing what the server does and its key capabilities. Lives on the directory listing."),
221
235
  testCases: z.array(positiveTestCaseSchema).describe("At least 3 use cases with example prompts showing the value of the connector."),
222
- connectionRequirements: z.string().describe("Prerequisites before connecting (free/premium account, admin seat, geographic availability, custom instance URL). State 'No special requirements.' if none."),
236
+ connectionRequirements: z.string().describe(`Prerequisites before connecting:
237
+ • Free/premium account
238
+ • Admin seat
239
+ • Geographic availability
240
+ • Custom instance URL
241
+
242
+ State 'No special requirements.' if none.`),
223
243
  readWriteCapabilities: claudeReadWriteCapabilitiesSchema.describe("Inferred from the `readOnlyHint` annotations on the MCP tools."),
224
244
  isMcpApp: z.boolean().describe("True if the server exposes interactive UI elements (widgets). Inferred from the MCP connection."),
225
245
  thirdPartyConnectionsAndWebAccess: z.array(claudeThirdPartySchema).describe("Multi-select of what the server reaches out to (web, third-party AI, data aggregators)."),
@@ -230,12 +250,23 @@ const claudeSubmissionFormDataSchema = z.object({
230
250
  transportSupport: z.array(claudeTransportSchema).describe("Multi-select of transport protocols the server supports. Anthropic recommends Streamable HTTP (SSE may be deprecated later this year)."),
231
251
  serverDocumentationLink: z.url().describe("Public docs URL covering what the MCP does, setup, debugging, and self-serve support. The Alpic playground may be used."),
232
252
  privacyPolicyUrl: z.url().describe("URL to your privacy policy. Mandatory and displayed alongside the directory listing."),
233
- supportChannel: z.string().describe("Link or email for user support (help center, GitHub issues, docs, support@…). Displayed alongside the directory listing."),
253
+ supportChannel: supportChannelSchema.describe("Link or email for user support (help center, GitHub issues, docs, support@…). Displayed alongside the directory listing."),
234
254
  testingCredentials: z.string().describe("Credentials for reviewers to verify functionality. Required if the server uses OAuth. No 2FA. Use mcp-review@anthropic.com if an accessible email is needed."),
235
255
  tools: z.array(toolDefinitionSchema).describe("List of tools exposed by the MCP server (auto-populated from the production server's manifest)."),
236
256
  toolTitlesAnnotationsConfirmed: z.boolean().describe("Confirmation that all tools have user-friendly titles and accurate annotations (readOnlyHint, destructiveHint, …)."),
237
257
  logoLight: z.string().describe("Server/app logo for light mode. Square 1:1 aspect ratio. SVG preferred for Claude."),
238
258
  screenshots: z.array(z.url()).describe("URLs of screenshots of the connector on Claude.ai or promo material. 3–5 ideal. ≥1000px width preferred, PNG, cropped to the app response. Videos welcome.")
259
+ });
260
+ claudeSubmissionFormDataSchema.pick({
261
+ companyName: true,
262
+ appName: true,
263
+ mcpUrlType: true,
264
+ serverUrl: true,
265
+ tools: true,
266
+ readWriteCapabilities: true,
267
+ transportSupport: true,
268
+ primaryContactEmail: true,
269
+ primaryContactName: true
239
270
  }).partial();
240
271
  const submissionMetaFieldsSchema = z.object({
241
272
  id: z.string(),
@@ -245,14 +276,14 @@ const submissionMetaFieldsSchema = z.object({
245
276
  });
246
277
  const claudeSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
247
278
  platform: z.literal("claudeai"),
248
- formData: claudeSubmissionFormDataSchema
279
+ formData: claudeSubmissionFormDataSchema.partial()
249
280
  });
250
281
  const chatgptSubmissionSchemaInternal = submissionMetaFieldsSchema.extend({
251
282
  platform: z.literal("chatgpt"),
252
- formData: chatgptSubmissionFormDataSchema
283
+ formData: chatgptSubmissionFormDataSchema.partial()
253
284
  });
254
285
  z.discriminatedUnion("platform", [claudeSubmissionSchemaInternal, chatgptSubmissionSchemaInternal]);
255
- z.union([claudeSubmissionFormDataSchema, chatgptSubmissionFormDataSchema]);
286
+ z.union([claudeSubmissionFormDataSchema.partial(), chatgptSubmissionFormDataSchema.partial()]);
256
287
  const subscriptionPlanSchema = z.enum([
257
288
  "pro",
258
289
  "business",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/api",
3
- "version": "0.0.0-staging.c8c7834",
3
+ "version": "0.0.0-staging.c8dc87b",
4
4
  "description": "Contract for the Alpic API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",