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.
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.
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.
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.ioNLWeb
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
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
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.
The decision table.
The single highest-traffic answer: a scannable Need → Best fit → Why table for every common scenario.
Open the decision guideIndexable 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.
Server-side semantic query vs. client-side tool registration. Five lines each — you see the difference in shape immediately.
# 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 — 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); },
});