Skip to main content
Glama

s3-mcp

A generic S3-protocol MCP server (stdio) that works against any S3-compatible endpoint — RustFS, MinIO, Cloudflare R2, Backblaze B2, AWS S3 — not just AWS.

Single Python package, one boto3 client created at startup, configuration via environment variables only. Built on the official mcp SDK (high-level server API) and boto3.

Configuration (environment variables)

Variable

Required

Default

Description

S3_ENDPOINT_URL

no

(unset)

S3-compatible endpoint; omit to target real AWS

AWS_REGION

no

us-east-1

Region for signing and bucket creation

AWS_ACCESS_KEY_ID

yes

Access key

AWS_SECRET_ACCESS_KEY

yes

Secret key

S3_PATH_STYLE

no

true

Path-style addressing (https://host/bucket/key) — required by most non-AWS stores

S3_TLS_INSECURE

no

false

true disables TLS certificate verification (self-signed endpoints)

Booleans accept true/false/1/0/yes/no (case-insensitive). Missing credentials or invalid booleans abort startup with a clear error.

Related MCP server: MinIO MCP Server

Tools

Tool

Read-only hint

list_buckets()

yes

list_objects(bucket, prefix="", max_keys=1000)

yes

get_object(bucket, key) → text if UTF-8 else {base64, content_type}

yes

stat_object(bucket, key)

yes

presign_get(bucket, key, expires_s=3600)

yes

put_object(bucket, key, body, base64=false)

no

delete_object(bucket, key)

no

copy_object(src_bucket, src_key, dst_bucket, dst_key)

no

create_bucket(bucket)

no

delete_bucket(bucket)

no

presign_put(bucket, key, expires_s=3600)

no

Tool errors are raised as short RuntimeError messages and surfaced by MCP as error results. Presigned URLs are capped at 7 days (604800 s), per SigV4.

Example configurations

RustFS with a self-signed certificate

{
  "mcpServers": {
    "s3-mcp": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "S3_ENDPOINT_URL=https://rustfs.local:9000",
        "-e", "S3_TLS_INSECURE=true",
        "-e", "AWS_REGION=us-east-1",
        "-e", "AWS_ACCESS_KEY_ID",
        "-e", "AWS_SECRET_ACCESS_KEY",
        "ghcr.io/jakeperalta7/s3-mcp:latest"
      ]
    }
  }
}

-e VAR without a value passes the variable through from your shell, so credentials never appear in the config file.

MinIO

{
  "mcpServers": {
    "s3-mcp": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "S3_ENDPOINT_URL=http://localhost:9000",
        "-e", "AWS_REGION=us-east-1",
        "-e", "AWS_ACCESS_KEY_ID",
        "-e", "AWS_SECRET_ACCESS_KEY",
        "ghcr.io/jakeperalta7/s3-mcp:latest"
      ]
    }
  }
}

AWS S3

Omit S3_ENDPOINT_URL; standard AWS credential/region resolution applies:

{
  "mcpServers": {
    "s3-mcp": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "AWS_REGION",
        "-e", "AWS_ACCESS_KEY_ID",
        "-e", "AWS_SECRET_ACCESS_KEY",
        "ghcr.io/jakeperalta7/s3-mcp:latest"
      ]
    }
  }
}

Without Docker (uv)

uvx --from git+https://github.com/JakePeralta7/s3-mcp s3-mcp
{
  "mcpServers": {
    "s3-mcp": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/JakePeralta7/s3-mcp", "s3-mcp"],
      "env": {
        "S3_ENDPOINT_URL": "http://localhost:9000",
        "AWS_ACCESS_KEY_ID": "...",
        "AWS_SECRET_ACCESS_KEY": "..."
      }
    }
  }
}

Development

uv sync --group dev   # install deps into .venv
uv run pytest -q      # unit tests (boto3 mocked, no network)
docker build -t s3-mcp:dev .

Entrypoint: python -m s3_mcp (stdio transport only).

Releasing

Every push to main runs tests, then publishes ghcr.io/<owner>/<repo>:<version> + :latest, where <version> is read from version in pyproject.toml. To release, bump the version and merge to main. Git tags are not used.

License

MIT

Available Tools

11 tools
copy_objectC

Copy an object within or across buckets on the same endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
dst_keyYes
src_keyYes
dst_bucketYes
src_bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full burden. It adds one behavioral constraint ('same endpoint') but does not disclose whether the destination object is overwritten, whether metadata is preserved, whether the copy is atomic, or what permissions are required. This is a significant gap for a mutating operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler, and the action verb is front-loaded. Every word earns its place, though brevity comes at the expense of substantive guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a copy operation with no annotations, no parameter docs, and an unknown output schema, the description is insufficient. It omits overwrite behavior, metadata handling, permission requirements, and failure modes, leaving an agent without enough context to call the tool reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description provides no parameter semantics. Even though parameter names are self-explanatory, the description adds nothing beyond the schema, failing to explain relationships or constraints among src_bucket, src_key, dst_bucket, dst_key (e.g., that buckets must be on the same endpoint).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Copy') and resource ('object'), and clearly states the scope ('within or across buckets on the same endpoint'), which distinguishes it from list/get/put/delete tools. However, it does not explicitly contrast with put_object+get_object as an alternative, so it falls just short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus siblings such as put_object, presign_put, or get_object+put_object for manual copy workflows. No prerequisites, permissions, or conditions for selection are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_bucketC

Create a bucket in the configured region.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only mentions that the bucket is created in the configured region; it does not mention permissions, idempotency, failure behavior, or side effects of creating a bucket.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to the meaning, and it is appropriately sized for a one-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one required string parameter and an output schema, this is minimally viable. However, it lacks any usage context or behavioral caveats, so it is not particularly helpful to an agent deciding how or when to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'bucket' parameter beyond the fact that a bucket is being created. It adds little on top of the parameter name and type, leaving format and constraints undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Create') and a clear resource ('bucket'), and adds the qualifier 'in the configured region.' This distinguishes it from sibling tools like delete_bucket or list_buckets, though it relies partly on the tool name and sibling context to do so.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool instead of alternatives, no prerequisites or exclusions, and no mention of behavior when the bucket already exists. The use case is implied by the verb but never made explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_bucketA

Delete a bucket (must be empty).

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It conveys that the operation is destructive ('Delete') and discloses the most important behavioral constraint — the bucket must be empty — which implies failure or refusal on non-empty buckets. It omits error behavior, irreversibility details, and permission requirements, but the safety-critical trait is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Six words with the verb front-loaded and the critical constraint embedded in the same sentence. There is zero wasted text; every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity, one-parameter tool with an output schema present, the description covers the core operation and the single biggest gotcha (empty-bucket requirement). However, with no annotations and no parameter-level documentation, details about failure behavior on non-empty buckets and how to resolve a valid bucket identifier are left to the agent's domain knowledge.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the undocumented 'bucket' parameter. It only restates that the parameter identifies the bucket to delete, adding no format, example, or pointer to list_buckets for obtaining valid values. The 'must be empty' clause describes a bucket state, not the parameter's meaning, so it adds little beyond what the schema property name already implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the verb (delete) and resource (bucket) directly, with the critical qualifier '(must be empty)' distinguishing it from delete_object, which targets objects within a bucket, and complementing create_bucket. An agent can tell this tool's scope at a glance without opening any sibling schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(must be empty)' communicates the key precondition for safe use, implying the agent should verify emptiness before calling. However, it does not explicitly name alternatives or the when-not-to path, such as using delete_object to empty the bucket first, so the routing guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_objectC

Delete an object from a bucket.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits itself. It merely states the action with no mention of permanence, irreversibility, idempotency, error behavior (e.g., if the key does not exist), or any side effects. For a destructive operation, this is a critical gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with zero filler. It states the exact action and scope efficiently. No unnecessary words or repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, return values are covered, but the description still lacks essential context for a mutation tool: it does not state that the operation is destructive and permanent, what happens on non-existent keys, or any preconditions. With no annotations, the description alone is insufficient for an agent to safely and correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining the parameters. It does not. While 'bucket' and 'key' are fairly self-explanatory names, the description adds no meaning beyond the schema's type and title. It does not clarify formats, required vs optional, or relationships between them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete an object from a bucket' uses a clear verb (delete) and resource (object) with explicit scope (from a bucket). It naturally distinguishes from siblings like delete_bucket (deletes the bucket itself) and put_object (writes). No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool vs alternatives, nor any conditions or exclusions. It does not mention that this deletes a single object rather than a bucket, or that it is the counterpart to put_object/get_object. The agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_objectA
Read-only

Read an object. UTF-8 content returns as text; anything else as base64.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true already establishes that this is a safe read operation. The description adds valuable behavioral context by explaining how content is returned: UTF-8 as text, otherwise base64. This goes beyond the annotation and helps the agent interpret the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately short and front-loaded. The core action appears first, followed by a concise behavioral note. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-parameter input, the readOnly annotation, and the presence of an output schema, the description covers the most relevant invocation detail: response encoding. It is slightly incomplete in lacking usage guidance, but it is adequate for a straightforward read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the meaning or usage of bucket or key. The parameter names are somewhat self-explanatory, but the description adds no semantic detail to help an agent construct correct arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Read an object." This clearly distinguishes it from sibling tools like put_object, delete_object, and list_objects. The action and target are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool over alternatives such as stat_object or presign_get. It does not mention exclusions, prerequisites, or when another sibling would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_bucketsA
Read-only

List all buckets accessible with the configured credentials.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds value beyond the readOnlyHint by specifying that it uses 'configured credentials', which explains scope and access control. It is consistent with the annotation and provides useful context without redundancy.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence that is fully front-loaded and contains no filler. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only listing operation with an output schema, the description is complete. It states exactly what it does and the credential scope; nothing else is needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema is complete. The description does not need to elaborate on parameters; the baseline for 0 params is 4, and the description adds no parameter-specific info because none exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('buckets'), and clarifies the scope ('all buckets accessible with the configured credentials'). It is unambiguous and distinguishes itself from sibling object-level tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies its use case (enumerating buckets), and the sibling tools are object-focused, so the context is clear. It does not explicitly state exclusions or alternatives, but the distinction is self-evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_objectsA
Read-only

List objects in a bucket (single page, up to max_keys).

Returns objects with key/size/last_modified plus a truncated flag when more results exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYes
prefixNo
max_keysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds useful behavioral details: it returns a single page, respects max_keys, includes key/size/last_modified fields, and provides a truncated flag when more results exist. This goes beyond the annotation and clarifies pagination behavior without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, with the primary purpose front-loaded. The pagination detail and return fields are stated without redundancy. Every clause earns its place; there is no fluff or unnecessary explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple (3 params, output schema present), and the description covers the main behavior and return fields. However, the prefix parameter is entirely unmentioned, which is a significant gap for filtering results. An agent would not know that prefix is available for narrowing the listing, making the description incomplete for full usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explicitly mentions max_keys and implies bucket, but entirely omits the prefix parameter. Since prefix is a common filtering mechanism, the description fails to explain its purpose or usage, leaving agents without guidance for that parameter. The description adds partial value for max_keys but is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List objects in a bucket' with a specific verb and resource, and distinguishes itself from siblings like list_buckets (which lists buckets) and get_object (which retrieves a single object). It also adds the key constraint 'single page, up to max_keys' which further differentiates its behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (to list objects) but does not explicitly contrast it with alternatives. It does not mention that get_object or stat_object should be used for single-object needs, nor does it state when not to use this tool. The pagination hint (truncated flag) provides context, but no explicit exclusions or sibling routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

presign_getB
Read-only

Generate a pre-signed GET URL valid for expires_s seconds (max 604800).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes
expires_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds a useful constraint (max 604800 seconds), but does not disclose other behavioral details such as whether object existence is required or what signing credentials are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. The key constraint (expiry seconds and maximum) is immediately useful and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need no explanation. However, the description is thin on when to invoke this tool versus close siblings and on parameter semantics beyond expires_s. It is minimally viable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for expires_s (seconds, max 604800) but leaves bucket and key entirely to their names, with no format, path, or validation details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Generate'), a specific resource ('pre-signed GET URL'), and a scope ('valid for expires_s seconds'). This clearly distinguishes the tool from siblings like get_object and presign_put.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool instead of get_object or presign_put, nor does it mention any alternative or exclusion condition. Usage must be inferred entirely from the tool name and the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

presign_putC

Generate a pre-signed PUT URL valid for expires_s seconds (max 604800).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes
expires_sNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only mentions the expiry duration and its max, but fails to disclose that the URL grants temporary write access, that it's a security token, or that it's specific to the PUT method. This is a significant gap for a tool that creates a security-sensitive URL.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no unnecessary words, and the key constraint (max 604800) is front-loaded. It is concise and efficient, but the brevity contributes to the under-specification seen in other dimensions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description omits crucial context: prerequisites (bucket must exist, key must be valid), security implications (anyone with the URL can upload until expiry), and when to use this vs alternatives. The output schema may define the return URL, but the description doesn't explain the operational context needed for correct and safe usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptions for any parameters (0% coverage), so the description must explain all of them. It only describes expires_s as the validity period and its max, but says nothing about bucket or key. The description adds minimal value for only one of three parameters, insufficient to compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action 'Generate' and the resource 'pre-signed PUT URL', which is a clear verb+resource pair. The 'PUT' clearly distinguishes it from presign_get, so an agent can tell them apart without looking at the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus put_object or presign_get. It doesn't mention that this is for client-side uploads or that it should be used when delegating upload capability, leaving the agent to infer the use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

