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.
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.
.env in {baseDir}):OP_HOST=https://projects.xflowdata.com
OP_API_TOKEN=your-api-token
OP_DEFAULT_PROJECT=my-project
cd {baseDir} && npm install# List work packages (with optional filters)
node {baseDir}/scripts/openproject.mjs wp-list --project my-project --status open --assignee me
# Create a work package
node {baseDir}/scripts/openproject.mjs wp-create --project my-project --type Task --subject "Fix login bug" --description "Users can't log in"
# Read work package details
node {baseDir}/scripts/openproject.mjs wp-read --id 42
# Update a work package
node {baseDir}/scripts/openproject.mjs wp-update --id 42 --subject "New title" --priority High
# Delete a work package (requires --confirm)
node {baseDir}/scripts/openproject.mjs wp-delete --id 42 --confirm
# List all projects
node {baseDir}/scripts/openproject.mjs project-list
# Read project details
node {baseDir}/scripts/openproject.mjs project-read --id my-project
# Create a project
node {baseDir}/scripts/openproject.mjs project-create --name "My Project" --identifier my-project
# List comments on a work package
node {baseDir}/scripts/openproject.mjs comment-list --wp-id 42
# Add a comment
node {baseDir}/scripts/openproject.mjs comment-add --wp-id 42 --body "Ready for review"
# List attachments on a work package
node {baseDir}/scripts/openproject.mjs attachment-list --wp-id 42
# Upload an attachment
node {baseDir}/scripts/openproject.mjs attachment-add --wp-id 42 --file ./screenshot.png
# Delete an attachment (requires --confirm)
node {baseDir}/scripts/openproject.mjs attachment-delete --id 10 --confirm
# List time entries
node {baseDir}/scripts/openproject.mjs time-list --project my-project
# Log time
node {baseDir}/scripts/openproject.mjs time-create --wp-id 42 --hours 2.5 --comment "Code review" --activity-id 1
# Update time entry
node {baseDir}/scripts/openproject.mjs time-update --id 5 --hours 3 --comment "Updated"
# Delete time entry (requires --confirm)
node {baseDir}/scripts/openproject.mjs time-delete --id 5 --confirm
# List all statuses
node {baseDir}/scripts/openproject.mjs status-list
# Update work package status
node {baseDir}/scripts/openproject.mjs wp-update --id 42 --status "In progress"
# List all users (with optional filters)
node {baseDir}/scripts/openproject.mjs user-list
node {baseDir}/scripts/openproject.mjs user-list --status active --name "John"
# Read user details
node {baseDir}/scripts/openproject.mjs user-read --id 5
# Show current authenticated user
node {baseDir}/scripts/openproject.mjs user-me
# List notifications (all or unread only)
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
# Read notification details
node {baseDir}/scripts/openproject.mjs notification-read --id 100
# Mark as read (single or all)
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
# Mark as unread
node {baseDir}/scripts/openproject.mjs notification-mark-unread --id 100
node {baseDir}/scripts/openproject.mjs notification-mark-unread --all
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"
node {baseDir}/scripts/openproject.mjs revision-read --id 10
node {baseDir}/scripts/openproject.mjs revision-list-by-wp --wp-id 42
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
node {baseDir}/scripts/openproject.mjs my-preferences-read
node {baseDir}/scripts/openproject.mjs my-preferences-update --time-zone "Europe/Brussels" --comment-order desc
node {baseDir}/scripts/openproject.mjs render-markdown --text "**bold** and _italic_"
node {baseDir}/scripts/openproject.mjs render-plain --text "plain text"
node {baseDir}/scripts/openproject.mjs post-read --id 5
node {baseDir}/scripts/openproject.mjs post-attachment-list --id 5
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
node {baseDir}/scripts/openproject.mjs project-status-read --id on_track
# List project phase definitions
node {baseDir}/scripts/openproject.mjs project-phase-definition-list
# Read a phase definition
node {baseDir}/scripts/openproject.mjs project-phase-definition-read --id 1
# Read a project phase
node {baseDir}/scripts/openproject.mjs project-phase-read --id 5
# List portfolios
node {baseDir}/scripts/openproject.mjs portfolio-list
# Read a portfolio
node {baseDir}/scripts/openproject.mjs portfolio-read --id 1
# Update a portfolio
node {baseDir}/scripts/openproject.mjs portfolio-update --id 1 --name "Q1 Portfolio"
# Delete a portfolio (requires --confirm)
node {baseDir}/scripts/openproject.mjs portfolio-delete --id 1 --confirm
# List programs
node {baseDir}/scripts/openproject.mjs program-list
# Read a program
node {baseDir}/scripts/openproject.mjs program-read --id 1
# Update a program
node {baseDir}/scripts/openproject.mjs program-update --id 1 --name "Platform Program"
# Delete a program (requires --confirm)
node {baseDir}/scripts/openproject.mjs program-delete --id 1 --confirm
# List placeholder users
node {baseDir}/scripts/openproject.mjs placeholder-user-list
# Read a placeholder user
node {baseDir}/scripts/openproject.mjs placeholder-user-read --id 10
# Create a placeholder user
node {baseDir}/scripts/openproject.mjs placeholder-user-create --name "Future Developer"
# Update a placeholder user
node {baseDir}/scripts/openproject.mjs placeholder-user-update --id 10 --name "Senior Developer"
# Delete a placeholder user (requires --confirm)
node {baseDir}/scripts/openproject.mjs placeholder-user-delete --id 10 --confirm
# List project budgets
node {baseDir}/scripts/openproject.mjs budget-list --project my-project
# Read budget details
node {baseDir}/scripts/openproject.mjs budget-read --id 3
# Read a meeting
node {baseDir}/scripts/openproject.mjs meeting-read --id 10
# List meeting attachments
node {baseDir}/scripts/openproject.mjs meeting-attachment-list --id 10
# Upload attachment to a meeting
node {baseDir}/scripts/openproject.mjs meeting-attachment-add --id 10 --file ./agenda.pdf
# Check if a date is a working day
node {baseDir}/scripts/openproject.mjs day-read --date 2026-03-18
# List days in a range
node {baseDir}/scripts/openproject.mjs days-list --from 2026-03-01 --to 2026-03-31
# List all non-working days (holidays)
node {baseDir}/scripts/openproject.mjs non-working-days-list
# View a non-working day
node {baseDir}/scripts/openproject.mjs non-working-day-read --date 2026-12-25
# Show week day schedule (which days are working)
node {baseDir}/scripts/openproject.mjs week-days-list
# View a specific week day
node {baseDir}/scripts/openproject.mjs week-day-read --day 6
# View instance configuration
node {baseDir}/scripts/openproject.mjs config-read
# View project-specific configuration
node {baseDir}/scripts/openproject.mjs project-config-read --project my-project
# Read an OAuth application
node {baseDir}/scripts/openproject.mjs oauth-app-read --id 1
# Read OAuth client credentials
node {baseDir}/scripts/openproject.mjs oauth-credentials-read --id 1
# List all attribute help texts
node {baseDir}/scripts/openproject.mjs help-text-list
# Read a help text
node {baseDir}/scripts/openproject.mjs help-text-read --id 1
# List items for a hierarchical custom field
node {baseDir}/scripts/openproject.mjs custom-field-items --id 10
# Read a custom field item
node {baseDir}/scripts/openproject.mjs custom-field-item-read --id 25
# Get a custom field item's branch (ancestors)
node {baseDir}/scripts/openproject.mjs custom-field-item-branch --id 25
# Read a custom option value
node {baseDir}/scripts/openproject.mjs custom-option-read --id 3
# Read a custom action
node {baseDir}/scripts/openproject.mjs custom-action-read --id 1
# Execute a custom action on a work package
node {baseDir}/scripts/openproject.mjs custom-action-execute --id 1 --wp-id 42
# List all groups
node {baseDir}/scripts/openproject.mjs group-list
# Read group details with members
node {baseDir}/scripts/openproject.mjs group-read --id 3
# Create a group with members
node {baseDir}/scripts/openproject.mjs group-create --name "Dev Team" --members 5,6,7
# Update a group (replaces member list)
node {baseDir}/scripts/openproject.mjs group-update --id 3 --name "Engineering" --members 5,6,7,8
# Delete a group (requires --confirm)
node {baseDir}/scripts/openproject.mjs group-delete --id 3 --confirm
# List all news
node {baseDir}/scripts/openproject.mjs news-list
# Read news details
node {baseDir}/scripts/openproject.mjs news-read --id 5
# Create a news item
node {baseDir}/scripts/openproject.mjs news-create --project my-project --title "Sprint 12 Released" --summary "Bug fixes and performance" --description "Full details here..."
# Update a news item
node {baseDir}/scripts/openproject.mjs news-update --id 5 --title "Updated headline"
# Delete a news item (requires --confirm)
node {baseDir}/scripts/openproject.mjs news-delete --id 5 --confirm
# List watchers on a work package
node {baseDir}/scripts/openproject.mjs watcher-list --wp-id 42
# Add a watcher
node {baseDir}/scripts/openproject.mjs watcher-add --wp-id 42 --user-id 5
# Remove a watcher
node {baseDir}/scripts/openproject.mjs watcher-remove --wp-id 42 --user-id 5
# List users available as watchers
node {baseDir}/scripts/openproject.mjs watcher-available --wp-id 42
# List all relations (optionally filter by work package or type)
node {baseDir}/scripts/openproject.mjs relation-list --wp-id 42
node {baseDir}/scripts/openproject.mjs relation-list --type blocks
# Read relation details
node {baseDir}/scripts/openproject.mjs relation-read --id 5
# Create a relation (types: relates, duplicates, blocks, precedes, follows, includes, partof, requires)
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
# Update a relation
node {baseDir}/scripts/openproject.mjs relation-update --id 5 --type follows --lag 1
# Delete a relation (requires --confirm)
node {baseDir}/scripts/openproject.mjs relation-delete --id 5 --confirm
# Read a wiki page
node {baseDir}/scripts/openproject.mjs wiki-read --id 72
# List attachments on a wiki page
node {baseDir}/scripts/openproject.mjs wiki-attachment-list --id 72
# Upload an attachment to a wiki page
node {baseDir}/scripts/openproject.mjs wiki-attachment-add --id 72 --file ./diagram.png
# List work package types
node {baseDir}/scripts/openproject.mjs type-list
# List priorities
node {baseDir}/scripts/openproject.mjs priority-list
# List project members
node {baseDir}/scripts/openproject.mjs member-list --project my-project
# List versions/milestones
node {baseDir}/scripts/openproject.mjs version-list --project my-project
# List categories
node {baseDir}/scripts/openproject.mjs category-list --project my-project
apikey as username)--confirm flagcommander — CLI frameworkdotenv — environment variable loadingfetch (requires Node >= 18)Abdelkrim BOUJRAF — ALT-F1 SRL, Brussels 🇧🇪 🇲🇦 X: @altf1be