@extenshi/mcp

中文文档
0.28.0发布于 2026/11/13MITTypeScriptES Module近 30 天下载 6453

Extenshi MCP server — bring the extension catalog (search, security, market research) and pre-publish scanning into your AI tools

原始使用文档
文档目录10 节
  1. Get an API key
  2. Configure your MCP client
  3. Plan the whole lifecycle
  4. Tools
  5. Identifying an extension by its store id
  6. Credits
  7. Configuration
  8. Develop
  9. Standalone Pay applications
  10. Owner approval on the hosted connector

@extenshi/mcp

A Model Context Protocol server that brings the Extenshi extension catalog — search, security analysis, market research, and pre-publish scanning — into your AI tools (Claude Code, Claude Desktop, Cursor, …).

It runs locally over stdio, so there's nothing to host. It reuses your existing Extenshi API key (the same one @extenshi/cli uses) and talks to the public Extenshi backend on your behalf.

Get an API key

An API key is required for catalog and own-project tools. Documentation, templates and static workflow guides, including get_development_guide, work without a key. The backend enforces access and project entitlements for authenticated operations.

  1. Sign up at https://auth.extenshi.io/signup**
  2. Create a key at https://dojo.extenshi.io/api-keys**
  3. Provide it via the EXTENSHI_API_KEY environment variable (or run npx @extenshi/cli@latest login, which the MCP server reads from ~/.extenshi/config.json).

Configure your MCP client

{
  "mcpServers": {
    "extenshi": {
      "command": "npx",
      "args": ["-y", "@extenshi/mcp@latest"],
      "env": { "EXTENSHI_API_KEY": "ek_…" }
    }
  }
}

Plan the whole lifecycle

Call get_development_guide first for the complete tool inventory on this connection, the Extenshi service directory, prerequisites and documentation links, GitHub source/CI guidance, and the ordered plan through implementation, testing, store release and maintenance. The inventory is built from registered tools. The remote connector shares this guide and directs local artifact operations to stdio or CLI. See the development workflow.

Tools

