Skip to content

Marketplace and A2A

Publish an agent, fork someone else’s into your tenant, or call a published agent without forking it. A2A agent cards make public agents discoverable by other platforms.

A2A (Agent-to-Agent) is an open protocol for agents to find and call each other; an agent card is the public description an agent publishes. A fork is your private copy.

In the dashboard, Marketplace sits under the Workspace section. Two registries sit behind it:

  • Agent Marketplace: published agents (/v1/marketplace). Filter by category or search text; star, fork, or unpublish your own. Listings carry a description, tags, README, star and fork counts.
  • MCP Marketplace: a curated registry of Model Context Protocol servers (/v1/mcp/servers). Attach one to an agent with POST /v1/agents/{name}/mcp-servers.

PAL implements the Agent-to-Agent (A2A) protocol for cross-platform agent discovery. Agents are private by default (agents.is_public = false). The card, the well-known directory, and A2A invoke only expose an agent to a non-owner when it is marked public.

  • An authenticated caller always sees and can invoke their own agents regardless of visibility.
  • A card or invoke for another tenant’s agent returns 404 (not 403) when the agent is not public, to avoid leaking that the agent exists.
  • GET /.well-known/agent.json lists only is_public = true agents.
GET /v1/agents/{name}/card — own agent or is_public; else 404
GET /.well-known/agent.json — lists only public agents

Publishing copies the agent’s manifest into the public registry under a slug. There is no review queue and no unlisted mode; a listing is live as soon as the call returns.

POST /v1/marketplace/publish
{
"agentName": "research-agent",
"description": "Cited research reports",
"category": "research",
"tags": ["research", "web"],
"readme": "..."
}
DELETE /v1/marketplace/{slug} # unpublish
GET /v1/marketplace?category=research&q=citations
GET /v1/marketplace/{slug} # manifest, card, README
POST /v1/marketplace/{slug}/fork { "newName": "my-copy" }
POST /v1/marketplace/{slug}/star

A fork is a normal agent in your tenant. Edit its prompt, swap models, add connectors; the original is unaffected.

A buyer can invoke a published agent without forking it. The run executes in the seller’s tenant, with their LLM keys and budgets. The seller’s hard-fail budget applies (HTTP 402), and the buyer’s input is validated against the manifest’s inputSchema when one exists. The buyer gets the output and an HMAC-SHA256 signed receipt.

POST /v1/marketplace/{slug}/invoke
{ "input": { "topic": "..." } }
Receipt fields: invocationId, buyerTenant, sellerTenant, marketplace,
agentName, runId, costUsd, issuedAt, signature, algorithm
GET /v1/marketplace/invocations?role=buyer # buyer-side history
GET /v1/marketplace/invocations?role=seller # seller-side history
  • Discovery: other platforms read /.well-known/agent.json and /v1/agents/{name}/card. Both are limited to public agents (plus your own, when authenticated).
  • Inbound call: POST /v1/agents/{name}/a2a/invoke requires an authenticated caller; it returns 401 without credentials.
  • Outbound call: inside a running agent, ctx.a2a(agentCardUrl).submit({ input }) calls a remote A2A agent through the runtime sidecar (production runtime only). ctx.subagent(name, input) calls another agent by name.