Harness
resmiMengakses 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
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:
- Masuk ke akun Harness Anda
- Buka Profil Saya → Kunci API → + Kunci API Baru
- Buat Token baru di bawah kunci API — ini menghasilkan PAT atau SAT dalam format
<prefix>.<accountId>.<tokenId>.<secret> - 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>...atausat.<accountId>...), jadiHARNESS_ACCOUNT_IDhanya 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:
| Endpoint | Metode | Deskripsi |
|---|---|---|
/mcp | POST | Endpoint JSON-RPC MCP (initialize + permintaan sesi) |
/mcp | GET | Aliran SSE untuk pesan yang diprakarsai server (progres, elisitasi) |
/mcp | DELETE | Mengakhiri sesi MCP yang aktif |
/mcp | OPTIONS | Preflight CORS |
/health | GET | Pemeriksaan kesehatan — mengembalikan { "status": "ok", "sessions": <count> } |
/.well-known/oauth-protected-resource | GET | Metadata RFC 9728 saat HARNESS_MCP_MODE=oauth |
/.well-known/oauth-protected-resource/mcp | GET | Metadata 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_TOKENuntuk deployment pengguna tunggal dan multi-pengguna yang dibagikan atau dapat dijangkau dari jarak jauh. Saat ditetapkan, setiap permintaanPOST,GET, danDELETEke/mcpharus menyertakanAuthorization: Bearer <token>. - Mode OAuth menerima token akses HarnessID alih-alih
HARNESS_MCP_AUTH_TOKENdan dapat mengikat ke alamat non-loopback tanpa opt-out tanpa autentikasi. - Bind pengguna tunggal dan multi-pengguna non-loopback memerlukan
HARNESS_MCP_AUTH_TOKENsecara default. Untuk menjalankan tanpa autentikasi pada antarmuka non-loopback, tetapkanHARNESS_MCP_ALLOW_UNAUTHENTICATED_HTTP=truesecara eksplisit. POST /mcptanpamcp-session-idharus berupa permintaaninitialize.POST /mcp,GET /mcp, danDELETE /mcpuntuk sesi yang ada memerlukan headermcp-session-id.GET /mcpdigunakan untuk notifikasi SSE (pembaruan progres dan prompt elisitasi).- Sesi idle dibersihkan setelah
MCP_SESSION_TTL_MSmilidetik setelah tidak ada permintaan atau aliran SSE yang aktif (default1800000, atau 30 menit). GET /healthadalah satu-satunya endpoint non-MCP.- Ukuran badan permintaan dibatasi oleh
HARNESS_MAX_BODY_SIZE_MB(default10MB). - Tetapkan
x-harness-pipeline-version: 0atau1pada permintaaninitializeuntuk memilih sumber daya pipeline V0 atau V1 untuk sesi HTTP tersebut. - Tetapkan
x-harness-auto-approve-risk: none|low_write|medium_write|high_write|allpada permintaaninitializeuntuk memilih ambang persetujuan otomatis per sesi yang lebih ketat. Server membatasi nilai ini padaHARNESS_AUTO_APPROVE_RISKtingkat 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_KEYtidak boleh ditetapkan dalam konfigurasi server — server tidak menyimpan kredensial Harness.- Setiap sesi harus menyediakan
x-harness-api-keypada permintaaninitialize.x-harness-account-iddiperlukan hanya saat kunci API tidak menyematkan segmen akun. - Sesi juga dapat menyediakan header
x-harness-orgdanx-harness-projectuntuk 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_TOKENbersifat 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_ORGdanHARNESS_PROJECTbersifat opsional. Keduanya menetapkan ID org dan ID proyek yang digunakan saat tidak ditentukan per panggilan alat. Agen dapat menemukan org dan proyek secara dinamis menggunakanharness_list(resource_type="organization")danharness_list(resource_type="project"). Nama yang tidak digunakan lagiHARNESS_DEFAULT_ORG_IDdanHARNESS_DEFAULT_PROJECT_IDmasih 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_KEYdalam 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/mcpadalah 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 aturHARNESS_BASE_URLke 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 ENOENTataunode: No such file or directoryIni adalah kegagalan peluncuran proses klien, bukan kegagalan autentikasi Harness. Server MCP belum dimulai, jadi mengubah
HARNESS_API_KEYtidak akan memengaruhispawn npx ENOENT.Aplikasi GUI (Cursor, Claude Desktop, Devin Desktop, VS Code) tidak selalu mewarisi
PATHdari shell Anda, sehingga mereka dapat gagal menemukannpxataunodesetelah muat ulang konfigurasi. Perbaiki ini dengan menggunakan jalur absolut dan secara eksplisit mengaturPATHdi blokenv:{ "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 npxdanwhich nodedi terminal, lalu pastikan direktori yang berisinodedisertakan dalam nilaiPATHdi atas. Lokasi umum:
- Homebrew (macOS):
/opt/homebrew/bin/npx- nvm:
~/.nvm/versions/node/v20.x.x/bin/npx(jalankannvm which currentuntuk 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.
| Variabel | Wajib | Default | Deskripsi |
|---|---|---|---|
HARNESS_MCP_MODE | Tidak | single-user | Mode deployment: single-user (kunci API bersama), multi-user (HTTP dengan kunci API per sesi), atau oauth (HTTP dengan validasi token akses HarnessID) |
HARNESS_API_KEY | Ya* | -- | 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_ID | Tidak | (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_URL | Tidak | https://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_ISSUER | Tidak | https://id.harness.io/idp/realms/HarnessIDP | Penerbit HarnessID dicocokkan secara tepat terhadap klaim iss token akses |
HARNESS_MCP_OAUTH_RESOURCE | Tidak | https://mcp.harness.io/mcp | URL MCP kanonik publik yang diterbitkan sebagai pengidentifikasi sumber daya RFC 9728 |
HARNESS_MCP_OAUTH_JWKS_URI | Tidak | <issuer>/protocol/openid-connect/certs | Titik akhir JWKS HarnessID yang digunakan untuk memvalidasi tanda tangan token akses RS256 |
HARNESS_MCP_OAUTH_CLIENT_ID | Tidak | mcp-client | Klien HarnessID yang kepadanya token akses harus diterbitkan, diperiksa terhadap klaim azp token |
HARNESS_MCP_OAUTH_ACCOUNT_CLAIM | Tidak | account_id | Klaim token akses yang membawa ID akun Harness, diisi oleh cakupan organization HarnessID |
HARNESS_MCP_OAUTH_SCOPES | Tidak | openid profile email organization | Cakupan yang dipisahkan spasi yang diiklankan dalam metadata sumber daya yang dilindungi RFC 9728 |
HARNESS_FME_API_KEY | Tidak | -- | 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_URL | Tidak | https://api.split.io | URL 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_ORG | Tidak | -- | 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_PROJECT | Tidak | -- | 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_MS | Tidak | 30000 | Batas waktu permintaan HTTP dalam milidetik |
HARNESS_MAX_RETRIES | Tidak | 3 | Jumlah percobaan ulang untuk kegagalan sementara (429, 5xx) |
HARNESS_MAX_BODY_SIZE_MB | Tidak | 10 | Ukuran maksimum badan permintaan HTTP dalam MB untuk transport http |
HARNESS_RATE_LIMIT_RPS | Tidak | 10 | Pembatasan permintaan sisi klien (permintaan per detik) ke API Harness |
LOG_LEVEL | Tidak | info | Tingkat verbositas log: debug, info, warn, error |
HARNESS_TOOLSETS | Tidak | (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_ONLY | Tidak | false | Blokir semua operasi mutasi (buat, perbarui, hapus, jalankan). Hanya daftar dan dapatkan yang diizinkan. Berguna untuk lingkungan bersama/demo |
HARNESS_AUTO_APPROVE_RISK | Tidak | none | Ambang 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_ELICITATION | Tidak | false | Tidak digunakan lagi — gunakan HARNESS_AUTO_APPROVE_RISK=all sebagai gantinya. Dipertahankan untuk kompatibilitas mundur |
HARNESS_ALLOW_HTTP | Tidak | false | Izinkan 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_VERSION | Tidak | 0 | (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_HOSTS | Tidak | -- | 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_TOKEN | Tidak | -- | 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_HTTP | Tidak | false | Izinkan transport HTTP tanpa autentikasi secara eksplisit pada bind non-loopback. Gunakan hanya di belakang kontrol terautentikasi lainnya |
HARNESS_MCP_TRUST_PROXY | Tidak | 0 | Jumlah 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_FILE | Tidak | ~/.claude/harness-mcp.log | File yang digunakan untuk diagnostik pemutusan/crash stdio ketika stderr mungkin tidak lagi tersedia |
HARNESS_LOG_UNSAFE_BODIES | Tidak | false | Sertakan badan permintaan/respons mentah dalam log. Mati secara default karena badan dapat berisi rahasia; aktifkan hanya untuk debugging lokal |
HARNESS_AUDIT_FILE | Tidak | -- | Tambahkan peristiwa audit ke file JSON yang dipisahkan baris baru untuk pengumpulan lokal yang tahan lama |
HARNESS_AUDIT_WEBHOOK_URL | Tidak | -- | Titik akhir HTTPS yang menerima peristiwa audit yang dikelompokkan. URL HTTP memerlukan HARNESS_ALLOW_HTTP=true untuk pengembangan lokal |
HARNESS_AUDIT_WEBHOOK_TOKEN | Tidak | -- | Token bearer opsional yang dikirim ke webhook audit |
HARNESS_AUDIT_WEBHOOK_BATCH_SIZE | Tidak | 10 | Jumlah peristiwa audit yang dikelompokkan sebelum flush webhook |
HARNESS_AUDIT_WEBHOOK_FLUSH_MS | Tidak | 5000 | Waktu maksimum untuk menahan event audit sebelum flush webhook |
OTEL_EXPORTER_OTLP_ENDPOINT | Tidak | -- | Mengaktifkan span audit OpenTelemetry ketika paket OpenTelemetry opsional terinstal |
HARNESS_SEARCH_PROVIDER | Tidak | local | Backend 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_URL | Tidak | -- | URL dasar layanan pencarian jarak jauh ketika HARNESS_SEARCH_PROVIDER=remote (misalnya http://search-svc:8080). Diperlukan saat menggunakan penyedia remote |
HARNESS_SEARCH_SERVICE_HEADERS | Tidak | -- | 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_DIR | Tidak | /tmp/hf-cache | Direktori 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_CONCURRENCY | Tidak | 3 | Jumlah 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:
| Penyedia | Kapan 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. |
remote | Mode 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. |
none | Nonaktifkan 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_FILEmenambahkan peristiwa JSON yang dipisahkan baris baru untuk koleksi lokal.HARNESS_AUDIT_WEBHOOK_URLmengirim batch{ "events": [...] }ke webhook HTTPS, opsional denganHARNESS_AUDIT_WEBHOOK_TOKEN. Batch yang gagal diantrekan ulang dengan kapasitas terbatas dan akhirnya dibuang dengan peringatan daripada memblokir eksekusi alat.OTEL_EXPORTER_OTLP_ENDPOINTmengaktifkan 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 hanyaaccountIdentifier.resource_scope: "org"mengirimaccountIdentifierdanorgIdentifier.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.
| Alat | Deskripsi |
|---|---|
harness_describe | Temukan tipe resource, operasi, dan bidang yang tersedia. Tidak ada panggilan API — mengembalikan metadata registry lokal. |
harness_schema | Ambil 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_list | Daftarkan resource dari tipe tertentu dengan pemfilteran, pencarian, dan paginasi. |
harness_get | Dapatkan satu resource berdasarkan pengidentifikasinya. |
harness_create | Buat resource baru. Mendukung pipeline inline dan jarak jauh (berbasis Git). Meminta konfirmasi pengguna melalui elicitation. |
harness_update | Perbarui resource yang ada. Mendukung pipeline inline dan jarak jauh (berbasis Git). Meminta konfirmasi pengguna melalui elicitation. |
harness_delete | Hapus resource. Meminta konfirmasi pengguna melalui elicitation. Destruktif. |
harness_execute | Jalankan 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_search | Cari 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_diagnose | Diagnosa 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_status | Dapatkan 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, danagent-pipeline. - Skema entitas mencakup
connector,environment,service,secret, daninfrastructure. Skema ini sadar lingkup (account,org, atauproject) dan memerlukanorg_id/project_idketika lingkup yang dipilih memerlukannya. - Definisi Manajemen Rilis (
release_process,release_activity) mengambil JSON Schema langsung dari RMG/api/yamlSchema(tidak digabungkan). Berikanscope,org_id, danproject_idsaat 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-schemaHarness dan menyimpan hasilnya dalam cache. - Hilangkan
pathuntuk ringkasan bidang/bagian, lalu berikanpathyang 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:
- 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.
- Pilih strategi input
-
Variabel sederhana: berikan
inputspasangan 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 singkatan Struktur 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.buildsudah ada (buildeksplisit menang).
- 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 sebagaibranch). Pemilih definisi eksplisit ini lebih diutamakan daripada aliasparams.branch.inputs.branchsecara 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 }
- Opsional: gabungkan keduanya
- Gunakan
input_set_idsuntuk bentuk dasar daninputsuntuk override sederhana.
Untuk pipeline v1:
- Ambil
harness_get(resource_type="runtime_input_template_v1", resource_id="<pipeline_id>"). Untuk pipeline berbasis Git, berikanbranch_name,connector_ref, danrepo_namemelaluiparams. - Gunakan setiap
inputs[].details.nameyang dikembalikan sebagai kunci tingkat atas diharness_execute.inputs. - Jalankan
harness_execute(resource_type="pipeline_v1", action="run", resource_id="<pipeline_id>", inputs={...}). Server membungkus nilai-nilai ini di bawah akar YAMLinputs:dan mengirim badaninputs_yamlAPI. 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 denganharness_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:
bodyharus berupa objek dengan kolomyaml. Badan string mentah ditolak oleh skemaharness_executepublik.body.yamldapat 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_writedan menggunakan jalur konfirmasi/persetujuan otomatis normal. Respons memproyeksikan amplop API ke{ "execution_id": "...", "status": "..." }dan menyertakan tautan eksekusiopenInHarnesssaat 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 dariresource_id.inputSetYaml- YAML input runtime gabungan yang digunakan untuk eksekusi, ataunull.inputSetTemplateYaml- template input pada saat eksekusi, ataunull.resolvedYaml- YAML yang telah diselesaikan ekspresi saatresolve_expressions=true, jika tidak biasanyanull.inputSetDetails- set input tersimpan yang berkontribusi sebagai pasangan{ identifier, name }.inputSetBranchName- cabang sumber untuk set input yang didukung Git, ataunull.
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, danexecution_poll_count. - Jika batas waktu habis, pemicu asli masih berhasil; respons menyertakan
execution_timed_out: truedan_wait.hintdengan status terakhir yang diamati. - Jika polling gagal setelah pemicu berhasil, respons menyertakan
_wait.errordan 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_hintyang menunjuk keharness_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:
| Mode | Deskripsi | Kapan digunakan |
|---|---|---|
| Inline | YAML pipeline disimpan di Harness | Default. 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 Code | Tim 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 Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
organization | x | x | x | x | x | |
project | x | x | x | x | x |
Pipeline
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
pipeline | x | x | x | x | x | run, retry |
pipeline_v1 (Alpha) | x | x | x | x | x | run |
pipeline_dynamic_execution | run | |||||
execution | x | x | interrupt | |||
execution_inputs | x | |||||
trigger | x | x | x | x | x | |
pipeline_summary | x | |||||
input_set | x | x | x | x | x | |
runtime_input_template | x | |||||
runtime_input_template_v1 | x | |||||
pipeline_resolved_yaml | x | |||||
approval_instance | x | approve, 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 Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
agent | x | x | x | x | x | |
agent_run | x |
Layanan
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
service | x | x | x | x | x |
Lingkungan
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
environment | x | x | x | x | x | move_configs |
Konektor
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
connector | x | x | x | x | x | test_connection |
connector_catalogue | x |
Infrastruktur
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
infrastructure | x | x | x | x | x | move_configs |
Rahasia
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
secret | x | x |
Log Eksekusi
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
execution_log | x |
Jejak Audit
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
audit_event | x | x |
Delegasi
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
delegate | x | x | ||||
delegate_token | x | x | x | x | revoke, get_delegates |
Repositori Kode
| Jenis Sumber Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
repository | x | x | x | x | ||
branch | x | x | x | x | ||
commit | x | x | x | diff, diff_stats | ||
file_content | x | x | blame | |||
tag | x | x | x | |||
repo_rule | x | x | ||||
space_rule | x | x |
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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
registry | x | x | ||||
artifact | x | |||||
artifact_version | x | |||||
artifact_file | x |
Penyimpanan Berkas
| Tipe Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
file_store | x | x | x | x | x | list_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 menjadimultipart/form-datauntuk/ng/api/file-store. name,type(FILEatauFOLDER), danparent_identifierwajib diisi; gunakan literal"Root"hanya untuk akar lingkup yang dipilih.FILEbuat memerlukan tepat satu daricontent(string UTF-8) ataucontent_base64(base64 valid tidak kosong).FILEperbarui dapat mengabaikan konten untuk pembaruan hanya metadata, atau menyediakan tepat satu kolom konten untuk mengganti konten.FOLDERbuat/perbarui harus mengabaikancontentdancontent_base64.- Opsional
file_usageharus berupaMANIFEST_FILE,CONFIG, atauSCRIPT; metadata skalar opsional sepertidescription,mime_type,path, dantagsharus berupa string. - Konten unggahan dibatasi hingga 100 MB. Prompt konfirmasi menyunting pratinjau
content,content_base64, dancontentBase64sebelum 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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
template | x | x | x | x | x |
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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
dashboard | x | x | ||||
dashboard_data | x |
DevOps Basis Data
| Tipe Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
database_schema | x | x | x | x | x | |
database_instance | x | x | x | x | x | |
database_snapshot_object | x | x | ||||
database_llm_authoring_pipeline | x |
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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
iacm_workspace | x | x | x | x | ||
iacm_variable_set | x | x | x | x | ||
iacm_resource | x | |||||
iacm_module | x | x | x | x | ||
iacm_provider | x | x | x | x | ||
iacm_workspace_costs | x | |||||
iacm_activity_resource_change | x |
Alur kerja umum:
harness_list(resource_type="iacm_workspace", org_id="...", project_id="...")untuk menemukan workspace.harness_create/harness_updatepadaiacm_workspaceuntuk membuat dari awal atau dari templat (associated_template), atau perbarui workspace yang ada — respons hanya{ policy_evaluation }.harness_get(resource_type="iacm_workspace", workspace_id="...")untuk mengambil workspace yang dibuat/diperbarui.harness_list/harness_create/harness_updatepadaiacm_variable_set(opsional denganresource_scope) untuk set variabel Terraform/env yang dapat digunakan kembali — respons adalah sumber daya VariableSet.harness_list/harness_create/harness_updatepadaiacm_moduleuntuk registry modul (name+systemwajib; tambahkanresource_scopedenganorg_id/project_iduntuk modul berlingkup organisasi atau proyek) — respons adalah sumber daya modul.harness_list/harness_create/harness_updatepadaiacm_provideruntuk registry penyedia akun (body.typewajib untuk buat; buat mengembalikan{ id }saja — laluharness_get; perbarui membuat/memperbarui versi saja) — perbarui versi dapat mengembalikan sukses kosong.harness_list(resource_type="iacm_resource", org_id="...", project_id="...", workspace_id="...")untuk memeriksa sumber daya Terraform, keluaran, dan sumber data.harness_list(resource_type="iacm_workspace_costs", org_id="...", project_id="...", workspace_id="...")untuk meninjau entri biaya per eksekusi.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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
idp_entity | x | x | ||||
scorecard | x | x | ||||
scorecard_check | x | x | ||||
scorecard_stats | x | |||||
scorecard_check_stats | x | |||||
idp_score | x | x | ||||
idp_workflow | x | execute | ||||
idp_tech_doc | x |
Permintaan Tarik
| Tipe Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
pull_request | x | x | x | x | close, merge | |
pr_reviewer | x | x | submit_review | |||
pr_comment | x | x | x | |||
pr_check | x | |||||
pr_activity | x |
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 Daya | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
release_process | x | x | x | x | x | |
release_activity | x | x | x | x | x | |
release | x | x | ||||
release_execution_phase | x | |||||
release_execution_task | x | |||||
release_execution_activity | x | |||||
release_input | x | |||||
release_execution_phase_input | x | |||||
release_execution_phase_output | x | |||||
release_execution_activity_input | x | |||||
release_execution_activity_output | x |
Alur kerja umum:
harness_list(resource_type="release_process", org_id="...", project_id="...")untuk menemukan definisi proses orkestrasi.harness_schema(resource_type="release_process")(ataurelease_activity) sebelum membuat/memperbarui; laluharness_create/harness_updatedenganbody.yaml.harness_list(resource_type="release", org_id="...", project_id="...")untuk menemukan rilis aktif atau terbaru (default pencarian mundur 30 hari; opsionalfilters.status,filters.search_term,filters.days_back).harness_get(resource_type="release", release_id="...")untuk detail rilis.harness_list(resource_type="release_execution_phase", filters={ release_id: "..." })untuk status fase;release_idyang sama untukrelease_execution_taskdanrelease_execution_activity.harness_getpadarelease_input,release_execution_phase_input,release_execution_phase_output,release_execution_activity_output, ataurelease_execution_activity_inputmenggunakanrelease_idplusparams.phase_identifier/params.activity_identifier/activity_execution_idsesuai 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 Daya | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
vibe_project | x | prepare, deploy | ||||
vibe_app_lifecycle | x | events |
API mendukung dua jalur penerimaan. Pertahankan bentuk permintaan asli API ini:
| Sumber yang tersedia untuk agen pengkodean | Alur API |
|---|---|
| Tautan/konektor repositori GitHub | harness_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 ZIP | Panggil prepare dengan nama aplikasi dan metadata file, unggah byte ke target bertanda tangan yang dikembalikan, lalu panggil deploy. |
| Direktori sumber lokal | Agen 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 Daya | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
fme_workspace | x | |||||
fme_environment | x | x | x | x | x | |
fme_feature_flag | x | x | x | x | x | kill, restore, reallocate, archive, unarchive |
fme_feature_flag_definition | x | x | x | x | x | kill, restore, reallocate |
fme_rollout_status | x | |||||
fme_rule_based_segment | x | x | x | x | ||
fme_rule_based_segment_definition | x | x | enable, disable, change_request | |||
fme_traffic_type | x | |||||
fme_identity | x | x | ||||
fme_standard_segment | x | x | ||||
fme_segment_keys | x | x | ||||
fme_segment | x | x | x | x | x | |
fme_segment_definition | x | x | x | x | x | list_keys, add_keys, remove_keys |
fme_metric | x | x | x | x | x | |
fme_event_type | x | x |
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 nilaiworkspace_id). -
fme_environment— mode gandalist(workspace_idatauorg_id+project_id).get/create/update/deletehanya asli Harness (/fme/api/v4/environments) — MCP tidak pernah memiliki kontrakworkspace_iduntuk operasi tersebut. Daftar asli menggunakanoffset/limitopsional (maks 100;harness_listsizedipetakan kelimit); amplop{data, limit, offset, totalCount}dinaikkan keitems/total. Buat/perbarui asli menggunakanisProduction(productionditerima sebagai alias). Pembaruan asli adalah JSON Merge Patch;namedanisProductiontidak dapat dihapus. Nama maksimal 15 karakter. -
fme_feature_flag— mode ganda, kedua cabang terhubung penuh. Asli Harness (org_id+project_id):list/get/create/deletemengenai/fme/api/v4/feature-flags(body untukcreate:name,trafficType, opsionaldescription/tags/owners, perCreateFeatureFlagRequest);updatemengirim merge-patch ke/fme/api/v4/feature-flags/{name};archive/unarchivemengenai/fme/api/v4/feature-flags/{name}/archive|unarchive(hanyacommentopsional — tanpatitle, perArchiveUnarchiveRequest);kill/restore/reallocatemengenai/fme/api/v4/feature-flag-definitions/{name}/kill|restore|reallocatedenganenvironment_idsebagai parameter kueri (opsionalcomment/title, perFeatureFlagDefinitionActionRequest). -
fme_feature_flag_definition—get/create/updatetetap mode ganda (workspace_idatauorg_id+project_id).list/delete/kill/restore/reallocatehanya asli Harness (org_id+project_id) — MCP tidak pernah memiliki kontrakworkspace_iduntuk operasi tersebut. Daftar asli memerlukanfeature_flag_namedan menggunakanoffset/limit(default 100, maks 100); tidak menerimaenvironment_id. Hapus dan eksekusi memerlukanenvironment_id. Kill/restore/reallocate adalah tindakan yang sama seperti padafme_feature_flag. Body get/create/update cocok dengan mode lama (treatments,defaultTreatment,defaultRule, opsionalrules/baselineTreatment/trafficAllocation/comment), plus opsionaltitledalam mode asli Harness. Pembaruan asli adalah JSON Merge Patch. -
fme_rollout_status—listmode ganda. Berikanorg_id+project_id(disarankan) atauworkspace_idyang tidak digunakan lagi. Pagination asli menggunakanoffset/limit(maks 100;harness_listsizedipetakan kelimit); hasil dinaikkan keitems/total. Setiap item memilikiid,name, dan opsionaldescription. -
fme_rule_based_segment— (Tidak digunakan lagi — lihatfme_segment.) Mode asli Harness ditolak pada setiap operasi (list/get/create/delete) — gunakanfme_segmentsebagai gantinya; sumber daya ini hanya mendukung kontrakworkspace_idmode lama. -
fme_rule_based_segment_definition— (Tidak digunakan lagi — lihatfme_segment_definition.) Mode asli Harness ditolak pada setiap operasi/tindakan (list/update/enable/disable/change_request) — gunakanfme_segment_definitionsebagai gantinya (tidak ada padananenable/disable/change_requestdi sana); sumber daya ini hanya mendukung kontrakworkspace_id/environment_idmode lama. -
fme_traffic_type—listmode ganda. Berikanorg_id+project_id(disarankan) atauworkspace_idyang tidak digunakan lagi. Pagination asli menggunakanoffset/limit(maks 100;harness_listsizedipetakan kelimit); hasil dinaikkan keitems/total. Setiap item memilikiiddanname(tanpadisplayAttributeId). -
fme_identity—create/updatebelum diimplementasikan jikaorg_id+project_iddiberikan bersamaan; jika tidak, berjalan sebagai panggilan mode lama normal. -
fme_standard_segment— tidak digunakan lagi.workspace_idmode lama masih mengenai Split v2. Asli Harness ditolak — gunakanfme_segment. -
fme_segment_keys—list/updatetetap mode lama (workspace_id/environment_id+segment_name). Asli Harness (org_id+project_id) ditolak — gunakanfme_segment_definitioneksekusilist_keys/add_keys/remove_keys. -
fme_segment— Hanya asli (org_id+project_id). CRUD.list/get/update/deletememerlukansegment_type:STANDARD|LARGE|RULE_BASED. Body buat:name,trafficType,segmentType; opsionaldescription,tags,owners. -
fme_segment_definition— Hanya asli. CRUD plus eksekusilist_keys/add_keys/remove_keys. Pembaruan hanya deskripsi. Hapus gagal denganhasDependentsselama kunci masih ada. -
fme_metric— Hanya asli Harness (tanpa dukunganworkspace_idmode lama).list/get/create/update/deleteterhubung ke/fme/api/v4/metrics(list'sharness_listsizedipetakan kelimit).creatememerlukanspreadmeskipun backendCreateMetricRequesttetap opsional (defaultPER) — kontrak yang lebih ketat hanya di sisi MCP, karena menghilangkannya secara diam-diam mengubah semantik metrikRATE.updateadalah JSON Merge Patch;name/trafficTypetidak dapat diubah dan tidak diterima.deleteadalah penghapusan permanen (tanpa arsip/pulihkan) — diklasifikasikandestructive. -
fme_event_type— Hanya asli Harness (tanpa dukunganworkspace_idmode lama). Hanya baca:list/getterhubung ke/fme/api/v4/event-types;idadalah nama peristiwa. Hanya tipe peristiwa dengan peristiwa dalam 30 hari terakhir yang terlihat;getmengembalikan 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_listsizedipetakan kelimit). Gunakan ini untuk menemukan ID tipe peristiwa nyata sebelum merujuknya difme_metric'sbaseEventTypes/filterEventTypeatau filterevent_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 Daya | Daftar | Dapatkan | Buat | Perbarui | Hapus | Tindakan Eksekusi |
|---|---|---|---|---|---|---|
gitops_agent | x | x | ||||
gitops_argo_project | x | |||||
gitops_app_project_mapping | x | x | x | x | import | |
gitops_autocreate_log | x | |||||
gitops_application | x | x | sync | |||
gitops_cluster | x | x | ||||
gitops_repository | x | x | ||||
gitops_applicationset | x | x | ||||
gitops_repo_credential | x | x | ||||
gitops_app_event | x | |||||
gitops_pod_log | x | |||||
gitops_managed_resource | x | |||||
gitops_resource_action | x | |||||
gitops_dashboard | x | |||||
gitops_app_resource_tree | x | |||||
gitops_cluster_link | x | x | x |
Chaos Engineering
| Tipe Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
chaos_experiment | x | x | x | x | run, stop | |
chaos_experiment_run | x | |||||
chaos_experiment_variable | x | |||||
chaos_component_variable | x | |||||
chaos_input_set | x | x | x | x | x | |
chaos_experiment_template | x | x | x | create_from_template, list_revisions, get_variables, get_yaml, compare_revisions | ||
chaos_probe | x | x | x | x | enable, verify, get_manifest | |
chaos_probe_in_run | x | |||||
chaos_probe_template | x | x | x | get_variables | ||
chaos_infrastructure | x | |||||
chaos_k8s_infrastructure | x | x | x | check_health | ||
chaos_enabled_infrastructure | x | |||||
chaos_environment | x | |||||
chaos_hub | x | x | x | x | x | |
chaos_hub_fault | x | |||||
chaos_fault | x | x | x | get_variables, get_yaml | ||
chaos_fault_template | x | x | x | list_revisions, get_variables, get_yaml, compare_revisions | ||
chaos_fault_experiment_run | x | |||||
chaos_action | x | x | x | x | get_manifest | |
chaos_action_template | x | x | x | list_revisions, get_variables, compare_revisions | ||
chaos_loadtest | x | x | x | x | x | run, stop |
chaos_service | x | x | x | x | x | list_experiment_runs, list_load_tests |
chaos_application_map | x | x | ||||
discovered_agent | x | |||||
discovered_namespace | x | |||||
discovered_service | x | |||||
discovered_network_map | x | |||||
chaos_guard_condition | x | x | x | |||
chaos_guard_rule | x | x | x | enable | ||
chaos_recommendation | x | x | ||||
chaos_risk | x | x | ||||
chaos_dr_test | x | x | ||||
scanned_risk | x | x | occurrences, summary_by_service | |||
chaos_risk_rule | x | x | ||||
chaos_risk_scan | x | x | x | x | x | retry, abort, report, report_download, heatmap |
Manajemen Biaya Cloud (CCM)
| Tipe Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
cost_perspective | x | x | x | x | x | |
cost_breakdown | x | |||||
cost_timeseries | x | |||||
cost_summary | x | x | ||||
cost_recommendation | x | x | update_state, override_savings, create_jira_ticket, create_snow_ticket | |||
cost_anomaly | x | |||||
cost_anomaly_summary | x | |||||
cost_category | x | x | ||||
cost_account_overview | x | |||||
cost_filter_value | x | |||||
cost_recommendation_stats | x | |||||
cost_recommendation_detail | x | |||||
cost_commitment | x | |||||
ai_budget | x | x | x | x | x | |
ai_budget_overview | x | |||||
ai_budget_consumption | x | |||||
ai_budget_override_request | x | x | x | approve, 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 Resource | Daftar | Ambil | Buat | Perbarui | Hapus | Jalankan Aksi |
|---|---|---|---|---|---|---|
sei_metric | x | |||||
sei_productivity_metric | x | |||||
sei_dora_metric | x | Berikan metric: deployment_frequency, change_failure_rate, mttr, lead_time, atau *_drilldown | ||||
sei_team | x | x | ||||
sei_team_detail | x | Berikan aspect: integrations, developers, integration_filters | ||||
sei_org_tree | x | x | ||||
sei_org_tree_detail | x | x | Berikan aspect: efficiency_profile, productivity_profile, business_alignment_profile, integrations, teams | |||
sei_business_alignment | x | x | Berikan aspect: feature_metrics, feature_summary, drilldown untuk ambil | |||
sei_ai_usage | x | x | Berikan aspect: metrics, breakdown, summary, top_languages | |||
sei_ai_adoption | x | x | Berikan aspect: metrics, breakdown, summary | |||
sei_ai_impact | x | Berikan aspect: pr_velocity, rework | ||||
sei_ai_raw_metric | x |
Jaminan Rantai Pasokan Perangkat Lunak (SCS)
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
scs_artifact_source | x | |||||
artifact_security | x | x | ||||
scs_artifact_component | x | |||||
scs_artifact_remediation | x | |||||
scs_chain_of_custody | x | |||||
scs_compliance_result | x | |||||
code_repo_security | x | x | ||||
scs_sbom | x |
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 Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
attestation | x | x | download |
Orkestrasi Pengujian Keamanan (STO)
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
security_issue | x | |||||
security_issue_filter | x | |||||
security_exemption | x | x | approve, reject | |||
remediation_diff | x |
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_listdenganresource_type="security_exemption"danstatuseksplisit sepertiPending,Approved,Rejected,Expired, atauCanceled. - Gunakan
harness_executedenganaction="approve"danbody.scopeyang diperlukan:CURRENT,ACCOUNT,ORG, atauPROJECT.CURRENTmenyetujui pada lingkup pengecualian yang ada; lingkup lainnya menggunakan endpoint promosi STO secara internal. Server mengisi otomatisbody.approver_iddari pengguna yang diautentikasi saat dihilangkan;body.commentbersifat opsional. - Gunakan
action="reject"untuk menolak pengecualian.body.approver_idjuga diisi otomatis saat dihilangkan. - Tidak ada tindakan eksekusi
promoteterpisah. Gunakanaction="approve"denganbody.scopenon-CURRENTsaat hasil yang diminta adalah persetujuan pada lingkup akun, organisasi, atau proyek.
Kontrol Akses
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
user | x | x | ||||
user_group | x | x | x | x | x | |
service_account | x | x | x | x | ||
role | x | x | x | x | ||
role_assignment | x | x | ||||
resource_group | x | x | x | x | ||
permission | x |
Tata Kelola
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
policy | x | x | x | x | x | |
policy_set | x | x | x | x | x | |
policy_evaluation | x | x |
Pembekuan Penerapan
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
freeze_window | x | x | x | x | x | toggle_status |
global_freeze | x | manage |
Penggantian Layanan
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
service_override | x | x | x | x | x |
Pengaturan
| Tipe Resource | Daftar | Dapatkan | Buat | Perbarui | Hapus | Jalankan Tindakan |
|---|---|---|---|---|---|---|
setting | x |
Prompt MCP
DevOps
| Prompt | Deskripsi | Parameter |
|---|---|---|
build-deploy-app | Alur 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-failure | Analisis 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_summarizer | Ambil 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-pipeline | Buat YAML pipeline baru dari kebutuhan bahasa alami, dengan meninjau sumber daya yang ada untuk konteks | description (wajib), projectId (opsional) |
create-agent | Bangun 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_update | agent_name (wajib), task_description (wajib), org_id (opsional), project_id (opsional) |
onboard-service | Pandu proses onboarding layanan baru dengan environment dan pipeline deployment | serviceName (wajib), projectId (opsional) |
dora-metrics-review | Tinjau metrik DORA (frekuensi deployment, tingkat kegagalan perubahan, MTTR, lead time) dengan klasifikasi Elite/High/Medium/Low dan rekomendasi perbaikan | teamRefId (opsional), dateStart (opsional), dateEnd (opsional) |
setup-gitops-application | Pandu proses onboarding aplikasi GitOps — verifikasi agen, cluster, repositori, dan buat aplikasi | agentId (wajib), projectId (opsional) |
chaos-resilience-test | Rancang eksperimen chaos untuk menguji ketahanan layanan dengan injeksi fault, probe, dan hasil yang diharapkan | serviceName (wajib), projectId (opsional) |
feature-flag-rollout | Rencanakan dan jalankan peluncuran feature flag progresif di seluruh environment dengan gerbang keamanan | flagIdentifier (wajib), projectId (opsional) |
migrate-pipeline-to-template | Analisis pipeline yang ada dan ekstrak template stage/step yang dapat digunakan ulang darinya | pipelineId (wajib), projectId (opsional) |
delegate-health-check | Periksa konektivitas delegate, kesehatan, status token, dan selesaikan masalah infrastruktur | projectId (opsional) |
developer-portal-scorecard | Tinjau scorecard IDP untuk layanan dan identifikasi celah untuk meningkatkan pengalaman pengembang | projectId (opsional) |
pending-approvals | Temukan eksekusi pipeline yang menunggu persetujuan, tampilkan detail, dan tawarkan untuk menyetujui atau menolak | projectId (opsional), orgId (opsional), pipelineId (opsional) |
FinOps
| Prompt | Deskripsi | Parameter |
|---|---|---|
optimize-costs | Analisis data biaya cloud, tampilkan rekomendasi dan anomali, diprioritaskan berdasarkan potensi penghematan | projectId (opsional) |
cloud-cost-breakdown | Analisis mendalam biaya cloud berdasarkan layanan, environment, atau cluster dengan analisis tren dan deteksi anomali | perspectiveId (opsional), projectId (opsional) |
commitment-utilization-review | Analisis pemanfaatan reserved instance dan savings plan untuk menemukan pemborosan dan optimalkan komitmen | projectId (opsional) |
cost-anomaly-investigation | Investigasi anomali biaya — tentukan akar masalah, sumber daya yang terdampak, dan perbaikan | projectId (opsional) |
rightsizing-recommendations | Tinjau dan prioritaskan rekomendasi rightsizing, opsional buat tiket Jira atau ServiceNow | projectId (opsional), minSavings (opsional) |
DevSecOps
| Prompt | Deskripsi | Parameter |
|---|---|---|
security-review | Tinjau masalah keamanan di seluruh sumber daya Harness dan sarankan perbaikan berdasarkan tingkat keparahan | projectId (opsional), severity (opsional, default: critical,high) |
vulnerability-triage | Triase kerentanan keamanan di seluruh pipeline dan artefak, prioritaskan berdasarkan tingkat keparahan dan eksploitabilitas | projectId (opsional), severity (opsional) |
sbom-compliance-check | Audit SBOM dan postur kepatuhan untuk artefak — risiko lisensi, pelanggaran kebijakan, kerentanan komponen | artifactId (opsional), projectId (opsional) |
supply-chain-audit | Audit keamanan rantai pasokan perangkat lunak end-to-end — provenans, rantai kepemilikan, kepatuhan kebijakan | projectId (opsional) |
security-exemption-review | Tinjau pengecualian keamanan yang tertunda dan buat keputusan persetujuan atau penolakan batch | projectId (opsional) |
bulk-exemption-create | Buat pengecualian keamanan yang beralasan untuk beberapa masalah STO dengan panduan cakupan dan durasi yang jelas | projectId (wajib), exemption_type (wajib), reason (wajib), filter masalah (opsional) |
access-control-audit | Audit izin pengguna, akun dengan hak berlebih, dan penetapan peran untuk menegakkan least-privilege | projectId (opsional), orgId (opsional) |
Harness Code
| Prompt | Deskripsi | Parameter |
|---|---|---|
code-review | Tinjau pull request — analisis diff, commit, pemeriksaan, dan komentar untuk memberikan umpan balik terstruktur tentang bug, keamanan, kinerja, dan gaya | repoId (wajib), prNumber (wajib), projectId (opsional) |
pr-summary | Buat judul dan deskripsi PR secara otomatis dari riwayat commit dan diff sebuah branch | repoId (wajib), sourceBranch (wajib), targetBranch (opsional, default: main), projectId (opsional) |
branch-cleanup | Analisis branch di repositori dan rekomendasikan branch basi atau yang sudah digabung untuk dihapus | repoId (wajib), projectId (opsional) |
Sumber Daya MCP
| URI Sumber Daya | Deskripsi | Tipe MIME |
|---|---|---|
pipeline:///{pipelineId} | Definisi YAML pipeline | application/x-yaml |
pipeline:///{orgId}/{projectId}/{pipelineId} | YAML pipeline (dengan cakupan eksplisit) | application/x-yaml |
executions:///recent | Ringkasan 10 eksekusi pipeline terakhir | application/json |
schema:///pipeline | Skema JSON pipeline Harness | application/schema+json |
schema:///template | Skema JSON template Harness | application/schema+json |
schema:///trigger | Skema JSON trigger Harness | application/schema+json |
schema:///pipeline_v1 (Alpha) | Skema JSON pipeline Harness V1 (format stage/langkah yang disederhanakan) | application/schema+json |
schema:///agent-pipeline | Skema JSON pipeline agen AI Harness | application/schema+json |
agent-docs:///legacy-format | Referensi format spesifikasi agen lama (agent.step.group.steps / PLUGIN_TASK), dibaca oleh prompt create-agent saat memperbarui agen format lama yang ada | text/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:
| Toolset | Tipe Resource |
|---|---|
platform | organization, project |
pipelines | pipeline, pipeline_v1, pipeline_dynamic_execution, execution, execution_inputs, trigger, pipeline_summary, input_set, approval_instance |
agents | agent, agent_run |
services | service |
environments | environment |
connectors | connector, connector_catalogue |
infrastructure | infrastructure |
secrets | secret |
logs | execution_log |
audit | audit_event |
delegates | delegate, delegate_token |
repositories | repository, branch, commit, file_content, tag, repo_rule, space_rule |
registries | registry, artifact, artifact_version, artifact_file |
file_store | file_store |
templates | template |
dashboards | dashboard, dashboard_data |
idp | idp_entity, scorecard, scorecard_check, scorecard_stats, scorecard_check_stats, idp_score, idp_workflow, idp_tech_doc |
pull-requests | pull_request, pr_reviewer, pr_comment, pr_check, pr_activity |
feature-flags | fme_workspace, fme_environment, fme_feature_flag, fme_feature_flag_definition, fme_rollout_status, fme_rule_based_segment, fme_rule_based_segment_definition, fme_traffic_type, fme_identity, fme_standard_segment, fme_segment_keys, fme_segment, fme_segment_definition, fme_metric, fme_event_type |
gitops | gitops_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 |
chaos | chaos_experiment, chaos_experiment_run, chaos_experiment_variable, chaos_component_variable, chaos_input_set, chaos_experiment_template, chaos_probe, chaos_probe_in_run, chaos_probe_template, chaos_infrastructure, chaos_k8s_infrastructure, chaos_enabled_infrastructure, chaos_environment, chaos_hub, chaos_hub_fault, chaos_fault, chaos_fault_template, chaos_fault_experiment_run, chaos_action, chaos_action_template, chaos_loadtest, chaos_service, chaos_application_map, discovered_agent, discovered_namespace, discovered_service, discovered_network_map, chaos_guard_condition, chaos_guard_rule, chaos_recommendation, chaos_risk, chaos_dr_test, scanned_risk, chaos_risk_rule, chaos_risk_scan |
ccm | cost_perspective, cost_breakdown, cost_timeseries, cost_summary, cost_recommendation, cost_anomaly, cost_anomaly_summary, cost_category, cost_account_overview, cost_filter_value, cost_recommendation_stats, cost_recommendation_detail, cost_commitment |
sei | sei_metric, sei_productivity_metric, sei_dora_metric, sei_team, sei_team_detail, sei_org_tree, sei_org_tree_detail, sei_business_alignment, sei_ai_usage, sei_ai_adoption, sei_ai_impact, sei_ai_raw_metric |
scs | scs_artifact_source, artifact_security, scs_artifact_component, scs_artifact_remediation, scs_chain_of_custody, scs_compliance_result, code_repo_security, scs_sbom |
evidence-vault | attestation |
sto | security_issue, security_issue_filter, security_exemption, remediation_diff |
dbops | database_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_control | user, user_group, service_account, role, role_assignment, resource_group, permission |
governance | policy, policy_set, policy_evaluation |
freeze | freeze_window, global_freeze |
overrides | service_override |
settings | setting |
knowledge-graph | kg_queryable_type_summary, kg_grammar, hql_query |
semantic-layer | kg_type, kg_related_type |
ai-evals | eval_dataset, eval_dataset_item, evaluation, eval_run, eval_run_item, eval_run_by_eval, eval_metric, eval_metric_set, eval_metric_set_entry, eval_suite, eval_suite_evaluation, eval_suite_run, eval_target, eval_annotation, eval_analytics, eval_git_settings, eval_registry_item, eval_git_registration, online_eval |
observability-evaluations (opsional) | observability_evaluation_rule |
iacm | iacm_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-management | release_process, release_activity, release, release_execution_phase, release_execution_task, release_execution_activity, release_input, release_execution_phase_input, release_execution_phase_output, release_execution_activity_input, release_execution_activity_output |
vibe | vibe_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
- Tools adalah kata kerja generik:
harness_list,harness_get, dst. Mereka menerima parameterresource_typeyang mengarahkan ke endpoint API yang tepat. - Registry memetakan setiap
resource_typekeResourceDefinition— struktur data deklaratif yang menentukan metode HTTP, jalur URL, pemetaan parameter jalur/kueri, dan logika ekstraksi respons. - Dispatch menyelesaikan definisi resource, membangun permintaan HTTP (substitusi jalur, parameter kueri, injeksi akun/org/proyek yang sadar
resource_scope), memanggil API Harness melaluiHarnessClient, dan mengekstrak data respons yang relevan. - Pemfilteran toolset (
HARNESS_TOOLSETS) mengontrol definisi resource mana yang dimuat ke registry saat startup. - Output terstruktur dideklarasikan dengan MCP
outputSchema;harness_listmemaksa array dan pembungkus daftar umum menjadistructuredContentberbentuk objek untuk klien yang ketat. - Deep link secara otomatis ditambahkan ke respons, menyediakan URL UI Harness langsung untuk setiap resource.
- 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:
- LLM memanggil tool tulis dengan risiko
medium_write+ (misalnyaharness_delete,harness_execute pipeline.run). Create/update/read berisiko rendah tidak memunculkan prompt. - Server mengirim permintaan elicitation ke klien dengan ringkasan operasi dan kotak centang
confirm(tercentang secara default). - Pengguna melihat detail dan mengklik Terima (dengan
confirmtercentang) atau Tolak / Batal. - Jika diterima dengan
confirm: true, operasi dilanjutkan. Jika diterima denganconfirmtidak tercentang, ditolak, atau dibatalkan, operasi diblokir dan LLM diberi tahu (penolakan eksplisit bersifat otoritatif dan tidak dilewati olehconfirm: truepada panggilan tool).
Dukungan klien:
| Klien | Dukungan Elicitation |
|---|---|
| Cursor | Ya |
| VS Code (Copilot) | Ya |
| Claude Desktop | Belum |
| Devin Desktop | Belum |
| MCP Inspector | Ya |
Perilaku elicitation bervariasi berdasarkan risiko operasi ketika dukungan klien tidak tersedia:
| Tingkat Risiko | Klien mendukung elicitation | confirm: true diteruskan | Perilaku |
|---|---|---|---|
read, low_write | apa pun | apa pun | Lanjutkan diam-diam — tidak ada prompt yang dimunculkan (confirm tidak berpengaruh pada tingkat risiko ini) |
medium_write, high_write, destructive | Ya | apa pun | Minta 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, destructive | Tidak | Tidak | BLOKIR (kembalikan error dengan petunjuk untuk mencoba ulang dengan confirm: true) |
medium_write, high_write, destructive | Tidak | Ya | Lanjutkan (opt-in eksplisit untuk otomatisasi non-interaktif) |
apa pun (pada atau di bawah HARNESS_AUTO_APPROVE_RISK) | apa pun | apa pun | Setujui 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
| Nilai | Yang disetujui otomatis |
|---|---|
none (default) | Tidak ada — tidak ada ambang persetujuan otomatis |
low_write | Baca + penulisan berisiko rendah |
medium_write | Baca + penulisan berisiko rendah + sedang |
high_write | Baca + penulisan berisiko rendah + sedang + tinggi |
all | Semuanya, termasuk operasi destruktif |
Peringatan mode otonom:
HARNESS_AUTO_APPROVE_RISK=allmelewati konfirmasi untuk semua operasi termasukharness_delete. Gunakan dengan hati-hati dan pertimbangkan untuk memasangkan denganHARNESS_TOOLSETSuntuk membatasi tipe resource mana yang tersedia.
Catatan migrasi:
HARNESS_SKIP_ELICITATION=truemasih didukung dan dipetakan keHARNESS_AUTO_APPROVE_RISK=all. Peringatan deprecation dicatat ke stderr. Jika keduanya diatur,HARNESS_AUTO_APPROVE_RISKyang diutamakan.
Keamanan
- Rahasia tidak pernah diekspos. Tipe resource
secrethanya 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, ataudestructive,harness_create,harness_update,harness_delete, danharness_executemencoba elicitation MCP sebelum melanjutkan (lihat Elicitation). Tindakan berisiko rendah (read,low_write— misalnyapipeline.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, ataudestructive, operasi diblokir alih-alih dieksekusi secara membabi buta. Timpa denganHARNESS_AUTO_APPROVE_RISKuntuk 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.1secara 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
| Gejala | Kemungkinan Penyebab | Yang 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 disimpulkan | Tetapkan HARNESS_ACCOUNT_ID secara eksplisit |
Unknown transport: "..." saat startup | Argumen transport CLI tidak didukung | Gunakan hanya stdio atau http |
Invalid HARNESS_TOOLSETS: ... saat startup | Satu atau lebih nama toolset tidak dikenali | Gunakan hanya nama dari Pemfilteran Toolset (cocok persis) |
HTTP mcp-session-id header is required... | Permintaan sesi dikirim tanpa header sesi | Kirim 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 ditutup | Jalankan ulang initialize untuk membuat sesi baru, lalu coba lagi dengan header baru |
HTTP 405 Method Not Allowed pada /mcp | Metode tidak didukung untuk endpoint MCP | Gunakan hanya POST, GET, DELETE, atau OPTIONS |
HTTP Invalid request | Badan JSON tidak valid atau badan permintaan melebihi HARNESS_MAX_BODY_SIZE_MB | Validasi ukuran/bentuk payload JSON; tingkatkan HARNESS_MAX_BODY_SIZE_MB jika diperlukan |
Unknown resource_type "..." dari tools | Jenis resource salah eja atau difilter melalui HARNESS_TOOLSETS | Panggil harness_describe (dengan search_term opsional) untuk menemukan jenis yang valid |
Missing required field "... for path parameter ..." | Panggilan berbasis proyek/org kehilangan pengidentifikasi | Tetapkan 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 cukup | Berikan 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 allowed | HARNESS_READ_ONLY=true memblokir create/update/delete/execute | Tetapkan HARNESS_READ_ONLY=false jika operasi tulis dimaksudkan |
| Eksekusi pipeline gagal pra-penerbangan dengan input wajib yang belum terselesaikan | inputs yang diberikan tidak mencakup placeholder runtime yang wajib | Ambil 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 berlaku | inputs.build sudah diberikan, sehingga ekspansi shorthand sengaja dilewati | Hapus inputs.build untuk menggunakan ekspansi shorthand, atau pertahankan struktur build eksplisit penuh |
| Eksekusi pipeline memuat revisi YAML yang salah | Definisi pipeline disimpan di Git dan eksekusi tidak menentukan cabang pipeline yang diinginkan | Berikan params.pipeline_branch pada aksi run; ini memetakan ke Harness branch |
wait: true mengembalikan _wait.error | Pemicu pipeline berhasil, tetapi polling sisi server gagal | Periksa ulang execution_id dengan harness_get(resource_type="execution", ...) sebelum memutuskan untuk menjalankan ulang |
wait: true mengembalikan execution_timed_out: true | Eksekusi tidak mencapai status terminal sebelum wait_timeout_seconds | Gunakan execution_id yang dikembalikan untuk memeriksa ulang status; tunggu status terminal sebelum menjalankan harness_diagnose |
| Log eksekusi kosong atau unduhan blob mengembalikan 403 | URL blob log yang dihosting Harness memerlukan jalur klien/auth Harness yang dikonfigurasi, terutama untuk host internal atau self-managed | Jaga 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 user | Pengguna menolak atau membatalkan dialog konfirmasi elicitation — otoritatif | Verifikasi detail operasi dengan pengguna; confirm: true tidak melewati penolakan eksplisit. Pengguna harus menerima prompt |
Operation blocked: the client could not surface a usable confirmation prompt | Klien kekurangan dukungan elicitation, elicitInput gagal, atau mengembalikan penerimaan degeneratif | Coba 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 template | API template mengharapkan payload YAML lengkap | Berikan 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 startup | HARNESS_BASE_URL diatur ke URL HTTP | Gunakan HTTPS, atau tetapkan HARNESS_ALLOW_HTTP=true untuk pengembangan lokal |
Lisensi
MIT