Gmail MCP

io.github.A1-x-Tech由 GitHub 账号 A1-x-Tech 发布v1.1.2更新于 Nov 7, 2026

MCP server for the Gmail API: search, read and send email, manage drafts, labels and the trash.

已验证STDIO仅桌面效率与工作流沟通与协作

概览

AI 生成的概览

面向 Gmail API 的本地 MCP 服务器,让助手在单个 Google 邮箱中搜索、阅读、起草、发送和整理邮件。

可以做什么
  • 用 Gmail 查询语法搜索并阅读邮件与会话,返回解码后的邮件头、正文和附件元数据
  • 创建、读取、更新、列出、发送和删除草稿,包括在已有会话中创建回复草稿
  • 直接发送邮件或发送已存草稿,官方推荐先起草、审阅再发送
  • 修改已读、星标和归档状态,并为单封邮件或整个会话添加或移除标签
  • 创建、更新和列出标签,把邮件或会话移入垃圾箱或恢复
  • 查看连接状态、在对话内完成 OAuth 登录、登出、读取邮箱资料,以及直接调用任意 Gmail API 路径
适用场景
适合让助手整理收件箱、总结会话、先准备回复供人工审阅再发送,或维护标签和垃圾箱。适用于单个个人或工作 Gmail 邮箱,且希望助手真正读取和处理邮件而不只是描述邮件。
运行要求
以 Node.js 20+ 的本地 stdio 进程运行(npm 包 mcp-google-gmail),通常用 npx 启动。需要一个 Google 账号,以及启用了 Gmail API 并创建了桌面应用 OAuth 客户端的 Google Cloud 项目。凭据可来自对话内登录流程(提供客户端 JSON 路径并在同一台机器上完成浏览器授权),或来自 GOOGLE_GMAIL_CLIENT_ID、GOOGLE_GMAIL_CLIENT_SECRET 和 GOOGLE_GMAIL_REFRESH_TOKEN,也可使用短期的 GOOGLE_GMAIL_ACCESS_TOKEN。需要访问 Google 的网络连接。
安装前请注意
发送立即生效且无法撤回;服务器不会重试结果不明的发送,重发前应先检查已发送邮件。移入垃圾箱约 30 天内可恢复,但删除草稿是永久的,raw_request 也能执行破坏性调用。客户端密钥和刷新令牌应按密码对待;README 说明存在匿名遥测,可能包含错误摘录,可用 ASKADS_TELEMETRY=0 关闭。测试模式的 OAuth 刷新令牌七天后过期。只能访问一个邮箱,并受 Gmail 发送配额限制。

安装

在 SourceWeft 中

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

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

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[A1] Gmail MCP

English | Русский

[npm] [Glama] [CI] [License: MIT]

A1 Gmail MCP lets an AI app work with your Gmail mailbox in plain language. Search and read mail, prepare replies as drafts, send them when you are ready, keep labels tidy and use the trash instead of permanent deletion.

It uses the Gmail API with your Google account. It distinguishes a draft you can still edit from a sent email that cannot be recalled, and makes the limits of the Gmail API explicit instead of implying that every mail task is reversible.

  • 24 tools. Search and read messages and threads, send email directly or through drafts, manage the draft lifecycle, labels and the trash.
  • Connects from the conversation. Say "connect Gmail": the server walks you through the OAuth client, catches Google's redirect on 127.0.0.1 with PKCE and keeps the tokens itself — no config files, no restart.
  • Send deliberately. The draft → review → send path is first-class; sending is marked destructive, and the server never re-sends after an ambiguous failure — an email cannot be unsent.
  • The trash is the safety net. Removing mail goes through the reversible trash (about 30 days); there is deliberately no permanent message delete tool.
  • Bounded reading. Decoded bodies are truncated at an explicit limit and attachments come back as metadata, so a long newsletter cannot silently flood the conversation.
  • Minimal Google scope. It uses gmail.modify only — no permanent deletion and no access to Gmail settings.

Start with a read-only question:

Show my unread emails from the last week and tell me which ones need a reply.

Connect the server · Explore use cases · Open technical documentation


