Skip to main content
Glama
README.md
# tdrest-mcp

A lightweight MCP (Model Context Protocol) server for making REST API calls to **Teradata cloud services** including:
- **Elastic Compute** — Manage compute engine clusters and configurations
- **Enterprise Vector Store** — Semantic search, RAG, and document ingestion
- **OMS** — Database management and object operations
- **QueryGrid** — Multi-system fabric connectivity

Supports custom authentication (Bearer JWT, Basic), Socks5 proxy routing, multipart file uploads, and progressive endpoint documentation.

## Features

- **Universal REST Client** — Execute any HTTP method with custom headers, auth, and request bodies
- **Bearer & Basic Auth** — JWT tokens, username/password, custom headers with session persistence
- **Socks5 Proxy** — Route through corporate proxies with optional auth
- **Multipart Uploads** — Upload files combined with form fields (CSV, JSON, PDF, etc.)
- **Semantic Search** — Search Vector Store collections with natural language queries
- **RAG Pattern** — Retrieve documents + generate AI responses in one call
- **Progressive Help** — Searchable endpoint documentation with examples and parameters
- **50+ Endpoints** — Auto-generated from Swagger specs (Elastic Compute, Vector Store, OMS, QueryGrid, etc.)
- **Swagger Auto-Parser** — Endpoints loaded at startup; no hand-curation needed
- **Usage Guides** — Best practices, workflows, and examples via searchable markdown guides
- **Hot-loadable APIs** — Drop a Swagger spec in `specs/` → restart → instant access
- **Dynamic Service URLs** — Define any service via `*_BASE_URL` environment variables
- **Stateless Design** — All compute logic lives in the cloud APIs; MCP just brokers requests

## Quick Start

### Prerequisites

- Node.js 18+ with npm

### Installation

```bash
git clone <repo-url>
cd tdrest-mcp
npm install
npm run build
```

### Configuration

Copy `.env.example` to `.env` and set your API base URLs:

```bash
cp .env.example .env
# Edit .env with your values
```

### Run the MCP Server

```bash
npm start
```

The server listens on stdin/stdout and is ready to accept tool calls from Claude.

### Connect to Claude Desktop

Edit `~/.claude/config.json` (or equivalent) to include:

```json
{
  "mcp-servers": {
    "tdrest": {
      "command": "node",
      "args": ["/path/to/tdrest-mcp/dist/index.js"],
      "env": {
        "ELASTIC_COMPUTE_BASE_URL": "https://preprod.globalcompute.qateradatacloud.com"
      }
    }
  }
}
```

Restart Claude Desktop, and the tools will appear in the tool menu.

## Usage

### Authentication

**Option 1: Environment Variable (Recommended for long-lived tokens)**

Set auth once in `.env` — no context overhead for subsequent calls:

```bash
DEFAULT_AUTH_TYPE=bearer
DEFAULT_AUTH_TOKEN=eyJhbGc...
```

All requests automatically use it. Agent calls can still override per-request.

**Option 2: Session Auth (for interactive use)**

```
User: "Authenticate with my Teradata JWT token"
Claude executes: set_auth {
  type: "bearer",
  token: "eyJhbGc..."
}
```

Auth is stored for the session and applied to all subsequent requests.

### Make a REST Call

```
User: "List all clusters"
Claude executes: execute_rest_call {
  url: "https://preprod.globalcompute.qateradatacloud.com/clusters",
  method: "GET",
  // auth is applied automatically from session
}
```

### Get Help on Endpoints

```
User: "What endpoints are available for clusters?"
Claude executes: get_syntax_help {
  query: "clusters"
}
Response:
  Found 2 endpoints matching "clusters":
  - GET /clusters — List all compute engine clusters for a site
  - POST /clusters — Create a new compute engine cluster
  ...
```

### Get Usage Guides

```
User: "How do I set up a cluster?"
Claude executes: get_usage_guide {
  query: "cluster"
}
Response:
  Creating and Managing Clusters guide showing:
  - Step-by-step workflow
  - Config vs cluster distinction
  - Lifecycle management
  - Common errors and fixes
```

### Upload a File

```
User: "Upload a document to the vector store"
Claude executes: execute_rest_call {
  url: "https://api.vectorstore.qateradatacloud.com/documents",
  method: "POST",
  files: {
    "document": { path: "/tmp/document.pdf" }
  },
  formData: {
    "collection_id": "my-collection"
  }
}
```

## Project Structure

```
src/
├── index.ts              # MCP server + tool handlers
├── rest-client.ts        # HTTP client (axios + auth + proxy)
├── syntax-help.ts        # Endpoint registry and search
├── usage-guide.ts        # Usage guide registry
├── guide-loader.ts       # Auto-load guides from guides/ directory
├── swagger-parser.ts     # Swagger spec parser (auto-generates endpoints)
├── file-utils.ts         # File discovery and glob expansion
├── types.ts              # TypeScript interfaces
└── config.ts             # Environment config

specs/
├── global-compute-api.json        # Global Compute API (37 endpoints)
├── global-consumption-api.json    # Global Consumption API (3 endpoints)
└── vector-store-api.json          # Vector Store API (13 endpoints)

guides/
├── getting-started.md       # Quick introduction and basic workflows
├── clusters-setup.md        # Step-by-step cluster provisioning
└── error-handling.md        # Error codes and troubleshooting

tests/
└── ...                  # Unit tests

CLAUDE.md              # Detailed developer guide
```

