harness-mcp-v2 0.6.2 → 0.6.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.

Potentially problematic release.


This version of harness-mcp-v2 might be problematic. Click here for more details.

@@ -0,0 +1,42 @@
1
+ /**
2
+ * DTOs for the Harness Intelligence Service (AI DevOps Agent).
3
+ *
4
+ * Mirrors the Go SDK's common/client/dto/intelligence.go.
5
+ */
6
+ /** Supported actions for the AI DevOps Agent */
7
+ export type RequestAction = "CREATE_PIPELINE" | "UPDATE_PIPELINE" | "CREATE_ENVIRONMENT" | "UPDATE_ENVIRONMENT" | "CREATE_SECRET" | "UPDATE_SECRET" | "CREATE_SERVICE" | "UPDATE_SERVICE" | "CREATE_CONNECTOR" | "UPDATE_CONNECTOR" | "CREATE_PROCESS";
8
+ /** Const array of all action strings — used for Zod enum validation */
9
+ export declare const ACTION_VALUES: readonly ["CREATE_PIPELINE", "UPDATE_PIPELINE", "CREATE_ENVIRONMENT", "UPDATE_ENVIRONMENT", "CREATE_SECRET", "UPDATE_SECRET", "CREATE_SERVICE", "UPDATE_SERVICE", "CREATE_CONNECTOR", "UPDATE_CONNECTOR", "CREATE_PROCESS"];
10
+ /** A context item passed to the intelligence service (e.g. existing YAML for updates) */
11
+ export interface ContextItem {
12
+ type: string;
13
+ payload: unknown;
14
+ }
15
+ /** Harness scoping context sent with every intelligence request */
16
+ export interface HarnessContext {
17
+ account_id: string;
18
+ org_id?: string;
19
+ project_id?: string;
20
+ }
21
+ /** Request body for POST /gateway/harness-intelligence/api/v1/chat/platform */
22
+ export interface ServiceChatRequest {
23
+ harness_context: HarnessContext;
24
+ prompt: string;
25
+ action: RequestAction;
26
+ conversation_id: string;
27
+ context?: ContextItem[];
28
+ stream?: boolean;
29
+ }
30
+ /** Response from the intelligence service */
31
+ export interface ServiceChatResponse {
32
+ conversation_id: string;
33
+ capabilities_to_run?: Record<string, unknown>[];
34
+ response?: string;
35
+ error?: string;
36
+ }
37
+ /** Internal representation of a parsed SSE event */
38
+ export interface SSEEvent {
39
+ type: string;
40
+ data: string;
41
+ }
42
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../../src/client/dto/intelligence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gDAAgD;AAChD,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,GACpB,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,uEAAuE;AACvE,eAAO,MAAM,aAAa,6NAYhB,CAAC;AAEX,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oDAAoD;AACpD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * DTOs for the Harness Intelligence Service (AI DevOps Agent).
3
+ *
4
+ * Mirrors the Go SDK's common/client/dto/intelligence.go.
5
+ */
6
+ /** Const array of all action strings — used for Zod enum validation */
7
+ export const ACTION_VALUES = [
8
+ "CREATE_PIPELINE",
9
+ "UPDATE_PIPELINE",
10
+ "CREATE_ENVIRONMENT",
11
+ "UPDATE_ENVIRONMENT",
12
+ "CREATE_SECRET",
13
+ "UPDATE_SECRET",
14
+ "CREATE_SERVICE",
15
+ "UPDATE_SERVICE",
16
+ "CREATE_CONNECTOR",
17
+ "UPDATE_CONNECTOR",
18
+ "CREATE_PROCESS",
19
+ ];
20
+ //# sourceMappingURL=intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../../src/client/dto/intelligence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;CACR,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Client for the Harness Intelligence Service (AI DevOps Agent).
3
+ *
4
+ * Supports both streaming (SSE) and non-streaming request modes.
5
+ */
6
+ import type { HarnessClient } from "./harness-client.js";
7
+ import type { ServiceChatRequest, ServiceChatResponse, SSEEvent } from "./dto/intelligence.js";
8
+ export interface ChatOptions {
9
+ /** External abort signal */
10
+ signal?: AbortSignal;
11
+ /** Callback invoked for each SSE event during streaming */
12
+ onProgress?: (event: SSEEvent) => void;
13
+ }
14
+ export declare class IntelligenceClient {
15
+ private readonly client;
16
+ static readonly API_PATH = "/gateway/harness-intelligence/api/v1/chat/platform";
17
+ static readonly TIMEOUT_MS = 300000;
18
+ constructor(client: HarnessClient);
19
+ /**
20
+ * Send a chat request to the Intelligence service.
21
+ * When `request.stream` is true, reads the SSE stream and accumulates the response.
22
+ */
23
+ sendChat(request: ServiceChatRequest, options?: ChatOptions): Promise<ServiceChatResponse>;
24
+ private sendNonStreaming;
25
+ private sendStreaming;
26
+ /**
27
+ * Parse SSE stream from the intelligence service.
28
+ *
29
+ * SSE format:
30
+ * event: <type>\n
31
+ * data: <content>\n
32
+ * \n
33
+ *
34
+ * - `event: error` + `data: eof` → end of stream (normal termination)
35
+ * - `event: error` + other data → real error
36
+ * - All other events → content to accumulate
37
+ */
38
+ private processStream;
39
+ /**
40
+ * Parse complete SSE events from a buffer, returning parsed events
41
+ * and any remaining incomplete data.
42
+ */
43
+ private parseSSEBuffer;
44
+ }
45
+ //# sourceMappingURL=intelligence-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence-client.d.ts","sourceRoot":"","sources":["../../src/client/intelligence-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK/F,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACxC;AAWD,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,MAAM,CAAC,QAAQ,CAAC,QAAQ,wDAAwD;IAChF,MAAM,CAAC,QAAQ,CAAC,UAAU,UAAW;gBAER,MAAM,EAAE,aAAa;IAElD;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAOlF,gBAAgB;YAehB,aAAa;IAkB3B;;;;;;;;;;;OAWG;YACW,aAAa;IAyD3B;;;OAGG;IACH,OAAO,CAAC,cAAc;CA4BvB"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Client for the Harness Intelligence Service (AI DevOps Agent).
3
+ *
4
+ * Supports both streaming (SSE) and non-streaming request modes.
5
+ */
6
+ import { createLogger } from "../utils/logger.js";
7
+ const log = createLogger("intelligence");
8
+ /** Build query params matching the Go implementation's scope injection. */
9
+ function buildScopeParams(request) {
10
+ const params = {};
11
+ const ctx = request.harness_context;
12
+ if (ctx.org_id)
13
+ params.orgIdentifier = ctx.org_id;
14
+ if (ctx.project_id)
15
+ params.projectIdentifier = ctx.project_id;
16
+ return params;
17
+ }
18
+ export class IntelligenceClient {
19
+ client;
20
+ static API_PATH = "/gateway/harness-intelligence/api/v1/chat/platform";
21
+ static TIMEOUT_MS = 300_000; // 5 minutes
22
+ constructor(client) {
23
+ this.client = client;
24
+ }
25
+ /**
26
+ * Send a chat request to the Intelligence service.
27
+ * When `request.stream` is true, reads the SSE stream and accumulates the response.
28
+ */
29
+ async sendChat(request, options) {
30
+ if (request.stream) {
31
+ return this.sendStreaming(request, options);
32
+ }
33
+ return this.sendNonStreaming(request, options);
34
+ }
35
+ async sendNonStreaming(request, options) {
36
+ log.info("Sending non-streaming intelligence request", { action: request.action });
37
+ return this.client.request({
38
+ method: "POST",
39
+ path: IntelligenceClient.API_PATH,
40
+ params: buildScopeParams(request),
41
+ body: request,
42
+ signal: options?.signal,
43
+ timeoutMs: IntelligenceClient.TIMEOUT_MS,
44
+ });
45
+ }
46
+ async sendStreaming(request, options) {
47
+ log.info("Sending streaming intelligence request", { action: request.action });
48
+ const response = await this.client.requestStream({
49
+ method: "POST",
50
+ path: IntelligenceClient.API_PATH,
51
+ params: buildScopeParams(request),
52
+ body: request,
53
+ signal: options?.signal,
54
+ timeoutMs: IntelligenceClient.TIMEOUT_MS,
55
+ });
56
+ return this.processStream(response, request.conversation_id, options?.onProgress);
57
+ }
58
+ /**
59
+ * Parse SSE stream from the intelligence service.
60
+ *
61
+ * SSE format:
62
+ * event: <type>\n
63
+ * data: <content>\n
64
+ * \n
65
+ *
66
+ * - `event: error` + `data: eof` → end of stream (normal termination)
67
+ * - `event: error` + other data → real error
68
+ * - All other events → content to accumulate
69
+ */
70
+ async processStream(response, conversationId, onProgress) {
71
+ const result = {
72
+ conversation_id: conversationId,
73
+ response: "",
74
+ };
75
+ if (!response.body) {
76
+ log.warn("Stream response has no body");
77
+ return result;
78
+ }
79
+ const reader = response.body.getReader();
80
+ const decoder = new TextDecoder();
81
+ let buffer = "";
82
+ try {
83
+ while (true) {
84
+ const { done, value } = await reader.read();
85
+ if (done)
86
+ break;
87
+ buffer += decoder.decode(value, { stream: true });
88
+ const events = this.parseSSEBuffer(buffer);
89
+ buffer = events.remaining;
90
+ for (const event of events.parsed) {
91
+ log.debug("SSE event", { type: event.type, data: event.data.slice(0, 200) });
92
+ if (event.type === "error") {
93
+ if (event.data === "eof") {
94
+ // Normal end-of-stream signal — still forward to onProgress
95
+ log.debug("SSE stream ended (eof)");
96
+ }
97
+ else {
98
+ // Real error from the service
99
+ result.error = event.data;
100
+ log.error("Intelligence service error", { error: event.data });
101
+ }
102
+ }
103
+ else {
104
+ // Accumulate content
105
+ result.response = (result.response ?? "") + event.data;
106
+ }
107
+ if (onProgress) {
108
+ onProgress(event);
109
+ }
110
+ }
111
+ }
112
+ }
113
+ finally {
114
+ reader.releaseLock();
115
+ }
116
+ return result;
117
+ }
118
+ /**
119
+ * Parse complete SSE events from a buffer, returning parsed events
120
+ * and any remaining incomplete data.
121
+ */
122
+ parseSSEBuffer(buffer) {
123
+ const parsed = [];
124
+ // SSE events are separated by double newlines
125
+ const blocks = buffer.split("\n\n");
126
+ // Last element may be incomplete
127
+ const remaining = blocks.pop() ?? "";
128
+ for (const block of blocks) {
129
+ if (!block.trim())
130
+ continue;
131
+ let eventType = "message";
132
+ let data = "";
133
+ for (const line of block.split("\n")) {
134
+ if (line.startsWith("event:")) {
135
+ eventType = line.slice("event:".length).trim();
136
+ }
137
+ else if (line.startsWith("data:")) {
138
+ data = line.slice("data:".length).trim();
139
+ }
140
+ }
141
+ if (data || eventType) {
142
+ parsed.push({ type: eventType, data });
143
+ }
144
+ }
145
+ return { parsed, remaining };
146
+ }
147
+ }
148
+ //# sourceMappingURL=intelligence-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence-client.js","sourceRoot":"","sources":["../../src/client/intelligence-client.ts"],"names":[],"mappings":"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"}
package/build/config.d.ts CHANGED
@@ -13,12 +13,12 @@ export declare const ConfigSchema: z.ZodPipe<z.ZodObject<{
13
13
  HARNESS_DEFAULT_PROJECT_ID: z.ZodOptional<z.ZodString>;
14
14
  HARNESS_API_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
15
15
  HARNESS_MAX_RETRIES: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
16
- LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
16
+ LOG_LEVEL: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodDefault<z.ZodEnum<{
17
17
  error: "error";
18
18
  debug: "debug";
19
19
  info: "info";
20
20
  warn: "warn";
21
- }>>;
21
+ }>>>;
22
22
  HARNESS_TOOLSETS: z.ZodOptional<z.ZodString>;