See it work in a minute

You: What is unread in my inbox from this week about the Acme contract?

Assistant: Searches with Gmail query syntax and shows senders, subjects, dates and snippets. Nothing changes.

You: Draft a reply to the latest one: we send the signed copy on Friday.

Assistant: Creates a draft in the same thread and shows it for review. Nothing is sent.

You: Send it.

Assistant: Sends the draft. Sending is a separate, explicitly destructive step, so your AI app can ask for confirmation first.

Contents

Quick start

You need Node.js 20+ and a Google account. Credentials are not required at install time — the server connects from the conversation.

  1. Add the server to your AI app.
  2. Say "connect Gmail": the assistant walks you through creating the OAuth client and approving access without editing config files.
  3. Ask the read-only question above.
Codex

In the app: open Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y mcp-google-gmail@latest and environment variables GOOGLE_GMAIL_CLIENT_ID, GOOGLE_GMAIL_CLIENT_SECRET, GOOGLE_GMAIL_REFRESH_TOKEN, then select Save and Restart.

From the command line:

bash
codex mcp add google-gmail \  -- npx -y mcp-google-gmail@latest
bash
codex mcp list

Codex MCP documentation

Claude Code
bash
claude mcp add \  --transport stdio --scope user google-gmail \  -- npx -y mcp-google-gmail@latest
bash
claude mcp list

Claude Code MCP documentation

Claude Desktop

The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.

This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:

json
{  "mcpServers": {    "google-gmail": {      "command": "npx",      "args": ["-y", "mcp-google-gmail@latest"]    }  }}

In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

Claude Desktop MCP documentation

Cursor

Add this to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:

json
{  "mcpServers": {    "google-gmail": {      "type": "stdio",      "command": "npx",      "args": ["-y", "mcp-google-gmail@latest"]    }  }}

Cursor MCP documentation

VS Code

Run MCP: Open User Configuration and add:

json
{  "servers": {    "google-gmail": {      "type": "stdio",      "command": "npx",      "args": ["-y", "mcp-google-gmail@latest"]    }  }}

Check it with MCP: List Servers.

VS Code MCP documentation

What you can ask it to do

Triage the inbox

  • Show unread messages from the last seven days and group them by sender.
  • Find the conversation with Acme about the contract and summarize it, oldest to newest.
  • Which messages have attachments waiting for me? Show subjects and file names.

Write and send email

  • Draft a reply in this thread saying the signed copy goes out on Friday.
  • Show me the draft, tighten the wording, then send it.
  • Send a short status email to the team, with the manager in CC.

Keep the mailbox organized

  • Create a label Receipts/2026 and apply it to the matching messages.
  • Mark this week's newsletters as read and archive them.
  • Move that thread to the trash — and restore it if I change my mind.

How mail changes

  1. The safe path to sending is a draft: create_draft prepares the email, get_draft shows it for review, send_draft sends it. send_message skips the draft and sends immediately.
  2. A sent email is externally irreversible. After a timeout or a 5xx error the server does not re-send; search in:sent before trying again, because a replayed send would be a double-sent email.
  3. Removing a message or thread means trashing it. manage_trash is reversible for about 30 days; there is deliberately no permanent-delete tool.
  4. Drafts are the exception: update_draft replaces the whole draft (the API has no partial edit) and delete_draft is permanent, because drafts skip the trash.

Every call works on one mailbox — the account that granted the token. Decoded bodies are truncated at a configurable limit with explicit flags, and attachments come back as metadata only; attachment content is fetched through raw_request deliberately.

What can change

OperationWhat happensConfirmation boundary
Search and read messages, threads, drafts, labels, the profileReads mailbox dataNo change
Create or update a draftPrepares or replaces an unsent emailChanges the mailbox
Change read, starred or archived state, apply or strip labelsChanges how mail is organizedChanges the mailbox
Create or rename a labelChanges the label vocabularyChanges the mailbox
Trash or untrash a message or threadMoves mail to or from the trash; reversible for ~30 daysDestructive
Send an email or a draftDelivers mail to real recipients; cannot be unsentDestructive
Delete a draft or a labelRemoves it permanently, skipping the trashDestructive
Raw API requestCan call API methods without a dedicated toolPotentially destructive

