Marketplace & 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.
What is the Marketplace
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 withPOST /v1/agents/{name}/mcp-servers.
A2A Agent Cards and visibility
Lantern 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. No REST endpoint sets the flag yet; today it is a column on agents that an operator flips.
Visibility rules
- 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.jsonlists onlyis_public = trueagents.
Agent Card endpoints
GET /v1/agents/{name}/card — own agent or is_public; else 404
GET /.well-known/agent.json — lists only public agentsPublishing your agent
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} # unpublishlantern.secret/... refs, which each tenant resolves from its own store at run time.Discovering and forking agents
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}/starA fork is a normal agent in your tenant. Edit its prompt, swap models, add connectors; the original is unaffected.
Cross-tenant invocation (commerce)
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 historyCross-platform interop
- Discovery -- other platforms read
/.well-known/agent.jsonand/v1/agents/{name}/card. Both are limited to public agents (plus your own, when authenticated). - Inbound call --
POST /v1/agents/{name}/a2a/invokerequires 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 Lantern agent by name.