Skip to main content

ObjectStore MCP

Multi-Backend Object Storage | MCP Server

PyPI - Version MCP Server PyPI - License

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.1

Documentation — Installation, deployment, and usage across the API, CLI, and MCP interfaces are maintained in docs/.

Table of Contents

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 same ObjectStoreBackend protocol, validated by a single conformance test suite that runs for real against the filesystem backend.

  • Three consolidated, action-routed MCP tools (objectstore-mcp console script):

    Tool Actions Description
    objects list (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_set Single-object lifecycle and listing on any store
    buckets list, create, delete (empty-only, opt-in), exists, info, stores Bucket/container admin and store registry introspection
    transfer upload, 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_STORES JSON maps store names to {backend, bucket?, endpoint?, profile?, ...}; every tool takes an optional store argument. A zero-infra local filesystem 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 :mcp tag is the MCP-serving image (built from docker/Dockerfile --target mcp, installing objectstore-mcp[mcp]). The default which also bundles the Pydantic AI agent and the epistemic-graph engine — use it when the operator run objectstore-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 use objectstore-mcp[mcp] to add FastMCP / FastAPI through agent-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_HOSTS in AgentConfig.

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.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for objectstore-mcp 2.3.1
File Size Uploaded Provenance
objectstore_mcp-2.3.1.tar.gz 65.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for objectstore-mcp 2.3.1
File Interpreter ABI Platform
objectstore_mcp-2.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 130.4 kB

Release files / objectstore_mcp-2.3.1.tar.gz

Download URL objectstore_mcp-2.3.1.tar.gz
Size 65.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5bd427a3d8bdddb762cbddf3042f74a13c4ead7d68fdfd7b605a474660a78d98
BLAKE2b-256 checksum
How to use checksums
42d1c15cd597ff9d42743d86a67be0c5edb33c1719cbc0b03106e6778d2f6488
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / objectstore_mcp-2.3.1-py3-none-any.whl

Download URL objectstore_mcp-2.3.1-py3-none-any.whl
Size 64.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3661932bf52cc9d1604712b22742871fe4dfe3e8390e69831b70d033f78af414
BLAKE2b-256 checksum
How to use checksums
fc084cf5526304da66918f368d1a74e7b97b61f56104b74f34c31e78aaf3515e
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.1

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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page