NLWeb WebMCP MCP A2A

NLWeb vs WebMCP vs MCP: a developer's reference.

How three agent protocols fit together, when to use which, and how to make one site speak all of them.

01The mental model

NLWeb

server · content-first

Agents query your content semantically, server-side.

WebMCP

client · action-first

Agents operate your page in the user's live session.

built on

MCP — Model Context Protocol

the transport-agnostic substrate · tools · resources · prompts

A2A runs on a parallel track — agent-to-agent delegation, not website-to-agent exposure.

Three protocols, three runtime locations. Leave this section with the right picture even if you read nothing else.

NLWeb

Wraps a site's structured content with LLM + vector search and exposes it as an MCP server endpoint — agents query your content semantically.

WebMCP

Exposes live page tools to the user's browser-resident agent via navigator.modelContext — the agent can operate your UI in the user's session.

MCP

A transport-agnostic protocol for exposing tools, resources, and prompts to an LLM — the substrate both NLWeb and WebMCP are built on.

02MCP, the foundation

NLWeb and WebMCP aren't competitors to MCP — they're expressions of it at different runtime locations.

MCP is Anthropic's transport-agnostic protocol for exposing tools, resources, and prompts to an LLM. Both protocols on this page are built on top of it. We won't teach MCP here — the canonical reference is one link away.

modelcontextprotocol.io
03Server-side, content-first

NLWeb

Wraps a site's structured content with LLM + vector search and exposes it as an MCP server endpoint — agents query your content semantically.

Runtime
Server (Python, anywhere)
Origin
Microsoft · May 2025

What it doesn't do

  • Doesn't expose interactive page actions
  • Doesn't run in the user's session
  • Can't fill a form, click a button, or read live page state
04Client-side, action-first

WebMCP

Exposes live page tools to the user's browser-resident agent via navigator.modelContext — the agent can operate your UI in the user's session.

Runtime
Browser tab (the user's session)
Origin
W3C proposal · Chrome 149 origin trial

What it doesn't do

  • Doesn't work headless — a browser tab is required
  • Not discoverable across the web — agents must visit the page first
  • Can't expose content for indexing
05The parallel track

A2A isn't in the same category.

It's agent-to-agent delegation (Google → Linux Foundation; agent cards, skills), not website-to-agent exposure. It matters because agents consuming NLWeb or WebMCP tools may themselves expose A2A endpoints for other agents to delegate to.

06When to use which

The decision table.

The single highest-traffic answer: a scannable Need → Best fit → Why table for every common scenario.

Open the decision guide
07Building a site that speaks both

Indexable content and interactive tools, on one site.

Consistent schemas

Keep tool schemas aligned across the NLWeb and WebMCP surfaces so agents see one coherent product.

Auth boundaries

NLWeb is anonymous-friendly; WebMCP runs inside the authenticated session. Draw the line deliberately.

Discovery gap

NLWeb registries make you findable; WebMCP's must-visit-first limitation means you pair it with discoverable content.

08The same action, two shapes

Server-side semantic query vs. client-side tool registration. Five lines each — you see the difference in shape immediately.

NLWeb server.py
# NLWeb — server, Python, semantic query
@mcp.tool()
def search(query: str) -> list[Result]:
    hits = vector_db.similar(embed(query))
    return rank(hits)  # "query my content"
WebMCP page.js
// WebMCP — client, JS, tool registration
navigator.modelContext.registerTool({
  name: "book_slot",
  description: "Book a time slot on this page",
  async execute({ slotId }) { return ui.book(slotId); },
});
Full demo repo