@extenshi/mcp 0.1.4 → 0.2.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/LICENSE +21 -0
- package/README.md +8 -7
- package/dist/bff.d.ts +10 -1
- package/dist/bff.d.ts.map +1 -1
- package/dist/bff.js +12 -2
- package/dist/bff.js.map +1 -1
- package/dist/config.d.ts +8 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -13
- package/dist/config.js.map +1 -1
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.js +1 -2
- package/dist/docs.js.map +1 -1
- package/dist/icon-workflow.d.ts +17 -0
- package/dist/icon-workflow.d.ts.map +1 -0
- package/dist/icon-workflow.js +72 -0
- package/dist/icon-workflow.js.map +1 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -478
- package/dist/index.js.map +1 -1
- package/dist/shape.d.ts +8 -1
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +68 -1
- package/dist/shape.js.map +1 -1
- package/dist/telemetry.d.ts +10 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +50 -6
- package/dist/telemetry.js.map +1 -1
- package/dist/tools.d.ts +111 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +745 -0
- package/dist/tools.js.map +1 -0
- package/package.json +39 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 extenshi.io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -38,10 +38,11 @@ enforces it too.
|
|
|
38
38
|
| --- | --- | --- |
|
|
39
39
|
| `search_extensions` | Hybrid search across Chrome/Firefox/Edge with filters (store, category, pricing, rating, risk, permissions) | 1 read |
|
|
40
40
|
| `get_extension` | Full catalog detail for one extension by numeric catalog ID | 1 read |
|
|
41
|
+
| `get_reviews` | Paginated Firefox/Edge user reviews (rating, short excerpt, date, language) + a store-level aggregate (rating, count, reviews link) — Chrome Web Store review rows excluded (aggregate is the only public content for Chrome); reviewer identity omitted; sort by recent or rating | 1 read |
|
|
41
42
|
| `get_security` | Risk score + finding counts + top grouped findings (reads existing scans) | 1 read |
|
|
42
|
-
| `get_related_extensions` | Similar / competing extensions for competitive analysis | 1 read |
|
|
43
43
|
| `market_overview` | Catalog-wide market intelligence with no args (totals, store split, category tree, and the extended breakdown — MV2/MV3, sensitive permissions, risk tiers, trader status, recency, reviews); pass a `query` to scope facets to a search | 1 read |
|
|
44
44
|
| `search_docs` | Search the Extenshi docs + `@extenshi/cli` reference so the assistant can quote exact commands | Free (no key) |
|
|
45
|
+
| `generate_icon_workflow` | Icon design requirements + the local agent-draws-SVG → `extenshi icon preview` → export workflow | Free (no key) |
|
|
45
46
|
| `scan_extension` | Pre-publish security scan of a local artifact (.zip/.crx/.xpi), with live progress | 1 monthly-quota scan |
|
|
46
47
|
| `publish_extension` | Publish to Chrome/Firefox/Edge with your own store credentials (fully local) | Free |
|
|
47
48
|
|
|
@@ -51,12 +52,12 @@ Manage your plan at https://dojo.extenshi.io/billing.
|
|
|
51
52
|
|
|
52
53
|
## Configuration
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
| `
|
|
55
|
+
The backend endpoints are compiled into the package and always point at production — only the API
|
|
56
|
+
key is read from the environment.
|
|
57
|
+
|
|
58
|
+
| Env var | Purpose |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| `EXTENSHI_API_KEY` | Your `ek_…` developer key (required) |
|
|
60
61
|
|
|
61
62
|
## Develop
|
|
62
63
|
|
package/dist/bff.d.ts
CHANGED
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
export interface Bff {
|
|
16
16
|
searchExtensions(input: Record<string, unknown>): Promise<unknown>;
|
|
17
17
|
getExtensionById(id: number): Promise<unknown>;
|
|
18
|
+
/** Paginated store user reviews for an extension (PII-free projection). */
|
|
19
|
+
getReviews(input: Record<string, unknown>): Promise<unknown>;
|
|
18
20
|
getSecurityData(extensionId: number): Promise<unknown>;
|
|
19
21
|
getRiskSummary(extensionId: number): Promise<unknown>;
|
|
20
|
-
getRelatedExtensions(extensionId: number, limit: number): Promise<unknown>;
|
|
21
22
|
getSearchFacets(input: Record<string, unknown>): Promise<unknown>;
|
|
22
23
|
getStats(): Promise<unknown>;
|
|
23
24
|
/** Catalog-wide extended facets (manifest / permissions / risk / freshness …), cached server-side. */
|
|
@@ -25,5 +26,13 @@ export interface Bff {
|
|
|
25
26
|
/** Catalog-wide category tree with per-category counts. */
|
|
26
27
|
getCategoryTree(): Promise<unknown>;
|
|
27
28
|
}
|
|
29
|
+
/** Build a BFF client from a static `ek_…` key (stdio path). */
|
|
28
30
|
export declare function makeBff(bffUrl: string, apiKey: string): Bff;
|
|
31
|
+
/**
|
|
32
|
+
* Build a BFF client whose Authorization header is produced per request by
|
|
33
|
+
* `authHeader` (may be async). The remote OAuth server uses this to mint a
|
|
34
|
+
* fresh, short-lived genkan JWT for each call instead of holding a static key.
|
|
35
|
+
* The provider returns the FULL header value (e.g. `Bearer eyJ…`).
|
|
36
|
+
*/
|
|
37
|
+
export declare function makeBffWithAuth(bffUrl: string, authHeader: () => string | Promise<string>): Bff;
|
|
29
38
|
//# sourceMappingURL=bff.d.ts.map
|
package/dist/bff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bff.d.ts","sourceRoot":"","sources":["../src/bff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,WAAW,GAAG;IACnB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,
|
|
1
|
+
{"version":3,"file":"bff.d.ts","sourceRoot":"","sources":["../src/bff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,WAAW,GAAG;IACnB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrD,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,sGAAsG;IACtG,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,2DAA2D;IAC3D,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CACnC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAuB/F"}
|
package/dist/bff.js
CHANGED
|
@@ -13,12 +13,22 @@
|
|
|
13
13
|
* needs no client change when enforcement lands.
|
|
14
14
|
*/
|
|
15
15
|
import { createTRPCClient, httpBatchLink } from '@trpc/client';
|
|
16
|
+
/** Build a BFF client from a static `ek_…` key (stdio path). */
|
|
16
17
|
export function makeBff(bffUrl, apiKey) {
|
|
18
|
+
return makeBffWithAuth(bffUrl, () => `Bearer ${apiKey}`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a BFF client whose Authorization header is produced per request by
|
|
22
|
+
* `authHeader` (may be async). The remote OAuth server uses this to mint a
|
|
23
|
+
* fresh, short-lived genkan JWT for each call instead of holding a static key.
|
|
24
|
+
* The provider returns the FULL header value (e.g. `Bearer eyJ…`).
|
|
25
|
+
*/
|
|
26
|
+
export function makeBffWithAuth(bffUrl, authHeader) {
|
|
17
27
|
const client = createTRPCClient({
|
|
18
28
|
links: [
|
|
19
29
|
httpBatchLink({
|
|
20
30
|
url: `${bffUrl}/api/trpc`,
|
|
21
|
-
headers: () => ({ authorization:
|
|
31
|
+
headers: async () => ({ authorization: await authHeader() }),
|
|
22
32
|
}),
|
|
23
33
|
],
|
|
24
34
|
});
|
|
@@ -27,9 +37,9 @@ export function makeBff(bffUrl, apiKey) {
|
|
|
27
37
|
return {
|
|
28
38
|
searchExtensions: (input) => client.catalog.searchExtensions.query(input),
|
|
29
39
|
getExtensionById: (id) => client.catalog.getExtensionById.query({ id }),
|
|
40
|
+
getReviews: (input) => client.catalog.getReviewsForExtension.query(input),
|
|
30
41
|
getSecurityData: (extensionId) => client.security.getSecurityData.query({ extensionId }),
|
|
31
42
|
getRiskSummary: (extensionId) => client.security.getRiskSummary.query({ extensionId }),
|
|
32
|
-
getRelatedExtensions: (extensionId, limit) => client.catalog.getRelatedExtensions.query({ extensionId, limit }),
|
|
33
43
|
getSearchFacets: (input) => client.catalog.getSearchFacets.query(input),
|
|
34
44
|
getStats: () => client.catalog.getStats.query(),
|
|
35
45
|
getExtendedFilterFacets: () => client.catalog.getExtendedFilterFacets.query(),
|
package/dist/bff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bff.js","sourceRoot":"","sources":["../src/bff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"bff.js","sourceRoot":"","sources":["../src/bff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAoB9D,gEAAgE;AAChE,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,MAAc;IACrD,OAAO,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,CAAA;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAA0C;IACzF,MAAM,MAAM,GAAkB,gBAAgB,CAAC;QAC9C,KAAK,EAAE;YACN,aAAa,CAAC;gBACb,GAAG,EAAE,GAAG,MAAM,WAAW;gBACzB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC;aAC5D,CAAC;SACF;KACD,CAAC,CAAA;IAEF,uEAAuE;IACvE,mFAAmF;IACnF,OAAO;QACN,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;QACzE,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACvE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;QACzE,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;QACxF,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;QACtF,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QACvE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE;QAC/C,uBAAuB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,EAAE;QAC7E,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE;KAC7D,CAAA;AACF,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
* 2. A `.env` in the current working directory (does NOT override real env)
|
|
11
11
|
* 3. Config file ~/.extenshi/config.json (written by `extenshi login`)
|
|
12
12
|
*
|
|
13
|
-
* Base URLs
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Base URLs are baked into the package at build time and are NOT configurable:
|
|
14
|
+
* every install talks to the production backend. There is intentionally no env
|
|
15
|
+
* var or config-file override for them (was EXTENSHI_BFF_URL / EXTENSHI_API_URL
|
|
16
|
+
* / EXTENSHI_DOCS_URL) — only the API key is read from the environment.
|
|
17
|
+
*
|
|
18
|
+
* - https://bff.extenshi.io (read tools)
|
|
19
|
+
* - https://scan.extenshi.io (scan)
|
|
20
|
+
* - https://docs.extenshi.io (search_docs)
|
|
17
21
|
*
|
|
18
22
|
* stdout is the MCP protocol channel — this module must NEVER write to it.
|
|
19
23
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAkBH,MAAM,WAAW,cAAc;IAC9B,mEAAmE;IACnE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAA;CACf;AAgDD,wBAAgB,UAAU,IAAI,cAAc,CAW3C"}
|
package/dist/config.js
CHANGED
|
@@ -10,19 +10,25 @@
|
|
|
10
10
|
* 2. A `.env` in the current working directory (does NOT override real env)
|
|
11
11
|
* 3. Config file ~/.extenshi/config.json (written by `extenshi login`)
|
|
12
12
|
*
|
|
13
|
-
* Base URLs
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Base URLs are baked into the package at build time and are NOT configurable:
|
|
14
|
+
* every install talks to the production backend. There is intentionally no env
|
|
15
|
+
* var or config-file override for them (was EXTENSHI_BFF_URL / EXTENSHI_API_URL
|
|
16
|
+
* / EXTENSHI_DOCS_URL) — only the API key is read from the environment.
|
|
17
|
+
*
|
|
18
|
+
* - https://bff.extenshi.io (read tools)
|
|
19
|
+
* - https://scan.extenshi.io (scan)
|
|
20
|
+
* - https://docs.extenshi.io (search_docs)
|
|
17
21
|
*
|
|
18
22
|
* stdout is the MCP protocol channel — this module must NEVER write to it.
|
|
19
23
|
*/
|
|
20
24
|
import fs from 'node:fs';
|
|
21
25
|
import os from 'node:os';
|
|
22
26
|
import path from 'node:path';
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
27
|
+
// Compiled-in production endpoints. Constant by design — do not read these from
|
|
28
|
+
// the environment or the config file (see module doc above).
|
|
29
|
+
const BFF_URL = 'https://bff.extenshi.io';
|
|
30
|
+
const SCAN_URL = 'https://scan.extenshi.io';
|
|
31
|
+
const DOCS_URL = 'https://docs.extenshi.io';
|
|
26
32
|
const CONFIG_PATH = path.join(os.homedir(), '.extenshi', 'config.json');
|
|
27
33
|
function readConfigFile() {
|
|
28
34
|
try {
|
|
@@ -70,17 +76,15 @@ function loadDotEnv(cwd = process.cwd()) {
|
|
|
70
76
|
// No .env or unreadable — non-fatal.
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
|
-
function stripSlash(url) {
|
|
74
|
-
return url.replace(/\/$/, '');
|
|
75
|
-
}
|
|
76
79
|
export function loadConfig() {
|
|
77
80
|
loadDotEnv();
|
|
78
81
|
const file = readConfigFile();
|
|
79
82
|
return {
|
|
80
83
|
apiKey: process.env.EXTENSHI_API_KEY ?? file.apiKey ?? null,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
// Endpoints are compiled-in constants — never overridden by env/config.
|
|
85
|
+
bffUrl: BFF_URL,
|
|
86
|
+
scanUrl: SCAN_URL,
|
|
87
|
+
docsUrl: DOCS_URL,
|
|
84
88
|
};
|
|
85
89
|
}
|
|
86
90
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/docs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qEAAqE;AACrE,qBAAa,SAAU,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACZ;
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qEAAqE;AACrE,qBAAa,SAAU,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI3B;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACZ;AAkDD,mEAAmE;AACnE,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAyBxD;AAoCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAwBrF;AAUD,yFAAyF;AACzF,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa/F"}
|
package/dist/docs.js
CHANGED
|
@@ -30,8 +30,7 @@ const CACHE_TTL_MS = 10 * 60 * 1000;
|
|
|
30
30
|
// server-side fetch, and the operator can allowlist it by name if bot rules
|
|
31
31
|
// tighten. This runs on the developer's machine for their own MCP session.
|
|
32
32
|
const DOCS_FETCH_UA = 'extenshi-mcp (+https://docs.extenshi.io/developers/mcp)';
|
|
33
|
-
// Keyed by absolute URL so index and full
|
|
34
|
-
// custom EXTENSHI_DOCS_URL (local/staging) never collides with production.
|
|
33
|
+
// Keyed by absolute URL so the index and full-text entries cache independently.
|
|
35
34
|
const cache = new Map();
|
|
36
35
|
/** Monotonic-enough clock; isolated so tests can stay deterministic. */
|
|
37
36
|
function now() {
|
package/dist/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qEAAqE;AACrE,MAAM,OAAO,SAAU,SAAQ,KAAK;IACnC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;IACxB,CAAC;CACD;AAQD,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAC/B,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEnC,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,MAAM,aAAa,GAAG,yDAAyD,CAAA;AAO/E,
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static content for the free `generate_icon_workflow` MCP tool.
|
|
3
|
+
*
|
|
4
|
+
* The free icon path deliberately spends ZERO Extenshi tokens and touches no
|
|
5
|
+
* Extenshi infrastructure: the coding agent draws the SVG itself, and
|
|
6
|
+
* `@extenshi/cli icon preview` renders the verification page fully offline.
|
|
7
|
+
* This tool exists so an agent connected through the MCP connector gets the
|
|
8
|
+
* exact requirements and commands instead of guessing them.
|
|
9
|
+
*
|
|
10
|
+
* Kept as a template function (not a docs fetch) so the tool works without
|
|
11
|
+
* network access and never fails on a docs outage.
|
|
12
|
+
*/
|
|
13
|
+
export interface IconWorkflowArgs {
|
|
14
|
+
extensionName?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderIconWorkflow(args: IconWorkflowArgs): string;
|
|
17
|
+
//# sourceMappingURL=icon-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-workflow.d.ts","sourceRoot":"","sources":["../src/icon-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CA0DjE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static content for the free `generate_icon_workflow` MCP tool.
|
|
3
|
+
*
|
|
4
|
+
* The free icon path deliberately spends ZERO Extenshi tokens and touches no
|
|
5
|
+
* Extenshi infrastructure: the coding agent draws the SVG itself, and
|
|
6
|
+
* `@extenshi/cli icon preview` renders the verification page fully offline.
|
|
7
|
+
* This tool exists so an agent connected through the MCP connector gets the
|
|
8
|
+
* exact requirements and commands instead of guessing them.
|
|
9
|
+
*
|
|
10
|
+
* Kept as a template function (not a docs fetch) so the tool works without
|
|
11
|
+
* network access and never fails on a docs outage.
|
|
12
|
+
*/
|
|
13
|
+
export function renderIconWorkflow(args) {
|
|
14
|
+
const name = args.extensionName?.trim() || 'My Extension';
|
|
15
|
+
const iconFile = 'icon.svg';
|
|
16
|
+
return `# Browser-extension icon — design requirements and local workflow
|
|
17
|
+
|
|
18
|
+
This workflow is FREE and fully local: you (the agent) draw the SVG yourself, and the
|
|
19
|
+
Extenshi CLI renders an offline verification page. No API key, no credits, no uploads.
|
|
20
|
+
|
|
21
|
+
## Icon requirements (all stores: Chrome, Firefox, Edge)
|
|
22
|
+
|
|
23
|
+
- Deliverables: PNG at 16, 32, 48 and 128 px (128 px is the store-listing size), plus the
|
|
24
|
+
SVG master. Chrome Web Store also uses a 440×280 promo tile.
|
|
25
|
+
- The 16 px toolbar render is what users see most. Design for it:
|
|
26
|
+
- one bold silhouette, minimal interior detail, generous negative space;
|
|
27
|
+
- no text, no thin outlines (<1.5 px at 16 px they dissolve);
|
|
28
|
+
- keep ~1 px of breathing room to the edges (toolbar buttons crop nothing, but
|
|
29
|
+
adjacent icons sit 8–12 px away).
|
|
30
|
+
- Must survive light AND dark toolbars: avoid mid-gray (#7a7a7a-ish) fills that melt
|
|
31
|
+
into both themes; prefer a saturated brand color or add a contrasting outline/backdrop shape.
|
|
32
|
+
- Single \`<svg>\` element, square viewBox (e.g. \`viewBox="0 0 24 24"\` or \`0 0 128 128\`),
|
|
33
|
+
flat shapes, no embedded rasters, no scripts, no external references.
|
|
34
|
+
|
|
35
|
+
## Workflow
|
|
36
|
+
|
|
37
|
+
1. **Draw the SVG yourself** — write it to \`${iconFile}\` in the project. Iterate on the
|
|
38
|
+
silhouette at conceptual 16 px scale before adding any detail.
|
|
39
|
+
2. **Render the verification page** (free, offline):
|
|
40
|
+
|
|
41
|
+
\`\`\`bash
|
|
42
|
+
npx @extenshi/cli icon preview ${iconFile} --name "${name}"
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
This writes a self-contained HTML file and opens it: Chrome / Firefox / Edge toolbar
|
|
46
|
+
mockups with the icon pinned in place, switchable palettes (light, tinted, dark, black,
|
|
47
|
+
saturated + a custom color picker) with an automatic contrast warning per palette, a
|
|
48
|
+
store-size matrix, and an 8× pixel magnifier of the 16 px render.
|
|
49
|
+
3. **Ask the human to review the page.** Iterate: edit \`${iconFile}\`, re-run the command
|
|
50
|
+
(add \`--no-open\` on re-runs; the browser tab just needs a refresh).
|
|
51
|
+
4. **Export** straight from the page buttons: per-size PNGs, or the ZIP containing
|
|
52
|
+
\`icons/{16,32,48,128}.png\`, the SVG master and \`manifest-icons.json\`; there is also a
|
|
53
|
+
copy-paste manifest snippet:
|
|
54
|
+
|
|
55
|
+
\`\`\`json
|
|
56
|
+
{
|
|
57
|
+
"icons": { "16": "icons/16.png", "32": "icons/32.png", "48": "icons/48.png", "128": "icons/128.png" },
|
|
58
|
+
"action": { "default_icon": { "16": "icons/16.png", "32": "icons/32.png" } }
|
|
59
|
+
}
|
|
60
|
+
\`\`\`
|
|
61
|
+
5. Unpack the exported \`icons/\` folder into the extension and reference it from
|
|
62
|
+
\`manifest.json\` as above.
|
|
63
|
+
|
|
64
|
+
## Related
|
|
65
|
+
|
|
66
|
+
- Hosted AI icon generation (no local agent needed) lives at
|
|
67
|
+
https://dojo.extenshi.io/tools/icon-generator.
|
|
68
|
+
- Uploading the finished icon into a dojo project is planned but not available yet —
|
|
69
|
+
do not look for an upload API.
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=icon-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-workflow.js","sourceRoot":"","sources":["../src/icon-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,cAAc,CAAA;IACzD,MAAM,QAAQ,GAAG,UAAU,CAAA;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;+CAqBuC,QAAQ;;;;;oCAKnB,QAAQ,YAAY,IAAI;;;;;;;2DAOD,QAAQ;;;;;;;;;;;;;;;;;;;;;CAqBlE,CAAA;AACD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,13 +4,18 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Runs locally over stdio inside an MCP client (Claude Code/Desktop, Cursor)
|
|
6
6
|
* and exposes the Extenshi catalog as tools: market-research reads against the
|
|
7
|
-
* public BFF, plus a paid `scan_extension` that reuses the CLI scan path
|
|
7
|
+
* public BFF, plus a paid `scan_extension` that reuses the CLI scan path, and a
|
|
8
|
+
* local `publish_extension`.
|
|
9
|
+
*
|
|
10
|
+
* The TOOLS themselves live in `tools.ts` (transport-agnostic) so the sibling
|
|
11
|
+
* remote OAuth server (`@extenshi/mcp-server`) reuses the exact same registry.
|
|
12
|
+
* This file is just the stdio wiring: it injects deps that resolve identity
|
|
13
|
+
* from the environment (one `ek_…` key) and enables ALL capabilities.
|
|
8
14
|
*
|
|
9
15
|
* Auth: an `ek_…` API key is REQUIRED. Over stdio there are no request headers,
|
|
10
16
|
* so the key comes from the environment (EXTENSHI_API_KEY) / `~/.extenshi`
|
|
11
|
-
* config — see config.ts.
|
|
12
|
-
*
|
|
13
|
-
* key, so this is defense in depth, not the only gate.
|
|
17
|
+
* config — see config.ts. The backend independently enforces the key, so this
|
|
18
|
+
* is defense in depth, not the only gate.
|
|
14
19
|
*
|
|
15
20
|
* NB: stdout is the MCP protocol channel — never write to it (use stderr).
|
|
16
21
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|