MCP

Web search MCP server for AI agents

Add one bounded web search tool to any MCP client: search_web queries a curated English and Chinese index and returns source-attributed results with fetched_at. Not realtime, not the whole web.

One tool, the standard Search contract

annolux-mcp registers exactly one tool: search_web. Its inputs match the commercial REST endpoint, and every result carries a title, URL, snippet when available, and an explicit fetched_at timestamp. The server does not expose scraping, extraction, verification, or any hidden enrichment, so an agent cannot buy a different operation through MCP than the one documented here.

The index behind it is curated and bilingual (English and Chinese), refreshed on a schedule. It is not a realtime feed and it does not claim whole-web coverage; an empty result set is a normal outcome, not an error.

Install the server binary

The server is a single static Go binary. With a Go toolchain installed, one command builds and installs it into $(go env GOPATH)/bin — make sure that directory is on your PATH, or reference the binary by absolute path in client configs.

go install github.com/eason4kim-rocket/annolux/cmd/annolux-mcp@latest

Configure any MCP client

Every MCP client accepts the same shape: a command plus two environment variables. The key lives only in the server process environment; annolux-mcp sends it in the Authorization header and never places it in tool results or model-visible arguments.

{
  "mcpServers": {
    "annolux": {
      "command": "annolux-mcp",
      "env": {
        "ANNOLUX_API_URL": "https://api.annolux.com",
        "ANNOLUX_API_KEY": "ann_live_REPLACE_ME"
      }
    }
  }
}

search_web fields

  • query — required, up to 500 characters.
  • domains — optional hostname allow-list, up to 20 entries.
  • deduplicate — defaults to true.
  • limit — 1 to 10 results, default 10.
  • timeout — 1 to 30 seconds, default 30.
  • ranking — default or provider.
  • freshness is not supported and is rejected explicitly.

What a response looks like

An illustrative response. Keep fetched_at beside any citation your agent produces, so downstream readers know when the page was retrieved.

{
  "success": true,
  "query": "rust ownership",
  "results": [
    {
      "rank": 1,
      "title": "What is Ownership? - The Rust Programming Language",
      "url": "https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html",
      "snippet": "Ownership is a set of rules that govern how a Rust program manages memory…",
      "fetched_at": "2026-08-15T09:12:44Z"
    }
  ],
  "deduplicated": 0,
  "partial": false,
  "timing": { "total_ms": 212, "provider_ms": 180, "enrichment_ms": 32 }
}

Credits

Only a successful 2xx Search commits one credit. Validation errors, authentication failures, insufficient balance, rate limits, server errors, and timeouts commit zero. Read X-Annolux-Credits-Used and X-Annolux-Credits-Remaining from the response instead of estimating locally. New accounts start with 1,000 free credits.

Client setup guides

Each guide below is a copy-paste configuration for that client, including its file locations and the client-specific pitfalls.