@burtthecoder/mcp-shodan
Version:
A Model Context Protocol server for Shodan API queries.
70 lines (69 loc) • 2.33 kB
JavaScript
import axios from "axios";
import { UserError } from "fastmcp";
export const API_BASE_URL = "https://api.shodan.io";
export const CVEDB_API_URL = "https://cvedb.shodan.io";
export const SHODAN_API_KEY = process.env.SHODAN_API_KEY;
export async function queryShodan(endpoint, params) {
try {
const response = await axios.get(`${API_BASE_URL}${endpoint}`, {
params: { ...params, key: SHODAN_API_KEY },
timeout: 10000,
});
return response.data;
}
catch (error) {
const errorMessage = error.response?.data?.error || error.message;
console.error(`Shodan API error: ${errorMessage}`);
throw new UserError(`Shodan API error: ${errorMessage}`);
}
}
export async function queryCVEDB(cveId) {
try {
const response = await axios.get(`${CVEDB_API_URL}/cve/${cveId}`);
return response.data;
}
catch (error) {
if (error.response?.status === 422) {
throw new UserError(`Invalid CVE ID format: ${cveId}`);
}
if (error.response?.status === 404) {
throw new UserError(`CVE not found: ${cveId}`);
}
throw new UserError(`CVEDB API error: ${error.message}`);
}
}
export async function queryCPEDB(params) {
try {
const response = await axios.get(`${CVEDB_API_URL}/cpes`, { params });
return response.data;
}
catch (error) {
if (error.response?.status === 422) {
throw new UserError(`Invalid parameters: ${error.response.data?.detail || error.message}`);
}
throw new UserError(`CVEDB API error: ${error.message}`);
}
}
export async function queryCVEsByProduct(params) {
try {
const response = await axios.get(`${CVEDB_API_URL}/cves`, { params });
return response.data;
}
catch (error) {
if (error.response?.status === 422) {
throw new UserError(`Invalid parameters: ${error.response.data?.detail || error.message}`);
}
throw new UserError(`CVEDB API error: ${error.message}`);
}
}
export function getCvssSeverity(score) {
if (score >= 9.0)
return "Critical";
if (score >= 7.0)
return "High";
if (score >= 4.0)
return "Medium";
if (score >= 0.1)
return "Low";
return "None";
}