Mercury MCP Server
Enables searching Amazon products using the SurfSense connector in the surf_sense_search tool.
Enables web searches through Google using the SurfSense connector in the surf_sense_search tool.
Enables searching job listings on Indeed using the SurfSense connector in the surf_sense_search tool.
Enables searching Instagram content using the SurfSense connector in the surf_sense_search tool.
Enables searching Reddit content using the SurfSense connector in the surf_sense_search tool.
Enables searching TikTok content using the SurfSense connector in the surf_sense_search tool.
Enables searching Walmart products using the SurfSense connector in the surf_sense_search tool.
Enables searching YouTube content using the SurfSense connector in the surf_sense_search tool.
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., "@Mercury MCP ServerSearch for the latest AI news and give me the top headlines."
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.
Mercury MCP Server
A Model Context Protocol (MCP) server exposing three tools to any MCP-compatible host (Claude Desktop, Cursor, etc.). It runs as a local Python process over stdio — no database, no REST API, no Docker Compose, no separate frontend.
Overview
The server exposes three tools:
Tool | Purpose |
| Live web research via the SurfSense REST API (with a mock fallback when not configured). |
| Local transcript / text processing — extracts headlines, word count, and top keywords. |
| 3D office visualization — returns an iframe URL when enabled, otherwise a text summary. |
Configuration is done entirely via environment variables (optionally loaded from a .env file).
SDK note: the
mcpPython SDK removed the low-level@app.list_tools()/@app.call_tool()decorator API in 2.x. This project uses the current low-levelmcp.server.ServerAPI, passing the handlers ason_list_tools/on_call_toolconstructor arguments. The three tool names, descriptions, and input schemas are identical to the design. (FastMCPwas also renamed toMCPServerin 2.x.)
Related MCP server: Google Search MCP Server
Requirements
Python 3.11+
Setup
Create and activate a virtual environment, then install the package with its dependencies:
# from the project root (this directory)
python -m venv .venv
# activate: Windows (Git Bash / cmd)
source .venv/Scripts/activate
# activate: macOS / Linux
# source .venv/bin/activate
# install the package in editable mode (installs mcp, requests, python-dotenv, pytest)
pip install -e ".[dev]"
[dev]includespytest. If you did not install with thedevextra, runpip install pytestandpip install -e .separately.
Optional: copy the environment template and fill in your keys:
cp .env.example .envEnvironment variables
Variable | Default | Description |
|
| Base URL of the SurfSense API. |
|
| SurfSense workspace ID (required to enable live search). |
|
| SurfSense API key. |
|
| Directory of |
|
| When |
|
| URL embedded in the iframe. |
|
| Logging level. |
Running the server
Run the stdio server directly:
python -m mercury_mcp.serveror via the installed console script:
mercury-mcpBecause it is an MCP stdio server it is normally launched by your MCP host rather than run interactively. See MCP server config below.
The three tools
surf_sense_search
Live web search via SurfSense. When SURFSENSE_API_KEY and SURFSENSE_WORKSPACE_ID are both
set it performs a real scrape; otherwise it returns deterministic mock data.
Input schema: query (required string) and connector (optional, default google_search,
one of google_search, reddit, youtube, web_crawl, amazon, walmart, google_maps,
indeed, tiktok, instagram).
{
"query": "latest AI news",
"connector": "google_search"
}Output: JSON with source, query, and items (each item has title and content).
ghost_pepper_process
Process a transcript or arbitrary text. If text is empty, it reads the most recently
modified .md file in GHOST_PEPPER_TRANSCRIPT_DIR.
Input schema: text (optional string).
{
"text": "We discussed AI trends and new features. The roadmap is approved. Next step is rollout."
}Output: JSON with headlines (up to 3 sentences), word_counts, top_terms (up to 5
keyword/count pairs), and the full transcript.
hermes_3d_visualize
Turn processed data into a 3D office visualization. When HERMES3D_ENABLED=true it returns an
HTML <iframe> pointing at HERMES3D_OFFICE_URL; otherwise it returns a short text summary.
Input schema: data (required object, e.g. the result of ghost_pepper_process).
{
"data": { "headlines": ["We discussed AI trends", "Roadmap approved"] }
}Output: iframe HTML or a text string.
Tests
pytest -qMCP server config (section 8)
Add the server to your MCP client configuration. Example for
openmausbot:
{
"mcpServers": {
"mercury": {
"command": "python",
"args": ["-m", "mercury_mcp.server"],
"env": {}
}
}
}Use the full path to your venv's Python if python is not on the host's PATH. For instance,
on Windows the venv interpreter is typically:
.venv/Scripts/python.exe under the project root. You can also inject environment variables
via the "env" block, or rely on the .env file (loaded automatically on startup).
Project layout
.
├── pyproject.toml
├── README.md
├── .env.example
├── .gitignore
├── src/
│ └── mercury_mcp/
│ ├── __init__.py
│ ├── server.py
│ ├── config.py
│ └── tools/
│ ├── __init__.py
│ ├── surfsense.py
│ ├── ghostpepper.py
│ └── hermes3d.py
├── tests/
│ ├── test_surfsense.py
│ ├── test_ghostpepper.py
│ └── test_hermes3d.py
└── examples/
└── openmausbot_mcp_config.jsonAvailable Tools
3 toolsghost_pepper_processA
Process a transcript or text and extract headlines, word count, and keywords
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Transcript text (if empty, reads latest from configured directory) |
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 discloses the output artifacts (headlines, word count, keywords) but does not state whether it is read-only, what permissions or config it depends on, or how large inputs are handled. Adequate but with clear behavioral gaps.
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 efficient sentence that front-loads the verb, resource, and output. No filler and nothing that fails to earn 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?
For a simple single-parameter tool with no output schema, the description covers the input forms (transcript or text) and the return contents (headlines, word count, keywords). It omits output format and behavioral caveats, but is largely complete for a tool of this complexity.
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?
There is only one parameter and schema description coverage is 100%; the schema already explains that an empty 'text' reads the latest from the configured directory. With 0 required parameters, the baseline is 4, and the description adds no contradictory or redundant parameter detail.
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?
States a specific verb ('process') plus a concrete resource ('transcript or text') and enumerates exactly what it extracts: headlines, word count, and keywords. Distinct from the siblings (a search tool and a visualization tool), so an agent can differentiate without opening schemas.
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 schema note that an empty text 'reads latest from configured directory' implies a default usage path, but the description itself gives no when-to-use, when-not-to-use, or alternative guidance. Usage is only loosely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hermes_3d_visualizeC
Generate a 3D visualization (iframe) from processed data
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Processed data JSON (as returned by ghost_pepper_process) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full behavioral burden, yet it only hints that the result is an iframe. It does not disclose whether it returns HTML/URL, renders inline, writes a file, requires specific permissions, or has side effects.
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 front-loaded sentence with no wasted words. It is efficient, though its brevity comes at the cost of the behavioral detail noted elsewhere.
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?
For a tool with a nested object parameter, no annotations, and no output schema, the description is too thin. It does not explain the return value or rendering behavior, leaving the agent without enough context to invoke it confidently.
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?
There is one parameter with 100% schema description coverage, so the schema already documents it. The description adds marginal value by indicating the data should be 'processed' output, but gives no format or structural detail beyond what the schema and its note (ghost_pepper_process) provide.
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+resource: generate a 3D visualization from processed data, and even names the output format (iframe). It does not explicitly differentiate itself from siblings like ghost_pepper_process, though 'from processed data' implies the pipeline order.
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?
There is no explicit when-to-use guidance or mention of alternatives. The phrase 'from processed data' weakly implies the prerequisite that data must first be processed, but nothing states when this tool should or should not be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_sense_searchC
Search the web using SurfSense
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| connector | No | google_search |
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 and delivers almost nothing. It implies a read-only retrieval but does not disclose that results are routed through a chosen connector (including heavier operations like web_crawl), nor any auth, rate-limit, or result-shape behavior.
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 short sentence with no wasted words, but that brevity comes at the cost of under-specification rather than disciplined economy. It is not front-loaded with any decision-relevant information.
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?
For a tool whose entire behavior depends on a 10-value connector enum, the description is far too thin. With no output schema and no annotations, the description should at minimum explain the connector choices and expected return; it does neither.
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 only 50%, and the undocumented parameter is the important one: 'connector' is a 10-value enum with no description in the schema and no mention in the tool description. The description fails to explain that this parameter selects the search backend, leaving a major semantic gap unfilled.
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 verb+resource ("Search the web") is specific enough to understand the operation, but "using SurfSense" is vendor branding that adds nothing. It gives no differentiation from siblings and says nothing about the multi-source nature of the search (Google, Reddit, YouTube, Amazon, etc.), which is the defining trait of this tool.
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?
There is no guidance on when to use this tool, when not to, or what alternatives exist. An agent must infer usage entirely from the name and schema, with no stated context or exclusions.
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.0- First observed
ghost_pepper_process - First observed
hermes_3d_visualize - First observed
surf_sense_search
TDQS
Scored across 3 tools
Each tool targets a clearly distinct action: web search, transcript/text processing, and 3D visualization. There is no functional overlap between them, so an agent will not confuse surf_sense_search with ghost_pepper_process or hermes_3d_visualize.
All three follow a consistent <brand>_<action> snake_case pattern (surf_sense_search, ghost_pepper_process, hermes_3d_visualize), which is predictable. However the opaque brand prefixes (ghost_pepper, hermes) reduce readability and hint at product-specific naming rather than a clean verb_noun convention.
Three tools is on the thin side but each maps to a distinct stage of a search -> process -> visualize pipeline, so none feels redundant. It is reasonable for a focused media/analysis server, though slightly under-scoped for standalone use.
The set implies a pipeline (search, process, visualize) but lacks ways to retrieve or persist intermediate results, configure the pipeline, or manage prior runs. Core stages exist but there are notable gaps that could force agents to work around missing operations.
Maintenance
Related MCP Connectors
Live AI-native web search with citations. One tool for every MCP client. Flat per-request pricing.
Verified business OSS MCP for search, RSS, crawling, documents, browser, media and transcription.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides comprehensive search capabilities including web search, content extraction, news search, academic search, and AI-powered multi-source research. Enables natural language access to web content and research through a production-ready MCP server.-
- AlicenseBqualityNot gradedmaintenanceProvides advanced Google Custom Search functionality, web content extraction, and specialized research tools such as search analytics, multi-site search, and fact checking. Works as an MCP server compatible with any MCP client.10MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to perform live web searches across 9 engines, scrape web pages into clean formats, and run agentic research with citations via MCP.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables web search, browser control, weather queries, file clipboard operations, and memory search through MCP.MIT