Skip to main content
Glama
prsantos-com

AirNow MCP Server

by prsantos-com

get-historical-observations-by-reporting-area-by-zip-code

Retrieve historical air quality index (AQI) values and categories for a specific reporting area using a Zip code and date. Supports output in CSV, JSON, or XML formats.

Instructions

Get historical AQI values and categories for a reporting area by Zip code.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateYesDate to get the historical observations for. Format: YYYY-MM-DD. Example: 2012-02-01
distanceNoIf no reporting area is associated with the Zip code, historical observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150
formatYesFormat of the payload file returned. Example: application/json
zipCodeYesZip code to get the historical observations for. Example: 94954

Implementation Reference

  • MCP tool handler that invokes the AirNow API and returns the response as text content or an error.
    async (params) => {
      const result =
        await airnowApi.fetchHistoricalObservationsByReportingAreaByZipCode(
          params
        );
      if (result === null) {
        return {
          content: [
            {
              type: "text",
              text: "Failed to fetch historical observations data from AirNow API.",
            },
          ],
          isError: true,
        };
      }
      return {
        content: [
          {
            type: "text",
            text: result,
          },
        ],
      };
    }
  • Zod schema defining the input parameters for the tool.
      zipCode: z
        .string()
        .describe(
          "Zip code to get the historical observations for. Example: 94954"
        ),
      date: z
        .string()
        .describe(
          "Date to get the historical observations for. Format: YYYY-MM-DD. Example: 2012-02-01"
        ),
      format: z
        .enum(["text/csv", "application/json", "application/xml"])
        .describe(
          "Format of the payload file returned. Example: application/json"
        ),
      distance: z
        .string()
        .optional()
        .describe(
          "If no reporting area is associated with the Zip code, historical observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150"
        ),
    },
  • Function that registers the tool with the MCP server, including name, description, schema, and handler.
    export const registerHistoricalObservationsByZipCode = (server: McpServer): void => {
      server.tool(
        "get-historical-observations-by-reporting-area-by-zip-code",
        "Get historical AQI values and categories for a reporting area by Zip code.",
        {
          zipCode: z
            .string()
            .describe(
              "Zip code to get the historical observations for. Example: 94954"
            ),
          date: z
            .string()
            .describe(
              "Date to get the historical observations for. Format: YYYY-MM-DD. Example: 2012-02-01"
            ),
          format: z
            .enum(["text/csv", "application/json", "application/xml"])
            .describe(
              "Format of the payload file returned. Example: application/json"
            ),
          distance: z
            .string()
            .optional()
            .describe(
              "If no reporting area is associated with the Zip code, historical observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150"
            ),
        },
        async (params) => {
          const result =
            await airnowApi.fetchHistoricalObservationsByReportingAreaByZipCode(
              params
            );
          if (result === null) {
            return {
              content: [
                {
                  type: "text",
                  text: "Failed to fetch historical observations data from AirNow API.",
                },
              ],
              isError: true,
            };
          }
          return {
            content: [
              {
                type: "text",
                text: result,
              },
            ],
          };
        }
      );
    };
  • Core helper function that performs the HTTP request to the AirNow API for historical observations by zip code.
    export async function fetchHistoricalObservationsByReportingAreaByZipCode(params: Record<string, string>): Promise<string | null> {
      const endpoint = 'aq/observation/zipcode/historical/';
      const queryParams = new URLSearchParams();
      queryParams.append('zipCode', params.zipCode);
      queryParams.append('date', params.date);
      queryParams.append('format', params.format);
      if (params.distance) queryParams.append('distance', params.distance);
    
      return airnowGet(endpoint, queryParams);
    }
  • Imports and calls the register function as part of registering all tools.
    import { registerHistoricalObservationsByZipCode } from "./historical-observations-by-reporting-area-by-zip-code.js";
    import { registerObservationsByBoundingBox } from "./observations-by-monitoring-site-by-geographic-bounding-box.js";
    
    export const registerTools = (server: McpServer): void => {
      registerContourMapsByBoundingBoxCombined(server);
      registerContourMapsByBoundingBoxOzone(server);
      registerContourMapsByBoundingBoxPM25(server);
      registerCurrentObservationsByZipCode(server);
      registerCurrentObservationsByLatLong(server);
      registerForecastByLatLong(server);
      registerForecastByZipCode(server);
      registerHistoricalObservationsByLatLong(server);
      registerHistoricalObservationsByZipCode(server);

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/prsantos-com/airnow-mcp-server'

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