syn-search-mcp
Click on "Install 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., "@syn-search-mcpSearch the web for the latest developments in Rust async runtimes"
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.
🔍 syn-search-mcp
An MCP server that adds web search using Synthetic's Search API. Built for OpenCode, works with any MCP client.
Port of the pi-synthetic-search Pi extension to a standalone MCP server.
Features
synthetic_searchtool — automatically available to the LLM alongside built-in tools4-tier payload control to protect your context window:
Result count limit — caps at 5 results by default (configurable, max 10)
detail_levelparameter — LLM chooses its own tradeoff:summary— title + URL + date only (~50 tokens/result)snippet— + 300-char text excerpt (~100 tokens/result)ai-summary— full text sent to AI summarizer with optional focus prompt (~300-500 tokens total)full— complete untruncated text (LLM opts in for deep reads)
summary_promptparameter — when usingai-summary, the LLM can provide conversation context to focus the summarizer on what mattersOverall truncation — safety net at 2000 lines / 50KB; full output saved to a temp file the LLM can
read
AI Summarizer — uses Synthetic's chat completions API (
syn:small:text) to condense search results into focused, query-relevant summariesGraceful error handling — missing key, 401, 429, network failures
Abort-aware — respects client cancellation (e.g. Esc in OpenCode) during in-flight requests
Related MCP server: Synthetic Web Search MCP Server
Setup
1. Build
cd syn-search-mcp
npm install
npm run buildRequires Node.js 18+.
2. Get a Synthetic API key
Sign up at synthetic.new and grab your API key (starts with syn_).
3. Add to OpenCode
Global — ~/.config/opencode/opencode.jsonc:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"syn-search": {
"type": "local",
"command": ["node", "/path/to/syn-search-mcp/dist/index.js"],
"environment": {
"SYNTHETIC_API_KEY": "{env:SYNTHETIC_API_KEY}"
},
"enabled": true
}
}
}Project-local — same object under mcp in an opencode.json at the project root.
The key is read from SYNTHETIC_API_KEY (set in your shell or passed via the environment block). You can also hardcode it there instead of {env:...}.
4. Restart OpenCode
The tool is exposed as syn-search_synthetic_search. Ask it anything that needs search:
Search the web for the latest TypeScript 5.x featuresTool parameters
Parameter | Type | Default | Description |
| string | (required) | Search terms |
|
|
| Result detail level |
| string | (none) | Context/instructions for the AI summarizer (only used with |
| number |
| Max results to return (1–10) |
detail_level guide
Mode | Output size | Tokens (est.) | Use case |
| ~500B | ~150 | Quick scan — "does anything relevant exist?" |
| ~2KB | ~550 | Relevance check — "is this worth digging into?" |
| ~1-3KB | ~300-500 | Real questions — focused, context-aware extraction |
| Up to 300KB+ | ~66K+ | Deep dive — only when raw content is needed |
ai-summary example
{
"query": "Docker multi-stage builds",
"detail_level": "ai-summary",
"summary_prompt": "User is trying to reduce a Node.js Docker image from 1.2GB to under 200MB. Focus on layer caching, Alpine vs Debian, and COPY vs ADD patterns."
}The summarizer becomes a lightweight sub-agent — the main LLM delegates research focus via summary_prompt, and only relevant info returns to the context window.
Truncation
When output exceeds 2000 lines or 50KB, it's truncated with a notice; the full output is written to a temp file:
[Output truncated: showing 1210 of 8954 lines (48.8KB of 297.3KB).
7744 lines (248.5KB) omitted.
Full output saved to: /tmp/syn-search-mcp-XXXX/search-results.txt
— use the read tool to view it.]Environment variables
Variable | Default | Description |
| (required) | Synthetic API key ( |
|
| Chat model used for |
|
| Truncation line limit |
|
| Truncation byte limit |
| (unset) | Set to |
Error handling
Scenario | Behavior |
| isError result with setup instructions |
Invalid API key (401) | isError result with key-check guidance |
Rate limited (429) | isError result with retry advice |
Network failure | isError result with connection guidance |
Empty results | Informational message (not an error) |
Request cancelled (Esc) |
|
Summarizer returns empty content | isError result suggesting |
Errors return isError: true tool results so the LLM knows the search failed and can react accordingly.
Testing
# smoke test against the live API (uses SYNTHETIC_API_KEY from your env)
node scripts/smoke-test.mjs summary
node scripts/smoke-test.mjs ai-summary
# interactive MCP inspector
npx @modelcontextprotocol/inspector node dist/index.jsLicense
MIT
Available Tools
1 toolsynthetic_searchSynthetic SearchARead-only
Search the web via Synthetic's Search API. Returns top results with titles, URLs, and text snippets. Use detail_level='ai-summary' (recommended for real questions) to get AI-summarized results with an optional summary_prompt to focus on what matters. Use 'full' for complete text. Output truncated to 2000 lines or 50.0KB; full output saved to a temp file when exceeded.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query terms | |
| max_results | No | Max results to return (1-10, default 5) | |
| detail_level | No | Result detail: 'summary' = title+URL only, 'snippet' = +300-char text, 'ai-summary' = AI-summarized with optional focus prompt (default for real questions), 'full' = complete text. Use 'ai-summary' when you need substantive information, provide summary_prompt to focus the summarizer. | |
| summary_prompt | No | Context/instructions for the AI summarizer. When detail_level is 'ai-summary', this tells the summarizer what to focus on based on the conversation context. If omitted, the summarizer uses the query alone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, which the description is consistent with. It adds valuable behavioral context beyond the annotations: the output truncation limit (2000 lines or 50KB), the temp-file fallback when exceeded, and the result format. This is useful operational detail.
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?
Four sentences with no filler; the core purpose is front-loaded before usage guidance and truncation caveats. Each sentence contributes distinct information without redundancy. Appropriately sized for the tool's complexity.
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?
With no output schema, the description correctly carries the burden of explaining return values (titles, URLs, snippets), which it does. It also covers detail_level guidance and truncation behavior. Minor gap: no explicit mention of max_results defaults, but that is covered by the schema. Fairly complete for a search tool.
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 100%, so the schema fully documents all four parameters with descriptions. The description adds modest usage nuance (recommending ai-summary for real questions, noting summary_prompt focuses the summarizer) but largely reinforces what the schema already states. Baseline 3 is appropriate given the schema does the heavy lifting.
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 and resource ('Search the web via Synthetic's Search API') and describes the output format (titles, URLs, text snippets). The purpose is unambiguous and complete. No siblings exist to differentiate from, but the core purpose is fully specified.
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?
Provides explicit internal usage guidance: recommends detail_level='ai-summary' for real questions, 'full' for complete text, and explains when summary_prompt should be supplied. Since no sibling tools are listed, it cannot name alternatives, but the in-tool routing guidance is clear and actionable.
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. Dates show when Glama detected each change.
1 tool update
v1.0.0- First observed
synthetic_search
TDQS
Scored across 1 tool
Only one tool exists, so there is no possibility of confusion or overlap. The tool's purpose is clear and unambiguous.
The tool name 'synthetic_search' follows a clear snake_case verb_noun pattern, which is consistent and descriptive.
With a single tool, the server is minimal but well-scoped for a dedicated search service. While typical counts range 3-15, this is acceptable for a single-purpose API.
The tool covers the full search workflow, including configurable detail levels (summary vs. full text) and output truncation handling, making it comprehensive for its stated domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Provides AI assistants with access to Seltz's powerful Web Search capabilities.
Live AI-native web search with citations. One tool for every MCP client. Flat per-request pricing.
Scrape, crawl and search the web for AI agents via MCP.
Serper MCP — wraps the Serper Google Search API (serper.dev)
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables web search and site-specific search capabilities through the Deepsearch model. Provides unified access to broad web retrieval and targeted site search functionality within the MCP ecosystem.285Apache 2.0
- AlicenseBqualityDmaintenanceExposes the Synthetic API as an MCP tool to enable web searching within Claude and other compatible applications. It provides formatted search results including titles, URLs, and text snippets for enhanced model context.11022MIT
- AlicenseAqualityDmaintenanceProvides privacy-focused web search capabilities with zero-data-retention for MCP-enabled applications. It allows users to execute search queries and retrieve ranked results using the Synthetic Search API.17MIT
- AlicenseAqualityDmaintenanceEnables MCP clients to perform intelligent web searches via Traylinx's Agentic Search API, returning text summaries and structured data like HTML, images, and news.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Camcdonou/syn-search-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server