Network interfaces and server for NLWeb - HTTP, MCP, and A2A protocol adapters
Project description
NLWeb Network
Network interfaces and server for NLWeb - provides HTTP, MCP, and A2A protocol adapters.
Overview
nlweb-network provides transport layer adapters that convert protocol-specific requests into a common format for NLWeb handlers, and convert NLWeb outputs back into the appropriate protocol format.
Architecture
┌──────────────────────────────────────────────┐
│ Protocol Adapters │
│ (HTTP SSE, HTTP JSON, MCP SSE, MCP HTTP) │
└──────────────────┬───────────────────────────┘
│
↓
┌─────────────────┐
│ NLWeb Handlers │
│ (Core Package) │
└─────────────────┘
Supported Protocols
HTTP Interfaces
HTTP with Server-Sent Events (Default)
- Endpoint:
/ask(GET/POST) - Parameter:
streaming=true(default) - Use case: Real-time streaming of results as they're generated
curl "http://localhost:8080/ask?query=best+pasta+recipe"
HTTP with JSON Response
- Endpoint:
/ask(GET/POST) - Parameter:
streaming=false - Use case: Get complete results in single JSON response
curl "http://localhost:8080/ask?query=best+pasta+recipe&streaming=false"
MCP (Model Context Protocol) Interfaces
MCP over HTTP (StreamableHTTP)
- Endpoint:
/mcp(POST) - Format: JSON-RPC 2.0
- Use case: Standard MCP integration for tools/agents
# Test with MCP Inspector
npx @modelcontextprotocol/inspector http://localhost:8080/mcp
MCP over Server-Sent Events
- Endpoint:
/mcp-sse(GET/POST) - Format: JSON-RPC 2.0 over SSE
- Use case: Streaming MCP responses in real-time
A2A (Agent-to-Agent) Interfaces
(Coming soon)
Installation
# Install from PyPI (when published)
pip install nlweb-network
# Or install from source
pip install -e packages/network
Usage
Starting the Server
from nlweb_network.server import main
# Start server with default configuration
main()
Or use the command-line entry point:
nlweb-server
Using Interface Adapters
You can use the interface adapters directly in your own applications:
from aiohttp import web
from nlweb_network.interfaces import HTTPJSONInterface, HTTPSSEInterface
from nlweb_core.handler import NLWebHandler
# For non-streaming JSON responses
async def my_handler(request):
interface = HTTPJSONInterface()
return await interface.handle_request(request, NLWebHandler)
# For streaming SSE responses
async def my_streaming_handler(request):
interface = HTTPSSEInterface()
return await interface.handle_request(request, NLWebHandler)
Interface Adapters
All interface adapters inherit from BaseInterface and implement:
parse_request()- Extract query parameters from protocol-specific requestsend_response()- Send data in protocol-specific formatfinalize_response()- Close/finalize the response streamhandle_request()- Complete request/response cycle
Available Interfaces
| Interface | Class | Protocol | Streaming |
|---|---|---|---|
| HTTP JSON | HTTPJSONInterface |
HTTP | No |
| HTTP SSE | HTTPSSEInterface |
HTTP + SSE | Yes |
| MCP StreamableHTTP | MCPStreamableInterface |
JSON-RPC 2.0 | No |
| MCP SSE | MCPSSEInterface |
JSON-RPC 2.0 + SSE | Yes |
Configuration
The server uses configuration from nlweb-core:
# config.yaml
server:
host: localhost
port: 8080
enable_cors: true
Endpoints
/ask - HTTP Query Endpoint
GET/POST - Natural language query with NLWeb RAG pipeline
Parameters:
query(required) - Natural language querysite(optional) - Filter by site (default: "all")num_results(optional) - Number of results (default: 50)streaming(optional) - Enable SSE streaming (default: true)
Examples:
# Streaming (SSE)
curl "http://localhost:8080/ask?query=spicy+snacks&site=seriouseats"
# Non-streaming (JSON)
curl "http://localhost:8080/ask?query=spicy+snacks&streaming=false"
# POST with JSON body
curl -X POST http://localhost:8080/ask \
-H 'Content-Type: application/json' \
-d '{"query": "spicy snacks", "streaming": false}'
/mcp - MCP Protocol Endpoint
POST - JSON-RPC 2.0 requests for MCP protocol
Methods:
initialize- Protocol handshaketools/list- List available toolstools/call- Execute tool (routes to NLWeb handlers)
Example:
curl -X POST http://localhost:8080/mcp \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ask",
"arguments": {"query": "best pasta recipe"}
}
}'
/mcp-sse - MCP with SSE Streaming
GET/POST - MCP protocol with Server-Sent Events
Same as /mcp but streams results via SSE for tools/call.
/health - Health Check
GET - Simple health check
curl http://localhost:8080/health
# {"status": "ok"}
Dependencies
nlweb-core>=0.5.0- Core NLWeb handlers and business logicaiohttp>=3.8.0- Async HTTP serveraiohttp-cors>=0.7.0- CORS support
Development
# Install in editable mode with dev dependencies
pip install -e "packages/network[dev]"
# Run tests
pytest packages/network/tests
License
MIT License - Copyright (c) 2025 Microsoft Corporation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nlweb_network-0.7.0.tar.gz.
File metadata
- Download URL: nlweb_network-0.7.0.tar.gz
- Upload date:
- Size: 19.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1acb495e937f2b3c385c3ed56af6f4b07dc070f5b3e6d9d6f00b723ddfc194f
|
|
| MD5 |
9351632e48a796bbeac30a3fb0d2f729
|
|
| BLAKE2b-256 |
183e5b9b52b855b59e9d1ec55378cf65d4575ed8a832adc3c998049de4128c07
|
File details
Details for the file nlweb_network-0.7.0-py3-none-any.whl.
File metadata
- Download URL: nlweb_network-0.7.0-py3-none-any.whl
- Upload date:
- Size: 25.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f00fda36a0dffa5f474963c4fd8a33138c98cf7049787a8df383b80e3eab41e0
|
|
| MD5 |
5c40f99215c7f3bbc27b40503b3a6854
|
|
| BLAKE2b-256 |
57120cfb6b6a0c5ffff18fc16ef1dc4ce21039982aa60f3164464814a6c3ee6b
|