The AI client controls confirmation prompts. The server marks reads, writes and destructive tools so the client can distinguish an inspection from a live change.

Getting access

Google Gmail requires OAuth 2.0; an API key is not enough. There are two ways in, and the first one needs no configuration files.

Connect from the chat (recommended)

Say "connect Gmail" and the assistant runs the flow with you:

  1. setup_instructions prints the checklist: create or select a Google Cloud project, enable Gmail API, configure the consent screen and create a Desktop app OAuth client.
  2. Download that client's JSON ("Download JSON") and give the assistant its path — set_client stores it owner-only. The secret never goes through the conversation.
  3. start_login returns a Google consent link. Open it on this machine and approve; the code comes back to a one-shot listener on 127.0.0.1 (PKCE), never through the chat.
  4. finish_login exchanges the code and saves the tokens to ~/.config/mcp-google-gmail/credentials.json (mode 0600) and verifies them with a real Gmail API call — so an API that is still switched off is caught right there.

The tokens are re-read on every call, so the connection works immediately — no restart of the AI app. auth_status shows what is connected, logout revokes and deletes it.

Environment variables (CI, unattended installs)

  1. Create or select a Google Cloud project and enable the Gmail API.

  2. Configure the OAuth consent screen and create a Desktop app OAuth client.

  3. Authorize the Google account whose mailbox you want to connect — every call works on that one mailbox. The OAuth 2.0 Playground can obtain the refresh token when Use your own OAuth credentials is enabled.

  4. Request the scope:

    text
    https://www.googleapis.com/auth/gmail.modify

    It covers search, reading, sending, drafts, labels and the trash — but not permanent deletion and not Gmail settings. Permanent deletion through raw_request additionally requires the full https://mail.google.com/ scope.

Testing-mode OAuth refresh tokens can expire after seven days. Publish the OAuth app, or use an Internal app in a Workspace domain, when you need long-lived access. Treat the client secret and refresh token as passwords.

Configuration

Every variable is optional — with none of them the server connects from the chat.

VariableRequiredDescription
GOOGLE_GMAIL_CLIENT_IDNo*OAuth client ID.
GOOGLE_GMAIL_CLIENT_SECRETNo*OAuth client secret.
GOOGLE_GMAIL_REFRESH_TOKENNo*OAuth refresh token.
GOOGLE_GMAIL_ACCESS_TOKENNo*Short-lived alternative to the OAuth trio (about 1 hour).
GOOGLE_GMAIL_OAUTH_PORTNoFixed loopback port for the in-chat login; useful over SSH port forwarding.
GOOGLE_GMAIL_API_BASENoGmail API base URL override.
GOOGLE_GMAIL_TIMEOUT_MSNoPer-request timeout; default 60000 ms.
GOOGLE_GMAIL_MAX_RETRIESNoTemporary-error retries; default 3.

* Provide either the OAuth trio or an access token.

Data, limits and background work

  • Requests go to Gmail. The local server refreshes Google OAuth tokens and calls the Gmail API. Its anonymous telemetry contains an installation ID, package version, AI client and platform versions, and tool names — never OAuth tokens, mail content, tool arguments or prompts. For each tool call it also sends the outcome and, on failure, an excerpt of the error text with e-mails, addresses, tokens, numbers of 4+ digits and quoted text replaced by #; a value from your request can appear in it if the error text contains it. Set ASKADS_TELEMETRY=0 to opt out.
  • Google meters quota units. Gmail allows roughly 250 quota units per second per user; a send costs 100 units, a typical read 5. Consumer accounts can send about 500 emails a day, Workspace accounts about 2,000. On 429, the server uses backoff; reads also retry after network and 5xx errors, while sends and other writes are never replayed after an uncertain failure.
  • There is no background polling. The server runs only when called. If your AI app supports scheduled tasks, it can check the inbox periodically; raw_request can also reach history.list for incremental sync.

Technical documentation

Support

Found a bug or need a scenario? Create an issue or write in Telegram.


