Search1API MCP Server
Search1API MCP 서버
Search1API를 사용하여 검색 및 크롤링 기능을 제공하는 MCP(Model Context Protocol) 서버입니다.
필수 조건
노드.js >= 18.0.0
유효한 Search1API API 키(키를 얻고 구성하는 방법은 아래 설정 가이드 참조)
Related MCP server: WebSearch-MCP
설치(독립형/일반)
저장소를 복제합니다.
지엑스피1
API 키 구성: 빌드하기 전에 Search1API 키를 제공해야 합니다. 다양한 방법(예:
.env파일 또는 환경 변수 사용)은 아래 설정 가이드 섹션을 참조하세요.종속성을 설치하고 빌드합니다.
npm install npm run build참고: API 키에 프로젝트의
.env파일 방법을 사용하는 경우 이 단계 전에 해당 파일이 있는지 확인하세요.
사용법(독립형/일반)
API 키가 구성되었는지 확인하세요( 설정 가이드 참조).
서버를 시작합니다:
npm start그러면 서버는 MCP 클라이언트로부터의 연결을 수락할 준비가 됩니다.
설정 가이드
1. Search1API 키 받기
Search1API 에 등록하세요
대시보드에서 API 키를 받으세요.
2. API 키 구성
API 키를 서버에 제공해야 합니다. 다음 방법 중 하나를 선택하세요.
방법 A: 프로젝트 .env 파일(Standalone 또는 LibreChat에 권장)
이 방법은 LibreChat의 현재 버전과 통합하는 경우 필요합니다(아래의 구체적인 섹션 참조).
search1api-mcp프로젝트 루트 디렉토리에.env라는 이름의 파일을 만듭니다.# In the search1api-mcp directory echo "SEARCH1API_KEY=your_api_key_here" > .envyour_api_key_here실제 키로 바꾸세요.npm install && npm run build실행하기 전에 이 파일이 있는지 확인하세요.
방법 B: 환경 변수(독립 실행형만 해당)
서버를 시작하기 전에 SEARCH1API_KEY 환경 변수를 설정하세요.
export SEARCH1API_KEY="your_api_key_here"
npm start방법 C: MCP 클라이언트 구성(고급)
일부 MCP 클라이언트는 구성에서 환경 변수를 직접 지정할 수 있도록 합니다. 이는 Cursor, VS Code 확장 프로그램 등과 같은 클라이언트에 유용합니다.
{
"mcpServers": {
"search1api": {
"command": "npx",
"args": [
"-y",
"search1api-mcp"
],
"env": {
"SEARCH1API_KEY": "YOUR_SEARCH1API_KEY"
}
}
}
}LibreChat 사용자 참고 사항: 현재 LibreChat의 제한 사항으로 인해 메서드 A(프로젝트 .env 파일)가 필수 메서드입니다. 자세한 내용은 아래 통합 관련 섹션을 참조하세요.
LibreChat(Docker)와의 통합
이 섹션에서는 Docker를 통해 LibreChat과 통합하는 데 필요한 단계를 자세히 설명합니다.
개요:
LibreChat
docker-compose.yml에서 접근할 수 있는 위치에 이 서버의 저장소를 복제합니다.이 서버 디렉토리 내의 Project
.env파일 방법을 사용하여 필요한 API 키를 구성합니다.이 서버를 구축하세요.
librechat.yaml편집하여 LibreChat이 이 서버를 실행하는 방법을 알려줍니다.Docker 볼륨 바인딩을 통해 빌드된 서버 코드가 LibreChat 컨테이너 내부에서 사용 가능한지 확인하세요.
LibreChat을 다시 시작합니다.
단계별:
저장소 복제: LibreChat 외부 서비스를 관리하는 호스트 머신의 디렉토리로 이동합니다(이 디렉토리는 대개
docker-compose.yml파일과 함께 있습니다). 일반적으로 전용mcp-server디렉토리가 사용됩니다.# Example: Navigate to where docker-compose.yml lives, then into mcp-server cd /path/to/your/librechat/setup/mcp-server git clone https://github.com/fatwang2/search1api-mcp.git서버 디렉토리로 이동합니다.
cd search1api-mcpAPI 키 구성(프로젝트
.env파일 방법 - LibreChat에 필요):# Create the .env file echo "SEARCH1API_KEY=your_api_key_here" > .env # IMPORTANT: Replace 'your_api_key_here' with your actual Search1API key종속성 설치 및 빌드: 이 단계에서는 서버 코드를
build디렉토리로 컴파일합니다.npm install npm run buildlibrechat.yaml구성: LibreChat에 이 MCP 서버를 실행하는 방법을 알려주도록 기본librechat.yaml파일을 편집합니다.mcp_servers아래에 항목을 추가합니다.# In your main librechat.yaml mcp_servers: # You can add other MCP servers here too search1api: # Optional: Display name for the server in LibreChat UI # name: Search1API Tools # Command tells LibreChat to use 'node' command: node # Args specify the script for 'node' to run *inside the container* args: - /app/mcp-server/search1api-mcp/build/index.jsargs경로(/app/...)는 빌드된 서버에 액세스할 LibreChat API 컨테이너 내부의 위치입니다(다음 단계에서 볼륨 바인딩 덕분에).
Docker 볼륨 바인딩 구성:
docker-compose.yml파일(또는docker-compose.override.yml파일)을 편집하여 호스트 머신의search1api-mcp디렉터리를 LibreChat API 컨테이너에 매핑합니다.api:서비스의volumes:섹션을 찾으세요.# In your docker-compose.yml or docker-compose.override.yml services: api: # ... other service config ... volumes: # ... other volumes likely exist here ... # Add this volume bind: - ./mcp-server/search1api-mcp:/app/mcp-server/search1api-mcp호스트 경로(
./mcp-server/search1api-mcp):docker-compose.yml파일이 있는 위치를 기준으로 한 호스트 머신의 경로입니다. 다른 곳에서 저장소를 복제한 경우 이 경로를 조정하세요.컨테이너 경로(
:/app/mcp-server/search1api-mcp): 컨테이너 내부 경로입니다.librechat.yaml``args경로에 사용된 디렉터리 구조 와 일치해야 합니다 .
LibreChat을 다시 시작합니다.
docker-compose.yml수정한 경우 다시 빌드하고 LibreChat 스택을 다시 시작하여 변경 사항을 적용합니다.docker compose down && docker compose up -d --build # Or: docker compose restart api (if only librechat.yaml changed)
이제 Search1API 서버는 LibreChat 내에서 도구 제공자로 사용할 수 있습니다.
특징
웹 검색 기능
뉴스 검색 기능
웹 페이지 콘텐츠 추출
웹사이트 사이트맵 추출
DeepSeek R1을 통한 심층적 사고와 복잡한 문제 해결
Claude Desktop, Cursor, Windsurf, Cline 및 기타 MCP 클라이언트와의 원활한 통합
도구
1. 검색 도구
이름:
search설명: Search1API를 사용하여 웹 검색
매개변수:
query(필수): 자연어로 된 검색어입니다. 더 나은 결과를 위해 구체적이고 간결하게 입력하세요.max_results(선택 사항, 기본값: 10): 반환할 결과 수search_service(선택 사항, 기본값: "google"): 사용할 검색 서비스(google, bing, duckduckgo, yahoo, x, reddit, github, youtube, arxiv, wechat, bilibili, imdb, wikipedia)crawl_results(선택 사항, 기본값: 0): 전체 웹 페이지 콘텐츠에 대해 크롤링할 결과 수include_sites(선택 사항): 검색에 포함할 사이트 목록exclude_sites(선택 사항): 검색에서 제외할 사이트 목록time_range(선택 사항): 검색 결과의 시간 범위("일", "월", "년")
2. 뉴스 도구
이름:
news설명: Search1API를 사용하여 뉴스 기사를 검색합니다.
매개변수:
query(필수): 자연어로 된 검색어입니다. 더 나은 결과를 위해 구체적이고 간결하게 입력하세요.max_results(선택 사항, 기본값: 10): 반환할 결과 수search_service(선택 사항, 기본값: "bing"): 사용할 검색 서비스(google, bing, duckduckgo, yahoo, hackernews)crawl_results(선택 사항, 기본값: 0): 전체 웹 페이지 콘텐츠에 대해 크롤링할 결과 수include_sites(선택 사항): 검색에 포함할 사이트 목록exclude_sites(선택 사항): 검색에서 제외할 사이트 목록time_range(선택 사항): 검색 결과의 시간 범위("일", "월", "년")
3. 크롤 도구
이름:
crawl설명: Search1API를 사용하여 URL에서 콘텐츠 추출
매개변수:
url(필수): 크롤링할 URL
4. 사이트맵 도구
이름:
sitemap설명: URL에서 모든 관련 링크를 가져옵니다.
매개변수:
url(필수): 사이트맵을 가져올 URL
5. 추론 도구
이름:
reasoning설명: 빠른 deepseek r1 모델과 웹 검색 기능을 갖춘 심층적 사고와 복잡한 문제 해결을 위한 도구(search1api 웹사이트에서 다른 모델로 변경할 수 있지만 속도는 보장되지 않음)
매개변수:
content(필수): 깊이 생각해야 할 질문이나 문제
6. 트렌딩 도구
이름:
trending설명: 인기 플랫폼에서 인기 주제를 받아보세요
매개변수:
search_service(필수): 트렌드 주제를 가져올 플랫폼(github, hackernews)을 지정합니다.max_results(선택 사항, 기본값: 10): 반환할 트렌드 항목의 최대 수
버전 기록
v0.2.0: LibreChat 통합을 위한 대체
.env지원이 추가되었고 종속성이 업데이트되었습니다.v0.1.8: X(Twitter) 및 Reddit 검색 서비스 추가
v0.1.7: GitHub 및 Hacker News에 대한 Trending 도구 추가
v0.1.6: 위키피디아 검색 서비스 추가
v0.1.5: 새로운 검색 매개변수(include_sites, exclude_sites, time_range)와 새로운 검색 서비스(arxiv, wechat, bilibili, imdb)가 추가되었습니다.
v0.1.4: deepseek r1에 추론 도구 추가 및 커서 및 Windsurf 구성 가이드 업데이트
v0.1.3: 뉴스 검색 기능 추가
v0.1.2: 사이트맵 기능 추가
v0.1.1: 웹 크롤링 기능 추가
v0.1.0: 검색 기능이 포함된 최초 릴리스
특허
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여되었습니다. 자세한 내용은 라이선스 파일을 참조하세요.
Available Tools
7 toolsaskAsk across the right sourcesARead-onlyInspect
Describe what you are looking for in natural language when you do not know which source to search. Search1API picks up to five engines (web, Hacker News, Reddit, GitHub, X, arXiv, Wikipedia, and more), infers a time window from phrases such as "this week", and returns at most 10 relevant results ranked by relevance. Costs 5 credits; use search when you already know the engine.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The request in natural language; platform hints ("on Reddit", "papers") and time hints ("this week") steer the search |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | Engines that failed while others completed |
| intent | Yes | Keywords, engines, and time window that were used |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly/openWorld/non-destructive), but the description adds substantial operational context the annotations do not: up to five engines selected, automatic time-window inference from phrases like 'this week', a cap of 10 results, and a concrete cost of 5 credits. Cost and result-cap disclosure is exactly the kind of trait an agent needs for budget-aware selection.
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?
Three tight sentences, front-loaded with the trigger condition, then capability and cost, then the routing alternative. No filler and nothing repeated.
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 values need no explanation, yet the description still usefully bounds the result count. For a single-parameter discovery tool, the trigger condition, alternatives, cost, and result cap together make it fully sufficient to call correctly.
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% and already documents the query parameter, including platform and time hints. The description reinforces the time-hint inference mechanism ('infers a time window from phrases such as "this week"'), adding a little meaning beyond the schema, though most detail is duplicative of the schema text.
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 concrete verb and resource ('describe what you are looking for in natural language') and frames the scope as cross-source discovery. It explicitly contrasts with the sibling 'search' by naming the condition that separates them, so an agent can distinguish the two 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?
Gives an explicit when-to-use ('when you do not know which source to search') and an explicit alternative with its own condition ('use search when you already know the engine'). Both sides of the routing decision are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crawlRead a web pageARead-onlyInspect
Extract the readable title and full text from a public URL supplied by the user or returned by search.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTP or HTTPS URL to retrieve |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety and open-web profile is covered structurally. The description adds that the output is extracted readable text rather than raw markup, plus the public-URL restriction, but says nothing about failure modes (paywalls, JS-rendered content, rate limits).
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 sentence with zero padding; the action and output are front-loaded and the input-sourcing hint is appended without derailing the sentence.
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 the description needn't explain return values, and the single input is fully documented. It is nearly complete for a one-parameter read tool, with the main gap being no guidance on unreadable or dynamically rendered pages.
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?
Only one parameter, and the schema already describes it fully (format: uri, 'Public HTTP or HTTPS URL to retrieve') at 100% coverage, so the baseline is 3. The description reinforces the public-URL constraint and hints at the URL source, but adds no format or validity detail beyond the schema.
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 (extract) and concrete outputs (readable title and full text) from a clearly bounded resource (a public URL). It does not explicitly distinguish itself from siblings like render_results or sitemap, which an agent might plausibly confuse with page retrieval.
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?
'Supplied by the user or returned by search' implies a usage chain after the search tool, which is useful contextual guidance. However, there is no explicit when-not guidance or mention of when a sibling such as render_results (e.g., JS-heavy pages) would be the better choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
newsNews searchARead-onlyInspect
Search current news when the user asks about recent events, announcements, or coverage. Returns citable article results with title, URL, snippet, and optional extracted text.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Short, focused news query | |
| time_range | No | Optional recency window; use day for breaking news | |
| max_results | No | Maximum number of articles to return | |
| crawl_results | No | Number of top articles to retrieve as full pages. Each successful retrieval adds 1 credit to the base 1-credit news request | |
| exclude_sites | No | News domains to exclude | |
| include_sites | No | News domains to include | |
| search_service | No | News search engine to use | bing |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds that results are "citable" with title/URL/snippet/optional text, but says nothing about cost, freshness guarantees, or rate behavior beyond what the schema's credit note already implies.
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 sentences, purpose front-loaded and trigger condition second, with zero filler. 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?
With a rich schema, output schema, and safety annotations, the description covers enough to call the tool. The notable gap is sibling routing: in a toolset containing both `search` and `trending`, the description never explains why an agent should pick `news` over those alternatives.
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 100%, so the schema fully documents all seven parameters (including the credit cost of crawl_results and the recency enum). The description adds no parameter-level meaning, so the baseline 3 applies.
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 current news") plus the triggering user intent, so the agent knows this is a news-retrieval tool rather than a general one. However, it never distinguishes itself from the sibling `search` or `trending` tools, leaving ambiguity about which to pick.
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?
"when the user asks about recent events, announcements, or coverage" gives clear, actionable context for when to invoke this tool. There are no exclusions or named alternatives (e.g. no guidance on choosing `trending` for trending topics over `news`), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_resultsRender the resultsARead-onlyIdempotentInspect
Present already retrieved source results as source cards when the host supports UI, with a complete readable text list otherwise. Use when the user wants to browse sources or a visual list helps the task. Pass existing results in the desired order; never invent source URLs or factual titles. Does not search, crawl, fetch URLs, verify sources, or consume search credits. Do not call for intermediate research results or when a text answer is sufficient.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional human-readable list heading. Defaults to Results. | |
| results | Yes | Already retrieved results, in the order to display. No new search is performed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | |
| total | Yes | Number of results in this rendered list, not a provider-wide search total. |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds genuinely new traits beyond them: graceful degradation when the host has no UI support, a hard prohibition on inventing URLs or factual titles, and the note that this does not consume search credits. These are behavioral facts an agent could not derive from the annotations or schema.
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 tight sentences that are front-loaded: capability and fallback first, then when to use, then input constraints, then explicit non-capabilities. No sentence is redundant with structured fields, and each adds a distinct constraint.
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 values need no prose explanation. The description still covers everything an agent needs to invoke it correctly: caller prerequisites, ordering intent, host-capability fallback, and the boundary against adjacent research tools. Nothing material is missing for a 2-parameter, non-mutating render 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 description coverage is 100%, so the schema already documents title, results, id, url, text, and metadata – this sets the baseline at 3. The description adds ordering semantics ('Pass existing results in the desired order') and reinforces that the payload must be pre-existing rather than newly fetched, which is meaningful beyond the field-level docs.
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 – present already-retrieved results as source cards with a text-list fallback – and immediately bounds the scope with negations ('Does not search, crawl, fetch URLs, verify sources, or consume search credits'). This cleanly separates it from siblings like search, crawl, and sitemap, which is exactly the confusion an agent would otherwise face.
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?
Gives an explicit trigger ('when the user wants to browse sources or a visual list helps the task'), an explicit anti-trigger ('Do not call for intermediate research results or when a text answer is sufficient'), and enumerates the excluded operations. There is also a prerequisite: results must already exist. Nothing about when to select this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchWeb searchARead-onlyInspect
Search the live public web when the user needs current information, sources, or research. Returns citable results with id, title, URL, and text. Each result includes a URL that can be read in full.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Results page to fetch; only bing, bingcn, baidu, and grokipedia paginate, other engines ignore it | |
| query | Yes | Short, focused search query | |
| time_range | No | Optional recency window for time-sensitive searches | |
| max_results | No | Maximum number of results to return | |
| crawl_results | No | Number of top results to retrieve as full pages. Each successful page retrieval adds 1 credit to the base 1-credit search request | |
| exclude_sites | No | Domains to exclude from the search | |
| include_sites | No | Domains to include when the user explicitly scopes the search | |
| search_service | No | Search engine to use; choose one only when it matches the user's source intent |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds the result shape (id, title, URL, text) and the read-in-full affordance, but that overlaps with the existing output schema and omits operational context such as the per-crawl credit cost that the schema notes. Additive value beyond structured fields is modest.
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?
Three short sentences, front-loaded with the purpose before the return details. Tight overall, though the final sentence ('Each result includes a URL that can be read in full') is largely redundant with the preceding description of result fields.
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 an 8-parameter tool with full schema coverage, an output schema, and rich annotations, the description delivers a clear purpose and return summary. Guidance on engine selection tradeoffs is left to the schema, which is acceptable given the structured fields cover it.
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 100%, so all 8 parameters — including the pagination caveat for specific engines and the credit cost of crawl_results — are already documented in the schema. The description adds no parameter-level meaning, so the baseline 3 applies.
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+resource ('Search the live public web') and the information need it serves ('current information, sources, or research'), clearly distinguishing it from a plain lookup. It does not explicitly name siblings like news, trending, or crawl, so an agent must infer the boundary between general search and those specialized 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?
Gives a clear use context — when the user needs current information, sources, or research — which is exactly the trigger condition for a search tool. It stops short of naming alternatives (news, trending, crawl) or stating when-not to use it, but the positive guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sitemapDiscover links on a siteARead-onlyInspect
Discover related public links from a page or domain when the user wants to explore a site's structure or available pages.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public page or domain URL whose links should be discovered |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, so the safety profile is covered. The description adds that only public links are surfaced, but says nothing about crawl depth, result limits, or how discovery is scoped — modest added context over the annotations.
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 combining the action with the trigger condition; no filler. Slight redundancy between 'related public links' and 'available pages' keeps it from being maximally tight.
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 one-parameter read-only tool with an output schema and rich annotations, the description supplies the needed intent and scope. Return values need not be explained since an output schema exists; the only gap is disambiguation from the crawl sibling.
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?
Only one parameter with 100% schema description coverage, so the schema already documents 'url'. The description's 'page or domain' phrasing reinforces that a domain is acceptable, but adds no format or constraint detail beyond the schema. Baseline 3 applies.
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 (discover) and resource (related public links from a page or domain), and scopes it to public links. It does not explicitly differentiate itself from the sibling 'crawl', which also traverses sites, so an agent must infer the boundary.
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?
Gives a clear selection context: use when the user wants to explore a site's structure or available pages. It stops short of naming the closest alternative (crawl) or stating when not to use it, leaving the sitemap-vs-crawl choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trendingExplore trending topicsARead-onlyInspect
List currently trending repositories or stories from GitHub or Hacker News when the user asks what is popular now.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Maximum number of trending items to return | |
| search_service | Yes | Platform whose trending items should be returned | github |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety and reach profile is fully covered structurally. The description adds the scope 'currently trending' but nothing about rate limits, auth, or freshness/pagination behavior beyond what the annotations supply.
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 sentence that front-loads the action and payload, then appends the usage trigger. Nothing is wasted, though it is slightly dense and could separate the 'what' from the 'when' more cleanly.
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 an output schema present, rich annotations, and full schema description coverage, the description only needs to establish purpose and invocation context, which it does. The one unmentioned detail, that github is the default service, is already carried by the schema.
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 100%, so both search_service and max_results are already documented in the schema, and the description's mention of GitHub/Hacker News merely echoes the enum. It adds no format, default, or range guidance, so the baseline 3 applies.
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 (List) and resource (currently trending repositories or stories) with the source platforms named, so an agent knows exactly what comes back. It does not explicitly distinguish itself from the sibling 'news' or 'search' tools, which is the only thing keeping it out of the top band.
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 clause 'when the user asks what is popular now' gives clear triggering context and is embedded directly in the description rather than left implicit. There is no exclusion or named alternative, but the invocation condition is unambiguous.
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.
4 tool updates
v0.8.0- Added
ask - Changed
news1 field changed- changed
Input schema / properties / time_range / enumPrevious value: -[ - "day", - "month", - "year" -]New value: +[ + "day", + "week", + "month", + "year" +]
- Added
render_results - Changed
search3 fields changed- added
Input schema / properties / pageAdded value: +{ + "default": 1, + "description": "Results page to fetch; only bing, bingcn, baidu, and grokipedia paginate, other engines ignore it", + "maximum": 100, + "minimum": 1, + "type": "number" +} - changed
Input schema / properties / search_service / enumPrevious value: -[ - "google", - "bing", - "duckduckgo", - "yahoo", - "x", - "reddit", - "github", - "youtube", - "arxiv", - "wechat", - "bilibili", - "imdb", - "wikipedia" -]New value: +[ + "google", + "bing", + "bingcn", + "duckduckgo", + "yahoo", + "yandex", + "x", + "reddit", + "github", + "youtube", + "arxiv", + "wechat", + "bilibili", + "imdb", + "wikipedia", + "grokipedia" +] - changed
Input schema / properties / time_range / enumPrevious value: -[ - "day", - "month", - "year" -]New value: +[ + "day", + "week", + "month", + "year" +]
1 tool update
v0.5.4- Removed
fetch
6 tool updates
v0.4.0- Changed
crawl3 fields changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to crawl"New value: +"Public HTTP or HTTPS URL to retrieve" - added
Input schema / properties / url / formatAdded value: +"uri" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "properties": { + "id": { + "description": "Stable identifier for this result; for web results this is the canonical URL", + "type": "string" + }, + "metadata": { + "additionalProperties": true, + "description": "Additional source metadata", + "type": "object" + }, + "text": { + "description": "Result snippet or extracted page text when available", + "type": "string" + }, + "title": { + "description": "Human-readable result title", + "type": "string" + }, + "url": { + "description": "Canonical URL that clients can cite and users can open", + "format": "uri", + "type": "string" + } + }, + "required": [ + "id", + "title", + "url" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" +}
- Added
fetch - Changed
news11 fields changed- changed
Input schema / properties / crawl_results / descriptionPrevious value: -"Number of top results to crawl for full webpage content. Each successfully crawled page adds 1 credit to the base 1-credit news request"New value: +"Number of top articles to retrieve as full pages. Each successful retrieval adds 1 credit to the base 1-credit news request" - added
Input schema / properties / crawl_results / minimumAdded value: +0 - changed
Input schema / properties / exclude_sites / descriptionPrevious value: -"List of sites to exclude from search. Only use when you need to explicitly filter out specific domains from results"New value: +"News domains to exclude" - changed
Input schema / properties / include_sites / descriptionPrevious value: -"List of sites to include in search. Only use when you need special results from sites not available in search_service"New value: +"News domains to include" - changed
Input schema / properties / max_results / descriptionPrevious value: -"Maximum number of results to return"New value: +"Maximum number of articles to return" - added
Input schema / properties / max_results / maximumAdded value: +50 - added
Input schema / properties / max_results / minimumAdded value: +1 - changed
Input schema / properties / query / descriptionPrevious value: -"Search query, be simple and concise"New value: +"Short, focused news query" - changed
Input schema / properties / search_service / descriptionPrevious value: -"Specify the news engine to use. Choose based on your specific needs"New value: +"News search engine to use" - changed
Input schema / properties / time_range / descriptionPrevious value: -"Time range for search results, only use when specific time constraints are required"New value: +"Optional recency window; use day for breaking news" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "items": { + "properties": { + "id": { + "description": "Stable identifier for this result; for web results this is the canonical URL", + "type": "string" + }, + "metadata": { + "additionalProperties": true, + "description": "Additional source metadata", + "type": "object" + }, + "text": { + "description": "Result snippet or extracted page text when available", + "type": "string" + }, + "title": { + "description": "Human-readable result title", + "type": "string" + }, + "url": { + "description": "Canonical URL that clients can cite and users can open", + "format": "uri", + "type": "string" + } + }, + "required": [ + "id", + "title", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Changed
search10 fields changed- changed
Input schema / properties / crawl_results / descriptionPrevious value: -"Number of top results to crawl for full webpage content. Each successfully crawled page adds 1 credit to the base 1-credit search request"New value: +"Number of top results to retrieve as full pages. Each successful page retrieval adds 1 credit to the base 1-credit search request" - added
Input schema / properties / crawl_results / minimumAdded value: +0 - changed
Input schema / properties / exclude_sites / descriptionPrevious value: -"List of sites to exclude from search. Only use when you need to explicitly filter out specific domains from results"New value: +"Domains to exclude from the search" - changed
Input schema / properties / include_sites / descriptionPrevious value: -"List of sites to include in search. Only use when you need special results from sites not available in search_service"New value: +"Domains to include when the user explicitly scopes the search" - added
Input schema / properties / max_results / maximumAdded value: +50 - added
Input schema / properties / max_results / minimumAdded value: +1 - changed
Input schema / properties / query / descriptionPrevious value: -"Search query, be simple and concise"New value: +"Short, focused search query" - changed
Input schema / properties / search_service / descriptionPrevious value: -"Specify the search engine to use. Choose based on your specific needs"New value: +"Search engine to use; choose one only when it matches the user's source intent" - changed
Input schema / properties / time_range / descriptionPrevious value: -"Time range for search results, only use when specific time constraints are required"New value: +"Optional recency window for time-sensitive searches" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "items": { + "properties": { + "id": { + "description": "Stable identifier for this result; for web results this is the canonical URL", + "type": "string" + }, + "metadata": { + "additionalProperties": true, + "description": "Additional source metadata", + "type": "object" + }, + "text": { + "description": "Result snippet or extracted page text when available", + "type": "string" + }, + "title": { + "description": "Human-readable result title", + "type": "string" + }, + "url": { + "description": "Canonical URL that clients can cite and users can open", + "format": "uri", + "type": "string" + } + }, + "required": [ + "id", + "title", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Changed
sitemap3 fields changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to get sitemap"New value: +"Public page or domain URL whose links should be discovered" - added
Input schema / properties / url / formatAdded value: +"uri" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "links": { + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "links" + ], + "type": "object" +}
- Changed
trending4 fields changed- added
Input schema / properties / max_results / maximumAdded value: +50 - added
Input schema / properties / max_results / minimumAdded value: +1 - changed
Input schema / properties / search_service / descriptionPrevious value: -"Specify the platform to get trending topics from"New value: +"Platform whose trending items should be returned" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "format": "uri", + "type": "string" + } + }, + "required": [ + "title", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
3 tool updates
v0.3.1- Changed
news1 field changed- changed
Input schema / properties / crawl_results / descriptionPrevious value: -"Number of results to crawl for full webpage content, useful when search result summaries are insufficient for complex queries"New value: +"Number of top results to crawl for full webpage content. Each successfully crawled page adds 1 credit to the base 1-credit news request"
- Removed
reasoning - Changed
search1 field changed- changed
Input schema / properties / crawl_results / descriptionPrevious value: -"Number of results to crawl for full webpage content, useful when search result summaries are insufficient for complex queries"New value: +"Number of top results to crawl for full webpage content. Each successfully crawled page adds 1 credit to the base 1-credit search request"
6 tool updates
v0.1.8- First observed
crawl - First observed
news - First observed
reasoning - First observed
search - First observed
sitemap - First observed
trending
TDQS
Scored across 7 tools
Most tools have distinct roles: crawl extracts text, sitemap discovers links, render_results presents output, and trending surfaces popular content. However, search, news, and ask all overlap as retrieval operations, distinguished mainly by the descriptions (engine-specific vs. news-focused vs. multi-engine fallback) rather than by clearly separate purposes.
Names mix conventions: verbs (crawl, search, ask), nouns (news, sitemap), a gerund (trending), and one verb_noun (render_results). The tools remain readable and mostly single-word, but there is no predictable pattern across the set.
Seven tools is well within a reasonable range for a search/crawl service and each maps to a recognizable capability. It is slightly generous given the retrieval overlap, but nothing feels redundant or filler.
The surface covers the search lifecycle well: multi-source retrieval (search, news, ask, trending), full-text extraction (crawl), link discovery (sitemap), and result presentation (render_results). Minor gaps exist around explicit pagination or structured filtering, but core workflows are covered.
Maintenance
Related MCP Connectors
MCP server for Firecrawl — web search, scraping, and biomedical/arXiv paper search.
MCP server for Google search results via SERP API
Scrape, crawl and search the web for AI agents via MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceA Model Context Protocol (MCP) server implementation that integrates with Firecrawl for advanced web scraping capabilities.26129,393 npm7,610MIT
- AlicenseBqualityCmaintenanceA Model Context Protocol server that enables AI assistants to perform real-time web searches, retrieving up-to-date information from the internet via a Crawler API.151 npm42ISC
- FlicenseAqualityCmaintenanceA Model Context Protocol server that provides web search capabilities using Google Custom Search API and webpage content extraction functionality.26 npm2-
- AlicenseBqualityDmaintenanceA Model Context Protocol server that provides web search capabilities using Google Custom Search API and webpage content extraction functionality.2MIT