Parallel Search MCP
Server Details
The best web search for your AI Agent
- Status
- Unhealthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
- Server Listing
- Parallel Search MCP
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
- Changed
web_fetch12 fields changed- added
Input schema / properties / objective / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / objective / defaultAdded value: +null - changed
Input schema / properties / objective / descriptionPrevious value: -"What information you're looking for from the URLs."New value: +"Natural-language description of what\ninformation you're looking for from the URLs. Limit to 200 characters." - removed
Input schema / properties / objective / maxLengthRemoved value: -200 - added
Input schema / properties / objective / titleAdded value: +"Objective" - removed
Input schema / properties / objective / typeRemoved value: -"string" - changed
Input schema / properties / urls / descriptionPrevious value: -"URLs to extract content from."New value: +"List of URLs to extract content from. Must be valid\nHTTP/HTTPS URLs. Maximum 10 URLs per request." - removed
Input schema / properties / urls / items / formatRemoved value: -"uri" - removed
Input schema / properties / urls / maxItemsRemoved value: -10 - added
Input schema / properties / urls / titleAdded value: +"Urls" - added
Input schema / titleAdded value: +"extract_toolArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ExtractError": { + "description": "Extract error details.", + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Content returned for http client or server errors, if any.", + "title": "Content" + }, + "error_type": { + "description": "Error type.", + "title": "Error Type", + "type": "string" + }, + "http_status_code": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "HTTP status code, if available.", + "title": "Http Status Code" + }, + "url": { + "title": "Url", + "type": "string" + } + }, + "required": [ + "url", + "error_type", + "http_status_code", + "content" + ], + "title": "ExtractError", + "type": "object" + }, + "ExtractResult": { + "description": "Extract result for a single URL.", + "properties": { + "excerpts": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Relevant excerpted content from the URL, formatted as markdown.", + "title": "Excerpts" + }, + "full_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Full content from the URL formatted as markdown, if requested.", + "title": "Full Content" + }, + "publish_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Publish date of the webpage in YYYY-MM-DD format, if available.", + "title": "Publish Date" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Title of the webpage, if available.", + "title": "Title" + }, + "url": { + "description": "URL associated with the search result.", + "title": "Url", + "type": "string" + } + }, + "required": [ + "url" + ], + "title": "ExtractResult", + "type": "object" + }, + "UsageItem": { + "description": "Usage item for a single operation.", + "properties": { + "count": { + "description": "Count of the SKU.", + "examples": [ + 1 + ], + "title": "Count", + "type": "integer" + }, + "name": { + "description": "Name of the SKU.", + "examples": [ + "sku_search_additional_results", + "sku_extract_excerpts" + ], + "title": "Name", + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "title": "UsageItem", + "type": "object" + }, + "Warning": { + "description": "Human-readable message for a task.", + "properties": { + "detail": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional detail supporting the warning.", + "title": "Detail" + }, + "message": { + "description": "Human-readable message.", + "title": "Message", + "type": "string" + }, + "type": { + "description": "Type of warning. Note that adding new warning types is considered a backward-compatible change.", + "enum": [ + "spec_validation_warning", + "input_validation_warning", + "warning" + ], + "examples": [ + "spec_validation_warning", + "input_validation_warning" + ], + "title": "Type", + "type": "string" + } + }, + "required": [ + "type", + "message" + ], + "title": "Warning", + "type": "object" + } + }, + "description": "Fetch result.", + "properties": { + "errors": { + "description": "Extract errors: requested URLs not in the results.", + "items": { + "$ref": "#/$defs/ExtractError" + }, + "title": "Errors", + "type": "array" + }, + "extract_id": { + "description": "Extract request ID, e.g. `extract_cad0a6d2dec046bd95ae900527d880e7`", + "title": "Extract Id", + "type": "string" + }, + "results": { + "description": "Successful extract results.", + "items": { + "$ref": "#/$defs/ExtractResult" + }, + "title": "Results", + "type": "array" + }, + "usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/UsageItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Usage metrics for the extract request.", + "title": "Usage" + }, + "warnings": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Warnings for the extract request, if any.", + "title": "Warnings" + } + }, + "required": [ + "extract_id", + "results", + "errors" + ], + "title": "ExtractResponse", + "type": "object" +}
- Removed
web_search - Added
web_search_preview
3 tool updates
- Changed
web_fetch12 fields changed- removed
Input schema / properties / objective / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / objective / defaultRemoved value: -null - changed
Input schema / properties / objective / descriptionPrevious value: -"Natural-language description of what\ninformation you're looking for from the URLs. Limit to 200 characters."New value: +"What information you're looking for from the URLs." - added
Input schema / properties / objective / maxLengthAdded value: +200 - removed
Input schema / properties / objective / titleRemoved value: -"Objective" - added
Input schema / properties / objective / typeAdded value: +"string" - changed
Input schema / properties / urls / descriptionPrevious value: -"List of URLs to extract content from. Must be valid\nHTTP/HTTPS URLs. Maximum 10 URLs per request."New value: +"URLs to extract content from." - added
Input schema / properties / urls / items / formatAdded value: +"uri" - added
Input schema / properties / urls / maxItemsAdded value: +10 - removed
Input schema / properties / urls / titleRemoved value: -"Urls" - removed
Input schema / titleRemoved value: -"extract_toolArguments" - changed
Output schema / (root)Previous value: -{ - "$defs": { - "ExtractError": { - "description": "Extract error details.", - "properties": { - "content": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Content returned for http client or server errors, if any.", - "title": "Content" - }, - "error_type": { - "description": "Error type.", - "title": "Error Type", - "type": "string" - }, - "http_status_code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "HTTP status code, if available.", - "title": "Http Status Code" - }, - "url": { - "title": "Url", - "type": "string" - } - }, - "required": [ - "url", - "error_type", - "http_status_code", - "content" - ], - "title": "ExtractError", - "type": "object" - }, - "ExtractResult": { - "description": "Extract result for a single URL.", - "properties": { - "excerpts": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Relevant excerpted content from the URL, formatted as markdown.", - "title": "Excerpts" - }, - "full_content": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Full content from the URL formatted as markdown, if requested.", - "title": "Full Content" - }, - "publish_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Publish date of the webpage in YYYY-MM-DD format, if available.", - "title": "Publish Date" - }, - "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Title of the webpage, if available.", - "title": "Title" - }, - "url": { - "description": "URL associated with the search result.", - "title": "Url", - "type": "string" - } - }, - "required": [ - "url" - ], - "title": "ExtractResult", - "type": "object" - }, - "UsageItem": { - "description": "Usage item for a single operation.", - "properties": { - "count": { - "description": "Count of the SKU.", - "examples": [ - 1 - ], - "title": "Count", - "type": "integer" - }, - "name": { - "description": "Name of the SKU.", - "examples": [ - "sku_search_additional_results", - "sku_extract_excerpts" - ], - "title": "Name", - "type": "string" - } - }, - "required": [ - "name", - "count" - ], - "title": "UsageItem", - "type": "object" - }, - "Warning": { - "description": "Human-readable message for a task.", - "properties": { - "detail": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional detail supporting the warning.", - "title": "Detail" - }, - "message": { - "description": "Human-readable message.", - "title": "Message", - "type": "string" - }, - "type": { - "description": "Type of warning. Note that adding new warning types is considered a backward-compatible change.", - "enum": [ - "spec_validation_warning", - "input_validation_warning", - "warning" - ], - "examples": [ - "spec_validation_warning", - "input_validation_warning" - ], - "title": "Type", - "type": "string" - } - }, - "required": [ - "type", - "message" - ], - "title": "Warning", - "type": "object" - } - }, - "description": "Fetch result.", - "properties": { - "errors": { - "description": "Extract errors: requested URLs not in the results.", - "items": { - "$ref": "#/$defs/ExtractError" - }, - "title": "Errors", - "type": "array" - }, - "extract_id": { - "description": "Extract request ID, e.g. `extract_cad0a6d2dec046bd95ae900527d880e7`", - "title": "Extract Id", - "type": "string" - }, - "results": { - "description": "Successful extract results.", - "items": { - "$ref": "#/$defs/ExtractResult" - }, - "title": "Results", - "type": "array" - }, - "usage": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/UsageItem" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Usage metrics for the extract request.", - "title": "Usage" - }, - "warnings": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Warning" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Warnings for the extract request, if any.", - "title": "Warnings" - } - }, - "required": [ - "extract_id", - "results", - "errors" - ], - "title": "ExtractResponse", - "type": "object" -}New value: +null
- Added
web_search - Removed
web_search_preview
2 tool updates
- Changed
web_fetch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ExtractError": { + "description": "Extract error details.", + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Content returned for http client or server errors, if any.", + "title": "Content" + }, + "error_type": { + "description": "Error type.", + "title": "Error Type", + "type": "string" + }, + "http_status_code": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "HTTP status code, if available.", + "title": "Http Status Code" + }, + "url": { + "title": "Url", + "type": "string" + } + }, + "required": [ + "url", + "error_type", + "http_status_code", + "content" + ], + "title": "ExtractError", + "type": "object" + }, + "ExtractResult": { + "description": "Extract result for a single URL.", + "properties": { + "excerpts": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Relevant excerpted content from the URL, formatted as markdown.", + "title": "Excerpts" + }, + "full_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Full content from the URL formatted as markdown, if requested.", + "title": "Full Content" + }, + "publish_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Publish date of the webpage in YYYY-MM-DD format, if available.", + "title": "Publish Date" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Title of the webpage, if available.", + "title": "Title" + }, + "url": { + "description": "URL associated with the search result.", + "title": "Url", + "type": "string" + } + }, + "required": [ + "url" + ], + "title": "ExtractResult", + "type": "object" + }, + "UsageItem": { + "description": "Usage item for a single operation.", + "properties": { + "count": { + "description": "Count of the SKU.", + "examples": [ + 1 + ], + "title": "Count", + "type": "integer" + }, + "name": { + "description": "Name of the SKU.", + "examples": [ + "sku_search_additional_results", + "sku_extract_excerpts" + ], + "title": "Name", + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "title": "UsageItem", + "type": "object" + }, + "Warning": { + "description": "Human-readable message for a task.", + "properties": { + "detail": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional detail supporting the warning.", + "title": "Detail" + }, + "message": { + "description": "Human-readable message.", + "title": "Message", + "type": "string" + }, + "type": { + "description": "Type of warning. Note that adding new warning types is considered a backward-compatible change.", + "enum": [ + "spec_validation_warning", + "input_validation_warning", + "warning" + ], + "examples": [ + "spec_validation_warning", + "input_validation_warning" + ], + "title": "Type", + "type": "string" + } + }, + "required": [ + "type", + "message" + ], + "title": "Warning", + "type": "object" + } + }, + "description": "Fetch result.", + "properties": { + "errors": { + "description": "Extract errors: requested URLs not in the results.", + "items": { + "$ref": "#/$defs/ExtractError" + }, + "title": "Errors", + "type": "array" + }, + "extract_id": { + "description": "Extract request ID, e.g. `extract_cad0a6d2dec046bd95ae900527d880e7`", + "title": "Extract Id", + "type": "string" + }, + "results": { + "description": "Successful extract results.", + "items": { + "$ref": "#/$defs/ExtractResult" + }, + "title": "Results", + "type": "array" + }, + "usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/UsageItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Usage metrics for the extract request.", + "title": "Usage" + }, + "warnings": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Warnings for the extract request, if any.", + "title": "Warnings" + } + }, + "required": [ + "extract_id", + "results", + "errors" + ], + "title": "ExtractResponse", + "type": "object" +}
- Changed
web_search_preview2 fields changed- changed
Input schema / titlePrevious value: -"web_search_previewArguments"New value: +"search_toolArguments" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "UsageItem": { + "description": "Usage item for a single operation.", + "properties": { + "count": { + "description": "Count of the SKU.", + "examples": [ + 1 + ], + "title": "Count", + "type": "integer" + }, + "name": { + "description": "Name of the SKU.", + "examples": [ + "sku_search_additional_results", + "sku_extract_excerpts" + ], + "title": "Name", + "type": "string" + } + }, + "required": [ + "name", + "count" + ], + "title": "UsageItem", + "type": "object" + }, + "Warning": { + "description": "Human-readable message for a task.", + "properties": { + "detail": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional detail supporting the warning.", + "title": "Detail" + }, + "message": { + "description": "Human-readable message.", + "title": "Message", + "type": "string" + }, + "type": { + "description": "Type of warning. Note that adding new warning types is considered a backward-compatible change.", + "enum": [ + "spec_validation_warning", + "input_validation_warning", + "warning" + ], + "examples": [ + "spec_validation_warning", + "input_validation_warning" + ], + "title": "Type", + "type": "string" + } + }, + "required": [ + "type", + "message" + ], + "title": "Warning", + "type": "object" + }, + "WebSearchResult": { + "description": "A single search result from the web search API.", + "properties": { + "excerpts": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Relevant excerpted content from the URL, formatted as markdown.", + "title": "Excerpts" + }, + "publish_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Publish date of the webpage in YYYY-MM-DD format, if available.", + "title": "Publish Date" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Title of the webpage, if available.", + "title": "Title" + }, + "url": { + "description": "URL associated with the search result.", + "title": "Url", + "type": "string" + } + }, + "required": [ + "url" + ], + "title": "WebSearchResult", + "type": "object" + } + }, + "description": "Output for the Search API.", + "properties": { + "results": { + "description": "A list of WebSearchResult objects, ordered by decreasing relevance.", + "items": { + "$ref": "#/$defs/WebSearchResult" + }, + "title": "Results", + "type": "array" + }, + "search_id": { + "description": "Search ID. Example: `search_cad0a6d2dec046bd95ae900527d880e7`", + "title": "Search Id", + "type": "string" + }, + "usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/UsageItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Usage metrics for the search request.", + "title": "Usage" + }, + "warnings": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/Warning" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Warnings for the search request, if any.", + "title": "Warnings" + } + }, + "required": [ + "search_id", + "results" + ], + "title": "SearchResponse", + "type": "object" +}
1 tool update
- Changed
web_search_preview1 field changed- changed
Input schema / properties / search_queries / descriptionPrevious value: -"(optional) List of keyword search queries of 1-6\n words, which may include search operators. The search queries should be related to the\n objective. Limited to 5 entries of 200 characters each."New value: +"List of keyword search queries of 3-6\n words, which may include search operators. The search queries should be related to the\n objective. Limited to 3 entries of 100 characters each."
2 tool updates
- First observed
web_fetch - First observed
web_search_preview
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Agent-native search engine with live web research optimized for AI agents.
Web search for AI agents — one tool across 6 engines, routed to the cheapest + cached.
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Live web search for AI agents. $0.001/call, x402 on Base, no API key.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides web search and content extraction for AI agents.MIT
- AlicenseNot gradedqualityCmaintenanceWeb search, clean page reading & one-call research dossiers for AI agents. No API key — your agent does the synthesis.124MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to perform live web searches with ranked results and extracted page passages, plus clean markdown extraction of any URL.MIT
- AlicenseAqualityBmaintenanceWeb search for AI agents across 6 engines (Serper, Brave, Exa, Tavily, Firecrawl, Perplexity) through one search tool. Routes each query to the cheapest engine that clears a quality bar and caches repeats. Hosted, streamable-HTTP, BYOK supported.11MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
web_fetch and web_search_preview serve clearly distinct purposes: one fetches content from specific URLs, the other performs web searches. No overlap or ambiguity.
Both tools follow a consistent 'web_' prefix and verb_noun pattern (fetch, search_preview). No mixing of conventions.
Two tools is the minimum viable set for search/fetch functionality, which feels slightly thin but well-scoped for the stated purpose of parallel search and content extraction.
The set covers the core workflow of searching and fetching content. Minor gaps exist (e.g., no URL listing or multi-source aggregation), but the essentials are present.