@elixium.ai/mcp-server 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +83 -38
  2. package/dist/index.js +11 -1
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -5,80 +5,125 @@ This server implements the [Model Context Protocol (MCP)](https://modelcontextpr
5
5
  ## Features
6
6
  - **List Stories**: See the current backlog and icebox.
7
7
  - **Create Story**: Add new stories directly from your editor.
8
+ - **Update Story**: Move stories between lanes and update fields.
8
9
  - **Iteration Context**: Provide the AI with the full context of your Current and Backlog lanes for better planning.
9
10
 
10
- ## Setup
11
+ ## Quick Start
11
12
 
12
- ### 1. Install
13
- If you do not have the Elixium codebase, install the MCP server package:
13
+ ### 1. Install (Optional)
14
+ If you want to install the package locally:
14
15
  ```bash
15
- npm install -g @elixium.ai/mcp-server
16
+ npm install -D @elixium.ai/mcp-server@latest
16
17
  ```
17
18
 
18
- Air-gapped/offline install (download the `.tgz` from GitHub Releases first):
19
+ Or install globally:
19
20
  ```bash
20
- npm install -g /path/to/elixium.ai-mcp-server-0.1.0.tgz
21
+ npm install -g @elixium.ai/mcp-server@latest
21
22
  ```
22
23
 
23
- If you are developing from source:
24
- ```bash
25
- cd mcp-server
26
- npm install
27
- npm run build
28
- ```
24
+ > [!TIP]
25
+ > You can also use `npx` to run the server without installing it (recommended for IDE configurations).
29
26
 
30
- ### 2. Authentication (API Key)
31
- Elixium uses a secure, tenant-scoped API key system for external integrations.
27
+ ### 2. Get Your API Key
28
+ Contact your Elixium workspace administrator to obtain an API key for your tenant.
32
29
 
33
- 1. **Request a Key**: Ask your Elixium administrator to create an API key in the `sys_api_keys` collection.
34
- 2. **Scope**: Each key is hardcoded to a specific `tenantId` in the database, ensuring your AI agent only has access to your workspace.
35
- 3. **Board Selection**: Optionally scope the MCP server to a single board by setting `ELIXIUM_BOARD_SLUG`.
30
+ ### 3. Configure Your IDE
31
+ Add the following to your IDE's MCP configuration file (e.g., `mcp_config.json`):
36
32
 
37
- ### 3. Configuration
38
- Add the following to your IDE's MCP configuration (e.g., `mcp_config.json`):
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "elixium": {
37
+ "command": "npx",
38
+ "args": [
39
+ "-y",
40
+ "@elixium.ai/mcp-server@latest"
41
+ ],
42
+ "env": {
43
+ "ELIXIUM_API_KEY": "<YOUR_API_KEY>",
44
+ "ELIXIUM_API_URL": "https://<YOUR_TENANT>.elixium.ai/api",
45
+ "ELIXIUM_BOARD_SLUG": "main"
46
+ }
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ Replace:
53
+ - `<YOUR_API_KEY>` with the API key from your administrator
54
+ - `<YOUR_TENANT>` with your workspace subdomain (e.g., `acme` for `acme.elixium.ai`)
55
+
56
+ ### Multi-MCP Example (Stripe + Elixium)
57
+ If you're using multiple MCP servers, combine them in the same config:
39
58
 
40
59
  ```json
41
60
  {
42
61
  "mcpServers": {
62
+ "stripe": {
63
+ "command": "npx",
64
+ "args": ["-y", "@stripe/mcp", "--tools=all", "--api-key=<STRIPE_KEY>"],
65
+ "env": {}
66
+ },
43
67
  "elixium": {
44
- "command": "elixium-mcp-server",
45
- "args": [],
68
+ "command": "npx",
69
+ "args": ["-y", "@elixium.ai/mcp-server@latest"],
46
70
  "env": {
47
- "ELIXIUM_API_KEY": "your_api_key_here",
48
- "ELIXIUM_API_URL": "https://your-tenant-slug.elixium.ai/api",
49
- "ELIXIUM_BOARD_SLUG": "main",
50
- "ELIXIUM_LANE_STYLE": "upper"
71
+ "ELIXIUM_API_KEY": "<YOUR_API_KEY>",
72
+ "ELIXIUM_API_URL": "https://<YOUR_TENANT>.elixium.ai/api",
73
+ "ELIXIUM_BOARD_SLUG": "main"
51
74
  }
52
75
  }
53
76
  }
54
77
  }
55
78
  ```
56
79
 
80
+ ## Environment Variables
81
+
82
+ | Variable | Required | Description |
83
+ |----------|----------|-------------|
84
+ | `ELIXIUM_API_KEY` | ✅ Yes | Your tenant-scoped API key |
85
+ | `ELIXIUM_API_URL` | ✅ Yes | Your tenant's API endpoint (e.g., `https://acme.elixium.ai/api`) |
86
+ | `ELIXIUM_BOARD_SLUG` | ⚠️ Recommended | Board slug to scope operations (e.g., `main`) |
87
+ | `ELIXIUM_LANE_STYLE` | Optional | `upper` for `BACKLOG/CURRENT` or `title` for `Backlog/Current` (auto-detected) |
88
+
57
89
  > [!IMPORTANT]
58
- > Always use your **Tenant Subdomain** in the `ELIXIUM_API_URL` (e.g., `https://indirecttek.elixium.ai/api`) to ensure the server correctly resolves your workspace context.
59
- >
60
90
  > If you set `ELIXIUM_BOARD_SLUG`, the MCP server will only read/write stories for that board.
61
91
  > The server resolves the board slug to a boardId on startup, so the slug must match an existing board.
62
- >
63
- > `ELIXIUM_LANE_STYLE` is optional. Use `upper` for APIs that store lanes as `CURRENT/BACKLOG`, or `title` for `Current/Backlog`. The server auto-detects when possible.
64
- >
65
- > If you built the MCP server from source, set `command` to `node` and `args`
66
- > to the absolute path of `dist/index.js`.
67
92
 
68
93
  ## Usage
69
- Once configured, your AI agent will have access to tools like `list_stories` and `create_story`. You can use these to groom your backlog or generate implementation plans based on real-time board data.
94
+ Once configured, your AI agent will have access to tools like:
95
+ - `list_stories` - View all stories on the board
96
+ - `create_story` - Add new stories with title, description, lane, and points
97
+ - `update_story` - Move stories between lanes or update fields
98
+ - `list_epics` - View epics on the board
99
+ - `get_iteration_context` - Get current iteration and backlog for planning
70
100
 
71
- ## Maintainers: build a clean release tarball (gh CLI)
72
- This package uses the `files` list in `package.json` to keep the tarball small.
101
+ ## Development (Source Build)
102
+ If you're contributing or developing from source:
73
103
 
74
104
  ```bash
75
105
  cd mcp-server
76
106
  npm install
77
107
  npm run build
78
- npm pack
79
108
  ```
80
109
 
110
+ To use the local build, update your config:
111
+ ```json
112
+ {
113
+ "elixium": {
114
+ "command": "node",
115
+ "args": ["/path/to/mcp-server/dist/index.js"],
116
+ "env": { ... }
117
+ }
118
+ }
119
+ ```
120
+
121
+ ## Maintainers: Release Process
122
+
81
123
  ```bash
82
- gh release create mcp-server-v0.1.0 elixium.ai-mcp-server-0.1.0.tgz \
83
- -t "MCP Server v0.1.0" -n "Air-gapped install artifact"
124
+ cd mcp-server
125
+ npm install
126
+ npm run build
127
+ npm version patch # or minor/major
128
+ npm publish --access public
84
129
  ```
package/dist/index.js CHANGED
@@ -332,6 +332,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
332
332
  type: "string",
333
333
  description: "Learning outcome summary",
334
334
  },
335
+ acceptanceCriteria: {
336
+ type: "string",
337
+ description: "Acceptance criteria in Given/When/Then format",
338
+ },
335
339
  },
