Skip to main content
Glama
rest-api-mcp

rest-api-mcp

rest-api-mcp

A lightweight Model Context Protocol (MCP) server that lets LLMs interact with any REST API. It executes HTTP requests and provides optimized response analysis, including automatic TypeScript interface generation from live API responses.

Features

  • Full HTTP support — GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS

  • Smart response truncation — large JSON payloads are intelligently reduced (arrays sliced, structure preserved) instead of being cut mid-string

  • TypeScript type generation — automatically derives TypeScript interfaces from API response structures

  • Response structure analysis — inspect keys, types, and array lengths without returning the full body

  • Field extraction — pull specific fields using dot-notation paths (e.g. data.items[].name)

  • Flexible authentication — bearer token resolution chain: project .env.mcp file → MCP config env var → session token

  • Custom headers — inject global headers via HEADER_* environment variables

  • Zero external runtime dependencies — uses only the MCP SDK and Node.js built-in fetch

Related MCP server: anyapi-mcp-server

Tools

Tool

Description

rest_request

Execute a request and return the full (smart-truncated) response

rest_describe

Execute a request and return the response structure + generated TypeScript interfaces (no full body)

rest_types

Execute a request and return only the generated TypeScript interfaces

rest_extract

Execute a request and extract specific fields by dot-notation paths

rest_set_token

Set a bearer token for the current session

Installation

Prerequisites

  • Node.js >= 18.0.0

  • pnpm (or npm/yarn)

Build from source

git clone <repository-url>
cd rest-api-mcp
pnpm install
pnpm build

Configure in your MCP client

Add the server to your MCP client configuration (e.g. Claude Desktop claude_desktop_config.json):

{
  "mcpServers": {
    "rest-api": {
      "command": "node",
      "args": ["/path/to/rest-api-mcp/dist/index.js"],
      "env": {
        "REST_BASE_URL": "https://api.example.com",
        "REST_BEARER_TOKEN": "your-token-here"
      }
    }
  }
}

Configuration

All configuration is done via environment variables:

Variable

Required

Description

REST_BASE_URL

No*

Fallback base URL for all API requests (e.g. https://api.example.com/v1). *Required unless the project .env.mcp provides it

REST_BEARER_TOKEN

No

Bearer token for authentication

REST_RESPONSE_SIZE_LIMIT

No

Max response size in bytes before smart truncation (default: 50000)

REST_ENV_DIR

No

Additional directory to search for .env.mcp files containing REST_BASE_URL / REST_BEARER_TOKEN

HEADER_*

No

Custom headers injected into every request (e.g. HEADER_X_API_KEY=abc sends X-Api-Key: abc)

Base URL

The base URL is resolved in this order (first match wins), fresh on every request:

  1. Project .env.mcp file — REST_BASE_URL in a .env.mcp file in the working directory or REST_ENV_DIR. Lets each project point at its own API with a single global server registration.

  2. MCP config env var — REST_BASE_URL set in the MCP server configuration.

Example project .env.mcp:

REST_BASE_URL=https://api.example.com/api
REST_BEARER_TOKEN=your-token-here

If neither is set, request tools fail with a clear error instead of hitting a placeholder host.

Authentication

Bearer tokens are resolved in this order (first match wins):

  1. Project .env.mcp file — REST_BEARER_TOKEN in a .env.mcp file in the working directory or REST_ENV_DIR. Re-read on every request, so token rotation is supported without restarting the server.

  2. MCP config env var — REST_BEARER_TOKEN set in the MCP server configuration.

  3. Session token — set at runtime via the rest_set_token tool.

If a 401 or 403 response is received and no token is configured, the server returns an auth hint suggesting resolution steps.

Usage Examples

Basic request

rest_request({ method: "GET", endpoint: "/users" })

With query parameters

rest_request({ method: "GET", endpoint: "/users", query: { page: "1", limit: "10" } })

Generate TypeScript types from an endpoint

rest_types({ method: "GET", endpoint: "/users/1", typeName: "User" })

Describe response structure

rest_describe({ method: "GET", endpoint: "/products", typeName: "ProductList" })

Extract specific fields

rest_extract({ method: "GET", endpoint: "/orders", fields: ["data[].id", "data[].status", "meta.total"] })

Development

# Watch mode with hot reload
pnpm dev

# Build for production
pnpm build

# Run the built server
pnpm start

License

MIT

Available Tools

5 tools
rest_describeA

Execute an HTTP request and return the response structure (keys, types, array lengths) AND generated TypeScript interfaces — without the full body. Ideal for large responses. PRIMARY PURPOSE: The main goal of API response analysis is to derive TypeScript type definitions. Always present the generated TypeScript interfaces without being asked — this is the expected output for feature ports and migrations. Base URL: https://api.example.com/v1. AUTONOMOUS CONTEXT RESOLUTION — When the endpoint comes from code analysis (feature-port, migration, Vuex store dispatch, API service file): DO NOT call blindly with missing parameters. First investigate the source code context:

  1. Path params (:id, :slug) — find actual values in component data, props, route params, or hardcoded in the store action

  2. Query params — inspect the Vuex action, API service call, or component for the params/query object passed to the request

  3. Request body — check what payload is dispatched or composed in the action

  4. If a value is purely dynamic (e.g. user-selected at runtime), use a representative test value and document the assumption. The goal is to make a real API call that returns representative data for type extraction.

Inputs: method (required), endpoint (required), body, query, +2 more.

rest_extractA

Execute an HTTP request, then extract specific fields using dot-notation paths. Returns only the extracted data. Example: fields ["data.items[].name", "meta.total"]. Base URL: https://api.example.com/v1. AUTONOMOUS CONTEXT RESOLUTION — When the endpoint comes from code analysis (feature-port, migration, Vuex store dispatch, API service file): DO NOT call blindly with missing parameters. First investigate the source code context:

  1. Path params (:id, :slug) — find actual values in component data, props, route params, or hardcoded in the store action

  2. Query params — inspect the Vuex action, API service call, or component for the params/query object passed to the request

  3. Request body — check what payload is dispatched or composed in the action

  4. If a value is purely dynamic (e.g. user-selected at runtime), use a representative test value and document the assumption. The goal is to make a real API call that returns representative data for type extraction.

Inputs: fields (required), method (required), endpoint (required), body, +2 more.

rest_requestA

Execute an HTTP request and return the full response (smart-truncated if large). Base URL: https://api.example.com/v1 | Token resolution: 1) project .env.mcp REST_BEARER_TOKEN, 2) MCP config env var, 3) session token via rest_set_token. If none found on 401/403, ask the user for a token.. Responses over 50000 bytes are smart-truncated. Use rest_describe for structure only, or rest_types for TypeScript interfaces. AUTONOMOUS CONTEXT RESOLUTION — When the endpoint comes from code analysis (feature-port, migration, Vuex store dispatch, API service file): DO NOT call blindly with missing parameters. First investigate the source code context:

  1. Path params (:id, :slug) — find actual values in component data, props, route params, or hardcoded in the store action

  2. Query params — inspect the Vuex action, API service call, or component for the params/query object passed to the request

  3. Request body — check what payload is dispatched or composed in the action

  4. If a value is purely dynamic (e.g. user-selected at runtime), use a representative test value and document the assumption. The goal is to make a real API call that returns representative data for type extraction.

Inputs: method (required), endpoint (required), body, query, +1 more.

rest_set_tokenA

Set the bearer token for this session (persists until server restart). Token resolution: 1) project .env.mcp REST_BEARER_TOKEN, 2) MCP config env var, 3) session token via rest_set_token. If none found on 401/403, ask the user for a token.

