@itm-platform/mcp-server 1.0.0 → 1.0.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/LICENSE +21 -0
  2. package/README.md +186 -140
  3. package/package.json +12 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ITM Platform
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,193 +1,239 @@
1
- # ITM.MCP
1
+ # ITM Platform MCP Server
2
2
 
3
- > For cross-cutting documentation (debugging, database schema, environments, API versioning, build commands), see the [parent README](../README.md#documentation-index).
3
+ Connect ITM Platform to AI assistants through the [Model Context Protocol](https://modelcontextprotocol.io). The ITM Platform MCP server lets MCP-compatible clients search projects, inspect budgets, summarize portfolio health, create tasks, log risks and issues, and update project details using your ITM Platform permissions.
4
4
 
5
- MCP (Model Context Protocol) server for ITM Platform. Exposes project management data to AI assistants -- Claude, ChatGPT, VS Code Copilot, Cursor, JetBrains -- through a universal open protocol.
5
+ It works with Claude, VS Code, Cursor, OpenAI Codex, Windsurf, JetBrains AI Assistant, and any other client that supports MCP.
6
6
 
7
- **Status:** Phase 2 in progress -- 20 tools (15 read + 5 write), 6 resources, 4 prompts. OAuth scope enforcement, audit logging, and token exchange in place. 137 unit tests, 23 E2E tests.
7
+ - Public docs: [developers.itmplatform.com/mcp](https://developers.itmplatform.com/mcp/)
8
+ - npm package: [@itm-platform/mcp-server](https://www.npmjs.com/package/@itm-platform/mcp-server)
9
+ - Hosted MCP URL: `https://api.itmplatform.com/v2/_/mcp/`
8
10
 
9
- See [House Rules](../House-rules.md) for coding conventions.
11
+ ## Quick Start
10
12
 
11
- ## How it works
13
+ ### Hosted connection with OAuth
12
14
 
13
- MCP is a JSON-RPC 2.0 protocol that lets AI assistants discover and call tools on external servers. The server supports two transports:
14
-
15
- - **HTTP + OAuth (recommended)** -- AI clients connect to a hosted URL and authenticate via OAuth 2.1 (PKCE). No local install needed.
16
- - **stdio** -- AI clients spawn the server as a local child process. Auth via API key.
15
+ Use the hosted server if your AI client supports remote MCP servers. There is nothing to install: add the URL, sign in with your ITM Platform account, and approve the requested access.
17
16
 
17
+ ```bash
18
+ claude mcp add --scope user --transport http itm-platform https://api.itmplatform.com/v2/_/mcp/
18
19
  ```
19
- AI Client (Claude, Cursor, VS Code, Codex...)
20
- |
21
- | HTTP (remote) or stdio (local)
22
- v
23
- ITM.MCP Server
24
- | authenticates as the user, calls ITM APIs
25
- v
26
- ITM.API Gateway --> DataMart (GraphQL) + v2 REST (users, reference data)
20
+
21
+ For other MCP clients, use this remote URL:
22
+
23
+ ```text
24
+ https://api.itmplatform.com/v2/_/mcp/
27
25
  ```
28
26
 
29
- **Key point:** The AI model never sees user credentials. Auth is handled by the MCP server. The model only sees tool names, descriptions, and results.
27
+ OAuth is the recommended setup for most users because your AI client never sees your ITM Platform password or API key.
30
28
 
31
- ### Three MCP primitives
29
+ After adding the server, open your AI client, type `/mcp` where slash commands are supported, select `itm-platform`, and complete the ITM Platform OAuth login when prompted.
32
30
 
33
- | Primitive | Who controls it | What it does | Example |
34
- |-----------|----------------|--------------|---------|
35
- | **Tools** | AI model decides when to call | Executable read/write operations | `search_projects`, `get_project_budget` |
36
- | **Resources** | Client app loads as context | Read-only reference data (schemas, docs) | `itm://schema/component` |
37
- | **Prompts** | User triggers a workflow template | Pre-composed multi-tool request | `/project_status` fetches project + tasks + risks + budget in one shot |
31
+ ### Local connection with an API key
38
32
 
39
- ## Quick start
33
+ Use the npm package if you prefer to run the server locally, work behind a firewall, or need to connect to a self-hosted ITM Platform instance.
40
34
 
41
35
  ```bash
42
- npm install
43
- cp .env.sample .env # edit with your credentials
44
- npm test # unit tests (124 tests)
45
- npm run build # compile TypeScript to dist/
46
- npm run dev # HTTP dev server on port 6170 (for testing with curl)
47
- npm run test:e2e # E2E tests (requires local ITM.API + DataMart)
36
+ npx @itm-platform/mcp-server
48
37
  ```
49
38
 
50
- ## End-user setup
39
+ Your MCP client must pass these environment variables to the server:
40
+
41
+ | Variable | Value |
42
+ |----------|-------|
43
+ | `ITM_API_URL` | `https://api.itmplatform.com` |
44
+ | `ITM_COMPANY` | Your company/account slug |
45
+ | `ITM_API_KEY` | Your personal API key from ITM Platform |
46
+
47
+ Example stdio configuration:
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "itm-platform": {
53
+ "command": "npx",
54
+ "args": ["@itm-platform/mcp-server"],
55
+ "env": {
56
+ "ITM_API_URL": "https://api.itmplatform.com",
57
+ "ITM_COMPANY": "{your-account}",
58
+ "ITM_API_KEY": "your-api-key"
59
+ }
60
+ }
61
+ }
62
+ }
63
+ ```
51
64
 
52
- For end-user setup instructions (OAuth, per-client configuration, npm package), see the [APIDocs site](APIDocs/).
65
+ To create an API key, log in to ITM Platform, open **My Profile**, and generate a key from the **API Key** section.
53
66
 
54
- **Quick connect (OAuth):**
67
+ After configuring the local server, restart your AI client and use `/mcp` or the client's MCP server list to confirm `itm-platform` is connected.
55
68
 
56
- ```bash
57
- claude mcp add --scope user --transport http itm-platform https://api.itmplatform.com/v2/_/mcp/
58
- ```
69
+ ## What Can an Agent Do?
59
70
 
60
- **Quick connect (npm, local):**
71
+ From simple lookups to fully automated cross-system workflows, MCP unlocks progressively more powerful use cases.
61
72
 
62
- ```bash
63
- claude mcp add --scope user itm-platform -- npx @itm-platform/mcp-server
64
- ```
73
+ **Quick lookup** -- Ask a question, get an answer:
65
74
 
66
- ## Server configuration (development / deployment)
75
+ > "What risks are open across my portfolio?"
67
76
 
68
- | Variable | Stdio | HTTP+OAuth | Description |
69
- |----------|-------|------------|-------------|
70
- | `ITM_API_URL` | Required | Required | ITM.API base URL |
71
- | `ITM_COMPANY` | Required | -- | Company/tenant slug |
72
- | `ITM_API_KEY` | Required* | -- | Per-user API key (generate from My Profile) |
73
- | `ITM_TOKEN` | Required* | -- | Session token (alternative to API key) |
74
- | `PORT` | -- | Required | HTTP listen port |
75
- | `ITM_AUTH_URL` | -- | Required | Internal OAuth authorization server URL (used for token exchange) |
76
- | `ITM_AUTH_PUBLIC_URL` | -- | Required* | Public OAuth URL advertised to AI clients. Falls back to `ITM_AUTH_URL` |
77
- | `MCP_SERVER_URL` | -- | Required | MCP server public URL (OAuth audience) |
78
- | `LOG_LEVEL` | Optional | Optional | Pino log level: `debug`, `info`, `warn`, `error` (default: `info`) |
79
- | `ITM_AUDIT_ENABLED` | Optional | Optional | Enable audit logging to ITM backend |
77
+ **Multi-step analysis** -- The agent chains multiple tools and synthesizes results:
80
78
 
81
- \* One of `ITM_API_KEY` or `ITM_TOKEN` is required for stdio mode.
79
+ > "Review every project ending this quarter. Flag any with budget overruns, open high-impact risks, or task completion below 60%."
82
80
 
83
- In HTTP mode, if both `ITM_AUTH_URL` and `MCP_SERVER_URL` are set, OAuth is mandatory and every session must provide a Bearer token. If either is missing, the server runs in dev mode using the startup identity.
81
+ **Automated bulk actions** -- The agent reads, decides, and writes across projects:
84
82
 
85
- On deployed environments, `ITM_AUTH_URL` points to `localhost` for internal server-to-server token exchange. `ITM_AUTH_PUBLIC_URL` must be set to the public URL so AI clients can discover the OAuth authorization server.
83
+ > "For every project still in Planning status with a start date in the past, update the status to Execution and create a kick-off checklist task assigned to the project manager."
86
84
 
87
- ## Tools (Phase 1 -- read-only)
85
+ **Scheduled intelligence** -- An agent runs on a schedule with no human prompt, pulling overdue tasks every Monday and posting a summary to Slack grouped by project manager.
88
86
 
89
- ### DataMart-backed (fast, single-query reads)
87
+ **Cross-system orchestration** -- Combine ITM Platform's MCP with other MCP servers (GitHub, Slack, Google Calendar, email). When a developer merges a PR, an agent finds the matching ITM Platform task, marks it complete, and if the project hits 100%, drafts a closure summary and emails the program manager.
90
88
 
91
- | Tool | Description |
92
- |------|-------------|
93
- | `search_projects` | Find projects by name, status, type, date range |
94
- | `search_services` | Find services by name, status, type, date range |
95
- | `get_project` | Full project details with optional subcomponents (tasks, risks, budget, etc.) |
96
- | `get_service` | Full service details with optional subcomponents |
97
- | `list_project_tasks` | Tasks for a project |
98
- | `get_project_risks` | Risks for a project |
99
- | `get_project_issues` | Issues for a project |
100
- | `get_project_budget` | Budget summary (top-down, bottom-up, actual, period-end close) |
101
- | `get_project_purchases` | Purchase orders for a project |
102
- | `get_project_revenues` | Revenue items for a project |
103
- | `aggregate_portfolio` | Portfolio analytics -- group, count, sum, avg across all projects |
104
- | `query_datamart` | Raw DataMart query for advanced analysis (validated, safe operators only) |
89
+ The MCP server authenticates as you, calls ITM Platform APIs, and returns only the data your ITM Platform account is allowed to access.
105
90
 
106
- ### v2 REST-backed (users, reference data)
91
+ ## Capabilities
107
92
 
108
- | Tool | Description |
109
- |------|-------------|
110
- | `search_users` | Find team members |
111
- | `get_user` | User details |
112
- | `get_reference_data` | Status lists, types, priorities for any entity |
93
+ The server exposes 20 MCP tools, 6 resources, and 4 prompt templates.
113
94
 
114
- ### Write tools (Phase 2 -- v2 REST-backed)
95
+ ### Read Tools
115
96
 
116
- | Tool | Description |
117
- |------|-------------|
118
- | `create_task` | Create a new task in a project |
119
- | `update_task` | PATCH task fields (status, dates, assignee, progress) |
120
- | `create_risk` | Log a new risk in a project |
121
- | `create_issue` | Log a new issue in a project |
122
- | `update_project` | PATCH project fields (name, status, dates, priority) |
97
+ | Tool | What it does |
98
+ |------|--------------|
99
+ | `search_projects` | Find projects by name, status, type, or date range |
100
+ | `get_project` | Retrieve project details, including optional tasks, risks, issues, budget, purchases, and revenues |
101
+ | `search_services` | Find services by name, status, type, or date range |
102
+ | `get_service` | Retrieve service details |
103
+ | `list_project_tasks` | List tasks for a project |
104
+ | `get_project_budget` | Get budget, actuals, revenue, cost, and margin information |
105
+ | `get_project_purchases` | List purchase orders for a project |
106
+ | `get_project_revenues` | List revenue items for a project |
107
+ | `get_project_risks` | List project risks |
108
+ | `get_project_issues` | List project issues |
109
+ | `aggregate_portfolio` | Group and summarize portfolio data |
110
+ | `query_datamart` | Run validated DataMart queries for advanced analysis |
111
+ | `search_users` | Find users and team members |
112
+ | `get_user` | Retrieve user details |
113
+ | `get_reference_data` | Retrieve statuses, types, priorities, and other reference lists |
123
114
 
124
- Write tools return confirmed state from v2 REST (source of truth). Subsequent DataMart reads may lag 5-60 seconds due to eventual consistency -- this is noted in every write response.
115
+ ### Write Tools
125
116
 
126
- ## Prompts
117
+ | Tool | What it does |
118
+ |------|--------------|
119
+ | `create_task` | Add a task to a project |
120
+ | `update_task` | Update task fields such as status, dates, assignee, and progress |
121
+ | `create_risk` | Log a project risk |
122
+ | `create_issue` | Log a project issue |
123
+ | `update_project` | Update project fields such as name, status, dates, and priority |
127
124
 
128
- Workflow templates the user can trigger. The MCP server returns a pre-composed message that instructs the AI to call the right tools.
125
+ Write operations confirm the saved state from the ITM Platform REST API. DataMart-backed search results may take up to 60 seconds to reflect recent writes.
129
126
 
130
- | Prompt | What it does |
131
- |--------|-------------|
132
- | `/project_status` | Fetches project + tasks + risks + budget, asks AI to summarize |
133
- | `/portfolio_overview` | Aggregates projects by status/methodology/budget, asks AI for health overview |
134
- | `/team_workload` | Fetches users + assignments, asks AI for workload analysis |
135
- | `/risk_analysis` | Fetches risks + issues + budget, asks AI for risk assessment |
127
+ ### Resources and Prompts
136
128
 
137
- ## Architecture
129
+ Resources give AI clients read-only context such as DataMart schemas and project calendars. Prompt templates provide guided workflows for common analysis tasks:
138
130
 
139
- ```
140
- src/
141
- server.ts # MCP server bootstrap (stdio + HTTP, per-session auth)
142
- instrument-server.ts # Tool-call logging + audit wrapper (wraps registerTool)
143
- logger.ts # Pino logger factory (stderr + rotating file in logs/mcp.log)
144
- auth/
145
- effective-user-context.ts # User identity type
146
- api-key-auth.ts # API key auth, calls /resolve/identity
147
- license-resolver.ts # License type -> access level
148
- oauth-auth.ts # Phase 2: OAuth token exchange
149
- oauth-metadata.ts # Phase 2: /.well-known/oauth-protected-resource
150
- token-extraction.ts # Bearer token extraction from headers
151
- clients/
152
- datamart-client.ts # DataMart GraphQL through gateway
153
- rest-client.ts # v2 REST through gateway (GET, POST, PATCH)
154
- audit-client.ts # Phase 2: audit logging (fire-and-forget)
155
- tools/ # One file per tool group
156
- write-tools.ts # Phase 2: create/update tools (task, risk, issue, project)
157
- resources/ # Schema + calendar resources
158
- prompts/ # Workflow templates
159
- validation/
160
- query-validator.ts # Allowlist of safe MongoDB operators
161
- ```
131
+ | Prompt | What it helps with |
132
+ |--------|--------------------|
133
+ | `/project_status` | Summarize health, tasks, risks, issues, and budget for one project |
134
+ | `/portfolio_overview` | Analyze portfolio status, methodology, budget, and delivery patterns |
135
+ | `/team_workload` | Review assignments and workload patterns |
136
+ | `/risk_analysis` | Assess risk exposure, issues, and budget impact |
137
+
138
+ ## Authentication and Permissions
139
+
140
+ The MCP server uses the same identity and permission model as ITM Platform.
141
+
142
+ | Connection method | Authentication | Best for |
143
+ |-------------------|----------------|----------|
144
+ | Hosted HTTP | OAuth 2.1 with PKCE | Most users and managed AI clients |
145
+ | Local stdio | ITM Platform API key | Local execution, firewalled networks, self-hosted environments |
146
+
147
+ OAuth sessions use scopes:
148
+
149
+ | Scope | Allows |
150
+ |-------|--------|
151
+ | `mcp:read` | Read-only tools such as search, get, list, aggregate, and query |
152
+ | `mcp:write` | Read tools plus create and update tools |
153
+
154
+ API key sessions use the full permissions of the ITM Platform user who generated the key.
162
155
 
163
- ## Access control
156
+ License access:
164
157
 
165
- | License type | Access |
166
- |-------------|--------|
167
- | CompanyAdmin | Full |
168
- | FullUser | Full |
169
- | ProjectManager | Blocked in Phase 1 (requires gateway PM-scope injection -- Phase 2) |
170
- | TeamMember | Blocked |
158
+ | License | MCP access |
159
+ |---------|------------|
160
+ | Company Admin | Full read and write access |
161
+ | Full User | Full read and write access |
162
+ | Project Manager | Not yet available |
163
+ | Team Member | Blocked |
171
164
 
172
- **OAuth scope enforcement:** OAuth sessions respect granted scopes. Sessions with `mcp:read` only see 15 read tools; `mcp:write` is required to see and use write tools. API-key/stdio sessions get all tools unconditionally (backward compatible).
165
+ Your AI assistant does not receive your ITM Platform password or API key. Project data is returned to the AI client you choose, so the AI provider's data-handling policy applies to any data it processes.
173
166
 
174
- ## Logging
167
+ ## Client Setup
175
168
 
176
- Uses [Pino](https://getpino.io/) (same as DataMart and MSTeamsBot). Logs go to two destinations:
169
+ Use the public docs for client-specific setup:
177
170
 
178
- - **stderr** -- pretty-printed, colorized (stdout is reserved for the MCP JSON-RPC protocol)
179
- - **`logs/mcp.log`** -- rotating file relative to the MCP application root, 10 MB max, keeps 5 old files (skipped in test)
171
+ - [Claude Code, Claude Desktop, VS Code, Cursor, Codex, Windsurf, and JetBrains](https://developers.itmplatform.com/mcp/#ai-clients)
172
+ - [Connect with OAuth](https://developers.itmplatform.com/mcp/#setup-oauth)
173
+ - [Connect with an API key](https://developers.itmplatform.com/mcp/#setup-stdio)
174
+ - [Troubleshooting](https://developers.itmplatform.com/mcp/#troubleshooting)
175
+
176
+ For any MCP-compatible client, the two connection values are:
177
+
178
+ | Method | Value |
179
+ |--------|-------|
180
+ | Remote URL | `https://api.itmplatform.com/v2/_/mcp/` |
181
+ | Local command | `npx @itm-platform/mcp-server` |
182
+
183
+ After adding either connection, open the client's MCP command or server list. In clients that support slash commands, type `/mcp`, select `itm-platform`, and authenticate when prompted.
184
+
185
+ ## Self-Hosting
186
+
187
+ For a local stdio server, configure `ITM_API_URL`, `ITM_COMPANY`, and either `ITM_API_KEY` or `ITM_TOKEN`.
188
+
189
+ For an HTTP server with OAuth, configure:
190
+
191
+ | Variable | Description |
192
+ |----------|-------------|
193
+ | `ITM_API_URL` | ITM Platform API gateway URL |
194
+ | `PORT` | HTTP listen port |
195
+ | `ITM_AUTH_URL` | OAuth authorization server URL used for token exchange |
196
+ | `ITM_AUTH_PUBLIC_URL` | Public OAuth URL advertised to AI clients |
197
+ | `MCP_SERVER_URL` | Public MCP server URL used as the OAuth audience |
198
+ | `LOG_LEVEL` | Optional Pino log level: `debug`, `info`, `warn`, or `error` |
199
+ | `ITM_AUDIT_ENABLED` | Enables server-side audit logging when set to `true` |
200
+
201
+ When deployed behind a reverse proxy, `ITM_AUTH_URL` can point to a server-to-server address while `ITM_AUTH_PUBLIC_URL` must be reachable by AI clients.
202
+
203
+ ## Development
204
+
205
+ Requirements:
206
+
207
+ - Node.js 20 or later
208
+ - npm
209
+
210
+ Install dependencies, run tests, and build:
211
+
212
+ ```bash
213
+ npm install
214
+ npm test
215
+ npm run build
216
+ ```
217
+
218
+ Run the HTTP development server:
219
+
220
+ ```bash
221
+ cp .env.sample .env
222
+ npm run dev
223
+ ```
180
224
 
181
- Set `LOG_LEVEL` in `.env` to control verbosity (`debug`, `info`, `warn`, `error`; default: `info`). All log entries include `{ service: 'mcp', app: 'ITM.MCP' }` base fields and ISO timestamps.
225
+ The package entry point is `dist/server.js`; the npm executable is `mcp-server`.
182
226
 
183
- HTTP clients (DataMart, REST) log at `debug` level on success (with duration in ms) and `error` on failure.
227
+ ## Troubleshooting
184
228
 
185
- **Tool-call logging:** Every MCP tool invocation is logged at `info` level with tool name, userId, and aiClientId. Completion is logged at `debug` with duration in ms. Failures are logged at `error`.
229
+ If tools do not appear in your AI client, confirm that the server configuration is in the correct file for that client, restart the client, and check that `npx @itm-platform/mcp-server` runs successfully for local setups.
186
230
 
187
- **Audit:** When `ITM_AUDIT_ENABLED=true`, every tool call (read and write) sends an audit entry to the ITM backend (`/v2/{company}/mcp/audit`). Audit is fire-and-forget -- failures do not affect tool execution. Each entry includes: timestamp, userId, accountId, toolName, parametersHash (SHA-256), success, error (if any), aiClientId, durationMs.
231
+ If authentication fails, regenerate your API key or reconnect the OAuth server so your client receives a fresh token.
188
232
 
189
- ## Specification
233
+ If a write succeeds but a later search shows old data, wait up to 60 seconds. Writes are confirmed from the REST API immediately, while DataMart search indexes update asynchronously.
190
234
 
191
- Full design, architecture decisions, phased rollout, and E2E test details:
235
+ ## More Help
192
236
 
193
- - [SPEC_MCP_SERVER.md](zz_Specifications/SPEC_MCP_SERVER.md)
237
+ - MCP docs: [modelcontextprotocol.io](https://modelcontextprotocol.io)
238
+ - ITM Platform help: [helpcenter.itmplatform.com](https://helpcenter.itmplatform.com)
239
+ - ITM Platform developer docs: [developers.itmplatform.com/documentation](https://developers.itmplatform.com/documentation)
package/package.json CHANGED
@@ -1,7 +1,17 @@
1
1
  {
2
2
  "name": "@itm-platform/mcp-server",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "MCP server for ITM Platform",
5
+ "license": "MIT",
6
+ "mcpName": "io.github.itmplatform/mcp-server",
7
+ "keywords": [
8
+ "mcp",
9
+ "mcp-server",
10
+ "project-management",
11
+ "itm-platform",
12
+ "ai",
13
+ "model-context-protocol"
14
+ ],
5
15
  "type": "module",
6
16
  "main": "dist/server.js",
7
17
  "bin": {
@@ -22,7 +32,7 @@
22
32
  ],
23
33
  "scripts": {
24
34
  "dev": "cross-env PORT=6170 node --env-file=.env --import tsx src/server.ts",
25
- "build": "tsc",
35
+ "build": "node scripts/increase-package-version.mjs && tsc",
26
36
  "start": "node dist/server.js",
27
37
  "test": "vitest run",
28
38
  "test:integration": "vitest run --config vitest.integration.config.ts",