Harness MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Harness MCP Servershow failed executions across all projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
UPDATE: This Repo has been brought into Harness.io https://github.com/harness/mcp-server - main branch has this repo and we are GA'ing this MCP
Harness MCP Server 2.0
An MCP (Model Context Protocol) server that gives AI agents full access to the Harness.io platform through 10 consolidated tools and 137 resource types.
Related MCP server: Coolify MCP Server
Why Use This MCP Server
Most MCP servers map one tool per API endpoint. For a platform as broad as Harness, that means 240+ tools — and LLMs get worse at tool selection as the count grows. Context windows fill up with schemas, and every new endpoint means new code.
This server is built differently:
10 tools, 137 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 10 tools instead of hundreds.Full platform coverage. 29 toolsets spanning CI/CD, GitOps, Feature Flags, Cloud Cost Management, Security Testing, Chaos Engineering, Internal Developer Portal, Software Supply Chain, Governance, Service Overrides, Visualizations, and more. Not just pipelines — the entire Harness platform.
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.
26 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.
Works everywhere. Stdio transport for local clients (Claude Desktop, Cursor, Windsurf), HTTP transport for remote/shared deployments, Docker and Kubernetes ready.
Zero-config start. Just provide a Harness API key. Account ID is auto-extracted from PAT tokens, org/project defaults are optional, and toolset filtering lets you expose only what you need.
Extensible by design. Adding a new Harness resource means adding a declarative data file — no new tool registration, no schema changes, no prompt updates.
Prerequisites
Before installing or running the server, you need a Harness API key:
Log in to your Harness account
Go to My Profile → API Keys → + New API Key
Create a new Token under the API key — this generates a PAT in the format
pat.<accountId>.<tokenId>.<secret>Save the token somewhere secure — you'll need it in the next step
For detailed instructions, see the Harness API Quickstart.
Quick Start
Option 1: npx (Recommended)
No install required — just run it:
HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2@latestOr configure the API key in your AI client (see Client Configuration below).
# Stdio transport (default — for Claude Desktop, Cursor, Windsurf, etc.)
HARNESS_API_KEY=pat.xxx npx harness-mcp-v2
# HTTP transport (for remote/shared deployments)
HARNESS_API_KEY=pat.xxx npx harness-mcp-v2 http --port 8080Note: The account ID is auto-extracted from PAT tokens (
pat.<accountId>.<tokenId>.<secret>), soHARNESS_ACCOUNT_IDis only needed for non-PAT API keys.
Option 2: Global Install
npm install -g harness-mcp-v2
# Then run directly
harness-mcp-v2Option 3: Build from Source
For development or customization:
git clone https://github.com/thisrohangupta/harness-mcp-v2.git
cd harness-mcp-v2
pnpm install
pnpm build
# Run
pnpm start # Stdio transport
pnpm start:http # HTTP transport
pnpm inspect # Test with MCP InspectorCLI Usage
harness-mcp-v2 [stdio|http] [--port <number>]
Options:
--port <number> Port for HTTP transport (default: 3000, or PORT env var)
--help Show help message and exit
--version Print version and exitTransport defaults to stdio if not specified. Use http for remote/shared deployments.
HTTP Transport
When running in HTTP mode, the server exposes:
Endpoint | Method | Description |
|
| MCP JSON-RPC endpoint (initialize + session requests) |
|
| SSE stream for server-initiated messages (progress, elicitation) |
|
| Terminate an active MCP session |
|
| CORS preflight |
|
| Health check — returns |
The HTTP transport runs in session-based mode. A new MCP session is created on initialize, the server returns an mcp-session-id header, and subsequent requests for that session must include the same header.
Operational constraints in HTTP mode:
POST /mcpwithoutmcp-session-idmust be aninitializerequest.POST /mcp,GET /mcp, andDELETE /mcpfor existing sessions require themcp-session-idheader.GET /mcpis used for SSE notifications (progress updates and elicitation prompts).Idle sessions are reaped after 30 minutes.
GET /healthis the only non-MCP endpoint.Request body size is capped by
HARNESS_MAX_BODY_SIZE_MB(default10MB).
# Health check
curl http://localhost:3000/health
# MCP initialize request (capture mcp-session-id response header)
curl -i -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
# Subsequent MCP request (use returned session ID)
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "mcp-session-id: <session-id>" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
# Terminate session
curl -X DELETE http://localhost:3000/mcp \
-H "mcp-session-id: <session-id>"Client Configuration
Note:
HARNESS_DEFAULT_ORG_IDandHARNESS_DEFAULT_PROJECT_IDare optional. Agents can discover orgs and projects dynamically usingharness_list(resource_type="organization")andharness_list(resource_type="project"). Set them only if you want to pin a default scope for convenience.
Troubleshooting
npx ENOENTornode: No such file or directoryGUI apps (Cursor, Claude Desktop, Windsurf, VS Code) don't inherit your shell's
PATH, so they often can't findnpxornode. Fix this by using absolute paths and explicitly settingPATHin theenvblock:{ "mcpServers": { "harness": { "command": "/absolute/path/to/npx", "args": ["-y", "harness-mcp-v2"], "env": { "HARNESS_API_KEY": "pat.xxx.xxx.xxx", "PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin" } } } }Find your paths with
which npxandwhich nodein a terminal, then make sure the directory containingnodeis included in thePATHvalue above. Common locations:
Homebrew (macOS):
/opt/homebrew/bin/npxnvm:
~/.nvm/versions/node/v20.x.x/bin/npx(runnvm which currentto find the exact path)System Node:
/usr/local/bin/npx
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}npm install -g harness-mcp-v2{
"mcpServers": {
"harness": {
"command": "harness-mcp-v2",
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}Claude Code (via claude mcp add)
claude mcp add harness -- npx harness-mcp-v2npm install -g harness-mcp-v2
claude mcp add harness -- harness-mcp-v2Then set HARNESS_API_KEY in your environment or .env file.
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}npm install -g harness-mcp-v2{
"mcpServers": {
"harness": {
"command": "harness-mcp-v2",
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}Windsurf (~/.windsurf/mcp.json)
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}npm install -g harness-mcp-v2{
"mcpServers": {
"harness": {
"command": "harness-mcp-v2",
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}Replace the command with the path to your built index.js:
{
"command": "node",
"args": ["/absolute/path/to/harness-mcp-v2/build/index.js", "stdio"]
}MCP Gateway
The Harness MCP server is fully compatible with MCP Gateways — reverse proxies that provide centralized authentication, governance, tool routing, and observability across multiple MCP servers. Since the server implements the standard MCP protocol with both stdio and HTTP transports, it works behind any MCP-compliant gateway with no code changes.
Why use a gateway?
Centralized credential management — no API keys in agent configs
Governance & audit logging for all tool calls across teams
Single endpoint for agents instead of N connections to N MCP servers
Access control — restrict which teams can use which tools
Docker MCP Gateway
Register the server in your Docker MCP Gateway configuration:
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}Portkey
Add the Harness MCP server to your Portkey MCP Gateway for enterprise governance, cost tracking, and multi-LLM routing:
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx"
}
}
}
}LiteLLM
Add to your LiteLLM proxy config:
mcp_servers:
- name: harness
command: npx
args:
- harness-mcp-v2
env:
HARNESS_API_KEY: "pat.xxx.xxx.xxx"Envoy AI Gateway
The server works with Envoy AI Gateway's MCP support via HTTP transport:
# Start the server in HTTP mode
HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2 http --port 8080Then configure Envoy to route to http://localhost:8080/mcp as an upstream MCP backend.
Kong
Use Kong's AI MCP Proxy plugin to expose the Harness MCP server through your existing Kong gateway infrastructure.
Other Gateways
Any gateway that supports the MCP specification (Microsoft MCP Gateway, IBM ContextForge, Cloudflare Workers, etc.) can proxy this server. For stdio-based gateways, use the default transport. For HTTP-based gateways, start the server with http transport and point the gateway at the /mcp endpoint.
Docker
Build and run the server as a Docker container:
# Build the image
pnpm docker:build
# Run with your .env file
pnpm docker:run
# Or run directly with env vars
docker run --rm -p 3000:3000 \
-e HARNESS_API_KEY=pat.xxx.xxx.xxx \
-e HARNESS_ACCOUNT_ID=your-account-id \
harness-mcp-serverThe container runs in HTTP mode on port 3000 by default with a built-in health check.
Kubernetes
Deploy to a Kubernetes cluster using the provided manifests:
# 1. Edit the Secret with your real credentials
# k8s/secret.yaml — replace HARNESS_API_KEY and HARNESS_ACCOUNT_ID
# 2. Apply all manifests
kubectl apply -f k8s/
# 3. Verify the deployment
kubectl -n harness-mcp get pods
# 4. Port-forward for local testing
kubectl -n harness-mcp port-forward svc/harness-mcp-server 3000:80
curl http://localhost:3000/healthThe deployment runs 2 replicas with readiness/liveness probes, resource limits, and non-root security context. The Service exposes port 80 internally (targeting container port 3000).
Configuration
The server automatically loads environment variables from a .env file in the project root if one exists. Copy .env.example to .env and fill in your values. Environment variables can also be set via your shell or MCP client config.
Variable | Required | Default | Description |
| Yes | -- | Harness personal access token or service account token |
| No | (from PAT) | Harness account identifier. Auto-extracted from PAT tokens; only needed for non-PAT API keys |
| No |
| Base URL (override for self-managed Harness) |
| No |
| Default organization identifier. Optional convenience — agents can discover orgs dynamically via |
| No | -- | Default project identifier. Optional convenience — agents can discover projects dynamically via |
| No |
| HTTP request timeout in milliseconds |
| No |
| Retry count for transient failures (429, 5xx) |
| No |
| Max HTTP request body size in MB for |
| No |
| Client-side request throttle (requests per second) to Harness APIs |
| No |
| Log verbosity: |
| No | (all) | Comma-separated list of enabled toolsets (see Toolset Filtering) |
| No |
| Block all mutating operations (create, update, delete, execute). Only list and get are allowed. Useful for shared/demo environments |
| No |
| Skip all elicitation confirmation prompts. When |
| No |
| Allow non-HTTPS |
HTTPS Enforcement
HARNESS_BASE_URL must use HTTPS by default. If you set a non-HTTPS URL (e.g. http://localhost:8080), the server will refuse to start with:
HARNESS_BASE_URL must use HTTPS (got "http://..."). If you need HTTP for local development, set HARNESS_ALLOW_HTTP=true.Audit Logging
All write operations (harness_create, harness_update, harness_delete, harness_execute) emit structured audit log entries to stderr. Each entry includes the tool name, resource type, operation, identifiers, and timestamp. This provides an audit trail without requiring external logging infrastructure.
Tools Reference
The server exposes 11 MCP tools. Most API tools accept org_id and project_id as optional overrides — if omitted, they fall back to HARNESS_DEFAULT_ORG_ID and HARNESS_DEFAULT_PROJECT_ID. harness_describe is local metadata only and does not use org/project scope.
URL support: Most API-facing tools accept a url parameter — paste a Harness UI URL and the server auto-extracts org, project, resource type, resource ID, pipeline ID, and execution ID. harness_describe does not accept url.
Tool | Description |
| Discover available resource types, operations, and fields. No API call — returns local registry metadata. |
| Fetch exact JSON Schema definitions for creating/updating resources. Supports deep drilling via |
| List resources of a given type with filtering, search, and pagination. |
| Get a single resource by its identifier. |
| Create a new resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via elicitation. |
| Update an existing resource. Supports inline and remote (Git-backed) pipelines. Prompts for user confirmation via elicitation. |
| Delete a resource. Prompts for user confirmation via elicitation. Destructive. |
| Execute an action on a resource (run/retry pipeline, import pipeline from Git, toggle flag, sync app). Prompts for user confirmation via elicitation. For pipeline runs, use the runtime-input workflow below (supports |
| Search across multiple resource types in parallel with a single query. |
| Diagnose |
| Get a real-time project health dashboard — recent executions, failure rates, and deep links. |
Tool Examples
Discover what resources are available:
{ "resource_type": "pipeline" }List organizations in the account:
{ "resource_type": "organization" }List projects in an organization:
{ "resource_type": "project", "org_id": "default" }List pipelines in a project:
{ "resource_type": "pipeline", "search_term": "deploy", "size": 10 }Get a specific service:
{ "resource_type": "service", "resource_id": "my-service-id" }Run a pipeline:
{
"resource_type": "pipeline",
"action": "run",
"resource_id": "my-pipeline",
"inputs": { "tag": "v1.2.3" }
}Toggle a feature flag:
{
"resource_type": "feature_flag",
"action": "toggle",
"resource_id": "new_checkout_flow",
"enable": true,
"environment": "production"
}Search across all resource types:
{ "query": "payment-service" }Diagnose an execution by ID (summary mode — default):
{ "execution_id": "abc123XYZ" }Diagnose from a Harness URL:
{ "url": "https://app.harness.io/ng/account/.../pipelines/myPipeline/executions/abc123XYZ/pipeline" }Diagnose connector connectivity:
{ "resource_type": "connector", "resource_id": "my_github_connector" }Diagnose delegate health:
{ "resource_type": "delegate", "resource_id": "delegate-us-east-1" }Diagnose a GitOps application (with options):
{
"resource_type": "gitops_application",
"resource_id": "checkout-app",
"options": { "agent_id": "gitops-agent-1" }
}Get the latest execution report for a pipeline:
{ "pipeline_id": "my-pipeline" }Full diagnostic mode with YAML and failed step logs:
{ "execution_id": "abc123XYZ", "summary": false }Summary mode with logs enabled (best of both):
{ "execution_id": "abc123XYZ", "include_logs": true }Get project health status:
{ "org_id": "default", "project_id": "my-project", "limit": 5 }Pipeline Run Workflow (Recommended)
Use this sequence to reduce execution-time input errors:
Discover required runtime inputs
harness_get(resource_type="runtime_input_template", resource_id="<pipeline_id>")The returned template shows
<+input>placeholders that need values.
Choose input strategy
Simple variables: pass flat key-value
inputs(for example{"branch":"main","env":"prod"}).Complex/structural inputs: use
input_set_ids(CI codebase/build blocks and nested template inputs are best handled this way).CI codebase shorthand keys (pipeline run only):
Shorthand key
Expanded structure
branchbuild.type=branch,build.spec.branch=<value>tagbuild.type=tag,build.spec.tag=<value>pr_numberbuild.type=PR,build.spec.number=<value>commit_shabuild.type=commitSha,build.spec.commitSha=<value>Constraint: shorthand expansion is skipped when
inputs.buildis already present (explicitbuildwins).
Execute the run
harness_execute(resource_type="pipeline", action="run", resource_id="<pipeline_id>", ...)
Optional: combine both
Use
input_set_idsfor the base shape andinputsfor simple overrides.
If required fields are unresolved, the tool returns a pre-flight error with expected keys and suggested input sets. You can inspect available shorthand mappings with harness_describe(resource_type="pipeline") (executeActions.run.inputShorthands).
Ask the AI DevOps Agent to create a pipeline:
{
"prompt": "Create a pipeline that builds a Go app with Docker and deploys to Kubernetes",
"action": "CREATE_PIPELINE"
}Update a service via natural language:
{
"prompt": "Add a sidecar container for logging",
"action": "UPDATE_SERVICE",
"conversation_id": "prev-conversation-id",
"context": [{ "type": "yaml", "payload": "<existing service YAML>" }]
}Pipeline Storage Modes
Harness pipelines can be stored in three ways:
Mode | Description | When to use |
Inline | Pipeline YAML stored in Harness | Default. Simplest setup, no Git required. |
Remote (External Git) | Pipeline YAML stored in GitHub, GitLab, Bitbucket, etc. | Teams using Git-backed pipeline-as-code with an external provider. |
Remote (Harness Code) | Pipeline YAML stored in a Harness Code repository | Teams using Harness's built-in Git hosting. |
Create an inline pipeline (default):
// harness_create
{
"resource_type": "pipeline",
"body": {
"yamlPipeline": "pipeline:\n name: My Pipeline\n identifier: my_pipeline\n stages:\n - stage:\n name: Build\n type: CI\n spec:\n execution:\n steps:\n - step:\n type: Run\n name: Echo\n spec:\n command: echo hello"
}
}Create a remote pipeline (External Git — e.g. GitHub):
// harness_create
{
"resource_type": "pipeline",
"body": {
"yamlPipeline": "pipeline:\n name: Deploy Service\n identifier: deploy_service\n stages: []"
},
"params": {
"store_type": "REMOTE",
"connector_ref": "my_github_connector",
"repo_name": "my-repo",
"branch": "main",
"file_path": ".harness/deploy-service.yaml",
"commit_msg": "Add deploy pipeline via MCP"
}
}Create a remote pipeline (Harness Code — no connector needed):
// harness_create
{
"resource_type": "pipeline",
"body": {
"yamlPipeline": "pipeline:\n name: Build App\n identifier: build_app\n stages: []"
},
"params": {
"store_type": "REMOTE",
"is_harness_code_repo": true,
"repo_name": "product-management",
"branch": "main",
"file_path": ".harness/build-app.yaml",
"commit_msg": "Add build pipeline via MCP"
}
}Update a remote pipeline:
// harness_update
{
"resource_type": "pipeline",
"resource_id": "deploy_service",
"body": {
"yamlPipeline": "pipeline:\n name: Deploy Service\n identifier: deploy_service\n stages:\n - stage:\n name: Deploy\n type: Deployment"
},
"params": {
"store_type": "REMOTE",
"connector_ref": "my_github_connector",
"repo_name": "my-repo",
"branch": "main",
"file_path": ".harness/deploy-service.yaml",
"commit_msg": "Update deploy pipeline via MCP",
"last_object_id": "abc123",
"last_commit_id": "def456"
}
}Import a pipeline from an external Git repo:
// harness_execute
{
"resource_type": "pipeline",
"action": "import",
"params": {
"connector_ref": "my_github_connector",
"repo_name": "my-repo",
"branch": "main",
"file_path": ".harness/existing-pipeline.yaml"
},
"body": {
"pipeline_name": "Existing Pipeline",
"pipeline_description": "Imported from GitHub"
}
}Import a pipeline from a Harness Code repo:
// harness_execute
{
"resource_type": "pipeline",
"action": "import",
"params": {
"is_harness_code_repo": true,
"repo_name": "product-management",
"branch": "main",
"file_path": ".harness/existing-pipeline.yaml"
},
"body": {
"pipeline_name": "Existing Pipeline"
}
}Create a connector:
{
"resource_type": "connector",
"body": { "connector": { "name": "My Docker Hub", "identifier": "my_docker", "type": "DockerRegistry" } }
}Delete a trigger:
{
"resource_type": "trigger",
"resource_id": "nightly-trigger",
"pipeline_id": "my-pipeline"
}Resource Types
137 resource types organized across 29 toolsets. Each resource type supports a subset of CRUD operations and optional execute actions.
Platform
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x | |
| x | x | x | x | x |
Pipelines
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
|
| x | x |
| |||
| x | x | x | x | x | |
| x | |||||
| x | x | ||||
| x | |||||
| x |
|
Services
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
Environments
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
|
Connectors
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
|
| x |
Infrastructure
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
|
Secrets
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x |
Execution Logs
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x |
Audit Trail
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x |
Delegates
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | |||||
| x | x | x | x |
|
Code Repositories
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | ||
| x | x | x | x | ||
| x | x |
| |||
| x |
| ||||
| x | x | x | |||
| x | x | ||||
| x | x |
Artifact Registries
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | ||||
| x | |||||
| x | |||||
| x |
Templates
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
Dashboards
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | ||||
| x |
Internal Developer Portal (IDP)
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | |||||
| x | |||||
| x | x | ||||
| x |
| ||||
| x |
Pull Requests
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x |
| |
| x | x |
| |||
| x | x | ||||
| x | |||||
| x |
Feature Flags
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | |||||
| x | |||||
| x | x | x | x | x |
|
| x | |||||
| x | |||||
| x | x | x | x | ||
| x | x |
| |||
| x | x | x | x |
|
FME (Split.io) resources — fme_* resources use the Split.io API (api.split.io) and are scoped by workspace ID rather than org/project. Auth uses HARNESS_API_KEY as a Bearer token. fme_feature_flag supports full lifecycle management: create (requires traffic_type_id), list, get, update metadata, delete, and kill/restore/archive/unarchive execute actions. 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. Use feature_flag for the Harness CF admin API which supports environment-specific definitions, create, delete, and toggle.
GitOps
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | ||||
| x | x |
| |||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | |||||
| x | |||||
| x | |||||
| x | |||||
| x | |||||
| x |
Chaos Engineering
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x |
| |||
| x | x |
| |||
| x |
| ||||
| x | |||||
| x | |||||
| x | x | ||||
| x | x | x | x |
| |
| x | x |
| |||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | x | ||||
| x | x |
Cloud Cost Management (CCM)
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x | |
| x | |||||
| x | |||||
| x | x | ||||
| x | x |
| |||
| x | |||||
| x | |||||
| x | x | ||||
| x | |||||
| x | |||||
| x | |||||
| x | |||||
| x |
Software Engineering Insights (SEI)
SEI resources are consolidated for token efficiency. Use metric or aspect params for DORA, team/org-tree details, and AI insights.
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | |||||
| x | |||||
| x | Pass | ||||
| x | x | ||||
| x | Pass | ||||
| x | x | ||||
| x | x | Pass | |||
| x | x | Pass | |||
| x | x | Pass | |||
| x | x | Pass | |||
| x | Pass | ||||
| x |
Software Supply Chain Assurance (SCS)
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | |||||
| x | x | ||||
| x | |||||
| x | |||||
| x | |||||
| x | |||||
| x | x | ||||
| x |
Security Testing Orchestration (STO)
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | |||||
| x | |||||
| x |
|
Access Control
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | ||||
| x | x | x | x | ||
| x | x | x | x | ||
| x | x | x | x | ||
| x | x | ||||
| x | x | x | x | ||
| x |
Governance
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x | |
| x | x | x | x | x | |
| x | x |
Deployment Freeze
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
|
| x |
|
Service Overrides
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x | x | x | x | x |
Settings
Resource Type | List | Get | Create | Update | Delete | Execute Actions |
| x |
Visualizations
Inline PNG chart visualizations rendered from Harness data. These are metadata-only resource types with no API operations — they exist so the LLM can discover available chart types via harness_describe. Use include_visual=true on supported tools (harness_diagnose, harness_list, harness_status) to generate charts.
Resource Type | Description | How to Generate |
| Gantt chart of pipeline stage execution over time |
|
| DAG flowchart of pipeline stages and steps |
|
| Project health overview with status indicators |
|
| Donut chart of execution status breakdown |
|
| Bar chart of execution counts by pipeline |
|
| Daily execution trend over 30 days |
|
| Pipeline YAML architecture diagram (stages → steps) |
|
MCP Prompts
DevOps
Prompt | Description | Parameters |
| End-to-end CI/CD workflow: scan a git repo, generate CI pipeline (build & push Docker image), discover or generate K8s manifests, create CD pipeline, and deploy — with auto-retry on CI failures (up to 5 attempts) and CD failures (up to 3 attempts with user permission). On exhausted retries, provides Harness UI deep links to all created resources for manual investigation. |
|
| Analyze a failed execution: accepts an execution ID, pipeline ID, or Harness URL. Gets stage/step breakdown, failure details, delegate info, and failed step logs via |
|
| Generate a new pipeline YAML from natural language requirements, reviewing existing resources for context |
|
| Walk through onboarding a new service with environments and a deployment pipeline |
|
| Review DORA metrics (deployment frequency, change failure rate, MTTR, lead time) with Elite/High/Medium/Low classification and improvement recommendations |
|
| Guide through onboarding a GitOps application — verify agent, cluster, repo, and create the application |
|
| Design a chaos experiment to test service resilience with fault injection, probes, and expected outcomes |
|
| Plan and execute a progressive feature flag rollout across environments with safety gates |
|
| Analyze an existing pipeline and extract reusable stage/step templates from it |
|
| Check delegate connectivity, health, token status, and troubleshoot infrastructure issues |
|
| Review IDP scorecards for services and identify gaps to improve developer experience |
|
| Find pipeline executions waiting for approval, show details, and offer to approve or reject |
|
FinOps
Prompt | Description | Parameters |
| Analyze cloud cost data, surface recommendations and anomalies, prioritized by potential savings |
|
| Deep-dive into cloud costs by service, environment, or cluster with trend analysis and anomaly detection |
|
| Analyze reserved instance and savings plan utilization to find waste and optimize commitments |
|
| Investigate cost anomalies — determine root cause, impacted resources, and remediation |
|
| Review and prioritize rightsizing recommendations, optionally create Jira or ServiceNow tickets |
|
DevSecOps
Prompt | Description | Parameters |
| Review security issues across Harness resources and suggest remediations by severity |
|
| Triage security vulnerabilities across pipelines and artifacts, prioritize by severity and exploitability |
|
| Audit SBOM and compliance posture for artifacts — license risks, policy violations, component vulnerabilities |
|
| End-to-end software supply chain security audit — provenance, chain of custody, policy compliance |
|
| Review pending security exemptions and make batch approval or rejection decisions |
|
| Audit user permissions, over-privileged accounts, and role assignments to enforce least-privilege |
|
Harness Code
Prompt | Description | Parameters |
| Review a pull request — analyze diff, commits, checks, and comments to provide structured feedback on bugs, security, performance, and style |
|
| Auto-generate a PR title and description from the commit history and diff of a branch |
|
| Analyze branches in a repository and recommend stale or merged branches to delete |
|
MCP Resources
Resource URI | Description | MIME Type |
| Pipeline YAML definition |
|
| Pipeline YAML (with explicit scope) |
|
| Last 10 pipeline execution summaries |
|
| Harness pipeline JSON Schema |
|
| Harness template JSON Schema |
|
| Harness trigger JSON Schema |
|
Toolset Filtering
By default, all 29 toolsets (and their 137 resource types) are enabled. Use HARNESS_TOOLSETS to expose only the toolsets you need. This reduces the resource types the LLM sees, improving tool selection accuracy.
# Only expose pipelines, services, and connectors
HARNESS_TOOLSETS=pipelines,services,connectorsAvailable toolset names:
Toolset | Resource Types |
| organization, project |
| pipeline, execution, trigger, pipeline_summary, input_set, approval_instance |
| service |
| environment |
| connector, connector_catalogue |
| infrastructure |
| secret |
| execution_log |
| audit_event |
| delegate, delegate_token |
| repository, branch, commit, file_content, tag, repo_rule, space_rule |
| registry, artifact, artifact_version, artifact_file |
| template |
| dashboard, dashboard_data |
| idp_entity, scorecard, scorecard_check, scorecard_stats, scorecard_check_stats, idp_score, idp_workflow, idp_tech_doc |
| pull_request, pr_reviewer, pr_comment, pr_check, pr_activity |
| fme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, feature_flag |
| 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 |
| chaos_experiment, chaos_probe, chaos_experiment_template, chaos_infrastructure, chaos_experiment_variable, chaos_experiment_run, chaos_loadtest, chaos_k8s_infrastructure, chaos_hub, chaos_fault, chaos_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk |
| 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 |
| 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 |
| scs_artifact_source, artifact_security, scs_artifact_component, scs_artifact_remediation, scs_chain_of_custody, scs_compliance_result, code_repo_security, scs_sbom |
| security_issue, security_issue_filter, security_exemption |
| user, user_group, service_account, role, role_assignment, resource_group, permission |
| policy, policy_set, policy_evaluation |
| freeze_window, global_freeze |
| service_override |
| setting |
| visual_timeline, visual_stage_flow, visual_health_dashboard, visual_pie_chart, visual_bar_chart, visual_timeseries, visual_architecture |
Architecture
+------------------+
| AI Agent |
| (Claude, etc.) |
+--------+---------+
| MCP (stdio or HTTP)
+--------v---------+
| MCP Server |
| 10 Generic Tools |
+--------+---------+
|
+--------v---------+
| Registry | <-- Declarative resource definitions
| 29 Toolsets | (data files, not code)
| 137 Resource Types|
+--------+---------+
|
+--------v---------+
| HarnessClient | <-- Auth, retry, rate limiting
+--------+---------+
| HTTPS
+--------v---------+
| Harness REST API |
+-------------------+How It Works
Tools are generic verbs:
harness_list,harness_get, etc. They accept aresource_typeparameter that routes to the correct API endpoint.The Registry maps each
resource_typeto aResourceDefinition— a declarative data structure specifying the HTTP method, URL path, path/query parameter mappings, and response extraction logic.Dispatch resolves the resource definition, builds the HTTP request (path substitution, query params, scope injection), calls the Harness API through
HarnessClient, and extracts the relevant response data.Toolset filtering (
HARNESS_TOOLSETS) controls which resource definitions are loaded into the registry at startup.Deep links are automatically appended to responses, providing direct Harness UI URLs for every resource.
Compact mode strips verbose metadata from list results, keeping only actionable fields (identity, status, type, timestamps, deep links) to minimize token usage.
Adding a New Resource Type
Create a new file in src/registry/toolsets/ or add a resource to an existing toolset:
// src/registry/toolsets/my-module.ts
import type { ToolsetDefinition } from "../types.js";
export const myModuleToolset: ToolsetDefinition = {
name: "my-module",
displayName: "My Module",
description: "Description of the module",
resources: [
{
resourceType: "my_resource",
displayName: "My Resource",
description: "What this resource represents",
toolset: "my-module",
scope: "project", // "project" | "org" | "account"
identifierFields: ["resource_id"],
listFilterFields: ["search_term"],
operations: {
list: {
method: "GET",
path: "/my-module/api/resources",
queryParams: { search_term: "search", page: "page", size: "size" },
responseExtractor: (raw) => raw,
description: "List resources",
},
get: {
method: "GET",
path: "/my-module/api/resources/{resourceId}",
pathParams: { resource_id: "resourceId" },
responseExtractor: (raw) => raw,
description: "Get resource details",
},
},
},
],
};Then import it in src/registry/index.ts and add it to the ALL_TOOLSETS array. No changes needed to any tool files.
Development
# Build
pnpm build
# Watch mode
pnpm dev
# Type check
pnpm typecheck
# Run tests
pnpm test
# Watch tests
pnpm test:watch
# Interactive MCP Inspector
pnpm inspectProject Structure
src/
index.ts # Entrypoint, transport setup
config.ts # Env var validation (Zod)
client/
harness-client.ts # HTTP client (auth, retry, rate limiting)
types.ts # Shared API types
registry/
index.ts # Registry class + dispatch logic
types.ts # ResourceDefinition, ToolsetDefinition, etc.
toolsets/ # One file per toolset (declarative data)
platform.ts
pipelines.ts
services.ts
ccm.ts
access-control.ts
...
tools/ # 10 generic MCP tools
harness-list.ts
harness-get.ts
harness-create.ts
harness-update.ts
harness-delete.ts
harness-execute.ts
harness-search.ts
harness-diagnose.ts
harness-describe.ts
harness-status.ts
resources/ # MCP resource providers
pipeline-yaml.ts
execution-summary.ts
prompts/ # MCP prompt templates
build-deploy-app.ts # DevOps: end-to-end build & deploy workflow
debug-pipeline.ts # DevOps: debug failed executions
create-pipeline.ts # DevOps: generate pipeline from requirements
onboard-service.ts # DevOps: onboard new service
dora-metrics.ts # DevOps: DORA metrics review
setup-gitops.ts # DevOps: GitOps application setup
chaos-resilience.ts # DevOps: chaos experiment design
feature-flag-rollout.ts # DevOps: progressive flag rollout
migrate-to-template.ts # DevOps: extract templates from pipeline
delegate-health.ts # DevOps: delegate health check
developer-scorecard.ts # DevOps: IDP scorecard review
optimize-costs.ts # FinOps: cost optimization
cloud-cost-breakdown.ts # FinOps: cost deep-dive
commitment-utilization.ts # FinOps: RI/savings plan analysis
cost-anomaly.ts # FinOps: anomaly investigation
rightsizing.ts # FinOps: rightsizing recommendations
security-review.ts # DevSecOps: security issue review
vulnerability-triage.ts # DevSecOps: vulnerability triage
sbom-compliance.ts # DevSecOps: SBOM compliance audit
supply-chain-audit.ts # DevSecOps: supply chain audit
exemption-review.ts # DevSecOps: exemption approval
access-control-audit.ts # DevSecOps: access control audit
code-review.ts # Harness Code: PR code review
pr-summary.ts # Harness Code: auto-generate PR summary
branch-cleanup.ts # Harness Code: stale branch cleanup
pending-approvals.ts # Approvals: find and act on pending approvals
utils/
cli.ts # CLI arg parsing (transport, port)
errors.ts # Error normalization
logger.ts # stderr-only logger
progress.ts # MCP progress & logging notifications
rate-limiter.ts # Client-side rate limiting
deep-links.ts # Harness UI deep link builder
response-formatter.ts # Consistent MCP response formatting
compact.ts # Compact list output for token efficiency
tests/
config.test.ts # Config schema validation tests
utils/
response-formatter.test.ts
deep-links.test.ts
errors.test.ts
registry/
registry.test.ts # Registry loading, filtering, dispatch testsElicitation
Write tools (harness_create, harness_update, harness_delete, harness_execute) use MCP elicitation to prompt the user for confirmation before making changes. This gives real human-in-the-loop approval — the user sees what's about to happen and accepts or declines.
How it works:
The LLM calls a write tool (e.g.
harness_createwith a pipeline body)The server sends an elicitation request to the client with a summary of the operation
The user sees the details and clicks Accept or Decline
If accepted, the operation proceeds. If declined, it's blocked and the LLM is told
Client support:
Client | Elicitation Support |
Cursor | Yes |
VS Code (Copilot) | Yes |
Claude Desktop | Not yet |
Windsurf | Not yet |
MCP Inspector | Yes |
Elicitation behavior varies by operation severity when client support is missing: For clients that don't support elicitation:
harness_create,harness_update, andharness_executeproceed without a dialog (best effort).Destructive operations are blocked if confirmation cannot be obtained (
harness_delete).
If elicitation fails at runtime, the same rules apply: non-destructive writes continue, destructive writes are blocked.
Skipping Elicitation for Autonomous Workflows
For fully autonomous agent workflows (CI/CD bots, headless agents, batch automation), elicitation prompts can be disabled entirely:
HARNESS_SKIP_ELICITATION=trueOr in your MCP client config:
{
"mcpServers": {
"harness": {
"command": "npx",
"args": ["harness-mcp-v2"],
"env": {
"HARNESS_API_KEY": "pat.xxx.xxx.xxx",
"HARNESS_SKIP_ELICITATION": "true"
}
}
}
}When enabled, all write and delete operations proceed without user confirmation — including destructive operations like harness_delete. Use with caution and consider pairing with HARNESS_TOOLSETS to restrict which resource types are available.
Safety
Secrets are never exposed. The
secretresource type returns metadata only (name, type, scope) — secret values are never included in any response.Write operations use elicitation when available.
harness_create,harness_update,harness_delete, andharness_executeattempt MCP elicitation before proceeding (see Elicitation).Destructive writes fail closed. If confirmation cannot be obtained,
harness_deleteis blocked instead of executing blindly. Override withHARNESS_SKIP_ELICITATION=truefor autonomous workflows.CORS restricted to same-origin. The HTTP transport only allows same-origin requests, preventing CSRF attacks from malicious websites targeting the MCP server on localhost.
HTTP rate limiting. The HTTP transport enforces 60 requests per minute per IP to prevent request flooding.
API rate limiting. The Harness API client enforces a 10 requests/second limit to avoid hitting upstream rate limits.
Pagination bounds enforced. List queries are capped at 10,000 items total and 100 per page to prevent memory exhaustion.
Retries with backoff. Transient failures (HTTP 429, 5xx) are retried with exponential backoff and jitter.
Localhost binding. The HTTP transport binds to
127.0.0.1by default — not accessible from the network.No stdout logging. All logs go to stderr to avoid corrupting the stdio JSON-RPC transport.
Complementary Skills
The Harness MCP server pairs well with Harness Skills — a collection of ready-made Claude Code skills (slash commands) designed for common Harness workflows. Install them alongside this MCP server to get high-level automation like /deploy, /rollback, /triage, and more without writing custom prompts.
Troubleshooting & Common Pitfalls
Symptom | Likely Cause | What to Do |
| API key is not in PAT format ( | Set |
| Unsupported CLI transport arg | Use |
| One or more toolset names are not recognized | Use only names from Toolset Filtering (exact match) |
HTTP | A session request was sent without session header | Send |
HTTP | Session expired (30 min idle TTL) or already closed | Re-run |
HTTP | Unsupported method for MCP endpoint | Use |
HTTP | Invalid JSON body or request body exceeded | Validate JSON payload size/shape; increase |
| Resource type is misspelled or filtered out via | Call |
| A project/org scoped call is missing identifiers | Set |
|
| Set |
Pipeline run fails pre-flight with unresolved required inputs | Provided | Fetch |
Pipeline CI shorthand ( |
| Remove |
| User declined the elicitation confirmation dialog | The user chose not to proceed — verify the operation details and retry if intended |
| Template APIs expect full YAML payload | Provide full |
|
| Use HTTPS, or set |
License
Apache 2.0
Available Tools
11 toolsharness_createA
Create a Harness resource. For pipelines: use body.yamlPipeline (YAML string, recommended) or body.pipeline (JSON). For remote pipelines, pass git details in params: external Git (store_type='REMOTE', connector_ref, repo_name, branch, file_path) or Harness Code (store_type='REMOTE', is_harness_code_repo=true, repo_name, branch, file_path). For others: call harness_describe for the body format.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | The type of resource to create | |
| body | Yes | The resource definition body (varies by resource type — typically the YAML or JSON spec) | |
| url | No | A Harness UI URL — org and project are extracted automatically | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| params | No | Additional parameters. For external Git pipelines: store_type='REMOTE', connector_ref, repo_name, branch, file_path, commit_msg. For Harness Code pipelines: store_type='REMOTE', is_harness_code_repo=true, repo_name, branch, file_path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only, non-destructive, non-idempotent, open world. The description reinforces that this is a creation operation and adds context about body formats and git requirements, which is helpful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with four sentences, front-loaded with the primary purpose, and every sentence adds essential guidance. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool's complexity (6 params, nested objects, no output schema), the description covers key usage patterns: pipeline creation, remote git, and directing to harness_describe for other resources. It is complete and actionable for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by specifying that for pipelines, body should be a YAML string or JSON, and for remote pipelines, params must include git details. This clarifies the intended use beyond the schema's generic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a Harness resource' with a specific verb and resource. It distinguishes from sibling tools like harness_delete, harness_describe, etc., by providing explicit guidance for pipelines and deferring to harness_describe for other resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use: for pipelines, recommends YAML vs JSON; for remote pipelines, explains git details needed; for other resources, instructs to call harness_describe for the body format. This clearly differentiates usage scenarios and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_deleteADestructiveIdempotent
Delete a Harness resource. You can pass a Harness URL to auto-extract identifiers. This is destructive and cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | The type of resource to delete | |
| resource_id | Yes | The identifier of the resource to delete | |
| url | No | A Harness UI URL — org, project, resource type, and ID are extracted automatically | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| params | No | Additional identifiers for nested resources (e.g. pipeline_id for triggers, environment_id for infrastructure). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds 'this is destructive and cannot be undone' beyond the destructiveHint annotation. It also discloses URL extraction behavior. No contradiction with annotations (idempotentHint is compatible).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and contains no irrelevant details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters (including nested object) and no output schema, the description is adequate but not thorough. It covers key behavioral aspects but lacks detail on param interactions and error handling. Schema descriptions compensate partially.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add significant semantic information beyond the schema, except for mentioning URL auto-extraction which maps to the url parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete a Harness resource' with specific verb and resource. It also mentions URL auto-extraction. While it doesn't explicitly distinguish from sibling tools like harness_update or harness_create, the name and purpose are unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (when deletion is needed) but provides no explicit guidance on when not to use or alternatives. The URL extraction hint is useful but does not replace formal usage guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_describeARead-only
Describe available Harness resource types, their supported operations, and fields. No API call — returns local metadata only. Use this to discover what resource_types you can use with other harness_ tools.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | No | Get details for a specific resource type | |
| toolset | No | Filter to a specific toolset | |
| search_term | No | Search for resource types by keyword (matches type name, display name, toolset, description) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that no API call is made, confirming it's a safe, local operation. This provides behavioral clarity beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences: the first states core functionality, the second adds usage guidance. No extraneous information, efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the tool returns metadata about resource types, operations, and fields. This is sufficient for a discovery tool, though more detail on output format could be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described (e.g., 'Get details for a specific resource type'). The description does not add further meaning beyond what the schema already provides, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool describes available Harness resource types, their supported operations, and fields. It distinguishes itself as a local metadata-only tool to discover resource types for other harness_ tools, setting it apart from siblings like harness_create or harness_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'No API call — returns local metadata only' and advises using it to discover resource types for other tools. While it doesn't list when not to use, it provides clear context and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_diagnoseARead-only
Diagnose a Harness resource — analyze failures, test connectivity, check health, or troubleshoot GitOps sync issues. Defaults to pipeline execution diagnosis. Accepts a Harness URL to auto-detect the resource type.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | No | Resource type to diagnose. Auto-detected from url if provided. Defaults to pipeline. | |
| resource_id | No | Primary identifier of the resource (connector ID, delegate name). Auto-detected from url if provided. | |
| url | No | A Harness URL — resource type, org, project, and ID are extracted automatically | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| options | No | Resource-specific diagnostic options. Pipeline: execution_id, pipeline_id, summary, include_yaml, include_logs, log_snippet_lines, max_failed_steps, include_visual (boolean, include PNG image inline), visual_type ('timeline'|'flow'|'architecture', default 'timeline' — 'architecture' renders full pipeline YAML as multi-level diagram with stages, step groups, steps, rollback), visual_width (number, default 900). When a Harness URL contains ?step=<nodeExecutionId>, setting include_logs:true fetches that specific step's log regardless of pass/fail status and returns it as requested_step_log alongside any failed_step_logs. GitOps: agent_id. Call harness_describe for details. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, consistent with diagnostic purpose. Description adds auto-detection behavior and default resource type. No contradictions; additional transparency about options like visual parameters and step log fetching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is four sentences with dense, relevant information; front-loaded with core purpose. Every sentence adds value, though the options detail could be slightly more compact. Overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters including a nested options object and no output schema, description covers default behavior, auto-detection, and detailed options. References harness_describe for further info. Missing output explanation but acceptable for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds substantial meaning beyond schema: explains auto-detection from url, defaults, and provides detailed documentation for the options object including all sub-keys (e.g., visual_width, visual_type, include_visual). This significantly enhances parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it diagnoses Harness resources such as failures, connectivity, health, and GitOps sync issues. It explicitly defaults to pipeline execution diagnosis and distinguishes from sibling harness_describe by referencing it for details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description outlines default behavior (pipeline execution) and auto-detection from URL. It also mentions calling harness_describe for details, providing an alternative. However, it does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_executeA
Execute an action on a Harness resource: run/retry/interrupt pipelines, kill/restore FME feature flags, test connectors, sync GitOps apps, run chaos experiments. You can pass a Harness URL to auto-extract identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | No | Resource type with executable actions. Auto-detected from url. | |
| url | No | Harness UI URL — auto-extracts org, project, type, and ID | |
| action | Yes | Action to execute (e.g. run, retry, interrupt, toggle, test_connection, sync) | |
| resource_id | No | Primary resource identifier | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| inputs | No | Pipeline runtime inputs: key-value pairs like {branch: 'main'} (auto-resolved), or full YAML string. Check runtime_input_template first via harness_get. | |
| input_set_ids | No | Input set IDs for complex pipelines. List available: harness_list(resource_type='input_set', filters={pipeline_id: '...'}). | |
| body | No | Additional body payload for the action | |
| params | No | Action-specific parameters. Call harness_describe for available fields per resource_type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations claim destructiveHint=false, but the description lists potentially destructive actions like 'kill/restore FME feature flags' and 'interrupt pipelines', creating inconsistency. The description does add value by noting URL auto-extraction and parameter behavior, but the contradiction undermines trust.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two sentences) and front-loaded with purpose, but the list of examples could be more structured (e.g., bullet points). Overall efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters and no output schema, the description covers all essential aspects: resource types, actions, URL usage, inputs, input sets, body, params, and references to other tools for supplementary info. It is complete for a complex exec tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema coverage is 100%, the description adds significant meaning beyond the schema: e.g., URLs auto-identify resources, inputs accept key-value pairs or YAML, and it suggests using harness_describe for action-specific parameters. This extra context helps the agent parameterize correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Execute an action on a Harness resource' and lists specific actions like run, retry, interrupt, etc., distinguishing it from siblings like harness_create, harness_delete, which handle CRUD operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit context for using the tool (e.g., to trigger actions, pass a URL for auto-extraction). It references harness_get and harness_list for complementary setup, but does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_getARead-only
Get a Harness resource by ID. Accepts a Harness URL to auto-extract identifiers. For failure analysis, prefer harness_diagnose.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | No | Resource type to retrieve. Auto-detected from url. | |
| resource_id | No | Primary resource identifier. Auto-detected from url. | |
| url | No | Harness UI URL — auto-extracts org, project, type, and ID | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| params | No | Additional identifiers for nested resources. Call harness_describe for fields per resource_type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds context about URL auto-extraction and ID-based retrieval, which enhances transparency without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence states purpose and key feature, the second gives usage guidance. Efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers the tool's purpose and key usage. For a retrieval tool with 6 parameters and no output schema, it provides enough context for an agent to decide when to use it, though more detail on return format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining URL parameter auto-extracts identifiers and references harness_describe for fields, but does not significantly elaborate beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets a Harness resource by ID and accepts a URL for auto-extraction. It distinguishes from the sibling harness_diagnose by directing failure analysis to that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends harness_diagnose for failure analysis, providing a clear when-not-to-use. Does not cover other alternatives like harness_list or harness_search, but the guidance is specific and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_listARead-only
List Harness resources with filtering and pagination. Accepts a Harness URL to auto-extract scope.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | No | Resource type to list. Auto-detected from url. | |
| url | No | Harness UI URL — auto-extracts org, project, and type | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| page | No | Page number, 0-indexed | |
| size | No | Page size (1–100) | |
| search_term | No | Filter results by name or keyword | |
| compact | No | Strip verbose metadata from list items, keeping only essential fields (default true) | |
| params | No | Additional identifiers for nested resources (e.g. repo_id for pull requests). Call harness_describe for fields per resource_type. | |
| filters | No | Resource-specific filters as key-value pairs. Available keys across enabled resource types: search_term, module, filter_type, pipeline_id, status, branch, my_deployments, execution_id, approval_status, approval_type, node_execution_id, sort, order, env_type, type, category, connector_names, connector_identifiers, connectivity_statuses, connector_connectivity_modes, description, inheriting_credentials_from_delegate, tags, environment_id, deployment_type, secret_identifier, secret_name, secret_manager_identifiers, resource_type, action, start_time, end_time, all, delegate_name, delegate_type, host_name, delegate_group_identifier, delegate_instance_filter, auto_upgrade, version_status, name, query, git_ref, path, since, until, committer, inherited, search, package_type, template_type, template_list_type, folder_id, reporting_timeframe, kind, namespace, entity_identifier, scope_level, state, after, before, offset, workspace_id, rollout_status_id, repo_creds_id, agent_id, app_name, pod_name, container, tail_lines, resource_name, group, version, scope, experiment_run_ids, notify_ids, hub_identity, infrastructure_type, infrastructure, include_all_scope, sort_field, sort_ascending, experiment_id, include_legacy_infra, is_enterprise, permissions_required, infra_type, entity_type, only_templatised_faults, environment_type, sort_type, sort_order, cloud_filter, group_by, time_filter, limit, time_resolution, min_saving, perspective_id, min_amount, min_anomalous_spend, field_id, field_identifier, aspect, cloud_account_id, start_date, end_date, team_ref_id, date_start, date_end, feature_type, granularity, metric, integration_type, profile_id, metric_type, artifact_type, source_id, artifact_id, dependency_type, purl, standards, target_version, severity_codes, issue_types, target_ids, target_types, pipeline_ids, scan_tools, exemption_statuses, principal_type, role_identifier, resource_group_identifier, include_parent_scopes, has_module, module_type, identifier_filter, exclude_rego, include_policy_set_count, entity, created_date_from, created_date_to, include_child_scopes, freeze_status, service_id. Call harness_describe for filters available on a specific resource_type. | |
| include_visual | No | Include an inline PNG chart of the results (default false). Supported for execution resource_type. Use when user asks for a visualization, chart, or graph. | |
| visual_type | No | Chart type when include_visual=true. 'timeseries' = daily execution counts, 'pie' = breakdown by status, 'bar' = breakdown by pipeline. Default 'pie'. | pie |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: URL auto-extraction and filtering/pagination. With readOnlyHint=true, it correctly indicates no side effects. It discloses important traits but could mention rate limits or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences covering the core functionality and a key behavioral trait (URL auto-extraction). Every word earns its place; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (12 parameters, nested objects, many siblings) and no output schema, the description is adequate but not thorough. It lacks explanation of the params and filters objects, or how URL extraction interacts with other parameters. Schema covers details, but the tool description could provide more high-level context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the tool description adds minimal value for parameter semantics. The schema already documents each parameter well, including the URL auto-detection hint. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List Harness resources with filtering and pagination', specifying the verb (list), the resource (Harness resources), and key features (filtering, pagination, URL auto-extraction). It distinguishes from sibling tools like harness_get (single resource) and harness_search (different search behavior).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing multiple resources but does not explicitly state when to use this tool versus alternatives like harness_get or harness_search. No when-not-to or exclusion criteria are provided, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_schemaARead-only
Fetch Harness YAML schema for a resource type. Returns the JSON Schema definition so you know the exact body structure for harness_create/harness_update. Use without path for a summary of fields and available sections. Use with path to drill into a specific section (e.g. path='scheduled_trigger' for cron trigger spec). Available schemas: pipeline, template, trigger.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | Schema to fetch: pipeline, template, or trigger | |
| path | No | Dot-separated path to drill into a specific definition section. E.g. 'trigger_source' for source types, 'scheduled_trigger' for cron spec, 'webhook_trigger' for webhook spec. Omit for a top-level summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes return type (JSON Schema definition) and path parameter behavior, adding value beyond annotations that already indicate read-only and open world. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences plus a list of schemas; no wasted words. Front-loaded with main purpose, then specifics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations cover safety and open world, and schema covers parameters, description provides adequate context on path behavior and available schemas. No output schema but mentions return type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, description enhances understanding by explaining path usage with examples and reiterating enum values for resource_type, going beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch Harness YAML schema for a resource type' with specific verb and resource, and explains its purpose for knowing body structure for harness_create/harness_update, distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on using without path for summary and with path to drill into sections, along with available schemas. Lacks explicit 'when not to use', but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_searchARead-only
Search across multiple Harness resource types. Returns results ranked by relevance. Accepts a Harness URL for scope.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term | |
| resource_types | No | Types to search (defaults to all listable) | |
| url | No | Harness UI URL — auto-extracts org and project | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| max_per_type | No | Max results per type | |
| compact | No | Strip verbose metadata (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that results are 'ranked by relevance' and that the tool 'Accepts a Harness URL for scope', which explains scope extraction behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and distinguishing features (search, relevance, URL scope). No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and a complex search/scoping behavior, the description is too brief. It does not explain ranking algorithm, scope resolution (org/project extraction from URL), or the effect of parameters like compact and max_per_type. Incomplete for a search tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds high-level context about searching across types and URL scope, but does not explain parameter details beyond what the schema provides (e.g., what 'compact' does, default values). Minimal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search across multiple Harness resource types' and 'Returns results ranked by relevance', which distinguishes it from sibling tools like harness_list (which likely lists specific types) and harness_get (single resource). The title 'Search Harness Resources' reinforces this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for cross-resource search with relevance ranking, but it does not explicitly state when to use versus alternatives (e.g., harness_list for listing specific types) or when not to use. It provides clear context but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_statusARead-only
Get a live project health overview: recent failed executions, currently running executions, and recent deployment activity. You can pass a Harness URL to auto-extract org and project. Ideal first question: 'what's happening in my project right now?'
| Name | Required | Description | Default |
|---|---|---|---|
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| url | No | A Harness UI URL — org and project are extracted automatically | |
| limit | No | Max items per section (default 5, max 20) | |
| include_visual | No | Include visual health dashboard image (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds behavioral context beyond annotations: it returns a live health overview, can include a visual dashboard, and auto-extracts identifiers from a URL. No contradictions, and it complements the annotations well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It front-loads the core functionality and provides a practical usage suggestion. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 5 parameters, no output schema, and the presence of annotations, the description adequately covers the tool's purpose, key parameters (url, limit, include_visual), and usage context. However, it does not explain the structure of the returned health overview, which might be helpful for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no new parameter-specific information beyond what the schema provides; it only mentions the URL extraction functionality which is also stated in the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a live project health overview: recent failed executions, currently running executions, and recent deployment activity.' It uses a specific verb ('Get') and resource ('project health overview'), and distinguishes itself from sibling tools by focusing on a quick health summary rather than individual resource operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context with 'Ideal first question: what's happening in my project right now?' and explains how to use a Harness URL for auto-extraction. However, it does not explicitly state when not to use this tool or mention alternative tools for more detailed queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harness_updateAIdempotent
Update an existing Harness resource. You can pass a Harness URL to auto-extract identifiers. Response includes openInHarness link to the updated resource when applicable.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_type | Yes | The type of resource to update | |
| resource_id | Yes | The identifier of the resource to update | |
| url | No | A Harness UI URL — org, project, resource type, and ID are extracted automatically | |
| body | Yes | The updated resource definition body | |
| org_id | No | Organization identifier (overrides default) | |
| project_id | No | Project identifier (overrides default) | |
| params | No | Additional identifiers (e.g. pipeline_id for triggers, version_label for templates). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotent and non-destructive. The description adds context about URL extraction and response link, but does not disclose error handling, partial vs full update, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences concisely convey purpose and key features. No redundancy. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters and no output schema, the description omits critical details: update mode, response structure beyond the link, and error behaviors. The tool is complex but the description is minimal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already documented. The description adds value by explaining the 'url' parameter's auto-extraction behavior, but does not clarify semantics for other parameters beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'existing Harness resource'. It differentiates from sibling tools like harness_create and harness_delete by specifying 'update'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for updating existing resources but does not explicitly state when to use versus alternatives like harness_create for new resources. No exclusion criteria or context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.8.3- First observed
harness_create - First observed
harness_delete - First observed
harness_describe - First observed
harness_diagnose - First observed
harness_execute - First observed
harness_get - First observed
harness_list - First observed
harness_schema - First observed
harness_search - First observed
harness_status - First observed
harness_update
TDQS
Scored across 11 tools
Each tool has a distinct verb (create, delete, describe, diagnose, execute, get, list, schema, search, status, update) with clear, non-overlapping purposes. Descriptions provide enough detail to differentiate, e.g., harness_get retrieves by ID while harness_list applies filters.
All tools follow the exact pattern 'harness_<verb>' with lowercase snake_case. The verb choice is consistent and descriptive, creating a predictable and easy-to-navigate naming convention.
11 tools cover the core operations for Harness resources (CRUD, search, status, diagnosis, execution, schema discovery) without being overwhelming. Each tool serves a clear purpose within the DevOps platform domain.
The tool set covers creation, retrieval, listing, updating, deletion, schema validation, search, status monitoring, diagnosis, and execution actions. A minor gap is the lack of a dedicated tool for fetching detailed execution logs or history, but harness_status and harness_diagnose partially address this.
Maintenance
Related MCP Connectors
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
Governed app access for AI agents: 1,000+ apps & 12,000+ tools via Code Mode MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Coolify infrastructure including servers, applications, databases, deployments, and 80+ one-click services through 98 comprehensive tools for both cloud and self-hosted instances.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to deploy and manage applications on Coolify through structured tools, supporting project management, app lifecycle control, pre-configured templates, and deployment monitoring with built-in safety guardrails.1393MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI applications to manage continuous delivery and cloud costs through the Harness platform.2-
- AlicenseAqualityBmaintenanceLets AI agents query, manage, and operate their LLM observability data directly from the conversation. Provides 87 tools for cost analysis, alerting, anomaly detection, and runtime control gates.87209MIT