guiziweb / mcp-redmine
Multi-provider MCP server for project management and time tracking
Installs: 4
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 0
Forks: 0
Type:project
pkg:composer/guiziweb/mcp-redmine
Requires
- php: >=8.2
- ext-ctype: *
- ext-sodium: *
- firebase/php-jwt: ^6.11.1
- kbsali/redmine-api: ^2.8
- laminas/laminas-httphandlerrunner: ^2.13
- league/oauth2-google: ^4.1
- lesstif/jira-cloud-restapi: ^1.10
- mcp/sdk: ^0.1.0
- nyholm/psr7: ^1.8.2
- nyholm/psr7-server: ^1.1
- symfony/asset-mapper: 7.3.*
- symfony/console: 7.3.*
- symfony/dotenv: 7.3.*
- symfony/flex: ^2.10
- symfony/form: 7.3.*
- symfony/framework-bundle: 7.3.*
- symfony/http-client: 7.3.*
- symfony/monolog-bundle: ^3.11.1
- symfony/psr-http-message-bridge: 7.3.*
- symfony/runtime: 7.3.*
- symfony/security-bundle: 7.3.*
- symfony/serializer: 7.3.*
- symfony/twig-bundle: 7.3.*
- symfony/ux-live-component: ^2.31
- symfony/validator: 7.3.*
- symfony/yaml: 7.3.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.92.3
- phpstan/phpstan: ^2.1.33
- phpunit/phpunit: ^10.5.60
- symfony/web-profiler-bundle: 7.3.*
Conflicts
README
Multi-provider MCP server for project management and time tracking. Connects AI assistants (Claude Desktop/Code, Cursor, etc.) to Redmine, Jira Cloud, Monday.com, and Trello with OAuth2.
Supported Providers
| Provider | Projects | Project Write | Issues | Issue Write | Time Read | Time Write | Attachments | Attachment Write | Activities |
|---|---|---|---|---|---|---|---|---|---|
| Redmine | x | x | x | x | x | required for log_time | |||
| Jira Cloud | x | x | x | x | x | ||||
| Monday.com | x | x | x | x | |||||
| Trello |
MCP Tools
Tools are dynamically exposed based on provider capabilities:
| Tool | Description | Redmine | Jira | Monday |
|---|---|---|---|---|
list_projects |
List accessible projects | x | x | x |
list_issues |
Issues assigned to user | x | x | x |
get_issue_details |
Issue details (description, comments, attachments) | x | x | x |
list_time_entries |
Time entries for a date range | x | x | x |
get_attachment |
Download an attachment | x | x | x |
log_time |
Log time on an issue | x | x | |
update_time_entry |
Update a time entry | x | x | |
delete_time_entry |
Delete a time entry | x | x | |
list_activities |
Time tracking activity types | x |
Quick Start
Claude Code Configuration
Create .mcp.json in your project or ~/.claude/.mcp.json:
{
"mcpServers": {
"timetracking": {
"type": "http",
"url": "https://your-server.com/mcp"
}
}
}
Authentication
- First request → Google Sign-In redirect
- Choose provider (Redmine/Jira/Monday)
- Enter credentials (URL + API key)
- JWT token generated with encrypted credentials
Architecture
flowchart TB
subgraph Clients
Claude["Claude Desktop/Code"]
Cursor
end
subgraph MCP["MCP Server"]
Auth["Google OAuth → JWT"]
Tools["MCP Tools"]
subgraph Domain["Domain Models"]
Project
Issue["Issue (+ Comments, Attachments)"]
TimeEntry["TimeEntry (+ Activity)"]
User
end
subgraph Adapters
RedmineAdapter
JiraAdapter
MondayAdapter
end
end
subgraph APIs["External APIs"]
Redmine
Jira
Monday
end
Clients -->|HTTP + JWT| Tools
Tools --> Domain
Domain --> Adapters
RedmineAdapter --> Redmine
JiraAdapter --> Jira
MondayAdapter --> Monday
Loading
Principles
- No database: Credentials embedded in JWT
- Dynamic capabilities: Tools filtered by provider (e.g., Monday doesn't have
log_time)
Installation
Docker (Production)
git clone https://github.com/guiziweb/mcp-project-management.git cd mcp-project-management cp .env.example .env.local # Edit .env.local make deploy
Local (Development)
composer install
cp .env.example .env.local
# Edit .env.local
symfony server:start --port=8080
Configuration
Environment Variables
# Required APP_URL=https://your-server.com JWT_SECRET=your-jwt-secret ENCRYPTION_KEY=base64-encoded-sodium-key GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=xxx # Access control (at least one required) ALLOWED_EMAIL_DOMAINS=company.com ALLOWED_EMAILS=user@example.com
Google OAuth Setup
- Google Cloud Console → New project
- APIs & Services → OAuth consent screen → External
- Credentials → OAuth 2.0 Client ID → Web application
- Redirect URI:
https://your-server.com/oauth/google-callback
Commands
make dev # Install dev dependencies make static-analysis # PHPStan + CS check + lints make cs-fix # Fix code style make test # Run tests make deploy # Docker rebuild
Bot Token (automation)
# Redmine php bin/console app:create-bot \ --provider=redmine \ --email=bot@company.com \ --url=https://redmine.company.com \ --api-key=xxx # Jira php bin/console app:create-bot \ --provider=jira \ --email=bot@company.com \ --url=https://company.atlassian.net \ --api-key=xxx \ --provider-email=jira-user@company.com # Monday (no --url needed) php bin/console app:create-bot \ --provider=monday \ --email=bot@company.com \ --api-key=xxx
Project Structure
src/
├── Domain/
│ ├── Model/ # Issue, Project, TimeEntry, User, etc.
│ ├── Port/ # Interfaces (IssuePort, TimeEntryReadPort, etc.)
│ └── Service/ # Domain services
├── Infrastructure/
│ ├── Adapter/ # AdapterFactory, CurrentUserService
│ ├── Redmine/ # RedmineAdapter, RedmineClient, Normalizers
│ ├── Jira/ # JiraAdapter, JiraClient, Normalizers
│ ├── Monday/ # MondayAdapter, MondayClient, Normalizers
│ ├── Security/ # JWT, OAuth, Encryption
│ └── Web/ # Forms, Components
├── Tools/ # MCP Tools (ListIssuesTool, LogTimeTool, etc.)
└── Controller/ # McpController, OAuthController
License
MIT