@mcp-abap-adt/calm-server 0.2.1 → 0.3.0
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.
- package/CHANGELOG.md +57 -0
- package/dist/server/runStdio.js +1 -1
- package/dist/tools/features/getFeatureByDisplayId.d.ts +1 -0
- package/dist/tools/features/getFeatureByDisplayId.d.ts.map +1 -1
- package/dist/tools/features/getFeatureByDisplayId.js +11 -5
- package/dist/tools/features/getFeatureByDisplayId.js.map +1 -1
- package/dist/tools/features/listFeatures.d.ts.map +1 -1
- package/dist/tools/features/listFeatures.js +5 -2
- package/dist/tools/features/listFeatures.js.map +1 -1
- package/dist/tools/tasks/listTasks.d.ts.map +1 -1
- package/dist/tools/tasks/listTasks.js +19 -15
- package/dist/tools/tasks/listTasks.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,62 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0 — 2026-05-13
|
|
4
|
+
|
|
5
|
+
Follows `@mcp-abap-adt/calm-client@0.3.0` (issue / PR #3 / #4 there).
|
|
6
|
+
Closes a wider class of the same bug fixed in 0.2.1: every list
|
|
7
|
+
endpoint whose Spring controller takes `@RequestParam UUID projectId`
|
|
8
|
+
must carry `projectId` on the URL, not in OData `$filter`. After the
|
|
9
|
+
earlier deliverables/workstreams fix, two more came out the moment a
|
|
10
|
+
sandbox `projectId` became available: `listTasks` and `listFeatures`.
|
|
11
|
+
|
|
12
|
+
### Changed (BREAKING for two tool input schemas)
|
|
13
|
+
|
|
14
|
+
- **`calm_features_get_by_display_id`** — `projectId` is now
|
|
15
|
+
`required`. The `getFeatureByDisplayId` endpoint delegates through
|
|
16
|
+
`listFeatures`, which now needs project scope; and the displayId
|
|
17
|
+
itself (`6-123`) is project-scoped anyway, so this matches the
|
|
18
|
+
underlying data model.
|
|
19
|
+
|
|
20
|
+
### Fixed (internal, no schema impact)
|
|
21
|
+
|
|
22
|
+
- **`calm_tasks_list` / `calm_features_list`** — projectId is now
|
|
23
|
+
forwarded positionally to the calm-client (not stuffed into
|
|
24
|
+
`$filter`), aligning with the server's `?projectId=<uuid>` URL
|
|
25
|
+
contract.
|
|
26
|
+
- **`calm_tasks_list`** — Tasks service rejects every OData query
|
|
27
|
+
parameter (`$select`, `$top`, `$filter` all return 400 "not
|
|
28
|
+
supported yet") despite returning an OData-collection shape. The
|
|
29
|
+
tool now calls `calm.getTasks().list(projectId)` with no query and
|
|
30
|
+
performs status/assignee filtering and limit/offset pagination
|
|
31
|
+
locally. The `fields` arg is kept for API symmetry but accepted as
|
|
32
|
+
a downstream hint only — the full record comes back from the wire.
|
|
33
|
+
|
|
34
|
+
### Updated
|
|
35
|
+
|
|
36
|
+
- Peer dependency `@mcp-abap-adt/calm-client` bumped `^0.2.0` →
|
|
37
|
+
`^0.3.0`. Required by the projectId-positional signatures on
|
|
38
|
+
`list` / `getByDisplayId`.
|
|
39
|
+
|
|
40
|
+
### Discovery / debugging
|
|
41
|
+
|
|
42
|
+
- The bug was latent until a borrowed sandbox `projectId` (leaked
|
|
43
|
+
through a public `test_case.projectId`) activated the
|
|
44
|
+
`describeWithProject` integration gate. Five tests failed with the
|
|
45
|
+
same HTTP 400 root cause, plus two more Tasks-only "not supported
|
|
46
|
+
yet" 400s on `$select` / `$top`.
|
|
47
|
+
- The Tasks service's non-OData nature is now documented in the
|
|
48
|
+
source (and via this entry) — future tools targeting `/tasks/*`
|
|
49
|
+
should not assume OData semantics.
|
|
50
|
+
|
|
51
|
+
### Tests
|
|
52
|
+
|
|
53
|
+
- Updated unit tests for `listFeatures` (URL-based projectId, no
|
|
54
|
+
`$filter` for it), `listTasks` (no OData query at all, client-side
|
|
55
|
+
filter), and `getByDisplayId` (projectId+displayId positional args).
|
|
56
|
+
- Integration sandbox suite now exercises five project-scoped reads
|
|
57
|
+
end-to-end against a borrowed projectId — 230 passed / 2 skipped
|
|
58
|
+
(oauth2 only) / 1 todo.
|
|
59
|
+
|
|
3
60
|
## 0.2.1 — 2026-05-13
|
|
4
61
|
|
|
5
62
|
Same-day follow-up to 0.2.0: realigns two bonus tools with
|
package/dist/server/runStdio.js
CHANGED
|
@@ -8,7 +8,7 @@ const buildClient_1 = require("./buildClient");
|
|
|
8
8
|
const config_1 = require("./config");
|
|
9
9
|
const stderrLogger_1 = require("./stderrLogger");
|
|
10
10
|
const PACKAGE_NAME = '@mcp-abap-adt/calm-server';
|
|
11
|
-
const PACKAGE_VERSION = '0.
|
|
11
|
+
const PACKAGE_VERSION = '0.3.0';
|
|
12
12
|
/**
|
|
13
13
|
* Entry point for standalone stdio mode. Reads `.env` + env vars,
|
|
14
14
|
* builds a `CalmClient`, wires all tool groups onto a
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IFeature } from '@mcp-abap-adt/calm-client';
|
|
2
2
|
import type { ICalmHandlerEntry } from '../../registry/types';
|
|
3
3
|
export interface IGetFeatureByDisplayIdArgs {
|
|
4
|
+
projectId: string;
|
|
4
5
|
displayId: string;
|
|
5
6
|
}
|
|
6
7
|
export declare const getFeatureByDisplayIdTool: ICalmHandlerEntry<IGetFeatureByDisplayIdArgs, IFeature>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeatureByDisplayId.d.ts","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"getFeatureByDisplayId.d.ts","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAyCD,eAAO,MAAM,yBAAyB,EAAE,iBAAiB,CACvD,0BAA0B,EAC1B,QAAQ,CAIT,CAAC"}
|
|
@@ -4,11 +4,15 @@ exports.getFeatureByDisplayIdTool = void 0;
|
|
|
4
4
|
const utils_1 = require("../../utils");
|
|
5
5
|
const definition = {
|
|
6
6
|
name: 'calm_features_get_by_display_id',
|
|
7
|
-
description: 'Fetch a Cloud ALM feature by its human-facing displayId (e.g. "6-123" where 6 is the project
|
|
7
|
+
description: 'Fetch a Cloud ALM feature by its human-facing displayId (e.g. "6-123" where 6 is the project sequence and 123 is the feature sequence). Requires `projectId` — the underlying Features endpoint is project-scoped, and the displayId itself is unique only within a project. Returns the full feature record; raises NOT_FOUND if no feature matches inside that project.',
|
|
8
8
|
inputSchema: {
|
|
9
9
|
type: 'object',
|
|
10
|
-
required: ['displayId'],
|
|
10
|
+
required: ['projectId', 'displayId'],
|
|
11
11
|
properties: {
|
|
12
|
+
projectId: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'Project id the feature belongs to.',
|
|
15
|
+
},
|
|
12
16
|
displayId: {
|
|
13
17
|
type: 'string',
|
|
14
18
|
description: 'Feature displayId, e.g. "6-123".',
|
|
@@ -17,14 +21,16 @@ const definition = {
|
|
|
17
21
|
},
|
|
18
22
|
};
|
|
19
23
|
const handler = async (ctx, args) => {
|
|
20
|
-
if (!args?.displayId) {
|
|
24
|
+
if (!args?.projectId || !args?.displayId) {
|
|
21
25
|
throw new utils_1.CalmToolError({
|
|
22
26
|
code: 'INVALID_ARGUMENT',
|
|
23
|
-
message: 'displayId
|
|
27
|
+
message: 'projectId and displayId are required',
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
30
|
try {
|
|
27
|
-
return await ctx.calm
|
|
31
|
+
return await ctx.calm
|
|
32
|
+
.getFeatures()
|
|
33
|
+
.getByDisplayId(args.projectId, args.displayId);
|
|
28
34
|
}
|
|
29
35
|
catch (err) {
|
|
30
36
|
throw (0, utils_1.mapCalmErrorForTool)(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFeatureByDisplayId.js","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":";;;AAMA,uCAAiE;
|
|
1
|
+
{"version":3,"file":"getFeatureByDisplayId.js","sourceRoot":"","sources":["../../../src/tools/features/getFeatureByDisplayId.ts"],"names":[],"mappings":";;;AAMA,uCAAiE;AAOjE,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,iCAAiC;IACvC,WAAW,EACT,2WAA2W;IAC7W,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;QACpC,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;SACF;KACF;CACF,CAAC;AAEF,MAAM,OAAO,GAA0D,KAAK,EAC1E,GAAG,EACH,IAAI,EACJ,EAAE;IACF,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,qBAAa,CAAC;YACtB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,sCAAsC;SAChD,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,IAAI;aAClB,WAAW,EAAE;aACb,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,2BAAmB,EAAC,GAAG,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEW,QAAA,yBAAyB,GAGlC;IACF,cAAc,EAAE,UAAU;IAC1B,OAAO;CACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFeatures.d.ts","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAgBrB,QAAA,MAAM,cAAc,uMAgBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"listFeatures.d.ts","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAgBrB,QAAA,MAAM,cAAc,uMAgBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA6GD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,CAC9C,iBAAiB,EACjB,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAIjC,CAAC"}
|
|
@@ -82,7 +82,10 @@ const definition = {
|
|
|
82
82
|
function buildQuery(args) {
|
|
83
83
|
const limit = (0, utils_1.clampListLimit)(args.limit);
|
|
84
84
|
const offset = args.offset && args.offset > 0 ? Math.floor(args.offset) : 0;
|
|
85
|
-
|
|
85
|
+
// projectId is now passed positionally to calm.getFeatures().list
|
|
86
|
+
// and ends up on the URL as ?projectId=…; it must NOT also appear
|
|
87
|
+
// in $filter.
|
|
88
|
+
const filter = (0, utils_1.joinAndFilters)(args.status
|
|
86
89
|
? `statusCode eq '${(0, utils_1.escapeODataString)(args.status)}'`
|
|
87
90
|
: undefined, args.priorityCode
|
|
88
91
|
? `priorityCode eq '${(0, utils_1.escapeODataString)(args.priorityCode)}'`
|
|
@@ -109,7 +112,7 @@ const handler = async (ctx, args) => {
|
|
|
109
112
|
}
|
|
110
113
|
const { query, limit, offset } = buildQuery(args);
|
|
111
114
|
try {
|
|
112
|
-
const collection = await ctx.calm.getFeatures().list(query);
|
|
115
|
+
const collection = await ctx.calm.getFeatures().list(args.projectId, query);
|
|
113
116
|
return (0, utils_1.toListResponse)(collection, { limit, offset });
|
|
114
117
|
}
|
|
115
118
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFeatures.js","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":";;;AAAA,2DAAsE;AAMtE,uCAUqB;AAErB;;;;GAIG;AACH,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,YAAY;IACZ,cAAc;IACd,YAAY;CACJ,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,MAAM;IACN,WAAW;IACX,OAAO;IACP,aAAa;IACb,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,SAAS;IACT,eAAe;IACf,YAAY;IACZ,WAAW;IACX,MAAM;IACN,cAAc;IACd,MAAM;CACE,CAAC;AAeX,MAAM,UAAU,GAAwB;IACtC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,gUAAgU;IAClU,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sEAAsE;aACzE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wHAAwH;aAC3H;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wGAAwG;aAC3G;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+CAA+C;aAC7D;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,WAAW,EACT,sHAAsH;gBACxH,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gCAAgC,0BAAkB,eAAe,sBAAc,IAAI;gBAChG,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,sBAAc;aACxB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,mCAAmC;gBAChD,OAAO,EAAE,CAAC;aACX;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,+CAA+C;aAC7D;SACF;KACF;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,IAAuB;IAKzC,MAAM,KAAK,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAG,IAAA,sBAAc,EAC3B,
|
|
1
|
+
{"version":3,"file":"listFeatures.js","sourceRoot":"","sources":["../../../src/tools/features/listFeatures.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listTasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAYrB,QAAA,MAAM,cAAc,kOAiBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"listTasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAC;AAYrB,QAAA,MAAM,cAAc,kOAiBV,CAAC;AACX,KAAK,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAoED,eAAO,MAAM,aAAa,EAAE,iBAAiB,CAC3C,cAAc,EACd,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAI9B,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.listTasksTool = void 0;
|
|
4
|
-
const calm_client_1 = require("@mcp-abap-adt/calm-client");
|
|
5
4
|
const utils_1 = require("../../utils");
|
|
6
5
|
const DEFAULT_FIELDS = [
|
|
7
6
|
'id',
|
|
@@ -62,21 +61,26 @@ const handler = async (ctx, args) => {
|
|
|
62
61
|
}
|
|
63
62
|
const limit = (0, utils_1.clampListLimit)(args.limit);
|
|
64
63
|
const offset = args.offset && args.offset > 0 ? Math.floor(args.offset) : 0;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
72
|
-
.
|
|
73
|
-
|
|
74
|
-
query = query.filter(filter);
|
|
75
|
-
if (args.withCount)
|
|
76
|
-
query = query.count();
|
|
64
|
+
// The Tasks service controller does NOT accept OData query
|
|
65
|
+
// semantics — `$select`, `$top`, and likely `$filter` all return
|
|
66
|
+
// 400 ("not supported yet"). It only honours `?projectId=<uuid>`
|
|
67
|
+
// on the URL. The full row set comes back; status/assignee
|
|
68
|
+
// filtering and pagination/limit happen client-side here.
|
|
69
|
+
const remoteFilters = {
|
|
70
|
+
status: args.status,
|
|
71
|
+
assigneeId: args.assigneeId,
|
|
72
|
+
};
|
|
77
73
|
try {
|
|
78
|
-
const collection = await ctx.calm.getTasks().list(
|
|
79
|
-
|
|
74
|
+
const collection = await ctx.calm.getTasks().list(args.projectId);
|
|
75
|
+
let all = (collection.value ?? []);
|
|
76
|
+
if (remoteFilters.status !== undefined) {
|
|
77
|
+
all = all.filter((t) => t.status === remoteFilters.status);
|
|
78
|
+
}
|
|
79
|
+
if (remoteFilters.assigneeId !== undefined) {
|
|
80
|
+
all = all.filter((t) => t.assigneeId === remoteFilters.assigneeId);
|
|
81
|
+
}
|
|
82
|
+
const paged = all.slice(offset, offset + limit);
|
|
83
|
+
return (0, utils_1.toListResponse)({ value: paged, '@odata.count': args.withCount ? all.length : undefined }, { limit, offset });
|
|
80
84
|
}
|
|
81
85
|
catch (err) {
|
|
82
86
|
throw (0, utils_1.mapCalmErrorForTool)(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listTasks.js","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"listTasks.js","sourceRoot":"","sources":["../../../src/tools/tasks/listTasks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-abap-adt/calm-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MCP server + reusable tool primitives for SAP Cloud ALM, backed by @mcp-abap-adt/calm-client.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"tools"
|
|
64
64
|
],
|
|
65
65
|
"peerDependencies": {
|
|
66
|
-
"@mcp-abap-adt/calm-client": "^0.
|
|
66
|
+
"@mcp-abap-adt/calm-client": "^0.3.0",
|
|
67
67
|
"@mcp-abap-adt/interfaces": "^7.1.0",
|
|
68
68
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
69
69
|
},
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"@mcp-abap-adt/auth-broker": "^1.0.5",
|
|
73
73
|
"@mcp-abap-adt/auth-providers": "^1.0.5",
|
|
74
74
|
"@mcp-abap-adt/auth-stores": "^1.0.4",
|
|
75
|
-
"@mcp-abap-adt/calm-client": "^0.
|
|
75
|
+
"@mcp-abap-adt/calm-client": "^0.3.0",
|
|
76
76
|
"@mcp-abap-adt/interfaces": "^7.1.0",
|
|
77
77
|
"@mcp-abap-adt/logger": "^0.1.4",
|
|
78
78
|
"@modelcontextprotocol/sdk": "^1.0.0",
|