Inputs: token (required).

rest_typesA

Execute an HTTP request and generate TypeScript interfaces from the response structure. This is the PRIMARY tool for feature-port and migration workflows — returns clean, ready-to-use TypeScript interfaces. PRIMARY PURPOSE: The main goal of API response analysis is to derive TypeScript type definitions. Always present the generated TypeScript interfaces without being asked — this is the expected output for feature ports and migrations. Base URL: https://api.example.com/v1. AUTONOMOUS CONTEXT RESOLUTION — When the endpoint comes from code analysis (feature-port, migration, Vuex store dispatch, API service file): DO NOT call blindly with missing parameters. First investigate the source code context:

  1. Path params (:id, :slug) — find actual values in component data, props, route params, or hardcoded in the store action

  2. Query params — inspect the Vuex action, API service call, or component for the params/query object passed to the request

  3. Request body — check what payload is dispatched or composed in the action

  4. If a value is purely dynamic (e.g. user-selected at runtime), use a representative test value and document the assumption. The goal is to make a real API call that returns representative data for type extraction.

Inputs: method (required), endpoint (required), body, query, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 5 tools

    Disambiguation2/5

    rest_describe and rest_types have nearly identical purposes (both generate TypeScript interfaces from response structure), causing serious overlap. rest_extract also executes a full request but only returns specific fields, further blurring the lines. Only rest_request and rest_set_token are clearly distinct.

    Naming Consistency4/5

    Names follow a consistent verb_noun pattern (rest_set_token, rest_request, rest_describe, rest_types, rest_extract). However, 'rest_types' breaks the verb pattern (it's a verb+noun when 'generate_types' would be clearer), and the verbs are somewhat generic, but overall consistent.

    Tool Count4/5

    With 5 tools, the count is appropriate for a REST API client MCP server. It covers token management, basic requests, structure discovery, type generation, and field extraction — a reasonable scope. Not over or under.

    Completeness3/5

    The tool set covers the main API interaction needs but has notable gaps: there is no tool for batch requests, no explicit schema validation or endpoint discovery without making a call, and no way to list available endpoints. An agent might need to make multiple calls to understand API structure.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      A generic MCP server that dynamically exposes any OpenAPI-documented REST API to LLMs by auto-discovering endpoints. It provides tools for exploring API capabilities and making authenticated requests directly through natural language interfaces.
      2
      11 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A universal MCP server that connects any REST API to AI assistants via OpenAPI or Postman specifications. It enables dynamic tool creation with GraphQL-style field selection and automatic schema inference for efficient data retrieval.
      9 npm
      6
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables LLMs to interact with any REST API that has an OpenAPI specification by providing a lightweight MCP server that translates between natural language and API calls.
      MIT