research_list
List research requests from Exa with pagination support. Use cursor and limit to control results.
Instructions
List research requests using Exa.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Pagination cursor from a previous response. | |
| limit | No | Maximum number of results to return. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/mcp_exa/_server.py:517-549 (handler)The research_list tool handler function, registered via @mcp.tool() decorator. It accepts optional cursor and limit parameters, builds an arguments dict, and delegates to the remote Exa MCP server by calling _call_mcp_tool with the tool name 'exa_research_list'.
@mcp.tool() def research_list( cursor: str | None = None, limit: int | None = None, ) -> dict[str, Any]: """List research requests using Exa. Args: cursor: Pagination cursor from a previous response. limit: Maximum number of results to return. Returns: Dict containing the list of research requests. Example: >>> research_list(limit=10) {"data": [...], "has_more": true, "next_cursor": "..."} """ import asyncio arguments: dict[str, Any] = {} if cursor is not None: arguments["cursor"] = cursor if limit is not None: arguments["limit"] = limit try: result = asyncio.get_event_loop().run_until_complete( _call_mcp_tool("exa_research_list", arguments) ) return result except Exception as e: return {"error": str(e)} - src/mcp_exa/_server.py:517-517 (registration)The tool is registered as an MCP tool via the @mcp.tool() decorator on the FastMCP instance named 'mcp-exa'. The mcp instance is created at line 10 and exported via __init__.py.
@mcp.tool() - src/mcp_exa/_server.py:30-69 (helper)Helper function _call_mcp_tool that sends a JSON-RPC request to the public Exa MCP server. It is called by research_list with the tool name 'exa_research_list' and the arguments dict.
async def _call_mcp_tool(tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]: """Call a tool on the public Exa MCP server.""" request = { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": tool_name, "arguments": arguments, }, } async with httpx.AsyncClient(timeout=60.0) as client: response = await client.post( f"{BASE_URL}/mcp", json=request, headers={ "accept": "application/json, text/event-stream", "content-type": "application/json", }, ) response.raise_for_status() response_text = response.text lines = response_text.split("\n") for line in lines: if line.startswith("data: "): data = line[6:] result = {"jsonrpc": "2.0", "id": 1, "result": {}} try: parsed = eval(data) except Exception: pass else: if "result" in parsed and parsed["result"].get("content"): return { "results": parsed["result"]["content"][0].get("text", "") } return {"results": ""}