Harness

resmi

Mengakses dan berinteraksi dengan data platform Harness, termasuk pipeline, repositori, log, dan registri artefak.

Apa yang bisa Anda lakukan dengan Harness MCP?

  • Mendaftar sumber daya Harness — Minta AI Anda untuk mendaftar organisasi, proyek, pipeline, atau sumber daya lainnya menggunakan harness_list.
  • Mengambil detail sumber daya — Dapatkan detail lengkap dari sumber daya Harness apa pun, seperti pipeline atau layanan, melalui harness_get.
  • Membuat sumber daya baru — Instruksikan AI Anda untuk membuat pipeline, layanan, atau entitas lainnya dengan harness_create.
  • Penemuan lintas proyek — Minta eksekusi yang gagal atau sumber daya di semua proyek; agen secara dinamis menavigasi hierarki akun.
  • Autentikasi multi-pengguna — Dalam deployment bersama, setiap sesi dapat mengautentikasi dengan kunci API Harness miliknya sendiri melalui header x-harness-api-key.

Dokumentasi

Server MCP Harness 2.0

MCP Toplist

Server MCP (Model Context Protocol) yang memberikan akses penuh kepada agen AI ke platform Harness.io melalui 11 alat gabungan dan 255 tipe sumber daya.

Mengapa Menggunakan Server MCP Ini

Sebagian besar server MCP memetakan satu alat per endpoint API. Untuk platform seluas Harness, itu berarti 240+ alat — dan LLM semakin buruk dalam pemilihan alat seiring bertambahnya jumlah. Jendela konteks terisi dengan skema, dan setiap endpoint baru berarti kode baru.

Server ini dibangun secara berbeda:

  • 11 alat, 255 tipe sumber daya. Sistem dispatch berbasis registry mengarahkan harness_list, harness_get, harness_create, dll. ke sumber daya Harness apa pun — pipeline, layanan, lingkungan, org, proyek, fitur flag, data biaya, dan lainnya. LLM memilih dari 11 alat, bukan ratusan.
  • Cakupan platform penuh. 41 toolset default yang mencakup CI/CD, GitOps, Feature Flags, Cloud Cost Management, Security Testing, Chaos Engineering, Database DevOps, Internal Developer Portal, Software Supply Chain, Infrastructure as Code Management, Release Management, Governance, Service Overrides, Knowledge Graph, dan lainnya. Cakupan Ansible dan evaluasi observabilitas opt-in tersedia saat diperlukan.
  • Alur kerja multi-proyek langsung tersedia. Agen menemukan organisasi dan proyek secara dinamis — tanpa perlu env var yang di-hardcode. Tanyakan "tampilkan eksekusi yang gagal di semua proyek" dan agen dapat menavigasi hierarki akun penuh.
  • 35 template prompt. Prompt siap pakai untuk alur kerja umum: membangun & men-deploy aplikasi end-to-end, men-debug pipeline yang gagal, meninjau metrik DORA, triase kerentanan, mengoptimalkan biaya cloud, mengaudit kontrol akses, merencanakan peluncuran fitur flag, meninjau pull request, menyetujui pipeline yang tertunda, dan lainnya.
  • Berfungsi di mana saja. Transport Stdio untuk klien lokal (Claude Desktop, Cursor, Devin Desktop), transport HTTP untuk deployment jarak jauh/bersama, siap untuk Docker dan Kubernetes.
  • Mulai tanpa konfigurasi. Cukup berikan kunci API Harness. ID akun diekstrak otomatis dari token PAT dan SAT, default org/proyek bersifat opsional, dan pemfilteran toolset memungkinkan Anda hanya mengekspos apa yang Anda butuhkan.
  • Dapat diperluas secara desain. Menambahkan sumber daya Harness baru berarti menambahkan file data deklaratif — tanpa registrasi alat baru, tanpa perubahan skema, tanpa pembaruan prompt.

Prasyarat

Sebelum menginstal atau menjalankan server, Anda memerlukan kunci API Harness:

  1. Masuk ke akun Harness Anda
  2. Buka Profil Saya → Kunci API → + Kunci API Baru
  3. Buat Token baru di bawah kunci API — ini menghasilkan PAT atau SAT dalam format <prefix>.<accountId>.<tokenId>.<secret>
  4. Simpan token di tempat yang aman — Anda akan membutuhkannya di langkah berikutnya

Untuk petunjuk terperinci, lihat Panduan Memulai Cepat API Harness.

Mulai Cepat

Opsi 0: Harness MCP yang Dihosting

Jika akun Harness Anda memiliki layanan MCP yang dihosting diaktifkan, klien yang mendukung server MCP jarak jauh dapat terhubung langsung ke endpoint terkelola alih-alih menjalankan server secara lokal.

Penting: Layanan MCP yang dihosting menggunakan Harness Platform OAuth, bukan HARNESS_API_KEY. Layanan ini juga harus diaktifkan/dikonfigurasi per akun oleh Dukungan Harness sebelum endpoint dapat digunakan.

Lihat Harness MCP yang Dihosting untuk contoh konfigurasi.

Opsi 1: npx (Direkomendasikan)

Tidak perlu instalasi — cukup jalankan:

HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2@latest

Atau konfigurasikan kunci API di klien AI Anda (lihat Konfigurasi Klien di bawah).

# Stdio transport (default — for Claude Desktop, Cursor, Devin Desktop, 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 8080

Catatan: ID akun diekstrak otomatis dari token PAT dan SAT (pat.<accountId>... atau sat.<accountId>...), jadi HARNESS_ACCOUNT_ID hanya diperlukan untuk kunci API tanpa segmen akun yang tertanam.

Opsi 2: Instalasi Global

npm install -g harness-mcp-v2

# Then run directly
harness-mcp-v2

Opsi 3: Bangun dari Sumber

Untuk pengembangan atau kustomisasi:

git clone https://github.com/harness/mcp-server.git
cd mcp-server
pnpm install
pnpm build

# Run
pnpm start              # Stdio transport
pnpm start:http         # HTTP transport
pnpm inspect            # Test with MCP Inspector

Bundel Direktori MCP Anthropic

Manifest bundel MCPB berada di [mcp-directory/](mcp-directory/), dan ikon bundel 512×512 dilacak di [icon.png](icon.png) di root repositori. Arsip yang dikemas berisi manifest.json, icon.png, server/, package.json, npm-shrinkwrap.json tingkat root, dan node_modules/ produksi.

Untuk menjaga arsip tetap kecil, bangun paket MCPB dari direktori staging:

pnpm prepare:mcpb

Direktori staging ditulis ke dist/mcpb/ dengan dependensi produksi yang diinstal dari npm-shrinkwrap.json menggunakan tata letak datar npm. CLI MCPB resmi yang dipatok memvalidasinya dan membuat dist/harness-mcp-server-<version>.mcpb.

Tag versi yang cocok dengan v*.*.* menerbitkan bundel tersebut ke Rilis GitHub yang sesuai secara otomatis. Untuk mengisi ulang rilis yang ada tanpa menerbitkan ulang npm, jalankan alur kerja Release secara manual dengan input release_tag (misalnya, v3.2.20). Alur kerja memeriksa dan membangun tag persis tersebut sebelum mengganti hanya aset MCPB versinya.

Penggunaan CLI

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 exit

Transport default ke stdio jika tidak ditentukan. Gunakan http untuk deployment jarak jauh/bersama.

Transport HTTP

Saat berjalan dalam mode HTTP, server mengekspos:

EndpointMetodeDeskripsi
/mcpPOSTEndpoint JSON-RPC MCP (initialize + permintaan sesi)
/mcpGETAliran SSE untuk pesan yang diprakarsai server (progres, elisitasi)
/mcpDELETEMengakhiri sesi MCP yang aktif
/mcpOPTIONSPreflight CORS
/healthGETPemeriksaan kesehatan — mengembalikan { "status": "ok", "sessions": <count> }
/.well-known/oauth-protected-resourceGETMetadata RFC 9728 saat HARNESS_MCP_MODE=oauth
/.well-known/oauth-protected-resource/mcpGETMetadata RFC 9728 yang sadar jalur untuk sumber daya /mcp default

Transport HTTP berjalan dalam mode berbasis sesi. Sesi MCP baru dibuat pada initialize, server mengembalikan header mcp-session-id, dan permintaan berikutnya untuk sesi tersebut harus menyertakan header yang sama.

Batasan operasional dalam mode HTTP:

  • Tetapkan HARNESS_MCP_AUTH_TOKEN untuk deployment pengguna tunggal dan multi-pengguna yang dibagikan atau dapat dijangkau dari jarak jauh. Saat ditetapkan, setiap permintaan POST, GET, dan DELETE ke /mcp harus menyertakan Authorization: Bearer <token>.
  • Mode OAuth menerima token akses HarnessID alih-alih HARNESS_MCP_AUTH_TOKEN dan dapat mengikat ke alamat non-loopback tanpa opt-out tanpa autentikasi.
  • Bind pengguna tunggal dan multi-pengguna non-loopback memerlukan HARNESS_MCP_AUTH_TOKEN secara default. Untuk menjalankan tanpa autentikasi pada antarmuka non-loopback, tetapkan HARNESS_MCP_ALLOW_UNAUTHENTICATED_HTTP=true secara eksplisit.
  • POST /mcp tanpa mcp-session-id harus berupa permintaan initialize.
  • POST /mcp, GET /mcp, dan DELETE /mcp untuk sesi yang ada memerlukan header mcp-session-id.
  • GET /mcp digunakan untuk notifikasi SSE (pembaruan progres dan prompt elisitasi).
  • Sesi idle dibersihkan setelah MCP_SESSION_TTL_MS milidetik setelah tidak ada permintaan atau aliran SSE yang aktif (default 1800000, atau 30 menit).
  • GET /health adalah satu-satunya endpoint non-MCP.
  • Ukuran badan permintaan dibatasi oleh HARNESS_MAX_BODY_SIZE_MB (default 10 MB).
  • Tetapkan x-harness-pipeline-version: 0 atau 1 pada permintaan initialize untuk memilih sumber daya pipeline V0 atau V1 untuk sesi HTTP tersebut.
  • Tetapkan x-harness-auto-approve-risk: none|low_write|medium_write|high_write|all pada permintaan initialize untuk memilih ambang persetujuan otomatis per sesi yang lebih ketat. Server membatasi nilai ini pada HARNESS_AUTO_APPROVE_RISK tingkat deployment, sehingga sesi dapat mengurangi tetapi tidak memperluas batas persetujuan yang dikonfigurasi.

Mode OAuth HarnessID

Tetapkan HARNESS_MCP_MODE=oauth untuk memungkinkan klien MCP jarak jauh menemukan HarnessID dan menyelesaikan OAuth 2.1 Authorization Code dengan PKCE. Mode OAuth hanya tersedia dengan transport HTTP. Default routing HarnessID produksi, sumber daya MCP, dan API sudah terpasang:

HARNESS_MCP_MODE=oauth

Ini default ke issuer https://id.harness.io/idp/realms/HarnessIDP, sumber daya https://mcp.harness.io/mcp, klien OAuth mcp-client, dan basis API Harness https://mcp.harness.io/cli. Ganti hanya untuk QA, pengembangan lokal, atau lingkungan Harness lainnya.

HARNESS_API_KEY tidak boleh ditetapkan dalam mode ini. HARNESS_MCP_OAUTH_JWKS_URI default ke <issuer>/protocol/openid-connect/certs, dan HARNESS_ACCOUNT_ID tidak diperlukan karena akun berasal dari token.

Server menerbitkan metadata sumber daya terlindungi RFC 9728 dan mengembalikan tantangan ini saat klien belum diautentikasi:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.harness.io/.well-known/oauth-protected-resource/mcp"

Ini memvalidasi tanda tangan RS256 token akses HarnessID, iss, kedaluwarsa, dan sub menggunakan endpoint JWKS yang dikonfigurasi, dan memeriksa bahwa token diterbitkan ke HARNESS_MCP_OAUTH_CLIENT_ID melalui klaim azp. HARNESS_MCP_OAUTH_RESOURCE adalah pengidentifikasi sumber daya terlindungi RFC 9728 yang digunakan untuk penemuan dan tantangan. Token akses HarnessID saat ini menggunakan aud: account alih-alih URL MCP, sehingga sumber daya tidak dibandingkan dengan aud.

ID akun berasal dari klaim HARNESS_MCP_OAUTH_ACCOUNT_CLAIM token (account_id secara default), yang diisi oleh cakupan organization HarnessID. Setiap sesi menyimpan token akses pemanggil dan meneruskannya ke API Harness sebagai Authorization: Bearer, sehingga RBAC Harness dan catatan audit mencerminkan pengguna yang masuk alih-alih PAT bersama. Sesi terikat pada sub dan akun tempat sesi dibuat: permintaan berikutnya dapat membawa token yang disegarkan, tetapi token untuk pengguna atau akun yang berbeda ditolak.

Klien biasanya hanya memerlukan URL sumber daya MCP:

{
  "mcpServers": {
    "harness": {
      "url": "https://mcp.harness.io/mcp"
    }
  }
}

Klien membaca metadata sumber daya terlindungi, menemukan HARNESS_MCP_OAUTH_ISSUER, lalu menggunakan metadata RFC 8414 server otorisasi tersebut. Jika klien tidak mendukung pendaftaran klien dinamis, gunakan ID klien mcp-client yang telah terdaftar sebelumnya.

Lihat OAuth HarnessID untuk server MCP yang dihosting sendiri untuk daftar periksa Keycloak QA dan perintah validasi.

Mode Multi-Pengguna

Tetapkan HARNESS_MCP_MODE=multi-user untuk deployment HTTP bersama di mana setiap klien diautentikasi sebagai pengguna Harness yang berbeda. Dalam mode ini:

  • HARNESS_API_KEY tidak boleh ditetapkan dalam konfigurasi server — server tidak menyimpan kredensial Harness.
  • Setiap sesi harus menyediakan x-harness-api-key pada permintaan initialize. x-harness-account-id diperlukan hanya saat kunci API tidak menyematkan segmen akun.
  • Sesi juga dapat menyediakan header x-harness-org dan x-harness-project untuk menetapkan cakupan default untuk sesi tersebut.
  • Kunci API Harness mengalir ke setiap panggilan API Harness untuk sesi tersebut, sehingga jejak audit di Harness mencerminkan pengguna sebenarnya.
  • HARNESS_MCP_AUTH_TOKEN bersifat independen dan masih dapat digunakan sebagai gerbang lapisan transport tambahan.
# Health check
curl http://localhost:3000/health

# MCP initialize request (capture mcp-session-id response header)
# In multi-user mode, x-harness-api-key is required on initialize.
# x-harness-account-id is needed only for API keys without an embedded account segment.
curl -i -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -H "x-harness-api-key: $HARNESS_API_KEY" \
  -H "x-harness-account-id: $HARNESS_ACCOUNT_ID" \
  -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 "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -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 "Authorization: Bearer $HARNESS_MCP_AUTH_TOKEN" \
  -H "mcp-session-id: <session-id>"

HARNESS_MCP_ALLOWED_HOSTS mengontrol validasi header Host untuk perlindungan DNS-rebinding, dan CORS membatasi asal browser. Keduanya bukan autentikasi; gunakan HARNESS_MCP_AUTH_TOKEN atau gateway/proxy balik yang diautentikasi untuk kontrol akses.

Konfigurasi Klien

