lakekeeper-mcp 0.3.1__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.
Files changed (46) hide show
  1. lakekeeper_mcp-0.3.1/LICENSE +21 -0
  2. lakekeeper_mcp-0.3.1/MANIFEST.in +3 -0
  3. lakekeeper_mcp-0.3.1/PKG-INFO +353 -0
  4. lakekeeper_mcp-0.3.1/README.md +326 -0
  5. lakekeeper_mcp-0.3.1/lakekeeper_mcp/__init__.py +60 -0
  6. lakekeeper_mcp-0.3.1/lakekeeper_mcp/__main__.py +4 -0
  7. lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/__init__.py +1 -0
  8. lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/api_client_base.py +147 -0
  9. lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/api_client_lakekeeper.py +148 -0
  10. lakekeeper_mcp-0.3.1/lakekeeper_mcp/api_client.py +13 -0
  11. lakekeeper_mcp-0.3.1/lakekeeper_mcp/auth.py +189 -0
  12. lakekeeper_mcp-0.3.1/lakekeeper_mcp/connectors/__init__.py +1 -0
  13. lakekeeper_mcp-0.3.1/lakekeeper_mcp/kg_ingest.py +369 -0
  14. lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp/__init__.py +1 -0
  15. lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp/mcp_lakekeeper.py +374 -0
  16. lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp_config.json +1 -0
  17. lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp_server.py +66 -0
  18. lakekeeper_mcp-0.3.1/lakekeeper_mcp/models.py +37 -0
  19. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/__init__.py +7 -0
  20. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/certification.json +34 -0
  21. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/fixtures/records.json +5 -0
  22. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/lakekeeper.ttl +90 -0
  23. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/mappings/source.yaml +9 -0
  24. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/migrations/manifest.json +6 -0
  25. lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/shapes/connector.shacl.ttl +124 -0
  26. lakekeeper_mcp-0.3.1/lakekeeper_mcp/prompts/__init__.py +0 -0
  27. lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/__init__.py +1 -0
  28. lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/lakekeeper-catalog-operations/SKILL.md +78 -0
  29. lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/lakekeeper-kg-ingestion/SKILL.md +60 -0
  30. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/PKG-INFO +353 -0
  31. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/SOURCES.txt +44 -0
  32. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/dependency_links.txt +1 -0
  33. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/entry_points.txt +14 -0
  34. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/requires.txt +14 -0
  35. lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/top_level.txt +9 -0
  36. lakekeeper_mcp-0.3.1/pyproject.toml +75 -0
  37. lakekeeper_mcp-0.3.1/requirements.txt +2 -0
  38. lakekeeper_mcp-0.3.1/scripts/security_sanitizer.py +318 -0
  39. lakekeeper_mcp-0.3.1/scripts/verify_api_integration.py +279 -0
  40. lakekeeper_mcp-0.3.1/setup.cfg +4 -0
  41. lakekeeper_mcp-0.3.1/tests/conftest.py +0 -0
  42. lakekeeper_mcp-0.3.1/tests/test_api_client.py +88 -0
  43. lakekeeper_mcp-0.3.1/tests/test_auth_env.py +114 -0
  44. lakekeeper_mcp-0.3.1/tests/test_kg_ingest.py +94 -0
  45. lakekeeper_mcp-0.3.1/tests/test_ownership.py +53 -0
  46. lakekeeper_mcp-0.3.1/tests/test_startup.py +10 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Knuckles-Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ include README.md
