Skip to main content
Glama
cursor-search-mcp

cursor-search-mcp

by zzjcool

cursor-search-mcp

Standalone MCP server that extracts Cursor's web search into a reusable tool โ€” for any MCP client (pi, Claude Code, Cursor, etc.).

Pure protocol client: talks directly to api2.cursor.sh (RunSSE + BidiAppend, reverse-engineered from cursor-agent). No cursor-agent binary, no child processes, zero npm dependencies.

Features

  • ๐Ÿ” Web search as a tool โ€” server-side Cursor web search (the same engine behind cursor-agent's web_search), returns summarized answers with source links

  • ๐Ÿ”‘ API key login โ€” CURSOR_API_KEY (auto token exchange + refresh)

  • ๐ŸŒ OAuth login โ€” browser-based PKCE device flow, for accounts without API keys

  • ๐Ÿชถ Zero deps โ€” plain Node.js โ‰ฅ 18, single-purpose protocol implementation

  • ๐Ÿ”’ Token cached with 0600 permissions at ~/.cursor-search-mcp/auth.json

Related MCP server: Kimi Search MCP

Tools

Tool

Description

cursor_login

Validate API key / report token status

cursor_oauth_login

Start OAuth browser login (returns login_url)

cursor_oauth_wait

Poll until browser authorization completes

cursor_web_search

Web search โ€” returns {answer, links[], link_count}

Install

# from npm (after publish)
npx cursor-search-mcp

# or from source
git clone https://github.com/zzjcool/cursor-search-mcp
cd cursor-search-mcp

Configuration

API key (either way):

export CURSOR_API_KEY=crsr_xxxx
# or
echo "crsr_xxxx" > ~/.cursor-search-mcp/key

Or use OAuth โ€” simplest from the terminal:

npx cursor-search-mcp login     # prints a login URL, waits for you to authorize, caches the token
npx cursor-search-mcp status    # check login state
npx cursor-search-mcp search "mcp spec 2026-07-28 changes"   # one-shot search

Or from inside an agent session: call cursor_oauth_login โ†’ open the returned login_url โ†’ call cursor_oauth_wait.

On MCP startup without any credentials, the server automatically starts OAuth, prints the login URL to stderr, and polls in the background โ€” the login-aware initialize instructions surface it to the agent.

Optional env vars:

Var

Default

Description

CURSOR_API_ENDPOINT

https://api2.cursor.sh

API base URL

CURSOR_SEARCH_MODEL

gpt-5.3-codex-low-fast

Model used for search synthesis

CURSOR_SEARCH_STATE_DIR

~/.cursor-search-mcp

State directory

CURSOR_CLIENT_VERSION

cli-2026.10.01-e373342

Client version header

MCP client config (stdio)

{
  "mcpServers": {
    "cursor-search": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "cursor-search-mcp"],
      "env": { "CURSOR_API_KEY": "crsr_xxxx" }
    }
  }
}

How it works

Reverse-engineered from cursor-agent 2026.10.01 (protocol verified end-to-end):

login    POST /auth/exchange_user_api_key          (API key โ†’ accessToken)
         GET  /auth/poll?uuid&verifier             (OAuth PKCE device flow)
search   POST /agent.v1.AgentService/RunSSE        (downstream SSE stream)
         POST /aiserver.v1.BidiService/BidiAppend  (upstream binary frames)

The client maintains the full agent-loop protocol: KV blob get/set ACKs, 5s client heartbeats, web-search approval interactions โ€” so the server-side search engine executes as if invoked from a real agent session.

Caveats

  • Uses undocumented Cursor APIs; the protocol may change without notice (pin your version)

  • Search quota counts against your Cursor account

  • Educational / research purpose โ€” respect Cursor's terms of service

License

MIT


โ„น๏ธ Moved: development continues in search-mcp-hub (packages/cursor-search-mcp). This repo is the v1/v2 history archive. npm publishes continue from the monorepo.

Available Tools

4 tools
cursor_loginA

