ScribblesLM
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ScribblesLMingest https://example.com/report.pdf into notebook 'Q3'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ScribblesLM
Notebook-scoped RAG over your own corpora, delivered as a stdio MCP server. Documents
(URLs, PDFs, plain text) are ingested into named persistent notebooks; queries return raw,
breadcrumbed chunks for the calling agent to cite and synthesize. The breadcrumb is the
document's own heading hierarchy — Part › Chapter › Section › Clause, Article › §,
Розділ › Стаття › Пункт, whatever the source uses — so answers carry a real citation, not
just a similarity score.
It works on any structured document whose sections are marked by consistent keyword headings (legal codes, contracts, regulations, standards, technical specs, manuals…). The chunking profile is induced from each document, not hard-coded.
Embeddings are sensitivity-routed (see below): public docs → Voyage (fast, contextual); private docs → a local bge-m3 GGUF that never leaves the host. Storage is SQLite + sqlite-vec + FTS5 — no Docker, no daemon, near-zero idle footprint.
Tested scope & maturity
ScribblesLM has been built and validated end-to-end on Ukrainian legal codes only (Criminal, Tax, Civil, Family, and Labour Codes). The structure induction, the retrieval/inflection measurements, and the full ingest→query pipeline were all exercised on that corpus. Everything else is untested — other document families (contracts, specs, manuals, prose), other jurisdictions, other languages, other PDF layouts. The design is deliberately general (pattern-based heading induction; language-agnostic dense embeddings), so it should extend — but treat any non-Ukrainian-legal use as unverified and check retrieval quality on your own corpus before relying on it.
Related MCP server: mcp-rag-server
Prerequisites
uv (Python package manager / runner)
A Voyage API key from voyageai.com — use a paid account (add a payment method). The free tier (3 RPM / 10K TPM) is far too rate-limited for bulk ingestion; adding a card unlocks usable limits (~2000 RPM / millions of TPM). Cost stays ~$0 for typical corpora — the models used carry large free-token allotments (e.g. 200M tokens for
voyage-context-3); paying is essentially a rate unlock, not a bill.(private path only) a bge-m3 GGUF model file — see install step 3
(optional) an OpenAI-compatible LLM key for private-path contextualization (any provider — see "Context LLM" below)
Install
# 1. Clone
git clone https://github.com/elphamale/scribbleslm
cd scribbleslm
# 2. Configure env (secrets live OUTSIDE the repo; .env is git-ignored)
mkdir -p ~/.scribbleslm
cp .env.example ~/.scribbleslm/.env
# then edit ~/.scribbleslm/.env and set VOYAGE_API_KEY=<your key>
# 3. (private path only) download the local embedding model (~445 MB, ungated)
uvx --from huggingface_hub hf download gpustack/bge-m3-GGUF bge-m3-Q5_K_M.gguf \
--local-dir ~/.scribbleslm/models
# Skip if you only ingest PUBLIC sources. Adding a private source without this
# model returns a clear error, not a crash. (See "Embedding backends" for why GGUF.)
# 4. Smoke test — should print one JSON line listing 11 tools
{ printf '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}\n{"jsonrpc":"2.0","method":"notifications/initialized"}\n{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}\n'; sleep 3; } | uv run scribbleslmThe first uv run resolves dependencies (including a prebuilt llama-cpp-python CPU wheel
via pyproject's configured index) — it may take a minute. Subsequent runs are instant.
MCP client config
Add to your agent's MCP config. Secrets are not inlined — the server reads
~/.scribbleslm/.env at startup:
{
"mcpServers": {
"scribbleslm": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/scribbleslm", "run", "scribbleslm"]
}
}
}Sensitivity routing (public vs private)
Every source is embedded by one of two backends, chosen per document by the private
flag on source_add:
private=false(default) → Voyage (remote API): fast, contextual. For published / non-confidential documents.private=true→ local bge-m3 GGUF: the document's text never leaves the host. For confidential / privileged material.
The default is set by DEFAULT_PRIVATE. Queries are guarded the same way: a query you flag
sensitive is never sent to the remote backend — it searches only locally-embedded content
plus the lexical index. The two backends produce different vector spaces; results are merged
by rank fusion, never by comparing raw scores across spaces.
Trust boundary: on a host you don't fully control (e.g. a rented VPS), private=true
limits transmission but does not make the host trustworthy — the real boundary is whether
you ingest sensitive material onto that host at all. Set the flag deliberately.
Ingestion: when is it ready?
source_add returns a source_id immediately and embeds in the background. Two
phases affect result quality — poll source_status(source_id) to see where a source is
(chunks_embedded/chunks_total, queryable, the pending/enriched/failed rollup, and a
one-line summary); notebook_status(notebook_id) aggregates across a whole notebook
("is my corpus ready").
Coverage (during embedding). Chunks become queryable as soon as the first batch embeds (
queryable=true), but a query run mid-ingest only searches the chunks embedded so far — it can miss sections not yet embedded. Coverage is complete whenchunks_embedded == chunks_total. So early queries are usable but may have lower recall than queries run after the embed finishes; the improvement plateaus at full coverage (it does not keep getting better indefinitely).Enrichment quality (private path only). Private docs are first embedded on raw text (
pending), then — if you runsource_enrich/ passenrich=trueand have a context LLM configured — re-embedded with surrounding context (enriched), which improves retrieval quality. Public docs are already contextually embedded at ingest time, so they have no separate enrichment step and don't improve further after coverage completes.
Embedding backends & context LLM
Public embeddings (Voyage): model is configurable via
VOYAGE_MODEL(defaultvoyage-context-3, chosen by benchmark). Any Voyage embedding model works.Private embeddings (local): ships a bge-m3 GGUF backend run in-process via
llama-cpp-python. GGUF was chosen for the build environment — modest CPU, limited RAM, no GPU, and no compiler to build from source (a prebuilt CPU wheel is used). The embedding layer is a pluggable interface (embed_batch/embed_query); on a host with more RAM/CPU or a GPU you could add an alternative local backend (e.g. non-GGUF bge-m3 via sentence-transformers, or a larger model). Only the GGUF backend is implemented and tested today — alternatives are an extension point, not a config switch.Context LLM (private-path enrichment): any OpenAI-compatible chat API — DeepSeek is only the default example. Point
CONTEXT_LLM_BASE_URL/CONTEXT_LLM_API_KEY/CONTEXT_LLM_MODELat any provider (OpenAI, OpenRouter, a self-hosted vLLM or Ollama OpenAI endpoint, etc.). It is used only to contextualize private documents duringsource_enrich; public documents never use it.
Environment (~/.scribbleslm/.env)
Variable | Required | Notes |
| yes | public embedding path; paid Voyage account (see Prerequisites) |
| no | default |
| private path | default |
| private enrich | any OpenAI-compatible API; placeholder by default |
| no | default |
| no | default |
Unrun without a context LLM key: CONTEXT_LLM_API_KEY ships as a placeholder. Until you
set it, private-path enrichment and LLM profile synthesis do not run (the rest works;
private docs are embedded and queryable, just not extra-contextualized). The local reranker's
model-load path is exercised only when RERANKER_ENABLED=true.
How chunking works (why the breadcrumbs)
Each document is run through an induction ladder that derives its structure:
format-native (markdown headings / PDF table-of-contents) → a cached profile → line-shape
mining (detects recurring Keyword + Number/Roman headings — Article 12, Section 4,
Розділ II, § 3 — with no model) → optional LLM synthesis → semantic segmentation →
plain token-splitting as the floor. The winning profile segments the document into
heading-aligned chunks, each carrying its breadcrumb; oversized sections are token-split but
inherit the breadcrumb. A small pre-warmed profile ships for one common document family;
others are induced automatically and cached by structural fingerprint.
Tools (11)
notebook_create · notebook_list · notebook_delete · source_add · source_list ·
source_refresh · source_delete · source_enrich · source_status · notebook_status
· notebook_query
Known limitations
Without a context-LLM key: private-path enrichment + LLM profile synthesis unrun.
Documents whose structure is carried only by typography (font size/bold) or by bare digit-led numbering (
1.,1.1.), and PDFs with no embedded table of contents, fall back to plain token chunking — no fine-grained breadcrumbs (coarser citation). Heading-keyword–structured documents get full breadcrumbs.For morphologically-rich / inflected languages, the pure-lexical channel (FTS5, no stemming) misses inflected word forms; the default hybrid query mode covers this via dense embeddings.
License
Polyform Noncommercial 1.0.0 © 2026 elphamale
Available Tools
11 toolsnotebook_createC
Create a notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries full responsibility for disclosing behavior. It only states an action without noting side effects, requirements, or return values, leaving the agent uninformed about what happens on success or failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no filler. However, it is too minimal, providing only the core action without additional context or structure, making it borderline under-specified rather than efficiently complete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one parameter, no annotations, and no output schema, the description should explain more about the create operation, such as what the notebook contains, whether duplicate names are allowed, or what is returned. It fails to provide any contextual completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one required parameter 'name' with no description. The description does not clarify the format, constraints, or purpose of the name beyond the obvious, offering no added meaning to help the agent formulate correct arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Create a notebook.' clearly identifies the action (create) and the resource (notebook), distinguishing it from sibling tools like notebook_list, notebook_delete, and notebook_query. Although brief, it is unambiguous and maps directly to the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus others. No mention of prerequisites, alternatives (e.g., if a notebook already exists), or use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_deleteA
Delete a notebook and all its sources, chunks, and vectors.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explicitly states that deletion cascades to sources, chunks, and vectors, which is critical for an agent to understand the destructive scope. However, it does not mention irreversibility, permissions, or other side effects, keeping it below a perfect score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the action and object, then adds the cascade detail. There is no wasted wording, making it highly concise and structurally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description captures the core effect (cascade deletion) but lacks context such as when deletion is appropriate, whether it is reversible, or any confirmation steps. Given the destructive nature and absence of an output schema, the description is adequate but leaves gaps for an agent to act safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single parameter notebook_id. The description adds no meaning beyond the parameter name and type; it does not explain how to find the notebook_id or any format expectations. Since coverage is low, the description should compensate, but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Delete'), the target resource ('a notebook'), and the cascading scope ('and all its sources, chunks, and vectors'). This distinguishes it from sibling tools like notebook_create or source_delete by specifying the full recursive deletion behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as source_delete for deleting individual sources. The description implies usage for deleting entire notebooks but does not explain prerequisites, exclusions, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_listA
List notebooks with source counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds the useful detail that results include source counts, but does not explicitly state read-only status, pagination, or authentication needs. This is minimal but acceptable for a simple list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that is front-loaded and contains no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters, output schema present), the description is adequate: it conveys the purpose and the key output detail. A slight gap is the absence of usage context relative to sibling tools, but this is minor for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty. The baseline for no parameters is 4, and the description does not need to elaborate on parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('notebooks'), and a defining output detail ('with source counts'). This distinguishes it from sibling tools like source_list and notebook_query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or compare with sibling tools like notebook_query or source_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_queryA
Hybrid search within a notebook: dense KNN + FTS5 lexical, fused with RRF. Returns raw chunks for the calling agent to synthesize. mode = hybrid | dense | lexical. Set private=true for a sensitive query so it is never dense-embedded via the remote backend (FTS5 is local and still runs); excluded remote spaces are flagged. Per-stage latency is returned under 'latency_ms'.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | hybrid | |
| query | Yes | ||
| top_k | No | ||
| private | No | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full weight and does so impressively: it discloses the hybrid fusion algorithm, the difference between remote (dense) and local (FTS5) processing, the privacy flag's effect, the flagging of excluded remote spaces, and the return of per-stage latency. This gives the agent a clear model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently front-loaded with the primary purpose, then adds a compact list of critical parameter details and return metadata. Every sentence contributes unique information, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description covers return values ('raw chunks' and 'latency_ms') and critical behavioral nuances. Given the tool's moderate complexity and the clear sibling context, the description is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for missing parameter info. It explicitly explains the 'mode' parameter (hybrid | dense | lexical) and the 'private' parameter semantics (avoids remote dense-embedding, FTS5 still runs), which are not self-evident from the raw schema. Other parameters like notebook_id and top_k are obvious from their names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Hybrid search within a notebook' and details the mechanism (dense KNN + FTS5 lexical, fused with RRF). This distinguishes it from sibling tools like notebook_create or source_list, which are not search operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool and how to configure it (e.g., setting private=true for sensitive queries). While it does not explicitly name alternative tools or state when not to use it, the sibling tools are disparate enough that no alternative search tool exists, making the usage context sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_statusA
Aggregate ingestion/enrichment status across all sources in a notebook — 'is my corpus ready'. Same rollup as source_status, plus source_count.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden of explaining behavior. It discloses that this tool aggregates status and includes source_count, but it does not mention side effects (likely none), permissions, error behavior, or the exact shape of the returned status. It adds useful context beyond the schema but lacks deeper behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the main purpose, and the comparison to source_status is valuable. No redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 param, no output schema), and the description gives a high-level idea of the return value (aggregate status + source_count). However, without an output schema or more detail on the response structure, an agent may not know exactly what 'status' entails. The reference to source_status is helpful but assumes familiarity with that sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate for the notebook_id parameter. It does not explain how to obtain or interpret notebook_id, beyond the schema's bare type and title. For a single simple parameter this is a minor gap, but the rubric requires compensation when coverage is low.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Aggregate') and resource ('status across all sources in a notebook'), and clearly distinguishes itself from the sibling source_status by noting 'Same rollup as source_status, plus source_count'. It also captures user intent with 'is my corpus ready'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context for when to use this tool: to get an aggregate view of notebook readiness. It explicitly references source_status as a comparison point, indicating an alternative exists, though it does not explicitly state when to prefer one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_addA
Fetch and ingest a source. Returns after embed+store (queryable immediately); no DeepSeek runs inline. Documents default to public (private=false), embedded via a remote API for speed. Set private=true to force fully-local embedding for any document that must not leave this host. Note: on a rented/cloud host the document already resides on infrastructure the operator may not fully control; private=true limits further transmission but is not a substitute for not ingesting truly sensitive material onto an untrusted host. enrich=true runs contextualization in the background (private sources only; public sources are already contextual).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| enrich | No | ||
| private | No | ||
| notebook_id | Yes | ||
| display_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels: it discloses that the tool returns after embed+store (queryable immediately), runs no inline DeepSeek, defaults to public with remote API embedding, offers private=true for fully-local embedding, and includes a nuanced security warning about cloud hosts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then efficiently covers behavioral details, security caveats, and enrichment semantics in four sentences. Every sentence adds value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description covers the essential lifecycle: fetching, embedding, storage, queryability, privacy options, enrichment behavior, and a security warning. It provides enough context for an agent to invoke the tool correctly and anticipate consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does explain private (fully-local embedding) and enrich (background contextualization for private sources), which are non-obvious. However, it does not give explicit semantics for url, notebook_id, or display_name beyond their schema titles, leaving some parameters reliant on inference from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb+resource: 'Fetch and ingest a source.' This distinguishes it from sibling tools like source_list, source_delete, source_refresh, and source_enrich as the creation/ingestion operation, and the need for a notebook_id further clarifies its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context for the private and enrich parameters, including security considerations and when enrichment applies. However, it does not explicitly name alternatives or state when not to use this tool versus source_refresh or source_enrich, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_deleteB
Delete a source and its chunks/vectors.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the cascading deletion of chunks/vectors, a critical behavioral trait. However, with no annotations provided, it does not mention irreversibility, permissions, or error states, leaving a significant transparency gap for a destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler words. It efficiently communicates the core action and its main side effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool, the description covers the core behavior and one side effect. However, it omits critical operational context such as whether deletion is irreversible, required permissions, or how it relates to notebook_id, making it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the two parameters (source_id, notebook_id). The schema itself only provides names and types, so the tool provides no additional meaning to guide parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and identifies the resource ('a source') along with a key side effect ('its chunks/vectors'). This clearly distinguishes it from sibling tools like source_add or source_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the tool name and description: when you want to remove a source. However, there is no explicit guidance on when to prefer this over other source tools, nor any exclusion or prerequisite information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_enrichA
Run DeepSeek contextualization over a PRIVATE source's pending chunks, re-embed locally, and mark them enriched. Public (context-3) sources are already contextual.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| source_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the processing pipeline (DeepSeek contextualization, local re-embedding, marking as enriched) and the scope limitation to private sources. However, it does not explain side effects, cost, idempotency, or the role of the force parameter, leaving important behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and contains no filler. The parenthetical about public sources is concise and informative, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, output schema, and parameter descriptions, the description is not sufficient for full confidence. It omits the behavior of force, what happens after enrichment (e.g., status changes, searchable effects), and any return value. It gives a good overview but fails to cover critical usage details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does not explain the force parameter at all and only implicitly refers to source_id. This is a significant omission because force is a boolean that could alter the tool's behavior, and the description adds no parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs DeepSeek contextualization on a PRIVATE source's pending chunks, re-embeds locally, and marks them enriched. It explicitly distinguishes from public sources, setting it apart from sibling tools like source_refresh and source_add.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says public (context-3) sources are already contextual, implying the tool should only be used for PRIVATE sources. This is a clear when-not-to-use signal, though it does not name alternative tools for public sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_listB
List sources with chunk counts, enrichment progress, and per-model cost.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It successfully communicates that this is a read-only list operation, but does not mention any edge cases, authentication needs, or error behavior. The listed output fields add some context but not deep behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence: 'List sources with chunk counts, enrichment progress, and per-model cost.' It is front-loaded with the verb and contains no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with an output schema and one parameter, the description gives the core purpose and return fields. However, it omits the notebook context and does not clarify how this tool relates to siblings like source_status, making it only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention the notebook_id parameter at all. The description says 'List sources' but fails to indicate that sources are scoped to a specific notebook, which is a required parameter. This leaves the agent without meaningful guidance on parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'sources' and details what is included (chunk counts, enrichment progress, per-model cost). This clearly distinguishes it from sibling tools like source_add or source_delete, which have different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you want to see sources with their metrics) but does not explicitly state when to use this tool versus alternatives like source_status. No exclusions or alternative recommendations are given, so it only meets the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_refreshA
Re-fetch a source; re-ingest in background only if content hash changed. Pass enrich=true to re-enrich private sources after re-ingest (matches source_add).
| Name | Required | Description | Default |
|---|---|---|---|
| enrich | No | ||
| source_id | Yes | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: re-ingest only on hash change and background execution. Yet it omits side effects like whether existing data is overwritten, whether it returns immediately or a job ID, and any permission requirements, leaving notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first explains the core action and condition, the second clarifies a parameter nuance. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary refresh workflow and the enrich option, but without an output schema it fails to mention return values, errors, or how the background re-ingest is tracked. For a 3-parameter tool with no annotations, this leaves moderate gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the enrich parameter but leaves source_id and notebook_id undocumented in both schema and description. The required identifiers are not given any semantic context beyond their names, making this insufficient for low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action: re-fetch a source and re-ingest only if the content hash changed. This distinguishes it from sibling tools like source_add (new source) and source_enrich (enrichment), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use this tool (to refresh an existing source) and gives specific guidance for the enrich parameter ('Pass enrich=true to re-enrich private sources after re-ingest'). However, it does not explicitly contrast with siblings such as source_enrich, so the usage context is clear but excludes alternatives only implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_statusA
Ingestion/enrichment status for a source, derived from current DB state. Poll
this to track progress (no streaming — stdio is request/response). Returns chunk
counts (total/embedded/pending/enriched/failed), the enrichment_status rollup,
queryable (true once any chunk is stored — partial coverage is searchable, and
failed-enrichment chunks stay queryable on their plain embeddings), backend, and a
terse human-readable summary. Retrieval itself is sub-second, so there is no
retrieval progress to report.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It thoroughly discloses behavior: derived from current DB state, return fields/chunk counts, queryable semantics (partial coverage searchable, failed-enrichment chunks still queryable), backend/summary inclusion, and the absence of retrieval progress. This is exceptional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense, information-rich sentences: foundational purpose, detailed return values, and a performance caveat. Every sentence earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a status tool with no output schema and no annotations, the description delivers complete guidance: return fields, queryable behavior in partial/failure states, performance expectations, and what not to expect (retrieval progress). Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explicitly define source_id. However, the single parameter is self-evident from its name and the phrase 'for a source'. The lack of explicit compensation is noted, but the triviality of the parameter reduces the impact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: returning ingestion/enrichment status for a source. It uses a specific resource and scope, and distinguishes itself from sibling tools by noting it is DB-derived and pollable, with no streaming and no retrieval progress.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to 'Poll this to track progress' and clarifies 'no streaming — stdio is request/response', giving clear when-to-use context. It does not explicitly name alternative tools, but the guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
11 tool updates
v0.2.0- First observed
notebook_create - First observed
notebook_delete - First observed
notebook_list - First observed
notebook_query - First observed
notebook_status - First observed
source_add - First observed
source_delete - First observed
source_enrich - First observed
source_list - First observed
source_refresh - First observed
source_status
TDQS
Each tool targets a distinct resource (notebook vs source) and action (create, list, delete, add, refresh, enrich, status, query). There is no overlap; even source_status and notebook_status differ by scope. An agent can easily select the right tool.
All tools follow a consistent object_verb pattern (e.g., notebook_create, source_add, source_status). Naming is uniform with underscores and no mixed conventions, making the API predictable.
11 tools is well-scoped for a notebook/source management server. Each tool serves a clear purpose with no redundancy, and the count is within the ideal 3-15 range.
The surface covers full lifecycle management for notebooks (create, list, delete, status, query) and sources (add, list, refresh, delete, enrich, status). Query capabilities are included, and status tracking for both individual sources and whole notebooks fills any potential gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.
Ingest, manage, and retrieve documents for RAG-powered AI applications
Personal knowledge base MCP server with semantic search, auto-categorization, metadata extraction
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal-first RAG indexing and semantic search MCP server. Enables document retrieval and context-aware queries using local embedding models.316MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that indexes documents and serves relevant context to LLMs via Retrieval Augmented Generation (RAG).4837MIT
- FlicenseNot gradedqualityDmaintenanceA Retrieval Augmented Generation MCP server that ingests documents into a local vector database and enables semantic search queries.10-
- FlicenseNot gradedqualityCmaintenanceAn MCP server for document parsing, ingestion, query (including multimodal), and lightweight knowledge graph inspection, enabling RAG workflows via the Model Context Protocol.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/elphamale/scribbleslm'
If you have feedback or need assistance with the MCP directory API, please join our Discord server