| name | openproject-by-altf1be |
| description | OpenProject CRUD skill — manage work packages, projects, groups, news, users, watchers, relations, notifications, time entries, comments, attachments, wiki pages, statuses, and more via OpenProject API v3 with API token auth. Supports cloud and self-hosted instances. |
| homepage | https://github.com/ALT-F1-OpenClaw/openclaw-skill-openproject |
| metadata | {"openclaw":{"emoji":"📊","requires":{"env":["OP_HOST","OP_API_TOKEN"]},"optional":{"env":["OP_DEFAULT_PROJECT","OP_MAX_RESULTS","OP_MAX_FILE_SIZE"]},"primaryEnv":"OP_HOST"}} |
OpenProject by @altf1be
Manage OpenProject work packages, projects, groups, news, users, watchers, relations, notifications, time entries, comments, attachments, wiki pages, and workflow transitions via the API v3. Works with both cloud and self-hosted instances.
Setup
- Log in to your OpenProject instance
- Go to My Account → Access Tokens → + Add
- Create an API token and copy it
- Set environment variables (or create
.env in {baseDir}):
OP_HOST=https://projects.xflowdata.com
OP_API_TOKEN=your-api-token
OP_DEFAULT_PROJECT=my-project
- Install dependencies:
cd {baseDir} && npm install
Commands
Work Packages
node {baseDir}/scripts/openproject.mjs wp-list --project my-project --status open --assignee me
node {baseDir}/scripts/openproject.mjs wp-create --project my-project --type Task --subject "Fix login bug" --description "Users can't log in"
node {baseDir}/scripts/openproject.mjs wp-read --id 42
node {baseDir}/scripts/openproject.mjs wp-update --id 42 --subject "New title" --priority High
node {baseDir}/scripts/openproject.mjs wp-delete --id 42 --confirm
Projects
node {baseDir}/scripts/openproject.mjs project-list
node {baseDir}/scripts/openproject.mjs project-read --id my-project
node {baseDir}/scripts/openproject.mjs project-create --name "My Project" --identifier my-project
Comments (Activities)
node {baseDir}/scripts/openproject.mjs comment-list --wp-id 42
node {baseDir}/scripts/openproject.mjs comment-add --wp-id 42 --body "Ready for review"
Attachments
node {baseDir}/scripts/openproject.mjs attachment-list --wp-id 42
node {baseDir}/scripts/openproject.mjs attachment-add --wp-id 42 --file ./screenshot.png
node {baseDir}/scripts/openproject.mjs attachment-delete --id 10 --confirm
Time Entries
node {baseDir}/scripts/openproject.mjs time-list --project my-project
node {baseDir}/scripts/openproject.mjs time-create --wp-id 42 --hours 2.5 --comment "Code review" --activity-id 1
node {baseDir}/scripts/openproject.mjs time-update --id 5 --hours 3 --comment "Updated"
node {baseDir}/scripts/openproject.mjs time-delete --id 5 --confirm
Statuses & Transitions
node {baseDir}/scripts/openproject.mjs status-list
node {baseDir}/scripts/openproject.mjs wp-update --id 42 --status "In progress"
Users
node {baseDir}/scripts/openproject.mjs user-list
node {baseDir}/scripts/openproject.mjs user-list --status active --name "John"
node {baseDir}/scripts/openproject.mjs user-read --id 5
node {baseDir}/scripts/openproject.mjs user-me
Notifications
node {baseDir}/scripts/openproject.mjs notification-list
node {baseDir}/scripts/openproject.mjs notification-list --unread
node {baseDir}/scripts/openproject.mjs notification-list --reason mentioned --project 5
node {baseDir}/scripts/openproject.mjs notification-read --id 100
node {baseDir}/scripts/openproject.mjs notification-mark-read --id 100
node {baseDir}/scripts/openproject.mjs notification-mark-read --all
node {baseDir}/scripts/openproject.mjs notification-mark-read --all --project 5
node {baseDir}/scripts/openproject.mjs notification-mark-unread --id 100
node {baseDir}/scripts/openproject.mjs notification-mark-unread --all
Documents
node {baseDir}/scripts/openproject.mjs document-list
node {baseDir}/scripts/openproject.mjs document-read --id 5
node {baseDir}/scripts/openproject.mjs document-update --id 5 --title "Updated title"
Revisions
node {baseDir}/scripts/openproject.mjs revision-read --id 10
node {baseDir}/scripts/openproject.mjs revision-list-by-wp --wp-id 42
Capabilities & Actions
node {baseDir}/scripts/openproject.mjs capability-list --principal me
node {baseDir}/scripts/openproject.mjs capability-global
node {baseDir}/scripts/openproject.mjs action-list
node {baseDir}/scripts/openproject.mjs action-read --id work_packages/create
My Preferences
node {baseDir}/scripts/openproject.mjs my-preferences-read
node {baseDir}/scripts/openproject.mjs my-preferences-update --time-zone "Europe/Brussels" --comment-order desc
Render
node {baseDir}/scripts/openproject.mjs render-markdown --text "**bold** and _italic_"
node {baseDir}/scripts/openproject.mjs render-plain --text "plain text"
Posts (Forum)
node {baseDir}/scripts/openproject.mjs post-read --id 5
node {baseDir}/scripts/openproject.mjs post-attachment-list --id 5
Reminders
node {baseDir}/scripts/openproject.mjs reminder-list
node {baseDir}/scripts/openproject.mjs reminder-create --wp-id 42 --remind-at "2026-03-20T09:00:00Z" --note "Check status"
node {baseDir}/scripts/openproject.mjs reminder-update --id 3 --remind-at "2026-03-21T09:00:00Z"
node {baseDir}/scripts/openproject.mjs reminder-delete --id 3 --confirm
Project Statuses
node {baseDir}/scripts/openproject.mjs project-status-read --id on_track
Project Phases (Enterprise)
node {baseDir}/scripts/openproject.mjs project-phase-definition-list
node {baseDir}/scripts/openproject.mjs project-phase-definition-read --id 1
node {baseDir}/scripts/openproject.mjs project-phase-read --id 5
Portfolios (Enterprise)
node {baseDir}/scripts/openproject.mjs portfolio-list
node {baseDir}/scripts/openproject.mjs portfolio-read --id 1
node {baseDir}/scripts/openproject.mjs portfolio-update --id 1 --name "Q1 Portfolio"
node {baseDir}/scripts/openproject.mjs portfolio-delete --id 1 --confirm
Programs (Enterprise)
node {baseDir}/scripts/openproject.mjs program-list
node {baseDir}/scripts/openproject.mjs program-read --id 1
node {baseDir}/scripts/openproject.mjs program-update --id 1 --name "Platform Program"
node {baseDir}/scripts/openproject.mjs program-delete --id 1 --confirm
Placeholder Users (Enterprise)
node {baseDir}/scripts/openproject.mjs placeholder-user-list
node {baseDir}/scripts/openproject.mjs placeholder-user-read --id 10
node {baseDir}/scripts/openproject.mjs placeholder-user-create --name "Future Developer"
node {baseDir}/scripts/openproject.mjs placeholder-user-update --id 10 --name "Senior Developer"
node {baseDir}/scripts/openproject.mjs placeholder-user-delete --id 10 --confirm
Budgets (Enterprise)
node {baseDir}/scripts/openproject.mjs budget-list --project my-project
node {baseDir}/scripts/openproject.mjs budget-read --id 3
Meetings (Enterprise)
node {baseDir}/scripts/openproject.mjs meeting-read --id 10
node {baseDir}/scripts/openproject.mjs meeting-attachment-list --id 10
node {baseDir}/scripts/openproject.mjs meeting-attachment-add --id 10 --file ./agenda.pdf
Days (Working/Non-Working)
node {baseDir}/scripts/openproject.mjs day-read --date 2026-03-18
node {baseDir}/scripts/openproject.mjs days-list --from 2026-03-01 --to 2026-03-31
node {baseDir}/scripts/openproject.mjs non-working-days-list
node {baseDir}/scripts/openproject.mjs non-working-day-read --date 2026-12-25
node {baseDir}/scripts/openproject.mjs week-days-list
node {baseDir}/scripts/openproject.mjs week-day-read --day 6
Configuration
node {baseDir}/scripts/openproject.mjs config-read
node {baseDir}/scripts/openproject.mjs project-config-read --project my-project
OAuth
node {baseDir}/scripts/openproject.mjs oauth-app-read --id 1
node {baseDir}/scripts/openproject.mjs oauth-credentials-read --id 1
Help Texts
node {baseDir}/scripts/openproject.mjs help-text-list
node {baseDir}/scripts/openproject.mjs help-text-read --id 1
Custom Fields & Options
node {baseDir}/scripts/openproject.mjs custom-field-items --id 10
node {baseDir}/scripts/openproject.mjs custom-field-item-read --id 25
node {baseDir}/scripts/openproject.mjs custom-field-item-branch --id 25
node {baseDir}/scripts/openproject.mjs custom-option-read --id 3
Custom Actions
node {baseDir}/scripts/openproject.mjs custom-action-read --id 1
node {baseDir}/scripts/openproject.mjs custom-action-execute --id 1 --wp-id 42
Groups
node {baseDir}/scripts/openproject.mjs group-list
node {baseDir}/scripts/openproject.mjs group-read --id 3
node {baseDir}/scripts/openproject.mjs group-create --name "Dev Team" --members 5,6,7
node {baseDir}/scripts/openproject.mjs group-update --id 3 --name "Engineering" --members 5,6,7,8
node {baseDir}/scripts/openproject.mjs group-delete --id 3 --confirm
News
node {baseDir}/scripts/openproject.mjs news-list
node {baseDir}/scripts/openproject.mjs news-read --id 5
node {baseDir}/scripts/openproject.mjs news-create --project my-project --title "Sprint 12 Released" --summary "Bug fixes and performance" --description "Full details here..."
node {baseDir}/scripts/openproject.mjs news-update --id 5 --title "Updated headline"
node {baseDir}/scripts/openproject.mjs news-delete --id 5 --confirm
Watchers
node {baseDir}/scripts/openproject.mjs watcher-list --wp-id 42
node {baseDir}/scripts/openproject.mjs watcher-add --wp-id 42 --user-id 5
node {baseDir}/scripts/openproject.mjs watcher-remove --wp-id 42 --user-id 5
node {baseDir}/scripts/openproject.mjs watcher-available --wp-id 42
Relations
node {baseDir}/scripts/openproject.mjs relation-list --wp-id 42
node {baseDir}/scripts/openproject.mjs relation-list --type blocks
node {baseDir}/scripts/openproject.mjs relation-read --id 5
node {baseDir}/scripts/openproject.mjs relation-create --wp-id 42 --to-wp-id 43 --type blocks
node {baseDir}/scripts/openproject.mjs relation-create --wp-id 42 --to-wp-id 43 --type precedes --lag 2
node {baseDir}/scripts/openproject.mjs relation-update --id 5 --type follows --lag 1
node {baseDir}/scripts/openproject.mjs relation-delete --id 5 --confirm
Wiki Pages
node {baseDir}/scripts/openproject.mjs wiki-read --id 72
node {baseDir}/scripts/openproject.mjs wiki-attachment-list --id 72
node {baseDir}/scripts/openproject.mjs wiki-attachment-add --id 72 --file ./diagram.png
Reference Data
node {baseDir}/scripts/openproject.mjs type-list
node {baseDir}/scripts/openproject.mjs priority-list
node {baseDir}/scripts/openproject.mjs member-list --project my-project
node {baseDir}/scripts/openproject.mjs version-list --project my-project
node {baseDir}/scripts/openproject.mjs category-list --project my-project
Security
- API token auth (Basic auth with
apikey as username)
- No secrets or tokens printed to stdout
- All delete operations require explicit
--confirm flag
- Path traversal prevention for file uploads
- Built-in rate limiting with exponential backoff retry
- Lazy config validation (only checked when a command runs)
Dependencies
commander — CLI framework
dotenv — environment variable loading
- Node.js built-in
fetch (requires Node >= 18)
Author
Abdelkrim BOUJRAF — ALT-F1 SRL, Brussels 🇧🇪 🇲🇦
X: @altf1be