MCP server wrapping the Smalt's storage surface (read/write/link/claim/search) for ParkviewLab's CoGrind project.
Project description
smalt-mcp
MCP server wrapping the Smalt's storage surface (read / write / link / claim / search) for ParkviewLab's CoGrind project. Thinnest viable wrapper around markdown + LanceDB; no agentic logic. Single-writer to a given Smalt.
To cobalt-grinding what deco-assaying is to tree-sitter: a clean MCP-shaped wrapper around a deterministic capability.
Status
v0 foundation. Server runs; one MCP tool (status) wired up; storage layer ported from cobgrind/storage/ and ready for the rest of the tool surface. Track A of CoGrind's M2.7 plan — see cobalt-grinding/docs/plan.md for the full design.
Coming in the next iterations: read-only tools (list_pages, read_page, search, traverse, list_domains, list_proposals), read-write tools (write_page, write_pages, add_link, add_claim, write_proposal, bootstrap), auto-indexer-trigger on writes, end-to-end integration with CoGrind.
Run
Same five-mode pattern as deco-assaying. Pick whichever fits.
| Mode | When to use |
|---|---|
1. uvx (one-off) |
Try it once, no install. |
2. uv tool install (pinned daemon) |
Run it occasionally, want it on $PATH. |
| 3. macOS LaunchAgent | Persistent daemon on a Mac. |
| 4. Linux systemd user unit | Persistent daemon on Linux. |
| 5. Docker / docker compose | Container deployment. |
In every mode the server listens on PORT (default 35833). Sanity-check:
curl http://127.0.0.1:35833/health
From source (current; until first release)
git clone https://github.com/ParkviewLab/smalt-mcp.git
cd smalt-mcp
uv sync
SMALT_DIR=~/Documents/Smalt uv run python -m smalt_mcp
Docker (after first release)
docker pull ghcr.io/parkviewlab/smalt-mcp:latest
docker run --rm \
-p 35833:35833 \
-e SMALT_SCOPE=read_only \
-v smalt-data:/data \
ghcr.io/parkviewlab/smalt-mcp:latest
Or use docker-compose.yml.
Endpoints
POST /sse— MCP Streamable HTTP transport. Tools.GET /health— liveness probe ({ok, version, uptime_seconds}).GET /admin/version— server identity + scope + configured Smalt path.GET /docs— OpenAPI / Swagger UI for the HTTP routes.
HTTP responses are gzipped when the client sends Accept-Encoding: gzip.
MCP tools (v0)
Read-only:
status— Smalt path, existence, LanceDB tables present, page count, single-writer mutex state, embedding provider. Always safe to call.
Read-write: (coming next iteration)
The full target surface is in cobalt-grinding/docs/plan.md under "Track A — ParkviewLab/smalt-mcp v0".
Configuration
| Env var | Default | Purpose |
|---|---|---|
PORT |
35833 |
HTTP listen port. |
HOST |
0.0.0.0 |
HTTP bind address. |
SMALT_DIR |
~/Documents/Smalt |
Path to the Smalt this server wraps. Auto-created on bootstrap (planned). |
SMALT_SCOPE |
read_write |
read_only or read_write. Read-only deployments only expose tools that don't mutate the corpus. |
EMBEDDING_PROVIDER |
fastembed |
Embedding backend. fastembed is the only one wired up; voyage / openai are placeholders. |
EMBEDDING_MODEL |
BAAI/bge-small-en-v1.5 |
Model name passed to the provider. |
EMBEDDING_DIM |
384 |
Must match the model. |
SMALT_INTERNAL_TOKEN |
(unset) | Reserved for future per-client scope routing; not yet enforced. |
Releasing
Tag-driven via the release workflow on push of a v* tag. Use the ParkviewLab/dev-tools helpers — they enforce the SSOT-tag-CI loop (pyproject.toml is the only place the version lives; CI verifies the pushed tag matches before publishing).
git bump patch # 0.1.5 → 0.1.6, committed
git release # annotated tag v0.1.6 from pyproject.toml
git push --follow-tags # CI fires
Don't have the helpers? Install once: git clone https://github.com/ParkviewLab/dev-tools.git ~/dev-tools && cd ~/dev-tools && ./install.sh.
License
MIT. See LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smalt_mcp-0.1.0.tar.gz.
File metadata
- Download URL: smalt_mcp-0.1.0.tar.gz
- Upload date:
- Size: 123.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1662c474bc6bf071c985725f2bfcae18ce250bfee1493c2cde59fa61a852358
|
|
| MD5 |
376a4cd48bb6018e1a2f6b8db04f126e
|
|
| BLAKE2b-256 |
5af2a6c798f1a09d0c1c0110286c62e7747933750b9486cf4239e820d9220839
|
Provenance
The following attestation bundles were made for smalt_mcp-0.1.0.tar.gz:
Publisher:
release.yml on ParkviewLab/smalt-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smalt_mcp-0.1.0.tar.gz -
Subject digest:
d1662c474bc6bf071c985725f2bfcae18ce250bfee1493c2cde59fa61a852358 - Sigstore transparency entry: 1554880317
- Sigstore integration time:
-
Permalink:
ParkviewLab/smalt-mcp@0d117eb2964de175badd1d43850c1d14e9a073f7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ParkviewLab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d117eb2964de175badd1d43850c1d14e9a073f7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file smalt_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: smalt_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4a07b89ceb160eca9ec21a8f36a6df6c75d82cbde9f31ae35be02dfe33cdcb6
|
|
| MD5 |
323c15dccbf3da1581b0886a3486fbe0
|
|
| BLAKE2b-256 |
a0a34b7d7ce4b27d118559766e3dee6b7222bd67a7acaeea8d60e7ec27c27600
|
Provenance
The following attestation bundles were made for smalt_mcp-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ParkviewLab/smalt-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smalt_mcp-0.1.0-py3-none-any.whl -
Subject digest:
c4a07b89ceb160eca9ec21a8f36a6df6c75d82cbde9f31ae35be02dfe33cdcb6 - Sigstore transparency entry: 1554880343
- Sigstore integration time:
-
Permalink:
ParkviewLab/smalt-mcp@0d117eb2964de175badd1d43850c1d14e9a073f7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ParkviewLab
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d117eb2964de175badd1d43850c1d14e9a073f7 -
Trigger Event:
push
-
Statement type: