aws-s3-connector-mcp
This server provides 4 tools to interact with AWS S3 buckets, supporting both public and private buckets:
connect_s3: Establish a connection to an S3 bucket via a public URL (supporting formats likes3://bucket-name,https://bucket.s3.amazonaws.com) or private access using AWS credentials (access key, secret key, optional session token, and region).list_objects: List objects in the connected bucket, returning file names, sizes, last modified dates, and presigned/public URLs. Supports optional filtering by prefix (folder path) and a result limit.upload_object: Upload files to the connected S3 bucket from either a local file path on the server or a remote internet URL (downloaded then uploaded to a specified S3 key).read_object: Read and return the contents of S3 objects across multiple formats:Text/CSV/JSON/Markup: Raw text content (with optional character limit)
Excel (
.xlsx,.xls): Sheet data as JSON rows (with optional sheet targeting)Parquet: Schema and rows as JSON
PDF: Extracted text from pages
Images (
.png,.jpg,.jpeg,.gif,.webp): Base64-encoded data URLsUnknown/binary: File metadata only
Provides tools for connecting to AWS S3 buckets, listing objects, uploading files, and reading file contents, supporting both public and private buckets.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@aws-s3-connector-mcplist objects in my S3 bucket"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AWS S3 Connector MCP Server
A production-ready Model Context Protocol (MCP) 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
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.pyRelated MCP server: AWS Security MCP Server
Available Tools (4)
Tool | Description |
| Connect to an S3 bucket via public URL or AWS credentials |
| List all objects in the connected bucket with filenames and links |
| Upload a file from a local path or internet URL to S3 |
| 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 |
| Yes (if no credentials) | Public S3 URL, e.g. |
| Alias | Alias of |
| No | AWS access key (for private buckets) |
| No | AWS secret key (for private buckets) |
| No | AWS region (default: auto-detected or |
| Alias | Alias of |
Example — public bucket:
{
"s3_url": "https://my-public-bucket.s3.amazonaws.com"
}Example — private bucket:
{
"aws_access_key_id": "<access-key>",
"aws_secret_access_key": "<secret-key>",
"s3_url": "s3://my-private-bucket",
"region_name": "us-east-1"
}Returns:
{
"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:
{}Returns:
{
"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 |
| Yes | Destination S3 key (path in bucket), e.g. |
| Alias | Alias of |
| No* | Absolute local file path |
| Alias | Alias of |
| No* | Internet URL to download and upload |
*One of local_path or source_url is required.
Example — local file:
{
"object_key": "uploads/report.csv",
"local_file_path": "C:/Users/me/Downloads/report.csv"
}Example — from URL:
{
"object_key": "uploads/data.json",
"source_url": "https://example.com/data.json"
}Returns:
{
"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 |
| Yes | S3 object key to read |
| Alias | Alias of |
Supported formats:
Format | Extensions | Output |
Text / CSV / JSON |
| Raw text |
Excel |
| JSON rows per sheet |
Parquet |
| JSON rows |
| Extracted text | |
Images |
| Base64-encoded data URL |
Other | any | Base64-encoded content |
Example:
{
"object_key": "data/report.csv"
}Returns:
{
"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
# 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)
aws-s3-connector-mcp --mode stdioSSE
aws-s3-connector-mcp --mode sse --host 0.0.0.0 --port 8000Endpoints:
GET /ssePOST /messages(also supports/messages/)GET /health
Streamable HTTP
aws-s3-connector-mcp --mode streamable-http --host 0.0.0.0 --port 8000Endpoints:
POST /mcpGET /healthGET /
Environment variables (alternative to CLI flags)
Variable | Default | Description |
|
|
|
|
| Bind host |
|
| Bind port |
Docker
# 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-mcpMCP Client Configuration
See mcp.example.json for a ready-to-use client config snippet.
stdio (Claude Desktop / Cursor):
{
"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:
{}Streamable HTTP (MCP Inspector / MCPmon):
http://localhost:8000/mcpFor SSE in MCP Inspector, use:
http://127.0.0.1:8000/sseAvoid 0.0.0.0 in the inspector URL.
Architecture
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 APITroubleshooting
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 for details.
Available Tools
4 toolsconnect_s3A
Connect to an AWS S3 bucket. Supports two modes:
Credentials mode (private buckets): provide aws_access_key_id + aws_secret_access_key + region_name.
Public mode (no credentials): provide s3_url only — region is auto-detected from the URL. Accepted s3_url formats: s3://bucket-name, https://bucket.s3.amazonaws.com, https://bucket.s3.REGION.amazonaws.com.
| Name | Required | Description | Default |
|---|---|---|---|
| s3_url | Yes | S3 bucket URL (e.g. s3://my-bucket or https://my-bucket.s3.us-east-1.amazonaws.com) | |
| region_name | No | AWS region (e.g. us-east-1). Auto-detected from s3_url if not provided. | |
| aws_access_key_id | No | AWS Access Key ID (required for private buckets) | |
| aws_session_token | No | AWS Session Token for temporary credentials (optional) | |
| aws_secret_access_key | No | AWS Secret Access Key (required for private buckets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses connection modes, credential requirements, and region auto-detection, but does not mention side effects (e.g., session creation, network requirements) or whether the connection is persistent. Adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using two sentences and bullet points. It is front-loaded with the main purpose and every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, two modes, and no output schema, the description covers the accepted URL formats, mode conditions, and auto-detection. It is sufficient for an agent to understand how to invoke the tool correctly, though return value behavior is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds extra meaning by explaining the two modes and how parameters relate (e.g., region auto-detected, credentials required for private), adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool connects to an AWS S3 bucket and distinguishes two modes (credentials vs public). It is specific about the resource (S3 bucket) and the verb (connect), and it differentiates from sibling tools which are object operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each mode: credentials for private buckets, public mode for public buckets. It provides clear context on prerequisites and auto-detection, but does not explicitly state when not to use the tool or mention alternatives beyond siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsA
List all objects in the connected S3 bucket. Returns each object's file name, size, last modified date, and a presigned URL. Optionally filter by prefix (folder path) or limit the number of results.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No | Filter by prefix/folder path (e.g. 'data/' or 'reports/2026/'). | |
| bucket_name | No | Override the connected bucket name (optional). | |
| max_results | No | Maximum number of objects to return (default: 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavioral traits. It implies a prior connection ('connected S3 bucket') and is read-only, but does not explicitly state safety or any side effects. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with action and result. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description lists return fields. Lacks details on ordering, pagination beyond max_results, and root behavior. Sufficient for a simple list tool but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all parameters have descriptions). The description adds minimal extra context (e.g., 'folder path' for prefix). No significant added value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all objects in the connected S3 bucket' and specifies return fields (name, size, date, presigned URL). It is distinct from siblings like connect_s3, read_object, and upload_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While no explicit when-to-use or alternatives are mentioned, the purpose is clear. The context of sibling tools makes usage self-evident: use this to browse objects, not to connect, read a single object, or upload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_objectA
Read and display the contents of an object in the connected S3 bucket. Supported formats:
Text: .txt, .csv, .json, .jsonl, .xml, .html, .md, .log, .yaml, .yml
Excel: .xlsx, .xls — returns all sheet data as tables
Parquet: .parquet — returns schema + first 50 rows
PDF: .pdf — extracts text from first 10 pages
Images: .png, .jpg, .jpeg, .gif, .webp — returns image content
Unknown/binary: returns file metadata only.
| Name | Required | Description | Default |
|---|---|---|---|
| max_chars | No | Max characters to return for text files (default: 10000). | |
| object_key | Yes | The S3 object key (path/filename) to read. | |
| sheet_name | No | For Excel: specific sheet name to read. Reads all sheets if not provided. | |
| bucket_name | No | Override the connected bucket name (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description provides good behavioral transparency: it explains format-specific behaviors (e.g., PDF first 10 pages, Parquet first 50 rows, unknown returns metadata). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose. It uses a bullet-like structure for formats, maximizing readability with minimal text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool without an output schema, the description adequately covers return behaviors per format. It could mention the overall return structure (e.g., JSON object) but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well-documented. The description adds no new semantic details beyond the format list, which is contextual rather than param-specific.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads and displays object contents, and lists supported formats. It is distinct from siblings like list_objects and upload_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description focuses on format support rather than usage context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_objectA
Upload a file to the connected S3 bucket. Two sources supported:
Local file: provide local_file_path (absolute path on the server).
Internet URL: provide source_url — file is downloaded then uploaded to S3. Optionally set object_key (S3 path/filename). Defaults to the source filename.
| Name | Required | Description | Default |
|---|---|---|---|
| object_key | No | S3 key (path + filename) to store the file as. Defaults to source filename. | |
| source_url | No | Public URL of a file to download and upload to S3. | |
| bucket_name | No | Override the connected bucket name (optional). | |
| local_file_path | No | Absolute local path of the file to upload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the two upload modes and default behavior for object_key. However, it does not mention mandatory behavior (e.g., exactly one source required), file size limits, overwrite policy, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is extremely concise with only two short sentences plus a bullet list. Every sentence adds unique value. No fluff, front-loaded with the main verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description provides adequate context for a file upload tool. It explains the two input modes, optional parameters, and default key selection. Minor gaps: no mention of return value or success signal, but the essential behavior is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds context about default object_key and the two source scenarios, but does not go beyond the schema's parameter descriptions. No additional semantic value for parameters like bucket_name or what 'override' means.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Upload a file' to a specific resource 'connected S3 bucket'. Distinguishes from sibling tools (list_objects, read_object, connect_s3) by focusing on writing. Two distinct source types (local file, internet URL) are explicitly listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explains when to use each source (local_file_path vs source_url) and mentions optional bucket_name override. It does not explicitly state when not to use this tool or when to alternate with siblings, but the purpose is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
connect_s3 - First observed
list_objects - First observed
read_object - First observed
upload_object
TDQS
Scored across 4 tools
Each tool has a distinct purpose: connect to a bucket, list objects, read object contents, and upload files. There is no overlap in functionality.
All tool names follow a consistent verb_noun pattern with snake_case (connect_s3, list_objects, read_object, upload_object), making them predictable.
With 4 tools covering core S3 operations (connect, list, read, upload), the count is well-scoped and avoids being too few or too many.
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
Related MCP Connectors
Tigris MCP Server seamlessly connects AI agents to Tigris bucket and object management.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Query, join, profile, clean and convert CSV/JSON/Parquet with server-side DuckDB over MCP.
Connect MCP clients to 2,000+ AI models without managing provider API keys.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables interaction with AWS S3 through MCP, supporting bucket and object management, lifecycle configurations, tagging, policies, CORS settings, presigned URLs, and file uploads/downloads.3MIT
- AlicenseNot gradedqualityDmaintenanceEnables management and analysis of AWS security groups, S3 buckets, and VPC connections via MCP.7MIT
- AlicenseNot gradedqualityAmaintenanceProvides MCP tools for AWS S3 and S3-compatible storage, enabling file upload, download, listing, deletion, and temporary remote file staging via natural language.BSD 3-Clause
- AlicenseNot gradedqualityAmaintenanceEnables agents to interact with any S3-compatible storage (AWS S3, LocalStack, MinIO) via MCP, providing tools like list, read, write, delete objects and buckets.MIT