put_objectC

Write an object. Set base64=true when body is base64-encoded binary.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bodyYes
base64No
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure صح. It reveals the base64 flag semantics but does not mention overwrite behavior, idempotency, permissions, size limits, or what happens to existing objects with the same key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded, with the core action in the first sentence and a useful parameter caveat in the second. It avoids waste, though the first sentence is somewhat tautological with the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations wagering, a full schema coverage gap, and direct mutation side effects, the description is too sparse. It does not explain required parameters, overwrite semantics, or how this fits among sibling operations. An output schema exists but is not described, so return values remain unknown for safety-critical checks.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It clarifies the base64 boolean, but bucket, key, and body remain only title-level with no additional meaning. The description does not compensate for the missing schema descriptions across most parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action clearly with the verb 'Write' and the resource 'object', making the purpose immediately identifiable. It distinguishes from siblings like get_object and delete_object, though it does not explicitly contrast with presign_put beyond the implied direct write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use put_object versus alternatives such as presign_put or copy_object. The only usage hint is the base64 condition, which is a parameter detail rather than a selection criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stat_objectA
Read-only

Get object metadata (size, etag, content type, last modified).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation is present, and the description's 'Get' is consistent. The description adds the specific metadata fields returned but does not disclose other behaviors like whether it fails on missing objects or that it does not transfer data. Since annotations cover the read-only aspect, the description adds moderate context but not rich behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the verb and purpose. It includes the key metadata fields without any wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple metadata retrieval tool with an output schema and read-only annotation, the description covers the essential purpose and return fields. It could be more explicit about not retrieving the object content, but given the simplicity and existing schema, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain the 'bucket' and 'key' parameters. It only lists the metadata fields. Since the schema has no descriptions, the description fails to compensate, leaving the agent to infer the meaning of the parameters from their names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'object metadata', listing specific fields (size, etag, content type, last modified). This distinguishes it from siblings like get_object which retrieves content, and list_objects which lists objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It implies it is for metadata-only retrieval, but does not mention get_object or other siblings, nor any conditions for when to use it. Guidance is only implied by the purpose.

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.

  1. 11 tool updatesv0.1.0
    • First observedcopy_object
    • First observedcreate_bucket
    • First observeddelete_bucket
    • First observeddelete_object
    • First observedget_object
    • First observedlist_buckets
    • First observedlist_objects
    • First observedpresign_get
    • First observedpresign_put
    • First observedput_object
    • First observedstat_object

TDQS

A3.5/5.0

Scored across 11 tools

Disambiguation5/5

Every tool maps to a distinct S3 operation: bucket listing/creation/deletion, object listing/read/metadata/write/delete/copy, and presigned URL generation for GET vs PUT. There is no functional overlap that would cause an agent to select the wrong tool.

Naming Consistency5/5

All tool names follow the same snake_case verb_noun pattern (list_buckets, get_object, presign_put, create_bucket, etc.). The naming is predictable and consistent across the entire surface.

Tool Count5/5

With 11 tools, the set is well-scoped for an S3-focused server. Each tool covers a core operation without extraneous additions or redundant convenience wrappers.

Completeness4/5

The server covers bucket lifecycle and object CRUD, including copying and presigned URLs, so common workflows are fully supported. Minor gaps exist around pagination for large object listings and advanced operations like multipart uploads, but these are not severe for typical usage.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables interaction with AWS S3 through MCP, supporting bucket and object management, lifecycle configurations, tagging, policies, CORS settings, presigned URLs, and file uploads/downloads.
    3
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Provides tools for interacting with MinIO and S3-compatible object storage through MCP clients like Claude. It enables comprehensive bucket and object management, including listing, creating, uploading, and generating presigned URLs.
    13
    2
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables MCP clients to connect to AWS S3 buckets, list, upload, and read objects in various formats, supporting public and private buckets with multiple transport modes.
    4
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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