## Development

```bash
# Watch for TypeScript changes
npm run dev

# Run tests
npm test

# Run a single test
npm test -- src/path/to/test.spec.ts

# Lint
npm run lint
npm run lint:fix
```

## Authentication & Security

- **Bearer Tokens**: Tokens are stored in memory for the session and not persisted to disk.
- **Basic Auth**: Username/password stored in memory; not logged.
- **Custom Headers**: Any header can be set per-request or per-session.
- **HTTPS Only**: All connections are HTTPS by default; HTTP is not enforced but discouraged.

**Important**: Do not commit credentials to the repository. Use environment variables or `.env` files (which are in `.gitignore`).

## Proxy Support

```
User: "Route through a Socks5 proxy at proxy.corp.com:1080"
Claude executes: set_proxy {
  type: "socks5",
  host: "proxy.corp.com",
  port: 1080,
  username: "user",      // optional
  password: "pass"       // optional
}
```

All subsequent requests route through the proxy until `set_proxy { type: "none" }` is called.

## Adding New API Specs

The server auto-loads endpoints from Swagger/OpenAPI specs. To add a new API:

1. **Place the Swagger spec** in `specs/my-api.json`
2. **Restart the server** — endpoints load automatically at startup
3. **Search with `get_syntax_help`** — all endpoints are immediately searchable

No code changes needed! Example:

```bash
# Copy your Swagger spec
cp /path/to/new-api-swagger.json specs/new-api.json

# Restart the server
npm start

# Now Claude can search and use all endpoints from new-api.json
```

The parser extracts:
- Endpoint path and HTTP method
- Parameter names, types, and requirements
- Request body schema properties
- Operation summary and description
- Response descriptions and examples
- Tags for better discoverability

## Adding Usage Guides

Create markdown guides in `guides/` to document best practices and workflows:

1. **Create a new file** — `guides/my-guide.md`
2. **Add YAML frontmatter** (optional):
   ```yaml
   ---
   title: My Guide Title
   description: One-line description
   tags: [tag1, tag2]
   ---
   ```
3. **Write markdown content** — Guidelines, workflows, examples
4. **Restart the server** — Guides auto-load at startup
5. **Search with `get_usage_guide`** — Guides are immediately discoverable

No code changes needed! Users can then search by:
- Guide name: `get_usage_guide("my-guide")`
- Keyword: `get_usage_guide("cluster")`
- List all: `get_usage_guide("list")`

## Limitations

- **No auto token refresh** — If a JWT expires, call `set_auth` again with a fresh token
- **No request templating (yet)** — Request bodies are literal; Handlebars templating planned
- **No response filtering (yet)** — Full responses returned; jq-like queries planned
- **Blocking uploads** — Large files block the connection; chunking coming in Phase 2

## Documentation

- **[README.md](README.md)** — This file; user-facing feature overview
- **[CLAUDE.md](CLAUDE.md)** — Deep architecture guide for developers
- **[DEPLOYMENT.md](DEPLOYMENT.md)** — Claude Desktop and VS Code integration
- **[VECTOR_STORE_ADDED.md](VECTOR_STORE_ADDED.md)** — Vector Store API reference
- **[PROJECT_SUMMARY.md](PROJECT_SUMMARY.md)** — Project structure and roadmap

## Supported APIs

| Service | Status | Endpoints | Auth |
|---------|--------|-----------|------|
| **Global Compute** | ✅ Complete | 37 (clusters, configs, OMS, QueryGrid, site-settings) | Bearer, Basic |
| **Vector Store** | ✅ Complete | 13 (collections, search, ingest, permissions, health) | Bearer, Basic |
| **Any REST API** | ✅ Supported | Unlimited (universal client) | Bearer, Basic, Custom |

## Contributing

See `CLAUDE.md` for architectural details, testing patterns, and guidelines for adding endpoints.

## License

MIT

## Support

- **Bug reports** — GitHub Issues
- **Feature requests** — GitHub Discussions
- **Architecture questions** — See `CLAUDE.md` Q&A section
- **Deployment help** — See `DEPLOYMENT.md` troubleshooting

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

Tools are mostly distinct: REST execution, configuration, help, and file operations. Some overlap between find_files and list_files, and between get_syntax_help and get_usage_guide, but descriptions help differentiate.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case, e.g., execute_rest_call, find_files, get_service_config.

Tool Count5/5

8 tools is well-scoped for a REST client utility, covering setup, execution, help, and file discovery without being excessive.

Completeness4/5

Covers key aspects of REST API interaction: auth, proxy, execution, config, and help. Missing maybe a tool to clear credentials or inspect raw responses, but core workflow is supported.

Maintenance

ActivityStale
ResponsivenessNo issues