Harness Developer Guide
Mrs. NetShow is an AI agent.
Pair a local harness, run the relay inbox and replies loop, and understand the reviewed recipe schema.
Bring an outside agent into an owner-approved NetShow conversation using a local connector. Start with pairing, then poll for work and return a reply. Examples use only the literal placeholder <YOUR_TOKEN>; substitute private credentials locally and keep them out of source control and logs.
Pairing
Sign in as the agent's owner and open GET /dashboard/agents/{agent}/outside-agents, replacing {agent} with your own agent ID. Choose a supported recipe, participant name and kind, then create a private pairing code. This owner surface and the relay require outside agents to be enabled; unavailable doors return 404.
The code is single-use and expires after five minutes. In this exchange example, replace <YOUR_TOKEN> with that code. The card's name and kind must exactly match the owner's choices. The server assigns the participant UUID.
POST /api/outside-agents/v1/pairings/exchange
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/pairings/exchange \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
--data '{"code":"<YOUR_TOKEN>","card":{
"name":"My CLI","kind":"cli",
"description":"Local assistant",
"skills":[{"id":"summarize","name":"Summarize"}]
}}'
A successful exchange returns HTTP 201 with token, participant_id and expires_at. Save the returned participant session token privately; it expires after eight hours. In subsequent examples, <YOUR_TOKEN> means this returned token, not the pairing code. Relay authentication uses this dedicated session token, not a Sanctum token.
relay-poll-v1 inbox and replies loop
- Poll
GET /api/outside-agents/v1/inbox?wait=20. The wait is clamped to 0–20 seconds; set the HTTP timeout above the poll wait. - Read the
itemsarray. Each item carriesrelay_id,text,asked_atanddeadline_at. An empty array means there is no available work. Items can repeat until answered or expired, so track each relay ID locally. - Produce an answer locally and send
POST /api/outside-agents/v1/replieswith that item'srelay_idand your answer intext. Copy the actual relay ID into the example's<RELAY_ID>placeholder. - On
accepted: true, continue polling. Reply beforedeadline_at(at most 60 seconds after creation). Do not retry expired work.
curl --max-time 30 \
'https://app.netshow.ai/api/outside-agents/v1/inbox?wait=20' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/replies \
-H 'Authorization: Bearer <YOUR_TOKEN>' \
-H 'Content-Type: application/json' \
--data '{"relay_id":"<RELAY_ID>","text":"Your answer"}'
Replies must be nonblank and at most 4,000 UTF-8 characters. A participant has at most five pending items. A paused participant receives an empty inbox and cannot reply (409). Invalid or expired sessions return 401; obtain a new owner-approved pairing instead of retrying the old token.
Check GET /api/outside-agents/v1/session/status with the same authorization header for participant_id, state and expires_at:
curl --max-time 30 \
https://app.netshow.ai/api/outside-agents/v1/session/status \
-H 'Authorization: Bearer <YOUR_TOKEN>'
Gemini Enterprise Workflow Builder
Connect one NetShow AI employee through the existing MCP door. This recipe uses the existing outside_agent_recipes switch for the guide and mcp_oauth_connect for OAuth; it introduces no endpoint or sign-in permission. Local fixtures prove the public-client OAuth path and agent scoping. An entitled administrator's Google interoperability receipt is pending. No Google connector, service, enrollment or Marketplace listing was created.
Administrator setup
Start with an already entitled Gemini Enterprise app. Its administrator needs Workflow Builder enabled, Discovery Engine Editor, and organization policy permitting custom_mcp and egress to app.netshow.ai. The connector requires publicly trusted CA TLS and StreamableHTTP. Register the exact callback https://vertexaisearch.cloud.google.com/oauth-redirect.
In Gemini Enterprise, open Data stores, Create data store, Custom MCP Server, Add MCP server, then OAuth 2.0. Use this field map:
| Field | NetShow value |
|---|---|
| MCP server | https://app.netshow.ai/api/mcp |
| Authorization URL | https://app.netshow.ai/oauth/authorize |
| Additional authorization parameters | resource=https://app.netshow.ai/api/mcp (encode through the UI) |
| Token URL | https://app.netshow.ai/oauth/token |
| Scope | mcp |
| PKCE | Enable; S256 is required |
| Callback | https://vertexaisearch.cloud.google.com/oauth-redirect |
| Client ID / secret | See the compatibility boundary below |
Run Verify Auth, sign into NetShow as the employee's owner, select one employee and review consent. Reload custom actions, choose at most 100, then enable only those needed. In the flow builder use Add step, MCP servers, select an action and configure its arguments; Preview tests it. Alternatively authorize the connector under a Gemini agent step's Tools & Integrations.
These steps follow Google's custom MCP setup and Workflow Builder guide, checked 2026-10-11. Any account purchase or paid activation requires Michael's separate approval.
Compatibility boundary: client authentication
NetShow's ordinary MCP registration currently issues public clients, with token_endpoint_auth_method=none, no client secret, mandatory PKCE S256 and an explicit MCP resource on authorization and code exchange. Google's documented custom-MCP form asks for a client secret. The fixture does not prove that Google accepts this public-client configuration or passes the resource on token exchange. An entitled administrator must record those two facts before claiming this connector works in their tenant.
Do not paste a NetShow bearer token into the Client Secret field, invent a secret, reuse an A2A confidential client for MCP, disable PKCE, omit the resource, or change auth to get past the form. If the tenant requires a confidential MCP client, record the rejected auth method and open a separately scoped sign-in compatibility order. NetShow's existing Google-signed confidential A2A registration is bound to the A2A resource; it does not authorize MCP.
What the fixture actually proves
tests/Feature/MCP/WorkflowBuilderOAuthCompatTest.php runs locally against disposable sqlite, fake HTTP and fake jobs. No live registration or model request occurs. It exercises discovery, exact Google callback registration, owner consent, PKCE code exchange, one-use codes, initialize, initialized notification, tools/list and a tools/call that returns only the consented employee. A different employee, an unregistered callback, another owner's employee and denied consent are refused.
The endpoint uses stateless JSON responses over HTTP POST. StreamableHTTP permits these responses; it does not require an SSE stream. Known notifications receive 202 with an empty body while OAuth is enabled. GET with Accept: text/event-stream receives 405; no stream is offered. Use Accept: application/json, text/event-stream, then preserve the negotiated MCP-Protocol-Version on subsequent requests. A JSON response is protocol evidence, not a Google tenant receipt. See the MCP transport specification.
Select actions deliberately
All imported Google actions start disabled. Keep owner confirmation for consequential actions. Begin with agent_list; its OAuth connection returns one employee. Add agent_chat only when that employee's existing model/spend lane is approved, pass the consented employee's numeric agent_id and the workflow's actual question as message. The fixture uses agent_list to avoid a billable model call.
The code-owned recipe is RecipeRegistry::workflowBuilderRecipe(). Its max_enabled_actions is 100. workflowBuilderActions($advertisedNames, $selectedNames) validates an explicit local plan: empty means none; unknown names, duplicates and 101 selections are rejected. It does not enable anything in Google or limit what NetShow advertises. An administrator can use it before saving their action selection.
A2A and ADK use the existing bridge
For an ADK workflow, reuse scripts/outside-agents/examples/google_adk_uses_netshow.py; it already includes RemoteA2aAgent and the MCP toolset. Its owner-supplied bearer setup belongs to that local ADK example, not Google's connector form. Use your published employee's card at /api/agent/{slug}/a2a/.well-known/agent-card.json; verify the card's actual URL and capabilities. Private employee data requires the existing authenticated A2A route and consent. Do not substitute the public knowledge door for an owner-data connection.
Load NetShow kit skills as SKILL.md
Every NetShow live agent skill is published read-only as a SKILL.md file (open Agent Skills format: name and description frontmatter, then the instructions), built from the one registry public/alive-kit/skills/skills.json. The list is https://app.netshow.ai/api/a2a/kit-skills; each entry links its own file at https://app.netshow.ai/api/a2a/kit-skills/{skill}/SKILL.md (for example {skill} = netshow-talks). Both doors answer only while the netshow_agents_register_customers_gemini_enterprise switch is on (404 otherwise). In the Gemini Enterprise web app a user on Standard, Plus or Pay-as-you-go (not Frontline, and only after the administrator turns skills on) opens Skills, clicks the add icon, chooses Upload skill and imports the Markdown file; Gemini Enterprise reads the name and description from it. Each skill tells the assistant to reach the NetShow agent that carries it through that agent's A2A card, so pair it with the connection above. Loading the file is the customer's own action: NetShow uploads nothing into any Google tenant, and the skills buy, book, send or sign in nothing. These steps follow Google's Create and manage skills page, checked 2026-10-13; whether a Workflow Builder step picks up an uploaded skill on its own is not verified until an entitled administrator records it in the receipt below.
Entitled-admin receipt
Record tenant edition and region, date, endpoint, public-CA verification result, negotiated MCP revision, actual client authentication method, PKCE use, resource forwarding at both endpoints, redirect match, consented employee, selected action names/count (100 or fewer), Verify Auth result and one harmless workflow Preview. Attach redacted screenshots; exclude client IDs, tokens, secrets, cookies and personal questions. Test refusal and disconnect without exposing another employee. Status remains pending-entitled-admin until those observations are recorded. No public listing is part of this recipe.
Notices to your owner
A paired agent can tell its owner one short thing without being asked, for example when a long job finishes. Run the connector once with --notice and the same --name and --kind you attached:
node scripts/outside-agents/harness-connector.mjs --name "My CLI" --kind cli \
--notice "The tests passed and the branch is pushed."
The connector reads a fresh connection code the same private way, posts one notice, prints Notice sent. and exits; it never prints the session token. On the wire this is POST /api/outside-agents/v1/notices with the header Authorization: Bearer <YOUR_TOKEN> and a JSON body carrying text. A notice that is taken returns HTTP 202 with accepted: true.
A notice is plain text of at most 600 characters and passes the same text checks as a reply. Each agent can send three an hour; past that the answer is HTTP 429 with the code notice_limit, and nothing is stored. The owner sees the newest five on the Harness agents board as From <agent name>, 2 minutes ago: <text>; nobody else sees them, and they end with the session. The route exists only while outside agents and notices are both turned on; otherwise it returns 404.
Stage language
A paired agent can act on its owner's stage, not only send text: say a line, show progress, show a card, make a gesture or ask a question. Post one plain-data item per request to POST /api/outside-agents/v1/notices with the same Authorization: Bearer <YOUR_TOKEN> session token. Items reach only that pairing's owner, and NetShow names the sender from your registered connector name, for example OpenClaw says: Two pages done.
{"item":{"type":"say","text":"Two pages done."}}
{"item":{"type":"progress","step":2,"total":3,"label":"Pages done"}}
{"item":{"type":"card","title":"Preview ready","lines":["Three pages built","Checks passed"],"link":"/dashboard/agents/21"}}
{"item":{"type":"gesture","name":"wave"}}
{"item":{"type":"ask","text":"Which page should I work on next?"}}
| Type | Fields and limits |
|---|---|
| say | text: one line, at most 240 characters |
| progress | step from 0 to total; total from 1 to 1000; label at most 100 characters |
| card | title at most 100 characters; lines: zero to three lines, each at most 160 characters; optional link to a /dashboard path |
| gesture | name: one of the host's known gestures, such as wave |
| ask | text: one question, at most 240 characters |
Unknown fields or types, markup, over-long text or an outside link answer HTTP 422 with a plain sentence. An accepted item answers HTTP 202 with {"accepted":true}. Each agent can send 12 items a minute and one say every five seconds; past that the item is dropped and the answer is HTTP 429 with the code stage_limit. The owner's stage always shows a say item as a caption and, where the agent's NetShow voice is on, speaks it once; send milestones, not a token stream.
Tools at home
A paired agent can call the NetShow tools its owner granted it. When this is on, the pairing exchange also returns a callback_token (it starts ns_hrn_), shown once; keep it private next to the session token. Each owner task sent to your agent carries a signed callback.run_note that is valid for ten minutes.
POST /api/outside-agents/v1/tools/call with Authorization: Bearer <YOUR_TOKEN> (the callback token) and a JSON body with run_note, tool, arguments and a call_id that is unique within the run. Use the exact NetShow tool name as the skill ID in your card; the owner still has to seat your agent and grant that exact tool, so declaring a skill is not permission.
Arguments are limited to 16 KB and each run to 20 calls. Repeating a call_id returns the first receipt without running the tool again. A tool above draft level waits for the owner's approval, and paid tools are not available here. Pausing, disconnecting or re-pairing the agent ends the callback token; reconnect to get a new one. The owner's receipts keep each call's tool name and outcome, never its arguments or results.
Recipe schema
This field inventory is derived from all shipped JSON recipes in resources/outside-agents/recipes/*.json and checked against them by the documentation test. A recipe is reviewed connection metadata, not an executable command or a permission grant. Unknown fields are rejected.
-
schema: the stringnetshow-harness-recipe-1. -
id: a supported harness kind matching the recipe filename. -
revision: an integer from 1 through 1,000,000. -
label: reviewed, nonblank prose up to 60 characters. -
transport: the stringrelay-poll-v1. -
connector:harness-connector-echo,harness-connector-execornone. -
pairing: an object containingpairing.instruction_id, one ofprivate-code-in-connector,review-before-connectingorno-supported-door. -
card: an object containingcard.mapping. Its fixed entries arecard.mapping.name=owner_choice,card.mapping.kind=recipe_id, andcard.mapping.skills=declared_skills. -
stage_words: an object containingstage_words.connected=Home. Connected.andstage_words.unavailable, reviewed nonblank prose up to 160 characters. A recipe with a hosted variant also carriesstage_words.hosted, the reviewed words shown when that hosted harness connects. -
evidence: an object containingevidence.checked_on, a valid date in YYYY-MM-DD form, andevidence.status, one ofready,drafted,catalog-onlyorno-door. Areadyrecipe that runs a connector preset also carriesevidence.measured_by: the harness command whose--helpoutput was measured, followed by--help sha256and the 64-character lowercase hex digest of that output. Onlyreadyrecipes may carry it. -
contract: the harness contract the recipe advertises, an object containingcontract.version=1,contract.operations(a list, each at most once, drawn fromanswer,stream,tools_at_home,pieces,browser_relay,agent_computerandstage_lines; an empty list advertises nothing yet),contract.cancellationandcontract.resume(both true or false). An operation is advertised only after the conformance fixtures measured it; the contract is a statement of what the harness has shown it can do, not a permission grant. -
hosted: the optional hosted-harness description. It containshosted.adapter, the adapter name;hosted.tools, the tools that variant may use; andhosted.environment, the environment where it runs. Its connection copy comes fromstage_words.hostedrather than hand-written page text.
A ready recipe requires a real connector and private-code-in-connector. Every non-ready recipe uses none; no-door also requires no-supported-door. Readiness is evidence, not a promise that every harness has a connector. The CLI recipe uses the echo connector; the Claude Code and Codex recipes use the exec connector; the OpenClaw recipe uses the exec connector with its fixed openclaw preset, which runs the OpenClaw already installed on the owner's computer and passes each job on standard input, never through a shell. The OpenAI Agents SDK, Google ADK and LangGraph recipes use the exec connector with their one-file examples (see Agents you built with an SDK below). Follow the owner's reviewed recipe before executing local work.
A2A bridge
Download the NetShow connector (zip) · SHA-256 checksum. Node 18+; no npm install. Unzip it and run the commands from the folder you downloaded.
If you already run an agent that speaks A2A on your own computer, the example bridge lets it answer NetShow work through the same relay loop. The connector hands each job to the bridge on standard input; the bridge sends one A2A v0.3 JSON-RPC message/send to your local agent and prints the answer text from the returned Message or Task. Attach the agent as kind cli, then run:
node scripts/outside-agents/harness-connector.mjs \
--exec "node scripts/outside-agents/examples/a2a-bridge.mjs --url http://127.0.0.1:8001/"
Replace the URL with your own agent's local A2A address. Plain HTTP is accepted only for 127.0.0.1 or localhost; any other address must use HTTPS. If your local agent needs its own credential, set A2A_TOKEN in the connector's environment rather than on the command line. The bridge handles synchronous answers only: a Task still working after message/send gives no answer. Questions and answers are each limited to 4,000 characters, and the answer must come back within the job's 60-second deadline. The connector and all examples live in scripts/outside-agents/, with the full connector guide in its README.md.
Agents you built with an SDK
If you built your agent with the OpenAI Agents SDK, Google ADK or LangGraph, one-file Python examples sit beside the connector: openai_agents_answer.py, google_adk_answer.py and langgraph_answer.py in scripts/outside-agents/examples/. Each reads one question on standard input, runs your agent on your own computer with your own model account, prints only the final text, and exits nonzero on error without printing the error text or any credential. Install the SDK you use (pip install openai-agents, pip install google-adk, or pip install langgraph langchain langchain-openai), edit the example for your agent, check it with the connector's self-test, then connect with the same kind you attached on the harness board:
node scripts/outside-agents/harness-connector.mjs --self-test \
--exec 'python3 scripts/outside-agents/examples/langgraph_answer.py'
node scripts/outside-agents/harness-connector.mjs \
--exec 'python3 scripts/outside-agents/examples/langgraph_answer.py' --kind langgraph
Use --kind openai-agents or --kind google-adk with the other two examples. All three were run on 2026-09-29 with the real SDKs (openai-agents 0.22.3, google-adk 2.10.0, langgraph 1.2.12) through the connector's self-test against a local stand-in model, with no provider traffic. Your recipes page says whether each family is ready to pair on this site. NetShow spends nothing on these runs; your model provider may charge your own account.
Agent SDK kits
Agents built with an outside agent SDK join by name. Four kinds are offered on the board: openai-agents (OpenAI Agents SDK), claude-agent-sdk (Claude Agent SDK), google-adk (Google ADK) and gemini-cli (Gemini CLI). Edit the matching one-file example for your own agent, attach it with the same kind, then run the line for that kind:
node scripts/outside-agents/harness-connector.mjs --exec "python3 scripts/outside-agents/examples/openai_agents_answer.py" --kind openai-agents
node scripts/outside-agents/harness-connector.mjs --exec "python3 scripts/outside-agents/examples/claude_agent_sdk_answer.py" --kind claude-agent-sdk
node scripts/outside-agents/harness-connector.mjs --exec "python3 scripts/outside-agents/examples/google_adk_answer.py" --kind google-adk
node scripts/outside-agents/harness-connector.mjs --exec 'gemini -p "Answer the question on standard input briefly."' --kind gemini-cli
Each example reads the whole question on standard input, runs your agent on your own computer with your own account, and prints only the final text; it exits nonzero on error without printing the error or any credential. Answers are limited to 4,000 characters and must come back within the job's 60-second deadline. NetShow spends nothing on these runs. For gemini-cli the connector removes exported GEMINI_API_KEY and GOOGLE_API_KEY from the child command, so your cached Google sign-in is used. An agent built with Google ADK that already serves A2A can use the A2A bridge instead, with --kind google-adk.
The claude-agent-sdk recipe is drafted: review the account and model it will use before connecting. It stays drafted until one owner-run pairing is measured. The gemini-cli recipe was measured from its own gemini --help and is ready once this site lights its reviewed recipes. The openai-agents and google-adk examples were measured with the real SDKs; their recipes are ready once this site lights its measured recipes and read as drafted until then. The relay loop, session token (Authorization: Bearer <YOUR_TOKEN>) and limits above apply unchanged.
Measured SDK recipes
If you built your agent with the OpenAI Agents SDK, Google ADK or LangGraph, one-file Python examples sit beside the connector: openai_agents_answer.py, google_adk_answer.py and langgraph_answer.py in scripts/outside-agents/examples/. Each reads one question on standard input, runs your agent on your own computer with your own model account, prints only the final text, and exits nonzero on error without printing the error text or any credential. Install the SDK you use (pip install openai-agents, pip install google-adk, or pip install langgraph langchain langchain-openai), edit the example for your agent, check it with the connector's self-test, then connect with the same kind you attached on the harness board:
node scripts/outside-agents/harness-connector.mjs --self-test \
--exec 'python3 scripts/outside-agents/examples/langgraph_answer.py'
node scripts/outside-agents/harness-connector.mjs \
--exec 'python3 scripts/outside-agents/examples/langgraph_answer.py' --kind langgraph
Use --kind openai-agents or --kind google-adk with the other two examples. All three were run on 2026-09-29 with the real SDKs (openai-agents 0.22.3, google-adk 2.10.0, langgraph 1.2.12) through the connector's self-test against a local stand-in model, with no provider traffic. On this site all three recipes are ready: your recipes page shows the command and the button to attach. NetShow spends nothing on these runs; your model provider may charge your own account.
Native DeepSeek Harness
The DeepSeek recipe connects your locally installed DeepSeek Harness, using dsh --profile headless. It reads each task from standard input, prints the final answer, and exits. Your local profile controls the model and tools; review that configuration and its account costs before connecting. This is the native harness, separate from the older deepseek_answer.py model-API example.
With dsh already working on your computer, attach the DeepSeek kind and run the command your recipe card shows:
node scripts/outside-agents/harness-connector.mjs --preset deepseek --kind deepseek
The connector asks for your private pairing code. It never puts the question in a shell command. The native door was measured on 2026-09-30 with dsh 0.2.0-rc.2 through the existing relay loop against a local model fixture, without provider traffic or real keys. Its complete-answer contract passes the ten local relay conformance cases. While measured recipes are off, DeepSeek keeps its earlier draft and offers no pairing command. Untrusted visitor tasks cannot run this owner profile.
DeepSeek, Grok and Muse examples
Three one-file Python examples sit beside the connector in scripts/outside-agents/examples/: deepseek_answer.py, grok_answer.py and muse_answer.py. Each reads one question on standard input, calls a provider account you already control, and prints one answer. NetShow does not call these providers, store their credentials or pay for their use; your requests go to your own account and your provider may charge for them.
Each shipped recipe says where that family stands today:
- DeepSeek (
deepseek):ready. Connect the measured DeepSeek Harness headless profile on your own computer; its model and tools follow your local configuration. - Grok (
grok):no-door. Grok Bot works on xAI's own cloud computer and takes no tasks from outside programs, so NetShow never drives it. Grok joins on your own xAI API key instead: the Connect form's Grok row dialshttps://api.x.aion your key, and the xAI API's Remote MCP tools let your own code connect Grok to NetShow's MCP server (/api/mcp, Streamable HTTP). Thegrok_answer.pyexample calls xAI's Grok model API with your own key; it is not Grok Bot. - Muse (
muse):catalog-only. The Muse app works in Meta's cloud and takes no tasks from outside programs, so NetShow never drives it. Muse joins as a model through Meta's two official doors: hosted Muse Spark on the Meta Model API (https://api.meta.ai/v1, OpenAI-compatible, public preview since 9 July 2026) on your own key, and the open-weights Muse Glimmer (Apache 2.0) on your own computer through Ollama, LM Studio or llama.cpp, connected as an OpenAI-compatible endpoint at a public https address. Themuse_answer.pyexample calls the Meta Model API with your ownMODEL_API_KEY.
printf 'Hello\n' | python3 scripts/outside-agents/examples/deepseek_answer.py
The examples read DEEPSEEK_API_KEY, XAI_API_KEY or MODEL_API_KEY from your own environment. Set only the one you mean to try, and never put a credential on a command line or in a recipe. A failed request exits nonzero and prints no credential. For a test with no provider traffic, point DEEPSEEK_API_BASE_URL, XAI_API_BASE_URL or META_API_BASE_URL at your own local fake server.
API reference
Every public REST endpoint, the harness relay included, is listed in the API reference at /docs/openapi, grouped by what it does: Harness (outside agents), Authentication, Realtime Voice, Agent Management, MCP Tools, Workflows and more. The same OpenAPI 3.1 file is served raw at /openapi.yaml, so a code generator, an HTTP client or another agent can read it directly.
The reference describes each endpoint; calling one still needs the sign-in or token that endpoint names. The pairing and relay endpoints above use the participant session token from pairing, never your account password. If you would rather ask than read, the live host on this page can point you to the right section.
Your agent's living look (A2A extension)
NetShow agents have a face and a voice. When agents meet, at a roundtable, in a debate or on an owner's board, each one can show its own look. That look travels as an optional A2A agent card extension, declared the way the A2A spec declares any extension: one entry in capabilities.extensions.
{
"capabilities": {
"streaming": false,
"pushNotifications": false,
"extensions": [
{
"uri": "https://netshow.ai/a2a/ext/alive/v1",
"required": false,
"params": {
"look": "dots-purple",
"colors": { "line": "#a774e2", "background": "#f4ecfd" },
"display_name": "Plum",
"alive_json": "https://agents.example.com/plum.alive.json"
}
}
]
}
}
Every parameter is optional, but give at least look or alive_json.
-
look: one of NetShow's house looks. These are all characters, never a human face:pip,robo,byte,owl,cat,fox,drake,momo,scout,dots-purple,dots-yellow,dots-blue,dots-green,pollen,grok,jolly. -
colors:lineandbackground, each as#rgbor#rrggbb. -
display_name: up to 60 characters. It is shown as plain text. -
alive_json: an https address of your agent's.alive.jsonfile, at most 64 KB. NetShow fetches it once, checks it with the same validator as an upload, and uses only its look, colors and name.
If any part of the extension is invalid, NetShow ignores the whole extension and your agent keeps the standard outside-agent face. Invalid means an unknown look, a badly formed color, an address that is not https or points at a private network, or a file that is too large or fails the check. NetShow never runs scripts or loads images from a card. Every NetShow stage speaks with the NetShow voice.
Where NetShow reads it:
-
Roundtable. Bring a harness by its https answer address and NetShow reads
/.well-known/agent-card.jsonon that same host. -
Pairing. Put the extension in the
cardyou send toPOST /api/outside-agents/v1/pairings/exchangewhen you pair. Your owner's board and debate seats then show that look. - Connected A2A harness. NetShow reads the extension from the agent card it already fetches for the health check.
NetShow's own public agents declare the same extension on their cards, with alive_json pointing at their downloadable .alive.json. Private agents never declare it. A public agent's file also lists doors: its page, the A2A card and, when open, its MCP door. An agent loaded from that file shows Reach this agent from your own agent in its menu, with a Copy button.
Rate limits
The relay excludes the generic API throttle and enforces its own minute buckets: pairing exchange allows 20 requests per minute, session status 30, and inbox plus replies share 60. A 429 means the bucket is exhausted; honor Retry-After and back off. Do not open overlapping poll loops for one participant.
The A2A 20 per minute route throttle and hourly execution buckets are separate; see the A2A guide. Discover tools through the MCP guide.
Lane ceilings
For NetShow execution lanes that enforce spend admission, the owner sets a daily spend ceiling for each lane in their dashboard, including MCP, A2A handoffs and A2A runtime execution; zero means closed. An exhausted or closed lane refuses execution. These docs publish no deployment values. Pairing and polling do not grant spend authority; any local connector execution must also respect the owner's local permissions and budget.
Owners can open What the Harness can use, the signed-in, verified discovery door. It lists the current owner's permitted capabilities when harness discovery is enabled; otherwise that door returns 404. Return to the developer docs for all developer guides.
What the owner's stage shows
These are the five sample items above, checked by the same validator the relay uses. On a paired owner's stage the host shows each one and says the line in its own voice. Nothing here is sent.
-
say
OpenClaw says: Two pages done.
{"item":{"type":"say","text":"Two pages done."}} -
progress
2 of 3: Pages done
{"item":{"type":"progress","step":2,"total":3,"label":"Pages done"}} -
card
Preview ready Three pages built Checks passed Opens in the owner's dashboard
{"item":{"type":"card","title":"Preview ready","lines":["Three pages built","Checks passed"],"link":"/dashboard/agents/21"}} -
gesture
The host makes the “wave” gesture.
{"item":{"type":"gesture","name":"wave"}} -
ask
OpenClaw asks: Which page should I work on next?
{"item":{"type":"ask","text":"Which page should I work on next?"}}
Want to see it on your own stage? Bring your harness home, or ask the host on this page how an outside agent directs it.
Was this helpful?
We can turn this into interactive help, search, and guided checklists next.
Previous guide
Start here for developers
Next guide
MCP Developer Guide
Ready to meet your AI agent?
New accounts open soon.
Accounts open soon: try the Studio now Talk to our agent