objectstore-mcp 2.3.4__tar.gz → 2.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {objectstore_mcp-2.3.4/objectstore_mcp.egg-info → objectstore_mcp-2.3.6}/PKG-INFO +4 -8
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/README.md +0 -2
- objectstore_mcp-2.3.6/objectstore_mcp/__init__.py +20 -0
- objectstore_mcp-2.3.6/objectstore_mcp/__main__.py +4 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api_client.py +0 -2
- objectstore_mcp-2.3.6/objectstore_mcp/connector_sources.py +80 -0
- objectstore_mcp-2.3.6/objectstore_mcp/mcp_server.py +6 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/certification.json +4 -4
- objectstore_mcp-2.3.6/objectstore_mcp/skills/objectstore-mcp-development/SKILL.md +85 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6/objectstore_mcp.egg-info}/PKG-INFO +4 -8
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp.egg-info/SOURCES.txt +3 -8
- objectstore_mcp-2.3.6/objectstore_mcp.egg-info/entry_points.txt +5 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp.egg-info/requires.txt +2 -5
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/pyproject.toml +12 -14
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_optional_dependencies.py +0 -8
- objectstore_mcp-2.3.6/tests/test_publication_workflow.py +113 -0
- objectstore_mcp-2.3.4/MANIFEST.in +0 -4
- objectstore_mcp-2.3.4/objectstore_mcp/__init__.py +0 -59
- objectstore_mcp-2.3.4/objectstore_mcp/__main__.py +0 -4
- objectstore_mcp-2.3.4/objectstore_mcp/connector_sources.py +0 -117
- objectstore_mcp-2.3.4/objectstore_mcp/connectors/__init__.py +0 -0
- objectstore_mcp-2.3.4/objectstore_mcp/mcp_server.py +0 -67
- objectstore_mcp-2.3.4/objectstore_mcp/prompts/__init__.py +0 -0
- objectstore_mcp-2.3.4/objectstore_mcp/skills/__init__.py +0 -0
- objectstore_mcp-2.3.4/objectstore_mcp.egg-info/entry_points.txt +0 -11
- objectstore_mcp-2.3.4/requirements.txt +0 -2
- objectstore_mcp-2.3.4/tests/test_default_content_surfaces.py +0 -43
- objectstore_mcp-2.3.4/tests/test_startup.py +0 -20
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/LICENSE +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/__init__.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_azure_blob.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_base.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_filesystem.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_gcs.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_s3.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/auth.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/config.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/kg_ingest.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/mcp/__init__.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/mcp/mcp_objectstore.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/mcp_config.json +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/objectstore_input_models.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/objectstore_response_models.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/__init__.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/fixtures/records.json +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/mappings/source.yaml +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/migrations/manifest.json +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/objectstore.ttl +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/shapes/connector.shacl.ttl +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-bucket-administration/SKILL.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-bucket-administration/WORKFLOW.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-data-transfer/SKILL.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-data-transfer/WORKFLOW.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-mcp-operations/SKILL.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-mcp-operations/agents/openai.yaml +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-mcp-operations/references/catalog.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-object-operations/SKILL.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/skills/objectstore-object-operations/WORKFLOW.md +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp.egg-info/dependency_links.txt +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp.egg-info/top_level.txt +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/setup.cfg +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_api_wrapper.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_auth.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_azure_backend.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_backend_conformance.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_config.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_gcs_backend.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_identity_context_scoping.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_init_dynamics.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_kg_ingest.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_objectstore_mcp_validation.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_s3_backend.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_s3_moto.py +0 -0
- {objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/tests/test_safety.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: objectstore-mcp
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.6
|
|
4
4
|
Summary: Object storage (S3/MinIO/R2, Google Cloud Storage, Azure Blob, local filesystem) API + MCP Server for Agentic AI!
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 4 - Beta
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -12,10 +12,8 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: >=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<0.6.0,>=0.5.4
|
|
16
16
|
Requires-Dist: python-dotenv>=1.2.4
|
|
17
|
-
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.1; extra == "mcp"
|
|
19
17
|
Provides-Extra: s3
|
|
20
18
|
Requires-Dist: boto3>=1.43.114; extra == "s3"
|
|
21
19
|
Provides-Extra: gcs
|
|
@@ -23,7 +21,7 @@ Requires-Dist: google-cloud-storage>=3.17.1; extra == "gcs"
|
|
|
23
21
|
Provides-Extra: azure
|
|
24
22
|
Requires-Dist: azure-storage-blob>=12.31.0; extra == "azure"
|
|
25
23
|
Provides-Extra: all
|
|
26
|
-
Requires-Dist: objectstore-mcp[azure,gcs,
|
|
24
|
+
Requires-Dist: objectstore-mcp[azure,gcs,s3]>=1.0.1; extra == "all"
|
|
27
25
|
Provides-Extra: test
|
|
28
26
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
29
27
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -43,8 +41,6 @@ The object-storage connector for the agent-connector-sdk fleet: **one MCP tool
|
|
|
43
41
|
surface over S3 and S3-compatible stores (MinIO, Cloudflare R2), Google Cloud
|
|
44
42
|
Storage, Azure Blob Storage, and a zero-infra local-filesystem backend**.
|
|
45
43
|
|
|
46
|
-
*Version: 2.3.4*
|
|
47
|
-
|
|
48
44
|
> **Documentation** — Installation, deployment, and usage across the API, CLI, and
|
|
49
45
|
> MCP interfaces are maintained in [`docs/`](docs/index.md).
|
|
50
46
|
|
|
@@ -9,8 +9,6 @@ The object-storage connector for the agent-connector-sdk fleet: **one MCP tool
|
|
|
9
9
|
surface over S3 and S3-compatible stores (MinIO, Cloudflare R2), Google Cloud
|
|
10
10
|
Storage, Azure Blob Storage, and a zero-infra local-filesystem backend**.
|
|
11
11
|
|
|
12
|
-
*Version: 2.3.4*
|
|
13
|
-
|
|
14
12
|
> **Documentation** — Installation, deployment, and usage across the API, CLI, and
|
|
15
13
|
> MCP interfaces are maintained in [`docs/`](docs/index.md).
|
|
16
14
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""objectstore-mcp — multi-backend object-storage API + MCP Server + A2A Agent.
|
|
2
|
+
|
|
3
|
+
One MCP tool surface (objects/buckets/transfer) over S3 and S3-compatible
|
|
4
|
+
stores (MinIO, Cloudflare R2), Google Cloud Storage, Azure Blob Storage, and
|
|
5
|
+
a zero-infra local-filesystem backend (CONCEPT:OB-OS.governance.every-provider-implements-same).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from agent_connector_sdk.connector import Connector
|
|
9
|
+
|
|
10
|
+
from objectstore_mcp.api import ObjectStoreBackend
|
|
11
|
+
from objectstore_mcp.auth import get_client
|
|
12
|
+
|
|
13
|
+
connector = Connector(
|
|
14
|
+
api=ObjectStoreBackend,
|
|
15
|
+
get_client=get_client,
|
|
16
|
+
tools="objectstore_mcp.mcp_server",
|
|
17
|
+
instructions="Object-storage MCP server - one tool surface over S3 and S3-compatible stores (MinIO/R2), Google Cloud Storage, Azure Blob, and a zero-infra local-filesystem backend. Tools: 'objects' (list/head/get/put/copy/move/delete/presign/metadata), 'buckets' (list/create/delete/exists/info/stores), 'transfer' (upload/download, single or by prefix). Named stores come from OBJECTSTORE_STORES; the 'local' filesystem store always exists.",
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = ["connector"]
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
|
|
2
|
+
|
|
3
|
+
Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ruff: noqa: E501
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agent_connector_sdk.ingest.live_declaration import source_meta
|
|
12
|
+
|
|
13
|
+
SOURCES: tuple[Any, ...] = (
|
|
14
|
+
source_meta(
|
|
15
|
+
tool="objectstore_list_objects",
|
|
16
|
+
source_id="objectstore-objects",
|
|
17
|
+
record_type="Object",
|
|
18
|
+
id_field="key",
|
|
19
|
+
cursor_field="last_modified",
|
|
20
|
+
preset={
|
|
21
|
+
"doc_type": "objectstore_object",
|
|
22
|
+
"params": {
|
|
23
|
+
"action": "list",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
records_path="objects",
|
|
27
|
+
server="objectstore-mcp",
|
|
28
|
+
text_field="content_type",
|
|
29
|
+
title_field="key",
|
|
30
|
+
),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
SCHEMA_VERSION = 2
|
|
34
|
+
|
|
35
|
+
FIELD_SETS: dict[str, dict[str, str]] = {
|
|
36
|
+
"fields_1": {
|
|
37
|
+
"backendType": "xsd:string",
|
|
38
|
+
"byteSize": "xsd:integer",
|
|
39
|
+
"contentType": "xsd:string",
|
|
40
|
+
"endpoint": "xsd:string",
|
|
41
|
+
"etag": "xsd:string",
|
|
42
|
+
"lastModified": "xsd:string",
|
|
43
|
+
"location": "xsd:string",
|
|
44
|
+
"objectKey": "xsd:string",
|
|
45
|
+
"storageClass": "xsd:string",
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
SCHEMA_MAPPINGS: dict[str, Any] = {
|
|
50
|
+
"Bucket": {
|
|
51
|
+
"field_sets": ["fields_1"],
|
|
52
|
+
"ontology_class": None,
|
|
53
|
+
},
|
|
54
|
+
"Object": {
|
|
55
|
+
"field_sets": ["fields_1"],
|
|
56
|
+
"ontology_class": None,
|
|
57
|
+
},
|
|
58
|
+
"ObjectStore": {
|
|
59
|
+
"field_sets": ["fields_1"],
|
|
60
|
+
"ontology_class": None,
|
|
61
|
+
},
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
RESOURCES: tuple[dict[str, str], ...] = (
|
|
65
|
+
{
|
|
66
|
+
"id_prefix": "bucket",
|
|
67
|
+
"label": "Bucket",
|
|
68
|
+
"name": "Bucket",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id_prefix": "object",
|
|
72
|
+
"label": "Object",
|
|
73
|
+
"name": "Object",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id_prefix": "objectstore",
|
|
77
|
+
"label": "Object Store",
|
|
78
|
+
"name": "ObjectStore",
|
|
79
|
+
},
|
|
80
|
+
)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Main FastMCP server and tool registration for objectstore-mcp."""
|
|
2
|
+
|
|
3
|
+
from objectstore_mcp.mcp.mcp_objectstore import register_objectstore_tools # noqa: F401
|
|
4
|
+
|
|
5
|
+
# SDK discovery registers the register_<tag>_tools functions bound in this module.
|
|
6
|
+
__all__ = ["register_objectstore_tools"]
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"api_version": "
|
|
2
|
+
"api_version": "graphos.io/v1",
|
|
3
3
|
"artifacts": {
|
|
4
4
|
"objectstore_mcp/ontology/fixtures/records.json": "69317390a26787a4f4ad96fc0113346ddacd85ec74b80b307ae903fc985badb1",
|
|
5
5
|
"objectstore_mcp/ontology/mappings/source.yaml": "5ad0b30b461534c509ba23a18b8e5a5b49de22891d6bd9e30df7b6d46c0e26cf",
|
|
6
6
|
"objectstore_mcp/ontology/migrations/manifest.json": "2a2f97d2d28fcf0de059d5dafd9f1edf161d38517b7fccb6ed73b6dd80656067",
|
|
7
|
-
"objectstore_mcp/ontology/objectstore.ttl": "
|
|
7
|
+
"objectstore_mcp/ontology/objectstore.ttl": "09d40f5c0ec9b147ebe39bb47ee39ba00ce95ee4331efad4d1ae231eaac9114d",
|
|
8
8
|
"objectstore_mcp/ontology/shapes/connector.shacl.ttl": "e401a2edfa516528cf428806d8ba2279162ed700f6627511f63349c1e9e7b53b"
|
|
9
9
|
},
|
|
10
10
|
"checks": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"synthetic_fixture_contract": "passed"
|
|
16
16
|
},
|
|
17
17
|
"compatibility": {
|
|
18
|
-
"
|
|
18
|
+
"agent_utilities": ">=2.5.0,<3",
|
|
19
19
|
"bundle_schema": "2",
|
|
20
20
|
"epistemic_graph": ">=2.27.0,<3"
|
|
21
21
|
},
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"signer": "UNSIGNED-PREVIEW",
|
|
30
30
|
"signing_public_key": "",
|
|
31
31
|
"status": "source-validated",
|
|
32
|
-
"validated_at": "2026-
|
|
32
|
+
"validated_at": "2026-10-26T21:58:59Z"
|
|
33
33
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: objectstore-mcp-development
|
|
3
|
+
skill_type: skill
|
|
4
|
+
domain: development
|
|
5
|
+
description: >-
|
|
6
|
+
Develop, test, gate, and release the objectstore-mcp connector. Use this skill
|
|
7
|
+
when changing object-storage backends, action-routed MCP tools, connector
|
|
8
|
+
content, packaging, documentation, or repository gates.
|
|
9
|
+
license: MIT
|
|
10
|
+
tags: [objectstore, development, connector, test, gates]
|
|
11
|
+
tier: repository
|
|
12
|
+
metadata:
|
|
13
|
+
author: Genius
|
|
14
|
+
version: '0.1.0'
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# objectstore-mcp development
|
|
18
|
+
|
|
19
|
+
This repository owns the object-storage backends, safety-governed action-routed
|
|
20
|
+
MCP tools, connector content, and source declarations for S3-compatible stores,
|
|
21
|
+
GCS, Azure Blob, and the local filesystem backend. Shared MCP contracts,
|
|
22
|
+
transports, and source-ingest clients belong to `agent-connector-sdk`;
|
|
23
|
+
admission, serving, and durable graph state belong to their owning repositories.
|
|
24
|
+
Read `AGENTS.md` before changing code. Keep credentials, customer objects,
|
|
25
|
+
private endpoints, bucket names, and raw object data out of source, logs,
|
|
26
|
+
fixtures, and packaged skill content.
|
|
27
|
+
|
|
28
|
+
## Rapid delivery: the 5-minute contract
|
|
29
|
+
|
|
30
|
+
Specs are already designed. Deliver small, reviewable slices and cite the
|
|
31
|
+
owning spec row in the commit trailer.
|
|
32
|
+
|
|
33
|
+
- Find the owning row first with `git grep -n "<term>" -- specs`; extend the
|
|
34
|
+
existing spec before adding requirement text.
|
|
35
|
+
- Reuse the SDK `Connector`, the existing backend protocol, and the action-routed
|
|
36
|
+
`objects`, `buckets`, and `transfer` tools. Do not create a second connector
|
|
37
|
+
entry point, transport, graph-write path, or parallel safety policy.
|
|
38
|
+
- Keep provider SDK imports lazy and preserve the `ObjectStoreBackend` conformance
|
|
39
|
+
contract. Safety caps, delete guards, and dry-run behavior remain in
|
|
40
|
+
`objectstore_mcp/mcp/mcp_objectstore.py`, not in provider adapters.
|
|
41
|
+
- Bind delivered behavior to a focused test. Generated `specs/*/status.json`
|
|
42
|
+
files come from the shared hooks; never hand-edit them.
|
|
43
|
+
- Keep `skills/**`, `ontology/**`, `connectors/**`, prompts, and manifest content
|
|
44
|
+
in the package-data contract. Put `Spec: <ID>` and the assisting-agent trailer
|
|
45
|
+
on consecutive final commit message lines.
|
|
46
|
+
|
|
47
|
+
## Setup and gates
|
|
48
|
+
|
|
49
|
+
Use the pinned environment and shared gates from the checkout root:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
uv sync --locked
|
|
53
|
+
uvx pre-commit run --all-files
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
For focused feedback, use the tests that exercise the actual connector paths:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
uv run --locked --extra test pytest tests/test_publication_workflow.py -q
|
|
60
|
+
uv run --locked --extra test pytest tests/test_objectstore_mcp_validation.py tests/test_backend_conformance.py -q
|
|
61
|
+
uv run --locked --extra test pytest tests/test_auth.py tests/test_api_wrapper.py tests/test_safety.py -q
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Tests use the filesystem backend and temporary directories. Do not call a live
|
|
65
|
+
cloud provider or require credentials in local gates. `OBJECTSTORE_STORES`,
|
|
66
|
+
`OBJECTSTORE_DEFAULT_STORE`, `OBJECTSTORE_FS_ROOT`, and the provider SDK
|
|
67
|
+
credential chains are runtime inputs. Preserve the condensed/verbose SDK tool
|
|
68
|
+
modes, TLS and auth delegation, explicit bucket/delete checks, size/key caps,
|
|
69
|
+
and ontology/source mappings when changing backend or tool modules.
|
|
70
|
+
|
|
71
|
+
## Packaging and publication
|
|
72
|
+
|
|
73
|
+
Build with `uv build` and inspect the wheel and sdist for
|
|
74
|
+
`objectstore_mcp/skills/objectstore-mcp-development/SKILL.md`. Keep the project
|
|
75
|
+
version and `uv.lock` aligned for a genuine content release. The canonical Pages
|
|
76
|
+
publisher is `.github/workflows/pages.yml`, which calls the shared pipelines
|
|
77
|
+
workflow with `.config/spec-dashboard.json`; keep its `workflow_dispatch` path
|
|
78
|
+
and do not add another documentation publisher. The generated dashboard reads
|
|
79
|
+
`specs/*/status.json` and is published at `spec-delivery/`.
|
|
80
|
+
|
|
81
|
+
Before pushing, work in a real Git worktree based on `origin/main`, inspect the
|
|
82
|
+
complete diff, stage only reviewed paths, and verify `git status --short` after
|
|
83
|
+
each gate. Do not use `git stash`, `git add -A`, `git add .`, or force-push. Do
|
|
84
|
+
not claim Pages publication until a successful exact-source workflow run and the
|
|
85
|
+
public dashboard are both observed.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: objectstore-mcp
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.6
|
|
4
4
|
Summary: Object storage (S3/MinIO/R2, Google Cloud Storage, Azure Blob, local filesystem) API + MCP Server for Agentic AI!
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 4 - Beta
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -12,10 +12,8 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: >=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<0.6.0,>=0.5.4
|
|
16
16
|
Requires-Dist: python-dotenv>=1.2.4
|
|
17
|
-
Provides-Extra: mcp
|
|
18
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.1; extra == "mcp"
|
|
19
17
|
Provides-Extra: s3
|
|
20
18
|
Requires-Dist: boto3>=1.43.114; extra == "s3"
|
|
21
19
|
Provides-Extra: gcs
|
|
@@ -23,7 +21,7 @@ Requires-Dist: google-cloud-storage>=3.17.1; extra == "gcs"
|
|
|
23
21
|
Provides-Extra: azure
|
|
24
22
|
Requires-Dist: azure-storage-blob>=12.31.0; extra == "azure"
|
|
25
23
|
Provides-Extra: all
|
|
26
|
-
Requires-Dist: objectstore-mcp[azure,gcs,
|
|
24
|
+
Requires-Dist: objectstore-mcp[azure,gcs,s3]>=1.0.1; extra == "all"
|
|
27
25
|
Provides-Extra: test
|
|
28
26
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
29
27
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -43,8 +41,6 @@ The object-storage connector for the agent-connector-sdk fleet: **one MCP tool
|
|
|
43
41
|
surface over S3 and S3-compatible stores (MinIO, Cloudflare R2), Google Cloud
|
|
44
42
|
Storage, Azure Blob Storage, and a zero-infra local-filesystem backend**.
|
|
45
43
|
|
|
46
|
-
*Version: 2.3.4*
|
|
47
|
-
|
|
48
44
|
> **Documentation** — Installation, deployment, and usage across the API, CLI, and
|
|
49
45
|
> MCP interfaces are maintained in [`docs/`](docs/index.md).
|
|
50
46
|
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
LICENSE
|
|
2
|
-
MANIFEST.in
|
|
3
2
|
README.md
|
|
4
3
|
pyproject.toml
|
|
5
|
-
requirements.txt
|
|
6
4
|
objectstore_mcp/__init__.py
|
|
7
5
|
objectstore_mcp/__main__.py
|
|
8
6
|
objectstore_mcp/api_client.py
|
|
@@ -26,7 +24,6 @@ objectstore_mcp/api/api_client_base.py
|
|
|
26
24
|
objectstore_mcp/api/api_client_filesystem.py
|
|
27
25
|
objectstore_mcp/api/api_client_gcs.py
|
|
28
26
|
objectstore_mcp/api/api_client_s3.py
|
|
29
|
-
objectstore_mcp/connectors/__init__.py
|
|
30
27
|
objectstore_mcp/mcp/__init__.py
|
|
31
28
|
objectstore_mcp/mcp/mcp_objectstore.py
|
|
32
29
|
objectstore_mcp/ontology/__init__.py
|
|
@@ -36,12 +33,11 @@ objectstore_mcp/ontology/fixtures/records.json
|
|
|
36
33
|
objectstore_mcp/ontology/mappings/source.yaml
|
|
37
34
|
objectstore_mcp/ontology/migrations/manifest.json
|
|
38
35
|
objectstore_mcp/ontology/shapes/connector.shacl.ttl
|
|
39
|
-
objectstore_mcp/prompts/__init__.py
|
|
40
|
-
objectstore_mcp/skills/__init__.py
|
|
41
36
|
objectstore_mcp/skills/objectstore-bucket-administration/SKILL.md
|
|
42
37
|
objectstore_mcp/skills/objectstore-bucket-administration/WORKFLOW.md
|
|
43
38
|
objectstore_mcp/skills/objectstore-data-transfer/SKILL.md
|
|
44
39
|
objectstore_mcp/skills/objectstore-data-transfer/WORKFLOW.md
|
|
40
|
+
objectstore_mcp/skills/objectstore-mcp-development/SKILL.md
|
|
45
41
|
objectstore_mcp/skills/objectstore-mcp-operations/SKILL.md
|
|
46
42
|
objectstore_mcp/skills/objectstore-mcp-operations/agents/openai.yaml
|
|
47
43
|
objectstore_mcp/skills/objectstore-mcp-operations/references/catalog.md
|
|
@@ -52,14 +48,13 @@ tests/test_auth.py
|
|
|
52
48
|
tests/test_azure_backend.py
|
|
53
49
|
tests/test_backend_conformance.py
|
|
54
50
|
tests/test_config.py
|
|
55
|
-
tests/test_default_content_surfaces.py
|
|
56
51
|
tests/test_gcs_backend.py
|
|
57
52
|
tests/test_identity_context_scoping.py
|
|
58
53
|
tests/test_init_dynamics.py
|
|
59
54
|
tests/test_kg_ingest.py
|
|
60
55
|
tests/test_objectstore_mcp_validation.py
|
|
61
56
|
tests/test_optional_dependencies.py
|
|
57
|
+
tests/test_publication_workflow.py
|
|
62
58
|
tests/test_s3_backend.py
|
|
63
59
|
tests/test_s3_moto.py
|
|
64
|
-
tests/test_safety.py
|
|
65
|
-
tests/test_startup.py
|
|
60
|
+
tests/test_safety.py
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
agent-connector-sdk[mcp]<
|
|
1
|
+
agent-connector-sdk[mcp]<0.6.0,>=0.5.4
|
|
2
2
|
python-dotenv>=1.2.4
|
|
3
3
|
|
|
4
4
|
[all]
|
|
5
|
-
objectstore-mcp[azure,gcs,
|
|
5
|
+
objectstore-mcp[azure,gcs,s3]>=1.0.1
|
|
6
6
|
|
|
7
7
|
[azure]
|
|
8
8
|
azure-storage-blob>=12.31.0
|
|
@@ -10,9 +10,6 @@ azure-storage-blob>=12.31.0
|
|
|
10
10
|
[gcs]
|
|
11
11
|
google-cloud-storage>=3.17.1
|
|
12
12
|
|
|
13
|
-
[mcp]
|
|
14
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.4.1
|
|
15
|
-
|
|
16
13
|
[s3]
|
|
17
14
|
boto3>=1.43.114
|
|
18
15
|
|
|
@@ -4,21 +4,20 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "objectstore-mcp"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.6"
|
|
8
8
|
description = "Object storage (S3/MinIO/R2, Google Cloud Storage, Azure Blob, local filesystem) API + MCP Server for Agentic AI!"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
|
|
11
11
|
requires-python = ">=3.12"
|
|
12
|
-
dependencies = [ "agent-connector-sdk[mcp]>=0.4
|
|
12
|
+
dependencies = [ "agent-connector-sdk[mcp]>=0.5.4,<0.6.0", "python-dotenv>=1.2.4",]
|
|
13
13
|
[[project.authors]]
|
|
14
|
-
name = "
|
|
15
|
-
email = "maintainers@
|
|
14
|
+
name = "Repository Maintainers"
|
|
15
|
+
email = "maintainers@knuckles.team"
|
|
16
16
|
|
|
17
17
|
[project.license]
|
|
18
18
|
text = "MIT"
|
|
19
19
|
|
|
20
20
|
[project.optional-dependencies]
|
|
21
|
-
mcp = [ "agent-connector-sdk[mcp]>=0.4.1,<1.0.0",]
|
|
22
21
|
s3 = [
|
|
23
22
|
# CONCEPT:PHASE2-RECONCILE — relaxed off the modernize-bump's 1.43.52
|
|
24
23
|
# floor: lighteval (pulled in via data-science-mcp[eval]) transitively
|
|
@@ -28,21 +27,15 @@ s3 = [
|
|
|
28
27
|
]
|
|
29
28
|
gcs = [ "google-cloud-storage>=3.17.1",]
|
|
30
29
|
azure = [ "azure-storage-blob>=12.31.0",]
|
|
31
|
-
all = [ "objectstore-mcp[
|
|
30
|
+
all = [ "objectstore-mcp[s3,gcs,azure]>=1.0.1",]
|
|
32
31
|
test = [ "pytest-xdist>=3.8.0", "pytest>=9.1.1", "pytest-asyncio>=1.4.0", "pytest-cov>=7.1.0", "moto[s3]>=5.2.4",]
|
|
33
32
|
|
|
34
33
|
[project.scripts]
|
|
35
|
-
objectstore-mcp = "
|
|
36
|
-
|
|
37
|
-
[project.entry-points."agent_connector_sdk.skill_providers"]
|
|
38
|
-
objectstore-mcp = "objectstore_mcp.skills"
|
|
39
|
-
|
|
40
|
-
[project.entry-points."agent_connector_sdk.ontology_providers"]
|
|
41
|
-
objectstore-mcp = "objectstore_mcp.ontology"
|
|
34
|
+
objectstore-mcp = "agent_connector_sdk.cli:serve"
|
|
42
35
|
|
|
43
36
|
# The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
|
|
44
37
|
[project.entry-points."agent_connector_sdk.connector"]
|
|
45
|
-
objectstore-mcp = "objectstore_mcp"
|
|
38
|
+
objectstore-mcp = "objectstore_mcp:connector"
|
|
46
39
|
|
|
47
40
|
[tool.uv.workspace]
|
|
48
41
|
members = ["."]
|
|
@@ -56,6 +49,7 @@ override-dependencies = [
|
|
|
56
49
|
]
|
|
57
50
|
|
|
58
51
|
[tool.ruff]
|
|
52
|
+
extend-exclude = ["tests", "scripts"]
|
|
59
53
|
line-length = 88
|
|
60
54
|
target-version = "py312"
|
|
61
55
|
|
|
@@ -83,3 +77,7 @@ include = [ "objectstore_mcp*",]
|
|
|
83
77
|
|
|
84
78
|
[tool.pipelines_hooks.ste]
|
|
85
79
|
exempt = ["specs/*", "specs/**/*"]
|
|
80
|
+
|
|
81
|
+
[tool.pipelines.container]
|
|
82
|
+
debug_apt = ["default-jre", "ripgrep", "tree", "fd-find", "curl", "nano", "build-essential", "cmake", "libssl-dev", "libcurl4-openssl-dev", "pkg-config", "cargo", "rustc"]
|
|
83
|
+
install_extras = {"mcp" = []}
|
|
@@ -25,14 +25,6 @@ def block_module(monkeypatch):
|
|
|
25
25
|
return _block
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def test_core_package_imports_without_cloud_sdks():
|
|
29
|
-
import objectstore_mcp
|
|
30
|
-
import objectstore_mcp.api
|
|
31
|
-
import objectstore_mcp.mcp.mcp_objectstore # noqa: F401
|
|
32
|
-
|
|
33
|
-
assert objectstore_mcp.__version__
|
|
34
|
-
|
|
35
|
-
|
|
36
28
|
def test_s3_backend_names_its_extra(block_module):
|
|
37
29
|
block_module("boto3")
|
|
38
30
|
from objectstore_mcp.api.api_client_s3 import S3Backend
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Keep shared publication and Pages contracts explicit in this connector."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
import tomllib
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import yaml
|
|
11
|
+
|
|
12
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _workflow(name: str):
|
|
16
|
+
return yaml.safe_load((ROOT / ".github/workflows" / name).read_text())
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _actions_on(workflow: dict):
|
|
20
|
+
# PyYAML's YAML 1.1 reader represents the Actions ``on`` key as True.
|
|
21
|
+
return workflow["on"] if "on" in workflow else workflow[True]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_pages_publishes_spec_dashboard_and_supports_manual_refresh():
|
|
25
|
+
workflow = _workflow("pages.yml")
|
|
26
|
+
publisher = workflow["jobs"]["publish-pages"]
|
|
27
|
+
actions = _actions_on(workflow)
|
|
28
|
+
push = actions["push"]
|
|
29
|
+
|
|
30
|
+
assert publisher["uses"] == (
|
|
31
|
+
"Knuckles-Team/pipelines/.github/workflows/pages_pipeline.yml@main"
|
|
32
|
+
)
|
|
33
|
+
assert publisher["with"] == {
|
|
34
|
+
"content_source": "docs",
|
|
35
|
+
"spec_dashboard_enabled": True,
|
|
36
|
+
"spec_dashboard_config": ".config/spec-dashboard.json",
|
|
37
|
+
}
|
|
38
|
+
assert "workflow_dispatch" in actions
|
|
39
|
+
assert {
|
|
40
|
+
"docs/**",
|
|
41
|
+
"mkdocs.yml",
|
|
42
|
+
"README.md",
|
|
43
|
+
"specs/**",
|
|
44
|
+
".config/spec-dashboard.json",
|
|
45
|
+
".github/workflows/pages.yml",
|
|
46
|
+
} <= set(push["paths"])
|
|
47
|
+
|
|
48
|
+
config = json.loads((ROOT / ".config/spec-dashboard.json").read_text())
|
|
49
|
+
assert config == {
|
|
50
|
+
"version": 1,
|
|
51
|
+
"sources": [{"glob": "specs/*/status.json", "kind": "spec"}],
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_legacy_docs_publisher_is_removed_and_release_flags_remain_canonical():
|
|
56
|
+
assert not (ROOT / ".github/workflows/docs.yml").exists()
|
|
57
|
+
jobs = _workflow("pipeline.yml")["jobs"]
|
|
58
|
+
pypi = jobs["publish-pypi"]
|
|
59
|
+
docker = jobs["publish-docker"]
|
|
60
|
+
assert pypi["uses"] == (
|
|
61
|
+
"Knuckles-Team/pipelines/.github/workflows/python_pipeline.yml@main"
|
|
62
|
+
)
|
|
63
|
+
assert pypi["with"] == {"connector": True}
|
|
64
|
+
assert docker["uses"] == (
|
|
65
|
+
"Knuckles-Team/pipelines/.github/workflows/container_pipeline.yml@main"
|
|
66
|
+
)
|
|
67
|
+
assert docker["with"] == {"render_connector": True}
|
|
68
|
+
assert docker["needs"] == "publish-pypi"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_development_skill_has_real_delivery_contract_and_actual_tests():
|
|
72
|
+
skill = ROOT / "objectstore_mcp/skills/objectstore-mcp-development/SKILL.md"
|
|
73
|
+
content = skill.read_text()
|
|
74
|
+
|
|
75
|
+
assert "name: objectstore-mcp-development" in content
|
|
76
|
+
assert "## Rapid delivery: the 5-minute contract" in content
|
|
77
|
+
for test_path in (
|
|
78
|
+
"tests/test_publication_workflow.py",
|
|
79
|
+
"tests/test_objectstore_mcp_validation.py",
|
|
80
|
+
"tests/test_backend_conformance.py",
|
|
81
|
+
"tests/test_auth.py",
|
|
82
|
+
"tests/test_api_wrapper.py",
|
|
83
|
+
"tests/test_safety.py",
|
|
84
|
+
):
|
|
85
|
+
assert test_path in content
|
|
86
|
+
assert (ROOT / test_path).exists()
|
|
87
|
+
for runtime_name in (
|
|
88
|
+
"OBJECTSTORE_STORES",
|
|
89
|
+
"OBJECTSTORE_DEFAULT_STORE",
|
|
90
|
+
"OBJECTSTORE_FS_ROOT",
|
|
91
|
+
"ObjectStoreBackend",
|
|
92
|
+
"agent-connector-sdk",
|
|
93
|
+
"condensed/verbose",
|
|
94
|
+
):
|
|
95
|
+
assert runtime_name in content
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_packaged_skill_and_version_lock_are_coherent():
|
|
99
|
+
project = tomllib.loads((ROOT / "pyproject.toml").read_text())["project"]
|
|
100
|
+
version = project["version"]
|
|
101
|
+
lock = (ROOT / "uv.lock").read_text()
|
|
102
|
+
assert re.search(
|
|
103
|
+
rf'^name = "objectstore-mcp"\nversion = "{re.escape(version)}"$',
|
|
104
|
+
lock,
|
|
105
|
+
re.MULTILINE,
|
|
106
|
+
)
|
|
107
|
+
package_data = tomllib.loads((ROOT / "pyproject.toml").read_text())["tool"][
|
|
108
|
+
"setuptools"
|
|
109
|
+
]["package-data"]
|
|
110
|
+
assert "skills/**" in package_data["objectstore_mcp"]
|
|
111
|
+
assert (
|
|
112
|
+
ROOT / "objectstore_mcp/skills/objectstore-mcp-development/SKILL.md"
|
|
113
|
+
).is_file()
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"""objectstore-mcp — multi-backend object-storage API + MCP Server + A2A Agent.
|
|
2
|
-
|
|
3
|
-
One MCP tool surface (objects/buckets/transfer) over S3 and S3-compatible
|
|
4
|
-
stores (MinIO, Cloudflare R2), Google Cloud Storage, Azure Blob Storage, and
|
|
5
|
-
a zero-infra local-filesystem backend (CONCEPT:OB-OS.governance.every-provider-implements-same).
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import importlib
|
|
9
|
-
import inspect
|
|
10
|
-
from typing import Any
|
|
11
|
-
|
|
12
|
-
__version__ = "2.3.4"
|
|
13
|
-
__all__: list[str] = []
|
|
14
|
-
|
|
15
|
-
CORE_MODULES = ["objectstore_mcp.api_client"]
|
|
16
|
-
OPTIONAL_MODULES = {
|
|
17
|
-
"objectstore_mcp.mcp_server": "mcp",
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def _expose_members(module):
|
|
22
|
-
for name, obj in inspect.getmembers(module):
|
|
23
|
-
if (inspect.isclass(obj) or inspect.isfunction(obj)) and not name.startswith(
|
|
24
|
-
"_"
|
|
25
|
-
):
|
|
26
|
-
globals()[name] = obj
|
|
27
|
-
if name not in __all__:
|
|
28
|
-
__all__.append(name)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
for module_name in CORE_MODULES:
|
|
32
|
-
module = importlib.import_module(module_name)
|
|
33
|
-
_expose_members(module)
|
|
34
|
-
|
|
35
|
-
_loaded_optional_modules: dict = {}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def _import_module_safely(module_name: str):
|
|
39
|
-
try:
|
|
40
|
-
return importlib.import_module(module_name)
|
|
41
|
-
except ImportError:
|
|
42
|
-
return None
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def __getattr__(name: str) -> Any:
|
|
46
|
-
if name == "_MCP_AVAILABLE":
|
|
47
|
-
mcp_key = next((k for k in OPTIONAL_MODULES if "mcp_server" in k), None)
|
|
48
|
-
return _import_module_safely(mcp_key) is not None if mcp_key else False
|
|
49
|
-
|
|
50
|
-
for module_name in OPTIONAL_MODULES:
|
|
51
|
-
if module_name not in _loaded_optional_modules:
|
|
52
|
-
module = _import_module_safely(module_name)
|
|
53
|
-
_loaded_optional_modules[module_name] = module
|
|
54
|
-
if module is not None:
|
|
55
|
-
_expose_members(module)
|
|
56
|
-
module = _loaded_optional_modules[module_name]
|
|
57
|
-
if module is not None and hasattr(module, name):
|
|
58
|
-
return getattr(module, name)
|
|
59
|
-
raise AttributeError(f"module 'objectstore_mcp' has no attribute {name!r}")
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"""Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
|
|
2
|
-
|
|
3
|
-
Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
# ruff: noqa: E501
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
from agent_connector_sdk.ingest.live_declaration import source_meta
|
|
12
|
-
from agent_connector_sdk.ingest.sources import IngestSourceDeclaration, IngestSourceSpec
|
|
13
|
-
|
|
14
|
-
CONNECTOR: str = "objectstore-mcp"
|
|
15
|
-
|
|
16
|
-
SOURCES: tuple[Any, ...] = (
|
|
17
|
-
source_meta(
|
|
18
|
-
tool="objectstore_list_objects",
|
|
19
|
-
source_id="objectstore-objects",
|
|
20
|
-
record_type="Object",
|
|
21
|
-
id_field="key",
|
|
22
|
-
cursor_field="last_modified",
|
|
23
|
-
preset={
|
|
24
|
-
"doc_type": "objectstore_object",
|
|
25
|
-
"params": {
|
|
26
|
-
"action": "list",
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
records_path="objects",
|
|
30
|
-
server="objectstore-mcp",
|
|
31
|
-
text_field="content_type",
|
|
32
|
-
title_field="key",
|
|
33
|
-
),
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
SCHEMA_MAPPINGS: dict[str, Any] = {
|
|
37
|
-
"Bucket": {
|
|
38
|
-
"fields": {
|
|
39
|
-
"backendType": "xsd:string",
|
|
40
|
-
"byteSize": "xsd:integer",
|
|
41
|
-
"contentType": "xsd:string",
|
|
42
|
-
"endpoint": "xsd:string",
|
|
43
|
-
"etag": "xsd:string",
|
|
44
|
-
"lastModified": "xsd:string",
|
|
45
|
-
"location": "xsd:string",
|
|
46
|
-
"objectKey": "xsd:string",
|
|
47
|
-
"storageClass": "xsd:string",
|
|
48
|
-
},
|
|
49
|
-
"ontology_class": None,
|
|
50
|
-
},
|
|
51
|
-
"Object": {
|
|
52
|
-
"fields": {
|
|
53
|
-
"backendType": "xsd:string",
|
|
54
|
-
"byteSize": "xsd:integer",
|
|
55
|
-
"contentType": "xsd:string",
|
|
56
|
-
"endpoint": "xsd:string",
|
|
57
|
-
"etag": "xsd:string",
|
|
58
|
-
"lastModified": "xsd:string",
|
|
59
|
-
"location": "xsd:string",
|
|
60
|
-
"objectKey": "xsd:string",
|
|
61
|
-
"storageClass": "xsd:string",
|
|
62
|
-
},
|
|
63
|
-
"ontology_class": None,
|
|
64
|
-
},
|
|
65
|
-
"ObjectStore": {
|
|
66
|
-
"fields": {
|
|
67
|
-
"backendType": "xsd:string",
|
|
68
|
-
"byteSize": "xsd:integer",
|
|
69
|
-
"contentType": "xsd:string",
|
|
70
|
-
"endpoint": "xsd:string",
|
|
71
|
-
"etag": "xsd:string",
|
|
72
|
-
"lastModified": "xsd:string",
|
|
73
|
-
"location": "xsd:string",
|
|
74
|
-
"objectKey": "xsd:string",
|
|
75
|
-
"storageClass": "xsd:string",
|
|
76
|
-
},
|
|
77
|
-
"ontology_class": None,
|
|
78
|
-
},
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
RESOURCES: tuple[dict[str, str], ...] = (
|
|
82
|
-
{
|
|
83
|
-
"id_prefix": "bucket",
|
|
84
|
-
"label": "Bucket",
|
|
85
|
-
"name": "Bucket",
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"id_prefix": "object",
|
|
89
|
-
"label": "Object",
|
|
90
|
-
"name": "Object",
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"id_prefix": "objectstore",
|
|
94
|
-
"label": "Object Store",
|
|
95
|
-
"name": "ObjectStore",
|
|
96
|
-
},
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def declaration() -> IngestSourceDeclaration:
|
|
101
|
-
"""The declaration the server assembles from this module."""
|
|
102
|
-
specs: list[IngestSourceSpec] = []
|
|
103
|
-
for item in SOURCES:
|
|
104
|
-
for entry in item["connector_sources"]:
|
|
105
|
-
body: dict[str, Any] = {
|
|
106
|
-
k: v for k, v in entry.items() if k not in ("tool", "mapping")
|
|
107
|
-
}
|
|
108
|
-
spec = {**body, "tools": (entry["tool"],)}
|
|
109
|
-
specs.append(IngestSourceSpec.model_validate(spec))
|
|
110
|
-
return IngestSourceDeclaration.model_validate(
|
|
111
|
-
{
|
|
112
|
-
"connector": CONNECTOR,
|
|
113
|
-
"sources": specs,
|
|
114
|
-
"schema_mappings": SCHEMA_MAPPINGS,
|
|
115
|
-
"resources": RESOURCES,
|
|
116
|
-
}
|
|
117
|
-
)
|
|
File without changes
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"""Main FastMCP server and tool registration for objectstore-mcp."""
|
|
2
|
-
|
|
3
|
-
import sys
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from agent_connector_sdk.config import load_config
|
|
7
|
-
from agent_connector_sdk.mcp.server import create_mcp_server
|
|
8
|
-
from agent_connector_sdk.mcp.tool_surface import register_tool_surface
|
|
9
|
-
from fastmcp.utilities.logging import get_logger
|
|
10
|
-
from starlette.requests import Request
|
|
11
|
-
from starlette.responses import JSONResponse
|
|
12
|
-
|
|
13
|
-
from objectstore_mcp.api import ObjectStoreBackend
|
|
14
|
-
from objectstore_mcp.auth import get_client
|
|
15
|
-
from objectstore_mcp.mcp.mcp_objectstore import register_objectstore_tools # noqa: F401
|
|
16
|
-
|
|
17
|
-
__version__ = "2.3.4"
|
|
18
|
-
|
|
19
|
-
logger = get_logger(name="objectstore_mcp")
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def get_mcp_instance() -> tuple[Any, ...]:
|
|
23
|
-
load_config()
|
|
24
|
-
args, mcp, middlewares = create_mcp_server(
|
|
25
|
-
name="ObjectStore MCP",
|
|
26
|
-
version=__version__,
|
|
27
|
-
instructions=(
|
|
28
|
-
"Object-storage MCP server - one tool surface over S3 and "
|
|
29
|
-
"S3-compatible stores (MinIO/R2), Google Cloud Storage, Azure "
|
|
30
|
-
"Blob, and a zero-infra local-filesystem backend. Tools: "
|
|
31
|
-
"'objects' (list/head/get/put/copy/move/delete/presign/metadata), "
|
|
32
|
-
"'buckets' (list/create/delete/exists/info/stores), 'transfer' "
|
|
33
|
-
"(upload/download, single or by prefix). Named stores come from "
|
|
34
|
-
"OBJECTSTORE_STORES; the 'local' filesystem store always exists."
|
|
35
|
-
),
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
@mcp.custom_route("/health", methods=["GET"])
|
|
39
|
-
async def health_check(request: Request) -> JSONResponse:
|
|
40
|
-
return JSONResponse({"status": "OK"})
|
|
41
|
-
|
|
42
|
-
registered_tags = register_tool_surface(
|
|
43
|
-
mcp,
|
|
44
|
-
client_cls=ObjectStoreBackend,
|
|
45
|
-
get_client=get_client,
|
|
46
|
-
service="objectstore-mcp",
|
|
47
|
-
tools_module=sys.modules[__name__],
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
for mw in middlewares:
|
|
51
|
-
mcp.add_middleware(mw)
|
|
52
|
-
return mcp, args, middlewares, registered_tags
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def mcp_server() -> None:
|
|
56
|
-
mcp, args, _middlewares, *_ = get_mcp_instance()
|
|
57
|
-
print(f"ObjectStore MCP v{__version__}", file=sys.stderr)
|
|
58
|
-
if args.transport == "streamable-http":
|
|
59
|
-
mcp.run(transport="streamable-http", host=args.host, port=args.port)
|
|
60
|
-
elif args.transport == "sse":
|
|
61
|
-
mcp.run(transport="sse", host=args.host, port=args.port)
|
|
62
|
-
else:
|
|
63
|
-
mcp.run(transport="stdio")
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if __name__ == "__main__":
|
|
67
|
-
mcp_server()
|
|
File without changes
|
|
File without changes
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
[agent_connector_sdk.connector]
|
|
2
|
-
objectstore-mcp = objectstore_mcp
|
|
3
|
-
|
|
4
|
-
[agent_connector_sdk.ontology_providers]
|
|
5
|
-
objectstore-mcp = objectstore_mcp.ontology
|
|
6
|
-
|
|
7
|
-
[agent_connector_sdk.skill_providers]
|
|
8
|
-
objectstore-mcp = objectstore_mcp.skills
|
|
9
|
-
|
|
10
|
-
[console_scripts]
|
|
11
|
-
objectstore-mcp = objectstore_mcp.mcp_server:mcp_server
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"""CONN-OBJECTSTORE-MCP-CONNECTOR-CONTENT-R001: the server lists its packaged skills, ontology and prompts by default."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import asyncio
|
|
6
|
-
import importlib
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
|
|
9
|
-
import pytest
|
|
10
|
-
from fastmcp import Client
|
|
11
|
-
|
|
12
|
-
PACKAGE = "objectstore_mcp"
|
|
13
|
-
ROOT = Path(list(importlib.import_module(PACKAGE).__path__)[0])
|
|
14
|
-
|
|
15
|
-
pytestmark = pytest.mark.spec("CONN-OBJECTSTORE-MCP-CONNECTOR-CONTENT-R001")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def _server():
|
|
19
|
-
namespace = {"__name__": PACKAGE + ".mcp_server"}
|
|
20
|
-
exec(
|
|
21
|
-
"from agent_connector_sdk.mcp.server import create_mcp_server\n"
|
|
22
|
-
"result = create_mcp_server('objectstore-mcp', version='0', command_args=[])",
|
|
23
|
-
namespace,
|
|
24
|
-
)
|
|
25
|
-
return namespace["result"][1]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
async def _listings():
|
|
29
|
-
async with Client(_server()) as client:
|
|
30
|
-
resources = {str(r.uri) for r in await client.list_resources()}
|
|
31
|
-
prompts = {p.name for p in await client.list_prompts()}
|
|
32
|
-
return resources, prompts
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def test_default_content_surfaces() -> None:
|
|
36
|
-
resources, prompts = asyncio.run(_listings())
|
|
37
|
-
if list(ROOT.glob("skills/*/SKILL.md")):
|
|
38
|
-
assert any(u.startswith("skill://") for u in resources)
|
|
39
|
-
if list(ROOT.glob("ontology/*.ttl")):
|
|
40
|
-
assert any(u.startswith("ontology://objectstore-mcp/") for u in resources)
|
|
41
|
-
for path in ROOT.glob("prompts/*.json"):
|
|
42
|
-
if not path.name.startswith("_"):
|
|
43
|
-
assert path.stem in prompts
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"""Server bootstrap: the FastMCP instance builds and registers the tools."""
|
|
2
|
-
|
|
3
|
-
import sys
|
|
4
|
-
from unittest.mock import patch
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def test_get_mcp_instance_registers_tools(local_store_env):
|
|
8
|
-
with patch.object(sys, "argv", ["objectstore-mcp"]):
|
|
9
|
-
from objectstore_mcp.mcp_server import get_mcp_instance
|
|
10
|
-
|
|
11
|
-
mcp, args, _middlewares, registered_tags = get_mcp_instance()
|
|
12
|
-
assert mcp.name == "ObjectStore MCP"
|
|
13
|
-
assert hasattr(args, "transport")
|
|
14
|
-
assert registered_tags
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def test_console_script_entry_point():
|
|
18
|
-
from objectstore_mcp.mcp_server import mcp_server
|
|
19
|
-
|
|
20
|
-
assert callable(mcp_server)
|
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_azure_blob.py
RENAMED
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/api/api_client_filesystem.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/objectstore_response_models.py
RENAMED
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/fixtures/records.json
RENAMED
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/mappings/source.yaml
RENAMED
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/migrations/manifest.json
RENAMED
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp/ontology/shapes/connector.shacl.ttl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{objectstore_mcp-2.3.4 → objectstore_mcp-2.3.6}/objectstore_mcp.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|