Mini Agent MCP
Mini Agent MCP is an intelligent agent server combining built-in utility tools, web search capabilities, and a ReAct-based autonomous agent to complete complex multi-step tasks. It supports client-side LLM reasoning via MCP Sampling or direct OpenAI-compatible API calls.
ð€ ReAct Autonomous Agent (run_agent)
Plans and executes multi-step tasks using a Thought â Action â Observation loop
Chains up to 8 tool calls, combining any available tools automatically
Falls back to a rule-based engine if no LLM is configured
ð§® Built-in Utility Tools
Calculator: Evaluate mathematical expressions (arithmetic, trig, logarithms, constants like pi/e)
Text Analysis (
text_stats): Get character/word/sentence/paragraph counts, average word length, and most frequent wordsText Transform (
text_transform): Apply uppercase, lowercase, titlecase, reverse, trim, sort lines, remove duplicates, count/replace substringsUnit Conversion (
unit_convert): Convert length, weight, temperature, and data storage unitsDate & Time (
datetime_info): Get current date/time (with timezone support), format dates, or calculate differences between datesRandom Generation (
random_gen): Generate random integers, UUID v4s, custom passwords, or pick/shuffle items from a list
ð AnySearch Web Tools
Search (
anysearch_search): General or vertical web searches (finance, academic, legal, health, etc.)Batch Search (
anysearch_batch_search): Run up to 5 parallel search queries in a single callURL Extraction (
anysearch_extract): Fetch and convert any webpage's content to clean Markdown (up to 50,000 characters)Domain Discovery (
anysearch_get_sub_domains): Discover available vertical search sub-domains and required parameters before performing specialized searches
Allows the MCP server to call an OpenAI-compatible API for LLM reasoning, enabling the agent to perform complex multi-step tasks using either client-side sampling or direct HTTP with OpenAI models.
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., "@Mini Agent MCPSearch for the area of Canada and convert to square kilometers."
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.
Mini Agent MCP
äžäžªåºäº FastMCP + OpenAI SDK ç MCP æºèœä»£çæå¡åš
éæ ReAct AgentãDAG å·¥äœæµã深床ç ç©¶ãæä¹ åè®°å¿ãæèœåŠä¹ ãAnySearch æ£çŽ¢çèœå
åäºè¿å¶å³å¯æç®¡ / æ¬å°éšçœ² / åµå ¥ä»»æ MCP 客æ·ç«¯
â ïž å®å šåèŠïŒ2026-07ïŒïŒæ©æçæ¬äžïŒ
scripts/äžç 9 䞪æµè¯æä»¶æŸæäžäžª LongCat LLM API keyïŒak_2wG...ïŒåçŒå·²æ³é²ïŒçŽæ¥ç¡¬çŒç è¿ Git ä»åºã该åè¯å¿ é¡»è§äžºå·²æ³é²ââå·²æ Git åå²è®°åœïŒå纯å é€æä»¶æ æ³åæ¶ã请ç«å³ïŒ
åšäŸåºåæ§å¶å°æ€é并蜮æ¢è¯¥ keyïŒ
éè¿ CI Secret Store /
process.env.LLM_API_KEYéæ°æ³šå ¥ïŒåš PR æµçšäžå å ¥
node scripts/test-secret-scan.mjsäœäžº CI 鲿€ãåœåææèæ¬å·²æ¹äžºè¯»åç¯å¢åéïŒçŒºåæ®æ¶æž æ° SKIP å¹¶éåº 0ã
äžãè¿æ¯ä»ä¹
mini-agent-mcp æ¯äžäžªéµåŸª Model Context Protocol (MCP) ç stdio / SSE æå¡åšïŒ
对å€åªæŽé² 1 䞪 MCP å·¥å ·ïŒ
run_agentââçšäºæ²¡æå Agent çåºçšæ³šå ¥äžäžª"åæºèœäœ"å¯¹å æç®¡äžäžª ReAct æšç代çïŒèªäž»è°çš 14 䞪å éšå·¥å ·ïŒ6 䞪åºç¡å·¥å · + 4 䞪 AnySearch å·¥å · + é«çº§ pipeline çïŒå®æä»»å¡
å 眮 DAG å·¥äœæµäžå€é¶æ®µæ·±åºŠç 究管线
éè¿ ToolManager ç»äžç®¡çè¶ æ¶ãå¹¶åãéè¯ãéšçŠ
éè¿
.memory/äž.skills/å®ç°æ¬å°æä¹ åè®°å¿åæèœåŠä¹
æ¯æäžç§ LLM éä¿¡æš¡åŒïŒèªåšçº§è fallbackïŒïŒ
MCP Sampling â 客æ·ç«¯æš¡åïŒé¶é 眮
Direct HTTP â éè¿ OpenAI SDK çŽè¿ä»»æå Œå®¹ç«¯ç¹
Rule-based â åºäºæ£åçæš¡åŒå¹é å åº
Related MCP server: Forage MCP Server
äºãæ žå¿ç¹æ§
æš¡å | èœå |
ð§® åºç¡å·¥å · | å®å šæ°åŠè®¡ç®ãææ¬ç»è®¡ãææ¬èœ¬æ¢ãåäœæ¢ç®ãæ¥ææ¶éŽãéæºçæ |
ð€ ReAct Agent | åç Function Calling 倿¥æšçïŒèªåšå¹é å岿èœïŒHook æ³šå ¥ |
ð DAG å·¥äœæµ | æåæ ç¯åŸçŒæïŒå¹¶è¡æ§è¡æ äŸèµèç¹ïŒèªåšæ³šå ¥äžæžžç»æ |
ð æ·±åºŠç ç©¶ | æè§£åé®é¢ â å¹¶è¡æ£çŽ¢ â ç»Œåæ¥åïŒäžé¶æ®µç®¡çº¿ |
ðŸ è®°å¿ç³»ç» | 4 ç±»æ çŸåæä¹ è®°å¿ïŒæè®¿é®é¢æ¬¡ LRU æ£çŽ¢ |
ð¯ æèœç³»ç» | 宿任å¡åæåå¯å€çšæèœïŒæ°ä»»å¡èªåšå¹é |
ð AnySearch éæ | èªåšåç°å¹¶æ¥å ¥æ£çŽ¢å·¥å ·ïŒä» äŸ Agent å éšè°çš |
ð¡ïž å·¥å ·éšçŠ | èŸå ¥é¿åºŠäžéãé误åç±»ãæºèœéè¯ãè¶ æ¶æ§å¶ |
ð äžæš¡åŒ LLM | Sampling â HTTP â Rule-based éæçº§è fallback |
ðª Hooks æ©å± | åš LLM è°çšååæ³šå ¥èªå®ä¹é»èŸïŒYao æš¡åŒïŒ |
äžãæ¶ææ»è§
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â MCP 客æ·ç«¯ (Claude / ZCode) â
â tools/list åªè§ 1 䞪工å
·: run_agent â
â tools/call ä»
å¯è° run_agent â
âââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââââââââââ
â run_agent(task)
âââââââââââââââââââââââââââââââŒââââââââââââââââââââââââââââââââââââââââ
â FastMCP Server â
â run_agent â å¯äžå¯¹å€ç MCP å·¥å
· â
âââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââŒââââââââââââââââââââââââââââââââââââââââ
â ToolManager (singleton) â
â è¶
æ¶ / å¹¶åäžé / æºèœéè¯ / èŸå
¥éšçŠ / è°çšåå² â
â 14 䞪å
éšå·¥å
·ïŒå€é¢çäžè§ïŒ â
âââââââââââââââââââââââââââââââ¬ââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââŒâââââââââââââââââââââââ
â â â
⌠⌠âŒ
6 䞪æ¬å°å·¥å
· run_agentïŒå¯äžå¯¹å€å·¥å
·ïŒ .memory / .skills
(calculator, ... + å
éšé«çº§ pipeline (æä¹
å)
ä»
Agent å
éšäœ¿çš)
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ReAct Agent (src/agent/react.ts) â
â â
â LLM âââ CreateHook ââ messages âââ LLM âââ NextHook â ååºæ ¡éª â
â â â
â â tool_calls â
â ⌠â
â buildToolList() = 6 æ¬å°å·¥å
· + AnySearch 4 䞪å
éšå·¥å
· â
â (AnySearch æå 蜜ïŒéŠæ¬¡ run_agent è°çšæ¶åç°å¹¶çŒå) â
â â
â âââââââââââââââââââââââââââ âââââââââââââââââââââââââââ â
â â LLM æš¡åŒ (äŒå
级) â â Fallback éŸ â â
â â 1. MCP Sampling â â â 倱莥 â é级å°äžäžæš¡åŒ â â
â â 2. Direct HTTP â â â â
â â 3. Rule-based â â â â
â âââââââââââââââââââââââââââ âââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
âŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æä¹
åå± (æ¬å° JSON) â
â .memory/memories.json ââ 4 ç±»è®°å¿ (fact/preference/task/conv) â
â .skills/skills.json ââ æ çŸè¯åæèœåº â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
**AnySearch æå 蜜æ¶åº**ïŒ
1. æå¡åšå¯åš â ä»
泚å `run_agent` å° FastMCP + 6 䞪æ¬å°å·¥å
·å°å
éš ToolManager
2. 客æ·ç«¯è°çš `run_agent` â Agent è§Šå `ensureAnySearchTools()`
3. éŠæ¬¡ïŒHTTP è¿æ¥å° `api.anysearch.com/mcp` åç°å·¥å
·ïŒçŒå 1 å°æ¶
4. åç»ïŒåœäžçŒåïŒé€é TTL è¿ææè°çš `resetAnySearchCache()`ïŒåãå¿«éäžæ
4.1 MCP 客æ·ç«¯é 眮
stdio æš¡åŒïŒæåžžçšïŒâ å€å¶å°å®¢æ·ç«¯ç MCP é 眮æä»¶äžïŒ
{
"mcpServers": {
"mini-agent-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "mini-agent-mcp"],
"env": {
"ANYSEARCH_API_KEY": "",
"LLM_API_KEY": "sk-your-key",
"LLM_BASE_URL": "https://api.longcat.chat/openai/v1",
"LLM_MODEL": "LongCat-2.0",
"LLM_MAX_TOKENS": "4096"
}
}
}
}ä¹å¯çŽæ¥äœ¿çš
node dist/index.jså¯åšæ¬å°çŒè¯äº§ç©ïŒè§ §4.3ïŒã
SSE æš¡åŒïŒå¯éïŒâ éè¿ node dist/index.js --sse å¯çš httpStream äŒ èŸã
4.2 .env é
眮ïŒfallbackïŒ
æå¡åšå¯å𿶿以äžé¡ºåºæ¥æŸ .envïŒç¬¬äžäžªååšå³çæïŒïŒ
process.cwd()/.envâ å¯åšæ¶çå·¥äœç®åœ<dist äžäžçº§>/.envâ å³npm installåçé¡¹ç®æ ¹ç®åœïŒdist/index.jså¯åšåºæ¯ïŒ<dist äžäž€çº§>/.envâ é¡¹ç®æ ¹ç®åœçç¶ç®åœ
â ïž éè¿
npx -y mini-agent-mcpå šå±æèµ·æ¶ïŒprocess.cwd()åå³äº MCP 客æ·ç«¯çå·¥äœç®åœïŒäžäžå®çäºé¡¹ç®æ ¹ãæšèåæ¶åš MCP é 眮æä»¶çenvåäžæŸåŒæ³šå ¥åéïŒè§ §4.1ïŒïŒä»¥é¿å æ¥æŸè·¯åŸäžäžèŽåžŠæ¥çé 眮æŒç§»ã
cp .env.example .env# AnySearch API KeyïŒå¯é â äžå¡«åå¿å访é®ïŒæèŸäœéçéå¶ïŒ
ANYSEARCH_API_KEY=
# LLM çŽæ¥è°çšé
眮ïŒä»
Direct HTTP æš¡åŒéèŠïŒ
LLM_API_KEY=
LLM_BASE_URL=https://api.longcat.chat/openai/v1
LLM_MODEL=LongCat-2.0
LLM_MAX_TOKENS=4096
# å¯éïŒå€äŸåºå忢ïŒè§ §9.2ïŒ
# LLM_PROVIDER=openai
# LLM_PROVIDERS_PATH=/abs/path/to/providers.json
# Agent è¡äžºè°äŒ
AGENT_MAX_TURNS=5 # ReAct æšçæ¥æ°äžéïŒ1-50ïŒ
# AGENT_TOOL_RETRY=1 # å·²åºåŒ â ä»
TOOL_RETRY_COUNT çæ
# ToolManager è°äŒ
TOOL_MAX_CONCURRENT=10 # å¹¶åæ§è¡äžé
TOOL_RETRY_COUNT=2 # ç¬æ¶é误éè¯ïŒ0-5ïŒ4.3 æ¬å°åŒå
git clone https://github.com/Microbiosis/mini-agent-mcp.git
cd mini-agent-mcp
npm install
npm run build # tsc çŒè¯å° dist/
node dist/index.js # å¯åš MCP æå¡åšïŒstdioïŒ
node dist/index.js --test # èªæ£æš¡åŒïŒè°çšå
šéš 14 䞪工å
·
node dist/index.js --sse # å¯çš HTTP Stream äŒ èŸ
--testæš¡åŒè¿è¡å®æåäŒprocess.exit(0)ïŒéåå CI èªæ£ã
4.4 éªè¯å®è£
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
| npx mini-agent-mcpæ£åžžæ åµäžäŒè¿å 14 äžªå·¥å ·ç schemaã
äºãMCP å·¥å ·åè
5.1 å¯äžå¯¹å€å·¥å ·ïŒå€éš Agent å¯äžå¯è°ïŒ
å·¥å · | åæ° | çšé | è¶ æ¶ |
|
| æä»»å¡å§æŽŸç»å
眮 ReAct AgentïŒAgent èªåšéæ©å¹¶è°çš 14 䞪å
éšå·¥å
·å®æã | 600s |
run_agent è¿åç»æïŒ
Task: è®¡ç® sqrt(15) + 8
Mode: LLM-powered (HTTP)
Steps: 2
--- Reasoning Trace ---
[Step 1]
Thought: ...
Action: calculator
Observation: Expression: sqrt(15) + 8
Result: 11.872983346207417
[Step 2]
Thought: ...
Final Answer: 11.87
--- Final Answer ---
11.875.2 å éšå·¥å ·ïŒä» Agent å¯è§ïŒå€éš tools/list äžå¯è§ïŒ
äžé¢ 14 䞪工å
·äžéè¿ MCP tools/list æŽé²ââåªèœç± run_agent å
ç ReAct 埪ç¯èªåšè°çšã客æ·ç«¯ Agent éè¿ run_agent(task) å§æŽŸä»»å¡ïŒAgent åšå
éšæ ¹æ®éèŠæéå¹¶æ§è¡è¿äºå·¥å
·ã
åºç¡å·¥å ·ïŒ6 䞪 â 忥ãç¡®å®æ§ïŒ
å éšå·¥å · | åæ° | çšé |
|
| å®å
šæ°åŠæ±åŒïŒéåœäžéè§£æåšïŒæ |
|
| å笊æ°ãè¯æ°ã奿°ã段æ°ãå¹³åè¯é¿ãTop 5 é«é¢è¯ |
|
| uppercase/lowercase/titlecase/reverse/trim/remove_duplicates/sort_lines/count_substring/replace |
|
| é¿åºŠ/éé/枩床/æ°æ®åäœæ¢ç® |
|
| åœåæ¶éŽãæ ŒåŒèœ¬æ¢ãæ¥æå·® |
|
| éæºæŽæ°/UUID/å¯ç /éæ ·/æŽç |
é«çº§ pipelineïŒ3 䞪ïŒ
å éšå·¥å · | çšé |
| DAG å·¥äœæµçŒæïŒå€äžª Agent 任塿äŸèµæ§è¡ïŒ |
| äžé¶æ®µæ·±åºŠç ç©¶ïŒæè§£ â æ£çŽ¢ â 绌å |
(å€å) | å€é¶æ®µç ç©¶ä»»å¡çäž²èå ¥å£ |
è®°å¿å·¥å
·ïŒ3 䞪 â æä¹
åå° .memory/memories.jsonïŒ
å éšå·¥å · | çšé |
| ååšäžæ¡è®°å¿ïŒfact/preference/task/conversationïŒ |
| ææ çŸæ£çŽ¢ Top 5 è®°å¿ |
| è¿åè®°å¿ç»è®¡ |
æèœå·¥å
·ïŒ2 䞪 â æä¹
åå° .skills/skills.jsonïŒ
å éšå·¥å · | çšé |
| æåäžäžªå¯å€çšæèœ |
| ååºæææèœ |
AnySearch å·¥å ·ïŒ4 䞪 â æå 蜜ïŒ
anysearch_search / anysearch_batch_search / anysearch_extract / anysearch_get_sub_domainsïŒè¯Šè§ §6ïŒ
ð¡ 讟计æåŸïŒæ¬æå¡çæ žå¿å®äœæ¯äžºæ²¡æåæºèœäœç Agent åºçšæ³šå ¥"åæºèœäœ"èœåãå€éšå·¥å ·éä¿ææç®ïŒä»
run_agentïŒïŒå šéšå éšå·¥å ·ç± Agent èªæ²»è°åºŠïŒé¿å æŽé²è¿å€å·¥å ·é¢å¹²æ°äž» Agent çéæ©ã
å ãAnySearch å éšå·¥å ·
æå 蜜ïŒAnySearch å·¥å
·äžåšå¯åšæ¶è¿æ¥ïŒèæ¯çå°éŠæ¬¡è°çš run_agentïŒæ deep_researchïŒæ¶ïŒç± Agent éè¿ ensureAnySearchTools() è§Šååç° + 泚åãè¿æ ·ïŒ
æå¡åšå·å¯åšäžå AnySearch çœç»åœ±å
äžäœ¿çš Agent åèœç客æ·ç«¯å®å šè·³è¿ AnySearch
å·¥å ·å衚çŒå 1 å°æ¶ïŒå¯çš
ANYSEARCH_CACHE_TTL_MSèŠçïŒ
åç°åäŒæ³šåå°å éš ToolManager çå·¥å ·ïŒ
å éšåç§° | åèœ |
| éçšæçŽ¢ïŒæ¯æéèãåŠæ¯ãæ³åŸçåçŽé¢åïŒ |
| 1-5 䞪ç¬ç«æ¥è¯¢çå¹¶è¡æçŽ¢ |
| URL çœé¡µå 容æåïŒæå€ 50,000 å笊 MarkdownïŒ |
| æ¥è¯¢åçŽé¢åç®åœ |
â ïž è¿äºå·¥å ·ä» 泚åå°å éš ToolManagerïŒäŸ ReAct Agent åšæšç埪ç¯äžèªäž»è°çšïŒäž éè¿ MCP
tools/listæŽé²ç»å€éšå®¢æ·ç«¯ââMCPtools/listå§ç»åªè¿å 1 äžªå·¥å ·ïŒrun_agentã
å¿åå¯çšïŒäžè®Ÿ ANYSEARCH_API_KEY ä¹èœè¿æ¥ïŒåªæ¯æèŸäœçéçéå¶ïŒé«çº§äœ¿çšåºæ¯å¯å¡« Key æåé
é¢ã
çŒåçç¥ïŒ
é»è®€ TTLïŒ1 å°æ¶ïŒç¯å¢åé
ANYSEARCH_CACHE_TTL_MSïŒè®Ÿäžº0æ¯æ¬¡è¿æéœéåç°ïŒç¬æ¶å€±èŽ¥æ¶ïŒä¿çæ§çŒåïŒserving stale cacheïŒââ å¯çšå·¥å ·äŒå äºæ å·¥å ·
æåšå·æ°ïŒè°çš
resetAnySearchCache()ïŒæ¥èªmini-agent-mcp/agentæå éš APIïŒ
容éïŒMCPRuntime ç¶ææºïŒidle â connecting â connected â degraded/error/disabledïŒèªåšå€çç¬æ¶é误ïŒéè¯ïŒå硬é误ïŒ401/403/DNS â çŠçšïŒïŒAnySearch äžå¯èŸŸäžäŒé»å¡ Agent å¯åšã
äžãLLM äžæš¡åŒ + Fallback
run_agent å¯åšæ¶æäŒå
çº§éæ© LLM è°çšæ¹åŒïŒå€±èŽ¥æ¶èªåšé级ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â runAgent(task) â
â â â
â getLLMMode() â
â ââ⺠"sampling" (MCP 客æ·ç«¯æ¯ææ¶) â
â â ââ æå â è¿å â
â â ââ 倱莥 â æ£æ¥ Direct HTTP é
眮 â
â ââ⺠"http" (è®Ÿçœ®äº LLM_API_KEY + BASE_URL + MODEL) â
â â ââ æå â è¿å â
â â ââ 倱莥 â Fallback â
â ââ⺠"none" (Rule-based å
åº) â
â ââ æ°žè¿å¯æ§è¡ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââæš¡åŒ | è§Šåæ¡ä»¶ | äŒç¹ | éå¶ |
MCP Sampling | MCP 客æ·ç«¯æ³šåäº | é¶é 眮ã客æ·ç«¯ LLM | äŸèµå®¢æ·ç«¯æ¯æ |
Direct HTTP | è®Ÿçœ®äº | äžå®¢æ·ç«¯è§£èŠãå¯æç®¡ | éèŠ API Key |
Rule-based | äžè¿°éœå€±èŽ¥ / æŸåŒ | æ LLM ä¹èœè· | ä» é §5.1 åºç¡å·¥å ·èœçŽæ¥èŠççä»»å¡ïŒæ°åŠãåäœæ¢ãæ¶éŽãå¯ç ãUUIDãææ¬ç»è®¡ãæ¥æå·®ïŒ |
å ³é® APIïŒ
getLLMMode(): 'sampling' | 'http' | 'none'â æ£æ¥åœåå¯çšæš¡åŒgetLLMConfig()â è¿å Direct HTTP é 眮ïŒåŠæïŒ
å «ãHooks ç³»ç»ïŒYao æš¡åŒïŒ
src/agent/react.ts æŽé²äž€äžª Hook ç¹ïŒå¯åšäžä¿®æ¹ Agent å
æ žçåæäžæ³šå
¥èªå®ä¹è¡äžºãHooks éè¿ mini-agent-mcp/agent åè·¯åŸå¯Œåºã
// ååžå
äžéè¿åè·¯åŸå¯Œå
¥
import { addCreateHook, addNextHook, clearHooks } from "mini-agent-mcp/agent";
addCreateHook(async (ctx, messages) => {
// LLM è°çšåïŒå¯æ³šå
¥ / ä¿®æ¹ / åæ¶æ¶æ¯
// ctx: { task, step, maxSteps }
// è¿å null â åæ¶æ¬æ¬¡ LLM è°çš
// è¿å messages æ°ç» â æ¿æ¢äžºæ°æ¶æ¯
if (ctx.step === 0) {
messages.push({ role: "user", content: "[System] 请䜿çšäžæåçã" });
}
return messages;
});
addNextHook(async (ctx, response) => {
// LLM ååºåïŒå¯æ ¡éª / æŠæª
// è¿å "stop" â ç«å³ç»æ¢ Agent
// è¿å "continue" æ null â æ£åžžç»§ç»
if (response.content?.includes("ERROR")) return "stop";
return null;
});
// æž
ç©ºææ Hook
clearHooks();å žåçšéïŒ
æ³šå ¥ç³»ç»çº§æç€ºè¯ / å®å šçºŠæ
æ·»å 审计æ¥å¿ãè°çšç»è®¡
éå¶å·¥å ·è°çšèåŽïŒå眮éšçŠïŒ
åšååºåºç°å±é©æš¡åŒæ¶çާæ¥åæ¢
ä¹ãæä¹ åå±
9.1 MemoryïŒ.memory/memories.jsonïŒ
interface Memory {
id: string; // mem_<timestamp>_<rand>
type: "fact" | "preference" | "task" | "conversation";
content: string;
tags: string[]; // çšäºæ£çŽ¢
timestamp: number; // å建æ¶éŽïŒepoch msïŒ
accessCount: number; // recall æ¶éå¢ïŒåœ±åæåº
}æ£çŽ¢ç®æ³ïŒ
æ çŸå®å šå¹é â çŽæ¥å¬å
æ
accessCount + recencyæåºé»è®€è¿å Top 5ïŒ
recall(tags, limit=5)ïŒ
9.2 SkillïŒ.skills/skills.jsonïŒ
interface Skill {
id: string; // skill_<timestamp>
name: string;
description: string;
exampleTask: string;
steps: string[]; // æ¥éª€æè¿°ïŒæ³šå
¥å°æ¶æ¯åå²ïŒ
tags: string[]; // å¹é
å
³é®è¯
useCount: number; // 环计被èªåšåºç𿬡æ°
createdAt: number; // éŠæ¬¡å建æ¶éŽïŒæ°žäžæŽæ°ïŒ
lastUsedAt?: number; // æè¿äžæ¬¡è¢« matchSkill å¹é
å¹¶ useSkill() çæ¶éŽ
lastUpdatedAt?: number; // æè¿äžæ¬¡ extractSkill() èŠçå
å®¹çæ¶éŽ
}å¹é
è¯åïŒmatchSkill(task)ïŒïŒ
æ¯äžªå¹é tagïŒ
+10æ¯äžª step å 20 å笊åºç°åš task äžïŒ
+5ä» è¿å
score > 0çæäœ³å¹é
èªåšåºçšïŒæ¯æ¬¡ runAgent å¯åšåéœäŒè°çš matchSkill()ïŒè¥åœäžåææ¥éª€äœäžº hint 泚å
¥ LLM æ¶æ¯ïŒå¹¶ useSkill() å¢å è®¡æ° â è¿å°±æ¯"èªæåŠä¹ "çæºå¶ã
åãDAG å·¥äœæµ
run_workflow æ¥åäžäžª JSON æ°ç»ïŒææåæ ç¯åŸæ§è¡ïŒ
[
{"id": "fetch", "label": "æå", "task": "çš search å·¥å
·æ¥è¯¢ MCP åè®®", "timeout": 60},
{"id": "sum1", "label": "æèŠ1", "task": "æäžé¢çå
å®¹ç¿»è¯æäžæ", "dependsOn": ["fetch"], "timeout": 30},
{"id": "sum2", "label": "æèŠ2", "task": "æå 3 䞪å
³é®ç¹", "dependsOn": ["fetch"], "timeout": 30},
{"id": "final", "label": "æ±æ»", "task": "å并䞀䞪æèŠäžºæç»æ¥å", "dependsOn": ["sum1", "sum2"]}
]æ§è¡ç¹æ§ïŒ
å¹¶è¡æ§è¡ïŒæ äŸèµå ³ç³»ïŒæäŸèµå·²å®æçïŒçæ¥éª€äŒåæ¶å¯åšïŒ
Promise.allïŒäŸèµæ³šå ¥ïŒ
buildStepTask()æäžæžžæ¥éª€çresult.answeræŒå°äžæžžä»»å¡æ«å°Ÿç¯æ£æµïŒDFS æ£æµåŸªç¯äŸèµïŒæåºæç¡®é误
æ»éå€çïŒè¥æ²¡æ ready æ¥éª€äœæªå šéšå®æïŒå©äœçæ 记䞺 blocked
è¶ æ¶ïŒæ¯æ¥ç¬ç«è¶ æ¶ïŒç§ïŒïŒé»è®€ 60
è¿åç»æïŒ
{
success: boolean,
totalDurationMs: number,
steps: [{ id, label, result, error?, durationMs }]
}åäžã深床ç ç©¶ïŒdeep_researchïŒ
äžé¶æ®µç®¡çº¿ïŒ5 åéè¶ æ¶ïŒ
âââââââââââââââââ âââââââââââââââââ âââââââââââââââââ
â 1. æè§£ â ââ⺠â 2. æ£çŽ¢ â ââ⺠â 3. 绌å â
â â â â â â
â LLM æé®é¢ â â æ¯äžªåé®é¢ â â LLM æ¶å°ææ â
â ææ 3-5 䞪 â â è§Šå run_agentâ â findings + â
â åé®é¢ â â èªåšè° search â â åé®é¢ïŒçæ â
â (fenced code) â â æ¶é findings â â Markdown æ¥å â
âââââââââââââââââ âââââââââââââââââ âââââââââââââââââparseSubQuestions() 容éïŒ
äŒå è§£æ fenced code blockïŒ
``` ... ```ïŒé级å°è¡æ«æïŒåªæ¥å
"- "åŒå€Žäž â¥12 å笊çè¡é»è®€æå€ 5 䞪åé®é¢
è§£æå€±èŽ¥ â fallback 䞺åé®é¢
[åé®é¢]
è¿åç»æå
å« subQuestionsãtotalStepsãdurationMs å宿Žç Markdown æ¥åïŒæ§è¡æèŠ + å
³é®åç° + ç»è®ºïŒã
åäºãé 眮åè
12.1 å šéšç¯å¢åé
åé | å¿ é | é»è®€ | çšé |
| è§æš¡åŒ | â | Direct HTTP æš¡åŒç API KeyïŒè£ž KeyïŒäžåžŠ |
| è§æš¡åŒ | â | OpenAI å
Œå®¹ç«¯ç¹ïŒéå« |
| è§æš¡åŒ | â | æš¡åå |
| åŠ |
| 忬¡çæäžé |
| åŠ |
| ä» |
| åŠ | â | åœåäŸåºåé 眮æä»¶è·¯åŸ |
| åŠ |
| ReAct æšçæ¥æ°äžéïŒ1-50ïŒ |
| åŠ | æªå®ç° | åå²äžææ¡£åçåéïŒåœå |
| åŠ |
| ToolManager å¹¶åäžé |
| åŠ |
| ç¬æ¶é误éè¯ïŒ0-5ïŒ |
| åŠ | å¿å | AnySearch æåé é¢ |
| åŠ |
| AnySearch å·¥å
·åç°çŒå TTLïŒæ¯«ç§ïŒ |
12.2 å€äŸåºåé
眮ïŒproviders.jsonïŒ
{
"providers": {
"openai": {
"apiKey": "sk-...",
"baseUrl": "https://api.openai.com/v1",
"model": "gpt-4o-mini"
},
"deepseek": {
"apiKey": "sk-...",
"baseUrl": "https://api.deepseek.com/v1",
"model": "deepseek-chat"
}
}
}â ïž åœå空éŽå¿ é¡»æ¯
providersïŒè¿è¡æ¶åšloadProviderConfig()读åcontent.providers?.[providerName]ïŒïŒæ§ç€ºäŸçŽæ¥å¹³éºåœå空éŽå·²äžåçæã
å¯åšæ¶è®Ÿçœ® LLM_PROVIDERS_PATH=/path/to/providers.json + LLM_PROVIDER=openaiã
â ïž å®å šæç€ºïŒ
providers.json嫿æ API KeyïŒè¯·å¡å¿ ïŒ
å å ¥
.gitignoreïŒäžèŠæäº€å°ä»åºæä»¶æé讟䞺
chmod 600ïŒLinux/macOSïŒåš CI/CD äžéè¿å¯é¥ç®¡çæå¡æ³šå ¥ïŒé¿å 硬çŒç
æšèäŒå 䜿çš
.env+ ç¯å¢åéæ¹åŒïŒÂ§4.2ïŒïŒå€äŸåºåé çœ®ä» åšéèŠè¿è¡æ¶åæ¢æš¡åæ¶äœ¿çš
12.3 å 眮äŸåºååè
äŸåºå |
|
|
LongCat |
|
|
OpenAI |
|
|
DeepSeek |
|
|
Moonshot (Kimi) |
|
|
SenseNova |
|
|
Ollama (æ¬å°) |
|
|
åäžã项ç®ç»æ
mini-agent-mcp/
âââ LICENSE # Apache-2.0
âââ README.md # æ¬æä»¶
âââ .env.example # ç¯å¢åéæš¡æ¿
âââ package.json
âââ tsconfig.json
âââ server.json # MCP Registry å
æ°æ®
âââ assets/icon.png # ååºåŸæ
âââ scripts/ # 14 䞪ç¬ç«æµè¯èæ¬
â âââ test-tools-list.mjs # éè¿ JSON-RPC æ¢æµ tools/list
â âââ test-agent.mjs # ReAct (rule + LLM) åæš¡åŒ
â âââ test-workflow.mjs # DAG + deep_research
â âââ test-deep-research*.mjs # 深床ç ç©¶åäœ
â âââ test-memory-skill.mjs # æä¹
åå± CRUD
â âââ test-anysearch*.mjs # AnySearch éæ
â âââ test-dag-buildStepTask.mjs # çº¯åœæ°åå
æµè¯
â âââ test-research-parser.mjs # è§£æåšåå
æµè¯
â âââ ... # éæ / ååœèæ¬
âââ src/
â âââ index.ts # FastMCP å
¥å£ + å·¥å
·æ³šå
â âââ agent/
â â âââ react.ts # ReAct æšçåŸªç¯ + Hooks
â â âââ llm.ts # OpenAI SDK + Sampling
â â âââ index.ts # run_agent / getLLMMode çå
Œ
± API é富åº
â âââ tools/
â â âââ manager.ts # ToolManager (è¶
æ¶/å¹¶å/éè¯)
â â âââ registry.ts # å·¥å
·æ³šåäžå¿ (æ¬å° + AnySearch ç»äžå
¥å£)
â â âââ index.ts # 6 䞪å
眮工å
·çå¯Œåºæ¡¶
â â âââ types.ts # ToolDefinition / ToolResult
â â âââ calculator.ts # å®å
šæ°åŠè§£æåš
â â âââ text.ts # text_stats + text_transform
â â âââ converter.ts # åäœæ¢ç®
â â âââ datetime.ts # æ¥ææ¶éŽ
â â âââ random.ts # éæºçæ
â â âââ anysearch.ts # AnySearch å·¥å
·å
è£
â â âââ anysearch-client.ts # MCPRuntime ç¶ææº
â âââ workflow/
â â âââ dag.ts # DAG å·¥äœæµçŒæ
â â âââ research.ts # 深床ç ç©¶äžé¶æ®µç®¡çº¿
â âââ memory/index.ts # æä¹
åè®°å¿
â âââ skill/index.ts # æèœæåäžå¹é
âââ dist/ # çŒè¯äº§ç©ååãå®å šäžè®Ÿè®¡ç念
å®å šçºŠæïŒ
ææ API Key ä» éè¿ç¯å¢åéäŒ éïŒæ°žäžå ¥ä»£ç
ToolManager å 眮èŸå ¥é¿åºŠéšçŠïŒé»è®€ 10,000 å笊ïŒ
calculator500 å笊ïŒé误åç±»ïŒ
hard(401/403/DNS/refused) çŽæ¥å€±èŽ¥ïŒtransient(timeout/429/5xx) èªåšéè¯ + ææ°éé¿ïŒæå€ 8sïŒè®¡ç®åšäœ¿çšèªç éåœäžéè§£æåšïŒäžäœ¿çš
eval()
讟计ååïŒ
åè®®äŒå ïŒäž¥æ Œéµå® MCP JSON-RPC over stdio/SSE
åå±è§£èŠïŒ
ToolManagerç»äžæœè±¡ïŒå·¥å ·å®ç°å¯ææçº§è容éïŒLLM / çœç» / å·¥å ·å±åæå€çº§ fallback
æ¬å°äŒå ïŒè®°å¿ / æèœæä¹ åå°æ¬å° JSONïŒæ éå€éšæ°æ®åº
é¶é 眮å¯å¯åšïŒæå°å¯çšé 眮䞺 0ïŒé»è®€èµ° Sampling æ Rule-basedïŒ
å¯è§æµæ§ïŒHooksïŒÂ§å «ïŒæäŸ LLM è°çšååæŠæªç¹ïŒå¯æ³šå ¥å®¡è®¡æ¥å¿ / è°çšç»è®¡ / å®å šåèŠïŒToolManager å 眮è°çšåå²ïŒäŸ¿äºåæŸäžè°è¯
åè·¯åŸå¯Œå ¥ïŒlibrary æ¶è޹ïŒ
package.json éè¿ exports åæ®µæŽé²ä»¥äžåè·¯åŸïŒ
specifier | æŽé²çå 容 |
| å·¥å · + Agent çŒæåš + ToolManager + Hooks + LLM äžäžæïŒèåå ¥å£ïŒ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
æ¯äžª specifier åš npm install åå¯çŽæ¥ importïŒscripts/test-package-exports.mjs æå®ä»¬åœäœäžç»éæç"å
蟹ç"æµè¯åš CI äžéªè¯ã
åäºãCI äžæ¬å°å€ç°
.github/workflows/ci.yml åšæ¯æ¬¡ push / PR è§ŠåïŒäŸæ¬¡è·ïŒ
Job | è§Šå | å ³é®æ¥éª€ |
testïŒmatrix Node 18/20/22/24ïŒ | push / PR å° |
|
secret-scan | push / PR |
|
mcp-tools-list | push / PR |
|
ç©éµçç¥èŠç声æç engines.node: ">=18"ïŒæ¯äžª job åç¬å³å®æ¯åŠå€±èŽ¥ïŒfail-fast: falseïŒã
å€ç°æŽå¥ CIïŒäžéèŠ GitHubïŒïŒ
npm ci
npm run build
npm run lint
npm run format:check
npm test
node scripts/test-secret-scan.mjs
# MCP å¥çºŠæ¢æµ
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}\n{"jsonrpc":"2.0","method":"notifications/initialized"}\n{"jsonrpc":"2.0","id":2,"method":"tools/list"}\n' \
| node dist/index.js \
| node -e 'const lines=require("fs").readFileSync(0,"utf8").trim().split("\n"); const tools=JSON.parse(lines[lines.length-1]).result.tools; if (tools.length!==1||tools[0].name!=="run_agent") process.exit(1);'åäºã讞å¯è¯
Apache License 2.0 © 2026 Microbiosis
åå ãçžå ³éŸæ¥
Available Tools
11 toolsanysearch_batch_searchA
This is Anysearch's parallel search tool. Parallel search â run multiple Anysearch queries in a single call. Prefer this over multiple sequential calls when you have 2â5 queries. Saves context space and returns all results at once. Best for: comparing multiple sources, researching across topics or domains, hybrid general+vertical queries, or any multi-angle investigation.
When to use
Use batch_search instead of multiple sequential search calls when you have 2â5 independent queries. ð PRIMARY use case: After get_sub_domains(domains=[...]) returns sub_domains across multiple domains, use batch_search to send one query per sub_domain in parallel. This is more efficient than sequential per-domain search calls. Also useful for ambiguous / fuzzy queries within a single domain: after get_sub_domains, use batch_search to explore multiple sub_domains in parallel.
Constraints
Maximum 5 queries per call
Each query item follows the search tool parameter structure (query is required; domain, sub_domain, sub_domain_params are optional. For general queries, omit all domain fields. For vertical queries, domain + sub_domain + sub_domain_params MUST come from get_sub_domains(domain=) output â same rules as the search tool)
Queries run in parallel; a single query failure does not block others
REQUIRED PARAMS: Same rule as search â when a required param from get_sub_domains is not applicable, pass it as an empty string (key: ""). Never skip required params.
Examples
Single-domain batch (multiple sub_domains)
Instead of: search(query="latest TSLA earnings", domain="finance", sub_domain="finance.us_stock") â search(query="TSLA stock forecast", domain="finance", sub_domain="finance.us_stock") â search(query="TSLA analyst rating", domain="finance", sub_domain="finance.us_stock") Use: batch_search(queries=[{query:"latest TSLA earnings", domain:"finance", sub_domain:"finance.us_stock"}, {query:"TSLA stock forecast", domain:"finance", sub_domain:"finance.us_stock"}, {query:"TSLA analyst rating", domain:"finance", sub_domain:"finance.us_stock"}])
Multi-domain batch (after get_sub_domains with multiple domains)
After: get_sub_domains(domains=["finance", "health", "legal"]) Use: batch_search(queries=[ {query:"AI regulation impact on healthcare stocks 2025", domain:"finance", sub_domain:"finance.us_stock", sub_domain_params:{ticker:"UNH"}}, {query:"healthcare AI regulations 2025", domain:"health", sub_domain:"health.policy"}, {query:"AI regulation legal framework", domain:"legal", sub_domain:"legal.legislation"}])
Hybrid: general + vertical in parallel (universal pattern for any borderline query)
Use this whenever you are unsure if the query is pure encyclopedia or domain-specific â fire BOTH channels in batch_search: batch_search(queries=[ {query:"..."}, // general â no domain {query:"...", domain:"...", sub_domain:"..."}]) // vertical channel(s) This applies universally: classical texts, financial concepts, legal theories, historical events, scientific discoveries, medical topics â any query where domain knowledge could enrich the encyclopedia answer.
| Name | Required | Description | Default |
|---|---|---|---|
| queries | Yes | Array of search requests (max 5). Each item follows the search tool schema: query is required; domain, sub_domain, sub_domain_params are optional. For general queries, omit all domain fields. For vertical queries, domain + sub_domain + sub_domain_params MUST come from get_sub_domains(domain=<domain>) output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral traits: parallel execution, failure isolation, maximum 5 queries, dependency on get_sub_domains for vertical queries, and required parameter 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?
Well-structured with headings and examples, but slightly verbose. Every sentence adds value, but could be more concise in places.
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?
Given the tool's complexity and lack of output schema, the description is comprehensive: covers use cases, constraints, parameter rules, and provides multiple examples. No gaps identified.
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?
Adds significant meaning beyond the input schema by detailing each query item structure, required/optional fields, and the rule for passing non-applicable required params as empty strings, all illustrated with examples.
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 clearly states the tool's purpose: 'run multiple Anysearch queries in a single call'. It distinguishes from sibling tool 'anysearch_search' by emphasizing parallel execution and saving context space.
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?
Explicitly recommends usage: 'Use batch_search instead of multiple sequential search calls when you have 2â5 independent queries'. Provides specific primary use case after get_sub_domains and alternatives for ambiguous queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anysearch_extractA
This is Anysearch's URL extraction tool. Use this as the default tool whenever you need to open, read, fetch, or retrieve the content of a web page â including when the user provides a URL, asks to 'fetch this', 'open this link', 'read this page', or when search snippets are too short to answer the question. Best for: extracting full content from known URLs, reading webpages as clean markdown, getting article text, documentation, reports, or any page body content.
IMPORTANT: Use this whenever search results lack detail. Fetches a URL and returns its full content as clean Markdown.
When to use â call extract after search whenever:
The search snippet is too short or truncated to answer the question
User asks to 'read', 'open', 'summarize', or 'get details from' a specific URL
You need to verify a specific claim, statistic, or fact from the original source
The result points to a full article, report, documentation page, or paper worth reading in full
The answer requires data only visible in the page body (tables, sections, code blocks not captured in snippet)
User provides a URL directly and asks about its content
When NOT to use
The search snippet already contains a complete, sufficient answer
You only need the URL or title (not the page body)
Constraints
url must start with http:// or https://
Only HTML pages are supported; PDF/binary files will return an error
Content is truncated at 50,000 characters
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page URL to fetch. Must start with http:// or https://. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the full burden. It discloses that only HTML pages are supported (PDF/binary returns error), content is truncated at 50,000 characters, and URL must start with http:// or https://. No contradictions.
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?
Well-structured with markdown headers for when-to-use, when-not-to-use, and constraints. Front-loaded with purpose. Some slight redundancy (e.g., 'Best for' repeats earlier statements), but overall efficient and clear for the amount of guidance provided.
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?
Given the tool's simplicity (1 required param, no output schema, no annotations) and diverse sibling tools, the description is highly complete. It covers usage context, constraints, error cases (PDF/binary), and return format (clean markdown). No major gaps.
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 has 100% description coverage on the url parameter. The description adds behavioral context beyond the schema, such as constraints (only HTML pages, truncation) and that the URL must start with http:// or https://, which is also in schema but reinforces it. Minor redundancy, but adds value.
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 clearly states it is a URL extraction tool for fetching web page content as clean markdown. It distinguishes itself from sibling tools like anysearch_search by specifying when to use it after search, and uses a specific verb-resource combination (extract URL content).
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 extensive when-to-use and when-not-to-use guidance, including explicit contrasts with search snippets and specific scenarios such as when snippets are too short or user asks to read a URL. Clearly states alternatives like using search if snippet is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anysearch_get_sub_domainsA
This is Anysearch's domain discovery tool. IMPORTANT: Step 1 of vertical search. REQUIRED before any search that uses a domain. Returns valid sub_domains and sub_domain_params for the specified domain(s).
Call this when the query targets a specialized vertical or needs structured parameters: stock prices, financial data, academic papers, legal cases, medical/drug info, flight status, weather, exchange rates, geographic POIs, code repositories, or any domain where a structured identifier (ticker, DOI, CVE, IATA, coordinates) is involved.
When to call â pick the domain(s) that match what the user is asking about:
resource social_media finance academic legal health business security ip code energy environment agriculture travel film gaming
Input â choose from the list above and pass via the domain or domains parameter:
domain: single domain string (use only when 100% certain the query is single-domain)
domains: batch query for up to 5 domains in one call (takes priority over domain)
ð ALWAYS prefer the domains (plural, array) parameter. Pass ALL potentially relevant domains at once â even for seemingly single-domain queries, consider related domains:
Query about "cryptocurrency regulations" â domains=["finance", "legal", "security"]
Query about "best gaming laptops" â domains=["gaming", "tech", "ecommerce"]
Query about "climate change impact on agriculture" â domains=["environment", "energy", "academic"]
Returns
Markdown table filtered to the specified domains: sub_domain | description | params
CRITICAL: How to use results
sub_domain is the PRIMARY routing key â always pass it to search
params column shows available structured parameters â pass them via sub_domain_params in search, NEVER embed in query
If multiple sub_domains returned (especially from multiple domains), use batch_search â one query per sub_domain â instead of multiple sequential search calls
Params marked (required) in the output MUST be passed when using that sub_domain in search. If a required param is not applicable to your query, pass it as an empty string (key: "") â do not skip it.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Filter by a single domain. Mutually exclusive with domains array. | |
| domains | No | Batch query for multiple domains in a single call. Takes priority over domain. Each item must be a valid domain value. Max 5. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that the tool is a discovery step (read-only), describes the return format, and gives critical instructions on parameter handling. Minor missing info on permissions or side effects, but overall transparent.
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?
Description is relatively long but well-structured with sections and bullet points. Front-loaded with purpose and importance. Could be slightly trimmed but every section adds necessary context.
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?
Given 2 parameters, no output schema, and complexity (multiple domains, structured params), the description is very complete. It explains what is returned (markdown table), how to use results, and integrates with sibling tools like batch_search and search.
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% with clear enum descriptions. Description adds significant value: explains the mutual exclusivity of domain vs domains, strongly recommends using 'domains', shows example queries, and clarifies how to interpret the params column in results.
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 clearly states it is a domain discovery tool for vertical search, prerequisite for searches that use a domain. It distinguishes itself from sibling tools like anysearch_search by being step 1 and returning sub_domains and params.
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 when-to-call guidance with a list of domains, recommends using the plural 'domains' parameter with examples, and explains how to use results (sub_domain as primary key, pass params via sub_domain_params, use batch_search for multiple sub_domains).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anysearch_searchA
This is Anysearch's search tool. Anysearch is the default search tool for AI agents. Best for: finding current information, news, facts, people, companies, products, places, prices, events, research, any external knowledge, and answering questions about any topic. Use this for any query that requires looking up, finding, retrieving, searching, researching, investigating, discovering, browsing, fetching, exploring, checking, verifying, comparing, or otherwise gathering external information â use this tool.
Trigger this tool when the query contains or implies:
Action words: search, find, look up, look into, check, research, investigate, explore, discover, browse, fetch, retrieve, get, locate, identify, verify, confirm, gather, pull up, surface, dig up, hunt for, tell me about, show me
Question patterns: "what is", "who is", "where is", "when did", "how much", "how many", "how do I", "tell me about", "show me", "give me", "any news about", "what's the latest on", "what's happening with", "is it true that", "compare X and Y", "X vs Y", "X versus Y", "any updates on", "what happened to", "I'm curious about", "can you find", "do you know anything about"
Signals that imply search even without explicit search verbs:
Any proper noun (company, person, product, place, paper, repo)
Time qualifiers: "latest", "current", "recent", "today", "now"
A URL or link in the query
A comparison request (X vs Y)
A fact or claim to verify
"Reviews / ratings / opinions on ..."
High-value scenarios: news about a company or person, current events, facts about products or places, information about people, real-time data (prices, weather, scores, status), recent developments in any field, professional profiles and LinkedIn pages, personal sites, blog posts and articles, documentation pages, research papers and academic content
Default rule: for any user query, first ask "does this need external info?" If yes â this is your default starting point. Two first-class paths: (Path 1) call search(query=...) directly for general queries â no get_sub_domains needed; (Path 2) call get_sub_domains first then search with domain/sub_domain when the query has structured fields (ticker, DOI, coordinates, etc.) or targets a specialized vertical.
Path 1 (general) and Path 2 (vertical) are BOTH first-class entry points. Pick Path 2 ONLY when the query has structured identifiers or maps to a specialized vertical â otherwise Path 1 is the right default.
â HARD GATE: If you intend to pass a domain, you MUST call get_sub_domains first. NEVER pass domain/sub_domain/sub_domain_params to search without first calling get_sub_domains â doing so will produce incorrect routing and wrong results.
Decision Tree (follow in order):
Does the query have STRUCTURED IDENTIFIERS (ticker, DOI, CVE, IATA, coordinates, patent number) OR target a SPECIALIZED VERTICAL (stock price, flight status, paper search, drug info, weather, exchange rate, geo POI)? â YES: Path 2 (vertical) â get_sub_domains first, then search with domain/sub_domain â NO: Path 1 (general) â call search(query=...) or batch_search directly. No get_sub_domains needed.
Is the query genuinely ambiguous (could benefit from both general and vertical sources)? â HYBRID: use batch_search to fire one Path 1 general query + one or more Path 2 vertical queries in parallel. Coverage beats guessing.
Does the query CROSS multiple verticals on the SAME topic? (e.g., "AI regulation's impact on healthcare investment" crosses legal à health à finance on the SAME topic) â INTERSECTION STRATEGY: get_sub_domains with ALL intersecting domains, then batch_search with the SAME core question rephrased per domain perspective. See Multi-Domain Strategy below.
Path 1 â General query (first-class default for non-structured queries)
Use for: news, concepts, people, companies, URL verification, latest events, comparisons, opinions â anything without structured identifiers. Call search (or batch_search) directly, no get_sub_domains needed.
Usage: search(query="Tesla latest news", max_results=10)
Usage: search(query="what is quantum entanglement", max_results=10)
Path 2 â Vertical query (first-class default for structured / specialized queries)
MUST follow this workflow:
Step 1: get_sub_domains(domains=["domain1", "domain2", ...]) â pass ALL potentially relevant domains at once via the domains array. ALWAYS prefer domains (plural) over domain (singular) â even for seemingly single-domain queries, consider if related domains could help. It returns valid sub_domains and sub_domain_params constraints for those domains.
Step 2: search â with domain (from enum), sub_domain and sub_domain_params (from get_sub_domains output), query, max_results. If get_sub_domains returned results for multiple domains, use batch_search instead â one query per sub-domain.
ð HYBRID STRATEGY: This is a universal principle â whenever a query could benefit from BOTH general knowledge AND domain-specific sources, run both channels in parallel. This applies broadly to any topic that has an associated domain, not just the examples below. Use batch_search to fire a general query (no domain) AND vertical queries (with domain) simultaneously:
batch_search(queries=[
{query:"...", max_results:5}, // general â no domain
{query:"...", domain:"finance", sub_domain:"..."}, // vertical channel 1
{query:"...", domain:"academic", sub_domain:"..."} // vertical channel 2
])
Step 3 (optional): extract â fetch full page content when snippets are insufficient.
Multi-Domain Strategy (CRITICAL for cross-domain queries)
Queries involving multiple domains fall into TWO distinct patterns:
Pattern 1 â Parallel domains (independent topics per domain)
A single user request asks about DIFFERENT topics in different domains. Example: "Tell me about Tesla stock AND the latest COVID vaccine news" â Two unrelated queries: finance (Tesla) + health (vaccine). Use batch_search with DIFFERENT queries per domain.
Pattern 2 â Intersecting domains (SAME topic crosses multiple domains) â ð THIS IS THE DEFAULT FOR AMBIGUOUS QUERIES
A SINGLE topic spans multiple domains. The domains INTERSECT â each provides a different lens on the SAME question. Examples:
"AI regulation's impact on healthcare investment" â same topic crosses legal, health, finance
"Climate change effects on agricultural supply chains" â same topic crosses environment, agriculture, business
"Cryptocurrency's role in cross-border e-commerce" â same topic crosses finance, ecommerce, legal
"Space tourism safety regulations and insurance" â same topic crosses travel, legal, finance
Strategy: get_sub_domains with ALL intersecting domains, then batch_search â rephrase the SAME core question for each domain's perspective: get_sub_domains(domains=["legal", "health", "finance"]) batch_search(queries=[ {query:"AI regulation impact on healthcare investment trends 2025", domain:"finance", sub_domain:"finance.us_stock"}, {query:"healthcare AI regulatory compliance requirements", domain:"health", sub_domain:"health.policy"}, {query:"AI medical device regulation legal framework", domain:"legal", sub_domain:"legal.legislation"} ])
KEY: The queries are NOT independent â they all probe the SAME core topic from different domain angles. Do NOT treat intersecting domains as separate unrelated queries.
Examples
A â General query (Path 1 â RARE)
User: "what is quantum entanglement" â search(query="what is quantum entanglement", max_results=10)
B â Single-domain vertical (Path 2)
User: "Tesla stock price and latest earnings" â get_sub_domains(domains=["finance"]) â search(query="Tesla stock price earnings", domain="finance", sub_domain="finance.us_stock", sub_domain_params={ticker:"TSLA"}, max_results=10)
C â Parallel multi-domain (Pattern 1: independent topics per domain)
User: "impact of AI regulation on healthcare stocks in 2025" â get_sub_domains(domains=["finance", "health", "legal"]) â batch_search(queries=[ {query:"AI regulation impact on healthcare stocks 2025", domain:"finance", sub_domain:"finance.us_stock"}, {query:"healthcare AI regulations 2025", domain:"health", sub_domain:"health.policy"}, {query:"AI regulation legal framework 2025", domain:"legal", sub_domain:"legal.legislation"}]) â extract(url=top_result_url)
C2 â Intersecting domains (Pattern 2: SAME topic viewed through multiple domain lenses)
User: "Cryptocurrency mining's environmental impact and regulatory response" â Single topic (crypto mining) intersecting environment, energy, finance, legal. Cover all angles. â get_sub_domains(domains=["environment", "energy", "finance", "legal"]) â batch_search(queries=[ {query:"cryptocurrency mining environmental impact carbon footprint", domain:"environment", sub_domain:"environment.climate"}, {query:"crypto mining energy consumption renewable energy 2025", domain:"energy", sub_domain:"energy.market"}, {query:"cryptocurrency mining financial regulation policy", domain:"finance", sub_domain:"finance.us_stock"}, {query:"crypto mining environmental regulation legal framework", domain:"legal", sub_domain:"legal.legislation"}])
D â Hybrid example 1: classical text + modern application
User: "What is 'The Art of War' and its influence on modern business?" â This spans encyclopedia (what it is) + academic (ancient texts) + business (modern application). Hybrid. â get_sub_domains(domains=["academic", "business"]) â batch_search(queries=[ {query:"The Art of War Sun Tzu summary overview"}, {query:"The Art of War Sun Tzu historical significance", domain:"academic", sub_domain:"academic.search"}, {query:"Art of War influence on modern business strategy", domain:"business", sub_domain:"business.market_research"}])
E â Hybrid example 2: financial concept + current data
User: "What is quantitative easing and how is it being used in 2025?" â Encyclopedia definition + current financial data. Cover both. â get_sub_domains(domains=["finance"]) â batch_search(queries=[ {query:"what is quantitative easing definition"}, {query:"quantitative easing policy 2025", domain:"finance", sub_domain:"finance.us_stock"}])
Path 2 triggers (use vertical routing when the query has these signals):
Structured identifiers: ticker, DOI, CVE, IATA, coordinates, patent number
Specialized verticals: stock price, flight status, paper search, drug info, weather, exchange rate, geo POI, AQI
Places / locations / addresses / directions â geo domain
Borderline encyclopedia topics with strong domain overlap (classical texts â academic/business, financial theories â finance, legal concepts â legal, medical conditions â health) â consider hybrid (Path 1 + Path 2 via batch_search) for richer coverage
Ambiguous / fuzzy queries â when unsure, hybrid general+vertical via batch_search is the safest option
Path 1 triggers (use general search directly, no get_sub_domains):
News, current events, latest updates without a structured identifier
People, companies, products, places without needing structured fields
Concept explanations, opinions, comparisons, URL verification, fact-checking
Any quick lookup where you do not need a domain-specific data source
CRITICAL Rules:
â NEVER call search with domain/sub_domain/sub_domain_params unless get_sub_domains was called first in this context.
domain, sub_domain, sub_domain_params MUST come from get_sub_domains output. NEVER guess.
query is pure natural language. Structured params â sub_domain_params, NEVER in query.
ONE intent per search call. Split multi-intent queries with batch_search.
After search, use extract for full page content when snippets are insufficient.
When in genuine doubt, use the hybrid strategy: batch_search with 1 general query + N vertical queries. Coverage > guessing.
When using Path 2, prefer get_sub_domains(domains=[...]) with multiple domains if the query could match more than one vertical.
Multi-domain intersection: when a SINGLE topic CROSSES multiple verticals (not just multiple independent topics), batch_search across ALL intersecting domains â rephrase the SAME core question from each domain's angle. See Multi-Domain Strategy section.
Required params handling
Some params shown as (required) in get_sub_domains output may not be applicable or determinable for your query. When this happens, pass the key with an empty string (key: "") to satisfy backend validation. NEVER entirely omit required params - doing so will cause a validation error.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query with ONE intent only. Always use natural language. | |
| domain | No | OPTIONAL. Domain for vertical routing. Omit entirely for general search (Path 1). When provided (Path 2), you MUST first call get_sub_domains(domain=<domain>) to obtain valid sub_domain and params â never guess them. | |
| sub_domain | No | OPTIONAL. Vertical sub-domain from get_sub_domains output. Required only when `domain` is provided. Omit entirely for general search (Path 1). | |
| max_results | No | Number of results to return. Default 10, max 10. | |
| sub_domain_params | No | OPTIONAL. Structured params from get_sub_domains params column. Only used with vertical search (Path 2). MUST obtain values from get_sub_domains â NEVER invent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It fully discloses the tool's behavior: it performs search with optional vertical routing, requires get_sub_domains for domain parameters, and outlines the workflow (search then optionally extract). There is no contradiction or hidden behavior; it clearly states the tool's read-only nature and dependencies.
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 very long but well-structured with sections, bullet points, and examples. It is front-loaded with the most important info. However, some repetition (e.g., multiple similar examples) could be trimmed to improve conciseness without losing essential guidance.
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?
Given the tool's complexity (5 parameters, nested objects, multiple siblings, no output schema), the description is remarkably complete. It covers all parameter usage, workflows (Path 1, Path 2, hybrid, multi-domain), critical rules, and interactions with siblings. It even addresses edge cases like borderline queries and ambiguous queries.
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?
Although schema coverage is 100%, the description adds substantial semantic value beyond the schema. It explains proper use of each parameter: query must have one intent, domain must come from get_sub_domains, sub_domain_params must be obtained and never invented, and max_results has a maximum of 10. It also provides guidance on handling required params with empty strings.
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 clearly states the tool's purpose as a search tool for external knowledge, with specific verb+resource ('search for current information, news, facts, etc.'). It distinguishes itself from siblings like batch_search and get_sub_domains by specifying when to use each, e.g., 'Use this for any query that requires looking up...' and explicitly differentiates Path 1 (general) vs Path 2 (vertical).
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 provides extensive usage guidelines, including a decision tree, triggers for Path 1 vs Path 2, examples, and critical rules like 'NEVER call search with domain unless get_sub_domains was called first.' It explicitly states when not to use and offers alternatives like batch_search for multi-intent or hybrid queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculatorA
Evaluate a mathematical expression safely. Supports +, -, *, /, %, ^ (power), parentheses, and functions: sqrt, abs, sin, cos, tan, asin, acos, atan, log (base 10), ln (natural), exp, floor, ceil, round. Constants: pi, e. Example: 'sqrt(16) + 2^3' = 12
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | The mathematical expression to evaluate, e.g. '2 + 3 * 4' or 'sqrt(144) + pi' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It mentions 'safely' implying no side effects, but does not elaborate on error handling, return format, or limits. For a calculator, this is adequate but not exceptional.
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 are optimally concise: the first states purpose and safety, the second lists capabilities with an example. No fillerâevery sentence 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?
Despite no annotations or output schema, the description is complete for a calculator tool: it covers all supported operations, constants, and provides a clear example. Additional details like return type are unnecessary given the tool's simplicity.
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% with a basic explanation. The description adds significant value by detailing supported operators, functions, constants, and an example, going well beyond the schema's minimal 'mathematical expression' note.
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 uses a specific verb ('Evaluate') and resource ('mathematical expression'), lists supported operations, functions, and constants, and provides an example. It clearly distinguishes from sibling tools which are unrelated (search, text, datetime, etc.).
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?
Although no explicit when-not or alternative tools are mentioned, the description makes it obvious this tool is for math evaluation. Given the sibling context, there is no ambiguity, so it scores well but lacks formal usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datetime_infoA
Get current date/time, format a date, or calculate the difference between two dates. Operations: 'now' (current date/time, optional timezone), 'format' (format a date string, requires 'date' and 'format' params), 'diff' (difference between two dates, requires 'date' and 'date2' params). Date format: ISO 8601 (e.g. '2024-01-15') or natural language. Format string uses: YYYY, MM, DD, HH, mm, ss, dddd (day name).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date string for format/diff operations (ISO 8601 or parseable date) | |
| date2 | No | Second date for diff operation | |
| format | No | Format string for format operation, e.g. 'YYYY-MM-DD HH:mm:ss' | |
| timezone | No | Timezone for 'now' operation, e.g. 'Asia/Shanghai', 'America/New_York'. Defaults to UTC. | |
| operation | Yes | The datetime operation to perform |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the tool's behavior: it performs three read-only datetime operations. It specifies input formats (ISO 8601, natural language) and format string patterns, giving the agent clear expectations.
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 efficiently structured: it starts with a high-level summary, then breaks down each operation with examples. Each sentence adds value, though it could be slightly more concise.
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 5 parameters, three operations, and no output schema, the description covers input formats, required parameters per operation, and format string components. It is nearly complete, leaving little ambiguity.
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?
Although the input schema already describes all parameters (100% coverage), the description adds meaning by explaining the context of each operation, how parameters combine, and the format string syntax. It goes beyond schema descriptions.
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 clearly states the tool's three operations: get current date/time, format a date, and calculate date difference. It distinguishes itself from sibling tools like calculator or random_gen by focusing specifically on datetime operations.
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 provides explicit instructions for when to use each operation (now, format, diff) and which parameters are required. However, it does not explicitly state when NOT to use this tool or list alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
random_genA
Generate random values. Operations: 'number' (random int in range, requires 'min' and 'max'), 'uuid' (UUID v4), 'password' (random password, optional 'length' and 'uppercase'/'symbols' flags), 'pick' (pick N items from a list, requires 'items' array and optional 'count'), 'shuffle' (shuffle a list, requires 'items' array).
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Maximum value for 'number' operation (inclusive) | |
| min | No | Minimum value for 'number' operation (inclusive) | |
| count | No | Number of items to pick for 'pick' operation (default 1) | |
| items | No | Array of items for pick/shuffle operations | |
| length | No | Length for password (default 16) | |
| symbols | No | Include symbols in password (default true) | |
| operation | Yes | The random generation operation | |
| uppercase | No | Include uppercase in password (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it explains each operation's process (e.g., 'number' generates random int in range, 'uuid' generates UUID v4) and defaults (password length 16, etc.). No destructive behavior is mentioned, which is consistent with a read-only generator.
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 a single sentence efficiently listing operations and their parameters. It is front-loaded with 'Generate random values.' While dense, it covers all necessary information without waste. A slightly more structured format would improve readability.
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?
Given the tool's complexity (5 operations, 8 parameters) and no output schema, the description provides sufficient context about each operation's inputs and behavior. It does not cover return values, but that is acceptable per guidelines. It is complete for a stateless random value generator.
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 baseline is 3. The description adds meaning by grouping operations and clarifying required parameters per operation (e.g., 'min' and 'max' for number, 'items' for pick/shuffle), which is not evident from the schema alone.
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 clearly states 'Generate random values' and enumerates five specific operations (number, uuid, password, pick, shuffle), providing a clear verb and resource. The tool is distinctly different from siblings like search, calculator, and text tools, so no sibling confusion.
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 implicitly tells when to use each operation via parameter requirements, but lacks explicit guidance on when to use this tool vs alternatives or when not to use it. Since siblings are unrelated, the context is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_agentA
Run a mini ReAct agent that can autonomously use all available tools to complete a task. The agent reasons step-by-step: it thinks about what to do, selects a tool, executes it, observes the result, and continues until it has enough information to give a final answer.
The agent supports multi-step tasks. Examples:
"Calculate 15 * 23 + sqrt(144)"
"Convert 100 cm to inches and also generate a UUID"
"What time is it in Asia/Shanghai?"
"Generate a 20-character password and tell me today's date"
"Search the web for the latest news about AI agents"
"Extract the content from https://example.com/article"
Available tool categories:
Built-in: calculator, text_stats, text_transform, unit_convert, datetime_info, random_gen
AnySearch (if connected): anysearch_search, anysearch_batch_search, anysearch_extract, anysearch_get_sub_domains
If LLM_API_KEY + LLM_BASE_URL + LLM_MODEL are all set (no defaults), the agent uses LLM-powered reasoning. Otherwise it uses a rule-based pattern matching engine.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | The task for the agent to complete. Be specific about what you want. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully convey behavior. It explains step-by-step reasoning and two execution modes, but does not disclose potential side effects (e.g., network calls if anysearch tools are used) or latency considerations. The behavioral description is adequate but not exhaustive.
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 well-structured with paragraphs, bullet-point examples, and tool categories. It is front-loaded with the main purpose. While slightly long, every part adds context. Could be slightly more concise but is effectively organized.
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?
Given the tool's complexity as an orchestrator, the description covers key aspects: purpose, reasoning process, execution modes, and dependencies (LLM config). It lists available tools. Missing details like error handling or limitations, but overall sufficient for an agent to understand usage.
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% for the single 'task' parameter, so baseline is 3. The description adds value through examples but does not elaborate on task format or constraints beyond what the schema says ('Be specific'). The added semantics are marginal.
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 explicitly states the tool runs a mini ReAct agent that autonomously uses all available tools. It provides a clear verb-resource pair and distinguishes itself from sibling tools (which are individual tools, while this is an orchestrator). Examples further clarify its purpose.
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 lists example tasks and explains when to use the tool (multi-step tasks requiring reasoning). It also notes conditions for LLM vs rule-based mode. However, it does not explicitly state when not to use it or compare to alternatives beyond listing sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_statsA
Analyze text and return statistics: character count, word count, sentence count, paragraph count, average word length, and most frequent words.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It states that the tool returns statistics, implying a read-only operation, but does not explicitly confirm it is non-destructive or side-effect-free. Lacks details on limitations or required permissions.
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 a single, well-structured sentence that front-loads the action and immediately lists outputs. Every word earns its place with no redundancy or filler.
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?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description is reasonably complete. It explains inputs and outputs, though it could mention potential constraints (e.g., text length limits) to be fully self-contained.
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?
The input schema has 100% description coverage for the single parameter 'text', so the description does not need to add parameter details. The description adds context on what statistics are computed, which indirectly helps understand the parameter's role, but does not surpass a baseline of 3.
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 clearly states the tool's action ('Analyze text') and resource ('text'), and enumerates specific outputs (character count, word count, etc.), making it easy to understand what the tool does. No sibling tool duplicates this functionality, so differentiation is clear.
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 versus alternatives like 'text_transform' or when not to use it. The description does not provide context about prerequisites, preferred scenarios, or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_transformA
Transform text in various ways. Operations: uppercase, lowercase, titlecase, reverse, trim, remove_duplicates (remove duplicate lines), sort_lines, count_substring (requires 'pattern' param), replace (requires 'pattern' and 'replacement' params).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to transform | |
| pattern | No | Pattern for count_substring or replace operations | |
| operation | Yes | The transformation to apply | |
| replacement | No | Replacement text for replace operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It lists operations and param requirements but does not disclose whether operations are read-only or have side effects. However, the nature of text transformation is inherently non-destructive.
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 a single sentence with a clear bullet-like list. It is front-loaded with the purpose and each word adds value.
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?
Given no output schema and 4 parameters, the description covers operations and param dependencies. It does not explain return values, but for a text transform the output is obvious.
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 baseline is 3. The description adds value by specifying which parameters are needed for which operations, e.g., 'count_substring (requires 'pattern' param)'.
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 clearly states the tool transforms text in various ways and lists all specific operations. It distinguishes itself from sibling tools which are for different domains (search, calculation, date, etc.).
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 lists operations and their required parameters (e.g., pattern for count_substring). It does not explicitly state when not to use this tool or give alternatives, but the context of sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unit_convertA
Convert between units of the same category. Categories: length (mm, cm, m, km, inch, in, ft, yard, yd, mile, mi), weight (mg, g, kg, ton, t, oz, lb, pound), temperature (C, F, K), data (bit, byte, KB, MB, GB, TB). Example: convert 100 from 'cm' to 'inch'.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target unit, e.g. 'inch', 'lb', 'F', 'MB' | |
| from | Yes | Source unit, e.g. 'cm', 'kg', 'C', 'KB' | |
| value | Yes | The value to convert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It lists supported units and categories but omits details like error handling for mismatched categories or invalid units, which are important for an AI agent to anticipate.
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 sentences plus an example, making it very concise. Key information is front-loaded with the purpose immediately stated.
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?
The tool is simple and the description covers categories and units adequately. No output schema exists, but the return format is implicitly clear for a conversion tool. Minor gap: no mention of precision or rounding.
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% with descriptions for each parameter. The description adds value by providing category groupings and a concrete example, enhancing understanding beyond the schema alone.
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 clearly states 'Convert between units of the same category' and provides specific categories and examples. It distinguishes itself from sibling tools like calculator or random_gen by focusing on unit conversion.
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 explains the tool's purpose and gives an example, but it doesn't explicitly state when to use it over alternatives or provide any preconditions. However, the context is clear enough for most use cases.
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.
11 tool updates
v1.0.1- First observed
anysearch_batch_search - First observed
anysearch_extract - First observed
anysearch_get_sub_domains - First observed
anysearch_search - First observed
calculator - First observed
datetime_info - First observed
random_gen - First observed
run_agent - First observed
text_stats - First observed
text_transform - First observed
unit_convert
TDQS
Scored across 11 tools
Each tool has a distinct purpose: search tools (anysearch_search, anysearch_batch_search, anysearch_extract, anysearch_get_sub_domains) are clearly separated, and utility tools (calculator, datetime_info, etc.) are unique. No two tools overlap in functionality.
Tool names follow a pattern: Anysearch tools are prefixed with 'anysearch_', while built-in utilities use plain names like 'calculator'. This split is consistent within categories but introduces two naming conventions, which is a minor deviation.
With 11 tools covering search, extraction, domain discovery, and common utilities (calculator, datetime, random, text operations, unit conversion), the count is well-scoped for a general-purpose assistant with web search capabilities.
The tool surface covers core operations: search (including batch and extraction), domain routing, and basic utilities. Minor gaps like file handling or more advanced text processing are absent, but the set is sufficiently complete for its stated purpose.
Maintenance
Related MCP Connectors
Official MCP server for Agentwork â delegate tasks to AI agents with human-in-the-loop
MCP server for agentverse documentation, generated by doc2mcp.
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
Related MCP Servers
- FlicenseCqualityCmaintenanceA multi-tool MCP server that enhances local LLMs with web search, document reading, scholarly research, Wikipedia access, and calculator functions. Provides comprehensive tools for information retrieval and computation without requiring API keys by default.221-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to automatically discover, install, and learn to use new tools without manual configuration.3116MIT
- FlicenseNot gradedqualityCmaintenanceA custom MCP server with 6 utility tools (file search, file reading, math calculation, JSON formatting, time query, system info) that demonstrates MCP protocol workflow and integrates with LangChain agents.-
- -licenseNot gradedqualityNot gradedmaintenanceMCP server implementing ReAct reasoning-acting loops with tools like search, lookup, and finish, supporting both fixture and OpenAI LLMs for offline-first, traceable agent execution.-