Mcp Lever

io.github.smeet666由 GitHub 账号 smeet666 发布v2.1.0更新于 Nov 3, 2026

Search public Lever job boards: resolve a company, read its openings, read one in full.

概览

AI 生成的概览

搜索 Lever 公开职位板:把公司名解析为 Lever 站点名,按条件检索其职位,并完整读取单条职位。

可以做什么
  • 把公司名解析为 Lever 站点名,并显示哪个实例有响应
  • 按关键词、地点、团队、部门、合同类型、办公方式、国家、薪资或发布时间搜索指定公司的职位
  • 完整读取单条职位,包括招聘正文、分节内容和公布的薪资
  • 列出某公司使用的团队、地点和合同措辞,使筛选与其用词一致
适用场景
适合让助手查找在 Lever 上发布职位的特定公司的招聘信息、比较其职位或细读某条职位。由于 Lever 不提供跨职位板的搜索,每次查询都必须从公司名开始。
运行要求
通过 npx(需 Node.js 24 或更高版本)、Docker 镜像或 MCP 安装包在本地以 stdio 运行;无需 API 密钥、账号或环境变量。需要能访问 api.lever.co 和 api.eu.lever.co 的出站 HTTPS。
安装前请注意
仅只读访问公开职位板,不索取任何凭据。请求按每秒一次限速,结果只保存在内存中。该项目为非官方项目,与 Lever 及所列公司无关联,并要求展示职位时注明公司并链接其 Lever 页面。站点名区分大小写,未找到并不代表公司不在 Lever 上。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Mcp Lever,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[图片]

mcp-lever

[npm] [CI] [license] [MCP Registry] [Glama] [M8ven] [LobeHub] [Install in Cursor] [Install in VS Code]

Lever is recruiting software that thousands of companies use to run their hiring, and every customer gets a public job board that comes with it. Each board carries that company's open positions with their title, their location, the team and department they sit in, the commitment they ask for, the full advert, and the salary range where the company chose to publish one. Lever hosts one board per company, on either its global or its European instance, and publishes no index across them.

This server connects a chat client to those boards. You name the companies you are interested in, and it turns each name into the site name that addresses its board, searches their openings, filters them by location, team, workplace type, country, salary or how recently they were posted, reads one opening in full, and lists the wordings each company filters by. It needs no API key and no account.

Version française


Install

One-click install

[Install in Cursor] [Install in VS Code]

Claude Code

bash
claude mcp add lever -- npx -y mcp-lever

Claude Desktop, Cursor, and any client using the standard config format

json
{  "mcpServers": {    "lever": {      "command": "npx",      "args": ["-y", "mcp-lever"]    }  }}

Node 24 or later is required, and no environment variable has to be set.

With Docker