Catatan: HARNESS_ORG dan HARNESS_PROJECT bersifat opsional. Keduanya menetapkan ID org dan ID proyek yang digunakan saat tidak ditentukan per panggilan alat. Agen dapat menemukan org dan proyek secara dinamis menggunakan harness_list(resource_type="organization") dan harness_list(resource_type="project"). Nama yang tidak digunakan lagi HARNESS_DEFAULT_ORG_ID dan HARNESS_DEFAULT_PROJECT_ID masih diterima untuk kompatibilitas mundur.

Harness MCP yang Dihosting

Harness juga mendukung endpoint MCP yang dihosting untuk akun yang memiliki layanan terkelola diaktifkan. Ini berguna saat Anda menginginkan endpoint MCP jarak jauh bersama alih-alih menjalankan npx harness-mcp-v2 atau meng-host sendiri transport HTTP.

Penting: Autentikasi MCP yang di-hosting menggunakan Harness Platform OAuth. Ini tidak menggunakan HARNESS_API_KEY dalam konfigurasi klien. Ketersediaan MCP yang di-hosting dikonfigurasi per akun Harness, jadi Anda perlu bekerja sama dengan Harness Support untuk mengaktifkan/mengonfigurasi pengaturan tersebut sebelum menggunakannya.

Endpoint yang di-hosting https://mcp.harness.io/mcp adalah layanan terkelola. Konfigurasi MCP sisi klien di Claude, Cursor, atau Cowork tidak dapat menimpa lingkungan Harness mana yang dituju. Untuk Harness0 atau lingkungan Harness SaaS privat lainnya, minta Harness Support untuk mengaktifkan/mengonfigurasi MCP yang di-hosting untuk lingkungan tersebut, atau jalankan server lokal/self-hosted dan atur HARNESS_BASE_URL ke host Harness target.

Contoh MCP yang di-hosting:

{
  "mcpServers": {
    "harness-prod1-mcp": {
      "url": "https://mcp.harness.io/mcp",
      "auth": {
        "CLIENT_ID": "mcp-client"
      }
    }
  }
}

Contoh dengan entri yang di-hosting dan lokal:

{
  "mcpServers": {
    "harness-hosted": {
      "url": "https://mcp.harness.io/mcp",
      "auth": {
        "CLIENT_ID": "mcp-client"
      }
    },
    "harness-local": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Pemecahan Masalah npx ENOENT atau node: No such file or directory

Ini adalah kegagalan peluncuran proses klien, bukan kegagalan autentikasi Harness. Server MCP belum dimulai, jadi mengubah HARNESS_API_KEY tidak akan memengaruhi spawn npx ENOENT.

Aplikasi GUI (Cursor, Claude Desktop, Devin Desktop, VS Code) tidak selalu mewarisi PATH dari shell Anda, sehingga mereka dapat gagal menemukan npx atau node setelah muat ulang konfigurasi. Perbaiki ini dengan menggunakan jalur absolut dan secara eksplisit mengatur PATH di blok env:

{
  "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"
      }
    }
  }
}

Temukan jalur Anda dengan which npx dan which node di terminal, lalu pastikan direktori yang berisi node disertakan dalam nilai PATH di atas. Lokasi umum:

  • Homebrew (macOS): /opt/homebrew/bin/npx
  • nvm: ~/.nvm/versions/node/v20.x.x/bin/npx (jalankan nvm which current untuk menemukan jalur yang tepat)
  • Node Sistem: /usr/local/bin/npx

Claude Desktop (claude_desktop_config.json)

npx (instalasi nol)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

node (instalasi lokal)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Claude Code (melalui claude mcp add)

npx (instalasi nol)

claude mcp add harness -- npx harness-mcp-v2

node (instalasi lokal)

npm install -g harness-mcp-v2
claude mcp add harness -- harness-mcp-v2

Kemudian atur HARNESS_API_KEY di lingkungan Anda atau file .env.

Cursor (.cursor/mcp.json)

npx (instalasi nol, direkomendasikan untuk konfigurasi Cursor lokal)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Jalankan which npx di terminal dan gunakan jalur lengkap tersebut untuk command; sertakan direktori dari which node di bagian depan PATH.

node (instalasi lokal)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Jalankan which harness-mcp-v2 setelah npm install -g harness-mcp-v2 dan gunakan jalur lengkap tersebut untuk command; sertakan direktori dari which node di bagian depan PATH.

Devin Desktop (~/.windsurf/mcp.json)

npx (instalasi nol)

{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/npx",
      "args": ["-y", "harness-mcp-v2@latest"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

node (instalasi lokal)

npm install -g harness-mcp-v2
{
  "mcpServers": {
    "harness": {
      "command": "/absolute/path/to/harness-mcp-v2",
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "PATH": "/directory/containing/node:/usr/local/bin:/usr/bin:/bin"
      }
    }
  }
}

Menggunakan build lokal dari sumber?

Ganti perintah dengan jalur ke index.js yang telah Anda build:

{
  "command": "node",
  "args": ["/absolute/path/to/harness-mcp-v2/build/index.js", "stdio"]
}

MCP Gateway

Server MCP Harness sepenuhnya kompatibel dengan MCP Gateway — proxy terbalik yang menyediakan autentikasi terpusat, tata kelola, perutean alat, dan observabilitas di berbagai server MCP. Karena server mengimplementasikan protokol MCP standar dengan transport stdio dan HTTP, server ini berfungsi di belakang gateway apa pun yang sesuai dengan MCP tanpa perubahan kode.

Mengapa menggunakan gateway?

  • Manajemen kredensial terpusat — tidak ada kunci API dalam konfigurasi agen
  • Tata kelola & pencatatan audit untuk semua panggilan alat di seluruh tim
  • Titik akhir tunggal untuk agen alih-alih N koneksi ke N server MCP
  • Kontrol akses — batasi tim mana yang dapat menggunakan alat mana

Docker MCP Gateway

Daftarkan server dalam konfigurasi Docker MCP Gateway Anda:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx"
      }
    }
  }
}

Portkey

Tambahkan server MCP Harness ke Portkey MCP Gateway Anda untuk tata kelola perusahaan, pelacakan biaya, dan perutean multi-LLM:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx"
      }
    }
  }
}

LiteLLM

Tambahkan ke konfigurasi proxy LiteLLM Anda:

mcp_servers:
  - name: harness
    command: npx
    args:
      - harness-mcp-v2
    env:
      HARNESS_API_KEY: "pat.xxx.xxx.xxx"

Envoy AI Gateway

Server berfungsi dengan dukungan MCP Envoy AI Gateway melalui transport HTTP:

# Start the server in HTTP mode
HARNESS_API_KEY=pat.xxx.xxx.xxx npx harness-mcp-v2 http --port 8080

Kemudian konfigurasikan Envoy untuk merutekan ke http://localhost:8080/mcp sebagai backend MCP hulu.

Kong

Gunakan plugin AI MCP Proxy Kong untuk mengekspos server MCP Harness melalui infrastruktur gateway Kong Anda yang ada.

Gateway Lainnya

Gateway apa pun yang mendukung spesifikasi MCP (Microsoft MCP Gateway, IBM ContextForge, Cloudflare Workers, dll.) dapat mem-proxy server ini. Untuk gateway berbasis stdio, gunakan transport default. Untuk gateway berbasis HTTP, mulai server dengan transport http dan arahkan gateway ke endpoint /mcp.

Docker

Bangun dan jalankan server sebagai kontainer Docker:

# 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-server

Kontainer berjalan dalam mode HTTP pada port 3000 secara default dengan pemeriksaan kesehatan bawaan.

Kubernetes

Deploy ke kluster Kubernetes menggunakan manifes yang disediakan:

# 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/health

Deployment menjalankan 2 replika dengan probe kesiapan/liveness, batas sumber daya, dan konteks keamanan non-root. Service mengekspos port 80 secara internal (menargetkan port kontainer 3000).

Konfigurasi

Server secara otomatis memuat variabel lingkungan dari file .env di root proyek jika ada. Salin .env.example ke .env dan isi nilai Anda. Variabel lingkungan juga dapat diatur melalui shell atau konfigurasi klien MCP Anda.

