@extenshi/mcp
Version:
Extenshi MCP server — bring the extension catalog (search, security, market research) and pre-publish scanning into your AI tools
147 lines • 4.95 kB
TypeScript
/**
* Multi-store publishing for the MCP `publish_extension` tool.
*
* Thin wrapper over @extenshi/publisher: credentials come from the MCP
* client's environment (same env vars as `extenshi publish`), the upload
* goes straight from this machine to the store APIs. FREE — no Extenshi
* API key, nothing passes through Extenshi servers.
*/
import { type StoreType, type UniversalPublishResult } from '@extenshi/publisher';
export interface StoreCredentials {
chrome?: {
appId: string;
clientId: string;
clientSecret: string;
refreshToken: string;
};
firefox?: {
addonGuid: string;
jwtIssuer: string;
jwtSecret: string;
};
edge?: {
productId: string;
clientId: string;
clientSecret: string;
tenantId: string;
};
}
export declare const ENV_DOCS: Record<StoreType, string[]>;
/**
* Store credentials, with an explicitly stated AMO add-on id filling
* FIREFOX_ADDON_GUID when the environment has none. A different environment
* value is refused: one run publishes to one add-on id.
*/
export declare function storeCredentialsFor(addonId?: string, env?: NodeJS.ProcessEnv): StoreCredentials;
export declare function readStoreCredentials(env?: NodeJS.ProcessEnv): StoreCredentials;
export declare function credentialsHelp(stores: StoreType[]): string;
export interface PublishArgs {
artifactPath: string;
stores?: StoreType[];
firefoxArtifactPath?: string;
releaseNotes?: string;
/** Explicit AMO add-on id; fills FIREFOX_ADDON_GUID when the environment has none. */
addonId?: string;
/** Listed AMO submission with metadata instead of a version-only upload. */
firefoxListing?: {
listingPath: string;
sourcePath?: string;
screenshotsDir?: string;
/** Resolved by amoCreateAllowed — creating an add-on fixes its id permanently. */
allowCreate: boolean;
replaceScreenshots?: boolean;
};
}
export declare class PublishSetupError extends Error {
}
/**
* Whether this call may CREATE a new AMO add-on. With a project, its
* owner-decided `amo.addonId` governs (and a different FIREFOX_ADDON_GUID is
* refused). Without one, `allowNewAddon` is the switch and `addonId` has to
* state the id explicitly — it is never taken silently from the environment.
* Mirrors the CLI's gate.
*/
export declare function amoCreateAllowed(opts: {
addonGuid: string;
allowNewAddon?: boolean;
addonId?: string;
projectId?: string;
decision?: {
status: string;
value: unknown;
} | null;
}): boolean;
/** Load the listing, source and screenshots for a listed AMO submission. */
export declare function loadFirefoxListing(listing: NonNullable<PublishArgs['firefoxListing']>): {
listing: {
defaultLocale: string;
explicitDefaultLocale: boolean;
name: {
[x: string]: string;
};
summary: {
[x: string]: string;
};
description: {
[x: string]: string;
} | undefined;
developerComments: {
[x: string]: string;
} | undefined;
homepage: {
[x: string]: string;
} | undefined;
supportEmail: {
[x: string]: string;
} | undefined;
supportUrl: {
[x: string]: string;
} | undefined;
privacyPolicy: {
[x: string]: string;
} | undefined;
eula: {
[x: string]: string;
} | undefined;
releaseNotes: {
[x: string]: string;
} | undefined;
customLicense: {
name: {
[x: string]: string;
};
text: {
[x: string]: string;
};
} | undefined;
screenshots: {
file: string;
caption: {
[x: string]: string;
} | undefined;
}[] | undefined;
categories: string[];
tags?: string[] | undefined;
slug?: string | undefined;
requiresPayment?: boolean | undefined;
contributionsUrl?: string | undefined;
license?: string | undefined;
approvalNotes?: string | undefined;
compatibility?: ("firefox" | "android")[] | Partial<Record<"firefox" | "android", {
min?: string | undefined;
max?: string | undefined;
}>> | undefined;
addonId?: string | undefined;
};
sourceFilePath: string | undefined;
screenshotPaths: string[] | undefined;
allowCreate: boolean;
replaceScreenshots: boolean;
};
export declare function publishArtifact(args: PublishArgs): Promise<UniversalPublishResult>;
export declare function validateStoreCredentials(stores?: StoreType[]): Promise<Array<{
store: StoreType;
configured: boolean;
valid: boolean;
}>>;
//# sourceMappingURL=publish.d.ts.map