[Две Моны дают пять]

You made it to the end!

来源:README.md,提交 4412265

工具

24

auth_status

Google connection status

Shows whether this server is connected to Google: token presence and source (env variables or a stored in-chat login), expiry, the Google account email, granted vs missing OAuth scopes, where the credentials file lives and where the OAuth client comes from. Makes no network calls and never returns the token itself. Call it first when other tools report the server is not connected.

无需输入参数。

setup_instructions

Setup instructions

Step-by-step checklist for connecting this server to Google: creating a Google Cloud project and a Desktop-app OAuth client, publishing the consent screen (mandatory — Testing-mode refresh tokens die after 7 days), downloading the client JSON and handing its PATH to set_client. Works without any credentials; the checklist shortens to 'enable the API + log in' when an OAuth client is already configured (one client serves the whole mcp-google-* line). Never asks the user to paste secrets into the chat.

无需输入参数。

set_client

Save the OAuth client

Saves the OAuth client credentials from the JSON file downloaded from Google Cloud Console ('Download JSON' on a Desktop-app client). Pass the file PATH — the secret must never be pasted into the chat. The client is stored once in the shared ~/.config/mcp-google-auth/client.json (owner-only) and reused by every mcp-google-* server; tokens stay per-server. After this, call start_login.

输入参数path必填

start_login

Start the Google login

First step of connecting from the chat, without editing config files or restarting the client. Returns authorizeUrl — show it to the user as a clickable link and ask them to open it in the browser ON THIS MACHINE, pick the Google account and approve access. A one-shot listener on 127.0.0.1 catches Google's redirect; the code is exchanged locally and never passes through the chat. Does not open the browser itself. The attempt lives 10 minutes; when the browser shows the success page, call finish_login.

无需输入参数。

finish_login

Finish the Google login

Second step: waits up to 20 s for the browser consent to finish, saves the tokens to an owner-only file and verifies the login with a read-only identity call, returning the account email and the granted scopes. After success every tool works immediately — no client restart. If the user granted only part of the requested permissions, the login is still saved and missingScopes lists what will not work. Logging in under a different Google account replaces the previous login (its refresh token is revoked best-effort) and the response carries previousAccountEmail so the change never goes unnoticed.

无需输入参数。

logout

Disconnect from Google

Revokes the stored token at Google (oauth2.googleapis.com/revoke) and deletes the local credentials file. Tokens supplied via env variables are NOT touched — remove them from the MCP client config manually; envTokenStillSet in the response says whether any are still in effect.

无需输入参数。

list_messages

Search and list messages

Searches the mailbox with Gmail query syntax and returns one summary per message: id, threadId, labelIds, snippet, from, to, subject, date, internalDate. Filter with query (same operators as the Gmail search box: from:, to:, subject:, is:unread, is:starred, has:attachment, label:, newer_than:7d, before:/after:) and/or label_ids (all must match). Spam and trash are excluded unless include_spam_trash=true. Paginate with page_token from nextPageToken; page_size defaults to 25 (max 100 — each summary costs one metadata read, throttled to a few at a time). A message deleted between the search and its metadata read is skipped, so a page can hold slightly fewer summaries than page_size. Set include_metadata=false to get bare ids only (cheapest). resultSizeEstimate is an estimate, not an exact count. Read a full body with get_message; read a whole conversation with get_thread.

输入参数querylabel_idspage_sizepage_tokeninclude_metadatainclude_spam_trash

get_message

Read a message

Fetches one message fully decoded: headers (from, to, cc, subject, date, messageId, inReplyTo, references — RFC 2047 words decoded), the plain-text body (base64/charset decoded), the HTML body when there is no text part or include_html=true, and attachment METADATA (filename, mimeType, sizeBytes, attachmentId — never the content; download bytes via raw_request users/me/messages/<id>/attachments/<attachmentId> if truly needed). Bodies are truncated at max_body_chars (default 50000) with textTruncated/htmlTruncated flags. metadata_only=true skips bodies entirely. To reply later, keep headers.messageId (for in_reply_to) and threadId.

输入参数message_id必填include_htmlmetadata_onlymax_body_chars