VariabelWajibDefaultDeskripsi
HARNESS_MCP_MODETidaksingle-userMode deployment: single-user (kunci API bersama), multi-user (HTTP dengan kunci API per sesi), atau oauth (HTTP dengan validasi token akses HarnessID)
HARNESS_API_KEYYa*--Token akses pribadi Harness atau token akun layanan. Diwajibkan dalam mode single-user. TIDAK boleh diatur dalam mode multi-user atau oauth, di mana setiap sesi membawa kredensialnya sendiri
HARNESS_ACCOUNT_IDTidak(dari PAT/SAT)Pengidentifikasi akun Harness. Diekstrak otomatis dari token PAT/SAT dalam mode pengguna tunggal; sesi multi-pengguna dapat menyediakan miliknya sendiri melalui x-harness-account-id ketika kunci API tidak menyematkannya
HARNESS_BASE_URLTidakhttps://app.harness.io (https://mcp.harness.io/cli dalam mode OAuth)URL basis API/UI Harness. Mode OAuth dirutekan melalui proxy MCP /cli yang dihosting secara default; mode lain menggunakan API SaaS Harness secara langsung
HARNESS_MCP_OAUTH_ISSUERTidakhttps://id.harness.io/idp/realms/HarnessIDPPenerbit HarnessID dicocokkan secara tepat terhadap klaim iss token akses
HARNESS_MCP_OAUTH_RESOURCETidakhttps://mcp.harness.io/mcpURL MCP kanonik publik yang diterbitkan sebagai pengidentifikasi sumber daya RFC 9728
HARNESS_MCP_OAUTH_JWKS_URITidak<issuer>/protocol/openid-connect/certsTitik akhir JWKS HarnessID yang digunakan untuk memvalidasi tanda tangan token akses RS256
HARNESS_MCP_OAUTH_CLIENT_IDTidakmcp-clientKlien HarnessID yang kepadanya token akses harus diterbitkan, diperiksa terhadap klaim azp token
HARNESS_MCP_OAUTH_ACCOUNT_CLAIMTidakaccount_idKlaim token akses yang membawa ID akun Harness, diisi oleh cakupan organization HarnessID
HARNESS_MCP_OAUTH_SCOPESTidakopenid profile email organizationCakupan yang dipisahkan spasi yang diiklankan dalam metadata sumber daya yang dilindungi RFC 9728
HARNESS_FME_API_KEYTidak--Kredensial Admin FME/Split opsional pengguna tunggal/self-hosted yang digunakan untuk sumber daya fme_ hanya dalam mode lama (workspace_id). FME lama tidak tersedia dalam mode OAuth sehingga token HarnessID tidak pernah dikirim ke api.split.io; gunakan cakupan org_id+project_id asli Harness sebagai gantinya. Tidak boleh diatur dalam mode multi-user atau oauth
HARNESS_FME_BASE_URLTidakhttps://api.split.ioURL basis API Admin Split/FME yang digunakan oleh sumber daya fme_ hanya dalam mode lama (workspace_id). URL HTTP memerlukan HARNESS_ALLOW_HTTP=true untuk pengembangan lokal. Mode asli Harness (org_id+project_id) mengabaikan ini dan menggunakan HARNESS_API_KEY/HARNESS_BASE_URL standar sebagai gantinya
HARNESS_ORGTidak--ID Organisasi. Digunakan ketika org_id tidak ditentukan per panggilan alat. Jika dihilangkan, org_id harus diberikan secara eksplisit. Agen juga dapat menemukan org secara dinamis melalui harness_list(resource_type="organization")
HARNESS_PROJECTTidak--ID Proyek. Digunakan ketika project_id tidak ditentukan per panggilan alat. Agen juga dapat menemukan proyek secara dinamis melalui harness_list(resource_type="project")
HARNESS_API_TIMEOUT_MSTidak30000Batas waktu permintaan HTTP dalam milidetik
HARNESS_MAX_RETRIESTidak3Jumlah percobaan ulang untuk kegagalan sementara (429, 5xx)
HARNESS_MAX_BODY_SIZE_MBTidak10Ukuran maksimum badan permintaan HTTP dalam MB untuk transport http
HARNESS_RATE_LIMIT_RPSTidak10Pembatasan permintaan sisi klien (permintaan per detik) ke API Harness
LOG_LEVELTidakinfoTingkat verbositas log: debug, info, warn, error
HARNESS_TOOLSETSTidak(default)Daftar perangkat alat yang dipisahkan koma. Kosong memuat perangkat alat default. Mendukung +name untuk menyertakan perangkat alat opt-in secara eksplisit dan -name untuk menghapus default (lihat Pemfilteran Perangkat Alat)
HARNESS_READ_ONLYTidakfalseBlokir semua operasi mutasi (buat, perbarui, hapus, jalankan). Hanya daftar dan dapatkan yang diizinkan. Berguna untuk lingkungan bersama/demo
HARNESS_AUTO_APPROVE_RISKTidaknoneAmbang persetujuan otomatis berbasis risiko untuk alur kerja otonom. Operasi pada atau di bawah risiko ini berlanjut tanpa konfirmasi. Nilai: none, low_write, medium_write, high_write, all. Lihat Elicitation
HARNESS_SKIP_ELICITATIONTidakfalseTidak digunakan lagi — gunakan HARNESS_AUTO_APPROVE_RISK=all sebagai gantinya. Dipertahankan untuk kompatibilitas mundur
HARNESS_ALLOW_HTTPTidakfalseIzinkan HARNESS_BASE_URL non-HTTPS. Secara default, server memberlakukan HTTPS untuk keamanan. Atur ke true hanya untuk pengembangan lokal terhadap instance Harness non-TLS
HARNESS_PIPELINE_VERSIONTidak0(Alpha) Versi YAML Pipeline. 0 memuat tipe sumber daya pipeline dan mengecualikan pipeline_v1; 1 memuat pipeline_v1 dan mengecualikan pipeline. Sesi HTTP dapat menimpa ini pada waktu inisialisasi dengan x-harness-pipeline-version: 0 atau 1
HARNESS_MCP_ALLOWED_HOSTSTidak--Nama host yang dipisahkan koma yang diizinkan oleh validasi Header Host transport HTTP. mcp.harness.io diizinkan secara default untuk bind localhost; tambahkan proxy/domain kustom di sini
HARNESS_MCP_AUTH_TOKENTidak--Token Bearer statis yang diperlukan pada rute HTTP /mcp saat diatur. Diwajibkan secara default untuk bind pengguna tunggal dan multi-pengguna non-loopback. Harus tidak diatur dalam mode oauth
HARNESS_MCP_ALLOW_UNAUTHENTICATED_HTTPTidakfalseIzinkan transport HTTP tanpa autentikasi secara eksplisit pada bind non-loopback. Gunakan hanya di belakang kontrol terautentikasi lainnya
HARNESS_MCP_TRUST_PROXYTidak0Jumlah hop proxy terbalik / penyeimbang beban yang dipercaya untuk resolusi IP klien (Express trust proxy). Atur ke jumlah proxy di depan server sehingga pembatasan tingkat per-IP menggunakan kunci pada klien nyata daripada peer soket proxy
HARNESS_MCP_LOG_FILETidak~/.claude/harness-mcp.logFile yang digunakan untuk diagnostik pemutusan/crash stdio ketika stderr mungkin tidak lagi tersedia
HARNESS_LOG_UNSAFE_BODIESTidakfalseSertakan badan permintaan/respons mentah dalam log. Mati secara default karena badan dapat berisi rahasia; aktifkan hanya untuk debugging lokal
HARNESS_AUDIT_FILETidak--Tambahkan peristiwa audit ke file JSON yang dipisahkan baris baru untuk pengumpulan lokal yang tahan lama
HARNESS_AUDIT_WEBHOOK_URLTidak--Titik akhir HTTPS yang menerima peristiwa audit yang dikelompokkan. URL HTTP memerlukan HARNESS_ALLOW_HTTP=true untuk pengembangan lokal
HARNESS_AUDIT_WEBHOOK_TOKENTidak--Token bearer opsional yang dikirim ke webhook audit
HARNESS_AUDIT_WEBHOOK_BATCH_SIZETidak10Jumlah peristiwa audit yang dikelompokkan sebelum flush webhook
HARNESS_AUDIT_WEBHOOK_FLUSH_MSTidak5000Waktu maksimum untuk menahan event audit sebelum flush webhook
OTEL_EXPORTER_OTLP_ENDPOINTTidak--Mengaktifkan span audit OpenTelemetry ketika paket OpenTelemetry opsional terinstal
HARNESS_SEARCH_PROVIDERTidaklocalBackend pencarian semantik: local (embedding ONNX dalam proses, default), remote (layanan pencarian eksternal melalui HTTP, diperlukan untuk mode multi-pengguna), atau none (nonaktifkan pencarian semantik, fallback ke scatter-gather kata kunci saja). Gunakan none di lingkungan terisolasi atau ketika pemuatan model saat startup tidak diinginkan
HARNESS_SEARCH_SERVICE_URLTidak--URL dasar layanan pencarian jarak jauh ketika HARNESS_SEARCH_PROVIDER=remote (misalnya http://search-svc:8080). Diperlukan saat menggunakan penyedia remote
HARNESS_SEARCH_SERVICE_HEADERSTidak--Objek JSON berisi header yang dikirim dengan setiap permintaan ke layanan pencarian jarak jauh. Mendukung skema autentikasi apa pun: {"Authorization":"Bearer tok"}, {"x-api-key":"key"}, atau beberapa header internal antar-layanan
HARNESS_HF_CACHE_DIRTidak/tmp/hf-cacheDirektori untuk cache model @huggingface/transformers yang digunakan oleh penyedia pencarian local. Image Docker telah menyematkan model ke dalam /app/.cache/hf untuk menghindari unduhan saat runtime. Atur ke jalur volume persisten dalam deployment produksi
HARNESS_DIAGNOSE_LOG_FETCH_CONCURRENCYTidak3Jumlah maksimum unduhan blob log bersamaan yang dikeluarkan oleh harness_diagnose saat mengambil log untuk langkah yang gagal. Tingkatkan hanya jika latensi diagnosis didominasi oleh waktu dinding pengambilan log dan pod memiliki ruang memori yang cukup

Pencarian Semantik

harness_search menggunakan perutean semantik untuk mempersempit panggilan scatter-gather API sebelum menyebar ke Harness. Tiga penyedia pencarian tersedia:

PenyediaKapan digunakan
local (default)Mode stdio pengguna tunggal. Menjalankan all-MiniLM-L6-v2 dalam proses melalui @huggingface/transformers. Mengunduh model ~23 MB pada penggunaan pertama; mulai berikutnya menggunakan cache.
remoteMode HTTP multi-pengguna (dihosting Harness). Mendelegasikan embedding dan pengambilan ke layanan pencarian eksternal. Isolasi penyewa ditegakkan melalui tenant_id — pengetahuan/dokumen statis menggunakan global, data entitas per-akun menggunakan ID akun.
noneNonaktifkan pencarian semantik sepenuhnya; kembali ke scatter-gather kata kunci di semua jenis sumber daya.

Konfigurasi penyedia jarak jauh:

HARNESS_SEARCH_PROVIDER=remote
HARNESS_SEARCH_SERVICE_URL=http://search-svc:8080

# Auth — any scheme via HARNESS_SEARCH_SERVICE_HEADERS (JSON object):
HARNESS_SEARCH_SERVICE_HEADERS='{"Authorization":"Bearer <token>"}'   # standard bearer
HARNESS_SEARCH_SERVICE_HEADERS='{"x-api-key":"<key>"}'               # API key header
HARNESS_SEARCH_SERVICE_HEADERS='{"x-harness-token":"<svc-token>"}'   # internal service-to-service
# Multiple headers (e.g. service mesh + tenant routing):
HARNESS_SEARCH_SERVICE_HEADERS='{"x-harness-token":"<tok>","x-tenant":"<id>"}'
# No auth (service mesh / mTLS handles it):
# omit HARNESS_SEARCH_SERVICE_HEADERS entirely

Menguji penyedia jarak jauh secara lokal dengan layanan stub yang disertakan (tanpa dependensi eksternal):

# 1. Create a venv and install FastAPI
python3 -m venv .venv-stub
.venv-stub/bin/pip install fastapi uvicorn

# 2. Start the stub (in-memory, cosine similarity, corpus + tenant filtering)
.venv-stub/bin/uvicorn stub-search-service:app --port 8082

# 3. Build the MCP server
pnpm build

# 4. Run the integration smoke test
node test-remote-provider.mjs
# Expected output:
#   available: true
#   indexed 2 docs
#   entity search results: pipeline:ts-test score=... corpus=entities
#   knowledge search results: schema:trigger score=...
#   all-corpus search results: (merged, sorted by score)
#   isolation check (other-acct, should be empty): PASS

# 5. Tear down
kill $(lsof -ti :8082)

Stub (stub-search-service.py) mengimplementasikan kontrak /v1/health, /v1/ingest, dan /v1/search yang sama dengan layanan pencarian produksi. Ini menggunakan embedding bag-of-chars sederhana sehingga tidak diperlukan unduhan model — hasilnya masuk akal secara semantik tetapi tidak berkualitas produksi.

Penegakan HTTPS

HARNESS_BASE_URL harus menggunakan HTTPS secara default. Jika Anda menetapkan URL non-HTTPS (misalnya http://localhost:8080), server akan menolak untuk memulai dengan:

HARNESS_BASE_URL must use HTTPS (got "http://..."). If you need HTTP for local development, set HARNESS_ALLOW_HTTP=true.

Pencatatan Audit

Semua operasi API Harness yang didispatch melalui registry (list, get, create, update, delete, dan execute) mengeluarkan peristiwa audit terstruktur ketika sink audit dikonfigurasi. Peristiwa yang mengubah data menyertakan jalur konfirmasi yang digunakan oleh elicitation atau persetujuan otomatis ketika konteks konfirmasi ada; peristiwa baca saat ini menghilangkan metadata konfirmasi. Alat metadata lokal dan penemuan skema yang melewati registry, seperti harness_describe dan harness_schema, bukan bagian dari aliran audit ini. Sink stderr terdaftar secara default tetapi melalui logger normal dan mematuhi LOG_LEVEL; konfigurasikan sink file atau webhook untuk koleksi audit yang tahan lama:

  • HARNESS_AUDIT_FILE menambahkan peristiwa JSON yang dipisahkan baris baru untuk koleksi lokal.
  • HARNESS_AUDIT_WEBHOOK_URL mengirim batch { "events": [...] } ke webhook HTTPS, opsional dengan HARNESS_AUDIT_WEBHOOK_TOKEN. Batch yang gagal diantrekan ulang dengan kapasitas terbatas dan akhirnya dibuang dengan peringatan daripada memblokir eksekusi alat.
  • OTEL_EXPORTER_OTLP_ENDPOINT mengaktifkan span audit ketika dependensi peer OpenTelemetry opsional diinstal. Sink menggunakan kembali penyedia tracer yang ada jika terdaftar, jika tidak, ia mem-bootstrap eksportir OTLP mandiri.

Setiap peristiwa menyertakan nama alat, jenis sumber daya, operasi, pengidentifikasi, stempel waktu, risiko, hasil, metode/jalur HTTP, durasi, dan metode konfirmasi jika berlaku. Sink audit adalah telemetri upaya terbaik; masalah pengiriman dicatat dan tidak pernah memutar ulang atau mengubah operasi API Harness yang mendasarinya. Untuk detail pengaturan OTel dan atribut span, lihat specs/005-otel-audit-sink.md.

Referensi Alat

Server mengekspos 11 alat MCP. Sebagian besar alat API menerima org_id dan project_id sebagai override opsional — jika dihilangkan, mereka kembali ke HARNESS_ORG dan HARNESS_PROJECT. harness_describe adalah metadata lokal saja dan tidak menggunakan cakupan org/proyek.

Dukungan URL: Sebagian besar alat yang menghadap API menerima parameter url — tempel URL UI Harness dan server secara otomatis mengekstrak org, proyek, jenis sumber daya, ID sumber daya, ID pipeline, dan ID eksekusi. harness_describe tidak menerima url.

Dukungan cakupan: Jenis sumber daya dengan varian akun/org/proyek mengekspos supportedScopes di harness_describe. Berikan resource_scope ketika Anda memerlukan tingkat tertentu:

  • resource_scope: "account" mengirim hanya accountIdentifier.
  • resource_scope: "org" mengirim accountIdentifier dan orgIdentifier.
  • resource_scope: "project" mengirim pengidentifikasi akun, org, dan proyek.

Sumber daya multi-cakupan saat ini termasuk connector, service, environment, infrastructure, secret, file_store, template, policy, dan policy_set. Jika resource_scope dihilangkan, registry menggunakan cakupan default sumber daya dan default yang dikonfigurasi, kecuali sumber daya yang ditandai sebagai cakupan opsional dapat menghilangkan org/proyek kecuali secara eksplisit diberikan. URL Harness juga dapat mengatur cakupan secara otomatis ketika jalur berisi konteks tingkat akun atau tingkat proyek.

Output terstruktur: Setiap alat mendeklarasikan MCP outputSchema. harness_list menormalkan respons Harness seperti daftar menjadi konten terstruktur berbentuk objek sehingga klien ketat dapat memvalidasinya: array tingkat atas menjadi { "items": [...], "total": <count>, "page": <page> }, dan kunci pembungkus umum seperti content, data, body, objects, atau features diangkat ke items ketika diperlukan. Respons teks masih berisi payload JSON ringkas yang dikembalikan ke semua klien.

AlatDeskripsi
harness_describeTemukan tipe resource, operasi, dan bidang yang tersedia. Tidak ada panggilan API — mengembalikan metadata registry lokal.
harness_schemaAmbil definisi dan contoh Skema YAML/JSON Schema yang tepat untuk membuat/memperbarui resource. Skema pipeline/template digabungkan; skema konektor, lingkungan, layanan, rahasia, dan infrastruktur adalah skema entitas yang sadar lingkup yang diambil dari snapshot yang digabungkan atau NG /yaml-schema; skema release_process dan release_activity diambil langsung dari RMG /api/yamlSchema. Mendukung penelusuran mendalam melalui path.
harness_listDaftarkan resource dari tipe tertentu dengan pemfilteran, pencarian, dan paginasi.
harness_getDapatkan satu resource berdasarkan pengidentifikasinya.
harness_createBuat resource baru. Mendukung pipeline inline dan jarak jauh (berbasis Git). Meminta konfirmasi pengguna melalui elicitation.
harness_updatePerbarui resource yang ada. Mendukung pipeline inline dan jarak jauh (berbasis Git). Meminta konfirmasi pengguna melalui elicitation.
harness_deleteHapus resource. Meminta konfirmasi pengguna melalui elicitation. Destruktif.
harness_executeJalankan tindakan pada resource (jalankan/ulangi pipeline, impor pipeline dari Git, alihkan flag, sinkronkan aplikasi). Meminta konfirmasi pengguna melalui elicitation. Untuk eksekusi pipeline, gunakan alur kerja input runtime di bawah ini (mendukung ekspansi singkatan branch/tag/pr_number/commit_sha).
harness_searchCari di seluruh tipe resource Harness dengan satu kueri. Menggunakan perutean semantik (embedding ONNX all-MiniLM-L6-v2 lokal, 384-dimensi) untuk memprediksi tipe resource yang relevan dari korpus knowledge yang diindeks saat startup — biasanya mempersempit dari ~163 tipe menjadi 1–8 sebelum scatter-gather. Jatuh kembali ke pencarian kata kunci scatter-gather penuh ketika kepercayaan semantik rendah. Respons menyertakan semantic_routed dan types_skipped saat perutean aktif. Lihat docs/search-guidelines.md untuk cara membuat tipe resource baru dapat ditemukan.
harness_diagnoseDiagnosa resource pipeline, connector, delegate, dan gitops_application (alias: execution -> pipeline, gitops_app -> gitops_application). Untuk pipeline, mengembalikan waktu tahap/langkah dan detail kegagalan; untuk konektor/delegasi/aplikasi GitOps, mengembalikan sinyal kesehatan dan pemecahan masalah yang ditargetkan.
harness_statusDapatkan dasbor kesehatan proyek secara real-time — eksekusi terbaru, tingkat kegagalan, dan tautan mendalam.

Alur Kerja Pencarian Skema

Gunakan harness_schema sebelum membuat atau memperbarui resource berbasis YAML sehingga agen dapat menyalin nama bidang dan batasan yang tepat alih-alih menebak dari prosa.

  • Skema yang digabungkan mencakup pipeline, template, trigger, pipeline_v1, template_v1, inputSet_v1, overlayInputSet_v1, dan agent-pipeline.
  • Skema entitas mencakup connector, environment, service, secret, dan infrastructure. Skema ini sadar lingkup (account, org, atau project) dan memerlukan org_id/project_id ketika lingkup yang dipilih memerlukannya.
  • Definisi Manajemen Rilis (release_process, release_activity) mengambil JSON Schema langsung dari RMG /api/yamlSchema (tidak digabungkan). Berikan scope, org_id, dan project_id saat membatasi lingkup ke organisasi atau proyek.
  • Snapshot entitas yang disertakan digunakan terlebih dahulu ketika cocok dengan akun runtime; jika tidak, alat tersebut kembali ke API NG /yaml-schema Harness dan menyimpan hasilnya dalam cache.
  • Hilangkan path untuk ringkasan bidang/bagian, lalu berikan path yang dipisahkan titik untuk memeriksa definisi bersarang.

Contoh:

{ "resource_type": "pipeline", "path": "pipeline.stages" }
{
  "resource_type": "connector",
  "scope": "project",
  "org_id": "default",
  "project_id": "payments"
}

Pemelihara dapat menyegarkan snapshot entitas yang disertakan dengan pnpm sync-entity-schemas ketika skema YAML entitas Harness berubah.

Contoh Alat

Temukan resource apa yang tersedia:

{ "resource_type": "pipeline" }

Daftarkan organisasi di akun:

{ "resource_type": "organization" }

Daftarkan proyek dalam organisasi:

{ "resource_type": "project", "org_id": "default" }

Daftarkan pipeline dalam proyek:

{ "resource_type": "pipeline", "search_term": "deploy", "size": 10 }

Dapatkan layanan tertentu:

{ "resource_type": "service", "resource_id": "my-service-id" }

Jalankan pipeline:

{
  "resource_type": "pipeline",
  "action": "run",
  "resource_id": "my-pipeline",
  "inputs": { "tag": "v1.2.3" },
  "wait": true
}

Alihkan flag fitur:

{
  "resource_type": "feature_flag",
  "action": "toggle",
  "resource_id": "new_checkout_flow",
  "enable": true,
  "environment": "production"
}

Cari di semua tipe resource:

{ "query": "payment-service" }

Diagnosa eksekusi berdasarkan ID (mode ringkasan — default):

{ "execution_id": "abc123XYZ" }

Diagnosa dari URL Harness:

{ "url": "https://app.harness.io/ng/account/.../pipelines/myPipeline/executions/abc123XYZ/pipeline" }

Diagnosa konektivitas konektor:

{ "resource_type": "connector", "resource_id": "my_github_connector" }

Diagnosa kesehatan delegasi:

{ "resource_type": "delegate", "resource_id": "delegate-us-east-1" }

Diagnosa aplikasi GitOps (dengan opsi):

{
  "resource_type": "gitops_application",
  "resource_id": "checkout-app",
  "options": { "agent_id": "gitops-agent-1" }
}

Dapatkan laporan eksekusi terbaru untuk pipeline:

{ "pipeline_id": "my-pipeline" }

Mode diagnostik penuh dengan YAML dan log langkah yang gagal:

{ "execution_id": "abc123XYZ", "summary": false }

Mode ringkasan dengan log diaktifkan (terbaik dari keduanya):

{ "execution_id": "abc123XYZ", "include_logs": true }

Dapatkan status kesehatan proyek:

{ "org_id": "default", "project_id": "my-project", "limit": 5 }

Daftarkan skema database yang difilter berdasarkan jenis migrasi:

{ "resource_type": "database_schema", "migration_type": "Liquibase" }

Daftarkan instance database untuk skema:

{ "resource_type": "database_instance", "dbschema_id": "my_schema" }

Dapatkan pipeline penulisan LLM yang diselesaikan untuk skema dan instance:

{ "resource_type": "database_llm_authoring_pipeline", "resource_id": "my_schema", "dbinstance_id": "prod_db" }

Daftarkan nama objek snapshot (mis. tabel) untuk instance skema:

{
  "resource_type": "database_snapshot_object",
  "dbschema_id": "my_schema",
  "dbinstance_id": "prod_db",
  "object_type": "Table"
}

Dapatkan metadata snapshot lengkap untuk objek bernama tertentu:

{
  "resource_type": "database_snapshot_object",
  "resource_id": "prod_db",
  "params": {
    "dbschema_id": "my_schema",
    "object_type": "Table",
    "object_names": ["users", "orders"]
  }
}

Alur Kerja Eksekusi Pipeline (Disarankan)

Untuk pipeline v0, gunakan urutan ini untuk mengurangi kesalahan input saat eksekusi:

  1. Temukan input runtime yang diperlukan
  • harness_get(resource_type="runtime_input_template", resource_id="<pipeline_id>")
  • Template yang dikembalikan menunjukkan placeholder <+input> yang memerlukan nilai.
  1. Pilih strategi input
  • Variabel sederhana: berikan inputs pasangan kunci-nilai datar (misalnya {"branch":"main","env":"prod"}).

  • Input kompleks/struktural: gunakan input_set_ids (blok codebase/build CI dan input template bersarang paling baik ditangani dengan cara ini).

  • Kunci singkatan codebase CI (hanya eksekusi pipeline):

    Kunci singkatanStruktur yang diperluas
    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>
  • Batasan: ekspansi singkatan dilewati ketika inputs.build sudah ada (build eksplisit menang).

  1. Jalankan eksekusi
  • harness_execute(resource_type="pipeline", action="run", resource_id="<pipeline_id>", ...)

  • Untuk pipeline berbasis Git yang YAML-nya harus dimuat dari cabang non-default, berikan params.pipeline_branch (dikirim ke Harness sebagai branch). Pemilih definisi eksplisit ini lebih diutamakan daripada alias params.branch. inputs.branch secara independen memilih cabang codebase CI:

    {
      "resource_type": "pipeline",
      "action": "run",
      "resource_id": "deploy_app",
      "params": { "pipeline_branch": "feature/new-stage" },
      "inputs": { "branch": "main" },
      "wait": true
    }
    
  1. Opsional: gabungkan keduanya
  • Gunakan input_set_ids untuk bentuk dasar dan inputs untuk override sederhana.

Untuk pipeline v1:

  1. Ambil harness_get(resource_type="runtime_input_template_v1", resource_id="<pipeline_id>"). Untuk pipeline berbasis Git, berikan branch_name, connector_ref, dan repo_name melalui params.
  2. Gunakan setiap inputs[].details.name yang dikembalikan sebagai kunci tingkat atas di harness_execute.inputs.
  3. Jalankan harness_execute(resource_type="pipeline_v1", action="run", resource_id="<pipeline_id>", inputs={...}). Server membungkus nilai-nilai ini di bawah akar YAML inputs: dan mengirim badan inputs_yaml API. Jika kolom yang diperlukan belum terisi, alat akan mengembalikan kesalahan pra-penerbangan dengan kunci yang diharapkan dan set input yang disarankan. Anda dapat memeriksa pemetaan singkatan yang tersedia dengan harness_describe(resource_type="pipeline") (executeActions.run.inputShorthands).

Eksekusi Pipeline Dinamis

Gunakan pipeline_dynamic_execution.run ketika agen atau sistem eksternal menghasilkan YAML pipeline v0 lengkap saat runtime dan perlu menjalankannya terhadap shell pipeline Harness yang sudah ada. Ini bukan pengganti untuk pipeline.run normal: pipeline v0 yang disimpan harus sudah ada, Allow Dynamic Execution di tingkat akun dan pipeline harus diaktifkan, dan pemanggil memerlukan izin Edit serta Execute pada pipeline tersebut.

{
  "resource_type": "pipeline_dynamic_execution",
  "action": "run",
  "resource_id": "deploy_app",
  "body": {
    "yaml": "pipeline:\n  identifier: deploy_app\n  name: Deploy App\n  stages: []"
  },
  "params": {
    "module_type": "CD",
    "notes": "agent-generated dynamic run",
    "notify_only_user": true
  }
}

Batasan:

  • body harus berupa objek dengan kolom yaml. Badan string mentah ditolak oleh skema harness_execute publik.
  • body.yaml dapat berupa string YAML atau objek pipeline JSON; JSON diserialisasi ke YAML sebelum permintaan.
  • Placeholder <+input> runtime tidak diselesaikan oleh API ini. Kirimkan YAML yang telah diselesaikan sepenuhnya.
  • Set input, eksekusi tahap selektif, percobaan ulang, dan pemicu tidak didukung oleh endpoint eksekusi dinamis.
  • Tindakan ini adalah high_write dan menggunakan jalur konfirmasi/persetujuan otomatis normal. Respons memproyeksikan amplop API ke { "execution_id": "...", "status": "..." } dan menyertakan tautan eksekusi openInHarness saat data lingkup tersedia.

Jika Harness menolak eksekusi karena tidak diaktifkan, periksa pengaturan Allow Dynamic Execution di tingkat akun dan toggle tingkat pipeline di bawah Pipeline -> Advanced Options -> Dynamic Execution Settings.

Forensik Input Eksekusi

Gunakan execution_inputs setelah eksekusi untuk memeriksa YAML input gabungan yang menghasilkan eksekusi tertentu. Ini berguna ketika kegagalan bergantung pada penggabungan set input, cabang set input yang didukung Git, atau nilai pemicu/runtime yang sulit direkonstruksi dari halaman eksekusi saja.

{
  "resource_type": "execution_inputs",
  "resource_id": "PLAN_EXECUTION_ID",
  "params": {
    "resolve_expressions": true,
    "resolve_expressions_type": "RESOLVE_ALL_EXPRESSIONS"
  }
}

Respons get diproyeksikan ke:

  • executionId - ID eksekusi rencana dari resource_id.
  • inputSetYaml - YAML input runtime gabungan yang digunakan untuk eksekusi, atau null.
  • inputSetTemplateYaml - template input pada saat eksekusi, atau null.
  • resolvedYaml - YAML yang telah diselesaikan ekspresi saat resolve_expressions=true, jika tidak biasanya null.
  • inputSetDetails - set input tersimpan yang berkontribusi sebagai pasangan { identifier, name }.
  • inputSetBranchName - cabang sumber untuk set input yang didukung Git, atau null.

execution_inputs hanya-get dan berisiko-baca. Jika resolve_expressions dihilangkan, server menghilangkan parameter kueri API dan Harness menggunakan mode resolusi UNKNOWN defaultnya.

Mode Tunggu Eksekusi Pipeline

Untuk pipeline.run, pipeline.retry, dan pipeline_v1.run, berikan wait: true untuk membiarkan server melakukan polling hingga eksekusi mencapai status terminal. Ini menjaga peluncuran pipeline dan pemeriksaan status dalam satu panggilan alat alih-alih meminta klien atau LLM menjalankan loop polling.

{
  "resource_type": "pipeline",
  "action": "run",
  "resource_id": "deploy_app",
  "inputs": { "branch": "main" },
  "wait": true,
  "wait_timeout_seconds": 900,
  "wait_poll_interval_seconds": 5
}

Perilaku mode tunggu:

  • Batas waktu default adalah 600 detik; rentang yang diizinkan adalah 10 detik hingga 7200 detik.
  • Interval polling awal default 3 detik, mundur 1,5x, dan maksimal 30 detik.
  • Pada keberhasilan atau kegagalan, respons menyertakan kolom seperti execution_id, execution_status, execution_terminal, execution_elapsed_ms, dan execution_poll_count.
  • Jika batas waktu habis, pemicu asli masih berhasil; respons menyertakan execution_timed_out: true dan _wait.hint dengan status terakhir yang diamati.
  • Jika polling gagal setelah pemicu berhasil, respons menyertakan _wait.error dan petunjuk pemeriksaan ulang. Jangan menjalankan ulang pipeline secara membabi buta kecuali Anda telah mengonfirmasi bahwa eksekusi pertama tidak berjalan.
  • Status terminal yang gagal mencakup _diagnose_hint yang menunjuk ke harness_diagnose(resource_type="execution", options={execution_id: "..."}).

Minta AI DevOps Agent untuk membuat pipeline:

{
  "prompt": "Create a pipeline that builds a Go app with Docker and deploys to Kubernetes",
  "action": "CREATE_PIPELINE"
}

Perbarui layanan melalui bahasa alami:

{
  "prompt": "Add a sidecar container for logging",
  "action": "UPDATE_SERVICE",
  "conversation_id": "prev-conversation-id",
  "context": [{ "type": "yaml", "payload": "<existing service YAML>" }]
}

Mode Penyimpanan Pipeline

Pipeline Harness dapat disimpan dengan tiga cara:

ModeDeskripsiKapan digunakan
InlineYAML pipeline disimpan di HarnessDefault. Pengaturan paling sederhana, tidak memerlukan Git.
Remote (Git Eksternal)YAML pipeline disimpan di GitHub, GitLab, Bitbucket, dll.Tim yang menggunakan pipeline-as-code berbasis Git dengan penyedia eksternal.
Remote (Harness Code)YAML pipeline disimpan di repositori Harness CodeTim yang menggunakan hosting Git bawaan Harness.

Buat pipeline inline (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"
  }
}

Buat pipeline remote (Git Eksternal — mis. 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"
  }
}

