Skip to main content
Glama
lianshuang-photo

SearchAPI MCP Server

search_google_maps_reviews

Retrieve Google Maps reviews for locations using place IDs, with options to filter by rating, sort results, and control language settings.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
place_idNo地点ID
data_idNo数据ID
topic_idNo主题ID
next_page_tokenNo下一页令牌
sort_byNo排序方式
ratingNo评分
hlNo语言
glNo地理位置
reviews_limitNo评论数量限制

Implementation Reference

  • The main handler function for the search_google_maps_reviews tool. It validates required parameters (place_id or data_id), adds optional parameters, calls the makeSearchapiRequest helper to fetch data from searchapi.io's Google Maps reviews API, and returns the JSON-formatted result.
    async (args) => {
      const params = {
        engine: 'google_maps_reviews'
      };
      
      // 检查必填参数
      if (args.place_id) {
        params.place_id = args.place_id;
      } else if (args.data_id) {
        params.data_id = args.data_id;
      } else {
        return {
          content: [{ type: 'text', text: JSON.stringify({ error: '必须提供place_id或data_id参数' }) }],
          isError: true
        };
      }
      
      // 添加可选参数
      const optionalParams = [
        'topic_id', 'next_page_token', 'sort_by', 'rating', 'hl', 'gl', 'reviews_limit'
      ];
      
      for (const key of optionalParams) {
        if (args[key] !== undefined) {
          params[key] = args[key];
        }
      }
      
      const result = await makeSearchapiRequest(params);
      return {
        content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
      };
    }
  • Zod input schema for the search_google_maps_reviews tool, defining optional parameters like place_id, data_id, sorting, filtering by rating, language, etc.
    {
      place_id: z.string().optional().describe('地点ID'),
      data_id: z.string().optional().describe('数据ID'),
      topic_id: z.string().optional().describe('主题ID'),
      next_page_token: z.string().optional().describe('下一页令牌'),
      sort_by: z.string().optional().describe('排序方式'),
      rating: z.string().optional().describe('评分'),
      hl: z.string().optional().describe('语言'),
      gl: z.string().optional().describe('地理位置'),
      reviews_limit: z.string().optional().describe('评论数量限制')
    },
  • src/index.js:234-281 (registration)
    Registration of the search_google_maps_reviews tool via server.tool(), which includes the inline schema and handler function definitions.
    // 实现工具函数:搜索Google地图评论
    server.tool(
      'search_google_maps_reviews',
      {
        place_id: z.string().optional().describe('地点ID'),
        data_id: z.string().optional().describe('数据ID'),
        topic_id: z.string().optional().describe('主题ID'),
        next_page_token: z.string().optional().describe('下一页令牌'),
        sort_by: z.string().optional().describe('排序方式'),
        rating: z.string().optional().describe('评分'),
        hl: z.string().optional().describe('语言'),
        gl: z.string().optional().describe('地理位置'),
        reviews_limit: z.string().optional().describe('评论数量限制')
      },
      async (args) => {
        const params = {
          engine: 'google_maps_reviews'
        };
        
        // 检查必填参数
        if (args.place_id) {
          params.place_id = args.place_id;
        } else if (args.data_id) {
          params.data_id = args.data_id;
        } else {
          return {
            content: [{ type: 'text', text: JSON.stringify({ error: '必须提供place_id或data_id参数' }) }],
            isError: true
          };
        }
        
        // 添加可选参数
        const optionalParams = [
          'topic_id', 'next_page_token', 'sort_by', 'rating', 'hl', 'gl', 'reviews_limit'
        ];
        
        for (const key of optionalParams) {
          if (args[key] !== undefined) {
            params[key] = args[key];
          }
        }
        
        const result = await makeSearchapiRequest(params);
        return {
          content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
        };
      }
    );
  • Shared helper function that sends requests to the searchapi.io API endpoint, appends the API key, handles timeouts and errors, and is called by the tool handler.
    async function makeSearchapiRequest(params) {
      // 确保API Key被添加到参数中
      params.api_key = SEARCHAPI_API_KEY;
      
      try {
        const response = await axios.get(SEARCHAPI_URL, {
          params,
          timeout: 30000 // 30秒超时
        });
        return response.data;
      } catch (error) {
        let errorDetail = null;
        
        if (error.response) {
          try {
            errorDetail = error.response.data;
          } catch (e) {
            errorDetail = error.response.statusText;
          }
        }
        
        const errorMessage = `调用searchapi.io时出错: ${error.message}`;
        if (errorDetail) {
          return { error: `${errorMessage}, 详情: ${JSON.stringify(errorDetail)}` };
        }
        
        return { error: errorMessage };
      }
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lianshuang-photo/searchapi-mcp-nodejs'

If you have feedback or need assistance with the MCP directory API, please join our Discord server