OpenClaw + PortEden Setup

Add secure calendar and email access to your OpenClaw agent. List events, create meetings, send and manage emails, RSVP to invitations, and more, controlled by token permissions.

Raw text version (for LLMs):openclaw-setup.txt

1. Install the PortEden CLI

The skill requires the porteden binary.

Homebrew (macOS / Linux)

brew install porteden/tap/porteden

Install Script

curl -sSfL https://raw.githubusercontent.com/porteden/cli/main/install.sh | bash

Go Install

go install github.com/porteden/cli/cmd/porteden@latest

Verify:

porteden --version

2. Install the Skills

clawhub install porteden/calendar
clawhub install porteden/email

This places the skills in ~/openclaw/skills/porteden/. Skill sources: Calendar SKILL.md, Email SKILL.md. To install at the workspace level instead:

cp -r porteden/ <workspace>/skills/porteden/

Note

Workspace skills take priority over managed skills. If you have both, the workspace copy is used.

3. Authenticate

If the user is at the computer - prefer browser login

porteden auth login

This opens the browser to authenticate and stores the credentials locally.

If the user is on a remote channel (Telegram, WhatsApp, or other gateway)

Direct them to my.porteden.com to create an account and generate an API key. Then authenticate with:

porteden auth login --token pe_their_key_here

4. Add the Key to OpenClaw Config

OpenClaw sessions don't inherit CLI credentials or shell environment variables. The key must be in the config so it's injected into every session.

Get your key (if you used browser login, it was shown in the output):

porteden auth status

Add to ~/.openclaw/openclaw.json:

{
"skills": {
"entries": {
"porteden": {
"enabled": true,
"env": {
"PE_API_KEY": "pe_your_api_key"
}
}
}
}
}

Verify:

porteden auth status

Available Commands

All commands use -jc for compact JSON output optimized for LLM consumption.

Calendar – Read Commands

CommandDescription
porteden calendar calendars -jcList all accessible calendars
porteden calendar events --today -jcToday's events (also --tomorrow, --week)
porteden calendar events --from ... --to ... -jcEvents in a custom date range
porteden calendar events --week --all -jcAuto-paginate all results
porteden calendar events -q "keyword" --today -jcSearch events by keyword
porteden calendar by-contact "email" -jcFind events shared with a contact
porteden calendar event <eventId> -jcGet a single event by ID

Calendar – Write Commands

CommandDescription
porteden calendar create --calendar <id> --summary "..." --from "..." --to "..."Create a new event
porteden calendar update <eventId> --summary "New Title"Update event fields
porteden calendar update <eventId> --add-attendees "a@b.com" --notifyAdd attendees with notification
porteden calendar update <eventId> --remove-attendees "a@b.com"Remove attendees
porteden calendar delete <eventId>Delete an event
porteden calendar respond <eventId> acceptedRSVP (accepted, declined, tentative)

Email – Read Commands

CommandDescription
porteden email messages -jcList recent emails
porteden email messages --today -jcToday's emails (also --week, --days N)
porteden email messages --unread -jcUnread emails only
porteden email messages -q "keyword" -jcSearch emails by keyword
porteden email messages --from boss@example.com -jcFilter by sender
porteden email messages --subject "invoice" -jcFilter by subject
porteden email messages --has-attachment -jcEmails with attachments
porteden email messages --week --all -jcAuto-paginate all results
porteden email message <emailId> -jcGet a single email by ID
porteden email thread <threadId> -jcGet an email thread

Email – Write Commands

CommandDescription
porteden email send --to user@example.com --subject "Hi" --body "Hello"Send a new email
porteden email reply <emailId> --body "Thanks"Reply to sender
porteden email reply <emailId> --body "Thanks" --reply-allReply to all recipients
porteden email forward <emailId> --to colleague@example.comForward an email
porteden email modify <emailId> --mark-readMark as read
porteden email modify <emailId> --add-labels IMPORTANTAdd labels
porteden email delete <emailId>Delete an email

Usage Examples

User

"What's on my calendar today?"

Agent runs

porteden calendar events --today -jc

User

"Schedule a 30-min sync with alice@acme.com tomorrow at 2pm"

Agent runs

porteden calendar create \
--calendar 1 \
--summary "Sync with Alice" \
--from "2026-02-08T14:00:00Z" \
--to "2026-02-08T14:30:00Z" \
--attendees "alice@acme.com"

User

"Do I have any meetings with the marketing team this week?"

Agent runs

porteden calendar events -q "marketing" --week -jc

User

"Any unread emails from my boss today?"

Agent runs

porteden email messages --from boss@example.com --unread --today -jc

User

"Reply to that email saying I'll review it by end of day"

Agent runs

porteden email reply <emailId> --body "I'll review it by end of day."

User

"Send an email to the team about tomorrow's standup being moved to 3pm"

Agent runs

porteden email send \
--to team@example.com \
--subject "Standup moved to 3pm" \
--body "Hi team, tomorrow's standup has been moved to 3pm."

Tips

Environment Variables

VariableDescription
PE_API_KEYAPI key (overrides stored credentials)
PE_TIMEZONEOutput timezone (e.g. America/New_York)
  • -jc combines --json and --compact: filters noise, truncates long fields, reduces token usage
  • Use --all to auto-paginate large result sets
  • Get calendar IDs with porteden calendar calendars -jc before creating events
  • Confirm before creating, updating, or deleting events and before sending, replying, or forwarding emails
  • All times use RFC 3339 UTC: 2026-02-01T10:00:00Z

Note

We recommend creating a dedicated API key with only the permissions the agent needs. See Permissions and Access Rules for details.