Buat pipeline remote (Harness Code — tidak perlu konektor):

// 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"
  }
}

Perbarui pipeline remote:

// 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"
  }
}

Impor pipeline dari repo Git eksternal:

// 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"
  }
}

Impor pipeline dari repo Harness Code:

// 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"
  }
}

Buat konektor:

{
  "resource_type": "connector",
  "body": { "connector": { "name": "My Docker Hub", "identifier": "my_docker", "type": "DockerRegistry" } }
}

Hapus pemicu:

{
  "resource_type": "trigger",
  "resource_id": "nightly-trigger",
  "pipeline_id": "my-pipeline"
}

Daftar set input untuk pipeline:

{
  "resource_type": "input_set",
  "pipeline_id": "my-pipeline"
}

Dapatkan set input tertentu:

{
  "resource_type": "input_set",
  "resource_id": "prod-inputs",
  "pipeline_id": "my-pipeline"
}

Buat set input:

{
  "resource_type": "input_set",
  "pipeline_id": "my-pipeline",
  "body": "inputSet:\n  name: Production Inputs\n  identifier: prod_inputs\n  pipeline:\n    identifier: my-pipeline\n    variables:\n      - name: env\n        type: String\n        value: production"
}

Perbarui set input:

{
  "resource_type": "input_set",
  "resource_id": "prod_inputs",
  "pipeline_id": "my-pipeline",
  "body": "inputSet:\n  name: Production Inputs\n  identifier: prod_inputs\n  pipeline:\n    identifier: my-pipeline\n    variables:\n      - name: env\n        type: String\n        value: production\n      - name: replicas\n        type: String\n        value: \"3\""
}

Hapus set input:

{
  "resource_type": "input_set",
  "resource_id": "prod_inputs",
  "pipeline_id": "my-pipeline"
}

Jenis Sumber Daya

255 jenis sumber daya yang diorganisir dalam 41 perangkat alat. Setiap jenis sumber daya mendukung subset operasi CRUD dan tindakan eksekusi opsional.

Platform

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
organizationxxxxx
projectxxxxx

Pipeline

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
pipelinexxxxxrun, retry
pipeline_v1 (Alpha)xxxxxrun
pipeline_dynamic_executionrun
executionxxinterrupt
execution_inputsx
triggerxxxxx
pipeline_summaryx
input_setxxxxx
runtime_input_templatex
runtime_input_template_v1x
pipeline_resolved_yamlx
approval_instancexapprove, reject

Kedua jenis sumber daya YAML pipeline tersedia saat perangkat alat pipeline diaktifkan. HARNESS_PIPELINE_VERSION dan header inisialisasi HTTP x-harness-pipeline-version memilih preferensi versi default; keduanya tidak menyembunyikan versi lainnya.

Agen AI

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
agentxxxxx
agent_runx

Layanan

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
servicexxxxx

Lingkungan

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
environmentxxxxxmove_configs

Konektor

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
connectorxxxxxtest_connection
connector_cataloguex

Infrastruktur

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
infrastructurexxxxxmove_configs

Rahasia

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
secretxx

Log Eksekusi

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
execution_logx

Jejak Audit

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
audit_eventxx

Delegasi

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
delegatexx
delegate_tokenxxxxrevoke, get_delegates

Repositori Kode

Jenis Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
repositoryxxxx
branchxxxx
commitxxxdiff, diff_stats
file_contentxxblame
tagxxx
repo_rulexx
space_rulexx

Pembuatan commit melakukan satu atau lebih tindakan file secara langsung melalui API Harness Code tanpa kloning. Berikan body.title, body.branch, dan body.actions; setiap tindakan adalah CREATE, UPDATE, DELETE, atau MOVE, dan UPDATE memerlukan SHA blob saat ini.

Daftar file_content mengembalikan setiap jalur pada ref; dapatkan mengembalikan konten file atau direktori (hilangkan atau berikan path kosong untuk root repo; jalur bersarang mempertahankan garis miring). Hilangkan git_ref untuk menggunakan cabang default repositori — jangan menebak main.

Registri Artefak

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
registryxx
artifactx
artifact_versionx
artifact_filex

Penyimpanan Berkas

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
file_storexxxxxlist_children

file_store mengelola berkas dan folder Penyimpanan Berkas Harness melalui alat generik. Ini mendukung lingkup akun, organisasi, dan proyek; berikan resource_scope="account"|"org"|"project" atau tempel URL Penyimpanan Berkas Harness agar server dapat menurunkan lingkup dan ID.

Panggilan umum:

# List the account-level File Store.
harness_list(resource_type="file_store", resource_scope="account")