send_message

Send an email

Sends an email from the authenticated mailbox, immediately and irreversibly. Requires at least one recipient across to/cc/bcc (a bcc-only send is fine — to may be omitted) and at least a subject or a body; body_text and body_html together become multipart/alternative. TO REPLY IN A THREAD: call get_message on the message being answered first, then pass its threadId as thread_id, its headers.messageId as in_reply_to, and the same subject prefixed with "Re: " — Gmail threads the reply only when all three line up. Returns the sent message's id, threadId and labelIds. NEVER retried after a timeout or 5xx (a duplicate email cannot be unsent): if the outcome is unclear, search list_messages with in:sent before considering a re-send. Everyday accounts can send ~500 emails/day (Workspace ~2000); exceeding it disables sending for hours.

输入参数cctobccsubjectbody_htmlbody_textthread_idreferencesin_reply_to

modify_message

Change message labels / state

Changes a message's state via Gmail labels: read=true/false marks read/unread, starred=true/false stars/unstars, archived=true removes it from the inbox (archived=false moves it back), and add_label_ids/remove_label_ids apply or strip any labels from list_labels (e.g. a user label, or IMPORTANT). At least one change is required; applying the same change twice is harmless. This never deletes anything — use manage_trash for the trash. Returns the message's new id/labelIds.

输入参数readstarredarchivedmessage_id必填add_label_idsremove_label_ids

manage_trash

Trash or restore mail

Moves a message or a whole thread to the Gmail trash, or restores it. action=trash is REVERSIBLE: Gmail keeps trashed mail for about 30 days, then deletes it permanently; action=untrash restores it before that happens. target=message (default) uses a message id, target=thread trashes/restores every message in the thread. This server intentionally has no permanent-delete tool — the trash is the safety net. Note: untrash does not re-add INBOX; follow up with modify_message archived=false if it should reappear in the inbox.

输入参数id必填action必填target

list_threads

Search and list threads

Searches conversations (threads) with the same Gmail query syntax as list_messages and returns id, snippet (of the latest message) and historyId per thread. Use this instead of list_messages when the unit of work is a conversation — triaging an inbox, finding a discussion to reply into. Filter with query and/or label_ids; paginate with page_token from nextPageToken (page_size max 500). Read the full conversation with get_thread.

输入参数querylabel_idspage_sizepage_tokeninclude_spam_trash

get_thread

Read a whole conversation

Fetches a conversation with every message decoded like get_message: headers, text bodies (HTML only when a message has no text part or include_html=true), attachment metadata and truncation flags. Messages come oldest-first. To reply to the conversation, take the LAST message's threadId, headers.messageId and subject and pass them to send_message (thread_id, in_reply_to, subject with "Re: "). Long threads can be large — lower max_body_chars (it applies per message) when only the gist is needed.

输入参数thread_id必填include_htmlmax_body_chars

modify_thread

Change thread labels / state

Applies the same normalized state changes as modify_message — read/unread, starred, archived, add_label_ids/remove_label_ids — to EVERY message in a conversation at once. Use it to mark a whole conversation read or archive it in one call instead of looping over messages. At least one change is required; repeating the same change is harmless. Returns the thread's new id and message label state.

输入参数readstarredarchivedthread_id必填add_label_idsremove_label_ids

create_draft

Create a draft

Creates a draft email in the mailbox without sending anything. All fields are optional — an empty draft is legal — but a useful one carries to[], subject and a body. For a reply draft set thread_id, in_reply_to (headers.messageId of the message being answered, via get_message) and the original subject with "Re: ". Returns the draft id (needed by update_draft/send_draft/delete_draft) and the underlying message id/threadId. Drafting first and sending with send_draft after a human look is the safe path for consequential mail — prefer it over send_message when in doubt.

输入参数cctobccsubjectbody_htmlbody_textthread_idreferencesin_reply_to

list_drafts

List drafts

Lists the mailbox's drafts: draft id plus the underlying message's id and threadId (no subjects — read one with get_draft). query filters with Gmail query syntax (e.g. subject:invoice); paginate with page_token from nextPageToken.

