harness-mcp-v2 3.2.19 → 3.2.21

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 (111) hide show
  1. package/README.md +146 -75
  2. package/build/client/harness-client.d.ts.map +1 -1
  3. package/build/client/harness-client.js +32 -6
  4. package/build/client/harness-client.js.map +1 -1
  5. package/build/config.d.ts +10 -0
  6. package/build/config.d.ts.map +1 -1
  7. package/build/config.js +15 -0
  8. package/build/config.js.map +1 -1
  9. package/build/data/schemas/v0/pipeline.d.ts.map +1 -1
  10. package/build/data/schemas/v0/pipeline.js +1388 -580
  11. package/build/data/schemas/v0/pipeline.js.map +1 -1
  12. package/build/data/schemas/v0/template.d.ts.map +1 -1
  13. package/build/data/schemas/v0/template.js +1142 -166
  14. package/build/data/schemas/v0/template.js.map +1 -1
  15. package/build/data/schemas/v1/pipeline.d.ts.map +1 -1
  16. package/build/data/schemas/v1/pipeline.js +302 -90
  17. package/build/data/schemas/v1/pipeline.js.map +1 -1
  18. package/build/data/schemas/v1/template.d.ts.map +1 -1
  19. package/build/data/schemas/v1/template.js +708 -488
  20. package/build/data/schemas/v1/template.js.map +1 -1
  21. package/build/prompts/deploy-ai-agent.d.ts +3 -0
  22. package/build/prompts/deploy-ai-agent.d.ts.map +1 -0
  23. package/build/prompts/deploy-ai-agent.js +300 -0
  24. package/build/prompts/deploy-ai-agent.js.map +1 -0
  25. package/build/prompts/feature-flag-rollout.d.ts.map +1 -1
  26. package/build/prompts/feature-flag-rollout.js +19 -8
  27. package/build/prompts/feature-flag-rollout.js.map +1 -1
  28. package/build/prompts/index.d.ts.map +1 -1
  29. package/build/prompts/index.js +2 -0
  30. package/build/prompts/index.js.map +1 -1
  31. package/build/registry/extractors.d.ts +87 -10
  32. package/build/registry/extractors.d.ts.map +1 -1
  33. package/build/registry/extractors.js +426 -26
  34. package/build/registry/extractors.js.map +1 -1
  35. package/build/registry/index.d.ts.map +1 -1
  36. package/build/registry/index.js +34 -15
  37. package/build/registry/index.js.map +1 -1
  38. package/build/registry/scope-utils.d.ts +45 -0
  39. package/build/registry/scope-utils.d.ts.map +1 -1
  40. package/build/registry/scope-utils.js +78 -0
  41. package/build/registry/scope-utils.js.map +1 -1
  42. package/build/registry/toolsets/chaos-descriptions.d.ts +72 -20
  43. package/build/registry/toolsets/chaos-descriptions.d.ts.map +1 -1
  44. package/build/registry/toolsets/chaos-descriptions.js +435 -140
  45. package/build/registry/toolsets/chaos-descriptions.js.map +1 -1
  46. package/build/registry/toolsets/chaos.d.ts.map +1 -1
  47. package/build/registry/toolsets/chaos.js +967 -193
  48. package/build/registry/toolsets/chaos.js.map +1 -1
  49. package/build/registry/toolsets/feature-flags.d.ts.map +1 -1
  50. package/build/registry/toolsets/feature-flags.js +888 -85
  51. package/build/registry/toolsets/feature-flags.js.map +1 -1
  52. package/build/registry/toolsets/governance.d.ts.map +1 -1
  53. package/build/registry/toolsets/governance.js +4 -0
  54. package/build/registry/toolsets/governance.js.map +1 -1
  55. package/build/registry/toolsets/iacm.d.ts.map +1 -1
  56. package/build/registry/toolsets/iacm.js +787 -11
  57. package/build/registry/toolsets/iacm.js.map +1 -1
  58. package/build/registry/toolsets/infrastructure.d.ts.map +1 -1
  59. package/build/registry/toolsets/infrastructure.js +30 -5
  60. package/build/registry/toolsets/infrastructure.js.map +1 -1
  61. package/build/registry/toolsets/pipelines.d.ts.map +1 -1
  62. package/build/registry/toolsets/pipelines.js +208 -5
  63. package/build/registry/toolsets/pipelines.js.map +1 -1
  64. package/build/registry/toolsets/release-management.d.ts +8 -0
  65. package/build/registry/toolsets/release-management.d.ts.map +1 -0
  66. package/build/registry/toolsets/release-management.js +783 -0
  67. package/build/registry/toolsets/release-management.js.map +1 -0
  68. package/build/registry/toolsets/sto.d.ts.map +1 -1
  69. package/build/registry/toolsets/sto.js +93 -17
  70. package/build/registry/toolsets/sto.js.map +1 -1
  71. package/build/registry/types.d.ts +52 -4
  72. package/build/registry/types.d.ts.map +1 -1
  73. package/build/resources/harness-schema.d.ts.map +1 -1
  74. package/build/resources/harness-schema.js +2 -1
  75. package/build/resources/harness-schema.js.map +1 -1
  76. package/build/tools/entity-schema/live.d.ts +6 -5
  77. package/build/tools/entity-schema/live.d.ts.map +1 -1
  78. package/build/tools/entity-schema/live.js +114 -10
  79. package/build/tools/entity-schema/live.js.map +1 -1
  80. package/build/tools/entity-schema/types.d.ts +7 -1
  81. package/build/tools/entity-schema/types.d.ts.map +1 -1
  82. package/build/tools/harness-create.d.ts.map +1 -1
  83. package/build/tools/harness-create.js +5 -1
  84. package/build/tools/harness-create.js.map +1 -1
  85. package/build/tools/harness-delete.d.ts.map +1 -1
  86. package/build/tools/harness-delete.js +5 -1
  87. package/build/tools/harness-delete.js.map +1 -1
  88. package/build/tools/harness-execute.d.ts.map +1 -1
  89. package/build/tools/harness-execute.js +15 -9
  90. package/build/tools/harness-execute.js.map +1 -1
  91. package/build/tools/harness-get.d.ts.map +1 -1
  92. package/build/tools/harness-get.js +5 -1
  93. package/build/tools/harness-get.js.map +1 -1
  94. package/build/tools/harness-list.d.ts.map +1 -1
  95. package/build/tools/harness-list.js +18 -2
  96. package/build/tools/harness-list.js.map +1 -1
  97. package/build/tools/harness-schema.d.ts +2 -1
  98. package/build/tools/harness-schema.d.ts.map +1 -1
  99. package/build/tools/harness-schema.js +10 -8
  100. package/build/tools/harness-schema.js.map +1 -1
  101. package/build/tools/harness-update.d.ts.map +1 -1
  102. package/build/tools/harness-update.js +5 -1
  103. package/build/tools/harness-update.js.map +1 -1
  104. package/build/tools/index.js +1 -1
  105. package/build/tools/index.js.map +1 -1
  106. package/build/utils/url-parser.d.ts +2 -0
  107. package/build/utils/url-parser.d.ts.map +1 -1
  108. package/build/utils/url-parser.js +55 -0
  109. package/build/utils/url-parser.js.map +1 -1
  110. package/npm-shrinkwrap.json +2 -2
  111. package/package.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fharness%2Fmcp-server.svg)](https://mcptoplist.com/server/glama%2Fharness%2Fmcp-server)
4
4
 
5
- An MCP (Model Context Protocol) server that gives AI agents full access to the Harness.io platform through 11 consolidated tools and 223 resource types.
5
+ An MCP (Model Context Protocol) server that gives AI agents full access to the Harness.io platform through 11 consolidated tools and 240 resource types.
6
6
 
7
7
  ## Why Use This MCP Server
8
8
 
@@ -10,10 +10,10 @@ Most MCP servers map one tool per API endpoint. For a platform as broad as Harne
10
10
 
11
11
  This server is built differently:
12
12
 
13
- - **11 tools, 223 resource types.** A registry-based dispatch system routes `harness_list`, `harness_get`, `harness_create`, etc. to any Harness resource — pipelines, services, environments, orgs, projects, feature flags, cost data, and more. The LLM picks from 11 tools instead of hundreds.
14
- - **Full platform coverage.** 38 default toolsets spanning CI/CD, GitOps, Feature Flags, Cloud Cost Management, Security Testing, Chaos Engineering, Database DevOps, Internal Developer Portal, Software Supply Chain, Infrastructure as Code Management, Governance, Service Overrides, Knowledge Graph, and more. Opt-in Ansible coverage is available when you need inventory and playbook data.
13
+ - **11 tools, 240 resource types.** A registry-based dispatch system routes `harness_list`, `harness_get`, `harness_create`, etc. to any Harness resource — pipelines, services, environments, orgs, projects, feature flags, cost data, and more. The LLM picks from 11 tools instead of hundreds.
14
+ - **Full platform coverage.** 39 default toolsets spanning CI/CD, GitOps, Feature Flags, Cloud Cost Management, Security Testing, Chaos Engineering, Database DevOps, Internal Developer Portal, Software Supply Chain, Infrastructure as Code Management, Release Management, Governance, Service Overrides, Knowledge Graph, and more. Opt-in Ansible coverage is available when you need inventory and playbook data.
15
15
  - **Multi-project workflows out of the box.** Agents discover organizations and projects dynamically — no hardcoded env vars needed. Ask "show failed executions across all projects" and the agent can navigate the full account hierarchy.
16
- - **34 prompt templates.** Pre-built prompts for common workflows: build & deploy apps end-to-end, debug failed pipelines, review DORA metrics, triage vulnerabilities, optimize cloud costs, audit access control, plan feature flag rollouts, review pull requests, approve pending pipelines, and more.
16
+ - **35 prompt templates.** Pre-built prompts for common workflows: build & deploy apps end-to-end, debug failed pipelines, review DORA metrics, triage vulnerabilities, optimize cloud costs, audit access control, plan feature flag rollouts, review pull requests, approve pending pipelines, and more.
17
17
  - **Works everywhere.** Stdio transport for local clients (Claude Desktop, Cursor, Devin Desktop), HTTP transport for remote/shared deployments, Docker and Kubernetes ready.
18
18
  - **Zero-config start.** Just provide a Harness API key. Account ID is auto-extracted from PAT and SAT tokens, org/project defaults are optional, and toolset filtering lets you expose only what you need.
19
19
  - **Extensible by design.** Adding a new Harness resource means adding a declarative data file — no new tool registration, no schema changes, no prompt updates.
@@ -86,7 +86,7 @@ pnpm inspect # Test with MCP Inspector
86
86
 
87
87
  ### Anthropic MCP Directory bundle
88
88
 
89
- The MCPB bundle manifest lives in `[mcp-directory/](mcp-directory/)`, and the bundle icon is tracked at `[icon.png](icon.png)` in the repository root. Copy `mcp-directory/manifest.json` to the bundle root after `pnpm build` so the generated archive contains root-level `manifest.json`, `icon.png`, `build/`, `package.json`, and production `node_modules/`.
89
+ The MCPB bundle manifest lives in `[mcp-directory/](mcp-directory/)`, and the 512×512 bundle icon is tracked at `[icon.png](icon.png)` in the repository root. The packaged archive contains root-level `manifest.json`, `icon.png`, `server/`, `package.json`, `npm-shrinkwrap.json`, and production `node_modules/`.
90
90
 
91
91
  To keep the archive small, build MCPB packages from a staging directory:
92
92
 
@@ -94,7 +94,9 @@ To keep the archive small, build MCPB packages from a staging directory:
94
94
  pnpm prepare:mcpb
95
95
  ```
96
96
 
97
- The staged package is written to `dist/mcpb/` with production dependencies installed using npm's flat layout.
97
+ The staging directory is written to `dist/mcpb/` with production dependencies installed from `npm-shrinkwrap.json` using npm's flat layout. The pinned official MCPB CLI validates it and creates `dist/harness-mcp-server-<version>.mcpb`.
98
+
99
+ Version tags matching `v*.*.*` publish that bundle to the corresponding GitHub Release automatically. To backfill an existing release without republishing npm, run the `Release` workflow manually with its `release_tag` input (for example, `v3.2.20`). The workflow checks out and builds that exact tag before replacing only its versioned MCPB asset.
98
100
 
99
101
  ### CLI Usage
100
102
 
@@ -537,8 +539,8 @@ The server automatically loads environment variables from a `.env` file in the p
537
539
  | `HARNESS_API_KEY` | Yes* | -- | Harness personal access token or service account token. Required in `single-user` mode. Must NOT be set in `multi-user` mode |
538
540
  | `HARNESS_ACCOUNT_ID` | No | *(from PAT/SAT)* | Harness account identifier. Auto-extracted from PAT/SAT tokens in single-user mode; multi-user sessions can provide their own via `x-harness-account-id` when the API key does not embed one |
539
541
  | `HARNESS_BASE_URL` | No | `https://app.harness.io` | Harness API/UI base URL for local stdio or self-hosted HTTP deployments. Set this to environments such as `https://harness0.harness.io` when running the server yourself. It does not affect the managed `https://mcp.harness.io/mcp` hosted endpoint |
540
- | `HARNESS_FME_API_KEY` | No | -- | Optional single-user/self-hosted FME/Split Admin credential used for `fme_` resources. This can be a legacy Split admin key or an FME-entitled Harness PAT/SAT. FME calls go directly to `api.split.io`, so hosted OAuth/service-routing credentials for Harness platform APIs do not authenticate these requests. Must not be set in `multi-user` mode; FME must use each session's `x-harness-api-key` credential. If unset, FME falls back to a non-placeholder `HARNESS_API_KEY` for self-hosted sessions |
541
- | `HARNESS_FME_BASE_URL` | No | `https://api.split.io` | Split/FME Admin API base URL used by `fme_` resources. HTTP URLs require `HARNESS_ALLOW_HTTP=true` for local development |
542
+ | `HARNESS_FME_API_KEY` | No | -- | Optional single-user/self-hosted FME/Split Admin credential used for `fme_` resources in **legacy (`workspace_id`) mode only**. This can be a legacy Split admin key or an FME-entitled Harness PAT/SAT. FME calls go directly to `api.split.io`, so hosted OAuth/service-routing credentials for Harness platform APIs do not authenticate these requests. Must not be set in `multi-user` mode; FME must use each session's `x-harness-api-key` credential. If unset, FME falls back to a non-placeholder `HARNESS_API_KEY` for self-hosted sessions. Harness-native (`org_id`+`project_id`) mode ignores this and uses the standard `HARNESS_API_KEY`/`HARNESS_BASE_URL` instead |
543
+ | `HARNESS_FME_BASE_URL` | No | `https://api.split.io` | Split/FME Admin API base URL used by `fme_` resources in **legacy (`workspace_id`) mode only**. HTTP URLs require `HARNESS_ALLOW_HTTP=true` for local development. Harness-native (`org_id`+`project_id`) mode ignores this and uses the standard `HARNESS_API_KEY`/`HARNESS_BASE_URL` instead |
542
544
  | `HARNESS_ORG` | No | -- | Organization ID. Used when `org_id` is not specified per tool call. If omitted, `org_id` must be provided explicitly. Agents can also discover orgs dynamically via `harness_list(resource_type="organization")` |
543
545
  | `HARNESS_PROJECT` | No | -- | Project ID. Used when `project_id` is not specified per tool call. Agents can also discover projects dynamically via `harness_list(resource_type="project")` |
544
546
  | `HARNESS_API_TIMEOUT_MS` | No | `30000` | HTTP request timeout in milliseconds |
@@ -656,24 +658,24 @@ The server exposes 11 MCP tools. Most API tools accept `org_id` and `project_id`
656
658
  - `resource_scope: "org"` sends `accountIdentifier` and `orgIdentifier`.
657
659
  - `resource_scope: "project"` sends account, org, and project identifiers.
658
660
 
659
- Current multi-scope resources include `connector`, `service`, `environment`, `infrastructure`, `secret`, `file_store`, and `template`. If `resource_scope` is omitted, the registry uses the resource's default scope and configured defaults, except resources marked as optional scope may omit org/project unless explicitly passed. Harness URLs can also set the scope automatically when the path contains account-level or project-level context.
661
+ Current multi-scope resources include `connector`, `service`, `environment`, `infrastructure`, `secret`, `file_store`, `template`, `policy`, and `policy_set`. If `resource_scope` is omitted, the registry uses the resource's default scope and configured defaults, except resources marked as optional scope may omit org/project unless explicitly passed. Harness URLs can also set the scope automatically when the path contains account-level or project-level context.
660
662
 
661
663
  **Structured output:** Every tool declares an MCP `outputSchema`. `harness_list` normalizes list-like Harness responses into object-shaped structured content so strict clients can validate it: top-level arrays become `{ "items": [...], "total": <count>, "page": <page> }`, and common wrapper keys such as `content`, `data`, `body`, `objects`, or `features` are hoisted to `items` when needed. The text response still contains the compact JSON payload returned to all clients.
662
664
 
663
665
 
664
- | Tool | Description |
665
- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
666
- | `harness_describe` | Discover available resource types, operations, and fields. No API call — returns local registry metadata. |
667
- | `harness_schema` | Fetch exact YAML/JSON Schema definitions and examples for creating/updating resources. Pipeline/template schemas are bundled; connector, environment, service, secret, and infrastructure schemas are scope-aware entity schemas fetched from bundled snapshots or NG `/yaml-schema`. Supports deep drilling via `path`. |
668
- | `harness_list` | List resources of a given type with filtering, search, and pagination. |
669
- | `harness_get` | Get a single resource by its identifier. |
670
- | `harness_create` | Create a new resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via [elicitation](#elicitation). |
671
- | `harness_update` | Update an existing resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via [elicitation](#elicitation). |
672
- | `harness_delete` | Delete a resource. Prompts for user confirmation via [elicitation](#elicitation). Destructive. |
673
- | `harness_execute` | Execute an action on a resource (run/retry pipeline, import pipeline from Git, toggle flag, sync app). Prompts for user confirmation via [elicitation](#elicitation). For pipeline runs, use the runtime-input workflow below (supports `branch`/`tag`/`pr_number`/`commit_sha` shorthand expansion). |
666
+ | Tool | Description |
667
+ | --------------------| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
668
+ | `harness_describe` | Discover available resource types, operations, and fields. No API call — returns local registry metadata. |
669
+ | `harness_schema` | Fetch exact YAML/JSON Schema definitions and examples for creating/updating resources. Pipeline/template schemas are bundled; connector, environment, service, secret, and infrastructure schemas are scope-aware entity schemas fetched from bundled snapshots or NG `/yaml-schema`; `release_process` and `release_activity` schemas are fetched live from RMG `/api/yamlSchema`. Supports deep drilling via `path`. |
670
+ | `harness_list` | List resources of a given type with filtering, search, and pagination. |
671
+ | `harness_get` | Get a single resource by its identifier. |
672
+ | `harness_create` | Create a new resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via [elicitation](#elicitation). |
673
+ | `harness_update` | Update an existing resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via [elicitation](#elicitation). |
674
+ | `harness_delete` | Delete a resource. Prompts for user confirmation via [elicitation](#elicitation). Destructive. |
675
+ | `harness_execute` | Execute an action on a resource (run/retry pipeline, import pipeline from Git, toggle flag, sync app). Prompts for user confirmation via [elicitation](#elicitation). For pipeline runs, use the runtime-input workflow below (supports `branch`/`tag`/`pr_number`/`commit_sha` shorthand expansion). |
674
676
  | `harness_search` | Search across Harness resource types with a single query. Uses semantic routing (local `all-MiniLM-L6-v2` ONNX embeddings, 384-dim) to predict relevant resource types from a `knowledge` corpus indexed at startup — typically narrowing from ~163 types to 1–8 before scatter-gather. Falls back to full keyword scatter-gather when semantic confidence is low. Response includes `semantic_routed` and `types_skipped` when routing fires. See `docs/search-guidelines.md` for how to make new resource types discoverable. |
675
- | `harness_diagnose` | Diagnose `pipeline`, `connector`, `delegate`, and `gitops_application` resources (aliases: `execution` -> `pipeline`, `gitops_app` -> `gitops_application`). For pipelines, returns stage/step timing and failure details; for connectors/delegates/GitOps apps, returns targeted health and troubleshooting signals. |
676
- | `harness_status` | Get a real-time project health dashboard — recent executions, failure rates, and deep links. |
677
+ | `harness_diagnose` | Diagnose `pipeline`, `connector`, `delegate`, and `gitops_application` resources (aliases: `execution` -> `pipeline`, `gitops_app` -> `gitops_application`). For pipelines, returns stage/step timing and failure details; for connectors/delegates/GitOps apps, returns targeted health and troubleshooting signals. |
678
+ | `harness_status` | Get a real-time project health dashboard — recent executions, failure rates, and deep links. |
677
679
 
678
680
 
679
681
  ### Schema Lookup Workflow
@@ -682,6 +684,7 @@ Use `harness_schema` before creating or updating YAML-backed resources so agents
682
684
 
683
685
  - Bundled schemas include `pipeline`, `template`, `trigger`, `pipeline_v1`, `template_v1`, `inputSet_v1`, `overlayInputSet_v1`, and `agent-pipeline`.
684
686
  - Entity schemas include `connector`, `environment`, `service`, `secret`, and `infrastructure`. They are scope-aware (`account`, `org`, or `project`) and require `org_id`/`project_id` when the selected scope requires them.
687
+ - Release Management definitions (`release_process`, `release_activity`) fetch live JSON Schema from RMG `/api/yamlSchema` (not bundled). Pass `scope`, `org_id`, and `project_id` when scoping to org or project.
685
688
  - Vendored entity snapshots are used first when they match the runtime account; otherwise the tool falls back to the Harness NG `/yaml-schema` API and caches the result.
686
689
  - Omit `path` for a field/section summary, then pass a dot-separated `path` to inspect a nested definition.
687
690
 
@@ -1202,7 +1205,7 @@ Harness pipelines can be stored in three ways:
1202
1205
 
1203
1206
  ## Resource Types
1204
1207
 
1205
- 223 resource types organized across 38 toolsets. Each resource type supports a subset of CRUD operations and optional execute actions.
1208
+ 240 resource types organized across 39 toolsets. Each resource type supports a subset of CRUD operations and optional execute actions.
1206
1209
 
1207
1210
  ### Platform
1208
1211
 
@@ -1422,24 +1425,39 @@ Template operations use the Harness Template service paths (`/template/api/templ
1422
1425
 
1423
1426
  ### Infrastructure as Code Management (IaCM)
1424
1427
 
1425
- IaCM resources are default-enabled and mostly project-scoped. Start with `iacm_workspace` to find workspace identifiers, then use that `workspace_id` for workspace resources, costs, and activity diffs. The module registry is account-scoped.
1428
+ IaCM resources are default-enabled and mostly project-scoped. Start with `iacm_workspace` to find workspace identifiers, then use that `workspace_id` for workspace resources, costs, and activity diffs. Use `iacm_variable_set` for reusable variable sets at account, org, or project scope. The provider registry is account-scoped.
1429
+
1430
+ `iacm_module` spans account, org, and project scope. It defaults to the account registry; every operation (list, get, create, update) sends the same `scope_org` / `scope_project` query params, so a module you create is discoverable at the scope you created it. Select the scope with `resource_scope="account" | "org" | "project"` plus `org_id`/`project_id`. Scoping is opt-in: when `resource_scope` is omitted, `org_id`/`project_id` apply only if you pass them explicitly — configured `HARNESS_ORG`/`HARNESS_PROJECT` defaults are not applied, so an ambient project config cannot silently register an account module under a project. A module body's own `org`/`project` fields locate its Git connector and are unrelated to this visibility scope.
1431
+
1432
+ `iacm_workspace` create/update return `{ policy_evaluation }` only — follow up with `harness_get` to fetch the workspace. `iacm_variable_set` and `iacm_module` create/update return the resource itself. `iacm_provider` create returns `{ id }` only — follow up with `harness_get`; **update is version-oriented only** (POST/PUT `/providers/{id}/version`) — there is no metadata PUT. Version writes may return an empty body; HarnessClient normalizes that to `{ status: "SUCCESS", message: "No content" }`.
1433
+
1434
+ Variable-set **update is HTTP PUT with full-replacement collections** — always `harness_get` first, then PUT the full desired body (`terraform_variables` / `environment_variables` are required on update; omit/empty clears connectors and variable files). Module update is also PUT — prefer get-then-put for optional fields. Writes are `medium_write` and require confirmation (elicitation or `confirm: true`).
1435
+
1436
+ Variable-set and provider-registry RBAC (`iac_variableset_*`, `iac_providerregistry_*`) are currently Experimental in Harness — access checks always allow until iac-server activates enforcement. Module registry RBAC (`iac_registry_view` / `iac_registry_edit`) is Active and enforceable. MCP always forwards the caller PAT/SAT unchanged.
1426
1437
 
1427
1438
  | Resource Type | List | Get | Create | Update | Delete | Execute Actions |
1428
1439
  | ------------------------------- | ---- | --- | ------ | ------ | ------ | --------------- |
1429
- | `iacm_workspace` | x | x | | | | |
1440
+ | `iacm_workspace` | x | x | x | x | | |
1441
+ | `iacm_variable_set` | x | x | x | x | | |
1430
1442
  | `iacm_resource` | x | | | | | |
1431
- | `iacm_module` | x | x | | | | |
1443
+ | `iacm_module` | x | x | x | x | | |
1444
+ | `iacm_provider` | x | x | x | x | | |
1432
1445
  | `iacm_workspace_costs` | x | | | | | |
1433
1446
  | `iacm_activity_resource_change` | x | | | | | |
1434
1447
 
1435
1448
  Typical workflow:
1436
1449
 
1437
1450
  1. `harness_list(resource_type="iacm_workspace", org_id="...", project_id="...")` to find the workspace.
1438
- 2. `harness_list(resource_type="iacm_resource", org_id="...", project_id="...", workspace_id="...")` to inspect Terraform resources, outputs, and data sources.
1439
- 3. `harness_list(resource_type="iacm_workspace_costs", org_id="...", project_id="...", workspace_id="...")` to review per-execution cost entries.
1440
- 4. `harness_list(resource_type="iacm_activity_resource_change", org_id="...", project_id="...", activity_id="...", workspace_id="...")` to inspect before/after resource diffs for a plan, apply, or destroy activity.
1451
+ 2. `harness_create` / `harness_update` on `iacm_workspace` to create from scratch or a template (`associated_template`), or update an existing workspace — response is `{ policy_evaluation }` only.
1452
+ 3. `harness_get(resource_type="iacm_workspace", workspace_id="...")` to fetch the created/updated workspace.
1453
+ 4. `harness_list` / `harness_create` / `harness_update` on `iacm_variable_set` (optionally with `resource_scope`) for reusable Terraform/env variable sets response is the VariableSet resource.
1454
+ 5. `harness_list` / `harness_create` / `harness_update` on `iacm_module` for the module registry (`name` + `system` required; add `resource_scope` with `org_id`/`project_id` for an org- or project-scoped module) — response is the module resource.
1455
+ 6. `harness_list` / `harness_create` / `harness_update` on `iacm_provider` for the account provider registry (`body.type` required for create; create returns `{ id }` only — then `harness_get`; update creates/updates **versions** only) — version update may return empty success.
1456
+ 7. `harness_list(resource_type="iacm_resource", org_id="...", project_id="...", workspace_id="...")` to inspect Terraform resources, outputs, and data sources.
1457
+ 8. `harness_list(resource_type="iacm_workspace_costs", org_id="...", project_id="...", workspace_id="...")` to review per-execution cost entries.
1458
+ 9. `harness_list(resource_type="iacm_activity_resource_change", org_id="...", project_id="...", activity_id="...", workspace_id="...")` to inspect before/after resource diffs for a plan, apply, or destroy activity.
1441
1459
 
1442
- IaCM list responses expose `page_count` as the count for the current page only. When `has_more` is true, keep requesting the next 1-based page and sum page counts if you need a total.
1460
+ IaCM list responses expose `page_count` as the count for the current page only (except `iacm_variable_set`, which is not paginated). When `has_more` is true, keep requesting the next 1-based page and sum page counts if you need a total.
1443
1461
 
1444
1462
  ### Internal Developer Portal (IDP)
1445
1463
 
@@ -1470,15 +1488,45 @@ IaCM list responses expose `page_count` as the count for the current page only.
1470
1488
  Use `harness_execute(resource_type="pull_request", action="close", ...)` for an explicit close operation. `harness_update` also accepts `body.state` (`open` or `closed`) and routes state changes to the dedicated Harness Code PR state endpoint; send title/description edits in a separate update call.
1471
1489
 
1472
1490
 
1491
+ ### Release Management
1492
+
1493
+ Release Management (RMG) resources are default-enabled. Definition resources (`release_process`, `release_activity`) support list/get/create/update/delete with `body.yaml`; call `harness_schema(resource_type="release_process"|"release_activity")` before create/update. Execution resources monitor running releases — most list operations require `release_id` (UUID from `harness_list resource_type=release`, or the UI URL slug such as `identifier-1.0.0-abc`). Paste an RMG release URL into `harness_list` to auto-fill `release_id`.
1494
+
1495
+ RMG calls use `${HARNESS_BASE_URL}/gateway/rmg` with account scoping via the `Harness-Account` header. Org/project scope uses header-based scoping when `org_id`/`project_id` are provided. `release_execution_phase` is list-only — use each phase item's `identifier` field as `params.phase_identifier` when calling `harness_get` on phase input/output resources (do not call `harness_get` on `release_execution_phase` itself). Release list `status` filtering is applied client-side on the current page only; keep paging with the same filters when results may span pages.
1496
+
1497
+ | Resource Type | List | Get | Create | Update | Delete | Execute Actions |
1498
+ | ------------------------------------- | ---- | --- | ------ | ------ | ------ | --------------- |
1499
+ | `release_process` | x | x | x | x | x | |
1500
+ | `release_activity` | x | x | x | x | x | |
1501
+ | `release` | x | x | | | | |
1502
+ | `release_execution_phase` | x | | | | | |
1503
+ | `release_execution_task` | x | | | | | |
1504
+ | `release_execution_activity` | x | | | | | |
1505
+ | `release_input` | | x | | | | |
1506
+ | `release_execution_phase_input` | | x | | | | |
1507
+ | `release_execution_phase_output` | | x | | | | |
1508
+ | `release_execution_activity_input` | | x | | | | |
1509
+ | `release_execution_activity_output` | | x | | | | |
1510
+
1511
+ Typical workflow:
1512
+
1513
+ 1. `harness_list(resource_type="release_process", org_id="...", project_id="...")` to discover orchestration process definitions.
1514
+ 2. `harness_schema(resource_type="release_process")` (or `release_activity`) before create/update; then `harness_create` / `harness_update` with `body.yaml`.
1515
+ 3. `harness_list(resource_type="release", org_id="...", project_id="...")` to find active or recent releases (default 30-day look-back; optional `filters.status`, `filters.search_term`, `filters.days_back`).
1516
+ 4. `harness_get(resource_type="release", release_id="...")` for release details.
1517
+ 5. `harness_list(resource_type="release_execution_phase", filters={ release_id: "..." })` for phase status; same `release_id` for `release_execution_task` and `release_execution_activity`.
1518
+ 6. `harness_get` on `release_input`, `release_execution_phase_input`, `release_execution_phase_output`, `release_execution_activity_output`, or `release_execution_activity_input` using `release_id` plus `params.phase_identifier` / `params.activity_identifier` / `activity_execution_id` as documented on each resource.
1519
+
1520
+
1473
1521
  ### Feature Flags
1474
1522
 
1475
1523
 
1476
1524
  | Resource Type | List | Get | Create | Update | Delete | Execute Actions |
1477
1525
  | ----------------------------------- | ---- | --- | ------ | ------ | ------ | ----------------------------------------- |
1478
1526
  | `fme_workspace` | x | | | | | |
1479
- | `fme_environment` | x | | | | | |
1480
- | `fme_feature_flag` | x | x | x | x | x | `kill`, `restore`, `archive`, `unarchive` |
1481
- | `fme_feature_flag_definition` | | x | x | x | | |
1527
+ | `fme_environment` | x | x | x | x | x | |
1528
+ | `fme_feature_flag` | x | x | x | x | x | `kill`, `restore`, `reallocate`, `archive`, `unarchive` |
1529
+ | `fme_feature_flag_definition` | x | x | x | x | x | `kill`, `restore`, `reallocate` |
1482
1530
  | `fme_rollout_status` | x | | | | | |
1483
1531
  | `fme_rule_based_segment` | x | x | x | | x | |
1484
1532
  | `fme_rule_based_segment_definition` | x | | | x | | `enable`, `disable`, `change_request` |
@@ -1486,9 +1534,28 @@ Use `harness_execute(resource_type="pull_request", action="close", ...)` for an
1486
1534
  | `fme_identity` | | | x | x | | |
1487
1535
  | `fme_standard_segment` | x | x | | | | |
1488
1536
  | `fme_segment_keys` | x | | | x | | |
1537
+ | `fme_segment` | x | x | x | | x | |
1538
+ | `fme_segment_definition` | x | x | x | x | x | |
1539
+
1540
+
1541
+ **FME (Split.io) resources** — `fme_`* resources support **dual-mode scoping**: legacy calls pass `workspace_id` and hit the Split.io API (`api.split.io`); newer calls pass `org_id`+`project_id` together and hit Harness-native endpoints (standard `HARNESS_API_KEY`/`HARNESS_BASE_URL`, same auth as every other `harness_*` resource) instead. Passing both `workspace_id` and `org_id`/`project_id` on the same call, or mixing `org_id` with `project_id` alone, is an error — pick one mode per call. Every operation below is available in legacy mode, unchanged. Harness-native mode coverage is currently narrower:
1542
+
1543
+ - **`fme_workspace`** — no Harness-native equivalent; legacy-only (used to discover `workspace_id` values).
1544
+ - **`fme_environment`** — dual-mode `list` (`workspace_id` or `org_id`+`project_id`). `get`/`create`/`update`/`delete` are Harness-native only (`/fme/api/v4/environments`) — MCP never had a `workspace_id` contract for those ops. Native list uses optional `offset`/`limit` (max 100; `harness_list` `size` maps to `limit`); envelope `{data, limit, offset, totalCount}` is promoted to `items`/`total`. Native create/update use `isProduction` (`production` accepted as an alias). Native update is JSON Merge Patch; `name` and `isProduction` are not clearable. Name max 15 characters.
1545
+ - **`fme_feature_flag`** — dual-mode, both branches fully wired. Harness-native (`org_id`+`project_id`): `list`/`get`/`create`/`delete` hit `/fme/api/v4/feature-flags` (body for `create`: `name`, `trafficType`, optional `description`/`tags`/`owners`, per `CreateFeatureFlagRequest`); `update` sends a merge-patch to `/fme/api/v4/feature-flags/{name}`; `archive`/`unarchive` hit `/fme/api/v4/feature-flags/{name}/archive|unarchive` (optional `comment` only — no `title`, per `ArchiveUnarchiveRequest`); `kill`/`restore`/`reallocate` hit `/fme/api/v4/feature-flag-definitions/{name}/kill|restore|reallocate` with `environment_id` as a query param (optional `comment`/`title`, per `FeatureFlagDefinitionActionRequest`).
1546
+ - **`fme_feature_flag_definition`** — `get`/`create`/`update` remain dual-mode (`workspace_id` or `org_id`+`project_id`). `list`/`delete`/`kill`/`restore`/`reallocate` are Harness-native only (`org_id`+`project_id`) — MCP never had a `workspace_id` contract for those ops. Native list requires `feature_flag_name` and uses `offset`/`limit` (default 100, max 100); it does not take `environment_id`. Delete and execute require `environment_id`. Kill/restore/reallocate are the same actions as on `fme_feature_flag`. Get/create/update body matches legacy (`treatments`, `defaultTreatment`, `defaultRule`, optional `rules`/`baselineTreatment`/`trafficAllocation`/`comment`), plus optional `title` in Harness-native mode. Native update is JSON Merge Patch.
1547
+ - **`fme_rollout_status`** — dual-mode `list`. Pass `org_id`+`project_id` (preferred) or the deprecated `workspace_id`. Native pagination uses `offset`/`limit` (max 100; `harness_list` `size` maps to `limit`); results are promoted to `items`/`total`. Each item has `id`, `name`, and optional `description`.
1489
1548
 
1549
+ - **`fme_rule_based_segment`** — (Deprecated — see `fme_segment`.) Harness-native mode is rejected on every operation (`list`/`get`/`create`/`delete`) — use `fme_segment` instead; this resource supports only the legacy `workspace_id` contract.
1550
+ - **`fme_rule_based_segment_definition`** — (Deprecated — see `fme_segment_definition`.) Harness-native mode is rejected on every operation/action (`list`/`update`/`enable`/`disable`/`change_request`) — use `fme_segment_definition` instead (no `enable`/`disable`/`change_request` equivalent there); this resource supports only the legacy `workspace_id`/`environment_id` contract.
1551
+ - **`fme_traffic_type`** — dual-mode `list`. Pass `org_id`+`project_id` (preferred) or the deprecated `workspace_id`. Native pagination uses `offset`/`limit` (max 100; `harness_list` `size` maps to `limit`); results are promoted to `items`/`total`. Each item has `id` and `name` (no `displayAttributeId`).
1552
+ - **`fme_identity`** — `create`/`update` are not yet implemented if `org_id`+`project_id` are passed together; otherwise proceeds as a normal legacy call.
1553
+ - **`fme_standard_segment`** — (Deprecated — see `fme_segment`.) Harness-native mode is rejected on every operation (`list`/`get`) — use `fme_segment` instead; this resource supports only the legacy `workspace_id` contract. There is no `create` operation for this resource in either mode.
1554
+ - **`fme_segment_keys`** — `list`/`update` are not yet implemented if `org_id`+`project_id` are passed together; otherwise proceeds as a normal legacy call.
1555
+ - **`fme_segment`** — `list`/`get`/`create`/`delete` are wired to the real `/fme/api/v4/segments` endpoint (consolidates `fme_standard_segment`/`fme_rule_based_segment`); `create` body: `name`, `trafficType`, `type` (required — one of `standard`/`rule_based`/`large`), optional `description`/`tags`/`owners`.
1556
+ - **`fme_segment_definition`** — Harness-native only (no legacy `workspace_id` support). `list`/`get`/`create`/`update`/`delete` are wired to `/fme/api/v4/segment-definitions`, per `Harness_Split/Main` PR #12644 (open, not yet merged as of this writing — paths may still change). `update` uses JSON Merge Patch on `description`, the only mutable field. There is no `enable`/`disable`/`change_request` action — the backend has no such endpoints for this unified resource.
1490
1557
 
1491
- **FME (Split.io) resources** — `fme_`* resources use the Split.io API (`api.split.io`) and are scoped by workspace ID rather than org/project. In single-user/self-hosted mode, auth uses a Bearer token from `HARNESS_FME_API_KEY`, falling back to a non-placeholder `HARNESS_API_KEY`. `HARNESS_FME_API_KEY` may be a legacy Split admin key or an FME-entitled Harness PAT/SAT, but it is rejected in `multi-user` mode so shared deployments cannot override each session user's credential. Hosted OAuth/service-routing credentials for Harness platform APIs do not authenticate direct Split.io requests. `fme_feature_flag` supports full lifecycle management: create (requires `traffic_type_id`), list, get, update metadata, delete, and kill/restore/archive/unarchive execute actions. Use `fme_traffic_type` to discover traffic type IDs, `fme_identity` to create/update identity attributes, and `fme_standard_segment` / `fme_segment_keys` to inspect standard segments and add member keys. `fme_rule_based_segment` provides CRUD for targeting segments, while `fme_rule_based_segment_definition` manages environment-specific segment rules with enable/disable and change request approval flows.
1558
+ In single-user/self-hosted mode, legacy-mode auth uses a Bearer token from `HARNESS_FME_API_KEY`, falling back to a non-placeholder `HARNESS_API_KEY`. `HARNESS_FME_API_KEY` may be a legacy Split admin key or an FME-entitled Harness PAT/SAT, but it is rejected in `multi-user` mode so shared deployments cannot override each session user's credential. Hosted OAuth/service-routing credentials for Harness platform APIs do not authenticate direct Split.io requests. `fme_feature_flag` supports full lifecycle management in legacy mode: create (requires `traffic_type_id`), list, get, update metadata, delete, and kill/restore/reallocate/archive/unarchive execute actions. Use `fme_traffic_type` to discover traffic type IDs, `fme_identity` to create/update identity attributes, and `fme_standard_segment` / `fme_segment_keys` to inspect standard segments and add member keys. `fme_rule_based_segment` provides CRUD for targeting segments, while `fme_rule_based_segment_definition` manages environment-specific segment rules with enable/disable and change request approval flows.
1492
1559
 
1493
1560
  ### GitOps
1494
1561
 
@@ -1512,40 +1579,43 @@ Use `harness_execute(resource_type="pull_request", action="close", ...)` for an
1512
1579
  ### Chaos Engineering
1513
1580
 
1514
1581
 
1515
- | Resource Type | List | Get | Create | Update | Delete | Execute Actions |
1516
- |------------------------------| ---- | --- | ------ | ------ | ------ |----------------------------------------------------------|
1517
- | `chaos_experiment` | x | x | x | | x | `run`, `stop` |
1518
- | `chaos_experiment_run` | | x | | | | |
1519
- | `chaos_experiment_variable` | x | | | | | |
1520
- | `chaos_component_variable` | | x | | | | |
1521
- | `chaos_input_set` | x | x | x | x | x | |
1522
- | `chaos_experiment_template` | x | x | | | x | `create_from_template` |
1523
- | `chaos_probe` | x | x | x | | x | `enable`, `verify` |
1524
- | `chaos_probe_in_run` | x | | | | | |
1525
- | `chaos_probe_template` | x | x | | | x | |
1526
- | `chaos_infrastructure` | x | | | | | |
1527
- | `chaos_k8s_infrastructure` | x | x | | | | `check_health` |
1528
- | `chaos_environment` | x | | | | | |
1529
- | `chaos_hub` | x | x | x | x | x | |
1530
- | `chaos_hub_fault` | x | | | | | |
1531
- | `chaos_fault` | x | x | | | x | |
1532
- | `chaos_fault_template` | x | x | | | x | |
1533
- | `chaos_fault_experiment_run` | x | | | | | |
1534
- | `chaos_action` | x | x | | | x | |
1535
- | `chaos_action_template` | x | x | | | x | |
1536
- | `chaos_loadtest` | x | x | x | | x | `run`, `stop` |
1537
- | `chaos_application_map` | x | x | | | | |
1538
- | `discovered_namespace` | x | | | | | |
1539
- | `discovered_service` | x | | | | | |
1540
- | `discovered_network_map` | x | | | | | |
1541
- | `chaos_guard_condition` | x | x | | | x | |
1542
- | `chaos_guard_rule` | x | x | | | x | `enable` |
1543
- | `chaos_recommendation` | x | x | | | | |
1544
- | `chaos_risk` | x | x | | | | |
1545
- | `chaos_dr_test` | x | | x | | | |
1546
- | `scanned_risk` | x | x | | | | `occurrences`, `summary_by_service` |
1547
- | `chaos_risk_rule` | x | x | | | | |
1548
- | `chaos_risk_scan` | x | x | x | x | x | `retry`, `abort`, `report`, `report_download`, `heatmap` |
1582
+ | Resource Type | List | Get | Create | Update | Delete | Execute Actions |
1583
+ |----------------------------------| ---- | --- | ------ | ------ | ------ |------------------------------------------------------------------------------|
1584
+ | `chaos_experiment` | x | x | x | | x | `run`, `stop` |
1585
+ | `chaos_experiment_run` | | x | | | | |
1586
+ | `chaos_experiment_variable` | x | | | | | |
1587
+ | `chaos_component_variable` | | x | | | | |
1588
+ | `chaos_input_set` | x | x | x | x | x | |
1589
+ | `chaos_experiment_template` | x | x | | | x | `create_from_template`, `list_revisions`, `get_variables`, `get_yaml`, `compare_revisions` |
1590
+ | `chaos_probe` | x | x | x | | x | `enable`, `verify`, `get_manifest` |
1591
+ | `chaos_probe_in_run` | x | | | | | |
1592
+ | `chaos_probe_template` | x | x | | | x | `get_variables` |
1593
+ | `chaos_infrastructure` | x | | | | | |
1594
+ | `chaos_k8s_infrastructure` | x | x | x | | | `check_health` |
1595
+ | `chaos_enabled_infrastructure` | x | | | | | |
1596
+ | `chaos_environment` | x | | | | | |
1597
+ | `chaos_hub` | x | x | x | x | x | |
1598
+ | `chaos_hub_fault` | x | | | | | |
1599
+ | `chaos_fault` | x | x | | | x | `get_variables`, `get_yaml` |
1600
+ | `chaos_fault_template` | x | x | | | x | `list_revisions`, `get_variables`, `get_yaml`, `compare_revisions` |
1601
+ | `chaos_fault_experiment_run` | x | | | | | |
1602
+ | `chaos_action` | x | x | x | | x | `get_manifest` |
1603
+ | `chaos_action_template` | x | x | | | x | `list_revisions`, `get_variables`, `compare_revisions` |
1604
+ | `chaos_loadtest` | x | x | x | x | x | `run`, `stop` |
1605
+ | `chaos_service` | x | x | x | x | x | `list_experiment_runs`, `list_load_tests` |
1606
+ | `chaos_application_map` | x | x | | | | |
1607
+ | `discovered_agent` | x | | | | | |
1608
+ | `discovered_namespace` | x | | | | | |
1609
+ | `discovered_service` | x | | | | | |
1610
+ | `discovered_network_map` | x | | | | | |
1611
+ | `chaos_guard_condition` | x | x | | | x | |
1612
+ | `chaos_guard_rule` | x | x | | | x | `enable` |
1613
+ | `chaos_recommendation` | x | x | | | | |
1614
+ | `chaos_risk` | x | x | | | | |
1615
+ | `chaos_dr_test` | x | | x | | | |
1616
+ | `scanned_risk` | x | x | | | | `occurrences`, `summary_by_service` |
1617
+ | `chaos_risk_rule` | x | x | | | | |
1618
+ | `chaos_risk_scan` | x | x | x | x | x | `retry`, `abort`, `report`, `report_download`, `heatmap` |
1549
1619
 
1550
1620
  ### Cloud Cost Management (CCM)
1551
1621
 
@@ -1622,7 +1692,7 @@ Evidence Vault stores in-toto attestations (SDLC evidences). List supports accou
1622
1692
  | `security_issue` | x | | | | | |
1623
1693
  | `security_issue_filter` | x | | | | | |
1624
1694
  | `security_exemption` | x | | x | | | `approve`, `reject` |
1625
- | `sast_remediation_diff` | x | | | | | |
1695
+ | `remediation_diff` | x | | | | | |
1626
1696
 
1627
1697
  `security_exemption` create is a `high_write` operation. The server derives `requester_id` from the authenticated PAT, sets `exemptFutureOccurrences=true`, and defaults `duration_days` to 30 when not provided. For listing exemptions, pass a small explicit page size (for example `filters: { "status": "Pending", "size": 5 }`) and follow the `_nextPageHint` returned in each response.
1628
1698
 
@@ -1759,7 +1829,7 @@ Security exemption execute workflow:
1759
1829
 
1760
1830
  ## Toolset Filtering
1761
1831
 
1762
- By default, 38 of 39 toolsets are enabled. One toolset is opt-in and excluded from the defaults:
1832
+ By default, 39 of 40 toolsets are enabled. One toolset is opt-in and excluded from the defaults:
1763
1833
 
1764
1834
  - **`ansible`** — Harness Ansible (inventories, playbooks, hosts, activity). Opt-in because it is project-scoped and adds concepts many users do not need.
1765
1835
 
@@ -1820,14 +1890,14 @@ Available toolset names:
1820
1890
  | `dashboards` | dashboard, dashboard_data |
1821
1891
  | `idp` | idp_entity, scorecard, scorecard_check, scorecard_stats, scorecard_check_stats, idp_score, idp_workflow, idp_tech_doc |
1822
1892
  | `pull-requests` | pull_request, pr_reviewer, pr_comment, pr_check, pr_activity |
1823
- | `feature-flags` | fme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, fme_traffic_type, fme_identity, fme_standard_segment, fme_segment_keys |
1893
+ | `feature-flags` | fme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, fme_traffic_type, fme_identity, fme_standard_segment, fme_segment_keys, fme_segment, fme_segment_definition |
1824
1894
  | `gitops` | gitops_agent, gitops_application, gitops_cluster, gitops_repository, gitops_applicationset, gitops_repo_credential, gitops_app_event, gitops_pod_log, gitops_managed_resource, gitops_resource_action, gitops_dashboard, gitops_app_resource_tree |
1825
- | `chaos` | chaos_experiment, chaos_experiment_run, chaos_experiment_variable, chaos_component_variable, chaos_input_set, chaos_experiment_template, chaos_probe, chaos_probe_in_run, chaos_probe_template, chaos_infrastructure, chaos_k8s_infrastructure, chaos_environment, chaos_hub, chaos_hub_fault, chaos_fault, chaos_fault_template, chaos_fault_experiment_run, chaos_action, chaos_action_template, chaos_loadtest, chaos_application_map, discovered_namespace, discovered_service, discovered_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk, chaos_dr_test, scanned_risk, chaos_risk_rule, chaos_risk_scan |
1895
+ | `chaos` | chaos_experiment, chaos_experiment_run, chaos_experiment_variable, chaos_component_variable, chaos_input_set, chaos_experiment_template, chaos_probe, chaos_probe_in_run, chaos_probe_template, chaos_infrastructure, chaos_k8s_infrastructure, chaos_enabled_infrastructure, chaos_environment, chaos_hub, chaos_hub_fault, chaos_fault, chaos_fault_template, chaos_fault_experiment_run, chaos_action, chaos_action_template, chaos_loadtest, chaos_service, chaos_application_map, discovered_agent, discovered_namespace, discovered_service, discovered_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk, chaos_dr_test, scanned_risk, chaos_risk_rule, chaos_risk_scan |
1826
1896
  | `ccm` | cost_perspective, cost_breakdown, cost_timeseries, cost_summary, cost_recommendation, cost_anomaly, cost_anomaly_summary, cost_category, cost_account_overview, cost_filter_value, cost_recommendation_stats, cost_recommendation_detail, cost_commitment |
1827
1897
  | `sei` | sei_metric, sei_productivity_metric, sei_dora_metric, sei_team, sei_team_detail, sei_org_tree, sei_org_tree_detail, sei_business_alignment, sei_ai_usage, sei_ai_adoption, sei_ai_impact, sei_ai_raw_metric |
1828
1898
  | `scs` | scs_artifact_source, artifact_security, scs_artifact_component, scs_artifact_remediation, scs_chain_of_custody, scs_compliance_result, code_repo_security, scs_sbom |
1829
1899
  | `evidence-vault` | attestation |
1830
- | `sto` | security_issue, security_issue_filter, security_exemption, sast_remediation_diff |
1900
+ | `sto` | security_issue, security_issue_filter, security_exemption, remediation_diff |
1831
1901
  | `dbops` | database_schema, database_instance, database_snapshot_object, database_llm_authoring_pipeline |
1832
1902
  | `access_control` | user, user_group, service_account, role, role_assignment, resource_group, permission |
1833
1903
  | `governance` | policy, policy_set, policy_evaluation |
@@ -1837,8 +1907,9 @@ Available toolset names:
1837
1907
  | `knowledge-graph` | kg_queryable_type_summary, kg_grammar, hql_query |
1838
1908
  | `semantic-layer` | kg_type, kg_related_type |
1839
1909
  | `ai-evals` | eval_dataset, eval_dataset_item, evaluation, eval_run, eval_run_item, eval_run_by_eval, eval_metric, eval_metric_set, eval_metric_set_entry, eval_suite, eval_suite_evaluation, eval_suite_run, eval_target, eval_annotation, eval_analytics, eval_git_settings, eval_registry_item, eval_git_registration, online_eval |
1840
- | `iacm` | iacm_workspace, iacm_resource, iacm_module, iacm_workspace_costs, iacm_activity_resource_change |
1910
+ | `iacm` | iacm_workspace, iacm_variable_set, iacm_resource, iacm_module, iacm_provider, iacm_workspace_costs, iacm_activity_resource_change |
1841
1911
  | `ansible` *(opt-in)* | ansible_inventory, ansible_playbook, ansible_host, ansible_host_activity, ansible_activity |
1912
+ | `release-management` | release_process, release_activity, release, release_execution_phase, release_execution_task, release_execution_activity, release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_input, release_execution_activity_output |
1842
1913
 
1843
1914
 
1844
1915
  ## Architecture
@@ -1856,8 +1927,8 @@ Available toolset names:
1856
1927
  |
1857
1928
  +--------v---------+
1858
1929
  | Registry | <-- Declarative resource definitions
1859
- | 38 Toolsets | (data files, not code)
1860
- | 223 Resource Types|
1930
+ | 39 Toolsets | (data files, not code)
1931
+ | 240 Resource Types|
1861
1932
  +--------+---------+
1862
1933
  |
1863
1934
  +--------v---------+
@@ -1 +1 @@
1
- {"version":3,"file":"harness-client.d.ts","sourceRoot":"","sources":["../../src/client/harness-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,cAAc,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2HjD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,GAAG,SAAS,CAAC;AAEzD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAkB;gBAEjC,MAAM,EAAE,MAAM;IAY1B;;;OAGG;IACH,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB;IAIxB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,gBAAgB;IA4CxB;;;;;;;;OAQG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IA2BnC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IA8JrD;;;;OAIG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2F/D,OAAO,CAAC,QAAQ;CA8DjB"}
1
+ {"version":3,"file":"harness-client.d.ts","sourceRoot":"","sources":["../../src/client/harness-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,cAAc,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuJjD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,GAAG,SAAS,CAAC;AAEzD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAkB;gBAEjC,MAAM,EAAE,MAAM;IAY1B;;;OAGG;IACH,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,6EAA6E;IAC7E,OAAO,CAAC,gBAAgB;IAIxB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,gBAAgB;IA4CxB;;;;;;;;OAQG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IA2BnC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAwJrD;;;;OAIG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2F/D,OAAO,CAAC,QAAQ;CA8DjB"}
@@ -99,8 +99,36 @@ const ERROR_FIELD_ENRICHMENTS = [
99
99
  { pathPrefix: "/chaos/", field: "description" },
100
100
  { pathPrefix: "/loadTest/", field: "description" },
101
101
  ];
102
+ const MAX_ERROR_DETAIL_CHARS = 400;
103
+ /** Extra NG fields (`details`, `detailedMessage`, `responseMessages`) not already in `message`. */
104
+ function collectErrorDetail(parsed, message) {
105
+ const seen = new Set([message.trim()]);
106
+ const extras = [];
107
+ const add = (value) => {
108
+ if (typeof value !== "string")
109
+ return;
110
+ const text = value.trim();
111
+ if (!text || seen.has(text))
112
+ return;
113
+ seen.add(text);
114
+ extras.push(text);
115
+ };
116
+ add(parsed.details);
117
+ add(parsed.detailedMessage);
118
+ for (const entry of Array.isArray(parsed.responseMessages) ? parsed.responseMessages : []) {
119
+ if (entry && typeof entry === "object")
120
+ add(entry.message);
121
+ }
122
+ if (extras.length === 0)
123
+ return undefined;
124
+ const detail = extras.join("; ");
125
+ return detail.length > MAX_ERROR_DETAIL_CHARS
126
+ ? `${detail.slice(0, MAX_ERROR_DETAIL_CHARS)}…`
127
+ : detail;
128
+ }
102
129
  function enrichErrorMessage(rawMessage, parsed, path) {
103
- let message = rawMessage;
130
+ const detail = collectErrorDetail(parsed, rawMessage);
131
+ let message = detail ? `${rawMessage} — ${detail}` : rawMessage;
104
132
  for (const { pathPrefix, field } of ERROR_FIELD_ENRICHMENTS) {
105
133
  const value = parsed[field];
106
134
  if (path.startsWith(pathPrefix) && typeof value === "string" && value) {
@@ -317,10 +345,6 @@ export class HarnessClient {
317
345
  }
318
346
  throw error;
319
347
  }
320
- // 204 No Content — valid success response (e.g. PATCH/DELETE on PM API)
321
- if (response.status === 204) {
322
- return { status: "SUCCESS", message: "No content" };
323
- }
324
348
  // Binary response mode — return raw ArrayBuffer (used for ZIP downloads)
325
349
  if (options.responseType === "buffer") {
326
350
  const buffer = await response.arrayBuffer();
@@ -328,8 +352,10 @@ export class HarnessClient {
328
352
  return buffer;
329
353
  }
330
354
  const text = await response.text();
355
+ // Empty body on 2xx is a valid success (204 No Content; also 201 from
356
+ // IaCM provider-registry create/update version, which returns no JSON).
331
357
  if (!text) {
332
- throw new HarnessApiError(`Empty response body from ${method} ${options.path}`, 502);
358
+ return { status: "SUCCESS", message: "No content" };
333
359
  }
334
360
  let data;
335
361
  try {