# Create a folder at the current scope root.
harness_create(resource_type="file_store", body={
  name: "scripts",
  type: "FOLDER",
  parent_identifier: "Root"
})

# Upload a UTF-8 script file. Use content_base64 instead for binary data.
harness_create(resource_type="file_store", body={
  name: "deploy.sh",
  type: "FILE",
  parent_identifier: "Root",
  content: "#!/usr/bin/env bash\n./deploy",
  mime_type: "text/x-shellscript",
  file_usage: "SCRIPT"
})

# Rename metadata without replacing file content.
harness_update(resource_type="file_store", resource_id="deploy_script", body={
  name: "deploy-prod.sh",
  type: "FILE",
  parent_identifier: "Root"
})

# List first-level children of a folder. This is a read-risk execute action.
harness_execute(resource_type="file_store", action="list_children",
  resource_id="scripts_folder", params={folder_name: "scripts"})

Batasan isi multipart:

  • Buat/perbarui menerima JSON body, lalu mengonversinya menjadi multipart/form-data untuk /ng/api/file-store.
  • name, type (FILE atau FOLDER), dan parent_identifier wajib diisi; gunakan literal "Root" hanya untuk akar lingkup yang dipilih.
  • FILE buat memerlukan tepat satu dari content (string UTF-8) atau content_base64 (base64 valid tidak kosong). FILE perbarui dapat mengabaikan konten untuk pembaruan hanya metadata, atau menyediakan tepat satu kolom konten untuk mengganti konten.
  • FOLDER buat/perbarui harus mengabaikan content dan content_base64.
  • Opsional file_usage harus berupa MANIFEST_FILE, CONFIG, atau SCRIPT; metadata skalar opsional seperti description, mime_type, path, dan tags harus berupa string.
  • Konten unggahan dibatasi hingga 100 MB. Prompt konfirmasi menyunting pratinjau content, content_base64, dan contentBase64 sebelum elisitasi.

list_children menerima baik bentuk singkat (resource_id plus params.folder_name, atau params.file_store_id/params.folder_identifier plus params.folder_name) atau FileStoreNode body lengkap dengan identifier, name, dan type: "FOLDER". Isi lengkap menggunakan camelCase Harness parentIdentifier; bentuk singkat dapat menggunakan params.parent_identifier.

Templat

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
templatexxxxx

Operasi templat menggunakan jalur layanan Templat Harness (/template/api/templates...). Buat dan perbarui memerlukan string YAML templat lengkap di body.template_yaml atau body.yaml; version_label menargetkan versi tertentu untuk perbarui/hapus, sementara menghapus tanpa version_label menghapus semua versi.

Dasbor

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
dashboardxx
dashboard_datax

DevOps Basis Data

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
database_schemaxxxxx
database_instancexxxxx
database_snapshot_objectxx
database_llm_authoring_pipelinex

Manajemen Infrastruktur sebagai Kode (IaCM)

Sumber daya IaCM diaktifkan secara default dan sebagian besar berlingkup proyek. Mulai dengan iacm_workspace untuk menemukan pengidentifikasi workspace, lalu gunakan workspace_id tersebut untuk sumber daya workspace, biaya, dan perbedaan aktivitas. Gunakan iacm_variable_set untuk set variabel yang dapat digunakan kembali di lingkup akun, organisasi, atau proyek. Registry penyedia berlingkup akun.

iacm_module mencakup lingkup akun, organisasi, dan proyek. Ini default ke registry akun; setiap operasi (daftar, ambil, buat, perbarui) mengirim parameter kueri scope_org / scope_project yang sama, sehingga modul yang Anda buat dapat ditemukan di lingkup tempat Anda membuatnya. Pilih lingkup dengan resource_scope="account" | "org" | "project" plus org_id/project_id. Penentuan lingkup bersifat opt-in: saat resource_scope diabaikan, org_id/project_id hanya berlaku jika Anda memberikannya secara eksplisit — default HARNESS_ORG/HARNESS_PROJECT yang dikonfigurasi tidak diterapkan, sehingga konfigurasi proyek sekitar tidak dapat mendaftarkan modul akun secara diam-diam di bawah proyek. Kolom org/project pada isi modul sendiri menemukan konektor Git-nya dan tidak terkait dengan lingkup visibilitas ini.

iacm_workspace buat/perbarui mengembalikan { policy_evaluation } saja — lanjutkan dengan harness_get untuk mengambil workspace. iacm_variable_set dan iacm_module buat/perbarui mengembalikan sumber daya itu sendiri. iacm_provider buat mengembalikan { id } saja — lanjutkan dengan harness_get; perbarui hanya berorientasi versi (POST/PUT /providers/{id}/version) — tidak ada PUT metadata. Penulisan versi dapat mengembalikan isi kosong; HarnessClient menormalkannya menjadi { status: "SUCCESS", message: "No content" }.

Perbarui set variabel adalah HTTP PUT dengan koleksi penggantian penuh — selalu harness_get terlebih dahulu, lalu PUT isi lengkap yang diinginkan (terraform_variables / environment_variables wajib pada perbarui; abaikan/kosongkan menghapus konektor dan berkas variabel). Perbarui modul juga PUT — lebih baik ambil-lalu-PUT untuk kolom opsional. Penulisan bersifat medium_write dan memerlukan konfirmasi (elisitasi atau confirm: true).

RBAC set variabel dan registry penyedia (iac_variableset_*, iac_providerregistry_*) saat ini Eksperimental di Harness — pemeriksaan akses selalu mengizinkan hingga iac-server mengaktifkan penegakan. RBAC registry modul (iac_registry_view / iac_registry_edit) Aktif dan dapat ditegakkan. MCP selalu meneruskan PAT/SAT pemanggil tanpa perubahan.

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
iacm_workspacexxxx
iacm_variable_setxxxx
iacm_resourcex
iacm_modulexxxx
iacm_providerxxxx
iacm_workspace_costsx
iacm_activity_resource_changex

Alur kerja umum:

  1. harness_list(resource_type="iacm_workspace", org_id="...", project_id="...") untuk menemukan workspace.
  2. harness_create / harness_update pada iacm_workspace untuk membuat dari awal atau dari templat (associated_template), atau perbarui workspace yang ada — respons hanya { policy_evaluation }.
  3. harness_get(resource_type="iacm_workspace", workspace_id="...") untuk mengambil workspace yang dibuat/diperbarui.
  4. harness_list / harness_create / harness_update pada iacm_variable_set (opsional dengan resource_scope) untuk set variabel Terraform/env yang dapat digunakan kembali — respons adalah sumber daya VariableSet.
  5. harness_list / harness_create / harness_update pada iacm_module untuk registry modul (name + system wajib; tambahkan resource_scope dengan org_id/project_id untuk modul berlingkup organisasi atau proyek) — respons adalah sumber daya modul.
  6. harness_list / harness_create / harness_update pada iacm_provider untuk registry penyedia akun (body.type wajib untuk buat; buat mengembalikan { id } saja — lalu harness_get; perbarui membuat/memperbarui versi saja) — perbarui versi dapat mengembalikan sukses kosong.
  7. harness_list(resource_type="iacm_resource", org_id="...", project_id="...", workspace_id="...") untuk memeriksa sumber daya Terraform, keluaran, dan sumber data.
  8. harness_list(resource_type="iacm_workspace_costs", org_id="...", project_id="...", workspace_id="...") untuk meninjau entri biaya per eksekusi.
  9. harness_list(resource_type="iacm_activity_resource_change", org_id="...", project_id="...", activity_id="...", workspace_id="...") untuk memeriksa perbedaan sumber daya sebelum/sesudah untuk aktivitas rencana, terapkan, atau hancurkan.

Respons daftar IaCM mengekspos page_count sebagai jumlah untuk halaman saat ini saja (kecuali iacm_variable_set, yang tidak dipaginasi). Saat has_more benar, terus minta halaman berikutnya berbasis 1 dan jumlahkan jumlah halaman jika Anda memerlukan total.

Portal Pengembang Internal (IDP)

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
idp_entityxx
scorecardxx
scorecard_checkxx
scorecard_statsx
scorecard_check_statsx
idp_scorexx
idp_workflowxexecute
idp_tech_docx

Permintaan Tarik

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
pull_requestxxxxclose, merge
pr_reviewerxxsubmit_review
pr_commentxxx
pr_checkx
pr_activityx

Gunakan harness_execute(resource_type="pull_request", action="close", ...) untuk operasi penutupan eksplisit. harness_update juga menerima body.state (open atau closed) dan merutekan perubahan status ke titik akhir status PR Kode Harness khusus; kirim edit judul/deskripsi dalam panggilan perbarui terpisah.

Gunakan harness_list(resource_type="pr_activity", filters={type: ["comment", "code-comment"]}, ...) untuk membaca komentar PR. Gunakan pr_comment untuk operasi penulisan komentar.

Manajemen Rilis

Sumber daya Manajemen Rilis (RMG) diaktifkan secara default. Sumber daya definisi (release_process, release_activity) mendukung daftar/ambil/buat/perbarui/hapus dengan body.yaml; panggil harness_schema(resource_type="release_process"|"release_activity") sebelum buat/perbarui. Sumber daya eksekusi memantau rilis yang berjalan — sebagian besar operasi daftar memerlukan release_id (UUID dari harness_list resource_type=release, atau slug URL UI seperti identifier-1.0.0-abc). Tempel URL rilis RMG ke harness_list untuk mengisi otomatis release_id.

Panggilan RMG menggunakan ${HARNESS_BASE_URL}/gateway/rmg dengan penentuan lingkup akun melalui header Harness-Account. Lingkup organisasi/proyek menggunakan penentuan lingkup berbasis header saat org_id/project_id disediakan. release_execution_phase hanya daftar — gunakan kolom identifier setiap item fase sebagai params.phase_identifier saat memanggil harness_get pada sumber daya masukan/keluaran fase (jangan panggil harness_get pada release_execution_phase itu sendiri). Pemfilteran status daftar rilis diterapkan sisi-klien hanya pada halaman saat ini; lanjutkan paginasi dengan filter yang sama saat hasil dapat mencakup beberapa halaman.

Tipe Sumber DayaDaftarAmbilBuatPerbaruiHapusJalankan Aksi
release_processxxxxx
release_activityxxxxx
releasexx
release_execution_phasex
release_execution_taskx
release_execution_activityx
release_inputx
release_execution_phase_inputx
release_execution_phase_outputx
release_execution_activity_inputx
release_execution_activity_outputx

Alur kerja umum:

  1. harness_list(resource_type="release_process", org_id="...", project_id="...") untuk menemukan definisi proses orkestrasi.
  2. harness_schema(resource_type="release_process") (atau release_activity) sebelum membuat/memperbarui; lalu harness_create / harness_update dengan body.yaml.
  3. harness_list(resource_type="release", org_id="...", project_id="...") untuk menemukan rilis aktif atau terbaru (default pencarian mundur 30 hari; opsional filters.status, filters.search_term, filters.days_back).
  4. harness_get(resource_type="release", release_id="...") untuk detail rilis.
  5. harness_list(resource_type="release_execution_phase", filters={ release_id: "..." }) untuk status fase; release_id yang sama untuk release_execution_task dan release_execution_activity.
  6. harness_get pada release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_output, atau release_execution_activity_input menggunakan release_id plus params.phase_identifier / params.activity_identifier / activity_execution_id sesuai dokumentasi pada setiap sumber daya.

Vibe

Toolset vibe yang diaktifkan secara default mencakup kontrak Vibe Orchestrator BFF di bawah ${HARNESS_BASE_URL}/vibe/v1. Toolset ini menggunakan koneksi Harness yang ada dan header akun, tanpa menambahkan parameter kueri akun/org/proyek atau kolom lingkup ke badan permintaan. Tim telah memvalidasi alur Vibe menggunakan autentikasi kunci API Harness (PAT/SAT), sehingga tidak diperlukan pengaturan opt-in untuk sesi default. OpenAPI yang dikurasi mendokumentasikan autentikasi bearer/sesi; mode OAuth server meneruskan token bearer sesi saat ini. Regresi otomatis memverifikasi kedua jalur header; autentikasi gateway tetap tunduk pada konfigurasi lingkungan target.

Tipe Sumber DayaDaftarAmbilBuatPerbaruiHapusJalankan Aksi
vibe_projectxprepare, deploy
vibe_app_lifecyclexevents

API mendukung dua jalur penerimaan. Pertahankan bentuk permintaan asli API ini:

Sumber yang tersedia untuk agen pengkodeanAlur API
Tautan/konektor repositori GitHubharness_create dengan resource_type="vibe_project" dan body.mode plus kolom khusus mode. Kontrak menamai github_link dan github_connector tetapi tidak mendefinisikan bentuk kolom URL, cabang, atau konektornya; kolom ini diteruskan ke backend tanpa menciptakan pemetaan baru.
File ZIPPanggil prepare dengan nama aplikasi dan metadata file, unggah byte ke target bertanda tangan yang dikembalikan, lalu panggil deploy.
Direktori sumber lokalAgen pengkodean mengarsipkan sumber ruang kerja yang dimaksud ke dalam ZIP secara lokal, lalu mengikuti alur ZIP. Jalur lokal atau konteks percakapan bukanlah unggahan sumber yang didukung API.

Saat mengemas direktori, sertakan sumber, manifes, file kunci, konfigurasi, dan edit yang belum dikomit yang dimaksud yang diperlukan untuk membangunnya. Kecualikan kredensial, .git, dependensi terinstal, dan artefak yang dihasilkan. Pengemasan dan unggahan bertanda tangan terjadi di tempat file dapat diakses; server MCP yang dihosting tidak dapat membaca direktori lokal agen pengkodean.

Untuk ZIP yang sudah ada, siapkan unggahan:

{
  "resource_type": "vibe_project",
  "action": "prepare",
  "body": {
    "name": "demo-app",
    "file": {
      "path": "app.zip",
      "size_bytes": 12345,
      "content_type": "application/zip"
    }
  }
}

Teruskan ini ke harness_execute. Ukuran harus menggambarkan ZIP aktual; size_bytes, content_type, dan md5 bersifat opsional dan dapat bernilai null. Kolom persiapan tambahan dipertahankan untuk validasi backend, sebagaimana diizinkan oleh OpenAPI. Persiapan mengembalikan projectId, sourceId, dan upload, termasuk uploadUrl, method, headers, dan expiresAt setiap file. Unggah byte file secara langsung menggunakan URL bertanda tangan, metode, dan header tersebut; pertahankan URL persis seperti apa adanya dan jangan tambahkan kredensial Harness ke permintaan penyimpanan. Aksi persiapan tidak membaca atau mengunggah file lokal.

Setelah unggahan berhasil, lakukan deploy secara eksplisit:

{
  "resource_type": "vibe_project",
  "action": "deploy",
  "resource_id": "<projectId returned by prepare>"
}

Untuk impor JSON, gunakan id yang dikembalikan sebagai gantinya. Deployment juga menerima body: {"project_id": "<Vibe app id>"} atau params.app_id; kolom kawat API adalah snake_case project_id meskipun persiapan mengembalikan camelCase projectId. project_id tingkat atas dari tool generik adalah pengidentifikasi lingkup Harness dan tidak pernah digunakan sebagai id aplikasi Vibe. Impor dan persiapan membuat aplikasi/sumber; keduanya tidak memulai deployment. Penulisan tidak dicoba ulang secara otomatis, dan deployment menggunakan kebijakan konfirmasi risiko tinggi yang ada.