2
+ include requirements.txt
3
+ recursive-include lakekeeper_mcp *.py *.json *.md *.yaml *.yml
@@ -0,0 +1,353 @@
1
+ Metadata-Version: 2.4
2
+ Name: lakekeeper-mcp
3
+ Version: 0.3.1
4
+ Summary: Lakekeeper (Apache Iceberg REST catalog) API + MCP Server for Agentic AI!
5
+ Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
+ License: MIT
7
+ Classifier: Development Status :: 3 - Alpha
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Environment :: Console
10
+ Classifier: Operating System :: POSIX :: Linux
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: >=3.12
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
16
+ Requires-Dist: requests>=2.34.2
17
+ Provides-Extra: mcp
18
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
19
+ Provides-Extra: all
20
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "all"
21
+ Provides-Extra: test
22
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
23
+ Requires-Dist: pytest>=9.1.1; extra == "test"
24
+ Requires-Dist: pytest-asyncio>=1.4.0; extra == "test"
25
+ Requires-Dist: pytest-cov>=7.1.0; extra == "test"
26
+ Dynamic: license-file
27
+
28
+ # Lakekeeper Mcp
29
+ ## CLI or API | MCP
30
+
31
+ ![PyPI - Version](https://img.shields.io/pypi/v/lakekeeper-mcp)
32
+ ![MCP Server](https://badge.mcpx.dev?type=server 'MCP Server')
33
+ ![PyPI - Downloads](https://img.shields.io/pypi/dd/lakekeeper-mcp)
34
+ ![GitHub Repo stars](https://img.shields.io/github/stars/Knuckles-Team/lakekeeper-mcp)
35
+ ![GitHub forks](https://img.shields.io/github/forks/Knuckles-Team/lakekeeper-mcp)
36
+ ![GitHub contributors](https://img.shields.io/github/contributors/Knuckles-Team/lakekeeper-mcp)
37
+ ![PyPI - License](https://img.shields.io/pypi/l/lakekeeper-mcp)
38
+ ![GitHub](https://img.shields.io/github/license/Knuckles-Team/lakekeeper-mcp)
39
+ ![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/lakekeeper-mcp)
40
+ ![GitHub pull requests](https://img.shields.io/github/issues-pr/Knuckles-Team/lakekeeper-mcp)
41
+ ![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed/Knuckles-Team/lakekeeper-mcp)
42
+ ![GitHub issues](https://img.shields.io/github/issues/Knuckles-Team/lakekeeper-mcp)
43
+ ![GitHub top language](https://img.shields.io/github/languages/top/Knuckles-Team/lakekeeper-mcp)
44
+ ![GitHub language count](https://img.shields.io/github/languages/count/Knuckles-Team/lakekeeper-mcp)
45
+ ![GitHub repo size](https://img.shields.io/github/repo-size/Knuckles-Team/lakekeeper-mcp)
46
+ ![GitHub repo file count (file type)](https://img.shields.io/github/directory-file-count/Knuckles-Team/lakekeeper-mcp)
47
+ ![PyPI - Wheel](https://img.shields.io/pypi/wheel/lakekeeper-mcp)
48
+ ![PyPI - Implementation](https://img.shields.io/pypi/implementation/lakekeeper-mcp)
49
+
50
+ *Version: 0.1.0*
51
+
52
+ > **Documentation** — Installation, deployment, and usage across the API, CLI, MCP,
53
+ > [official documentation](https://knuckles-team.github.io/lakekeeper-mcp/).
54
+
55
+ ---
56
+
57
+ ## Table of Contents
58
+ - [Overview](#overview)
59
+ - [Installation](#installation)
60
+ - [Usage](#usage)
61
+ - [Architecture](#architecture)
62
+ - [Environment Variables](#environment-variables)
63
+ - [MCP Tools](#mcp-tools)
64
+ - [Documentation](#documentation)
65
+
66
+ ## Overview
67
+ `lakekeeper-mcp` exposes a standardized interface to a Lakekeeper (Apache Iceberg
68
+ REST catalog) deployment via the Model Context Protocol — namespace/table/
69
+ snapshot/schema-version catalog reads, warehouse admin, table ownership
70
+ classification (engine vs. Lakekeeper-native, per DEC-CA-01/GOC-78), and
71
+ maintenance-request delegation (this package never runs `expire_snapshots`/
72
+ `compact` itself — it names the delegate: Trino or Spark's own MCPs). A
73
+ Wire-First `lakekeeper_ingest_catalog` tool pushes the full catalog into the
74
+ epistemic-graph Knowledge Graph as typed OWL nodes.
75
+
76
+ Lakekeeper is the ONE live, reachable Iceberg-REST catalog on this platform —
77
+ Trino and Spark have both proven real end-to-end reads through it
78
+ (`Iceberg REST → Lakekeeper OAuth2 → SeaweedFS S3`); eg's own Iceberg-REST
79
+ catalog is not yet reachable from other pods.
80
+
81
+ Talks directly to Lakekeeper's REST APIs over `requests` — no `pyiceberg`
82
+ dependency (see [Architecture](#architecture) for why).
83
+
84
+ ## Installation
85
+
86
+ Pick the extra that matches what the operator want to run:
87
+
88
+ | Extra | Installs | Use when |
89
+ |-------|----------|----------|
90
+ | `lakekeeper-mcp[mcp]` | Connector-focused MCP server (`agent-connector-sdk` — FastMCP/FastAPI + `epistemic-graph[full]`) | The operator only run the **MCP server** (smallest install / image) |
91
+ | `lakekeeper-mcp[all]` | Everything (`mcp` + `agent` + `logfire`) | Development / both surfaces |
92
+
93
+ ```bash
94
+ uv pip install "lakekeeper-mcp[mcp]"
95
+ ```
96
+
97
+ ### Container images (`:mcp`)
98
+
99
+ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
100
+
101
+ ```bash
102
+ docker build --target mcp -t lakekeeper-mcp:mcp .
103
+ ```
104
+
105
+ ## Usage
106
+ Run the MCP server directly:
107
+ ```bash
108
+ python -m lakekeeper_mcp
109
+ ```
110
+
111
+ ### MCP Configuration Example (stdio)
112
+
113
+ ```json
114
+ {
115
+ "mcpServers": {
116
+ "lakekeeper-mcp": {
117
+ "command": "uv",
118
+ "args": ["run", "lakekeeper-mcp"],
119
+ "env": {
120
+ "MCP_TOOL_MODE": "intent",
121
+ "LAKEKEEPER_URL": "http://localhost:8181",
122
+ "LAKEKEEPER_WAREHOUSE": "lakehouse",
123
+ "LAKEKEEPERTOOL": "True",
124
+ "LAKEKEEPER_SERVICE_CLIENT_ID": "lakekeeper-service",
125
+ "LAKEKEEPER_SERVICE_CLIENT_SECRET": "",
126
+ "LAKEKEEPER_OAUTH_SCOPE": "lakekeeper",
127
+ "LAKEKEEPER_KEYCLOAK_URL": "http://localhost:8080",
128
+ "LAKEKEEPER_KEYCLOAK_REALM": "homelab"
129
+ }
130
+ }
131
+ }
132
+ }
133
+ ```
134
+
135
+ ## Architecture
136
+
137
+ `api_client.py` wraps `api/api_client_lakekeeper.py`'s `LakekeeperApi`, a thin
138
+ `requests`-based client over `api/api_client_base.py`'s fail-closed HTTP layer
139
+ (a non-JSON `2xx`, or any `>=400`, always raises — never a silent empty
140
+ result). `auth.py` mints and caches short-lived Keycloak client-credentials
141
+ tokens with `scope=lakekeeper` explicit — the shared client convention's
142
+ default (`scope=catalog`) is rejected by Lakekeeper.
143
+
144
+ **Deliberate deviation from a `pyiceberg`-SDK-based client:** `pyiceberg`
145
+ 0.11.1 (latest) still pins `rich<15.0.0,>=10.11.0` in its dependency-free base
146
+ install, conflicting with this workspace's `Rich>=15` lock (a known, tracked
147
+ issue — BUG-223), and this package's brief requires zero new heavy
148
+ dependencies. A catalog CONTROL PLANE wrapper (namespace/table/snapshot/
149
+ warehouse admin) never needs Arrow-native data reads — those happen through
150
+ Trino/Spark's own MCPs — so a thin authenticated REST client (the same shape
151
+ every other fleet package in this repo uses) is the lower-risk,
152
+ template-conformant choice.
153
+
154
+ `mcp/mcp_lakekeeper.py` registers five tool groups (`catalog`, `warehouse`,
155
+ `ownership`, `maintenance`, `events`) via one `register_tool_surface(...)`
156
+ call in `mcp_server.py`, matching the fleet's one-registration-call
157
+ convention. `kg_ingest.py` exposes `ingest_entities`/`ingest_catalog` plus
158
+ record-mapping helpers around the required `native_ingest` (Wire-First)
159
+ authority.
160
+
161
+ ## Environment Variables
162
+
163
+ <!-- ENV-VARS-TABLE:START -->
164
+
165
+ #### Package environment variables
166
+
167
+ | Variable | Example | Description |
168
+ |----------|---------|-------------|
169
+ | `LAKEKEEPER_URL` | `http://localhost:8181` | |
170
+ | `LAKEKEEPER_WAREHOUSE` | `lakehouse` | |
171
+ | `LAKEKEEPER_SERVICE_CLIENT_ID` | `lakekeeper-service` | scope is ALWAYS "lakekeeper" explicitly — the shared client default is "catalog", which Lakekeeper rejects (services/lakekeeper/AGENTS.md). |
172
+ | `LAKEKEEPER_SERVICE_CLIENT_SECRET` | secret-injected | |
173
+ | `LAKEKEEPER_OAUTH_SCOPE` | `lakekeeper` | |
174
+ | `LAKEKEEPER_OAUTH_TOKEN_URL` | secret-injected | full token URL override; takes precedence |
175
+ | `LAKEKEEPER_KEYCLOAK_URL` | `http://localhost:8080` | used to derive the token URL |
176
+ | `LAKEKEEPER_KEYCLOAK_REALM` | `homelab` | |
177
+ | `LAKEKEEPER_TLS_PROFILE` | — | |
178
+ | `LAKEKEEPER_TLS_PROFILE_REF` | — | |
179
+ | `LAKEKEEPERTOOL` | `True` | |
180
+ | `INGESTTOOL` | `True` | |
181
+
182
+ #### Inherited agent-connector-sdk variables (apply to every connector)
183
+
184
+ | Variable | Example | Description |
185
+ |----------|---------|-------------|
186
+ | `TRANSPORT` | `stdio` | MCP transport: `stdio` \| `streamable-http` \| `sse` |
187
+ | `HOST` | `127.0.0.1` | Loopback bind host (set an authenticated ingress explicitly) |
188
+ | `PORT` | `8000` | Bind port (HTTP transports) |
189
+ | `MCP_TOOL_MODE` | `intent` | Tool surface: `intent` \| `condensed` \| `verbose` \| `both` |
190
+ | `MCP_ENABLED_TOOLS` | — | Comma-separated tool allow-list |
191
+ | `MCP_DISABLED_TOOLS` | — | Comma-separated tool deny-list |
192
+ | `MCP_ENABLED_TAGS` | — | Comma-separated tag allow-list |
193
+ | `MCP_DISABLED_TAGS` | — | Comma-separated tag deny-list |
194
+ | `EUNOMIA_TYPE` | `none` | Authorization mode: `none` \| `embedded` \| `remote` |
195
+ | `EUNOMIA_POLICY_FILE` | `mcp_policies.json` | Embedded Eunomia policy file |
196
+ | `EUNOMIA_REMOTE_URL` | — | Remote Eunomia authorization server URL |
197
+ | `ENABLE_OTEL` | `False` | Enable OpenTelemetry export |
198
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | — | OTLP collector endpoint |
199
+ | `MCP_CLIENT_AUTH` | — | Outbound MCP child auth: `oidc-client-credentials` \| `basic` \| `none` |
200
+ | `OIDC_CLIENT_ID` | — | OIDC client id (service-account auth) |
201
+ | `OIDC_CLIENT_SECRET_REF` | `secret://identity/oidc-client-secret` | Runtime secret reference for the OIDC service account |
202
+ | `MCP_BASIC_AUTH_USERNAME` | — | HTTP Basic username (`MCP_CLIENT_AUTH=basic`) |
203
+ | `MCP_BASIC_AUTH_PASSWORD_REF` | `secret://identity/mcp-basic-password` | Runtime secret reference for HTTP Basic auth (`MCP_CLIENT_AUTH=basic`) |
204
+ | `DEBUG` | `False` | Verbose logging |
205
+ | `PYTHONUNBUFFERED` | `1` | Unbuffered stdout (recommended in containers) |
206
+ | `MCP_URL` | `http://localhost:8000/mcp` | URL of the MCP server the agent connects to |
207
+ | `PROVIDER` | `openai` | LLM provider for the agent |
208
+ | `MODEL_ID` | `gpt-4o` | Model id for the agent |
209
+
210
+ _12 package + 24 inherited variable(s). Auto-generated from `.env.example` + the shared agent-connector-sdk set — do not edit._
211
+ <!-- ENV-VARS-TABLE:END -->
212
+
213
+ | Variable | Required | Notes |
214
+ |----------|----------|-------|
215
+ | `LAKEKEEPER_URL` | recommended | Bare Lakekeeper origin (e.g. `http://localhost:8181`) — never including `/catalog`. Defaults to `http://localhost:8181`. |
216
+ | `LAKEKEEPER_WAREHOUSE` | recommended | Default warehouse name; every tool also accepts an explicit `warehouse` param. |
217
+ | `LAKEKEEPER_SERVICE_CLIENT_ID` | ✅ | Keycloak client-credentials client id. Defaults to `lakekeeper-service`. |
218
+ | `LAKEKEEPER_SERVICE_CLIENT_SECRET` | ✅ | Keycloak client-credentials secret. |
219
+ | `LAKEKEEPER_OAUTH_SCOPE` | optional | Defaults to `lakekeeper` — never leave at the shared-client default `catalog`. |
220
+ | `LAKEKEEPER_OAUTH_TOKEN_URL` | optional | Full token URL override; takes precedence over the Keycloak URL/realm derivation. |
221
+ | `LAKEKEEPER_KEYCLOAK_URL` | optional | Defaults to `http://localhost:8080`. |
222
+ | `LAKEKEEPER_KEYCLOAK_REALM` | optional | Defaults to `homelab`. |
223
+ | `LAKEKEEPER_TLS_PROFILE` / `LAKEKEEPER_TLS_PROFILE_REF` | optional | Named outbound TLS trust policy. |
224
+ | `LAKEKEEPERTOOL` | optional | Tool-group toggle (set `False` to disable the catalog/warehouse/ownership/maintenance/events tools). Default `True`. |
225
+ | `INGESTTOOL` | optional | Tool-group toggle for `lakekeeper_ingest_catalog`. Default `True`. |
226
+ | `MCP_TOOL_MODE` | optional | `condensed` \| `verbose` \| `both` \| `intent` (inherited from agent-connector-sdk). |
227
+
228
+ ## MCP Tools
229
+
230
+ | Tool | Group | Purpose |
231
+ |------|-------|---------|
232
+ | `lakekeeper_config` | catalog | Iceberg REST catalog discovery for one warehouse |
233
+ | `lakekeeper_list_namespaces` / `lakekeeper_get_namespace` | catalog | Namespace listing/read |
234
+ | `lakekeeper_list_tables` / `lakekeeper_get_table` | catalog | Table listing/read |
235
+ | `lakekeeper_list_snapshots` | catalog | Snapshot history |
236
+ | `lakekeeper_list_schema_versions` | catalog | Schema-evolution history |
237
+ | `lakekeeper_list_warehouses` / `lakekeeper_get_warehouse` | warehouse | Warehouse admin (Management API) |
238
+ | `lakekeeper_get_ownership` / `lakekeeper_set_engine_owned` | ownership | Read/classify write authority |
239
+ | `lakekeeper_maintenance_status` | maintenance | Read-only snapshot-count/age signal |
240
+ | `lakekeeper_request_expire_snapshots` / `lakekeeper_request_compaction` | maintenance | Name a delegation target; never runs |
241
+ | `lakekeeper_cloudevents_status` / `lakekeeper_cloudevents_subscribe` | events | CloudEvents sink status |
242
+ | `lakekeeper_ingest_catalog` | ingest | Wire-First KG catalog ingest |
243
+
244
+ ## Documentation
245
+ See `docs/` for architecture, configuration, and deployment notes, and
246
+ `AGENTS.md` for domain-specific traps (the `/catalog/v1` root, the
247
+ `scope=lakekeeper` landmine, and the maintenance-delegation boundary).
248
+
249
+ ## Available MCP Tools
250
+
251
+ <!-- MCP-TOOLS-TABLE:START -->
252
+
253
+ #### Condensed action-routed tools (`MCP_TOOL_MODE=condensed`)
254
+
255
+ | MCP Tool | Toggle Env Var | Description |
256
+ |----------|----------------|-------------|
257
+ | `lakekeeper_cloudevents_status` | `LAKEKEEPERTOOL` | Report whether this Lakekeeper deployment has a CloudEvents sink configured. |
258
+ | `lakekeeper_cloudevents_subscribe` | `LAKEKEEPERTOOL` | Named as a placeholder for CloudEvents subscription wiring (GOC-80-W04). |
259
+ | `lakekeeper_config` | `LAKEKEEPERTOOL` | Iceberg REST catalog discovery/config for one warehouse. |
260
+ | `lakekeeper_get_namespace` | `LAKEKEEPERTOOL` | Fetch one namespace's properties. |
261
+ | `lakekeeper_get_ownership` | `LAKEKEEPERTOOL` | Read a table's ownership classification (engine vs. lakekeeper-native). |
262
+ | `lakekeeper_get_table` | `LAKEKEEPERTOOL` | Full table load response (metadata, current schema, snapshots). |
263
+ | `lakekeeper_get_warehouse` | `LAKEKEEPERTOOL` | Fetch one warehouse's full record, including its storage profile. |
264
+ | `lakekeeper_ingest_catalog` | `INGESTTOOL` | Walk one warehouse's catalog and push it into the KG as typed OWL nodes. |
265
+ | `lakekeeper_list_namespaces` | `LAKEKEEPERTOOL` | List namespaces in a warehouse's catalog. |
266
+ | `lakekeeper_list_schema_versions` | `LAKEKEEPERTOOL` | List an Iceberg table's schema-evolution history (schema ids). |
267
+ | `lakekeeper_list_snapshots` | `LAKEKEEPERTOOL` | List an Iceberg table's committed snapshots. |
268
+ | `lakekeeper_list_tables` | `LAKEKEEPERTOOL` | List tables registered under one namespace. |
269
+ | `lakekeeper_list_warehouses` | `LAKEKEEPERTOOL` | List Lakekeeper warehouses (Management API). |
270
+ | `lakekeeper_maintenance_status` | `LAKEKEEPERTOOL` | Report a table's current snapshot count/age as maintenance-relevant signal. |
271
+ | `lakekeeper_request_compaction` | `LAKEKEEPERTOOL` | Return the delegation instructions for compacting a table (never executes). |
272
+ | `lakekeeper_request_expire_snapshots` | `LAKEKEEPERTOOL` | Return the delegation instructions for expiring old snapshots. |
273
+ | `lakekeeper_set_engine_owned` | `LAKEKEEPERTOOL` | Classify a table's write authority — never overwrites an existing |
274
+
275
+ #### Verbose 1:1 API-mapped tools (`MCP_TOOL_MODE=verbose` or `both`)
276
+
277
+ <details>
278
+ <summary>11 per-operation tools — one per public API method (click to expand)</summary>
279
+
280
+ | MCP Tool | Toggle Env Var | Description |
281
+ |----------|----------------|-------------|
282
+ | `lakekeeper_fetch_namespace` | `LAKEKEEPER_APITOOL` | Invoke the fetch_namespace operation. |
283
+ | `lakekeeper_fetch_namespaces` | `LAKEKEEPER_APITOOL` | Invoke the fetch_namespaces operation. |
284
+ | `lakekeeper_fetch_schema_versions` | `LAKEKEEPER_APITOOL` | Invoke the fetch_schema_versions operation. |
285
+ | `lakekeeper_fetch_snapshots` | `LAKEKEEPER_APITOOL` | Snapshot history for one table. |
286
+ | `lakekeeper_fetch_table` | `LAKEKEEPER_APITOOL` | Full table load response, including ``metadata.snapshots`` and |
287
+ | `lakekeeper_fetch_tables` | `LAKEKEEPER_APITOOL` | Invoke the fetch_tables operation. |
288
+ | `lakekeeper_fetch_warehouse` | `LAKEKEEPER_APITOOL` | Invoke the fetch_warehouse operation. |
289
+ | `lakekeeper_fetch_warehouses` | `LAKEKEEPER_APITOOL` | Invoke the fetch_warehouses operation. |
290
+ | `lakekeeper_get_config` | `LAKEKEEPER_APITOOL` | Iceberg REST catalog discovery for one warehouse. |
291
+ | `lakekeeper_get_server_info` | `LAKEKEEPER_APITOOL` | Invoke the get_server_info operation. |
292
+ | `lakekeeper_get_warehouse_storage_profile` | `LAKEKEEPER_APITOOL` | Invoke the get_warehouse_storage_profile operation. |
293
+
294
+ </details>
295
+
296
+ _17 action-routed tool(s) · 11 verbose 1:1 tool(s). Each is enabled unless its `<DOMAIN>TOOL` toggle is set false; `MCP_TOOL_MODE` selects the surface (**`intent` default** — the six verb-tools, granular set loaded on demand · `condensed` action-routed · `verbose` 1:1 · `both`). Auto-generated — do not edit._
297
+ <!-- MCP-TOOLS-TABLE:END -->
298
+
299
+ ---
300
+
301
+ ## Repository Owners
302
+
303
+ <img width="100%" height="180em" src="https://github-readme-stats.vercel.app/api?username=example&show_icons=true&hide_border=true&&count_private=true&include_all_commits=true" />
304
+
305
+ ![GitHub followers](https://img.shields.io/github/followers/example)
306
+ ![GitHub User's stars](https://img.shields.io/github/stars/example)
307
+
308
+ ---
309
+
310
+ ## Contribute
311
+
312
+ Contributions are welcome! Please ensure code quality by running local checks before submitting pull requests:
313
+ - Format code using `ruff format .`
314
+ - Lint code using `ruff check .`
315
+ - Validate type-safety with `mypy .`
316
+ - Run test suites using `pytest`
317
+
318
+ <!-- BEGIN agent-connector-sdk-deployment (generated; do not edit between markers) -->
319
+
320
+ ## Deploy with `agent-connector-sdk-deployment`
321
+
322
+ Provision this package with the consolidated **`agent-connector-sdk-deployment`**
323
+ workflow. It selects an installed-package, editable-source, or immutable-container
324
+ path; records only runtime secret and TLS-profile references in `AgentConfig`; and
325
+ runs doctor, registration, policy, observability, and rollback gates. Ask your agent
326
+ to **"deploy `lakekeeper-mcp` with agent-connector-sdk-deployment"**.
327
+
328
+ | Install mode | Command |
329
+ |------|---------|
330
+ | Installed package | `uv tool install "lakekeeper-mcp[mcp]"`, then run `lakekeeper-mcp` |
331
+ | Immutable container | deploy `registry.example.invalid/lakekeeper-mcp@sha256:<digest>` through the operator-selected orchestrator |
332
+
333
+ The repository embeds no deployment profile, credential value, certificate path, or
334
+ environment-specific endpoint. Supply those at runtime through `AgentConfig` and the
335
+ configured secret provider.
336
+
337
+ <!-- END agent-connector-sdk-deployment -->
338
+
339
+ <!-- GOVERNED-CAPABILITY:START -->
340
+ ## Governed capability contract
341
+
342
+ This package ships a compact canonical skill surface with specialist procedures
343
+ kept as referenced workflows. The current MCP tools, skill metadata,
344
+ `connector_manifest.yml`, ontology, mappings, shapes, fixtures, migrations,
345
+ tool-schema fingerprints, and certification metadata form one versioned
346
+ capability contract. Validate them together; do not rely on stale tool names or
347
+ historical per-task skill wrappers.
348
+
349
+ Runtime endpoints, credentials, certificate trust, tenant identity, retention,
350
+ and observability policy are deployment inputs and are never packaged values.
351
+ See [Configuration, trust, and privacy](docs/configuration.md) before enabling a
352
+ network transport, connector ingestion, Arbora delegation, or trace export.
353
+ <!-- GOVERNED-CAPABILITY:END -->