ToolWhat it doesCost
search_extensionsHybrid search across Chrome/Firefox/Edge with filters (store, category, pricing, rating, risk, permissions)1 read
get_extensionFull catalog detail for one extension — by numeric catalog ID or by its store id (see below)1 read
get_reviewsPaginated 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 rating1 read
get_securityRisk score + finding counts + top grouped findings (reads existing scans)3 reads
get_risk_by_store_idsSafety scores for up to 40 extensions in one call, by store id — for auditing a list of installed extensions instead of calling get_security per extension1 read per call
market_overviewCatalog-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; facets selects groups and top_n (default 10) trims long lists1 read
get_credit_balanceRemaining credits across every pool (read / scan / icon / inventory), so an agent can size a batch before running it instead of hitting a mid-batch limitFree
get_approvalWhere a change proposed through the hosted connector stands (pending, applied, rejected, failed, expired); read-only, the owner decides in DojoFree; identity required
get_development_guideComplete tool inventory for this connection, service directory, GitHub guidance and the ordered development-to-maintenance plan; compact overview by default, full parts via sectionsFree (no key)
list_extension_templatesExtension shapes, minimum permissions and browser-specific manifest requirementsFree (no key)
connection_diagnosticsAuthentication, scopes, backend workspace contracts and capabilitiesFree; identity required
import_manifestImport manifest JSON (plus its _locales messages via messagesByLocale) into the Dojo editor, translations and project labels; preview changes and apply with a state hash.Requires project.write for OAuth
get_project_workspaceRevisioned repository metadata, source/built manifests, scope and release snapshotFree; identity required
diff_project_stateThree-way metadata preview against a server-held base revisionFree; project read access
apply_project_patchApply a typed metadata patch with conflicts, tombstones and idempotencyRequires project.write for OAuth
create_ci_ingest_secretCreate or rotate the CI evidence ingest secret (shown once, store in Actions secrets)Requires project.write for OAuth
upsert_hosted_pageRegister the project homepage/support URL (HTTPS, reachable, hashed)Requires hosted.write for OAuth
verify_hosted_artifactRe-fetch and compare a hosted page against its record (verified/changed/unreachable)Requires hosted.write for OAuth
remove_hosted_pageForget a registered homepage/support URL (public page keeps working)Requires hosted.write for OAuth
list_hosted_pagesRegistered hosted pages with verification statusFree; identity required
publish_landing_pageHost the landing page at page.extenshi.io/{code} (or a custom domain root) from the Page generator form, v1 or schema v2 (versioned; registered as the homepage by default; live.status says whether the public URL serves it)Requires hosted.write for OAuth
get_landing_pageHosted landing page code, live version, URL and a summary of the form; view: "full" (with optional fields / locales) returns the formFree; identity required
unpublish_landing_pageTake the hosted landing page offline (same URL on the next publish)Requires hosted.write for OAuth
draft_landing_pageDraft a schema-v2 homepage (sections, theme, SEO, locales) from project state, with sources and to-dosFree; identity required
preview_landing_pageValidate and render a form exactly as publish would; every problem with a path and fixFree; identity required
list_landing_page_versionsHosted landing page version historyFree; identity required
rollback_landing_pageRestore an earlier version as a new versionRequires hosted.write for OAuth
get_custom_domainCustom domain status, exact DNS records and next stepFree; identity required
set_custom_domainAdd a custom domain for the homepage and hosted pages (CNAME + TXT records)Pro project; hosted.write
verify_custom_domainVerify ownership and HTTPS; on ACTIVE the homepage serves at the domain rootPro project; hosted.write
remove_custom_domainStop serving the custom domain; canonical and HOMEPAGE_URL return to page.extenshi.ioRequires hosted.write for OAuth
get_install_instructionsHosted install instructions page (code, URL, published form) and the saved draftFree; identity required
publish_install_instructionsHost the install instructions at dojo.extenshi.io/instructions/{code}, steps in 11 languagesRequires hosted.write for OAuth
unpublish_install_instructionsTake the hosted install instructions offline (same URL on the next publish)Requires hosted.write for OAuth
get_page_translationsDeveloper-written text on uninstall forms / feedback forms / welcome pages / install instructions with per-language translation statusFree; identity required
set_page_translationsSave one language of one uninstall form / feedback form / welcome page / install instructions pageRequires hosted.write for OAuth
get_legal_translationsTranslated copies of the published privacy policy or license terms (the English version binds): what is left to translate, per languageFree; identity required (license terms: pay.read)
get_license_terms_questionnaireThe license terms & refunds questions as data (types, choices, limits, when each is required); no saved answersFree; identity required (no pay.read)
draft_license_termsLicense terms text from answers sent in the call, with the gaps that block publishing; saves nothingFree; identity required (no pay.read)
get_license_termsSaved draft, published version and hash, versions, open and owner-only answersRequires pay.read
save_license_terms_draftSave answers as the draft; identity answers stay the owner's; dryRun, expectedDraftHashRequires pay.write
request_license_terms_publicationAsk the owner to publish a draft (approval link); can also decide seller.termsRequires pay.write
publish_license_termsPublish directly with a key that has pay.legal.publish; stdio onlyRequires pay.write + pay.legal.publish
verify_license_terms_livePage, hash, paywall links and seller.terms checks of the published termsFree; identity required
rollback_license_termsEarlier version back as a new one, via approval or directlyRequires pay.write
list_uninstall_formsThe project's uninstall surveys: URL, enabled, primary, responsesFree; identity required
get_uninstall_formOne survey in full, its updatedAt, the heading and its source, translation statusFree; identity required
update_uninstall_formPartial update checked like the Dojo editor; dryRun diff, expectedUpdatedAt, idempotencyKey; URL and responses stayRequires hosted.write for OAuth
get_uninstall_offerThe survey's discounted offer: reasons that show it, a discount per plan, revision, what still blocks it, the project's plans, countsFree; identity required
update_uninstall_offerSet the whole offer; dryRun checks it; expectedRevision; Pro project. On the hosted connector it is a proposal the owner approvesRequires pay.write for OAuth
preview_uninstall_formThe survey's text in one language and the screen after each answer; counts nothingFree; identity required
list_uninstall_responsesA survey's answers, newest first, filtered by version and date, with counts by reason and version; emails only for an API keyFree; identity required
list_feedback_formsThe project's feedback forms (feedback.extenshi.io): URL, enabled, primary, responsesFree; identity required
get_feedback_formOne feedback form in full, its updatedAt, the heading and its source, translation statusFree; identity required
update_feedback_formPartial update checked like the Dojo editor; dryRun diff, expectedUpdatedAt, idempotencyKey; URL and answers stayRequires hosted.write for OAuth
preview_feedback_formThe form's text in one language and the thank-you screen per category; records nothingFree; identity required
list_feedback_responsesA form's answers, newest first, filtered by category, source, version and date; emails only for an API keyFree; identity required
find_brand_mentionsEvery hosted field holding a name (e.g. an old extension name), with the tool that fixes itFree; identity required
set_legal_translationsSave one language of the privacy policy or license terms translation (edited sections and free-text answers). On the hosted connector a translation is a proposal the owner approves in Dojo; with an API key it goes live at onceRequires hosted.write + Pro (policy) or pay.write (terms) for OAuth
upload_project_mediaUpload a PNG/JPEG/WebP logo or screenshot to the project's public media store and get a stable URL for publish_landing_page (metadata stripped, per-project quota; filePath inside the workspace on stdio, dataBase64 everywhere)Requires hosted.write for OAuth
record_project_evidenceStore metadata bound to the exact artifact, input hash, browser and source revisionRequires evidence.write for OAuth
get_release_readinessExplain current, stale and missing release checks by browser and locale. With a linked Pay application, the payment check is derived from Extenshi's payment ledger (source platform); a live-mode purchase that reached an installation passes itPro project; project read access
list_my_projectsYour projects, repository bindings and claimed listingsFree; identity required
create_projectCreate a project through the Dojo wizard's service; idempotent per key; returns id, next steps and open owner decisions; the local server adds buildMapRequires project.write for OAuth
get_decisionsOwner decisions (AMO add-on id, license, seller identity, pricing, targets): status, suggested default, what each blocksFree; identity required
propose_decisionPropose a decision value with rationale; the owner decides in Dojo, and decided keys are refusedRequires project.write for OAuth
get_project_stateManifest summaries (imported or generated, digest, keys that differ from the imported files), selected types, saved-state index, hosted URLs and exact integration file; manifests: "full" returns the manifest bodies; the local server adds buildMap (whether the build map is open, its address, and whether the author declined it)Free; identity required
get_project_scaffoldStarter files for one project and target browserFree; identity required
list_privacy_policy_versionsHosted policy version historyPro project; no read credit
get_privacy_policy_versionOne hosted policy's markdown and HTMLPro project; no read credit
update_privacy_policy_with_aiPropose a policy update for the author to review; aiStep states whether the AI step ran, otherwise the proposal is a section mergePro project; daily update limit applies
publish_privacy_policyPublish a policy at the project's hosted URL. On the hosted connector the text is stored as a proposal the owner approves in Dojo (see below); with an API key it goes live at once. For a file, extenshi privacy publish <file.md> sends its exact bytes and checks what was storedPro project; changes the live page
search_docsSearch the Extenshi docs + @extenshi/cli reference so the assistant can quote exact commands; returns top limit passages capped at max_chars eachFree (no key)
localize_workflowLocal message translation contract, CLI validation and manual review gatesFree (no key)
generate_icon_workflowIcon design requirements + the local agent-draws-SVG → npx @extenshi/cli@latest icon preview → export workflowFree (no key)
generate_welcome_page_workflowDesign brief for the post-install welcome page: the one action it must drive, which illustrations to produce, where to place click markers, and the block JSON to returnFree (no key)
generate_pin_guidePin-to-toolbar steps for Chrome, Edge and Firefox as an offline kit for a welcome page bundled in the extension: SVGs with the icon and markers drawn in, CSP-safe HTML, captions in 11 languages as chrome.i18n messages, and a script reading action.getUserSettings().isOnToolbar. Overview by default; part returns html / messages / script / cssFree (no key)
generate_landing_pageStatic landing-page (homepage) HTML with no JavaScript — same generator as the cabinet Page generator; returns {html, bytes, warnings, nextSteps}. Host it on any HTTPS origin and register the URL with upsert_hosted_page (feeds HOMEPAGE_URL)Free (no key)
scan_extensionPre-publish security scan of a local artifact (.zip/.crx/.xpi), with live progress1 scan
publish_extensionPublish to Chrome/Firefox/Edge with your own store credentials (fully local)Free
get_build_mapThe author's build map of projectDir (npx @extenshi/cli map): progress, steps waiting on the author, steps that can start now, every step's current task, and the variants offered with the author's answer. Local server onlyFree (no key)
show_build_mapDraw the build map in the conversation in a client that shows MCP Apps (Claude), optionally open at one step, where the author picks variants, marks their own tasks or skips a step; elsewhere returns the link to the author's map. Local server onlyFree (no key)
report_build_stepReport on a build map step (start, progress, done with hashed file proof, stop), or record the author's answer from the chat (choice / redo). Local server onlyFree (no key)
request_build_reviewOffer the author 1–8 variants to choose from on the map (icon concepts, screenshots, listing copy), each a preview page or image in the project; returns the link to the step. Local server onlyFree (no key)

