MCP Loom
概要
作者による説明(英語の原文)
Stdio MCP proxy: intercepts oversized tool results into a queryable embedded DuckDB.
PopNx MCPの3つの柱
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
- 利用者の声iレビューはまだありませんレビューは今後のステップで、アカウント機能と一緒に始まります
- 私たちの基本チェックi1項目中1項目に合格公開情報からチェック。コードはまだスキャンしていません
- 利用状況iとても新しい↓ 59/週 · ★ –
できること
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
- 接続方法: パソコンで動く
- トランスポート: stdio
- カテゴリ: データベース・データセット
インストール
使っているAIアプリを選んで、設定をコピーしてください。
インストールの前に
- 基本チェック:1項目中1項目に合格
- あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
- レジストリには、入力が必要なキーは載っていません。
必要なもの
- npmNode.jsのインストール(npxコマンドに必要)
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"loom": {
"command": "npx",
"args": [
"-y",
"mcp-loom",
"--config",
"your-value"
]
}
}
}ターミナルでこれを実行します
claude mcp add loom -- npx -y mcp-loom --config your-valueこのサーバーは起動コマンドに値を入れる必要があるので、設定をコピーして入力してください。
または、設定を自分でコピーする
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"loom": {
"command": "npx",
"args": [
"-y",
"mcp-loom",
"--config",
"your-value"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
このサーバーは起動コマンドに値を入れる必要があるので、設定をコピーして入力してください。
または、設定を自分でコピーする
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"loom": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-loom",
"--config",
"your-value"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
できること
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
基本チェックi
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月10日にチェック
- ✓ 合格
作者とリポジトリが一致
レジストリ名は、リポジトリを所有するGitHubアカウント buttonmonkey で確認済みです
- … 未チェック
今もメンテナンスされている
このリポジトリはまだGitHubから読み取っていません
- … 未チェック
ライセンスがある
このリポジトリはまだGitHubから読み取っていません
- – 対象外
エンドポイントが応答する
これはパソコンで動くため、インターネット上のエンドポイントはありません
- – 対象外
OAuthでサインイン
パソコンで動き、代わりにローカルの設定を使います
- … 未チェック
ツールの説明に隠れた指示がない
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
データベース・データセットのほかのサーバーとの比較i
- このカテゴリのほかの1159件のうち0%よりスターが多い
- このカテゴリのほかの1159件のうち17%より最近レジストリに公開
- 基本チェックの結果が、このカテゴリのほかの1159件のうち100%と同じかそれ以上
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
よくある質問
MCP Loomは安全ですか?
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
どんなキーやコードが必要ですか?
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
パソコンで動きますか、それともクラウドですか?
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
今もメンテナンスされていますか?
GitHubリポジトリの最終更新は–、最新バージョン(0.3.2)がレジストリに届いたのは4 か月前です。
どのアプリで使えますか?
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
代わりに使えるものは?
同じカテゴリには:Supabase, MongoDB MCP Server, Elasticsearch MCP Server
代わりの候補
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
作者のREADME
READMEを開く
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
███╗ ███╗ ██████╗██████╗ ██╗ ██████╗ ██████╗ ███╗ ███╗
████╗ ████║██╔════╝██╔══██╗ ██║ ██╔═══██╗██╔═══██╗████╗ ████║ ██╔████╔██║██║ ██████╔╝█████╗██║ ██║ ██║██║ ██║██╔████╔██║ ██║╚██╔╝██║██║ ██╔═══╝ ╚════╝██║ ██║ ██║██║ ██║██║╚██╔╝██║ ██║ ╚═╝ ██║╚██████╗██║ ███████╗╚██████╔╝╚██████╔╝██║ ╚═╝ ██║ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝
The context loom for MCP.
One proxy in front of N servers. Oversized tool results are woven into queryable datasets — 48k tokens in, 2k envelope out.
warp: results stream in weft: the loom shuttles across ══════════════════════ ═════════════════════════════
│ │ │ │ │ │ │ │ 48,377 tokens ┄┄┄┄┄┄┄┄┄> ✂ intercept ●━━━━┿━━━━┿━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ ●━━━━┿━━━━┿━━━━━━━ ingest → DuckDB ━━━━━━┫ │ │ ●━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ │ │ │ ●━━━━ schema · stats · joins ━━┛ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ [ raw floods, dropped ] [ 2,104-token envelope ] ref · sample · SQL
What it does
An MCP client asks a tool a question, and the answer comes back as a ten-thousand-row JSON dump — most of which the model didn't need but now has to hold in context. Loom sits in the middle.
When a result is small, it passes through untouched. When a result is large and tabular, Loom ingests it into an embedded DuckDB and hands the model a compact envelope instead: a dataset ref, the schema, column stats, a few sample rows, join hints, and provenance. The model then queries precisely what it needs — including joins across data from *different* servers, which no single server can answer alone.
The economics: a 48k-token tool result becomes a ~2k-token envelope. The model spends its context on answers, not raw dumps.
When loom helps — and when it won't
Loom earns its place in three situations that cover the ordinary case of real MCP usage:
- Clients with no shell. Claude Desktop, mobile, and agent platforms — the largest client surfaces — have no CLI to fall back to. MCP tools are the model's only path to the data, so interception engages by construction.
- Servers with no model-reachable CLI. Internal tools, SaaS connectors, and credentialed databases whose secrets live only in the server's
envblock — the bulk of real connectors. There is nogh-equivalent for the model to route around. - Auditable analysis over persistent datasets. Loom turns "the model eyeballed a dump" into "the model ran verifiable queries over data you can still inspect" — exact SQL over provenance-stamped datasets that stay reopenable and re-queryable after the fact. This one applies *everywhere*, shell or no shell, and is the honest answer to "why route through loom at all."
Cross-server joins run through all three: no single CLI answers a question spanning two services' data.
Two boundaries, stated plainly:
- A shell-bearing agent will skip the MCP layer for a service it can reach directly. Give a model
bashand a service with a known CLI and ambient credentials —ghagainst GitHub is the sharpest case — and it goes straight to the CLI, faster and cheaper, skipping loom and MCP both. That is the agent preferring a CLI to MCP, not a loom defect; loom is an MCP-layer product and will not beatghat beinggh. It is also the minority case: most servers wrap things with no model-reachable CLI, and the largest client surfaces have no shell. - Envelope fidelity is bounded by what the downstream returns. Loom flattens faithfully what a server sends — but it cannot add fields the server never sent. The GitHub MCP server, for instance, returns a trimmed 17-field repo object (no
stargazersCount,language, orforks); loom captured all 17 faithfully, and a star-ranking question was still unanswerable from that data. The bound is the downstream's, not loom's.
How it works
Loom is itself a stdio MCP server. It sits between one upstream MCP client (Claude Desktop, Claude Code, Cursor, etc.) and N downstream MCP servers that you configure:
- Spawns and supervises each configured downstream server (handshake health check, restart with backoff, delists tools and emits
list_changedif a server exhausts its restart budget). - Namespaces every downstream tool as
_and re-exposes the aggregated tool list upward, keeping it live vialist_changed. - Routes
call_toolto the correct downstream child. Small results return unmodified — pass-through is byte-identical. Large tabular results are intercepted into DuckDB and replaced with aloom_dataset_refenvelope; any interception failure degrades to the untouched original. - Exposes the synthetic query surface over cached datasets:
loom_query(guarded read-only SQL, cross-server joins included),loom_list_datasets,loom_describe(full schema, stats, and fresh join hints for a dataset),loom_materialize(pin a derived query result as a new dataset), andloom_export(sealed csv/json export). Interception depth is capped at 1 per upstream call;loom_materializedoes not consume that budget. - Shuts down cleanly on signals or upward stdin EOF, with no orphaned child processes and the spill dir removed.
Loom intercepts both structured results and formatted text: when a result carries a structuredContent channel it ingests from that; otherwise it parses JSON-in-text, and failing that, extracts repeating records from formatted text under a strict never-lie bar (it never emits a table it isn't sure of — any uncertainty degrades to an untouched pass-through). See SPEC.md for the full normative specification.
Usage
npx mcp-loom --config loom.config.json
Point any MCP client at that command. Configuration can also be supplied via the LOOM_CONFIG environment variable instead of --config:
LOOM_CONFIG=/path/to/loom.config.json npx mcp-loom
(--config takes precedence if both are set.) See loom.config.example.json for a minimal working example.
Client recipes
Loom is launched by your MCP client the same way any stdio server is — point the client at npx -y mcp-loom --config .
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": { "loom": { "command": "npx", "args": ["-y", "mcp-loom", "--config", "/absolute/path/to/loom.config.json"] } } }
Cursor (.cursor/mcp.json): the same mcpServers block as above.
Claude Code — add it from the CLI:
claude mcp add loom -- npx -y mcp-loom --config /absolute/path/to/loom.config.json
Use an absolute path to loom.config.json — MCP clients spawn servers with an unspecified working directory. Loom then spawns and namespaces the downstream servers listed in that config.
Config reference
Config is a single JSON file, validated with zod at startup; invalid config fails fast with a readable error listing every violated field.
| Field | Type | Default | Notes | |||
|---|---|---|---|---|---|---|
servers | array (min 1) | — (required) | The downstream servers to proxy. See below. | |||
servers[].name | string | — (required) | Must match ^a-z{0,31}$, unique across all servers. loom is reserved (used exclusively for synthetic tools) and rejected. | |||
servers[].command | string | — (required) | Executable to spawn (e.g. npx). Non-empty. | |||
servers[].args | array of strings | [] | Args passed to command. | |||
servers[].env | object (string→string) | {} | Extra environment variables for this server's child process only. See "Child environment" below. | |||
servers[].envPassthrough | array of strings | [] | Names of extra non-secret vars to forward from Loom's own environment to this server's child, on top of the curated safe base (default-deny — the launching shell's env is not copied wholesale). See "Child environment" below. | |||
servers[].provenanceDenylist | array of strings | [] | This server's tool names whose provenance.args are omitted entirely ("[omitted]") from envelopes, loom_describe, and loom_list_datasets — for tools whose args are nothing but credentials. Other tools keep the heuristic key-based redaction. | |||
tokenThreshold | integer ≥ 100 | 2000 | Interception fires when a tabularizable text result exceeds this; a coarse chars/4 order-of-magnitude dial, NOT precise (undercounts CJK). | |||
memoryBudgetBytes | integer ≥ 1048576 | 268435456 (256 MiB) | Soft eviction budget on tracked dataset bytes; implicit query-result datasets evict LRU-first, then downstream ingests. | |||
duckdbMemoryLimit | string, `/^\d+(\.\d+)?(KB\ | MB\ | GB\ | TB)$/` | "512MB" | Hard engine backstop (SET memory_limit); ops spill to disk under a computed thread bound rather than OOM. |
exportDir | string | "./exports" | Directory where loom_export writes csv and json files. | |||
queryTimeoutMs | integer ≥ 1 | 30000 | Bounds a loom_query (interrupt()-timer). | |||
restart.maxAttempts | integer ≥ 0 | 5 | Max consecutive restart attempts per downstream server before it is delisted (tools removed, list_changed emitted). 0 disables restart. | |||
restart.baseDelayMs | integer ≥ 1 | 1000 | Base delay for restart backoff. |
If every configured server fails to start, Loom itself fails to start (fatal). If only some fail, Loom starts with a warning and the surviving servers' tools available.
Interception & querying
Large tabular tool results are intercepted and ingested into the embedded DuckDB store as queryable datasets. A tool result that exceeds tokenThreshold and carries structured data — read from the protocol's structuredContent channel when present, otherwise parsed from the text render — becomes a loom_dataset_ref envelope: a reference ID, the inferred schema, column statistics, sample rows, and join hints — keeping the token cost low. Query these datasets with the synthetic loom_query tool: it accepts read-only SQL in DuckDB dialect (single SELECT or WITH statement), classified read-only by the engine parser. If you lose a dataset reference, loom_list_datasets recovers it or lists all available datasets in the current session.
Dataset references are session-scoped: they exist only for the duration of your conversation and are automatically evicted under memory pressure (implicit query results are evicted first, preserving explicitly-ingested data longer). Sample rows in the envelope are arbitrary — DuckDB does not preserve insertion order by default — so always use an explicit ORDER BY clause when row order matters. The token estimator is a coarse magnitude dial and undercounts text containing CJK characters, so monitor actual token usage if you regularly cross tokenThreshold.
Inspecting datasets with loom_describe
Call loom_describe on a dataset ref to inspect its structure and contents in detail: full schema with per-column statistics, a 10-row sample, fresh join hints to other datasets (with value-overlap scores that rank real joins above coincidental name matches), provenance, and creation timestamp. Use this when you need to understand a dataset's shape before querying it, or to rediscover a dataset's schema after many intermediate operations.
Materializing query results with loom_materialize
Query results are cached implicitly, but if you want to keep a derived result across the session boundary or ensure it is never evicted, use `
冒頭だけを表示しています。続きはリポジトリで読めます