336
340
  required: ["storyId"],
337
341
  },
@@ -437,13 +441,19 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
437
441
  }
438
442
  case "update_story": {
439
443
  const args = request.params.arguments;
440
- const { storyId, lane, ...rest } = args;
444
+ const { storyId, lane, state, ...rest } = args;
441
445
  if (!storyId) {
442
446
  throw new Error("storyId is required");
443
447
  }
448
+ // Guardrail: Block AI from setting accepted/rejected states (human-in-the-loop)
449
+ const blockedStates = ["accepted", "rejected"];
450
+ if (state && blockedStates.includes(state.toLowerCase())) {
451
+ throw new Error(`Cannot set state to "${state}". Acceptance decisions require human review.`);
452
+ }
444
453
  const normalizedLane = await normalizeLane(lane);
445
454
  const payload = Object.fromEntries(Object.entries({
446
455
  ...rest,
456
+ ...(state ? { state } : {}),
447
457
  ...(normalizedLane ? { lane: normalizedLane } : {}),
448
458
  }).filter(([, value]) => value !== undefined));
449
459
  const response = await client.patch(`/stories/${storyId}`, payload);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elixium.ai/mcp-server",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "MCP Server for Elixium.ai",
6
6
  "publishConfig": {
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "main": "dist/index.js",
15
15
  "bin": {
16
- "elixium-mcp-server": "./dist/index.js"
16
+ "elixium-mcp-server": "dist/index.js"
17
17
  },
18
18
  "scripts": {
19
19
  "build": "tsc",