google-chat — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited google-chat (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Lightweight Google Chat integration with standalone OAuth authentication. No MCP server required.
⚠️ Requires Google Workspace account. Personal Gmail accounts are not supported.
Everything is sent as the authenticated user, so treat write commands as outward-facing: confirm the exact text with the user before posting to a space, and never send to a channel the user did not name.
pip install -r requirements.txt
python scripts/auth.py login # opens browser
python scripts/auth.py status # verify
python scripts/auth.py logoutAll operations via scripts/chat.py. Auto-authenticates on first use if not logged in.
python scripts/chat.py get-messages spaces/AAAA123 --limit 10
python scripts/chat.py get-messages spaces/AAAA123 --limit 10 --raw # full JSON
python scripts/chat.py get-message spaces/AAAA123/messages/XYZ
python scripts/chat.py list-threads spaces/AAAA123
python scripts/chat.py list-spaces
python scripts/chat.py find-space "Project Alpha" # ignores punctuation/spacing
python scripts/chat.py list-members spaces/AAAA123Read output is compact by default — one block per message with its timestamp, sender, text and resource name. That is roughly 14x smaller than the raw API payload, which matters when an agent is paying for every token it reads. Use --raw when you need the full JSON.
python scripts/chat.py send-message spaces/AAAA123 "Hello team!"
python scripts/chat.py send-dm [email protected] "Hey, quick question..."
python scripts/chat.py reply-in-thread spaces/AAAA123 spaces/AAAA123/threads/T "Following up."
python scripts/chat.py send-media spaces/AAAA123 "Latest mocks" --file a.png --file b.png
python scripts/chat.py edit-message spaces/AAAA123/messages/XYZ "Corrected text."
python scripts/chat.py delete-message spaces/AAAA123/messages/XYZ
python scripts/chat.py delete-message spaces/AAAA123/messages/XYZ --force # has thread replies
python scripts/chat.py add-reaction spaces/AAAA123/messages/XYZ 👍
python scripts/chat.py setup-space "New Project" [email protected] [email protected]
python scripts/chat.py find-dm [email protected]Add --dry-run to any write command to print the request instead of sending it. Use it when wiring up or testing a flow so nothing lands in a real channel. (For send-dm it reports the resolved recipient rather than the DM space, since resolving that needs a live call.)
send-message, send-dm and send-media return the created message's name (spaces/X/messages/Y) — that is what edit-message, delete-message and add-reaction take. You can only edit or delete messages you sent. To fix an older message, find its name with get-messages first.
send-media takes a repeatable --file. Google Chat accepts several attachments on one message only when every attachment is media (image or video); a mixed batch is split automatically into one message per file, with the caption on the first. --attachment is still accepted as an alias for a single --file.
Typing full email addresses and spaces/AAAA... IDs is tedious, and having an agent call list-spaces to find a channel it uses daily is slow. Copy directory.example.json to directory.json and map short names:
{
"users": { "alex": "[email protected]" },
"spaces": { "team": { "id": "spaces/AAAAxxxxxxx", "name": "My Team" } }
}Then send-message team "Deploying now" and send-dm alex "..." both resolve locally, with no API call. Full emails and spaces/... names keep working everywhere.
directory.json is personal and gitignored. It is entirely optional — without it every command still works, and an unresolvable alias fails immediately with the list of valid ones rather than silently falling back to a scan.
Chat supports *bold*, _italic_, ~strike~, ` code , triple-backtick code blocks, and <url|label> links. It does **not** support Markdown headings, tables, or []( )` links — they render literally.
Tokens stored securely using the system keyring:
Service name: google-chat-skill-oauth. Expired tokens refresh automatically.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.