{"_id":"@0xkillaflow/agama-redmine-mcp","_rev":"3-231b7db78bfa08223cc52895ce5fc90e","name":"@0xkillaflow/agama-redmine-mcp","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@0xkillaflow/agama-redmine-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","redmine","ai","agent","llm","project-management","issue-tracker","stdio"],"license":"MIT","_id":"@0xkillaflow/agama-redmine-mcp@1.0.0","maintainers":[{"name":"0xkillaflow","email":"killaflow0x@icloud.com"}],"homepage":"https://github.com/0xkillaflow/agama-redmine-mcp#readme","bugs":{"url":"https://github.com/0xkillaflow/agama-redmine-mcp/issues"},"bin":{"agama-redmine-mcp":"dist/index.js"},"dist":{"shasum":"3983e08aa03de2dbc1b8796e685ddefb9f85566e","tarball":"https://registry.npmjs.org/@0xkillaflow/agama-redmine-mcp/-/agama-redmine-mcp-1.0.0.tgz","fileCount":6,"integrity":"sha512-55aHm8bf44uoe346z7l0XNqj9LC0d0S5ywnderKwKk7F4roa2pG9x+M57KFtlnKLDjl5IxFMffacNPtxy8zwnA==","signatures":[{"sig":"MEUCIQDFT5sU3Q0UPywMtClsZq/1l+nivi+emr1/1NoSr3lonAIgPBmcB1vz0IDytw+LFQ3KSkO04iiXWtnm2czZYplqywE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243123},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"e2a6bb9e515836754afe1570b07ca5310632e0e5","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","test":"vitest run","build":"tsup","format":"prettier --write .","release":"npm run build && changeset publish","version":"changeset version","coverage":"vitest run --coverage","changeset":"changeset","gen:tools":"tsx scripts/gen-tools-doc.ts","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","prepublishOnly":"npm run build","gen:tools:check":"tsx scripts/gen-tools-doc.ts --check"},"_npmUser":{"name":"0xkillaflow","email":"killaflow0x@icloud.com"},"repository":{"url":"git+https://github.com/0xkillaflow/agama-redmine-mcp.git","type":"git"},"_npmVersion":"11.6.2","description":"Model Context Protocol (MCP) server for Redmine — exposes Redmine to AI agents as a small set of intent-shaped, well-typed tools.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"zod":"3.25.76","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.23.1","tsup":"8.5.1","eslint":"9.39.5","vitest":"4.1.10","prettier":"3.9.5","typescript":"5.9.3","@types/node":"20.19.43","@changesets/cli":"2.31.0","typescript-eslint":"8.64.0","@vitest/coverage-v8":"4.1.10","eslint-plugin-import":"2.32.0","eslint-import-resolver-typescript":"4.4.5"},"_npmOperationalInternal":{"tmp":"tmp/agama-redmine-mcp_1.0.0_1784651683803_0.21463303450756976","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@0xkillaflow/agama-redmine-mcp","version":"2.0.0","keywords":["mcp","model-context-protocol","redmine","ai","agent","llm","project-management","issue-tracker","stdio"],"license":"MIT","_id":"@0xkillaflow/agama-redmine-mcp@2.0.0","maintainers":[{"name":"0xkillaflow","email":"killaflow0x@icloud.com"}],"homepage":"https://github.com/0xkillaflow/agama-redmine-mcp#readme","bugs":{"url":"https://github.com/0xkillaflow/agama-redmine-mcp/issues"},"bin":{"agama-redmine-mcp":"dist/index.js"},"dist":{"shasum":"7a0e0a50628fbcec3d207ffd8f24cf185d61a403","tarball":"https://registry.npmjs.org/@0xkillaflow/agama-redmine-mcp/-/agama-redmine-mcp-2.0.0.tgz","fileCount":6,"integrity":"sha512-PAYTKEEsv4ejE7NQ4UjoieWEIyyFQ0DnWeKSyXeGJ30jbx4fpxrYhYkCqxaYjcTZxSit0K7CSyhh4VK97wobNQ==","signatures":[{"sig":"MEUCIQDx7t98XmkqcrWMLUx9kp7Bt+xJy3Wi9USVRBdKqp0s1QIgZtfSVyWGzkB0SqsRKZqdckmjVjcAYdpXAm6mmGB3kFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@0xkillaflow%2fagama-redmine-mcp@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":239363},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"a7e2f5d394428c35fe768f3c0d8e645daa08a6ab","scripts":{"dev":"tsx watch src/index.ts","lint":"eslint .","test":"vitest run","build":"tsup","format":"prettier --write .","release":"npm run build && changeset publish","version":"changeset version","coverage":"vitest run --coverage","changeset":"changeset","gen:tools":"tsx scripts/gen-tools-doc.ts","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","prepublishOnly":"npm run build","gen:tools:check":"tsx scripts/gen-tools-doc.ts --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0a6d32e-05b4-4c8b-8cc6-8595a42e0d4e"}},"repository":{"url":"git+https://github.com/0xkillaflow/agama-redmine-mcp.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol (MCP) server for Redmine — exposes Redmine to AI agents as a small set of intent-shaped, well-typed tools.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"4.4.3","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.23.1","tsup":"8.5.1","eslint":"10.7.0","vitest":"4.1.10","prettier":"3.9.6","typescript":"6.0.3","@types/node":"22.20.1","@changesets/cli":"2.31.1","typescript-eslint":"8.65.0","@vitest/coverage-v8":"4.1.10","eslint-plugin-import-x":"4.17.1","eslint-import-resolver-typescript":"4.4.5"},"_npmOperationalInternal":{"tmp":"tmp/agama-redmine-mcp_2.0.0_1784946220686_0.633668908069108","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@0xkillaflow/agama-redmine-mcp","version":"2.1.0","description":"Model Context Protocol (MCP) server for Redmine — exposes Redmine to AI agents as a small set of intent-shaped, well-typed tools.","keywords":["mcp","model-context-protocol","redmine","ai","agent","llm","project-management","issue-tracker","stdio"],"license":"MIT","type":"module","engines":{"node":">=22"},"bin":{"agama-redmine-mcp":"dist/index.js"},"main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/0xkillaflow/agama-redmine-mcp.git"},"homepage":"https://github.com/0xkillaflow/agama-redmine-mcp#readme","bugs":{"url":"https://github.com/0xkillaflow/agama-redmine-mcp/issues"},"publishConfig":{"access":"public","provenance":true},"scripts":{"build":"tsup","dev":"tsx watch src/index.ts","test":"vitest run","test:watch":"vitest","coverage":"vitest run --coverage","lint":"eslint .","format":"prettier --write .","format:check":"prettier --check .","typecheck":"tsc --noEmit","gen:tools":"tsx scripts/gen-tools-doc.ts","gen:tools:check":"tsx scripts/gen-tools-doc.ts --check","changeset":"changeset","version":"changeset version","release":"npm run build && changeset publish","prepublishOnly":"npm run build"},"dependencies":{"@modelcontextprotocol/sdk":"1.29.0","zod":"4.4.3"},"devDependencies":{"@changesets/cli":"2.31.1","@types/node":"22.20.1","@vitest/coverage-v8":"4.1.10","eslint":"10.7.0","eslint-import-resolver-typescript":"4.4.5","eslint-plugin-import-x":"4.17.1","prettier":"3.9.6","tsup":"8.5.1","tsx":"4.23.1","typescript":"6.0.3","typescript-eslint":"8.65.0","vitest":"4.1.10"},"gitHead":"2a1edb2ca0774fdb6e91ade73bf99c706f69c609","_id":"@0xkillaflow/agama-redmine-mcp@2.1.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-L9UWUirQKv3dugZsjx1s6KdGJS1CKSxn2FZyeU0aGsiUjXjIo5VgsXrRczSe77iQmlVXAW51/7SSoHn6nNTdGQ==","shasum":"b273a79792e8e30a0cd74c8cea2a458b4e674f76","tarball":"https://registry.npmjs.org/@0xkillaflow/agama-redmine-mcp/-/agama-redmine-mcp-2.1.0.tgz","fileCount":6,"unpackedSize":353831,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@0xkillaflow%2fagama-redmine-mcp@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBGB8C+qdhMIytqarxlh87lj0Nzd1GXagA8BDSxWtA1WAiBCbhNwjQSiCJZ+9SA2YkyFuIy5bjWVCzhfNcEz5bb2FQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0a6d32e-05b4-4c8b-8cc6-8595a42e0d4e"}},"directories":{},"maintainers":[{"name":"0xkillaflow","email":"killaflow0x@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agama-redmine-mcp_2.1.0_1785251885072_0.6864140262582505"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T16:34:43.700Z","modified":"2026-07-28T15:18:05.543Z","1.0.0":"2026-07-21T16:34:43.941Z","2.0.0":"2026-07-25T02:23:40.850Z","2.1.0":"2026-07-28T15:18:05.217Z"},"bugs":{"url":"https://github.com/0xkillaflow/agama-redmine-mcp/issues"},"license":"MIT","homepage":"https://github.com/0xkillaflow/agama-redmine-mcp#readme","keywords":["mcp","model-context-protocol","redmine","ai","agent","llm","project-management","issue-tracker","stdio"],"repository":{"type":"git","url":"git+https://github.com/0xkillaflow/agama-redmine-mcp.git"},"description":"Model Context Protocol (MCP) server for Redmine — exposes Redmine to AI agents as a small set of intent-shaped, well-typed tools.","maintainers":[{"name":"0xkillaflow","email":"killaflow0x@icloud.com"}],"readme":"# 🦎 Agama — Redmine MCP Server\n\n[MCP server](https://modelcontextprotocol.io/) for Redmine. Enables AI agents to work with issues using simple natural language commands.\n\nWorks just as well as a personal tool for a single developer — or deployed once and shared by the\nwhole team.\n\n```plaintxt\n┌──────────┐   MCP (stdio)   ┌─────────────────────┐   REST/JSON   ┌──────────┐\n│  Agent   │ ──────────────▶ │  Redmine MCP Server │ ────────────▶ │ Redmine  │\n│ (client) │ ◀────────────── │   (this project)    │ ◀──────────── │  server  │\n└──────────┘   tool results  └─────────────────────┘     HTTP      └──────────┘\n```\n\n## 💬 Just ask\n\n> \"What issues are assigned to me? Sort them by priority.\"\n\n> \"Create a bug in the Web project: login button doesn't respond on mobile, mark it urgent.\"\n\n> \"Summarize issue #456 and all its subtasks.\"\n\n> \"How many hours did I log this week, broken down by project?\"\n\n## Requirements\n\n- Node.js 22+\n- A Redmine instance with the REST API enabled (_Administration → Settings → API_)\n- A Redmine API key — go to **My account → API access key** while signed in\n\n## Quick start\n\nMost MCP clients (e.g. Claude Desktop) launch the server for you — configure it once and forget it:\n\n```json\n{\n  \"mcpServers\": {\n    \"redmine\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@0xkillaflow/agama-redmine-mcp\"],\n      \"env\": {\n        \"REDMINE_URL\": \"https://redmine.example.com\",\n        \"REDMINE_API_KEY\": \"your-redmine-api-key\"\n      }\n    }\n  }\n}\n```\n\nFor Claude Desktop, this goes in `claude_desktop_config.json` (**Settings → Developer → Edit\nConfig**). Restart the client and the Redmine tools will appear in its tool list.\n\nTo run it standalone from a shell instead:\n\n```bash\nREDMINE_URL=https://redmine.example.com REDMINE_API_KEY=your-redmine-api-key \\\n  npx -y @0xkillaflow/agama-redmine-mcp\n```\n\nThe server speaks MCP over stdio and logs to stderr, so stdout stays clean for the protocol.\n\n## Configuration\n\nSet via environment variables, validated at startup. See [`.env.example`](./.env.example) for a\ntemplate.\n\n| Variable                      | Required | Default | Purpose                                  |\n| ----------------------------- | -------- | ------- | ---------------------------------------- |\n| `REDMINE_URL`                 | yes      | —       | Base URL of the Redmine instance         |\n| `REDMINE_API_KEY`             | yes      | —       | API key for the acting user              |\n| `REDMINE_TIMEOUT_MS`          | no       | `30000` | Per-request timeout in milliseconds      |\n| `REDMINE_ALLOWED_DIRECTORIES` | no       | _empty_ | Directories the attachment tools may use |\n| `LOG_LEVEL`                   | no       | `info`  | `debug` \\| `info` \\| `warn` \\| `error`   |\n| `MCP_TRANSPORT`               | no       | `stdio` | `stdio` (only supported mode today)      |\n\n### File access (`REDMINE_ALLOWED_DIRECTORIES`)\n\nThe attachment tools are the only ones that touch your filesystem, and they may\nonly touch it inside this allowlist — a `:`-separated list of absolute directories\n(`;` on Windows). It governs **both** directions: reads for\n`redmine_upload_attachment` and writes for `redmine_download_attachment`.\n\n```bash\nREDMINE_ALLOWED_DIRECTORIES=/Users/you/redmine-files:/tmp/redmine-downloads\n```\n\n**It defaults to empty, which means no local file access at all** — both tools\nrefuse every path until you opt in. That default is deliberate: an agent that can\nbe talked into uploading a file is an agent that can be talked into uploading\n`~/.ssh/id_rsa` or the `.env` holding your API key. Allowlist the narrowest\ndirectory that does the job. Paths are fully resolved (`..` segments and symlinks\nincluded) before the check, so a symlink inside an allowed directory cannot point\nout of it, and downloads never overwrite an existing file.\n\n## Tools\n\nNineteen intent-shaped tools, each tagged with MCP safety annotations. Full reference:\n[`docs/tools.md`](./docs/tools.md).\n\n| Tool                            | Kind                | Description                                                 |\n| ------------------------------- | ------------------- | ----------------------------------------------------------- |\n| `redmine_list_issues`           | read                | Search/filter issues by status, assignee, tracker, dates…   |\n| `redmine_get_issue`             | read                | Full issue detail, optionally with journals and attachments |\n| `redmine_create_issue`          | write               | Create an issue                                             |\n| `redmine_update_issue`          | write               | Edit an issue's status, assignee, notes…                    |\n| `redmine_delete_issue`          | write · destructive | Permanently delete an issue — no undo, cascades             |\n| `redmine_manage_issue_watchers` | write               | Add/remove a watcher (notification subscription)            |\n| `redmine_list_issue_relations`  | read                | Dependency links of an issue, or one relation by its id     |\n| `redmine_create_issue_relation` | write               | Link two issues (blocks, precedes, duplicates, relates…)    |\n| `redmine_delete_issue_relation` | write · destructive | Remove one link — narrow in scope and reversible            |\n| `redmine_search`                | read                | Free-text search across issues, wiki, news, projects        |\n| `redmine_list_projects`         | read                | List visible projects                                       |\n| `redmine_get_project`           | read                | Full project detail, trackers/categories/activities         |\n| `redmine_list_time_entries`     | read                | Query logged time                                           |\n| `redmine_create_time_entry`     | write               | Log hours against an issue or project                       |\n| `redmine_get_current_user`      | read                | \"Who am I\" — the API key's user, memberships, groups        |\n| `redmine_list_users`            | read                | Find users by name/status/group — admin-gated on most sites |\n| `redmine_list_reference_data`   | read                | Statuses, trackers, priorities, activities, doc categories  |\n| `redmine_upload_attachment`     | write               | Upload a local file → token for an issue's `uploads` array  |\n| `redmine_download_attachment`   | write               | Save an attachment to a local directory (writes to disk)    |\n\n> **Heads up:** `redmine_delete_issue` is the tool that destroys data — Redmine has no trash, and\n> the delete takes the issue's comments, time entries, attachments, and relations with it. It is\n> annotated `destructiveHint: true` so an MCP client can require confirmation; if your client does\n> not gate on that, treat every call as final. `redmine_delete_issue_relation` carries the same\n> annotation but is far narrower: it removes one link between two issues, and\n> `redmine_create_issue_relation` puts it back in a single call.\n\n> **Heads up:** on write, Redmine silently ignores an unknown `tracker_id`, `status_id`, or\n> `fixed_version_id` instead of erroring — always check the returned issue. The same applies to\n> `is_private`, which is silently dropped if your role lacks the \"set public/private\" permission.\n\n## Security\n\nThe server runs locally and acts as a single user: your `REDMINE_API_KEY` never leaves your\nmachine except as a request header to your own Redmine instance, and the server can do nothing\nyour account couldn't already do. Multi-user HTTP transport is planned but not yet implemented —\nselecting `MCP_TRANSPORT=http` exits with a clear error.\n\nLocal file access is off by default and confined to\n[`REDMINE_ALLOWED_DIRECTORIES`](#file-access-redmine_allowed_directories) when you enable it. Nothing\nelse in the server reads or writes your filesystem.\n\n## Troubleshooting\n\n| Symptom                      | Likely cause                                                         |\n| ---------------------------- | -------------------------------------------------------------------- |\n| Client shows no tools        | Something besides JSON-RPC is writing to stdout — check any wrapper  |\n| Exits immediately on startup | A required env var is missing or invalid; the error names it         |\n| `401 Unauthorized`           | API key missing/wrong, or REST API disabled on the Redmine side      |\n| `403 Forbidden`              | The key's user lacks permission for that action                      |\n| `404 Not Found`              | The id doesn't exist or isn't visible to the key                     |\n| `422 Unprocessable Entity`   | Redmine rejected the write — check the field-level messages returned |\n\n## Documentation\n\n- [`docs/architecture.md`](./docs/architecture.md) — design and request lifecycle\n- [`docs/tools.md`](./docs/tools.md) — generated per-tool reference\n- [`docs/adding-a-tool.md`](./docs/adding-a-tool.md) — recipe for adding a new tool\n- [`CONTRIBUTING.md`](./CONTRIBUTING.md) — dev setup and contribution guide\n\n## Development\n\n```bash\nnpm install       # install dependencies\nnpm run dev       # watch-run the stdio server\nnpm test          # run the test suite\nnpm run build     # bundle to dist/\n```\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}