LLMMcp
This server lets agents search the web, fetch readable web content, and diagnose proxy/TLS/browser setup through the machine’s enterprise network path.
web_search: run searches with Google/Bing/Google News fallback, configurable results, language, region, recency, engine, and timeout; returns numbered text plus structured results.web_fetch: retrieve HTTP(S) URLs as markdown, text, or raw HTML; supports link inclusion, character limits, timeouts, pretty-printed JSON, JS-rendered pages, and explicit rejection of binaries/unsupported content.web_diagnose: inspect the resolved proxy label with credentials redacted, TLS mode, browser availability, engine availability, and optionally run a live connectivity probe.
Provides web search through Google without an API key: the Google results page is rendered in a local headless Chrome/Edge instance and the settled DOM is parsed, with each opaque /goto?url=... result link resolved to its real target URL. Exposed as the web_search tool (engine google, or the default in engine=auto).
Provides news search through Google News as a fallback engine of the web_search tool (engine gnews), returning news articles whose result links point at news.google.com/rss/articles/... redirect links.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LLMMcpsearch Google for ascend npu mfu benchmarks and fetch the top page as markdown"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LLMMcp
An MCP server that gives agents two tools over the network this machine actually has:
web_search— Google first (rendered with a local headless browser), with Bing / Google News fallbacks.web_fetch— HTTP(S) retrieval converted to markdown, text or raw HTML.web_diagnose— the proxy, TLS and browser state the server resolved.
Direct sockets are blocked here and every request has to leave through the enterprise proxy, which also terminates TLS with an internal CA. LLMMcp owns that path so agent tools no longer depend on a search-provider API key.
Why this exists
Two failures motivated the project:
The harness built-in
web_fetchcannot reach the internet from this host (TypeError: fetch failed): Node does not use the Windows proxy settings and does not trust the corporate interception CA.The built-in
web_searchneeds a provider API key (DEEPSEEK_API_KEY), which this deployment does not have.
LLMMcp closes both gaps:
Proxy resolution in one place:
LLMMCP_PROXY, thenHTTPS_PROXY/HTTP_PROXY/ALL_PROXY, then the config file, then Windows Internet Settings, withNO_PROXYhonoured. Proxy credentials are never logged.Corporate TLS through
truststore, which reads the Windows certificate store, so interception CAs validate instead of failing.Google without an API key: Google serves a JavaScript-only shell to plain HTTP clients, so the Google engine renders the results page in local headless Chrome or Edge and parses the settled DOM. Google result anchors are opaque
/goto?url=...tokens, and each one is resolved to its real target URL through the redirect'sLocationheader.Offline-testable parsers: every engine is tested against captured HTML fixtures, so the suite runs without network access.
Related MCP server: Web Search MCP Server
Quick start
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"Run the MCP server over stdio, which is what agent clients spawn:
.\.venv\Scripts\python.exe -m llmmcpOr use the one-shot CLI:
.\.venv\Scripts\python.exe -m llmmcp search "ascend npu mfu"
.\.venv\Scripts\python.exe -m llmmcp fetch https://example.com
.\.venv\Scripts\python.exe -m llmmcp diagnoseMCP tools
web_search
Arguments: query (required), max_results (default 8), engine (default
auto; also google, bing, gnews), lang, region, recency
(d/w/m/y), timeout (default 60 s, because a Google render costs a
browser launch).
Returns a numbered text list plus structuredContent shaped as
{query, engine, results: [{title, url, snippet, engine}], elapsed_ms, warnings}.
web_fetch
Arguments: url (required), format (markdown default, or text, html),
max_chars (default 100000, sets truncated when hit), timeout (default 30 s),
include_links.
Returns the content plus structuredContent shaped as
{url, final_url, status, content_type, title, content, truncated, bytes_read, elapsed_ms}.
web_diagnose
Reports the resolved proxy label (never credentials), TLS mode, browser path, engine availability and an optional live connectivity probe.
Configuration
Environment variables win over the config file; the file is read from
$LLMMCP_CONFIG or ~/.llmmcp/config.json.
key | default | meaning |
| unset | explicit proxy URL, overrides everything |
| unset | standard proxy variables |
| unset | bypass list, comma separated |
|
|
|
|
| default request timeout, seconds |
|
| response body cap |
|
| fallback order for |
|
| Google host |
| auto-detected | Chrome or Edge executable used for rendering |
|
| logging verbosity |
Design
src/llmmcp/
settings.py configuration and proxy resolution
http.py the only place that opens sockets
browser.py headless Chrome/Edge DOM rendering
fetch.py URL to markdown/text/html
search/ one module per engine plus the fallback chain
server.py MCP tool definitions
cli.py one-shot commands for humans and smoke testsThe contracts that keep these layers independent live in models.py
(SearchResult, SearchResponse, FetchResponse, LlmmcpError) and
search/base.py (SearchRequest, SearchContext, SearchEngine). Engines never
import the server or the transport; they receive an HttpClient and a render
callable through SearchContext.
Testing
.\.venv\Scripts\python.exe -m pytest -q # offline, fixture based
.\.venv\Scripts\python.exe tools\mcp_smoke.py # MCP stdio handshaketools/mcp_smoke.py speaks raw newline-delimited JSON-RPC, so it verifies the
wire protocol rather than an SDK. Pass --call web_fetch --args-file args.json
to exercise a tool.
Using it from DSH
packages/dsh-web-mcp/ contains a small DSH plugin that registers this MCP
server's search and fetch as ctx.web providers, which makes the harness native
web_search and web_fetch tools run through LLMMcp. See that package's README
for the wiring and rollback steps.
The plugin is also published through a DSH plugin market index,
market/index.json (format 1). Add
https://raw.githubusercontent.com/ai-v5/LLMMcp/main/market/index.json as an
index source in Discover and the plugin installs from this repository, pinned to
a commit; on first load it installs the Python runtime itself, so a fresh machine
needs no manual pip install. Validate the index after editing it:
python tools/validate_market_index.pyLimitations
Google rendering costs a browser launch: a search takes roughly 10 to 15 s on this machine. Other engines answer in about a second.
Google markup is unofficial and can change; the parser reports a clear
GOOGLE_BLOCKEDerror instead of returning empty results.Google News results point at
news.google.com/rss/articles/...redirect links.Only text-like bodies are converted (
text/html,text/plain,application/json,application/xhtml+xml); PDFs and binaries are refused with an explicitUNSUPPORTED_CONTENT_TYPEerror.A page whose plain HTML carries almost no text is rendered once in the headless browser before conversion, so JavaScript documentation sites return content instead of an empty shell. Expect a browser launch (~10-30 s) for those pages.
Repository rules
See AGENTS.md for the working agreements used when developing this repository.
Local configuration and publishing
Hosts, paths and account names that belong to one machine or company never enter the repository:
The proxy, install paths and profile directory are read from
LLMMCP_*environment variables or~/.llmmcp/config.json, which sits outside the checkout, sogit statusstays clean. Seedocs/local-setup.md.Tests use
tests/local_env.py, which falls back to generic placeholders, so a fresh clone passes offline with nothing configured.Before publishing, run the gate:
python tools/check_repo_hygiene.pyIt fails on absolute user paths, corporate e-mail addresses, private proxy hosts, committed profile patches and real-looking credentials in URLs.
License
AGPL-3.0-or-later. See LICENSE.
The license covers the Python MCP server and the DSH bridge plugin in this repository. Running LLMMcp as a network service counts as distribution under the AGPL: if you expose a modified version to other users over a network, section 13 requires offering them the corresponding source.
The releases published before this change (v0.1.0) were released under MIT and
remain available under those terms; every later release is AGPL-3.0-or-later.
Available Tools
3 toolsweb_diagnoseA
Diagnose the local setup: resolved proxy (credentials redacted), TLS mode, browser availability, search engines and an optional live connectivity probe.
| Name | Required | Description | Default |
|---|---|---|---|
| probe | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose the concrete things it inspects plus a useful security note that proxy credentials are redacted. It also signals that the probe performs a live connectivity check. It stops short of stating that the tool is read-only/no-side-effects and how the probe toggles network access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the diagnostic scope front-loaded and zero filler. Every listed item earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and the description adequately covers what the tool reports. It is nearly complete, missing only a note on when to invoke it relative to its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply the meaning of the lone "probe" parameter, and it does by calling it "an optional live connectivity probe." It does not clarify the default (true) or what changes when probe is false, keeping it just short of full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ("Diagnose") with a specific resource ("the local setup") and enumerates exactly what is inspected: resolved proxy, TLS mode, browser availability, search engines, and an optional connectivity probe. This clearly distinguishes it from the sibling web_search and web_fetch action tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer this is for troubleshooting setup when search/fetch misbehave, but the description never states when to run it, when not to, or that it should precede using web_search/web_fetch. No explicit routing or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_fetchB
Fetch a URL and return its readable content. format is markdown (default), text or html; JSON is pretty printed; binaries are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| format | No | markdown | |
| timeout | No | ||
| max_chars | No | ||
| include_links | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that JSON is pretty printed and binaries are rejected, which goes beyond the name, but it says nothing about redirect handling, error responses, timeout behavior, or authentication requirements for protected URLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler, front-loading the core action and then the output-formatting rules. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not needed, and the description covers the format behavior adequately. However, with four undocumented parameters (timeout, max_chars, include_links, url) and no annotations, the definition is incomplete for an agent trying to control request behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must compensate and largely does not. It explains the format parameter's allowed values and default, but leaves url, timeout, max_chars, and include_links entirely unexplained in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Fetch a URL and return its readable content'), which makes the tool's function unambiguous and clearly distinct from a search tool. It does not, however, explicitly contrast itself with the siblings web_search or web_diagnose, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to call when it already has a URL. There is no explicit statement of when to prefer this over web_search or web_diagnose, and no exclusions beyond the implicit 'binaries are rejected' constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchB
Search the web. Returns a numbered list of results (title, URL, snippet) plus structured results. engine='auto' walks the configured fallback chain.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| query | Yes | ||
| engine | No | auto | |
| region | No | ||
| recency | No | ||
| timeout | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return format and the engine='auto' fallback behavior, but it omits important operational details such as rate limits, timeout behavior, authentication needs, and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The core action is front-loaded, followed by the return format and default engine behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists and reduces the need to explain return values, the tool has seven parameters with 0% schema description coverage and no annotations. The description covers purpose and one parameter but is not complete enough for an agent to invoke the tool confidently across all parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for seven parameters. It only explains engine='auto'; it leaves lang, region, recency, timeout, and max_results undocumented, including formats and expected value types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Search the web." It also indicates the return shape (numbered list plus structured results). It does not distinguish the tool from its siblings web_fetch and web_diagnose, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by naming engine='auto' and the configured fallback chain, which helps an agent understand the default engine behavior. However, it gives no explicit guidance on when to use this tool instead of web_fetch or web_diagnose, and it provides no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- First observed
web_diagnose - First observed
web_fetch - First observed
web_search
TDQS
Scored across 3 tools
Each tool targets a distinct operation: web_search retrieves results, web_fetch retrieves content from a URL, and web_diagnose inspects local configuration. There is no overlap in purpose or expected inputs, making selection unambiguous.
All three tools follow the same predictable pattern: a 'web_' prefix plus a clear verb (search, fetch, diagnose). The convention is consistent and self-explanatory.
Three tools is a focused, well-scoped set for a web access server, and each tool has a clear role. It is slightly on the lean side relative to the 3-15 typical range, but nothing feels superfluous or missing at this scale.
The core lifecycle for web access is covered: searching, fetching results, and diagnosing the environment. Minor gaps exist, such as no batch-fetch or multi-URL operations, but these are workarounds rather than blockers.
Maintenance
Related MCP Connectors
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Live web access for agents: scrape, SERP search, crawl/map, 100+ collectors, datasets, proxies.
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Web search and page reading for AI agents, including JSON APIs, RSS feeds and YouTube.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides web search and page fetch capabilities using a browser-based approach, enabling LLMs to search DuckDuckGo, Google, or Yandex and retrieve rendered HTML from URLs.5MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to perform web searches, extract webpage content, and conduct end-to-end search-and-extract operations using multiple search providers and content extraction methods.-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to perform live web searches with ranked results and extracted page passages, plus clean markdown extraction of any URL.MIT
- AlicenseAqualityBmaintenanceEnables agents to search the live web and fetch URLs as clean Markdown, returning ranked search results and paginated page content through two lightweight tools.28 npmMIT