Skip to main content
Glama
sourav-spd

aws-s3-connector-mcp

by sourav-spd
README.md
# AWS S3 Connector MCP Server

A production-ready [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server for AWS S3 operations.

Provides **4 practical tools** for connecting to S3, listing objects, uploading files, and reading file contents — supporting public buckets (no credentials) and private buckets (AWS credentials).

Supports three transport modes: **stdio**, **SSE**, and **Streamable HTTP**.

---

## Folder Structure

```text
aws-s3-connector-tool-updated/
|-- aws_s3_server.py       # Main server entry point
|-- Dockerfile
|-- LICENSE
|-- mcp.example.json
|-- pyproject.toml
|-- README.md
`-- tools/
    |-- __init__.py
    |-- s3_connector_tools.py
    `-- toolhandler.py
```

---

## Available Tools (4)

| Tool | Description |
|------|-------------|
| `connect_s3` | Connect to an S3 bucket via public URL or AWS credentials |
| `list_objects` | List all objects in the connected bucket with filenames and links |
| `upload_object` | Upload a file from a local path or internet URL to S3 |
| `read_object` | Read file contents from S3 (CSV, JSON, Excel, PDF, Parquet, images, text) |

---

## Tools Reference

### 1. connect_s3

Connect to an S3 bucket. Call this first before using other tools.

**Parameters:**

| Parameter | Required | Description |
|-----------|----------|-------------|
| `s3_url` | Yes (if no credentials) | Public S3 URL, e.g. `https://my-bucket.s3.amazonaws.com` or `s3://my-bucket` |
| `bucket_url` | Alias | Alias of `s3_url` (supported for compatibility) |
| `aws_access_key_id` | No | AWS access key (for private buckets) |
| `aws_secret_access_key` | No | AWS secret key (for private buckets) |
| `region_name` | No | AWS region (default: auto-detected or `us-east-1`) |
| `region` | Alias | Alias of `region_name` (supported for compatibility) |

**Example — public bucket:**
```json
{
  "s3_url": "https://my-public-bucket.s3.amazonaws.com"
}
```

**Example — private bucket:**
```json
{
  "aws_access_key_id": "<access-key>",
  "aws_secret_access_key": "<secret-key>",
  "s3_url": "s3://my-private-bucket",
  "region_name": "us-east-1"
}
```

**Returns:**
```json
{
  "status": "connected",
  "bucket": "my-bucket",
  "region": "us-east-1",
  "mode": "public"
}
```

---

### 2. list_objects

List all objects in the connected S3 bucket with filenames and presigned/public links.

**Parameters:** none (uses connection from `connect_s3`)

**Example:**
```json
{}
```

**Returns:**
```json
{
  "status": "success",
  "bucket": "my-bucket",
  "count": 3,
  "objects": [
    {
      "key": "data/report.csv",
      "size": 4096,
      "last_modified": "2026-06-01T10:00:00Z",
      "url": "https://my-bucket.s3.amazonaws.com/data/report.csv?..."
    }
  ]
}
```

---

### 3. upload_object

Upload a file to the connected S3 bucket from a local path or a URL.

**Parameters:**

| Parameter | Required | Description |
|-----------|----------|-------------|
| `object_key` | Yes | Destination S3 key (path in bucket), e.g. `uploads/file.csv` |
| `key` | Alias | Alias of `object_key` (supported for compatibility) |
| `local_file_path` | No* | Absolute local file path |
| `local_path` | Alias | Alias of `local_file_path` (supported for compatibility) |
| `source_url` | No* | Internet URL to download and upload |

*One of `local_path` or `source_url` is required.

**Example — local file:**
```json
{
  "object_key": "uploads/report.csv",
  "local_file_path": "C:/Users/me/Downloads/report.csv"
}
```

**Example — from URL:**
```json
{
  "object_key": "uploads/data.json",
  "source_url": "https://example.com/data.json"
}
```

**Returns:**
```json
{
  "status": "success",
  "object_key": "uploads/report.csv",
  "bucket": "my-bucket",
  "message": "Uploaded successfully"
}
```

---

### 4. read_object

Read and return the contents of a file stored in S3. Supports multiple file formats.

**Parameters:**

| Parameter | Required | Description |
|-----------|----------|-------------|
| `object_key` | Yes | S3 object key to read |
| `key` | Alias | Alias of `object_key` (supported for compatibility) |

**Supported formats:**

| Format | Extensions | Output |
|--------|-----------|--------|
| Text / CSV / JSON | `.txt`, `.csv`, `.json`, `.md`, `.log`, `.xml`, `.html`, `.yaml`, `.yml` | Raw text |
| Excel | `.xlsx`, `.xls` | JSON rows per sheet |
| Parquet | `.parquet` | JSON rows |
| PDF | `.pdf` | Extracted text |
| Images | `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp` | Base64-encoded data URL |
| Other | any | Base64-encoded content |

**Example:**
```json
{
  "object_key": "data/report.csv"
}
```

**Returns:**
```json
{
  "status": "success",
  "object_key": "data/report.csv",
  "format": "text",
  "content": "id,name,value\n1,Alice,100\n2,Bob,200\n"
}
```

---

## Prerequisites

- Python 3.10+
- AWS credentials (only for private buckets)

---

## Installation

```bash
# From the workspace root (where .venv lives)
.venv\Scripts\activate          # Windows
# source .venv/bin/activate     # macOS / Linux

cd aws-s3-connector-tool-updated
pip install -e .
```

---

## Run

### stdio (default — for MCP desktop clients like Claude Desktop)

```bash
aws-s3-connector-mcp --mode stdio
```

### SSE

```bash
aws-s3-connector-mcp --mode sse --host 0.0.0.0 --port 8000
```

Endpoints:
- `GET  /sse`
- `POST /messages` (also supports `/messages/`)
- `GET  /health`

### Streamable HTTP

```bash
aws-s3-connector-mcp --mode streamable-http --host 0.0.0.0 --port 8000
```

Endpoints:
- `POST /mcp`
- `GET  /health`
- `GET  /`

### Environment variables (alternative to CLI flags)

| Variable | Default | Description |
|----------|---------|-------------|
| `TRANSPORT_TYPE` | `stdio` | `stdio` / `sse` / `streamable-http` |
| `APP_HOST` | `0.0.0.0` | Bind host |
| `APP_PORT` | `8000` | Bind port |

---

## Docker

```bash
# Build
docker build -t aws-s3-connector-mcp .

# Run (streamable-http, port 8000)
docker run -p 8000:8000 \
  -e AWS_ACCESS_KEY_ID=<your-key> \
  -e AWS_SECRET_ACCESS_KEY=<your-secret> \
  aws-s3-connector-mcp
```

---

## MCP Client Configuration

See `mcp.example.json` for a ready-to-use client config snippet.

**stdio (Claude Desktop / Cursor):**
```json
{
  "mcpServers": {
    "aws-s3-connector": {
      "command": "aws-s3-connector-mcp",
      "args": ["--mode", "stdio"],
      "env": {
        "AWS_ACCESS_KEY_ID": "AKIA...",
        "AWS_SECRET_ACCESS_KEY": "your-secret-key",
        "AWS_REGION": "ap-south-1",
        "S3_BUCKET": "customer-kyc-demo"
      }
    }
  }
}
```

With this env format, you can run `connect_s3` with empty arguments:
```json
{}
```

**Streamable HTTP (MCP Inspector / MCPmon):**
```
http://localhost:8000/mcp
```

For SSE in MCP Inspector, use:
```
http://127.0.0.1:8000/sse
```
Avoid `0.0.0.0` in the inspector URL.

---

## Architecture

```text
MCP Client (Claude / Cursor / MCP Inspector)
    |
    | JSON-RPC 2.0
    v
Transport Layer (stdio | SSE | Streamable HTTP)   ← aws_s3_server.py
    |
    v
ToolHandler Registry (4 tools)
    |
    v
S3 Tool Handlers                                  ← tools/s3_connector_tools.py
    |
    v
boto3  ──►  AWS S3 API
```

---

## Troubleshooting

**`NoCredentialsError`** — Pass credentials via `connect_s3` or set `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` env vars.

**`NoSuchBucket`** — Verify the bucket name and region in `connect_s3`.

**`connect_s3` not called** — Always call `connect_s3` before `list_objects`, `upload_object`, or `read_object`.

**Port already in use** — Change `APP_PORT` env var or use `--port` flag.

---

## License

MIT License — see [LICENSE](LICENSE) for details.

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct purpose: connect to a bucket, list objects, read object contents, and upload files. There is no overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case (connect_s3, list_objects, read_object, upload_object), making them predictable.

Tool Count5/5

With 4 tools covering core S3 operations (connect, list, read, upload), the count is well-scoped and avoids being too few or too many.

Completeness4/5

The tool surface covers key read and write operations, but is missing a delete operation, which is a minor gap. Overall, it supports common workflows.

Maintenance

ActivitySlowing
ResponsivenessNo issues