输入参数querypage_sizepage_token

get_draft

Read a draft

Fetches one draft with its message decoded like get_message: headers (to, cc, subject, ...), text body, HTML only on request, attachment metadata. Use it to show the user what send_draft would send, or to read the current content before update_draft (updates REPLACE the whole draft).

输入参数draft_id必填include_htmlmax_body_chars

update_draft

Update a draft

REPLACES a draft's entire message — the Gmail API has no partial draft edit, so omitted fields are dropped, not kept. Read the current content with get_draft first, then pass the complete new state (recipients, subject, body, and thread_id/in_reply_to for reply drafts). The draft id stays the same; the underlying message id changes. Returns the updated draft.

输入参数cctobccsubjectdraft_id必填body_htmlbody_textthread_idreferencesin_reply_to

send_draft

Send a draft

Sends an existing draft exactly as it is stored, immediately and irreversibly; the draft disappears from the drafts list and becomes a sent message (returned id/threadId). Verify the content with get_draft before calling this. NEVER retried after a timeout or 5xx (a duplicate email cannot be unsent): if the outcome is unclear, check list_drafts (the draft is gone if it was sent) or list_messages in:sent before considering anything else. Daily sending limits apply (~500/day consumer, ~2000/day Workspace).

输入参数draft_id必填

delete_draft

Delete a draft

PERMANENTLY deletes a draft — drafts skip the trash, so there is no undo and no manage_trash recovery. Confirm with get_draft before deleting anything the user might still want. Returns empty on success.

输入参数draft_id必填

list_labels

List labels

Without label_id: lists every label in the mailbox — system labels (INBOX, SENT, DRAFT, SPAM, TRASH, UNREAD, STARRED, IMPORTANT, CATEGORY_*) and user labels with their ids — the vocabulary that list_messages label_ids and modify_message add/remove_label_ids speak. With label_id: fetches that one label including its counts (messagesTotal, messagesUnread, threadsTotal, threadsUnread), which the plain list does not carry.

输入参数label_id

manage_labels

Create, rename or delete a label

Manages user labels. action=create needs name (nest with "/", e.g. "Clients/Acme" — the parent must already exist). action=update needs label_id plus at least one of name, label_list_visibility (show | show_if_unread | hide — the label in the sidebar) or message_list_visibility (show | hide — its messages in the list); only the provided fields change. action=delete needs label_id and removes the label from EVERY message it was applied to — the messages survive, the label and its message-associations do not; this cannot be undone. System labels (INBOX, STARRED, ...) cannot be created, renamed or deleted. To apply/remove labels on mail, use modify_message or modify_thread, not this tool.

输入参数nameaction必填label_idlabel_list_visibilitymessage_list_visibility

get_profile

Get the mailbox profile

Returns the authenticated mailbox's profile: emailAddress (the user's own address — useful for send-to-self checks and for recognizing the user's messages in threads), messagesTotal, threadsTotal and historyId. The cheapest way to verify that the OAuth credentials work.

无需输入参数。

raw_request

Raw Gmail API call

Escape hatch to call any Gmail API v1 path directly, for requests the typed tools don't cover — e.g. downloading attachment content ("gmail/v1/users/me/messages/<messageId>/attachments/<attachmentId>", returns base64url data), history.list for incremental sync ("gmail/v1/users/me/history?startHistoryId=..."), batchModify, or settings endpoints (filters, forwarding, vacation). The path may carry a query string. The Bearer token is added automatically; the method defaults to GET. CAUTION: this bypasses the typed tools' guard rails — users/me/messages/<id> DELETE is a PERMANENT delete that skips the trash (needs the full https://mail.google.com/ scope); prefer manage_trash.

输入参数bodypath必填method

版本历史

6
  1. v1.1.2最新Nov 5, 2026
  2. v1.1.1Oct 31, 2026
  3. v1.1.0Oct 31, 2026
  4. v1.0.0Sep 23, 2026
  5. v0.2.0Sep 21, 2026
  6. v0.1.0Sep 16, 2026

评分

已满足适用检查项的 90%

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

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

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

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