In a client that shows MCP Apps, show_build_map draws the map in the conversation (the page ui://extenshi/build-map). The page calls three app-only tools, build_map_view, build_map_answer and build_map_file; the server keeps them from any client that does not advertise io.modelcontextprotocol/ui.

Identifying an extension by its store id

get_extension, get_reviews, get_security and scan_extension accept either the numeric catalog extension_id or the extension's store_id — the id straight from the store URL, which is usually the only precise identifier you have:

{ "store_id": "cjpalhdlnbpafiamejdnhcphjbkeiagm", "store": "CHROME" }  // Chrome/Edge: `store` required
{ "store_id": "dark-reader" }                                          // Firefox: unambiguous

store is required for a Chrome/Edge id because both stores use the identical 32-character format; Firefox ids (slug, GUID, or email-style) route automatically. Resolving a store id is free — only the read that follows costs a credit.

Credits

Every account gets a one-time free allowance of 10 reads and 3 scans (no card required). Beyond that, buy prepaid credit packs (up to 10,000 reads and 1,000 scans per pack) that never expire. Call get_credit_balance (free) to check what's left before running a large batch. Manage credits at https://dojo.extenshi.io/billing.

Configuration

The backend endpoints are compiled into the package and always point at production — only the API key is read from the environment.

Env varPurpose
EXTENSHI_API_KEYYour ek_… developer key (required)

Develop

yarn build            # tsc -> dist/
# Inspect locally:
EXTENSHI_API_KEY=ek_… npx @modelcontextprotocol/inspector node dist/index.js

Releases are staged on npm by CI and approved manually by a maintainer with 2FA; ./scripts/publish.sh is the local staging fallback (DRY_RUN=1 ./scripts/publish.sh to validate). Staging requires Node ≥22.14 and npm ≥11.15.

See the project synchronization workflow for CLI commands, revision conflicts, evidence freshness and OAuth recovery.

Standalone Pay applications

These tools require a backend with standalone Pay support. A development project is optional. Request explicit pay.read and/or pay.write OAuth scopes, or grant Pay permissions to a local API key in API keys. Older credentials have no Pay access. Tool registration does not prove backend rollout or SDK npm publication.

ToolPermissionBehavior
list_pay_appspay.readList your independent Pay applications. No development project required. Follow nextCursor for more results.
create_pay_apppay.writeCreate an independent Pay application; linking a development project is optional. Optional trialDays sets a free trial. Creates a new application on every call: do not retry blindly after a timeout.
get_pay_apppay.readRead your Pay application, its optional project link and its free trial (trialDays).
get_pay_readinesspay.readCheck current checkout and launch prerequisites. A passing checkout check does not prove a live external purchase or SDK publication.
get_pay_payment_evidencepay.readRead what Extenshi's payment ledger proves about the application's payment path, per mode: checkout completed, license issued, an installation received the signed license, restored on a second installation, refund revoked. Opaque IDs and timestamps only. Only live-mode purchases satisfy a release's payment requirement.
link_pay_apppay.writeLink your Pay application to your development project. Existing purchases remain attached to the Pay application.
unlink_pay_apppay.writeRemove the optional development-project link without deleting Pay data.
archive_pay_apppay.writeArchive your application and stop new checkout. Preserve payment records and existing entitlements.
export_pay_datapay.readExport one page of your application data. Follow nextCursor until null for a complete export. Offer rows include sortOrder, the offer's position on the paywall. Customer/payment data is sensitive: save only to an author-controlled destination; never paste into public issues.
get_pay_sellerpay.readRead seller connection, public profile, offers (with sortOrder) and publishable SDK key. Agreement signing and KYC require the author in the browser.
connect_pay_sellerpay.writeStart Stripe Connect onboarding and return a browser action URL. The author must complete KYC and legal acceptance; never do these on their behalf.
refresh_pay_sellerpay.writeRefresh current payment-provider onboarding status. This does not complete KYC or accept agreements.
set_pay_seller_profilepay.writeSave author-confirmed public seller identity, support and terms links. Never invent legal identity or terms.
upsert_pay_offerpay.writeCreate or update an offer by stable SKU. On an existing offer, omitted fields keep their stored values: to change only the title or description, send the SKU and the new text, and the price, features and paywall order (sortOrder) stay as they are. A new SKU needs kind, amountMinor, currency and title. Price is in minor currency units. Use only the author-approved price, billing interval and features.
archive_pay_offerpay.writeStop offering a SKU for new checkout; preserve historical purchases.
get_pay_offer_translationspay.readThe offers' title, description and features keyed <sku>/<field>, with translation status per project language; the paywall shows an offer in the buyer's browser language when the project ships it.
set_pay_offer_translationspay.writeSave one language of the offers' translations; a save whose original changed since it was read is refused. Answers with the saved language's translations and every language's status; pass view: "all_locales" to get every language's translations. Prices and SKUs are not changed.
set_pay_enabledpay.writeExplicitly enable or disable new payments. Enabling is a live commerce change: only do so with author authorization and after checking readiness. Backend prerequisites remain enforced.
set_pay_trialpay.writeSet the free trial: trialDays (0–365) per installation, counted on the server from its first license read; null turns it off. A new length also moves trials already running.
rotate_pay_keypay.writeGenerate a new publishable SDK key. Prior keys remain accepted for installed extension builds; this is not secret revocation. Never retry blindly.

Owner approval on the hosted connector

On the hosted connector (OAuth sign-in), the changes that move money or publish to the public are proposals, not immediate edits: set_pay_enabled, upsert_pay_offer, archive_pay_offer, archive_pay_app, set_pay_seller_profile, set_pay_trial, update_uninstall_offer, publish_privacy_policy and set_legal_translations (the privacy policy and the license terms). Each returns status: "pending_approval" with an approvalId and an approvalUrl. Nothing changes until the owner opens the link in Dojo and approves it; get_approval reports the outcome. A proposal expires after 24 hours (72 for a policy), and a newer proposal for the same thing replaces an older one. For a policy or a translation, the text is stored with the proposal, so the owner approves exactly the words that get published; a translation is also refused if its English text changed in between. An offer edit that names only some fields is stored with the offer's other terms as they were when it was proposed, price and paywall order included, so the owner approves every term it will save.

A local ek_ API key from API keys acts directly, as before: whoever holds it is the owner's own tooling. With a key, these tools change the live state at once and return no approvalId, and their descriptions on the local package say so. The one exception is request_license_terms_publication, which asks the owner on either connection. No tool deletes a project or an extension.

The author completes legal acceptance and Stripe KYC in the browser. Read get_pay_readiness before enabling checkout; enablement, key rotation and offer changes require explicit author authorization. Export pages contain private financial data and must remain in an author-controlled destination. Only the publishable SDK key belongs in an extension, never a developer API key or Stripe secret.

版本与发布记录

@extenshi/mcp 共发布 48 个版本,首次发布于 2026/06/06;过去 12 个月发布了 48 个版本。

版本发布日期距今
0.28.0latest2026/11/131 天前
0.27.42026/11/122 天前
0.27.32026/11/112 天前
0.26.02026/11/112 天前
0.27.02026/11/112 天前
0.27.12026/11/112 天前

关于 @extenshi/mcp 的常见问题

@extenshi/mcp 是什么?

Extenshi MCP server — bring the extension catalog (search, security, market research) and pre-publish scanning into your AI tools

如何安装 @extenshi/mcp?

在项目目录运行 npm install @extenshi/mcp,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 extenshi-mcp,可以用 npx extenshi-mcp 直接运行。

@extenshi/mcp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@extenshi/mcp 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@extenshi/mcp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@extenshi/mcp 可以商用吗?

@extenshi/mcp 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@extenshi/mcp 的下载量有多少?

根据 npm 官方下载统计,@extenshi/mcp 在 2026/10/14 – 2026/11/12 这 30 天内被下载 6,453 次,日均约 215 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@extenshi/mcp 还在维护吗?

最新版本 0.28.0 发布于 2026/11/13(1 天前);至今共发布 48 个版本,其中过去 12 个月发布了 48 个;首次发布于 2026/06/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。