Baca progres dengan harness_get(resource_type="vibe_app_lifecycle", resource_id="<Vibe app id>"). Ini menyimpan URL aplikasi, tahap eksekusi, sub-langkah, kegagalan, baris log, dan detail penganalisis build. Aksi eksekusi events menerima resource_id atau params.app_id dan mengonsumsi endpoint SSE sebagai batch terbatas: hingga 20 peristiwa JSON atau lima detik setelah koneksi, dengan batas respons 1 MiB. Batasan ini milik endpoint Vibe. HARNESS_API_TIMEOUT_MS koneksi juga membatasi konsumsi koneksi dan aliran secara bersamaan; kedaluwarsa mengembalikan kesalahan waktu habis. Batch yang selesai mengembalikan events dan stop_reason (end, event_limit, atau duration_limit) dan menutup aliran. Kegagalan koneksi awal maupun aliran yang rusak tidak dicoba ulang. Peristiwa adalah diff sementara tanpa kursor pemutaran ulang yang didokumentasikan; gunakan get siklus hidup untuk snapshot otoritatif. Kedua pembacaan siklus hidup tersedia dalam mode hanya-baca.

Bendera Fitur

Tipe Sumber DayaDaftarAmbilBuatPerbaruiHapusJalankan Aksi
fme_workspacex
fme_environmentxxxxx
fme_feature_flagxxxxxkill, restore, reallocate, archive, unarchive
fme_feature_flag_definitionxxxxxkill, restore, reallocate
fme_rollout_statusx
fme_rule_based_segmentxxxx
fme_rule_based_segment_definitionxxenable, disable, change_request
fme_traffic_typex
fme_identityxx
fme_standard_segmentxx
fme_segment_keysxx
fme_segmentxxxxx
fme_segment_definitionxxxxxlist_keys, add_keys, remove_keys
fme_metricxxxxx
fme_event_typexx

