Public Google Drive
by @memyard
Create public Google Docs or Google Sheet files without requiring OAuth. Use this skill to create and edit Google Docs and Sheets, no Google sign-in required...
clawhub install public-google-driveπ About This Skill
name: public-google-drive description: Create public Google Docs or Google Sheet files without requiring OAuth. Use this skill to create and edit Google Docs and Sheets, no Google sign-in required. Documents are viewable at shareable links. Registration is automatic on first use.
Public Google Drive β Create and Edit Google Docs/Sheets Hosted on Memyard
Use this skill to create and edit Google Docs and Google Sheets that live in Memyard's workspace. Documents are viewable at https://app.memyard.com/share/ (or your configured Memyard base URL). No user OAuth is required. Registration is automatic on first use: when the user first creates or edits a document, register and persist credentials so they never have to fetch a URL or save a key.
Setup / Registration (automatic on first use)
Base URL: https://api.memyard.com β all API paths below are relative to this. Credentials and base URL are persisted in , where is $HOME on macOS/Linux or %USERPROFILE% on Windows.
Before calling any document endpoint (plan, execute, docs, sheets, etc.), ensure an agent key is available. Do this automatically so the user never has to:
1. Check for existing config
If exists and contains base_url, agent_id, and agent_key, use those. Set Authorization: Bearer for all requests. Skip registration.
2. If no config: register and persist
POST with {"name": "My Claude Agent"}. Response:
{
"agent_id": "uuid",
"agent_key": "myd_...",
"message": "Store this key securely. It will not be shown again."
}
Ensure /.memyard/ exists and is only accessible by the owner (on macOS/Linux: chmod 0700; on Windows the default per-user directory permissions are sufficient).
Persist to /.memyard/agent_config.json (on macOS/Linux: chmod 0600):
{
"base_url": "",
"agent_id": "",
"agent_key": ""
}
Use the key for all subsequent requests: Authorization: Bearer .Available Operations
Write path: Plan then Execute
1. POST /v1/drive/plan β Propose what you want to write: doc or sheet, title, intended operation (create / append / insert), and a content_summary (required for content check). Server returns either approved_plan (with plan_id and expires_at) or rejected_plan (with reasons and adjusted_constraints). No Drive or DB write happens yet.
2. POST /v1/drive/execute β Send the plan_id from an approved plan plus a payload (title, content, columns, rows as needed). Server performs the write and returns the same shape as create/update (resource_id, view_url, etc.). Each plan is one-time use.
This gives the server a choke point for scope, size, content policy, and rate limiting before any Drive API calls.
API Reference
All endpoints are relative to (see Setup above).
All endpoints except register and discover/ require:
Authorization: Bearer
Register (no auth)
POST /v1/drive/register
Content-Type: application/json
{"name": "My Agent Name"}
Response: { "agent_id", "agent_key", "message" }
Plan (propose a write)
POST /v1/drive/plan
Authorization: Bearer
Content-Type: application/json
{
"doc_type": "document",
"title": "My Document",
"intended_operation": "create",
"content_summary": "A short summary of what I will write (e.g. meeting notes)."
}
For append/insert also send: "resource_id": ""
Optional: "structure" (e.g. columns for a sheet)
Response β approved (200):
{
"approved_plan": {
"plan_id": "",
"expires_at": "",
"constraints": { "max_chars": 50000 },
"doc_type": "document",
"title": "My Document",
"intended_operation": "create"
}
}
Response β rejected (200):
{
"rejected_plan": {
"reasons": ["Content policy: disallowed term or phrase in summary"],
"adjusted_constraints": { "max_chars": 50000, "max_rows": 1000 }
}
}
Plans expire after a short TTL (e.g. 10 minutes). Use the plan_id exactly once in execute.
Execute (perform the write)
POST /v1/drive/execute
Authorization: Bearer
Content-Type: application/json
{
"plan_id": "",
"payload": {
"title": "My Document",
"content": "Initial content here."
}
}
For create document: payload.title, payload.content. For create spreadsheet: payload.title, optional payload.columns, payload.rows. For append doc: payload.content. For insert doc: payload.content, optional payload.anchor. For append sheet: payload.rows (array of rows).
Response (201): Same as create/update endpoints β e.g. { "resource_id", "view_url", "title", ... } or { "resource_id", "char_count", "updated_at" } for append.
Errors: 400 if plan expired or invalid, or payload validation fails; 403 if plan belongs to another agent.
Get document metadata
GET /v1/drive/docs/
Authorization: Bearer
Response: { "resource_id", "title", "doc_type", "view_url", "web_view_link", "created_at", "updated_at" }
List my documents
GET /v1/drive/documents?limit=50&offset=0
Authorization: Bearer
Response: { "documents": [ { "id", "title", "doc_type", "web_view_link", "created_at", "updated_at", "view_url" }, ... ] }
Constraints
429 Too Many Requests with Retry-After header.view_url (e.g. https://app.memyard.com/share/) for others to view the document in the browser.Example: Full flow with plan then execute
# Read base_url and agent_key from /.memyard/agent_config.json
BASE="/v1/drive"
KEY=""2. Propose a write (create doc)
PLAN=$(curl -s -X POST "$BASE/plan" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"doc_type":"document","title":"Hello","intended_operation":"create","content_summary":"Meeting notes"}')3. If approved, execute with payload
if echo "$PLAN" | jq -e '.approved_plan' > /dev/null; then
PLAN_ID=$(echo "$PLAN" | jq -r '.approved_plan.plan_id')
DOC=$(curl -s -X POST "$BASE/execute" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d "{\"plan_id\":\"$PLAN_ID\",\"payload\":{\"title\":\"Hello\",\"content\":\"First paragraph.\"}}")
RESOURCE_ID=$(echo "$DOC" | jq -r '.resource_id')
echo "Created: $RESOURCE_ID"
else
echo "Rejected:"; echo "$PLAN" | jq '.rejected_plan'
fi4. To append: plan with intended_operation=append and resource_id, then execute with payload.content
Public discover metadata (no auth)
To resolve a public document for embedding (e.g. on the discover page):
GET /v1/drive/discover/
Response: { "resource_id", "title", "doc_type", "web_view_link", "created_at", "updated_at" }
This endpoint does not require authentication.
π Constraints
429 Too Many Requests with Retry-After header.view_url (e.g. https://app.memyard.com/share/) for others to view the document in the browser.