ObjectStore MCP
Multi-Backend Object Storage | MCP Server
The object-storage connector for the agent-connector-sdk fleet: one MCP tool surface over S3 and S3-compatible stores (MinIO, Cloudflare R2), Google Cloud Storage, Azure Blob Storage, and a zero-infra local-filesystem backend.
Version: 2.3.0
Documentation — Installation, deployment, and usage across the API, CLI, and MCP interfaces are maintained in
docs/.
Table of Contents
- Overview
- What it provides
- Backend × capability matrix
- Installation
- Configuration (environment)
- Usage
- MCP config
- Docker deployment
- Development
- License
Overview
objectstore-mcp wraps heterogeneous object stores behind one typed,
(objectstore-agent). Safety caps, explicit buckets, and dry-run-by-default
batch deletes are enforced uniformly in the tool layer, in either case of backend.
What it provides
-
A multi-backend store abstraction (
objectstore_mcp.api, CONCEPT:OB-OS.governance.every-provider-implements-same) — every provider implements the sameObjectStoreBackendprotocol, validated by a single conformance test suite that runs for real against the filesystem backend. -
Three consolidated, action-routed MCP tools (
objectstore-mcpconsole script):Tool Actions Description objectslist(prefix/delimiter pagination),head,get(text/base64, size-capped),put(text/base64, size-capped),copy,move,delete,delete_batch(capped, dry-run by default),presign,metadata_get,metadata_setSingle-object lifecycle and listing on any store bucketslist,create,delete(empty-only, opt-in),exists,info,storesBucket/container admin and store registry introspection transferupload,download,upload_dir,download_prefix(all size/batch-capped)Local-filesystem ⇄ object-store transfer, single or by prefix The whole tool set toggles with
OBJECTSTORETOOL. -
Named multi-store routing —
OBJECTSTORE_STORESJSON maps store names to{backend, bucket?, endpoint?, profile?, ...}; every tool takes an optionalstoreargument. A zero-infralocalfilesystem store always exists, so the server works with no cloud credentials at all. -
A safety governor — size caps on get/put/transfer, list/batch key caps, deletes that demand an explicit bucket+key (no wildcards), batch deletes that are prefix-scoped, capped, and dry-run by default, and bucket deletes that are empty-only and disabled unless explicitly enabled.
Available MCP Tools
Condensed action-routed tools (default — MCP_TOOL_MODE=condensed)
| MCP Tool | Toggle Env Var | Description |
|---|---|---|
buckets |
OBJECTSTORETOOL |
Manage buckets/containers and inspect configured stores. |
objects |
OBJECTSTORETOOL |
List, read, write, copy, move, delete, presign, and tag objects. |
transfer |
OBJECTSTORETOOL |
Move data between the local filesystem and object storage. |
Verbose 1:1 API-mapped tools (MCP_TOOL_MODE=verbose or both)
15 per-operation tools — one per public API method (click to expand)
| MCP Tool | Toggle Env Var | Description |
|---|---|---|
objectstore_bucket_exists |
OBJECT_STORE_BACKENDTOOL |
Return True when the bucket exists. |
objectstore_bucket_info |
OBJECT_STORE_BACKENDTOOL |
Describe one bucket. Raises NotFoundError when absent. |
objectstore_capabilities |
OBJECT_STORE_BACKENDTOOL |
Advertise optional capabilities. |
objectstore_copy_object |
OBJECT_STORE_BACKENDTOOL |
Server-side (where possible) copy of one object. |
objectstore_create_bucket |
OBJECT_STORE_BACKENDTOOL |
Create a bucket. Raises AlreadyExistsError if it exists. |
objectstore_delete_bucket |
OBJECT_STORE_BACKENDTOOL |
Delete an EMPTY bucket. Raises BucketNotEmptyError otherwise. |
objectstore_delete_object |
OBJECT_STORE_BACKENDTOOL |
Delete exactly one object. Raises NotFoundError when absent. |
objectstore_get_object |
OBJECT_STORE_BACKENDTOOL |
Download an object's bytes. Raises ObjectStoreError when the |
objectstore_get_object_metadata |
OBJECT_STORE_BACKENDTOOL |
Return the user metadata of one object. |
objectstore_head_object |
OBJECT_STORE_BACKENDTOOL |
Stat one object without downloading it. |
objectstore_list_buckets |
OBJECT_STORE_BACKENDTOOL |
List all buckets/containers visible to the credentials. |
objectstore_list_objects |
OBJECT_STORE_BACKENDTOOL |
List objects under prefix, optionally folding at delimiter. |
objectstore_presigned_url |
OBJECT_STORE_BACKENDTOOL |
Mint a presigned URL. Raises UnsupportedOperationError when the |
objectstore_put_object |
OBJECT_STORE_BACKENDTOOL |
Upload bytes to bucket/key (overwrites). |
objectstore_set_object_metadata |
OBJECT_STORE_BACKENDTOOL |
Replace the user metadata of one object. |
3 action-routed tool(s) (default) · 15 verbose 1:1 tool(s). Each is enabled unless its <DOMAIN>TOOL toggle is set false; MCP_TOOL_MODE selects the surface (condensed default · verbose 1:1 · both). Auto-generated — do not edit.
Backend × capability matrix
| Capability | filesystem | s3 / minio / r2 | gcs | azure |
|---|---|---|---|---|
| buckets (list/create/delete/exists/info) | yes | yes | yes | yes |
| objects (list/head/get/put/copy/move/delete) | yes | yes | yes | yes |
| prefix + delimiter listing, pagination | yes | yes | yes | yes |
| user metadata get/set | yes | yes | yes | yes |
| presigned URLs | no | yes | yes (needs service-account key) | yes (needs account key) |
| bucket location | no | yes | yes | no |
Installation
Pick the extra that matches what the operator want to run (provider extras are additive):
| Extra | Installs | Use when |
|---|---|---|
objectstore-mcp[mcp] |
Connector-focused MCP server (agent-connector-sdk — FastMCP/FastAPI + epistemic-graph[full]) |
The operator only run the MCP server (smallest install / image) |
objectstore-mcp[all] |
Everything (mcp + agent + s3 + gcs + azure + logfire) |
Development / both surfaces |
pip install objectstore-mcp # core: local filesystem backend only
pip install objectstore-mcp[mcp] # connector-focused MCP server (FastMCP/FastAPI)
pip install objectstore-mcp[mcp,s3] # + boto3 (S3, MinIO, R2)
pip install objectstore-mcp[mcp,gcs] # + google-cloud-storage
pip install objectstore-mcp[mcp,azure] # + azure-storage-blob
pip install objectstore-mcp[all] # everything (MCP + agent + all providers)
Container images (:mcp)
One multi-stage docker/Dockerfile builds the MCP-only image (--target mcp):
| Image tag | Build target | Contents | Entrypoint |
|---|---|---|---|
example/objectstore-mcp:mcp |
--target mcp |
objectstore-mcp[mcp] — connector-focused, includes epistemic-graph[full]; no model-orchestration stack |
objectstore-mcp |
docker build --target mcp -t example/objectstore-mcp:mcp docker/ # connector-focused MCP server
Or pull a prebuilt image:
docker pull example/objectstore-mcp:mcp # connector-focused MCP server
docker pull example/objectstore-mcp@sha256:<digest> # agent runtime (default)
The
:mcptag is the MCP-serving image (built fromdocker/Dockerfile --target mcp, installingobjectstore-mcp[mcp]). The default which also bundles the Pydantic AI agent and the epistemic-graph engine — use it when the operator runobjectstore-agent(the agent), not just the MCP server.
Knowledge-graph database (epistemic-graph)
Agent Connector SDK core dependency (epistemic-graph[full]). The [mcp] extra keeps
deployments can use the bundled engine. For production or shared state, run
epistemic-graph as a dedicated database service and configure the runtime to use it.
Deployment recipes (single-node + Raft HA), connection configuration, and architecture
diagrams are documented in the
epistemic-graph deployment guide.
Configuration (environment)
| Var | Default | Meaning |
|---|---|---|
OBJECTSTORE_STORES |
(empty) | JSON: store name → {backend, bucket?, endpoint?, profile?, region?, root?, project?, connection_string?} |
OBJECTSTORE_DEFAULT_STORE |
first configured store, else local |
Store used when a tool call omits store |
OBJECTSTORE_FS_ROOT |
~/.local/share/objectstore-mcp |
Root of the implicit local filesystem store |
OBJECTSTORE_MAX_GET_BYTES |
10485760 (10 MiB) |
Cap on objects get |
OBJECTSTORE_MAX_PUT_BYTES |
10485760 (10 MiB) |
Cap on objects put |
OBJECTSTORE_MAX_TRANSFER_BYTES |
104857600 (100 MiB) |
Cap per transfer (single or batch total) |
OBJECTSTORE_MAX_BATCH_KEYS |
100 |
Cap on batch delete / dir transfer key counts |
OBJECTSTORE_MAX_LIST_KEYS |
1000 |
Cap on one listing page |
OBJECTSTORE_ALLOW_DELETE |
true |
Object deletes (delete/delete_batch/move) |
OBJECTSTORE_ALLOW_BUCKET_DELETE |
false |
Bucket deletes (empty buckets only) |
OBJECTSTORETOOL |
True |
Register the objectstore tool set |
HOST / PORT / TRANSPORT |
0.0.0.0 / 8000 / stdio |
MCP server bind + transport (stdio, streamable-http, sse) |
AUTH_TYPE |
none |
MCP auth mode (container image) |
ENABLE_OTEL |
True |
OTEL/Langfuse telemetry export |
EUNOMIA_TYPE / EUNOMIA_POLICY_FILE |
none / mcp_policies.json |
Eunomia access-governance middleware |
MCP_URL |
(empty) | MCP endpoint the A2A agent connects to |
Provider credentials resolve through each SDK's own chain — boto3's
resolution order for S3 (env keys, ~/.aws profiles via the store's
profile, SSO, instance metadata), GOOGLE_APPLICATION_CREDENTIALS /
Application Default Credentials for GCS, and
AZURE_STORAGE_CONNECTION_STRING for Azure Blob.
Example store registry
{
"media": {"backend": "s3", "bucket": "media-prod", "profile": "prod", "region": "us-east-1"},
"minio": {"backend": "s3", "endpoint": "http://minio.example.invalid:9000"},
"r2": {"backend": "s3", "endpoint": "https://<account>.r2.cloudflarestorage.com"},
"reports": {"backend": "gcs", "bucket": "acme-reports"},
"archive": {"backend": "azure", "bucket": "archive"},
"scratch": {"backend": "filesystem", "root": "~/scratch-store"}
}
Usage
objectstore-mcp # stdio
objectstore-mcp --transport streamable-http --host 0.0.0.0 --port 8000
Example tool calls (any MCP client):
// Write then read a text object on the zero-infra local store
{"tool": "buckets", "arguments": {"action": "create", "params_json": "{\"bucket\": \"notes\"}"}}
{"tool": "objects", "arguments": {"action": "put", "params_json": "{\"bucket\": \"notes\", \"key\": \"todo.md\", \"text\": \"- ship it\"}"}}
{"tool": "objects", "arguments": {"action": "get", "params_json": "{\"bucket\": \"notes\", \"key\": \"todo.md\"}"}}
// Preview then execute a prefix-scoped batch delete on a named S3 store
{"tool": "objects", "arguments": {"store": "media", "action": "delete_batch", "params_json": "{\"bucket\": \"media-prod\", \"prefix\": \"tmp/\"}"}}
{"tool": "objects", "arguments": {"store": "media", "action": "delete_batch", "params_json": "{\"bucket\": \"media-prod\", \"prefix\": \"tmp/\", \"dry_run\": false}"}}
MCP config
Install the connector-focused
[mcp]extra. Examples useobjectstore-mcp[mcp]to add FastMCP / FastAPI throughagent-connector-sdk; the required Agent Connector SDK core enables model orchestration. Combine it with the storage-provider extras needed by the deployment.
{
"mcpServers": {
"objectstore-mcp": {
"command": "uvx",
"args": ["--from", "objectstore-mcp[mcp]", "objectstore-mcp"],
"env": {
"OBJECTSTORE_STORES": "{\"minio\": {\"backend\": \"s3\", \"endpoint\": \"http://minio.example.invalid:9000\"}}",
"OBJECTSTORE_DEFAULT_STORE": "local"
}
}
}
}
objectstore-agent --mcp-url http://localhost:8000/mcp --host 0.0.0.0 --port 9001
Additional Deployment Options
objectstore-mcp can run as a local stdio process or container, or behind a remote
network boundary. The
Deployment guide carries
the detailed transport contract.
- Local container — launch a reviewed immutable image as a least-privilege stdio child with no listener or published port.
- Remote URL — connect through an operator-supplied authenticated HTTPS
ingress. Keep its URL, outbound identity references, trust profile, and exact
MCP_ALLOWED_HOSTSinAgentConfig.
Docker deployment
docker compose -f docker/mcp.compose.yml up -d # MCP server only
curl -s http://localhost:8000/health # {"status":"OK"}
Both services read configuration from ../.env (copy
.env.example); see docs/deployment.md.
Development
pip install -e .[test]
pytest # full suite (cloud SDKs not required)
pip install -e .[test-s3] # adds boto3+moto integration tests
pre-commit run --all-files
See docs/ for architecture, concepts, and deployment details.
License
MIT — see LICENSE.
Environment Variables
Package environment variables
| Variable | Example | Description |
|---|---|---|
HOST |
0.0.0.0 |
|
PORT |
8000 |
|
TRANSPORT |
stdio |
options: stdio, streamable-http, sse |
ENABLE_OTEL |
True |
|
OTEL_EXPORTER_OTLP_ENDPOINT |
http://localhost:8080/api/public/otel |
|
OTEL_EXPORTER_OTLP_PUBLIC_KEY |
secret-injected | |
OTEL_EXPORTER_OTLP_SECRET_KEY |
secret-injected | |
OTEL_EXPORTER_OTLP_PROTOCOL |
http/protobuf |
|
EUNOMIA_TYPE |
none |
options: none, embedded, remote |
EUNOMIA_POLICY_FILE |
mcp_policies.json |
|
EUNOMIA_REMOTE_URL |
http://eunomia-server:8000 |
|
OBJECTSTORE_STORES |
{"primary": {"backend": "s3", "bucket": "example-bucket", "endpoint": "https://object-store.example"}} |
Named stores (JSON). The zero-infra "local" filesystem store always exists. |
OBJECTSTORE_DEFAULT_STORE |
local |
|
OBJECTSTORE_FS_ROOT |
~/.local/share/objectstore-mcp |
|
OBJECTSTORE_MAX_GET_BYTES |
10485760 |
Safety limits (bytes / keys) |
OBJECTSTORE_MAX_PUT_BYTES |
10485760 |
|
OBJECTSTORE_MAX_TRANSFER_BYTES |
104857600 |
|
OBJECTSTORE_MAX_BATCH_KEYS |
100 |
|
OBJECTSTORE_MAX_LIST_KEYS |
1000 |
|
OBJECTSTORE_ALLOW_DELETE |
true |
|
OBJECTSTORE_ALLOW_BUCKET_DELETE |
false |
|
AZURE_STORAGE_CONNECTION_STRING |
— | Provider credentials resolve through each SDK's own chain (this package never reads them itself — the cloud SDK does): S3 : boto3 chain (AWS access key / secret / profile, ~/.aws, instance role) GCS : the gcloud application-default credentials chain (service-account file) Azure is the exception — the code reads this connection string directly: |
DEFAULT_AGENT_NAME |
ObjectStore Agent |
|
AGENT_DESCRIPTION |
AI agent for object-storage operations. |
|
AGENT_SYSTEM_PROMPT |
— | |
MCP_URL |
http://localhost:8000/mcp |
|
OBJECTSTORETOOL |
True |
Inherited agent-connector-sdk variables (apply to every connector)
| Variable | Example | Description |
|---|---|---|
MCP_TOOL_MODE |
intent |
Tool surface: intent | condensed | verbose | both |
MCP_ENABLED_TOOLS |
— | Comma-separated tool allow-list |
MCP_DISABLED_TOOLS |
— | Comma-separated tool deny-list |
MCP_ENABLED_TAGS |
— | Comma-separated tag allow-list |
MCP_DISABLED_TAGS |
— | Comma-separated tag deny-list |
MCP_CLIENT_AUTH |
— | Outbound MCP child auth: oidc-client-credentials | basic | none |
OIDC_CLIENT_ID |
— | OIDC client id (service-account auth) |
OIDC_CLIENT_SECRET_REF |
secret://identity/oidc-client-secret |
Runtime secret reference for the OIDC service account |
MCP_BASIC_AUTH_USERNAME |
— | HTTP Basic username (MCP_CLIENT_AUTH=basic) |
MCP_BASIC_AUTH_PASSWORD_REF |
secret://identity/mcp-basic-password |
Runtime secret reference for HTTP Basic auth (MCP_CLIENT_AUTH=basic) |
DEBUG |
False |
Verbose logging |
PYTHONUNBUFFERED |
1 |
Unbuffered stdout (recommended in containers) |
PROVIDER |
openai |
LLM provider for the agent |
MODEL_ID |
gpt-4o |
Model id for the agent |
ENABLE_WEB_UI |
True |
Serve the AG-UI web interface |
27 package + 15 inherited variable(s). Auto-generated from .env.example + the shared agent-connector-sdk set — do not edit.
Governed capability contract
This package ships a compact canonical skill surface with specialist procedures
kept as referenced workflows. The current MCP tools, skill metadata,
connector_manifest.yml, ontology, mappings, shapes, fixtures, migrations,
tool-schema fingerprints, and certification metadata form one versioned
capability contract. Validate them together; do not rely on stale tool names or
historical per-task skill wrappers.
Runtime endpoints, credentials, certificate trust, tenant identity, retention, and observability policy are deployment inputs and are never packaged values. See Configuration, trust, and privacy before enabling a network transport, connector ingestion, Arbora delegation, or trace export.
Metadata
Release files for objectstore-mcp 2.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| objectstore_mcp-2.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / objectstore_mcp-2.3.0-py3-none-any.whl
| Download URL | objectstore_mcp-2.3.0-py3-none-any.whl |
|---|---|
| Size | 64.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c3c7bca24fe3cd8a0bc95371964d4660aa0ffc41d9172387efcef98ba6912588
|
|
BLAKE2b-256 checksum How to use checksums |
e444f5777c255a538348f9284a004a91b2c27f90915f244a4f5560679b046f44
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Security for objectstore-mcp 2.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.