diff --git a/README.md b/README.md index 688b191..462835e 100644 --- a/README.md +++ b/README.md @@ -1 +1,117 @@ -# openproject-mcp \ No newline at end of file +# openproject-mcp + +`openproject-mcp` is a Model Context Protocol (MCP) server that connects AI assistants (such as Claude Desktop, Cursor, and Antigravity) to [OpenProject](https://github.com/opf/openproject) via OpenProject's REST API v3. + +It allows agents to browse, query, and reason about OpenProject workspaces using personal API keys over standard MCP transports (stdio). + +--- + +## Features + +- **Project Discovery**: List accessible projects, inspect hierarchies, and retrieve project details. +- **Work Package Browsing**: Query work packages with status, type, and custom filters; inspect work package details and relationships. +- **Saved Queries (Views)**: Discover and execute saved project and global queries. +- **Taxonomies & Metadata**: Query work package types (Tasks, Bugs, Features), statuses, priorities, and users to enable structured agent reasoning. +- **HAL+JSON Normalization**: Converts OpenProject's verbose HAL+JSON representations into concise, token-efficient structures. +- **Secure Authentication**: Uses OpenProject Personal API tokens via HTTP Basic Auth (`apikey:`) with zero credential storage inside the codebase. + +--- + +## Project Documentation + +- [AGENTS.md](AGENTS.md): Guidelines, coding standards, and workflow instructions for AI coding agents. +- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md): System architecture, layer diagrams, tool schemas, and technical design. +- [docs/DECISIONS.md](docs/DECISIONS.md): Architectural Decision Records (ADRs) documenting stack choices, protocols, and designs. + +--- + +## Quickstart: Local OpenProject Test Stack + +A complete OpenProject 17 environment with PostgreSQL 17 and Memcached is included via Docker Compose for local testing and agentic validation. + +### Prerequisites + +- Docker and Docker Compose (v2+) +- Node.js (>= 18) and npm + +### 1. Start the Environment & Seed Data + +Run the start script to boot the containers, wait for health checks, seed sample data, and generate a personal API token: + +```bash +./scripts/start.sh +``` + +Or step-by-step: + +```bash +# 1. Start the Docker Compose stack in the background +docker compose up -d + +# 2. Wait for health checks, seed test data, and generate credentials +./scripts/seed.sh +``` + +This will automatically create `.env.test` and `.env.local` containing the generated credentials: + +```env +OPENPROJECT_BASE_URL=http://localhost:8080 +OPENPROJECT_API_KEY=opapi-... +OPENPROJECT_TEST_PROJECT=mcp-test-project +``` + +### 2. Verify OpenProject is Running + +Once seeded, OpenProject is accessible at [http://localhost:8080](http://localhost:8080): +- **Username**: `admin` +- **Password**: `admin12345678` + +You can verify the API v3 connection directly using `curl`: + +```bash +curl -u "apikey:$(grep OPENPROJECT_API_KEY .env.test | cut -d= -f2)" \ + http://localhost:8080/api/v3/projects +``` + +### 3. Stop the Stack + +```bash +./scripts/stop.sh +# or +docker compose down +``` + +To also remove database and asset volumes: + +```bash +docker compose down -v +``` + +--- + +## Configuration + +The MCP server accepts configuration through environment variables or a `.env` file: + +| Variable | Description | Default | +| :--- | :--- | :--- | +| `OPENPROJECT_BASE_URL` | Base URL of the OpenProject instance | `http://localhost:8080` | +| `OPENPROJECT_API_KEY` | Personal API token (created under My Account > Access tokens) | - | +| `PORT` | Local port for the Docker Compose web container | `8080` | +| `TAG` | OpenProject container image tag | `17-slim` | +| `POSTGRES_VERSION` | PostgreSQL container image tag | `17` | + +--- + +## Development Roadmap + +- **Phase 1 (Current)**: Read-only browsing tools for projects, work packages, queries, and taxonomies. +- **Phase 2**: Mutating operations (create/update work packages, add comments, log time). +- **Phase 3**: Attachment reading and document resources. +- **Phase 4**: SSE / Stream transport for remote server deployments. + +--- + +## License + +GNU General Public License v3.0 (aligned with OpenProject Community Edition). \ No newline at end of file diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index c2746c2..557d100 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -183,3 +183,25 @@ Adopt a **fixture-driven test strategy**: - Safe regression detection when updating normalizers or tool handlers. - **Negative**: - Fixtures must be periodically verified when targeting major new OpenProject versions. + +--- + +## ADR-009: Target OpenProject 17 as Primary Runtime and Test Environment + +### Status +Accepted + +### Context +OpenProject 17 is the current major stable release, featuring optimized container images (`17-slim`, ~410MB), modern Rails 7.x foundations, updated API v3 behaviors, and streamlined dependency footprints. + +### Decision +Target **OpenProject 17** (`openproject/openproject:17-slim`) for all containerized local development stacks, automated seeding scripts, and live integration testing environments. + +### Consequences +- **Positive**: + - Aligns MCP server features with the current active OpenProject release. + - Much smaller docker image download footprint compared to older releases (~410MB vs ~865MB). + - Ensured compatibility with the latest API v3 specifications and authentication mechanics. +- **Negative**: + - Ensures we adhere to OpenProject 17's specific cache configuration and host name variables. +