Sumber daya FME (Split.io) — Sumber daya fme_* mendukung pembatasan lingkup mode ganda: panggilan lama meneruskan workspace_id dan mengenai API Split.io (api.split.io); panggilan yang lebih baru meneruskan org_id+project_id bersama-sama dan mengenai endpoint asli Harness (standar HARNESS_API_KEY/HARNESS_BASE_URL, autentikasi yang sama dengan setiap sumber daya harness_* lainnya) sebagai gantinya. Meneruskan workspace_id dan org_id/project_id pada panggilan yang sama, atau mencampur org_id dengan project_id saja, adalah kesalahan — pilih satu mode per panggilan. Setiap operasi di bawah tersedia dalam mode lama, tidak berubah, kecuali sumber daya ditandai khusus asli Harness. Cakupan mode asli Harness saat ini lebih sempit:

  • fme_workspace — tidak ada padanan asli Harness; hanya mode lama (digunakan untuk menemukan nilai workspace_id).

  • fme_environment — mode ganda list (workspace_id atau org_id+project_id). get/create/update/delete hanya asli Harness (/fme/api/v4/environments) — MCP tidak pernah memiliki kontrak workspace_id untuk operasi tersebut. Daftar asli menggunakan offset/limit opsional (maks 100; harness_list size dipetakan ke limit); amplop {data, limit, offset, totalCount} dinaikkan ke items/total. Buat/perbarui asli menggunakan isProduction (production diterima sebagai alias). Pembaruan asli adalah JSON Merge Patch; name dan isProduction tidak dapat dihapus. Nama maksimal 15 karakter.

  • fme_feature_flag — mode ganda, kedua cabang terhubung penuh. Asli Harness (org_id+project_id): list/get/create/delete mengenai /fme/api/v4/feature-flags (body untuk create: name, trafficType, opsional description/tags/owners, per CreateFeatureFlagRequest); update mengirim merge-patch ke /fme/api/v4/feature-flags/{name}; archive/unarchive mengenai /fme/api/v4/feature-flags/{name}/archive|unarchive (hanya comment opsional — tanpa title, per ArchiveUnarchiveRequest); kill/restore/reallocate mengenai /fme/api/v4/feature-flag-definitions/{name}/kill|restore|reallocate dengan environment_id sebagai parameter kueri (opsional comment/title, per FeatureFlagDefinitionActionRequest).

  • fme_feature_flag_definition — get/create/update tetap mode ganda (workspace_id atau org_id+project_id). list/delete/kill/restore/reallocate hanya asli Harness (org_id+project_id) — MCP tidak pernah memiliki kontrak workspace_id untuk operasi tersebut. Daftar asli memerlukan feature_flag_name dan menggunakan offset/limit (default 100, maks 100); tidak menerima environment_id. Hapus dan eksekusi memerlukan environment_id. Kill/restore/reallocate adalah tindakan yang sama seperti pada fme_feature_flag. Body get/create/update cocok dengan mode lama (treatments, defaultTreatment, defaultRule, opsional rules/baselineTreatment/trafficAllocation/comment), plus opsional title dalam mode asli Harness. Pembaruan asli adalah JSON Merge Patch.

  • fme_rollout_status — list mode ganda. Berikan org_id+project_id (disarankan) atau workspace_id yang tidak digunakan lagi. Pagination asli menggunakan offset/limit (maks 100; harness_list size dipetakan ke limit); hasil dinaikkan ke items/total. Setiap item memiliki id, name, dan opsional description.

  • fme_rule_based_segment — (Tidak digunakan lagi — lihat fme_segment.) Mode asli Harness ditolak pada setiap operasi (list/get/create/delete) — gunakan fme_segment sebagai gantinya; sumber daya ini hanya mendukung kontrak workspace_id mode lama.

  • fme_rule_based_segment_definition — (Tidak digunakan lagi — lihat fme_segment_definition.) Mode asli Harness ditolak pada setiap operasi/tindakan (list/update/enable/disable/change_request) — gunakan fme_segment_definition sebagai gantinya (tidak ada padanan enable/disable/change_request di sana); sumber daya ini hanya mendukung kontrak workspace_id/environment_id mode lama.

  • fme_traffic_type — list mode ganda. Berikan org_id+project_id (disarankan) atau workspace_id yang tidak digunakan lagi. Pagination asli menggunakan offset/limit (maks 100; harness_list size dipetakan ke limit); hasil dinaikkan ke items/total. Setiap item memiliki id dan name (tanpa displayAttributeId).

  • fme_identity — create/update belum diimplementasikan jika org_id+project_id diberikan bersamaan; jika tidak, berjalan sebagai panggilan mode lama normal.

  • fme_standard_segment — tidak digunakan lagi. workspace_id mode lama masih mengenai Split v2. Asli Harness ditolak — gunakan fme_segment.

  • fme_segment_keys — list/update tetap mode lama (workspace_id / environment_id+segment_name). Asli Harness (org_id+project_id) ditolak — gunakan fme_segment_definition eksekusi list_keys/add_keys/remove_keys.

  • fme_segment — Hanya asli (org_id+project_id). CRUD. list/get/update/delete memerlukan segment_type: STANDARD | LARGE | RULE_BASED. Body buat: name, trafficType, segmentType; opsional description, tags, owners.

  • fme_segment_definition — Hanya asli. CRUD plus eksekusi list_keys/add_keys/remove_keys. Pembaruan hanya deskripsi. Hapus gagal dengan hasDependents selama kunci masih ada.

  • fme_metric — Hanya asli Harness (tanpa dukungan workspace_id mode lama). list/get/create/update/delete terhubung ke /fme/api/v4/metrics (list's harness_list size dipetakan ke limit). create memerlukan spread meskipun backend CreateMetricRequest tetap opsional (default PER) — kontrak yang lebih ketat hanya di sisi MCP, karena menghilangkannya secara diam-diam mengubah semantik metrik RATE. update adalah JSON Merge Patch; name/trafficType tidak dapat diubah dan tidak diterima. delete adalah penghapusan permanen (tanpa arsip/pulihkan) — diklasifikasikan destructive.

  • fme_event_type — Hanya asli Harness (tanpa dukungan workspace_id mode lama). Hanya baca: list/get terhubung ke /fme/api/v4/event-types; id adalah nama peristiwa. Hanya tipe peristiwa dengan peristiwa dalam 30 hari terakhir yang terlihat; get mengembalikan 404 untuk tipe peristiwa di luar cakupan tipe lalu lintas ruang kerja yang meminta, atau tidak aktif lebih dari 30 hari. Filter daftar: name (substring), traffic_type (berdasarkan ID atau nama), offset/limit (harness_list size dipetakan ke limit). Gunakan ini untuk menemukan ID tipe peristiwa nyata sebelum merujuknya di fme_metric's baseEventTypes/filterEventType atau filter event_type_ids, alih-alih menebak ID.

Dalam mode pengguna tunggal/self-hosted, autentikasi mode lama menggunakan token Bearer dari HARNESS_FME_API_KEY, dengan fallback ke HARNESS_API_KEY non-placeholder. HARNESS_FME_API_KEY dapat berupa kunci admin Split mode lama atau PAT/SAT Harness yang berhak FME, tetapi ditolak dalam mode multi-user sehingga deployment bersama tidak dapat menimpa kredensial pengguna setiap sesi. Kredensial OAuth/rute layanan yang dihosting untuk API platform Harness tidak mengautentikasi permintaan Split.io langsung. fme_feature_flag mendukung manajemen siklus hidup penuh dalam mode lama: buat (memerlukan traffic_type_id), daftar, dapatkan, perbarui metadata, hapus, dan tindakan eksekusi kill/restore/reallocate/archive/unarchive. Gunakan fme_traffic_type untuk menemukan ID tipe lalu lintas, fme_identity untuk membuat/memperbarui atribut identitas, dan fme_standard_segment / fme_segment_keys untuk memeriksa segmen standar dan menambahkan kunci anggota. fme_rule_based_segment menyediakan CRUD untuk menargetkan segmen, sementara fme_rule_based_segment_definition mengelola aturan segmen khusus lingkungan dengan alur persetujuan perubahan enable/disable dan permintaan.

GitOps

Tipe Sumber DayaDaftarDapatkanBuatPerbaruiHapusTindakan Eksekusi
gitops_agentxx
gitops_argo_projectx
gitops_app_project_mappingxxxximport
gitops_autocreate_logx
gitops_applicationxxsync
gitops_clusterxx
gitops_repositoryxx
gitops_applicationsetxx
gitops_repo_credentialxx
gitops_app_eventx
gitops_pod_logx
gitops_managed_resourcex
gitops_resource_actionx
gitops_dashboardx
gitops_app_resource_treex
gitops_cluster_linkxxx

Chaos Engineering

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
chaos_experimentxxxxrun, stop
chaos_experiment_runx
chaos_experiment_variablex
chaos_component_variablex
chaos_input_setxxxxx
chaos_experiment_templatexxxcreate_from_template, list_revisions, get_variables, get_yaml, compare_revisions
chaos_probexxxxenable, verify, get_manifest
chaos_probe_in_runx
chaos_probe_templatexxxget_variables
chaos_infrastructurex
chaos_k8s_infrastructurexxxcheck_health
chaos_enabled_infrastructurex
chaos_environmentx
chaos_hubxxxxx
chaos_hub_faultx
chaos_faultxxxget_variables, get_yaml
chaos_fault_templatexxxlist_revisions, get_variables, get_yaml, compare_revisions
chaos_fault_experiment_runx
chaos_actionxxxxget_manifest
chaos_action_templatexxxlist_revisions, get_variables, compare_revisions
chaos_loadtestxxxxxrun, stop
chaos_servicexxxxxlist_experiment_runs, list_load_tests
chaos_application_mapxx
discovered_agentx
discovered_namespacex
discovered_servicex
discovered_network_mapx
chaos_guard_conditionxxx
chaos_guard_rulexxxenable
chaos_recommendationxx
chaos_riskxx
chaos_dr_testxx
scanned_riskxxoccurrences, summary_by_service
chaos_risk_rulexx
chaos_risk_scanxxxxxretry, abort, report, report_download, heatmap

Manajemen Biaya Cloud (CCM)

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
cost_perspectivexxxxx
cost_breakdownx
cost_timeseriesx
cost_summaryxx
cost_recommendationxxupdate_state, override_savings, create_jira_ticket, create_snow_ticket
cost_anomalyx
cost_anomaly_summaryx
cost_categoryxx
cost_account_overviewx
cost_filter_valuex
cost_recommendation_statsx
cost_recommendation_detailx
cost_commitmentx
ai_budgetxxxxx
ai_budget_overviewx
ai_budget_consumptionx
ai_budget_override_requestxxxapprove, reject

Wawasan Rekayasa Perangkat Lunak (SEI)

Sumber daya SEI dikonsolidasikan untuk efisiensi token. Gunakan parameter metric atau aspect untuk detail DORA, tim/pohon organisasi, dan wawasan AI.

Tipe ResourceDaftarAmbilBuatPerbaruiHapusJalankan Aksi
sei_metricx
sei_productivity_metricx
sei_dora_metricxBerikan metric: deployment_frequency, change_failure_rate, mttr, lead_time, atau *_drilldown
sei_teamxx
sei_team_detailxBerikan aspect: integrations, developers, integration_filters
sei_org_treexx
sei_org_tree_detailxxBerikan aspect: efficiency_profile, productivity_profile, business_alignment_profile, integrations, teams
sei_business_alignmentxxBerikan aspect: feature_metrics, feature_summary, drilldown untuk ambil
sei_ai_usagexxBerikan aspect: metrics, breakdown, summary, top_languages
sei_ai_adoptionxxBerikan aspect: metrics, breakdown, summary
sei_ai_impactxBerikan aspect: pr_velocity, rework
sei_ai_raw_metricx

Jaminan Rantai Pasokan Perangkat Lunak (SCS)

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
scs_artifact_sourcex
artifact_securityxx
scs_artifact_componentx
scs_artifact_remediationx
scs_chain_of_custodyx
scs_compliance_resultx
code_repo_securityxx
scs_sbomx

Gudang Bukti

Gudang Bukti menyimpan attestasi in-toto (bukti SDLC). Daftar mendukung lingkup akun/org/proyek melalui resource_scope. Filter teks bebas tunggal (pipeline, artefak saja, gitoid) menggunakan search_term; batasan Nama tambahan menggunakan filters.subject_name; digest konten subjek menggunakan filters.subject_digest. Dapatkan mencari berdasarkan gitoid_sha256 dan memerlukan org_id/project_id (dari baris daftar). Unduh (tindakan harness_execute download) mengembalikan download_url terbatas waktu — selalu tampilkan tautan itu kepada pengguna. Memerlukan bendera fitur SCS_EVIDENCE_VAULT.

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
attestationxxdownload

Orkestrasi Pengujian Keamanan (STO)

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
security_issuex
security_issue_filterx
security_exemptionxxapprove, reject
remediation_diffx

Pembuatan security_exemption adalah operasi high_write. Server menurunkan requester_id dari PAT yang diautentikasi, menetapkan exemptFutureOccurrences=true, dan menetapkan default duration_days ke 30 saat tidak diberikan. Untuk mencantumkan pengecualian, berikan ukuran halaman eksplisit yang kecil (misalnya filters: { "status": "Pending", "size": 5 }) dan ikuti _nextPageHint yang dikembalikan dalam setiap respons.

Alur kerja eksekusi pengecualian keamanan:

  • Gunakan harness_list dengan resource_type="security_exemption" dan status eksplisit seperti Pending, Approved, Rejected, Expired, atau Canceled.
  • Gunakan harness_execute dengan action="approve" dan body.scope yang diperlukan: CURRENT, ACCOUNT, ORG, atau PROJECT. CURRENT menyetujui pada lingkup pengecualian yang ada; lingkup lainnya menggunakan endpoint promosi STO secara internal. Server mengisi otomatis body.approver_id dari pengguna yang diautentikasi saat dihilangkan; body.comment bersifat opsional.
  • Gunakan action="reject" untuk menolak pengecualian. body.approver_id juga diisi otomatis saat dihilangkan.
  • Tidak ada tindakan eksekusi promote terpisah. Gunakan action="approve" dengan body.scope non-CURRENT saat hasil yang diminta adalah persetujuan pada lingkup akun, organisasi, atau proyek.

Kontrol Akses

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
userxx
user_groupxxxxx
service_accountxxxx
rolexxxx
role_assignmentxx
resource_groupxxxx
permissionx

Tata Kelola

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
policyxxxxx
policy_setxxxxx
policy_evaluationxx

Pembekuan Penerapan

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
freeze_windowxxxxxtoggle_status
global_freezexmanage

Penggantian Layanan

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
service_overridexxxxx

Pengaturan

Tipe ResourceDaftarDapatkanBuatPerbaruiHapusJalankan Tindakan
settingx

Prompt MCP

DevOps

PromptDeskripsiParameter
build-deploy-appAlur kerja CI/CD end-to-end: pindai repositori git, buat pipeline CI (build & push image Docker), temukan atau buat manifest K8s, buat pipeline CD, dan deploy — dengan percobaan ulang otomatis pada kegagalan CI (hingga 5 percobaan) dan kegagalan CD (hingga 3 percobaan dengan izin pengguna). Jika percobaan ulang habis, berikan tautan mendalam UI Harness ke semua sumber daya yang dibuat untuk investigasi manual.repoUrl (wajib), imageName (wajib), projectId (opsional), namespace (opsional)
debug-pipeline-failureAnalisis eksekusi yang gagal: menerima ID eksekusi, ID pipeline, atau URL Harness. Mendapatkan rincian stage/step, detail kegagalan, info delegate, dan log step yang gagal melalui harness_diagnose, lalu memberikan analisis akar masalah dan saran perbaikan. Secara otomatis mengikuti kegagalan pipeline berantai.executionId (opsional), projectId (opsional)
pipeline_summarizerAmbil dan rangkum SEMUA log step dari eksekusi pipeline. Menggunakan harness_diagnose dengan include_logs: true, include_all_step_logs: true untuk mendapatkan log setiap step, lalu menampilkan tabel dengan Nama Step, Status, Durasi, dan Apa yang Terjadi (ringkasan berbasis log). TIDAK melewatkan step apa pun.executionId (opsional), projectId (opsional)
create-pipelineBuat YAML pipeline baru dari kebutuhan bahasa alami, dengan meninjau sumber daya yang ada untuk konteksdescription (wajib), projectId (opsional)
create-agentBangun agen AI Harness secara interaktif — periksa agen yang ada (mendeteksi format spesifikasi agent.uses saat ini vs. agent.step.group.steps lama saat memperbarui), kumpulkan kebutuhan, buat spesifikasi agen dalam format yang sesuai, konfirmasi dengan pengguna, lalu buat atau perbarui melalui harness_create/harness_updateagent_name (wajib), task_description (wajib), org_id (opsional), project_id (opsional)
onboard-servicePandu proses onboarding layanan baru dengan environment dan pipeline deploymentserviceName (wajib), projectId (opsional)
dora-metrics-reviewTinjau metrik DORA (frekuensi deployment, tingkat kegagalan perubahan, MTTR, lead time) dengan klasifikasi Elite/High/Medium/Low dan rekomendasi perbaikanteamRefId (opsional), dateStart (opsional), dateEnd (opsional)
setup-gitops-applicationPandu proses onboarding aplikasi GitOps — verifikasi agen, cluster, repositori, dan buat aplikasiagentId (wajib), projectId (opsional)
chaos-resilience-testRancang eksperimen chaos untuk menguji ketahanan layanan dengan injeksi fault, probe, dan hasil yang diharapkanserviceName (wajib), projectId (opsional)
feature-flag-rolloutRencanakan dan jalankan peluncuran feature flag progresif di seluruh environment dengan gerbang keamananflagIdentifier (wajib), projectId (opsional)
migrate-pipeline-to-templateAnalisis pipeline yang ada dan ekstrak template stage/step yang dapat digunakan ulang darinyapipelineId (wajib), projectId (opsional)
delegate-health-checkPeriksa konektivitas delegate, kesehatan, status token, dan selesaikan masalah infrastrukturprojectId (opsional)
developer-portal-scorecardTinjau scorecard IDP untuk layanan dan identifikasi celah untuk meningkatkan pengalaman pengembangprojectId (opsional)
pending-approvalsTemukan eksekusi pipeline yang menunggu persetujuan, tampilkan detail, dan tawarkan untuk menyetujui atau menolakprojectId (opsional), orgId (opsional), pipelineId (opsional)

FinOps

PromptDeskripsiParameter
optimize-costsAnalisis data biaya cloud, tampilkan rekomendasi dan anomali, diprioritaskan berdasarkan potensi penghematanprojectId (opsional)
cloud-cost-breakdownAnalisis mendalam biaya cloud berdasarkan layanan, environment, atau cluster dengan analisis tren dan deteksi anomaliperspectiveId (opsional), projectId (opsional)
commitment-utilization-reviewAnalisis pemanfaatan reserved instance dan savings plan untuk menemukan pemborosan dan optimalkan komitmenprojectId (opsional)
cost-anomaly-investigationInvestigasi anomali biaya — tentukan akar masalah, sumber daya yang terdampak, dan perbaikanprojectId (opsional)
rightsizing-recommendationsTinjau dan prioritaskan rekomendasi rightsizing, opsional buat tiket Jira atau ServiceNowprojectId (opsional), minSavings (opsional)

DevSecOps

PromptDeskripsiParameter
security-reviewTinjau masalah keamanan di seluruh sumber daya Harness dan sarankan perbaikan berdasarkan tingkat keparahanprojectId (opsional), severity (opsional, default: critical,high)
vulnerability-triageTriase kerentanan keamanan di seluruh pipeline dan artefak, prioritaskan berdasarkan tingkat keparahan dan eksploitabilitasprojectId (opsional), severity (opsional)
sbom-compliance-checkAudit SBOM dan postur kepatuhan untuk artefak — risiko lisensi, pelanggaran kebijakan, kerentanan komponenartifactId (opsional), projectId (opsional)
supply-chain-auditAudit keamanan rantai pasokan perangkat lunak end-to-end — provenans, rantai kepemilikan, kepatuhan kebijakanprojectId (opsional)
security-exemption-reviewTinjau pengecualian keamanan yang tertunda dan buat keputusan persetujuan atau penolakan batchprojectId (opsional)
bulk-exemption-createBuat pengecualian keamanan yang beralasan untuk beberapa masalah STO dengan panduan cakupan dan durasi yang jelasprojectId (wajib), exemption_type (wajib), reason (wajib), filter masalah (opsional)
access-control-auditAudit izin pengguna, akun dengan hak berlebih, dan penetapan peran untuk menegakkan least-privilegeprojectId (opsional), orgId (opsional)

Harness Code

PromptDeskripsiParameter
code-reviewTinjau pull request — analisis diff, commit, pemeriksaan, dan komentar untuk memberikan umpan balik terstruktur tentang bug, keamanan, kinerja, dan gayarepoId (wajib), prNumber (wajib), projectId (opsional)
pr-summaryBuat judul dan deskripsi PR secara otomatis dari riwayat commit dan diff sebuah branchrepoId (wajib), sourceBranch (wajib), targetBranch (opsional, default: main), projectId (opsional)
branch-cleanupAnalisis branch di repositori dan rekomendasikan branch basi atau yang sudah digabung untuk dihapusrepoId (wajib), projectId (opsional)

Sumber Daya MCP

URI Sumber DayaDeskripsiTipe MIME
pipeline:///{pipelineId}Definisi YAML pipelineapplication/x-yaml
pipeline:///{orgId}/{projectId}/{pipelineId}YAML pipeline (dengan cakupan eksplisit)application/x-yaml
executions:///recentRingkasan 10 eksekusi pipeline terakhirapplication/json
schema:///pipelineSkema JSON pipeline Harnessapplication/schema+json
schema:///templateSkema JSON template Harnessapplication/schema+json
schema:///triggerSkema JSON trigger Harnessapplication/schema+json
schema:///pipeline_v1 (Alpha)Skema JSON pipeline Harness V1 (format stage/langkah yang disederhanakan)application/schema+json
schema:///agent-pipelineSkema JSON pipeline agen AI Harnessapplication/schema+json
agent-docs:///legacy-formatReferensi format spesifikasi agen lama (agent.step.group.steps / PLUGIN_TASK), dibaca oleh prompt create-agent saat memperbarui agen format lama yang adatext/markdown

Pemfilteran Toolset

Secara default, 41 dari 45 toolset diaktifkan. Empat toolset bersifat opt-in dan dikecualikan dari default:

  • ansible — Harness Ansible (inventori, playbook, host, aktivitas). Opt-in karena bersifat cakupan proyek dan menambahkan konsep yang tidak dibutuhkan banyak pengguna.
  • autonomous_work — Development Harness (kerja otonom). Opt-in; lihat deskripsi toolset untuk cakupan.
  • observability-evaluations — Aturan evaluasi telemetri produksi terjadwal. Opt-in karena bergantung pada bidang kontrol penilaian yang diterapkan.
  • registries-v3 — Harness Artifact Registry v3 (paket, versi, file, metadata, pemindaian, pengecualian firewall). Opt-in hingga penulisan v3 tersedia, sehingga agen tidak perlu membedakan antara registri/artefak v1 dan paket/versi v3.

Menambahkan toolset dengan prefiks +

Gunakan prefiks + untuk menyertakan toolset opt-in secara eksplisit bersama semua default:

# Explicitly include Ansible alongside all defaults
HARNESS_TOOLSETS=+ansible

Menghapus toolset default

Gunakan prefiks - untuk mengecualikan toolset yang tidak Anda butuhkan:

# Remove chaos and ccm from defaults
HARNESS_TOOLSETS=-chaos,-ccm

Menggabungkan + dan -

# Add Ansible, remove chaos
HARNESS_TOOLSETS=+ansible,-chaos

Daftar izin eksplisit

Daftar yang dipisahkan koma secara eksplisit (tanpa prefiks) menggantikan default sepenuhnya. Hanya toolset yang terdaftar yang diaktifkan:

# Only expose pipelines, services, and connectors
HARNESS_TOOLSETS=pipelines,services,connectors

Nama toolset yang tersedia:

ToolsetTipe Resource
platformorganization, project
pipelinespipeline, pipeline_v1, pipeline_dynamic_execution, execution, execution_inputs, trigger, pipeline_summary, input_set, approval_instance
agentsagent, agent_run
servicesservice
environmentsenvironment
connectorsconnector, connector_catalogue
infrastructureinfrastructure
secretssecret
logsexecution_log
auditaudit_event
delegatesdelegate, delegate_token
repositoriesrepository, branch, commit, file_content, tag, repo_rule, space_rule
registriesregistry, artifact, artifact_version, artifact_file
file_storefile_store
templatestemplate
dashboardsdashboard, dashboard_data
idpidp_entity, scorecard, scorecard_check, scorecard_stats, scorecard_check_stats, idp_score, idp_workflow, idp_tech_doc
pull-requestspull_request, pr_reviewer, pr_comment, pr_check, pr_activity
feature-flagsfme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, fme_traffic_type, fme_identity, fme_standard_segment, fme_segment_keys, fme_segment, fme_segment_definition, fme_metric, fme_event_type
gitopsgitops_agent, gitops_argo_project, gitops_app_project_mapping, gitops_autocreate_log, 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, gitops_cluster_link
chaoschaos_experiment, chaos_experiment_run, chaos_experiment_variable, chaos_component_variable, chaos_input_set, chaos_experiment_template, chaos_probe, chaos_probe_in_run, chaos_probe_template, chaos_infrastructure, chaos_k8s_infrastructure, chaos_enabled_infrastructure, chaos_environment, chaos_hub, chaos_hub_fault, chaos_fault, chaos_fault_template, chaos_fault_experiment_run, chaos_action, chaos_action_template, chaos_loadtest, chaos_service, chaos_application_map, discovered_agent, discovered_namespace, discovered_service, discovered_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk, chaos_dr_test, scanned_risk, chaos_risk_rule, chaos_risk_scan
ccmcost_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
seisei_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
scsscs_artifact_source, artifact_security, scs_artifact_component, scs_artifact_remediation, scs_chain_of_custody, scs_compliance_result, code_repo_security, scs_sbom
evidence-vaultattestation
stosecurity_issue, security_issue_filter, security_exemption, remediation_diff
dbopsdatabase_schema, database_instance, database_snapshot_object, database_llm_authoring_pipeline
autonomous_work (opsional)work_item, work_item_resume, work_item_approve, work_timeline, work_budget, work_phase, work_phase_artifact, work_artifact, budget, budget_grant, budget_usage, work_class, work_trigger, capability, risk_evaluator, team, member, member_template, software_component, content_source_connector
access_controluser, user_group, service_account, role, role_assignment, resource_group, permission
governancepolicy, policy_set, policy_evaluation
freezefreeze_window, global_freeze
overridesservice_override
settingssetting
knowledge-graphkg_queryable_type_summary, kg_grammar, hql_query
semantic-layerkg_type, kg_related_type
ai-evalseval_dataset, eval_dataset_item, evaluation, eval_run, eval_run_item, eval_run_by_eval, eval_metric, eval_metric_set, eval_metric_set_entry, eval_suite, eval_suite_evaluation, eval_suite_run, eval_target, eval_annotation, eval_analytics, eval_git_settings, eval_registry_item, eval_git_registration, online_eval
observability-evaluations (opsional)observability_evaluation_rule
iacmiacm_workspace, iacm_variable_set, iacm_resource, iacm_module, iacm_provider, iacm_workspace_costs, iacm_activity_resource_change
ansible (opsional)ansible_inventory, ansible_playbook, ansible_host, ansible_host_activity, ansible_activity
registries-v3 (opsional)package_v3, version_v3, file_v3, registry_metadata_v3, package_metadata_v3, version_metadata_v3, file_metadata_v3, metadata_key_v3, metadata_value_v3, artifact_scan_v3, bulk_scan_evaluation_v3, firewall_exception_v3, firewall_exception_version_v3
release-managementrelease_process, release_activity, release, release_execution_phase, release_execution_task, release_execution_activity, release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_input, release_execution_activity_output
vibevibe_project, vibe_app_lifecycle

Arsitektur

                 +------------------+
                 |   AI Agent       |
                 |  (Claude, etc.)  |
                 +--------+---------+
                          |  MCP (stdio or HTTP)
                 +--------v---------+
                |    MCP Server     |
                | 11 Generic Tools  |
                 +--------+---------+
                          |
                 +--------v---------+
                |    Registry       |  <-- Declarative resource definitions
                | 45 Toolsets (41 default) |
                |  255 Resource Types|
                 +--------+---------+
                          |
                 +--------v---------+
                 |  HarnessClient    |  <-- Auth, retry, rate limiting
                 +--------+---------+
                          |  HTTPS
                 +--------v---------+
                 |  Harness REST API |
                 +-------------------+

Cara Kerjanya

  1. Tools adalah kata kerja generik: harness_list, harness_get, dst. Mereka menerima parameter resource_type yang mengarahkan ke endpoint API yang tepat.
  2. Registry memetakan setiap resource_type ke ResourceDefinition — struktur data deklaratif yang menentukan metode HTTP, jalur URL, pemetaan parameter jalur/kueri, dan logika ekstraksi respons.
  3. Dispatch menyelesaikan definisi resource, membangun permintaan HTTP (substitusi jalur, parameter kueri, injeksi akun/org/proyek yang sadar resource_scope), memanggil API Harness melalui HarnessClient, dan mengekstrak data respons yang relevan.
  4. Pemfilteran toolset (HARNESS_TOOLSETS) mengontrol definisi resource mana yang dimuat ke registry saat startup.
  5. Output terstruktur dideklarasikan dengan MCP outputSchema; harness_list memaksa array dan pembungkus daftar umum menjadi structuredContent berbentuk objek untuk klien yang ketat.
  6. Deep link secara otomatis ditambahkan ke respons, menyediakan URL UI Harness langsung untuk setiap resource.
  7. Mode ringkas menghapus metadata verbose dari hasil daftar, hanya menyisakan bidang yang dapat ditindaklanjuti (identitas, status, tipe, stempel waktu, deep link) untuk meminimalkan penggunaan token.

Menambahkan Tipe Resource Baru

Buat file baru di src/registry/toolsets/ atau tambahkan resource ke toolset yang ada:

// 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",
        },
      },
    },
  ],
};

