arxiv
Search and retrieve academic papers from arXiv using their free REST API. No API key needed.
Automate Google Workspace — Gmail, Drive, Sheets, Docs, Calendar via Google API Python client or gcloud CLI.
$ npx -y skills add alexai-mcp/hermes-ccc --skill google-workspace --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/google-workspaceContext preview
The summary Claude sees to decide when to auto-load this skill.
Automate Google Workspace — Gmail, Drive, Sheets, Docs, Calendar via Google API Python client or gcloud CLI.
name: google-workspace
description: Automate Google Workspace — Gmail, Drive, Sheets, Docs, Calendar via Google API Python client or gcloud CLI.
version: 1.0.0
author: hermes-CCC (ported from Hermes Agent by NousResearch)
license: MIT
metadata:
hermes:
tags: [Google, Gmail, Drive, Sheets, Docs, Calendar, Workspace, Automation]
related_skills: []Automate Gmail, Drive, Sheets, Docs, and Calendar via the Google API Python client.
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
Create credentials at console.cloud.google.com → APIs & Services → Credentials → OAuth 2.0.
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
import os, pickle
SCOPES = [
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/calendar",
]
def get_credentials():
creds = None
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as f:
creds = pickle.load(f)
if not creds or not creds.valid:
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
creds = flow.run_local_server(port=0)
with open("token.pickle", "wb") as f:
pickle.dump(creds, f)
return creds---
service = build("gmail", "v1", credentials=get_credentials())
# List messages
msgs = service.users().messages().list(userId="me", q="is:unread", maxResults=10).execute()
# Read message
def read_email(msg_id):
msg = service.users().messages().get(userId="me", id=msg_id, format="full").execute()
headers = {h["name"]: h["value"] for h in msg["payload"]["headers"]}
return {
"subject": headers.get("Subject"),
"from": headers.get("From"),
"snippet": msg["snippet"]
}
# Send email
import base64
from email.mime.text import MIMEText
def send_email(to, subject, body):
msg = MIMEText(body)
msg["to"] = to
msg["subject"] = subject
raw = base64.urlsafe_b64encode(msg.as_bytes()).decode()
service.users().messages().send(userId="me", body={"raw": raw}).execute()---
drive = build("drive", "v3", credentials=get_credentials())
# List files
files = drive.files().list(
q="mimeType='application/vnd.google-apps.spreadsheet'",
fields="files(id, name, modifiedTime)"
).execute()
# Upload file
from googleapiclient.http import MediaFileUpload
media = MediaFileUpload("report.pdf", mimetype="application/pdf")
drive.files().create(
body={"name": "report.pdf", "parents": ["FOLDER_ID"]},
media_body=media
).execute()
# Download file
import io
from googleapiclient.http import MediaIoBaseDownload
request = drive.files().get_media(fileId="FILE_ID")
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while not done:
_, done = downloader.next_chunk()---
sheets = build("sheets", "v4", credentials=get_credentials())
SHEET_ID = "your-spreadsheet-id"
# Read range
result = sheets.spreadsheets().values().get(
spreadsheetId=SHEET_ID, range="Sheet1!A1:D10"
).execute()
rows = result.get("values", [])
# Write range
sheets.spreadsheets().values().update(
spreadsheetId=SHEET_ID,
range="Sheet1!A1",
valueInputOption="RAW",
body={"values": [["Name", "Score"], ["Alice", 95], ["Bob", 87]]}
).execute()
# Append rows
sheets.spreadsheets().values().append(
spreadsheetId=SHEET_ID,
range="Sheet1!A:A",
valueInputOption="RAW",
body={"values": [["New Row", "Data"]]}
).execute()---
cal = build("calendar", "v3", credentials=get_credentials())
# List events
events = cal.events().list(
calendarId="primary",
maxResults=10,
singleEvents=True,
orderBy="startTime"
).execute()
for event in events.get("items", []):
print(event["summary"], event["start"].get("dateTime"))
# Create event
cal.events().insert(
calendarId="primary",
body={
"summary": "Team Meeting",
"start": {"dateTime": "2026-04-08T10:00:00+09:00"},
"end": {"dateTime": "2026-04-08T11:00:00+09:00"},
"attendees": [{"email": "colleague@example.com"}],
}
).execute()---
# Auth gcloud auth login gcloud auth application-default login # Drive: list files gdrive list # Sheets: export as CSV gsheet export SHEET_ID --format csv
Hermes Agent, faithfully ported to Claude Code Channel (CCC). hermes-CCC brings the power of Hermes Agent by NousResearch into Claude Code's native skill system — no separate process, no OAuth, no lock-in. Everything runs inside Claude Code.
Search and retrieve academic papers from arXiv using their free REST API. No API key needed.
Query Base (Ethereum L2) blockchain data — wallet balances, token info, transactions, gas analysis, contract inspection. No API…
Monitor and summarize blog posts, RSS feeds, and web content for research and staying current with topics.
Open-source embedding database for RAG — store embeddings, vector search, metadata filtering. Simple API, scales from notebook to…
Manage Docker containers, images, volumes, networks, and Compose stacks - lifecycle ops, debugging, cleanup, and Dockerfile…
Free web search via DuckDuckGo - no API key needed. Text, news, images. Use as fallback when other search tools unavailable.