rustsdcmcp
Juniper Security Director Cloud MCP server: scoped, audited change control. Rust.
作者提供的说明(英文原文)
MCP server for Google Workspace security auditing — login audit, external sharing, daily brief
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"gwsadm": {
"command": "uvx",
"args": [
"gwsadm-mcp"
]
}
}
}在终端中运行这条命令
claude mcp add gwsadm -- uvx gwsadm-mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"gwsadm": {
"command": "uvx",
"args": [
"gwsadm-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"gwsadm": {
"type": "stdio",
"command": "uvx",
"args": [
"gwsadm-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月10日
注册名称已通过 GitHub 账户 shigechika 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.23.1)于15天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
同一分类中有:rustsdcmcp, Domain Security, prodlint
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Juniper Security Director Cloud MCP server: scoped, audited change control. Rust.
Audit a domain's email and web security: SPF, DKIM, DMARC, MTA-STS, DNSSEC, TLS, WHOIS. No API keys.
Production readiness for vibe-coded apps. 52 checks for security, reliability, and performance.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
English | 日本語
Google Workspace security-audit MCP (Model Context Protocol) server — read-only visibility into account locks, suspicious logins, and external file sharing, built on the Admin SDK Reports API (audit activities).
Named after the admin-console viewpoint (gwsadm = Google Workspace admin), sibling of boxadm-mcp. This is not a general-purpose Workspace MCP: it surfaces risk and changes nothing, with one opt-in exception — sign_out_user, which exists only when the server is started with GWSADM_ENABLE_SIGN_OUT=1.
| Tool | Description |
|---|---|
health_check | Server version, config path, and per-domain auth probe — call at session start or after a timeout |
login_audit | Reports API login — accounts auto-disabled by Google (account_disabled_*: leaked password, hijacked, spamming), suspicious logins, failure top-N |
gmail_usage_report | Reports API customerUsageReports — daily Gmail send/receive counts per domain, one date at a time, ending yesterday (the API's own UTC-8:00/PST date anchor). Requires the separate admin.reports.usage.readonly DWD scope (see Auth model below) — a DIFFERENT grant from admin.reports.audit.readonly even though both are Reports API |
suspended_accounts | Directory API — current snapshot of suspended accounts (isSuspended=true); cross-reference against a downstream IdP (e.g. KeyCloak) to find suspended-but-still-enabled accounts |
get_user | Directory API users().get — one named account's current state: suspended (with reason and time), archived, last_login, 2SV enrolled/enforced, org unit, creation time, pending password change. The "why can't this person sign in" lookup: one request, no pagination, for an address you already know — unlike suspended_accounts, which lists only accounts that ARE suspended, so it can never confirm that a given address is *not* suspended (and once that list exceeds its page cap, absence stops being evidence either way). Needs no scope beyond the one suspended_accounts already uses |
user_oauth_tokens | Directory API tokens().list — third-party OAuth app grants for one user; a compromise vector login_audit is blind to, since a previously-granted token needs no fresh login. Domain resolved from the username's suffix, with an optional domain override for alias/secondary-domain addresses |
sign_out_user | State-changing, opt-in. Directory API users().signOut — signs one account out of every web and device session and resets its sign-in cookies, after confirming the account exists with users().get. Registered only when the server starts with GWSADM_ENABLE_SIGN_OUT=1; put an approval step in front of it. Does not revoke OAuth grants or app passwords, remove an enrolled second factor or change the password (listed in its not_covered). Needs two grants: admin.directory.user.readonly for the account check (as get_user) and admin.directory.user.security for the sign-out itself (as user_oauth_tokens); the impersonated admin must also be allowed to manage user security. Answers signed_out true (Google confirmed), false (nothing changed) or null (outcome unknown: sent, no answer in time) with the same keys every time, and ends within GWSADM_SIGN_OUT_DEADLINE_SECONDS (default 45). The address's own domain must be configured; domain, if given, must match it. |
user_activity | Reports API activities().list with userKey= — everything one account did in a window, merged across applications (login, token, user_accounts, drive, groups, calendar, chat, meet, saml by default) newest first. flags surfaces the events that change the account's security posture regardless of volume — 2SV enrolled/disabled, recovery email/phone changed, password changed, outbound forwarding, Google's risky_sensitive_action_* / suspicious_login verdicts, every OAuth authorize with client and scopes — because a second factor the attacker enrolled survives a password reset; ips lists the distinct source addresses with first/last seen. Google's own account_disabled_* / suspicious_login verdicts are not served under the account's userKey (their actor is Google), so they are fetched the way login_audit does and reported under the synthetic application login_verdicts. The post-compromise question login_audit cannot answer: it sees only the events Google itself raised, domain-wide |
ip_activity | Reports API activities().list with actorIpAddress= — every account one source address acted as, per domain and application, with the same flags. The follow-through after user_activity names an attacker's address: did the same source reach other accounts? A spray shows up as login_failure counts before it ever succeeds |
compromise_sweep | The Google-side follow-through after one account is confirmed compromised, in one call: activity (user_activity, flags first), state / grants (get_user; OAuth grants with mail / Drive / contacts / admin scopes called out as risky), ips (ip_activity across every domain for the attacker's addresses — given, or taken from the account's own flags — with the account itself excluded), and gmail: the settings an attacker leaves behind to keep reading mail (auto-forwarding, forwarding addresses, filters that forward / delete / archive, delegates, send-as and reply-to) plus what the mailbox sent in the window as counts and recipient domains — never a subject or body. gmail.kind says whether it could be read at all: ok / partial (one settings section or the sent summary failed; the rest stands) / api_disabled (the Gmail API is off in the service account's own Cloud project) / no_grant / error — a failure is reported, never read as "nothing found". highlights lists the facts to act on, checklist what remains to do by hand. Shares gmail_message_trace's gmail.readonly DWD scope (every settings read, delegates.list included, is served by it — verified live) |
drive_external_sharing | Reports API drive — ACL grants to external addresses or domains (revocations reported separately) and visibility transitions into link/public exposure |
drive_doc_activity | Reports API drive with a server-side doc_id filter — one document's owner, ACL changes, and lifecycle events. Triage companion to drive_external_sharing: the owner (an individual vs. a shared drive's name) disambiguates the shared-drive false-positive class, where files created inside a shared drive propagate member ACLs and read as bulk external sharing |
shared_drive_membership_changes | Reports API drive (shared_drive_membership_change) — who added/removed/re-roled shared-drive members and when, with external classification of the affected member and a client-side drive-name filter |
admin_actions | Reports API admin — what administrators (people, or a sync or API client acting as one) did in the Admin console: to one user or group (server-side USER_EMAIL / GROUP_EMAIL filters on the target's domain) or tenant-wide. Answers "who suspended this account / reset its password / took it out of a group?", which user_activity cannot: an admin event's actor is the administrator, not the account acted upon |
workspace_status | Google Workspace Status Dashboard (public feed, no credential) — open incidents and those that ended within the window, optionally for one product (Gmail, Drive, ...). Answers "is it Google?" before a tenant-side investigation |
gmail_message_trace | Gmail API — did a known Message-ID reach specific mailboxes, and where (inbox/spam/trash/archived)? For each recipient it impersonates that user via DWD and searches their own mailbox. Requires the separate gmail.readonly DWD scope (see Auth model below); a domain missing that grant reports a per-recipient error, never a false "not found" |
dmarc_rua_summary | Gmail API — DMARC aggregate (RUA) report pass/fail summary and top reject-candidate source IPs, per domain. Impersonates the domain's configured dmarc_rua_mailbox (a real user; default postmaster@ ), searches it for mail addressed to dmarc_rua_recipient (the published rua= address, e.g. postmaster+rua@; default: the mailbox) and reads the compressed report attachments those messages carry. Shares gmail_message_trace's gmail.readonly DWD scope, but unlike that tool this one DOES read attachment content (the report XML), not just metadata — see Auth model below |
group_delivery_policy | Groups Settings API — a Google Group's own posting/delivery policy (who_can_post, allow_external_members, moderation levels). A group's access control sits in front of Gmail delivery: a domain-only posting policy silently drops an external sender's mail before it generates any Gmail delivery event at all, indistinguishable from a delivery failure without reading the policy directly. Requires the separate apps.groups.settings DWD scope (see Auth model below) |
list_group_members | Directory API — a Google Group's basic metadata and member roster, resolved directly rather than inferred from who happened to receive one particular message. Requires the separate admin.directory.group.readonly and admin.directory.group.member.readonly DWD scopes (see Auth model below) |
daily_brief | One-call summary across all configured domains, including account-protection changes (2-Step Verification, passkeys, Advanced Protection, password, recovery address/phone, mail forwarding out of the domain) flagged when they come from outside your home countries (GWSADM_IP2ASN, GWSADM_HOME_COUNTRIES), from an origin that cannot be placed, or follow a suspicious login |
daily_brief_start / daily_brief_result | Same as daily_brief, run in the background: start returns a job_id immediately, then poll result(job_id) until done. Use on large tenants where the synchronous call risks the client's ~60s tool-call timeout |
Planned: dlp_events (Reports rules; requires a Workspace edition with DLP), token_events.
Service account with domain-wide delegation (DWD) impersonating an audit-capable admin. Fully non-interactive — no browser, no token refresh rotation — so the server runs unattended (cron, MCP gateway, CI).
Grant all of the following DWD scopes on the same service-account client ID up front, in one setup pass. Adding them one at a time as each tool gets built is how a scope goes missing until the one tool that needed it starts degrading — one place, one pass, avoids the trap:
| Scope | Needed by | Missing it |
|---|---|---|
https://www.googleapis.com/auth/admin.reports.audit.readonly | login_audit, user_activity, ip_activity, admin_actions, drive_external_sharing, drive_doc_activity, shared_drive_membership_changes, daily_brief* | those tools degrade to a per-domain error |
https://www.googleapis.com/auth/admin.directory.user.readonly | suspended_accounts, get_user, sign_out_user (opt-in; its account check) | those tools degrade to an error (per-domain for suspended_accounts); everything else keeps working |
https://www.googleapis.com/auth/admin.directory.user.security | user_oauth_tokens, sign_out_user (opt-in) | those tools degrade to a per-domain error; everything else keeps working |
health_check needs no scope at all to respond: it is the tool to call when a grant might be missing — it probes each domain and reports the failing auth in a structured per-domain result instead of failing itself.
gmail_usage_report needs its own separate scope too, despite living under the same Admin SDK Reports API as the base pass above — the "Usage report" family (customerUsageReports) and the "Audit" activ
只显示了开头部分;其余内容请在仓库中阅读