Google Messages
Send and receive SMS/RCS via Google Messages web interface (messages.google.com). Use when asked to "send a text", "check texts", "SMS", "text message", "Google Messages", or forward incoming texts to other channels.
Rank
62
Safety
84
Downloads
3.4k
Updated
Oct 9, 2026
Version
0.1.0
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 3.4K downloads reported by the source. Last updated 10/9/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 9, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 9, 2026
- Adoption signal
- 3.4K downloadsadoption · observed Oct 9, 2026
- Latest release
- 0.1.0release · observed Feb 1, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s174s08qgy6zjyxgxgabbt9mrs87h4q8:google-messages- Install using `clawhub skill install s174s08qgy6zjyxgxgabbt9mrs87h4q8:google-messages` in an isolated environment before connecting it to live workloads.
- No published capability contract is available yet, so validate auth and request/response behavior manually.
- Review the upstream CLAWHUB listing at https://clawhub.ai/kesslerio/google-messages before using production credentials.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-kesslerio-google-messages/snapshot"
Documentation
CLAWHUB
19,706 characters of source documentation, loaded on request.
Extracted files
5 files captured from the source.
SKILL.md
---
name: google-messages
description: Send and receive SMS/RCS via Google Messages web interface (messages.google.com). Use when asked to "send a text", "check texts", "SMS", "text message", "Google Messages", or forward incoming texts to other channels.
metadata: {"openclaw": {"emoji": "💬", "requires": {"tools": ["browser"], "bins": ["node"], "env": ["SMS_NOTIFICATION_TARGET", "SMS_NOTIFICATION_CHANNEL"]}}}
---
# Google Messages Browser Skill
Automate SMS/RCS messaging via messages.google.com using the `browser` tool.
## Overview
Google Messages for Web allows you to send/receive texts from your Android phone via browser. This skill automates that interface.
**Requirements:**
- Android phone with Google Messages app
- Phone and computer on same network (for initial QR pairing)
- Browser profile with persistent session (use `openclaw` or your preferred profile)
**Note:** Replace `profile=openclaw` in examples with your preferred browser profile if different.
---
## Quick Reference
| Action | Command |
|--------|---------|
| Open pairing page | `browser action=open profile=openclaw targetUrl="https://messages.google.com/web/authentication"` |
| Check session | `browser action=snapshot profile=openclaw` — look for conversation list vs QR code |
| Take screenshot | `browser action=screenshot profile=openclaw` |
---
## Initial Setup (QR Pairing)
First-time setup requires scanning a QR code:
1. **Open Google Messages Web**
```
browser action=open profile=openclaw targetUrl="https://messages.google.com/web/authentication"
```
2. **Screenshot the QR code** and share with user
```
browser action=screenshot profile=openclaw
```
3. **User scans with phone:**
- Open Google Messages app on Android
- Tap ⋮ menu → "Device pairing" → "QR code scanner"
- Scan the QR code
4. **Verify connection** — snapshot should show conversation list, not QR code
**Important:** Enable "Remember this computer" to persist the session.
---
## Sending Messages
1. **Navigate to conversations**
```
browser action=navigate profile=openclaw targetUrl="https://messages.google.com/web/conversations"
```
2. **Take snapshot and find conversation**
```
browser action=snapshot profile=openclaw
```
Look for the contact in the conversation list, note the `ref`.
3. **Click conversation**
```
browser action=act profile=openclaw request={"kind": "click", "ref": "<ref>"}
```
4. **Type message** (find textarea ref from snapshot)
```
browser action=act profile=openclaw request={"kind": "type", "ref": "<input_ref>", "text": "Your message"}
```
5. **Click send** (find send button ref)
```
browser action=act profile=openclaw request={"kind": "click", "ref": "<send_ref>"}
```
---
## Receiving Messages (Real-time Notifications)
This skill includes a webhook system for real-time incoming SMS notifications.
### Components
1. **sms-webhook-server.js** — receives notifications, forwards to OpenClaw chanREADME.md
# Google Messages Skill for OpenClaw Send and receive SMS/RCS messages via Google Messages web interface using browser automation. ## Features - 📤 **Send SMS** — Compose and send text messages - 📥 **Receive notifications** — Real-time alerts when new messages arrive - 🔍 **Read conversations** — Query recent messages and conversation history - 🔗 **OpenClaw integration** — Forward incoming SMS to Telegram, WhatsApp, or other channels ## Requirements - [OpenClaw](https://github.com/openclaw/openclaw) with browser automation - Android phone with Google Messages app - Node.js 18+ ## Quick Start ### 1. Install the skill ```bash # Clone to your skills directory git clone https://github.com/kesslerio/google-messages-openclaw-skill.git ~/.openclaw/skills/google-messages ``` ### 2. Pair with your phone Ask your OpenClaw agent: ``` "Open Google Messages and show me the QR code" ``` Or manually: 1. Go to https://messages.google.com/web 2. Open Google Messages on your phone 3. Tap ⋮ → Device pairing → QR code scanner 4. Scan the code ### 3. Enable notifications (optional) Start the webhook server to receive incoming message alerts: ```bash # Set your notification target export SMS_NOTIFICATION_TARGET="telegram:YOUR_CHAT_ID" export SMS_NOTIFICATION_CHANNEL="telegram" # Start the server node ~/.openclaw/skills/google-messages/sms-webhook-server.js ``` Then inject the observer into the browser tab. See `references/observer-injection.md` for details. ## Usage ### Sending messages Ask your OpenClaw agent: - "Text John that I'm running late" - "Send an SMS to 555-1234 saying hello" - "Message Mom on Google Messages" ### Checking messages - "Check my texts" - "Any new SMS messages?" - "What did John text me?" ## Configuration ### Environment Variables | Variable | Description | Default | |----------|-------------|---------| | `SMS_WEBHOOK_PORT` | Port for webhook server | `19888` | | `SMS_NOTIFICATION_TARGET` | OpenClaw target (e.g., `telegram:123456`) | _(none)_ | | `SMS_NOTIFICATION_CHANNEL` | Channel type | `telegram` | ### Systemd Service For persistent notifications, install as a user service: ```bash cp systemd/google-messages-webhook.service ~/.config/systemd/user/ # Edit service file: uncomment and set Environment= lines systemctl --user daemon-reload systemctl --user enable --now google-messages-webhook ``` ## How It Works 1. **Browser automation** — Uses OpenClaw's browser tool to control messages.google.com 2. **MutationObserver** — Injects a script that watches the DOM for new messages 3. **Webhook** — When new messages arrive, POSTs to a local server 4. **Forwarding** — Webhook server uses `openclaw message send` to forward to your preferred channel ## Files ``` google-messages-skill/ ├── SKILL.md # OpenClaw skill definition ├── sms-webhook-server.js # Webhook server for notifications ├── sms-observer.js # Browser injection script (full version) ├── references/ │ ├── snippets.md
_meta.json
{
"ownerId": "kn7fmw4ybcy50qzp1d2dvb1h517znaes",
"slug": "google-messages",
"version": "0.1.0",
"publishedAt": 1769928644580
}references/observer-injection.md
# Injecting the SMS Observer
The SMS observer watches for incoming messages and forwards them to the webhook server.
## Prerequisites
1. Webhook server running: `node <skill>/sms-webhook-server.js`
2. Google Messages page loaded and paired
3. Browser tab open at messages.google.com
## Injection Command
Use the browser tool to inject the observer script:
```
browser action=act profile=openclaw request={"kind": "evaluate", "fn": "<minified_observer>"}
```
## Minified Observer Script
Copy this entire script for the `fn` parameter:
```javascript
(function(){var WEBHOOK_URL='http://127.0.0.1:19888/sms-inbound',CHECK_INTERVAL=2000,lastSeenMessages=new Map,initialized=false,observerAttached=false;function logAlways(){console.log.apply(console,['[SMS Observer]'].concat(Array.prototype.slice.call(arguments)))}function getConversations(){var convos=[],items=document.querySelectorAll('mws-conversation-list-item,[data-e2e-conversation],[role="option"]');items.forEach(function(item,i){var nameEl=item.querySelector('h2,[data-e2e-conversation-name],.name'),previewEl=item.querySelector('[data-e2e-conversation-snippet],.snippet'),timeEl=item.querySelector('[data-e2e-conversation-timestamp],.timestamp,time'),preview='';if(previewEl)preview=previewEl.innerText||'';if(!preview){var divs=item.querySelectorAll('div');for(var j=0;j<divs.length;j++){var t=divs[j].innerText;if(t&&t.trim().length>5&&t.trim().length<200){preview=t.trim();break}}}convos.push({contact:nameEl?nameEl.innerText.trim():'Unknown',preview:preview.substring(0,150),time:timeEl?timeEl.innerText.trim():''})});return convos}function checkForNewMessages(){var conversations=getConversations();if(!initialized){conversations.forEach(function(c){lastSeenMessages.set(c.contact,{preview:c.preview,time:c.time})});initialized=true;logAlways('Initialized with',conversations.length,'conversations');return}conversations.forEach(function(c){var lastSeen=lastSeenMessages.get(c.contact);var isNew=!lastSeen||(lastSeen.preview!==c.preview&&c.preview);var isIncoming=c.preview&&!c.preview.startsWith('You:');if(isNew&&isIncoming){logAlways('New message:',c.contact,'-',c.preview.substring(0,50));fetch(WEBHOOK_URL,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({contact:c.contact,preview:c.preview,time:c.time,timestamp:Date.now()})}).then(function(r){if(!r.ok)logAlways('Webhook error',r.status)}).catch(function(e){logAlways('Webhook error:',e.message)})}lastSeenMessages.set(c.contact,{preview:c.preview,time:c.time})})}function setupObserver(){if(observerAttached)return;var target=document.querySelector('mws-conversations-list,[data-e2e-conversation-list],nav,main');if(!target){setTimeout(setupObserver,2000);return}var observer=new MutationObserver(function(){clearTimeout(window._smsTO);window._smsTO=setTimeout(checkForNewMessages,500)});observer.observe(target,{childList:true,subtree:true,characterData:true});observerAttached=true;logAlways('Observer attached to',target.tagName);checkreferences/snippets.md
# JavaScript Snippets for Google Messages
Use with `browser action=act request={"kind": "evaluate", "fn": "..."}`.
## Check Session Status
```javascript
(() => {
if (document.querySelector('mw-qr-code, [data-e2e-qr-code]')) return 'QR_REQUIRED';
if (document.querySelector('mws-conversations-list, [data-e2e-conversation-list]')) return 'SESSION_ACTIVE';
if (document.querySelector('mat-spinner, .loading')) return 'LOADING';
return 'UNKNOWN';
})()
```
## Get Recent Conversations
```javascript
(() => {
const convos = document.querySelectorAll('mws-conversation-list-item');
const results = [];
for (let i = 0; i < Math.min(convos.length, 10); i++) {
const name = convos[i].querySelector('h2')?.innerText || 'Unknown';
const preview = convos[i].querySelector('[data-e2e-conversation-snippet]')?.innerText || '';
const time = convos[i].querySelector('[data-e2e-conversation-timestamp]')?.innerText || '';
results.push({
name: name.trim(),
preview: preview.trim().substring(0, 50),
time: time.trim()
});
}
return JSON.stringify(results, null, 2);
})()
```
## Get Messages in Current Conversation
```javascript
(() => {
const messages = document.querySelectorAll('mws-message-wrapper');
const results = [];
const start = Math.max(0, messages.length - 10);
for (let i = start; i < messages.length; i++) {
const msg = messages[i];
const text = msg.querySelector('[data-e2e-message-text]')?.innerText || '';
const time = msg.querySelector('[data-e2e-message-timestamp]')?.innerText || '';
const isOutgoing = msg.classList.contains('outgoing');
if (text) {
results.push({
text: text.trim(),
time: time.trim(),
direction: isOutgoing ? 'sent' : 'received'
});
}
}
return JSON.stringify(results, null, 2);
})()
```
## Open Conversation by Contact Name
```javascript
(async () => {
const CONTACT = 'John Doe'; // Change this
const sleep = ms => new Promise(r => setTimeout(r, ms));
const convos = document.querySelectorAll('mws-conversation-list-item');
for (const convo of convos) {
const name = convo.querySelector('h2')?.innerText || '';
if (name.toLowerCase().includes(CONTACT.toLowerCase())) {
convo.click();
await sleep(500);
return 'OPENED: ' + name;
}
}
return 'NOT_FOUND: ' + CONTACT;
})()
```AionUi
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
activepieces
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/kesslerio/skills/google-messages",
"sourceUrl": "https://clawhub.ai/kesslerio/skills/google-messages",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-09T08:10:08.809Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-kesslerio-google-messages/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-kesslerio-google-messages/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-09T08:10:08.809Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "3.4K downloads",
"href": "https://clawhub.ai/kesslerio/google-messages",
"sourceUrl": "https://clawhub.ai/kesslerio/google-messages",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-09T08:10:08.809Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "0.1.0",
"href": "https://clawhub.ai/kesslerio/google-messages",
"sourceUrl": "https://clawhub.ai/kesslerio/google-messages",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-01T06:50:44.580Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-kesslerio-google-messages/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-kesslerio-google-messages/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 0.1.0",
"description": "Initial release of google-messages-openclaw-skill. - Enables sending and receiving SMS/RCS via Google Messages web interface. - Automates message workflow: pairing, sending, and receiving texts using the browser tool. - Provides real-time incoming SMS notifications via webhook forwarding. - Includes setup instructions for QR pairing, persistent session, and systemd service. - Details command references, selectors, troubleshooting, and security practices.",
"href": "https://clawhub.ai/kesslerio/google-messages",
"sourceUrl": "https://clawhub.ai/kesslerio/google-messages",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-01T06:50:44.580Z",
"isPublic": true
}
]
}Record generated Oct 9, 2026.