Kemudian impor di src/registry/index.ts dan tambahkan ke array ALL_TOOLSETS. Tidak perlu perubahan pada file tool mana pun.

Pengembangan

# Build
pnpm build

# Watch mode
pnpm dev

# Type check
pnpm typecheck

# Run tests
pnpm test

# Watch tests
pnpm test:watch

# Interactive MCP Inspector
pnpm inspect

# Refresh generated README counts from the built registry
pnpm docs:generate

# Verify README counts and clone instructions are current
pnpm docs:check

# Sync and verify JSON Schemas used by harness_schema
pnpm sync-schemas
pnpm check-schema-coverage

Struktur Proyek

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/                            # 11 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
    harness-schema.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 tests

Elicitation

Tool tulis (harness_create, harness_update, harness_delete, harness_execute) menggunakan elicitation MCP untuk meminta konfirmasi pengguna ketika risiko tindakan memerlukannya — hanya operasi medium_write, high_write, dan destructive. Operasi create/update/read berisiko rendah (misalnya pipeline.create, pipeline.update, hql_query.run) berjalan diam-diam tanpa prompt. Saat prompt muncul, pengguna melihat apa yang akan terjadi dan menerima atau menolak, memberikan persetujuan manusia-dalam-loop yang nyata untuk operasi yang benar-benar mengubah atau menjalankan sesuatu.

Cara kerjanya:

  1. LLM memanggil tool tulis dengan risiko medium_write+ (misalnya harness_delete, harness_execute pipeline.run). Create/update/read berisiko rendah tidak memunculkan prompt.
  2. Server mengirim permintaan elicitation ke klien dengan ringkasan operasi dan kotak centang confirm (tercentang secara default).
  3. Pengguna melihat detail dan mengklik Terima (dengan confirm tercentang) atau Tolak / Batal.
  4. Jika diterima dengan confirm: true, operasi dilanjutkan. Jika diterima dengan confirm tidak tercentang, ditolak, atau dibatalkan, operasi diblokir dan LLM diberi tahu (penolakan eksplisit bersifat otoritatif dan tidak dilewati oleh confirm: true pada panggilan tool).

Dukungan klien:

KlienDukungan Elicitation
CursorYa
VS Code (Copilot)Ya
Claude DesktopBelum
Devin DesktopBelum
MCP InspectorYa

Perilaku elicitation bervariasi berdasarkan risiko operasi ketika dukungan klien tidak tersedia:

Tingkat RisikoKlien mendukung elicitationconfirm: true diteruskanPerilaku
read, low_writeapa punapa punLanjutkan diam-diam — tidak ada prompt yang dimunculkan (confirm tidak berpengaruh pada tingkat risiko ini)
medium_write, high_write, destructiveYaapa punMinta pengguna. Lanjutkan hanya jika pengguna menerima dengan confirm: true (default skema). Penolakan eksplisit, pembatalan, atau penerimaan dengan confirm: false (pengguna menghapus centang) bersifat otoritatif dan tidak dilewati oleh confirm: true pada panggilan tool. Penerimaan yang tidak menyertakan bidang confirm diperlakukan sebagai kegagalan klien memunculkan prompt yang dapat digunakan — dapat dipulihkan dengan mencoba ulang menggunakan confirm: true
medium_write, high_write, destructiveTidakTidakBLOKIR (kembalikan error dengan petunjuk untuk mencoba ulang dengan confirm: true)
medium_write, high_write, destructiveTidakYaLanjutkan (opt-in eksplisit untuk otomatisasi non-interaktif)
apa pun (pada atau di bawah HARNESS_AUTO_APPROVE_RISK)apa punapa punSetujui otomatis tanpa prompt

Jika elicitInput gagal saat runtime (error transport, metode tidak didukung) untuk operasi medium_write+, panggilan diblokir kecuali pemanggil meneruskan confirm: true. confirm: true dihormati sebagai fallback ketika klien tidak dapat memunculkan prompt atau mengembalikan penerimaan degeneratif ({action: "accept"} tanpa bidang konfirmasi), tetapi tidak menimpa penolakan/pembatalan eksplisit dari klien yang menyelesaikan handshake elicitation.

Mode Otonom

Mode otonom berarti server melanjutkan semua operasi — termasuk penulisan dan tindakan destruktif — tanpa meminta konfirmasi. Aktifkan dengan mengatur:

HARNESS_AUTO_APPROVE_RISK=all

Ini adalah batas tingkat deployment: setelah diatur, sesi individual tidak dapat meningkat melampauinya (meskipun mereka dapat memilih ambang yang lebih ketat per sesi melalui header x-harness-auto-approve-risk).

Atau di konfigurasi klien MCP Anda:

{
  "mcpServers": {
    "harness": {
      "command": "npx",
      "args": ["harness-mcp-v2"],
      "env": {
        "HARNESS_API_KEY": "pat.xxx.xxx.xxx",
        "HARNESS_AUTO_APPROVE_RISK": "all"
      }
    }
  }
}

Otonomi parsial: Anda juga dapat menyetujui otomatis hanya hingga tingkat risiko tertentu sambil tetap meminta prompt untuk operasi berisiko lebih tinggi:

# Auto-approve reads and low-risk writes; prompt for medium_write, high_write, destructive
HARNESS_AUTO_APPROVE_RISK=low_write

# Auto-approve up to high-risk writes; only prompt for destructive operations
HARNESS_AUTO_APPROVE_RISK=high_write
NilaiYang disetujui otomatis
none (default)Tidak ada — tidak ada ambang persetujuan otomatis
low_writeBaca + penulisan berisiko rendah
medium_writeBaca + penulisan berisiko rendah + sedang
high_writeBaca + penulisan berisiko rendah + sedang + tinggi
allSemuanya, termasuk operasi destruktif

Peringatan mode otonom: HARNESS_AUTO_APPROVE_RISK=all melewati konfirmasi untuk semua operasi termasuk harness_delete. Gunakan dengan hati-hati dan pertimbangkan untuk memasangkan dengan HARNESS_TOOLSETS untuk membatasi tipe resource mana yang tersedia.

Catatan migrasi: HARNESS_SKIP_ELICITATION=true masih didukung dan dipetakan ke HARNESS_AUTO_APPROVE_RISK=all. Peringatan deprecation dicatat ke stderr. Jika keduanya diatur, HARNESS_AUTO_APPROVE_RISK yang diutamakan.

Keamanan

  • Rahasia tidak pernah diekspos. Tipe resource secret hanya mengembalikan metadata (nama, tipe, lingkup) — nilai rahasia tidak pernah disertakan dalam respons apa pun.
  • Operasi yang memerlukan konfirmasi menggunakan elicitation saat tersedia. Ketika tindakan tulis atau eksekusi memiliki risiko medium_write, high_write, atau destructive, harness_create, harness_update, harness_delete, dan harness_execute mencoba elicitation MCP sebelum melanjutkan (lihat Elicitation). Tindakan berisiko rendah (read, low_write — misalnya pipeline.create, pipeline.update, hql_query.run) berjalan diam-diam tanpa prompt.
  • Risiko sedang ke atas gagal tertutup. Jika konfirmasi tidak dapat diperoleh untuk operasi medium_write, high_write, atau destructive, operasi diblokir alih-alih dieksekusi secara membabi buta. Timpa dengan HARNESS_AUTO_APPROVE_RISK untuk alur kerja otonom.
  • CORS dibatasi ke asal yang sama. Transport HTTP hanya mengizinkan permintaan asal yang sama, mencegah serangan CSRF dari situs web berbahaya yang menargetkan server MCP di localhost.
  • Pembatasan laju HTTP. Transport HTTP memberlakukan 60 permintaan per menit per IP untuk mencegah banjir permintaan.
  • Pembatasan laju API. Klien API Harness memberlakukan batas 10 permintaan/detik untuk menghindari batas laju upstream.
  • Batas pagination diberlakukan. Kueri daftar dibatasi maksimal 10.000 item total dan 100 per halaman untuk mencegah kehabisan memori.
  • Coba ulang dengan backoff. Kegagalan sementara (HTTP 429, 5xx) dicoba ulang dengan backoff eksponensial dan jitter.
  • Pengikatan localhost. Transport HTTP terikat ke 127.0.0.1 secara default — tidak dapat diakses dari jaringan.
  • Tidak ada logging stdout. Semua log masuk ke stderr untuk menghindari kerusakan transport JSON-RPC stdio.

Skill Pelengkap

Server MCP Harness bekerja dengan baik bersama Harness Skills — kumpulan skill Claude Code siap pakai (perintah slash) yang dirancang untuk alur kerja Harness umum. Pasang bersama server MCP ini untuk mendapatkan otomatisasi tingkat tinggi seperti /deploy, /rollback, /triage, dan lainnya tanpa menulis prompt kustom.

Pemecahan Masalah & Kesalahan Umum

GejalaKemungkinan PenyebabYang Harus Dilakukan
HARNESS_ACCOUNT_ID is required when the API key does not include an account ID segment...Kunci API tidak dalam format berbasis akun yang didukung (pat.<accountId>... atau sat.<accountId>...) sehingga ID akun tidak dapat disimpulkanTetapkan HARNESS_ACCOUNT_ID secara eksplisit
Unknown transport: "..." saat startupArgumen transport CLI tidak didukungGunakan hanya stdio atau http
Invalid HARNESS_TOOLSETS: ... saat startupSatu atau lebih nama toolset tidak dikenaliGunakan hanya nama dari Pemfilteran Toolset (cocok persis)
HTTP mcp-session-id header is required...Permintaan sesi dikirim tanpa header sesiKirim initialize terlebih dahulu, lalu sertakan mcp-session-id pada POST/GET/DELETE /mcp
HTTP Session not found...Sesi kedaluwarsa setelah MCP_SESSION_TTL_MS milidetik idle atau sudah ditutupJalankan ulang initialize untuk membuat sesi baru, lalu coba lagi dengan header baru
HTTP 405 Method Not Allowed pada /mcpMetode tidak didukung untuk endpoint MCPGunakan hanya POST, GET, DELETE, atau OPTIONS
HTTP Invalid requestBadan JSON tidak valid atau badan permintaan melebihi HARNESS_MAX_BODY_SIZE_MBValidasi ukuran/bentuk payload JSON; tingkatkan HARNESS_MAX_BODY_SIZE_MB jika diperlukan
Unknown resource_type "..." dari toolsJenis resource salah eja atau difilter melalui HARNESS_TOOLSETSPanggil harness_describe (dengan search_term opsional) untuk menemukan jenis yang valid
Missing required field "... for path parameter ..."Panggilan berbasis proyek/org kehilangan pengidentifikasiTetapkan HARNESS_ORG/HARNESS_PROJECT atau berikan org_id/project_id per panggilan tool
resource_scope "org" requires org_id... atau resource_scope "project" requires project_id...Resource multi-cakupan dipaksa ke cakupan org/proyek tanpa pengidentifikasi yang cukupBerikan org_id/project_id yang hilang, konfigurasikan HARNESS_ORG/HARNESS_PROJECT, atau gunakan resource_scope: "account" jika didukung
Read-only mode is enabled ... operations are not allowedHARNESS_READ_ONLY=true memblokir create/update/delete/executeTetapkan HARNESS_READ_ONLY=false jika operasi tulis dimaksudkan
Eksekusi pipeline gagal pra-penerbangan dengan input wajib yang belum terselesaikaninputs yang diberikan tidak mencakup placeholder runtime yang wajibAmbil runtime_input_template, berikan kunci sederhana yang hilang, atau gunakan input_set_ids untuk input struktural
Shorthand CI pipeline (branch, tag, pr_number, commit_sha) tidak berlakuinputs.build sudah diberikan, sehingga ekspansi shorthand sengaja dilewatiHapus inputs.build untuk menggunakan ekspansi shorthand, atau pertahankan struktur build eksplisit penuh
Eksekusi pipeline memuat revisi YAML yang salahDefinisi pipeline disimpan di Git dan eksekusi tidak menentukan cabang pipeline yang diinginkanBerikan params.pipeline_branch pada aksi run; ini memetakan ke Harness branch
wait: true mengembalikan _wait.errorPemicu pipeline berhasil, tetapi polling sisi server gagalPeriksa ulang execution_id dengan harness_get(resource_type="execution", ...) sebelum memutuskan untuk menjalankan ulang
wait: true mengembalikan execution_timed_out: trueEksekusi tidak mencapai status terminal sebelum wait_timeout_secondsGunakan execution_id yang dikembalikan untuk memeriksa ulang status; tunggu status terminal sebelum menjalankan harness_diagnose
Log eksekusi kosong atau unduhan blob mengembalikan 403URL blob log yang dihosting Harness memerlukan jalur klien/auth Harness yang dikonfigurasi, terutama untuk host internal atau self-managedJaga HARNESS_BASE_URL mengarah ke host Harness target dan gunakan harness_get(resource_type="execution_log", ...) atau harness_diagnose(..., include_logs=true) daripada melewati klien MCP
Operation declined by user / Operation cancelled by userPengguna menolak atau membatalkan dialog konfirmasi elicitation — otoritatifVerifikasi detail operasi dengan pengguna; confirm: true tidak melewati penolakan eksplisit. Pengguna harus menerima prompt
Operation blocked: the client could not surface a usable confirmation promptKlien kekurangan dukungan elicitation, elicitInput gagal, atau mengembalikan penerimaan degeneratifCoba lagi dengan confirm: true untuk otomatisasi non-interaktif, atau gunakan klien yang mendukung elicitation
body.template_yaml (or body.yaml) is required untuk pembuatan/pembaruan templateAPI template mengharapkan payload YAML lengkapBerikan string template_yaml lengkap di body; untuk penghapusan, berikan version_label untuk menghapus satu versi (abaikan untuk menghapus semua versi)
HARNESS_BASE_URL must use HTTPS saat startupHARNESS_BASE_URL diatur ke URL HTTPGunakan HTTPS, atau tetapkan HARNESS_ALLOW_HTTP=true untuk pengembangan lokal

Lisensi

MIT