Skip to main content
Glama
NicoLa5Tor

@nicola5tor/openproject-timelog

by NicoLa5Tor

@nicola5tor/openproject-timelog

MCP server (Model Context Protocol) for keeping a local time log and syncing it with OpenProject (API v3). Log your work in natural language from Claude Desktop (or another MCP client), review it, and upload it to OpenProject when ready.

  • Transport: stdio

  • Local storage: ~/.openproject-timelog/entries.json

  • Config: OPENPROJECT_URL and OPENPROJECT_API_KEY environment variables

Installation

No need to install anything globally: the server runs with npx.

# probarlo directamente
npx @nicola5tor/openproject-timelog

Or install it in a project:

npm install @nicola5tor/openproject-timelog
# o
pnpm add @nicola5tor/openproject-timelog

Related MCP server: OpenProject MCP Server

Configuration in Claude Desktop

Edit the configuration file (claude_desktop_config.json) and add the server under mcpServers:

{
  "mcpServers": {
    "openproject-timelog": {
      "command": "npx",
      "args": ["-y", "@nicola5tor/openproject-timelog"],
      "env": {
        "OPENPROJECT_URL": "https://tu-openproject.example.com",
        "OPENPROJECT_API_KEY": "TU_API_KEY"
      }
    }
  }
}

Restart Claude Desktop after saving.

How to get your OpenProject API key

In OpenProject: My account → Access tokens → API and generate a key. The server authenticates with Basic auth using the literal user apikey and your key as the password.

The local-only tools (log_entry, list_entries, edit_entry, assign_entry, delete_entry, clear_sent) work even if you don't configure OpenProject. The query and upload tools require OPENPROJECT_URL and OPENPROJECT_API_KEY.

Tools

Local time log

Tool

Description

log_entry

Logs a time entry. Params: description, hours, workPackageId, projectId, activityId, spentOn (default today), startTime, endTime. If there's no workPackageId, it stays pending assignment.

list_entries

Lists entries by status. Param: status = pending (default) | sent | all.

edit_entry

Edits a pending entry. Params: id* + any editable field.

assign_entry

Assigns a work package to several entries. Params: entryIds, workPackageId.

delete_entry

Deletes a pending entry. Param: id*.

clear_sent

Removes all already-sent (sent) entries from the local log.

OpenProject query

Tool

Description

get_projects

Lists projects (id, name, status).

get_work_packages

Lists tasks. Optional params: projectId, status, assignee.

get_activities

Lists time entry activities (id, name).

get_time_entries

Queries already-logged hours. Optional params: projectId, workPackageId, from, to.

Sync

Tool

Description

upload_entries

Uploads entries to OpenProject. Optional param entryIds; if omitted, uploads all pending entries with a workPackageId. Each entry needs workPackageId and activityId; missing ones are reported without being uploaded. On upload, marks the entry as sent.

* = required.

Behavior notes

  • Local ids are UUID v4. Hours are stored in decimal (1.5 = 1h30m) and converted to ISO 8601 duration (PT1H30M) on upload.

  • The projectId of an entry, if not specified, is derived from the work package on upload (an extra call to OpenProject).

  • The JSON file is written atomically (temp file + rename) and operations are serialized to prevent corruption.

  • Network / credential / permission errors are returned as readable messages in the tool response, without crashing the server.

Conversational usage examples

You: Log 2 hours of today fixing the login, task 1234. Claude: (calls log_entry with description="fix login", hours=2, workPackageId=1234)

You: Log 45 minutes of meeting for me, I'll assign the task later. Claude: (log_entry description="meeting", hours=0.75) — stays pending assignment.

You: What do I have pending to upload? Claude: (list_entries status="pending")

You: Assign task 1234 to those two meetings. Claude: (assign_entry entryIds=[...], workPackageId=1234)

You: What activities are there? Set "Development" on everything and upload it. Claude: (get_activitiesedit_entry/assign for activityId → upload_entries)

You: Clean up what was already uploaded. Claude: (clear_sent)

Development

npm install      # instala deps y compila (prepare -> build)
npm run build    # compila TypeScript a dist/
npm start        # ejecuta dist/index.js

Structure:

openproject-timelog/
├── src/
│   ├── index.ts        # entry point, setup MCP y registro de tools
│   ├── store.ts        # CRUD bitácora local (JSON atómico)
│   ├── openproject.ts  # cliente API OpenProject v3
│   └── types.ts        # interfaces/types
├── package.json
├── tsconfig.json
└── README.md

License

MIT

Install Server
F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects Claude Desktop to your OpenProject instance, allowing you to manage projects, tasks, and time entries through natural language.

View all related MCP servers

Related MCP Connectors

  • MCP server for generating rough-draft project plans from natural-language prompts.

  • A MCP server built for developers enabling Git based project management with project and personal…

  • MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NicoLa5Tor/openMcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server