23
23
  HARNESS_MAX_BODY_SIZE_MB: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
24
24
  HARNESS_RATE_LIMIT_RPS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO5E;AAiBD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CAQnC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO5E;AAoBD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CAQnC"}
package/build/config.js CHANGED
@@ -20,7 +20,7 @@ const RawConfigSchema = z.object({
20
20
  HARNESS_DEFAULT_PROJECT_ID: z.string().optional(),
21
21
  HARNESS_API_TIMEOUT_MS: z.coerce.number().default(30000),
22
22
  HARNESS_MAX_RETRIES: z.coerce.number().default(3),
23
- LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
23
+ LOG_LEVEL: z.preprocess((val) => (val === "" ? undefined : val), z.enum(["debug", "info", "warn", "error"]).default("info")),
24
24
  HARNESS_TOOLSETS: z.string().optional(),
25
25
  HARNESS_MAX_BODY_SIZE_MB: z.coerce.number().default(10),
26
26
  HARNESS_RATE_LIMIT_RPS: z.coerce.number().default(10),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ToolsetDefinition } from "../types.js";
2
+ /**
3
+ * Intelligence toolset — exists for HARNESS_TOOLSETS filtering.
4
+ * The `harness_ask` tool is standalone (not registry-dispatched), but
5
+ * this toolset must be present so `parseToolsetFilter()` accepts "intelligence".
6
+ */
7
+ export declare const intelligenceToolset: ToolsetDefinition;
8
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../../src/registry/toolsets/intelligence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,iBAKjC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Intelligence toolset — exists for HARNESS_TOOLSETS filtering.
3
+ * The `harness_ask` tool is standalone (not registry-dispatched), but
4
+ * this toolset must be present so `parseToolsetFilter()` accepts "intelligence".
5
+ */
6
+ export const intelligenceToolset = {
7
+ name: "intelligence",
8
+ displayName: "AI Intelligence",
9
+ description: "Harness AI DevOps Agent — generate and update entities via natural language",
10
+ resources: [],
11
+ };
12
+ //# sourceMappingURL=intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../../src/registry/toolsets/intelligence.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,6EAA6E;IAC1F,SAAS,EAAE,EAAE;CACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Registry } from "../registry/index.js";
3
+ import type { HarnessClient } from "../client/harness-client.js";
4
+ import type { Config } from "../config.js";
5
+ export declare function registerAskTool(server: McpServer, registry: Registry, client: HarnessClient, config: Config): void;
6
+ //# sourceMappingURL=harness-ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-ask.d.ts","sourceRoot":"","sources":["../../src/tools/harness-ask.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAW3C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,IAAI,CA8KN"}
@@ -0,0 +1,158 @@
1
+ import * as z from "zod/v4";
2
+ import { ACTION_VALUES } from "../client/dto/intelligence.js";
3
+ import { IntelligenceClient } from "../client/intelligence-client.js";
4
+ import { jsonResult, errorResult } from "../utils/response-formatter.js";
5
+ import { HarnessApiError, isUserFixableApiError, toMcpError } from "../utils/errors.js";
6
+ import { sendProgress, sendLog } from "../utils/progress.js";
7
+ import { createLogger } from "../utils/logger.js";
8
+ const log = createLogger("ask");
9
+ export function registerAskTool(server, registry, client, config) {
10
+ // Skip registration in read-only mode (this is a write tool)
11
+ if (config.HARNESS_READ_ONLY)
12
+ return;
13
+ // Skip registration when HARNESS_TOOLSETS is set but doesn't include "intelligence"
14
+ const enabledToolsets = registry.getAllToolsets();
15
+ if (config.HARNESS_TOOLSETS && !enabledToolsets.some((t) => t.name === "intelligence")) {
16
+ return;
17
+ }
18
+ const intelligenceClient = new IntelligenceClient(client);
19
+ server.registerTool("harness_ask", {
20
+ description: "Ask the Harness AI DevOps Agent to create or update entities (pipelines, environments, connectors, services, secrets) via natural language. " +
21
+ "Returns generated YAML and automatically persists it in Harness (auto-accepts). " +
22
+ "Set auto_accept to false to review the YAML before persisting. " +
23
+ "For multi-turn refinement, pass the returned conversation_id back with a REGENERATE prompt.",
24
+ inputSchema: {
25
+ prompt: z.string().min(1).describe("The natural language prompt for the AI DevOps agent"),
26
+ action: z.enum(ACTION_VALUES).describe("The action to perform (e.g. CREATE_PIPELINE, UPDATE_SERVICE)"),
27
+ stream: z.boolean().describe("Stream the response with real-time progress (default: false for reliability)").default(false).optional(),
28
+ auto_accept: z.boolean().describe("Automatically ACCEPT the generated entity to persist it in Harness (default: true). Set to false to only preview the YAML.").default(true).optional(),
29
+ conversation_id: z
30
+ .string()
31
+ .describe("Conversation ID for multi-turn context (auto-generated if omitted)")
32
+ .optional(),
33
+ context: z
34
+ .array(z.object({
35
+ type: z.string().describe("Context item type"),
36
+ payload: z.unknown().describe("Context payload (for UPDATE operations: existing YAML string)"),
37
+ }))
38
+ .describe("Context for UPDATE operations — pass existing YAML to modify")
39
+ .optional(),
40
+ org_id: z.string().describe("Organization identifier (overrides default)").optional(),
41
+ project_id: z.string().describe("Project identifier (overrides default)").optional(),
42
+ },
43
+ annotations: {
44
+ title: "Ask AI DevOps Agent",
45
+ readOnlyHint: false,
46
+ destructiveHint: false,
47
+ idempotentHint: false,
48
+ openWorldHint: true,
49
+ },
50
+ }, async (args, extra) => {
51
+ try {
52
+ const conversationId = args.conversation_id ?? crypto.randomUUID();
53
+ const autoAccept = args.auto_accept ?? true;
54
+ const harnessContext = {
55
+ account_id: client.account,
56
+ org_id: args.org_id ?? config.HARNESS_DEFAULT_ORG_ID,
57
+ project_id: args.project_id ?? config.HARNESS_DEFAULT_PROJECT_ID,
58
+ };
59
+ let eventCount = 0;
60
+ const makeOnProgress = (streaming) => streaming
61
+ ? (event) => {
62
+ eventCount++;
63
+ sendProgress(extra, eventCount, undefined, `SSE: ${event.type}`).catch(() => { });
64
+ sendLog(extra, "debug", "intelligence", `[${event.type}] ${event.data.slice(0, 200)}`).catch(() => { });
65
+ }
66
+ : undefined;
67
+ /**
68
+ * Send a chat request, falling back to non-streaming if streaming returns 422.
69
+ */
70
+ const sendWithFallback = async (req) => {
71
+ if (req.stream) {
72
+ try {
73
+ return await intelligenceClient.sendChat(req, {
74
+ signal: extra.signal,
75
+ onProgress: makeOnProgress(true),
76
+ });
77
+ }
78
+ catch (streamErr) {
79
+ if (streamErr instanceof HarnessApiError && streamErr.statusCode === 422) {
80
+ log.warn("Streaming returned 422, falling back to non-streaming");
81
+ return intelligenceClient.sendChat({ ...req, stream: false }, {
82
+ signal: extra.signal,
83
+ });
84
+ }
85
+ throw streamErr;
86
+ }
87
+ }
88
+ return intelligenceClient.sendChat(req, { signal: extra.signal });
89
+ };
90
+ const chatRequest = {
91
+ harness_context: harnessContext,
92
+ prompt: args.prompt,
93
+ action: args.action,
94
+ conversation_id: conversationId,
95
+ context: args.context,
96
+ stream: args.stream ?? false,
97
+ };
98
+ log.info("Calling intelligence service", {
99
+ action: args.action,
100
+ stream: chatRequest.stream,
101
+ autoAccept,
102
+ conversationId,
103
+ });
104
+ const result = await sendWithFallback(chatRequest);
105
+ // Always use our locally-generated ID as fallback
106
+ const effectiveConversationId = result.conversation_id || conversationId;
107
+ if (result.error) {
108
+ return errorResult(result.error);
109
+ }
110
+ const hasAccept = result.capabilities_to_run?.some((cap) => JSON.stringify(cap).includes("ACCEPT"));
111
+ // Auto-ACCEPT: send a follow-up to persist the entity in Harness
112
+ if (autoAccept && hasAccept) {
113
+ log.info("Auto-accepting generated entity", { conversationId: effectiveConversationId });
114
+ sendLog(extra, "info", "intelligence", "Auto-accepting to persist in Harness...").catch(() => { });
115
+ const acceptRequest = {
116
+ harness_context: harnessContext,
117
+ prompt: "ACCEPT",
118
+ action: args.action,
119
+ conversation_id: effectiveConversationId,
120
+ stream: false, // ACCEPT is a quick operation — no need to stream
121
+ };
122
+ const acceptResult = await sendWithFallback(acceptRequest);
123
+ if (acceptResult.error) {
124
+ return jsonResult({
125
+ conversation_id: effectiveConversationId,
126
+ response: result.response,
127
+ accept_error: acceptResult.error,
128
+ persisted: false,
129
+ });
130
+ }
131
+ return jsonResult({
132
+ conversation_id: acceptResult.conversation_id || effectiveConversationId,
133
+ response: acceptResult.response ?? result.response,
134
+ persisted: true,
135
+ });
136
+ }
137
+ // No auto-accept: return YAML with guidance for manual follow-up
138
+ const response = {
139
+ conversation_id: effectiveConversationId,
140
+ response: result.response,
141
+ persisted: false,
142
+ };
143
+ if (result.capabilities_to_run?.length) {
144
+ response.available_actions = result.capabilities_to_run;
145
+ response.next_step =
146
+ `To persist this entity, call harness_ask again with conversation_id "${effectiveConversationId}", ` +
147
+ `prompt "ACCEPT", and the same action. Do NOT use harness_create/harness_update.`;
148
+ }
149
+ return jsonResult(response);
150
+ }
151
+ catch (err) {
152
+ if (isUserFixableApiError(err))
153
+ return errorResult(err.message);
154
+ throw toMcpError(err);
155
+ }
156
+ });
157
+ }
158
+ //# sourceMappingURL=harness-ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-ask.js","sourceRoot":"","sources":["../../src/tools/harness-ask.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-mcp-v2",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "Give AI agents full access to the Harness.io platform — manage pipelines, deployments, feature flags, infrastructure, and 122+ resource types through 10 MCP tools",
5
5
  "type": "module",
6
6
  "main": "build/index.js",