json
{  "mcpServers": {    "lever": {      "command": "docker",      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.1.0"]    }  }}

-i keeps stdin open, which is where the protocol travels, and -t is left out because a TTY rewrites the stream. The container needs outbound HTTPS to api.lever.co and api.eu.lever.co, and nothing else: no volume, no port, no credential.

Bundle, without npm

Download mcp-lever-2.1.0.mcpb from the latest release and open it. A client that supports MCP bundles installs it on its own, with no npm and no configuration file to edit. The bundle carries its dependencies, so nothing is fetched at install time.

What you can ask

  • "Which of Included Health, Netlify and Ramp are hiring on Lever?"
  • "Find me remote engineering roles at those three companies."
  • "Read me that opening in full."
  • "What locations does Included Health list its jobs under?"
  • "Anything posted in the last two weeks at Netlify?"

Every question starts from a company, since Lever offers no search across boards. search_jobs resolves the names you give it, so no preparation is needed:

resolve_company(["Included Health"])  ->  includedhealth, global instance, publishingsearch_jobs(["Included Health"], keyword: "therapist")get_job("includedhealth", "6f97a19f-…")

Tools

ToolWhat it does
resolve_companyTurns company names into the Lever site names of their boards.
search_jobsSearches the openings of the companies you name.
get_jobReads one opening in full, advert included.
list_filter_valuesLists the wordings one company files its openings under.

A Lever site name distinguishes case, so Flex answers where flex returns nothing. Four spellings are tried per name on each of the two instances, and the answer lists what was sent, so nothing found is never proof that a company is absent from Lever.

resolve_company

Turns company names into Lever site names, reporting every instance that answered. It takes a list.

ArgumentTypeRequiredWhat it does
namesarray of 1 to 25 stringsyesCompany names, or Lever site names you already know.

In return: one entry per name, carrying input; found, a list of { slug, instance, publishes } where publishes is false for a site that exists and lists nothing today; tried, the spellings sent in order; and cached, true when this session had already resolved that name. A name answering on both instances comes back with both, and neither is elected: pass the one you mean to the other tools.

search_jobs

Searches the openings of the companies named. Lever applies the filters it supports on its own exact wording, and this server applies the rest to the openings it read.

ArgumentTypeRequiredWhat it does
companiesarray of 1 to 25 stringsyesCompany names or Lever site names. Each is resolved here.
keywordstringnoWords to look for in the title and the advert.
locationarray of 1 to 20 stringsnoLocations, exactly as Lever writes them.
teamarray of 1 to 20 stringsnoTeams, exactly as Lever writes them.
departmentarray of 1 to 20 stringsnoDepartments, exactly as Lever writes them.
commitmentarray of 1 to 20 stringsnoCommitments, exactly as Lever writes them.
workplace_typearray of 1 to 4 stringsnoremote, hybrid, onsite or unspecified.
countryarray of 1 to 20 two-letter codesnoCountries as ISO codes, as in FR or US.
salary_minnumber, 0 or morenoThe lowest upper bound of a salary range to keep.
salary_intervalstringnoThe period salary_min is written in, such as per-year-salary.
currencythree-letter codenoThe currency salary_min is written in, as in EUR.
posted_within_daysinteger, 1 to 3650noHow recent an opening must be.
limitinteger, 1 to 100, default 25noOpenings to read per company.
skipinteger, 0 to 100000, default 0noOpenings to step over per company.

Lever itself applies location, team, department and commitment; this server applies keyword, workplace_type, country, salary_min, salary_interval, currency and posted_within_days to what it read. list_filter_values publishes the wordings the first four take, and a wording Lever does not know comes back as an empty list.

In return: jobs, each carrying id and company_slug, which get_job takes, plus title, location, all_locations, country, workplace_type, team, posted_at, url and apply_url. commitment and department are absent when the company records neither. salary is null for an opening published without one, which is never the same as zero, and it carries the interval Lever wrote it in, never converted or annualised. per_company gives one outcome per company, with a status of read, unresolved, empty or failed, which are four different answers, and the read and returned counts around the filters. total_available is always null: Lever publishes no result count. The rows carry no advert text, since one company's board can run to megabytes.

limit applies per company, and a company whose openings fill it may publish more: the notes say when that happened, and that a count taken inside that window measures the window. posted_within_days walks up to five pages per company, and Lever pages by title, so an opening published yesterday can sit anywhere in a board.

get_job

Reads one opening in full: the advert, its named sections, and the salary as published.

ArgumentTypeRequiredWhat it does
company_slugstringyesThe Lever site name, as resolve_company returns it.
job_idstringyesThe identifier of one opening, as a search returns it.
instanceglobal or eunoThe instance the row came from. The global one by default.

In return: job, holding the fields a search row carries, plus description, sections as { heading, items }, salary_note for what the company wrote beside the range, and source with the address it was retrieved from.

list_filter_values

Lists the team, location and commitment wordings one company uses. Read it before filtering: Lever matches its own wording, and the vocabulary belongs to each company, one writing Full-time where another writes EE Full-Time.

ArgumentTypeRequiredWhat it does
company_slugstringyesThe Lever site name, as resolve_company returns it.
instanceglobal or eunoThe instance this site lives on. The global one by default.
fieldsarray of 1 to 3 of team, location, commitmentnoWhich vocabularies to read. Each costs one request, and all three are read by default.

In return: company_slug, instance, and fields holding a list of { value, count } for each vocabulary asked for. A count is null where Lever published no figure alongside the category.

Configuration

Nothing has to be configured. The server reads no environment variable, and the mcpServers block above is complete as written.

The pacing, the timeout and the cache are settings of the client layer, which As a library shows how to pass. The interval between two requests can be widened there and never narrowed.

Errors

Every failure carries one of six codes, a message, and where it helps the values that would have been accepted.

CodeWhat happenedWhat to do
not_foundLever answered, and holds no such site or opening.Check the site name with resolve_company.
invalid_inputThe arguments were refused before any request went out.Read the message, which names the argument and what it takes.
rate_limitedLever asked this client to slow down.Wait, then call again with the same arguments. The opening is still on the board.
parse_failureLever answered in a shape this client cannot read.Report it at the issue tracker.
network_errorThe request did not complete.Try again shortly.
timeoutThe request passed its deadline.Ask for fewer companies, or a smaller limit.

As a library

The layer reading Lever is published on its own, with its pacing, its cache and its errors, and with no protocol attached.

ts
import { Client } from "mcp-lever/client";
const client = new Client({ minIntervalMs: 2000 });const resolved = await client.resolveCompany("Included Health");const jobs = await client.listPostings(resolved.found[0], { limit: 10 });console.log(jobs.length);

ClientOptions takes minIntervalMs, timeoutMs, cacheTtlMs and fetchImpl. An interval below the published floor is ignored, so the floor holds here as well.

Pacing and attribution

Both API hosts publish Crawl-delay: 1, so requests go out one at a time with at least a second between them, and that floor holds however the client is configured. The User-Agent carries the project and an address where a person can be reached, and imitates no browser.

Reads go to api.lever.co and api.eu.lever.co, which are the hosts Lever documents for its posting data. The jobs.lever.co careers pages are left alone.

Every opening carries the address of its Lever page and its apply URL. Credit the company and link that page when you show an opening.

This MCP server is an unofficial project, with no affiliation to Lever or to the companies whose boards it reads.

Privacy

This server collects nothing about you and sends nothing to its author. It runs on your machine, contacts api.lever.co and api.eu.lever.co and nothing else, holds its answers in memory while it runs, and writes nothing to disk. PRIVACY.md states what a request carries and which settings change any of it.

Development

bash
npm installnpm run build:fixturesnpm testnpm run check

Tests run against generated fixtures and make no network request. The live suite, npm run test:live, makes one request per route and runs nightly against the service itself.

Contributing

Bugs, questions and ideas belong in the issue tracker. Pull requests are welcome; opening an issue first helps agree on the shape of the change. See CONTRIBUTING.md.

License

MIT, see LICENSE. The openings belong to the companies that published them.


mcp-lever (français)

English version

Lever est un logiciel de recrutement qu'utilisent des milliers d'entreprises pour mener leurs embauches, et chaque cliente reçoit avec lui un site d'offres public. Chaque site porte les postes ouverts de cette entreprise avec leur intitulé, leur lieu, l'équipe et le département auxquels ils appartiennent, le type de contrat demandé, l'annonce complète, et la fourchette de salaire quand l'entreprise a choisi d'en publier une. Lever héberge un site par entreprise, sur son instance mondiale ou sur son instance européenne, et ne publie aucun index les traversant.

Ce serveur relie un client de conversation à ces sites. Vous nommez les entreprises qui vous intéressent, et il traduit chaque nom en l'identifiant qui adresse son site, cherche dans leurs offres, les filtre par lieu, équipe, mode de travail, pays, salaire ou fraîcheur de publication, lit une offre en entier, et liste les formulations selon lesquelles chaque entreprise classe les siennes. Aucune clé d'API, aucun compte.

Installation

Installation en un clic

[Install in Cursor] [Install in VS Code]

Claude Code

bash
claude mcp add lever -- npx -y mcp-lever

Claude Desktop, Cursor, et tout client au format de configuration standard

json
{  "mcpServers": {    "lever": {      "command": "npx",      "args": ["-y", "mcp-lever"]    }  }}

Node 24 ou plus récent est nécessaire, et aucune variable d'environnement n'est à renseigner.

Avec Docker

json
{  "mcpServers": {    "lever": {      "command": "docker",      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-lever:2.1.0"]    }  }}

-i garde l'entrée standard ouverte, qui est le canal du protocole, et -t est omis parce qu'un TTY réécrit le flux. Le conteneur a besoin d'un accès HTTPS sortant vers api.lever.co et api.eu.lever.co, et de rien d'autre : aucun volume, aucun port, aucun identifiant.

Bundle, sans npm

Téléchargez mcp-lever-2.1.0.mcpb depuis la dernière publication et ouvrez-le. Un client qui gère les bundles MCP l'installe seul, sans npm et sans fichier de configuration à modifier. Le bundle emporte ses dépendances, donc rien n'est téléchargé à l'installation.

Ce qu'on peut demander

  • « Lesquelles d'Included Health, Netlify et Ramp recrutent sur Lever ? »
  • « Trouve-moi des postes d'ingénierie en télétravail chez ces trois-là. »
  • « Lis-moi cette offre en entier. »
  • « Sous quels lieux Included Health classe-t-elle ses offres ? »
  • « Quelque chose publié ces quinze derniers jours chez Netlify ? »

Chaque question part d'une entreprise, puisque Lever n'offre aucune recherche traversant les sites. search_jobs résout lui-même les noms qu'on lui donne, donc rien n'est à préparer :

resolve_company(["Included Health"])  ->  includedhealth, instance mondiale, publiesearch_jobs(["Included Health"], keyword: "therapist")get_job("includedhealth", "6f97a19f-…")

Les outils

OutilCe qu'il fait
resolve_companyTraduit des noms d'entreprises en identifiants de sites Lever.
search_jobsCherche dans les offres des entreprises nommées.
get_jobLit une offre en entier, annonce comprise.
list_filter_valuesListe les formulations sous lesquelles une entreprise classe.

Un identifiant de site Lever distingue la casse, donc Flex répond là où flex ne rend rien. Quatre orthographes sont essayées par nom sur chacune des deux instances, et la réponse liste ce qui a été envoyé : ne rien trouver ne prouve jamais qu'une entreprise est absente de Lever.

resolve_company

Traduit des noms d'entreprises en identifiants de sites Lever, en signalant chaque instance qui a répondu. Il prend une liste.

ArgumentTypeRequisCe qu'il fait
namestableau de 1 à 25 chaînesouiDes noms d'entreprises, ou des identifiants déjà connus.

En retour : une entrée par nom, portant input ; found, une liste de { slug, instance, publishes } où publishes est faux pour un site qui existe et ne liste rien aujourd'hui ; tried, les orthographes envoyées dans l'ordre ; et cached, vrai quand la session avait déjà résolu ce nom. Un nom qui répond sur les deux instances revient avec les deux, et aucune n'est élue : passez celle que vous visez aux autres outils.

search_jobs

Cherche dans les offres des entreprises nommées. Lever applique les filtres qu'il gère sur sa propre formulation exacte, et ce serveur applique les autres aux offres qu'il a lues.

ArgumentTypeRequisCe qu'il fait
companiestableau de 1 à 25 chaînesouiNoms d'entreprises ou identifiants. Chacun est résolu ici.
keywordchaînenonMots à chercher dans l'intitulé et dans l'annonce.
locationtableau de 1 à 20 chaînesnonDes lieux, exactement comme Lever les écrit.
teamtableau de 1 à 20 chaînesnonDes équipes, exactement comme Lever les écrit.
departmenttableau de 1 à 20 chaînesnonDes départements, exactement comme Lever les écrit.
commitmenttableau de 1 à 20 chaînesnonDes types de contrat, exactement comme Lever les écrit.
workplace_typetableau de 1 à 4 chaînesnonremote, hybrid, onsite ou unspecified.
countrytableau de 1 à 20 codes à deux lettresnonDes pays en code ISO, comme FR ou US.
salary_minnombre, 0 ou plusnonLa plus basse borne haute de fourchette à conserver.
salary_intervalchaînenonLa période dans laquelle salary_min est écrit, par exemple per-year-salary.
currencycode à trois lettresnonLa devise dans laquelle salary_min est écrit, comme EUR.
posted_within_daysentier, 1 à 3650nonL'ancienneté maximale d'une offre.
limitentier, 1 à 100, défaut 25nonOffres à lire par entreprise.
skipentier, 0 à 100000, défaut 0nonOffres à enjamber par entreprise.

Lever applique lui-même location, team, department et commitment ; ce serveur applique keyword, workplace_type, country, salary_min, salary_interval, currency et posted_within_days à ce qu'il a lu. list_filter_values publie les formulations que prennent les quatre premiers, et une formulation que Lever ignore revient en liste vide.

En retour : jobs, chacune portant id et company_slug, que get_job reprend, plus title, location, all_locations, country, workplace_type, team, posted_at, url et apply_url. commitment et department sont absents quand l'entreprise ne les renseigne pas. salary vaut null pour une offre publiée sans fourchette, ce qui ne vaut jamais zéro, et porte l'interval dans lequel Lever l'a écrite, jamais converti ni annualisé. per_company donne une issue par entreprise, avec un status valant read, unresolved, empty ou failed, qui sont quatre réponses différentes, et les comptes read et returned de part et d'autre des filtres. total_available vaut toujours null : Lever ne publie aucun compte de résultats. Les lignes ne portent pas l'annonce, un site d'entreprise pouvant peser plusieurs mégaoctets.

limit s'applique par entreprise, et une entreprise dont les offres le remplissent en publie peut-être davantage : les notes le signalent, et disent qu'un compte pris dans cette fenêtre mesure la fenêtre. posted_within_days parcourt jusqu'à cinq pages par entreprise, et Lever pagine par intitulé, donc une offre publiée hier peut se trouver n'importe où dans un site.

get_job

Lit une offre en entier : l'annonce, ses sections nommées, et le salaire tel que publié.

ArgumentTypeRequisCe qu'il fait
company_slugchaîneouiL'identifiant du site, rendu par resolve_company.
job_idchaîneouiL'identifiant d'une offre, rendu par une recherche.
instanceglobal ou eunonL'instance d'où vient la ligne. La mondiale par défaut.

En retour : job, qui porte les champs d'une ligne de recherche, plus description, sections en { heading, items }, salary_note pour ce que l'entreprise a écrit à côté de la fourchette, et source avec l'adresse d'où l'offre a été lue.

list_filter_values

Liste les formulations d'équipe, de lieu et de contrat qu'une entreprise emploie. À lire avant de filtrer : Lever fait correspondre sa propre formulation, et le vocabulaire appartient à chaque entreprise, l'une écrivant Full-time là où une autre écrit EE Full-Time.

ArgumentTypeRequisCe qu'il fait
company_slugchaîneouiL'identifiant du site, rendu par resolve_company.
instanceglobal ou eunonL'instance où vit ce site. La mondiale par défaut.
fieldstableau de 1 à 3 parmi team, location, commitmentnonLes vocabulaires à lire. Chacun coûte une requête, et les trois sont lus par défaut.

En retour : company_slug, instance, et fields qui porte une liste de { value, count } pour chaque vocabulaire demandé. Un count vaut null là où Lever n'a publié aucun chiffre à côté de la catégorie.

Configuration

Il n'y a rien à configurer. Le serveur ne lit aucune variable d'environnement, et le bloc mcpServers ci-dessus est complet tel quel.

Le rythme, le délai et le cache sont des réglages de la couche cliente, que Comme bibliothèque montre comment passer. L'écart entre deux requêtes peut y être élargi et jamais resserré.

Erreurs

Chaque échec porte un des six codes, un message, et quand cela aide les valeurs qui auraient été acceptées.

CodeCe qui s'est passéQue faire
not_foundLever a répondu, et n'a ni ce site ni cette offre.Vérifiez l'identifiant avec resolve_company.
invalid_inputLes arguments ont été refusés avant toute requête.Lisez le message, qui nomme l'argument et ce qu'il prend.
rate_limitedLever demande à ce client de ralentir.Attendez, puis rappelez avec les mêmes arguments. L'offre est toujours en ligne.
parse_failureLever a répondu dans une forme que ce client ne lit pas.Signalez-le sur le suivi d'incidents.
network_errorLa requête n'a pas abouti.Réessayez sous peu.
timeoutLa requête a dépassé son délai.Demandez moins d'entreprises, ou un limit plus petit.

Comme bibliothèque

La couche qui lit Lever est publiée seule, avec son rythme, son cache et ses erreurs, sans protocole attaché.

ts
import { Client } from "mcp-lever/client";
const client = new Client({ minIntervalMs: 2000 });const resolved = await client.resolveCompany("Included Health");const jobs = await client.listPostings(resolved.found[0], { limit: 10 });console.log(jobs.length);

ClientOptions prend minIntervalMs, timeoutMs, cacheTtlMs et fetchImpl. Un écart sous le plancher publié est ignoré, donc le plancher tient également ici.

Rythme et attribution

Les deux hôtes d'API publient Crawl-delay: 1, donc les requêtes partent une à une avec au moins une seconde entre elles, et ce plancher tient quelle que soit la configuration du client. Le User-Agent porte le projet et une adresse où joindre une personne, et n'imite aucun navigateur.

Les lectures vont vers api.lever.co et api.eu.lever.co, les hôtes que Lever documente pour ses données d'offres. Les pages carrières jobs.lever.co sont laissées tranquilles.

Chaque offre porte l'adresse de sa page Lever et son adresse de candidature. Créditez l'entreprise et renvoyez vers cette page quand vous montrez une offre.

Ce MCP est un projet non officiel, sans affiliation à Lever ni aux entreprises dont il lit les sites.

Confidentialité

Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur votre machine, ne joint que api.lever.co et api.eu.lever.co, garde ses réponses en mémoire le temps qu'il tourne, et n'écrit rien sur le disque. PRIVACY.md dit ce qu'une requête emporte et quels réglages changent cela.

Développement

bash
npm installnpm run build:fixturesnpm testnpm run check

Les tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête. La suite en direct, npm run test:live, émet une requête par route et tourne chaque nuit contre le service lui-même.

Contribuer

Les anomalies, les questions et les idées ont leur place dans le suivi d'incidents. Les propositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à s'accorder sur la forme du changement. Voir CONTRIBUTING.md.

Licence

MIT, voir LICENSE. Les offres appartiennent aux entreprises qui les ont publiées.

来源:README.md,提交 397d2c2

工具

4

resolve_company

Resolve company names to Lever boards

Turn company names into the Lever site names that address their job boards, and report every instance that answered. search_jobs resolves names on its own, so reach for this to check which of several companies are on Lever at all: it probes names without reading a single board, where a search would read one per company.

输入参数names必填

search_jobs

Search openings at named companies

Search the openings published by named companies on Lever. `companies` takes company names or Lever site names, and each name is turned into a site name here. A name found on the first spelling costs 3 requests, and one that resists costs up to 9, at one second each. location, team, department and commitment are sent to Lever and need its exact wording. keyword, workplace_type, country, salary and recency are applied here, because Lever accepts none of them as filters. limit applies per company, so a company whose openings fill it may publish more. posted_within_days walks up to 5 pages per company, because Lever pages by title and a recent opening sits anywhere.

输入参数skipteamlimitcountrykeywordcurrencylocationcompanies必填commitmentdepartmentsalary_minworkplace_type另有 2 个

get_job

Read one opening

Read one Lever opening in full: the advert, its named sections, and the salary as published. company_slug and instance are the ones the row carried, and a site living on both instances holds different openings on each.

输入参数job_id必填instancecompany_slug必填

list_filter_values

List a company's filter wordings

List the team, location and commitment wordings one company uses on Lever, so a filter can carry the words that company publishes. The vocabulary belongs to each company: one writes Full-time, another Full Time, another EE Full-Time. Lever publishes no vocabulary for department, so a department filter is checked against the openings a company has open right now.

输入参数fieldsinstancecompany_slug必填

版本历史

2
  1. v2.1.0最新Oct 29, 2026
  2. v2.0.1Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分