shodan_whois
Retrieve WHOIS information for IP addresses or domains using Shodan Labs data to identify ownership and registration details.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | IP or domain to lookup WHOIS in Shodan Labs |
Implementation Reference
- src/index.ts:194-203 (handler)Tool registration for "shodan_whois" in src/index.ts, which delegates to the shodanClient.getWhois method.
server.tool( "shodan_whois", { query: z.string().describe("IP or domain to lookup WHOIS in Shodan Labs") }, async ({ query }) => { const result = await shodanClient.getWhois(query); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }], }; } ); - src/tools/shodan.ts:40-68 (handler)Implementation of the getWhois method in ShodanApiClient, which interacts with the Shodan Labs WHOIS endpoint.
async getWhois(ip: string): Promise<any> { const apiKey = configManager.get("SHODAN_API_KEY"); if (!apiKey) { throw new McpError( ErrorCode.InvalidRequest, "SHODAN_API_KEY is not configured" ); } try { // Shodan has a labs/whois endpoint but it's for domains usually. // For IP whois, shodan/host/{ip} already contains some info. // Let's use the dedicated labs/whois if it supports IP, or just stick to host. const data = await this.fetch<any>(`labs/whois`, { method: "GET", }, { key: apiKey, query: ip }); return data; } catch (error) { if (error instanceof McpError) throw error; throw new McpError( ErrorCode.InternalError, `Shodan WHOIS error: ${(error as Error).message}` ); } }