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.
- lakekeeper_mcp-0.3.1/LICENSE +21 -0
- lakekeeper_mcp-0.3.1/MANIFEST.in +3 -0
- lakekeeper_mcp-0.3.1/PKG-INFO +353 -0
- lakekeeper_mcp-0.3.1/README.md +326 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/__init__.py +60 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/__main__.py +4 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/__init__.py +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/api_client_base.py +147 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/api/api_client_lakekeeper.py +148 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/api_client.py +13 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/auth.py +189 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/connectors/__init__.py +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/kg_ingest.py +369 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp/__init__.py +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp/mcp_lakekeeper.py +374 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp_config.json +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/mcp_server.py +66 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/models.py +37 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/__init__.py +7 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/certification.json +34 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/fixtures/records.json +5 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/lakekeeper.ttl +90 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/mappings/source.yaml +9 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/migrations/manifest.json +6 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/ontology/shapes/connector.shacl.ttl +124 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/prompts/__init__.py +0 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/__init__.py +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/lakekeeper-catalog-operations/SKILL.md +78 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp/skills/lakekeeper-kg-ingestion/SKILL.md +60 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/PKG-INFO +353 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/SOURCES.txt +44 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/dependency_links.txt +1 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/entry_points.txt +14 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/requires.txt +14 -0
- lakekeeper_mcp-0.3.1/lakekeeper_mcp.egg-info/top_level.txt +9 -0
- lakekeeper_mcp-0.3.1/pyproject.toml +75 -0
- lakekeeper_mcp-0.3.1/requirements.txt +2 -0
- lakekeeper_mcp-0.3.1/scripts/security_sanitizer.py +318 -0
- lakekeeper_mcp-0.3.1/scripts/verify_api_integration.py +279 -0
- lakekeeper_mcp-0.3.1/setup.cfg +4 -0
- lakekeeper_mcp-0.3.1/tests/conftest.py +0 -0
- lakekeeper_mcp-0.3.1/tests/test_api_client.py +88 -0
- lakekeeper_mcp-0.3.1/tests/test_auth_env.py +114 -0
- lakekeeper_mcp-0.3.1/tests/test_kg_ingest.py +94 -0
- lakekeeper_mcp-0.3.1/tests/test_ownership.py +53 -0
- 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,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
|
+

|
|
32
|
+

|
|
33
|
+

|
|
34
|
+

|
|
35
|
+

|
|
36
|
+

|
|
37
|
+

|
|
38
|
+

|
|
39
|
+

|
|
40
|
+

|
|
41
|
+

|
|
42
|
+

|
|
43
|
+

|
|
44
|
+

|
|
45
|
+

|
|
46
|
+

|
|
47
|
+

|
|
48
|
+

|
|
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
|
+

|
|
306
|
+

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