Report Cursor login/token status. Credentials come from CURSOR_API_KEY, ~/.cursor-search-mcp/key, or a cached OAuth token.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral-disclosure burden. It usefully explains the three credential sources (CURSOR_API_KEY, key file, cached OAuth token), but it does not explicitly state that the operation is read-only, whether it validates credentials, or what status values it returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main purpose and followed by useful credential-source context. There is no wasted language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter status tool, the description covers the core purpose and credential origins. However, because there is no output schema and no annotations, it could say more about what the reported status looks like or whether it verifies credentials, leaving some ambiguity for an agent interpreting results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics burden. The baseline for zero-parameter tools is 4, and the description appropriately avoids unnecessary parameter discussion.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: "Report Cursor login/token status." This distinguishes it from the sibling cursor_oauth_login, which implies initiating login, though the distinction is not made explicit. An agent can reasonably infer this is a status-checking tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by "Report Cursor login/token status," suggesting the tool should be used to check authentication state. However, the description does not explicitly say when to use it instead of cursor_oauth_login or cursor_oauth_wait, nor does it mention prerequisites or follow-up actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cursor_oauth_loginA

Start OAuth browser login (no API key needed). Returns login_url for the user to open in a browser; then call cursor_oauth_wait with the returned uuid to complete the token exchange.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose key behavior: it starts a browser flow, does not require an API key, returns a login_url for the user, and requires a follow-up call to complete the token exchange. It omits details like flow timeout, where the token is stored, or failure behavior, but the core interaction contract is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact clauses with no waste: the first states purpose and the key constraint, the second states the return value and the required next step. Nothing is buried or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter OAuth starter with no output schema, the description covers the essential return (login_url and uuid) and the follow-up action. It could say more about what happens if the user never completes login or whether a browser opens automatically, but nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema has nothing to document. The description correctly implies no input is required and clarifies that the relevant value (uuid) comes from this call's return, not from the caller.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start OAuth browser login') and immediately distinguishes itself from cursor_login by noting 'no API key needed'. An agent can identify it as the browser-based OAuth entry point without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes the two-step flow: call this, then call cursor_oauth_wait with the returned uuid. It does not explicitly contrast with the sibling cursor_login beyond the 'no API key needed' hint, so the exclusion is implied rather than fully stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cursor_oauth_waitA

Wait for the user to finish OAuth browser authorization and exchange the token. Call after cursor_oauth_login's URL was opened.

NameRequiredDescriptionDefault
uuidYesuuid returned by cursor_oauth_login
timeoutMsNoWait timeout in ms (default 300000 = 5 min)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full disclosure burden; it does convey that this is a blocking wait followed by a token exchange. It stays silent on what happens when the timeout elapses, whether the call polls or blocks, and whether a token is persisted or merely returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler; the purpose comes first and the calling prerequisite second.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the definition should explain what a successful versus timed-out result looks like for a blocking call. The core flow is covered, but failure/timeout semantics are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with uuid and timeoutMs both documented in the schema, so the baseline is 3. The description adds no further detail about the uuid's provenance beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb ('wait for'), the resource (OAuth browser authorization), and the side effect (exchange the token). It is clearly distinguishable from cursor_oauth_login, whose URL-opening step it explicitly follows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition: 'Call after cursor_oauth_login's URL was opened,' naming the sibling that produces the input. It does not cover the when-not case (e.g., what to do if the user never completes the flow) or alternatives on timeout.

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.

  1. 4 tool updatesv2.0.0
    • First observedcursor_login
    • First observedcursor_oauth_login
    • First observedcursor_oauth_wait
    • First observedcursor_web_search

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation4/5

The three auth-related tools have distinct roles: status check, OAuth initiation, and OAuth completion wait. An agent could briefly hesitate between cursor_login and cursor_oauth_login when unauthenticated, but the descriptions clarify the intended sequence.

Naming Consistency4/5

All tools use a consistent cursor_ prefix and snake_case, with auth tools following a clear cursor_oauth_* subpattern. cursor_login and cursor_web_search are slightly less uniform in verb style but remain readable and predictable.

Tool Count4/5

Four tools is reasonable for a narrow web-search server with an unavoidable OAuth lifecycle. The set is slightly auth-heavy (three auth tools to one search tool), but that reflects a legitimate setup flow rather than unnecessary bloat.

Completeness4/5

The auth lifecycle is well covered with status, initiation, and completion tools, and web search is present. Minor gaps like logout/token clearing or richer search options exist, but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    B
    maintenance
    Enables MCP clients to run web searches and optionally fetch webpages through Moonshot's open platform API, using a configured API key.
    2
    118 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables web search and page fetching through the DeepSeek Search and Fetch APIs, exposing search and fetch tools to MCP clients. Supports paginated content retrieval with cursors so long pages can be read in chunks without repeating upstream requests.
    2
    52 npm
    AGPL 3.0