grammar-kb-mcp
grammar-kb
Repositorio monorepo de base de conocimiento + frontend de aprendizaje para apuntes de enseñanza de gramática inglesa, organizado en dos capas:
grammar_kb/(backend en Python): limpia y estructura los PDF de materiales/apuntes en una base de datos de puntos de conocimiento consultable y trazable: elimina automáticamente marcas de agua, restaura tablas, segmenta puntos de conocimiento, extrae palabras clave y relaciones, y lo almacena en SQLite local (búsqueda de texto completo FTS5), con CLI, API HTTP y servicio MCP.web/(frontend en Vite): interfaz de aprendizaje para estudiantes — permite explorar los apuntes de tres formas: por curso / glosario / sistema de conocimiento, además de un registro de calificaciones de tareas (CRUD, persistido en iCloud Drive, sincronizado entre dispositivos).
Apto para cualquier PDF de enseñanza/técnica con "maquetación relativamente uniforme, encabezados/pies de página con marcas de agua y tablas".
Características
🧹 Eliminación de marcas de agua: filtra encabezados/pies de página y marcas de agua diagonales de fondo según fuente + orientación del texto (incluidos prefijos de fuentes subconjunto de PDF)
📊 Restauración de tablas: detecta automáticamente tablas con bordes y las restaura como tablas GFM Markdown
🧩 Segmentación de puntos de conocimiento: divide por niveles de título (capítulo/sección/subsección/subítem/ejemplo/ejercicio) en unidades consultables de forma independiente
🏷️ Clasificación y relaciones: clasifica por tema, extrae palabras clave/marcadores y relaciones entre puntos de conocimiento (como "principal en futuro, subordinada en presente" o "concordancia de tiempos")
🎯 Señales de examen: cada punto de conocimiento se etiqueta con su dimensión de examen (tiempo verbal/voz/ortografía/subordinadas…), con soporte para "buscar puntos de conocimiento por señal de examen"
📖 Lista de vocabulario: genera listas de vocabulario a partir del corpus de los apuntes (definición/categoría gramatical/forma flexiva/trazabilidad de origen)
🔍 Trazable: cada punto de conocimiento incluye
sesión · ruta de sección · número de página, localizable en el texto original🗄️ Sin truncamiento: el cuerpo del texto se almacena en SQLite
TEXT(sin límite de longitud); FTS se usa solo para coincidencias🌐 API HTTP: servicio REST integrado (FastAPI, con documentación interactiva
/docs)🔌 Listo para MCP: servicio MCP integrado; clientes como Claude pueden consultarlo directamente
Related MCP server: PDF RAG MCP Server
Inicio rápido
uv sync # 安装依赖(含开发依赖)
uv run grammar-kb ingest ./pdfs # 导入一个 PDF 目录(全量重建,id 可复现)
uv run grammar-kb stats # 查看统计¿No tienes uv instalado?
curl -LsSf https://astral.sh/uv/install.sh | sh
Comandos habituales
uv run grammar-kb ingest ./pdfs # 导入目录(或单个 PDF 文件)
uv run grammar-kb lecture 25 # 输出某讲的完整 Markdown(表格已还原)
uv run grammar-kb lecture 25 --format html # 输出某讲的 HTML(表格渲染为 <table>)
uv run grammar-kb kp 173 # 输出某知识点的完整 Markdown
uv run grammar-kb search "关键词" # 全文检索知识点
uv run grammar-kb search "since" --category 时态
uv run grammar-kb markers --category 时态 # 列出某类下所有关键词/标志词
uv run grammar-kb markers --tense 现在完成时 # 列出某时态的标志词
uv run grammar-kb relation 主将从现 # 按关系类型查知识点
uv run grammar-kb exam-signal 从句 # 按考点信号反查知识点(反之亦然)
uv run grammar-kb exam-signal --list # 列出所有考点信号维度
uv run grammar-kb words --limit 100 # 单词表(释义/词性/词形变化/来源)
uv run grammar-kb stats # 统计
uv run grammar-kb serve --port 8000 # 启动 HTTP 查询服务(见 http://127.0.0.1:8000/docs)La base de datos predeterminada es data/grammar.db en el directorio de ejecución; se puede sobrescribir con --db o con la variable de entorno GRAMMAR_KB_DB.
Usar un conjunto de datos precompilado (opcional)
Si no quieres hacer el ingest tú mismo, puedes descargar el grammar.db de la versión correspondiente desde GitHub Releases, colocarlo en data/grammar.db (o especificar la ruta con GRAMMAR_KB_DB) y consultarlo directamente. El número de versión del conjunto de datos aparece en la etiqueta del release (p. ej. data-v1); la tabla meta de la base de datos también registra la versión y la hora de generación.
Arquitectura
PDF ──► pdf_parser 去水印(字体+方向过滤)+ 重排行 + 还原表格
└─► structure 文本 → 大纲树 → 知识点切分(分类 + 关键词 + 关系)
└─► db SQLite(lecture / knowledge_point / marker / relation / block + FTS5)
└─► query 查询 API(CLI 与 MCP 共用)Módulo | Responsabilidad |
| fitz extrae spans (fuente/posición/orientación) → filtra marcas de agua → reordena líneas; pdfplumber restaura tablas sobre los caracteres ya filtrados |
| Clasificación de líneas (sección/subsección/subítem/ejemplo/ejercicio) → segmentación de puntos de conocimiento |
| Reglas de clasificación, diccionario de palabras clave, detección de relaciones, señales de examen (funciones puras) |
| Lista de vocabulario basada en el corpus (definición/categoría gramatical/forma flexiva) |
| Tablas → GFM, renderizado de puntos de conocimiento y sesiones completas |
| schema + CRUD + FTS5(trigram, external-content), sin truncamiento |
| API de consulta orientada a llamadas |
| PDF → persistencia en base de datos (importación de directorio = reconstrucción completa, id reproducible) |
| Base de datos SQLite independiente para calificaciones de tareas (CRUD; por defecto en iCloud Drive) |
| Línea de comandos |
| Servicio HTTP (extra opcional) |
| Servicio MCP (extra opcional) |
| Frontend de aprendizaje (Vite; ver más abajo «Frontend web de aprendizaje» y |
Esquema de la base de datos (resumen)
lecture(number UNIQUE, title, full_title, category, subcategory, source_file, page_count)
knowledge_point(lecture_id, lecture_number, title, category, section_path,
body_md, examples_md, table_md, is_table, source_page, source_bbox, tags_json, ord)
marker(kp_id, lecture_number, marker, marker_type, tense, note) -- 关键词/标志词
relation(kp_id, type, to_kp_id, note) -- 关系:主将从现/时态呼应…
lecture_block(lecture_id, page, seq, kind, text_md) -- 整讲还原用
-- 全文检索(external-content + trigram,中文子串命中)
CREATE VIRTUAL TABLE kp_fts USING fts5(title, body_md, examples_md, table_md,
content='knowledge_point', content_rowid='id', tokenize='trigram');Personalizar tu conjunto de datos
La herramienta está ajustada por defecto para "apuntes de enseñanza con maquetación uniforme". Al cambiar de conjunto de datos normalmente solo hay que tocar tres sitios (todos en grammar_kb/):
Fuentes de marca de agua —
WATERMARK_FONTSenpdf_parser.py: añade los nombres de fuente de tus encabezados/marcas de agua. Script rápido para diagnosticar las fuentes de un PDF nuevo:uv run python -c "import fitz; d=fitz.open('某.pdf'); \ import collections; c=collections.Counter(s['font'] for b in d[0].get_text('dict')['blocks'] if b.get('type',0)==0 for l in b['lines'] for s in l['spans'] if s['text'].strip()); print(c)"Reglas de clasificación —
_TITLE_RULESenclassify.py: asigna la clasificación temática según palabras clave del título.Diccionario de palabras clave —
TENSE_MARKERSenclassify.py(o diccionarios personalizados similares).Expresiones regulares de maquetación —
structure.py: si tus niveles de título usan marcadores distintos (como一、/(一)), ajusta las expresiones regulares correspondientes.
Como servicio HTTP
uv sync --extra server # 安装 server 依赖(fastapi + uvicorn)
uv run grammar-kb serve --port 8000 # 经由 CLI
# 或独立入口:
uv run grammar-kb-server --host 0.0.0.0 --port 8000Tras iniciarlo, visita http://127.0.0.1:8000/docs para ver la documentación interactiva de la API. Endpoints:
Método | Ruta | Descripción |
GET |
| Estadísticas e información de metadatos del conjunto de datos |
GET |
| Lista de sesiones |
GET |
| Contenido de una sesión (con tablas restauradas) |
GET |
| Un punto de conocimiento |
GET |
| Búsqueda de texto completo |
GET |
| Palabras marcadoras |
GET |
| Consulta por relación |
GET |
| Todas las dimensiones de señales de examen |
GET |
| Búsqueda de puntos de conocimiento por señal de examen |
GET |
| Lista de vocabulario (definición/categoría gramatical/forma flexiva) |
GET |
| Árbol del sistema temático de puntos de conocimiento (categoría general → tema) |
GET |
| Consulta de cualquier palabra (diccionario completo ECDICT) |
GET/POST |
| Calificaciones de tareas: listar / añadir |
PUT/DELETE |
| Calificaciones de tareas: modificar / eliminar |
Dónde se guardan los datos de calificaciones
Las calificaciones se guardan en una base de datos SQLite independiente (separada de la base de apuntes data/grammar.db). La ruta se resuelve en este orden:
Variable de entorno
GRAMMAR_KB_EXAM_DBiCloud Drive:
~/Library/Mobile Documents/com~apple~CloudDocs/grammar-kb/exam.db(en macOS cuando iCloud está disponible) — el volumen de datos es pequeño; al estar en la nube, iCloud lo sincroniza entre varios dispositivosRespaldo:
data/exam.db
La base de datos usa deliberadamente el modo sin WAL (archivo único autocontenido; la sincronización de archivos completos de iCloud es más fiable); en otro dispositivo, tras instalar este repositorio e iniciar sesión con la misma cuenta de iCloud e iniciar el servicio, se leen las mismas calificaciones.
Ejemplo:
curl "http://127.0.0.1:8000/search?q=现在完成时&limit=3"
curl "http://127.0.0.1:8000/lectures/25?format=html"Formato de respuesta unificado: todos los endpoints devuelven {code, message, data}.
// 成功(HTTP 200)
{ "code": 0, "message": "ok", "data": { "knowledge_points": 359, ... } }
// 错误(HTTP 与 code 一致)
{ "code": 404, "message": "第 99 讲不存在", "data": null }CORS: por defecto se permiten todos los orígenes (Access-Control-Allow-Origin: *); el frontend puede hacer llamadas entre dominios directamente.
Para restringir la lista blanca: GRAMMAR_KB_CORS_ORIGINS=https://a.com,https://b.com grammar-kb-server.
Como servicio MCP
uv sync --extra mcp
uv run grammar-kb-mcpHerramientas expuestas: search_knowledge_points, get_knowledge_point, get_lecture_markdown,
list_lectures, list_markers, find_by_relation, stats. Cada herramienta es un envoltorio ligero sobre Query.
Ejemplo de configuración de Claude Desktop:
{
"mcpServers": {
"grammar-kb": {
"command": "uv",
"args": ["run", "--directory", "/path/to/grammar-kb", "grammar-kb-mcp"],
"env": { "GRAMMAR_KB_DB": "/path/to/grammar-kb/data/grammar.db" }
}
}
}Frontend web de aprendizaje (web/)
Interfaz de aprendizaje para estudiantes; depende del servicio backend en ejecución local (por defecto http://127.0.0.1:8000; en desarrollo, Vite redirige /api/\*\ hacia él).
# 终端 1:先起后端
uv sync --extra server && uv run grammar-kb-server
# 终端 2:再起前端
cd web && npm install && npm run dev # http://localhost:5180Funciones:
Explorar por curso: 48 sesiones agrupadas por sistema gramatical (morfología/tiempos verbales/voz/formas no personales/sintaxis/revisión integral); al hacer clic se ve el contenido completo de la sesión
Glosario: más de 600 palabras de alta frecuencia (definición/categoría gramatical/forma flexiva/origen en los apuntes), con filtro por categoría gramatical, búsqueda y ordenación
Sistema de conocimiento: 359 puntos de conocimiento dispersos agregados en un árbol de dos niveles «categoría gramatical general → tema», con tabla de consulta rápida de colocaciones fijas
🎯 Señales de examen (bidireccional): salto bidireccional entre puntos de conocimiento ↔ palabras marcadoras/tiempos verbales — «al ver esta palabra, ¿qué puntos de conocimiento se están evaluando?»
📝 Calificaciones de tareas: una hoja de ejercicios por sesión (35 preguntas, 100 puntos). Haz clic en el número de pregunta para marcar correcto/incorrecto; la puntuación se calcula automáticamente; se conservan todos los intentos múltiples, se pueden modificar y eliminar; el cuaderno de errores resume el número de errores por «sesión + número de pregunta»; los datos se guardan en iCloud a través del endpoint
/examsdel backend (ver arriba), sin pérdidas entre navegadores/dispositivos; los registros antiguos de localStorage se migran automáticamente en la primera apertura
Pila técnica: Vite + ES Modules nativos · marked (renderizado Markdown), sin dependencias de frameworks. Más detalles en web/README.md.
Pruebas
uv run pytest # 全部(含真实 PDF 集成)
uv run pytest -m "not integration" # 仅纯单测(无需 PDF,秒级)Cobertura: filtrado de marcas de agua / reordenación de líneas / restauración de tablas / segmentación de puntos de conocimiento / clasificación / extracción de palabras clave / ida y vuelta sin truncamiento en DB / búsqueda FTS en chino e inglés / limpieza en cascada / reconstrucción reproducible de id / consultas / integración de extremo a extremo.
Las pruebas de integración necesitan un directorio de PDF, especificado con la variable de entorno GRAMMAR_TEST_PDF_DIR; si no se especifica o no existe, se omiten automáticamente.
Compromisos de diseño y límites conocidos
Tablas sin bordes: solo se restauran las tablas con reglas que pdfplumber pueda detectar por sus líneas; las pocas comparaciones multicolumna sin bordes se conservan como párrafos del cuerpo (la información no se pierde). En el futuro se puede añadir una detección de respaldo por "alineación de columnas por espacios".
Segmentación de puntos de conocimiento: heurística basada en maquetación uniforme; con maquetaciones especiales puede haber ligeras diferencias de fusión/división; se puede verificar con
search+kp.Importación de directorio = reconstrucción:
ingest <directorio>vacía y reconstruye la base de datos (id desde 1, reproducible); importar un único PDF solo actualiza esa sesión.
Available Tools
7 toolsfind_by_relationB
按关系类型查知识点,如 relation_type="主将从现"、"时态呼应"。
| Name | Required | Description | Default |
|---|---|---|---|
| relation_type | Yes |
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 indicates a read-like lookup ('查') but does not disclose permissions, side effects, result limits, or other behavioral traits; output schema handles return shape but not operational 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?
A single compact sentence that front-loads the action and includes examples. No wasted words.
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?
Output schema exists, so return values need not be described. But for a tool with no annotations and 0% schema coverage on its only parameter, the description leaves gaps: no sibling routing, no relation-type vocabulary, and no behavioral context.
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% and there is one required parameter. The description compensates partially by naming 'relation_type' and giving example values ('主将从现', '时态呼应'), but it does not define the valid relation-type set or format.
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?
States a clear verb-resource pair ('查知识点') with the filter ('按关系类型') and example relation values. However, it does not distinguish itself from sibling search_knowledge_points, so it falls short of a 5.
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 when-to-use, when-not-to-use, or alternative routing is provided. The relation-type filter is evident, but the agent is not told when this is preferable to search_knowledge_points.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_knowledge_pointA
按 id 获取单个知识点的完整 markdown(含解释、例句、表格、溯源)。
| Name | Required | Description | Default |
|---|---|---|---|
| kp_id | Yes |
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 burden. It usefully discloses the returned payload ('解释、例句、表格、溯源'), which adds value beyond the free-form object, and '获取' implies a read-only operation. It does not state permission requirements, behavior for a missing/invalid id, or failure modes.
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?
A single front-loaded sentence with no wasted words; the resource and the trigger condition (id) come first.
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?
A one-parameter read tool with an output schema, so return-value shape is already covered by structured data and the description appropriately summarizes payload content. The main gap is the absence of any comparison to the search 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% for the single kp_id parameter, which is typed only as an integer. The description partially compensates by indicating the parameter is a knowledge-point id ('按 id 获取单个知识点'), but adds no format, range, or resolution details.
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?
States a specific verb+resource: retrieve a single knowledge point's full markdown by id. The word '单个' (single) implicitly contrasts with the sibling search_knowledge_points, but the description never names that alternative, so sibling differentiation is left to inference.
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 phrase '按 id 获取' implies the prerequisite that a kp_id must already be known, which is useful routing context. However, it gives no explicit when-to-use vs search_knowledge_points or any exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lecture_markdownB
获取某讲的完整 markdown 讲义(标题/正文/表格已还原为 GFM)。
例如 number=25 返回"第二十五讲 动词时态3"的完整 md。
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes |
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 behavioral burden. It does not state whether this is read-only (though the name implies it), what happens if an invalid number is given, whether output is cached, or how errors are surfaced. The format detail (GFM conversion) is helpful, but overall behavioral disclosure is thin for a tool with zero annotation coverage.
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 short sentences that are front-loaded with the core purpose, followed by a concrete example. No wasted words. It could be slightly more structured (e.g., separating behavior notes), but it is efficient.
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?
An output schema exists, so the description need not explain return values. However, with no annotations and a 0%-coverage parameter schema, the description should compensate more by clarifying read-only nature, error handling, or the relationship to list_lectures. As is, it is minimally complete for a simple read-by-id tool.
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 there is only one parameter ('number'). The description adds meaning by giving a concrete example (number=25 -> lecture 25) and implying the parameter is the lecture number. This is better than nothing but not comprehensive, so a baseline 3 is appropriate for a single-param tool where the schema itself is silent.
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?
States a specific verb (get/获取) and resource (complete markdown lecture notes), with the format detail that tables are converted to GFM. This distinguishes it from list_lectures (which presumably enumerates) and get_knowledge_point (different resource). The purpose is clear, though it doesn't explicitly contrast with siblings.
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 example ('number=25 returns 第二十五讲 动词时态3') implicitly signals when to use it: when you need the full markdown of a specific lecture by number. However, there is no explicit when-to-use vs. alternatives guidance, no mention of prerequisites (e.g., you must first know the lecture number via list_lectures), and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lecturesA
列出已导入的全部讲次(讲号、标题、分类)。
| 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 behavioral burden. It discloses the returned fields and the 'all imported' scope, but does not mention ordering, permissions, pagination, or that the operation is read-only. For a simple zero-parameter list tool, this is minimally adequate.
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, compact sentence that front-loads the action and scope. Every element earns its place and there is no wasted text.
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, has an output schema covering return values, and zero parameters. The description states what is listed and what fields are included, making it nearly complete. Missing are explicit usage context and any safety/read-only note, but these are minor given the tool's simplicity.
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, so the baseline is 4. The description adds no parameter information, which is appropriate given there is nothing to document.
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 ('列出' / list) and resource ('讲次' / lectures), and states the scope ('已导入的全部' / all imported) plus returned fields (lecture number, title, category). It clearly distinguishes itself from sibling tools by domain, but does not explicitly name or contrast with alternatives.
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?
Usage is implied by the tool's nature: use it to get a full list of imported lectures. However, there is no explicit guidance on when to prefer this over sibling tools like search_knowledge_points, nor are any exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_markersA
列出标志词/关键词,可溯源到讲次。
默认返回所有时态关键词(category="时态")。 可用 tense 限定具体时态,如 tense="现在完成时"。
| Name | Required | Description | Default |
|---|---|---|---|
| tense | No | ||
| category | No | 时态 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 adds meaningful behavioral context by declaring the implicit default value of category, and the read-only nature is inferable from '列出'. However, it says nothing about auth needs, result size, or pagination, which remains a gap for an unannotated tool.
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 short lines, front-loaded with what the tool returns, then the default, then the narrowing option. Zero wasted text.
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?
An output schema exists, so return values need not be explained, and both parameters are addressed with defaults and an example. Only the missing enumeration of accepted values and any usage boundaries keep it from being fully 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 coverage is 0%, so the description must compensate, and it does: it documents the default for category ('默认返回所有时态关键词') and gives a concrete usage example for tense ('tense="现在完成时"'). It still omits the full set of valid tense values, so it is not exhaustive.
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?
States a specific verb + resource ('列出标志词/关键词') plus the traceability angle ('可溯源到讲次'), which clarifies what the listed markers link back to. It is clearly distinct from siblings like get_knowledge_point or list_lectures, though it never names an alternative to differentiate against.
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 discloses the default behavior (returns all tense keywords with category="时态") and how to narrow results via tense, which implies usage. But it never states when to prefer this over search_knowledge_points or find_by_relation, nor any exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_knowledge_pointsB
按关键词检索语法知识点。
参数: query: 关键词(中文或英文,如 "现在完成时"、"主将从现"、"since")。 category: 可选,限定大类:词法/句法/时态/语态/非谓语/综合复习。 limit: 最多返回条数。 返回:知识点列表(标题、所在讲次、分类、标签)。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| category | No |
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 does not disclose whether this is a safe read-only operation, whether it requires permissions, whether results are paginated, or how the search behaves (e.g., exact match vs full-text). The bare return format '知识点列表' is thin behavioral context.
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 response is front-loaded with the core purpose, followed by a structured parameter list and a brief return summary. It is compact and every sentence serves to clarify invocation. Slightly verbose in enumerating category values, but that is necessary for an agent to pick valid values.
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?
With no annotations and a 0% schema description coverage, the description steps in to cover all three parameters and the return shape, which is adequate. However, it does not describe pagination, ordering, or how to handle an empty result, leaving minor gaps for a search tool. Since an output schema exists, return values need not be fully explained, so the description's summary suffices.
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 each parameter: query is a keyword in Chinese or English with concrete examples ('现在完成时', 'since'), category limits to specific large classes (词法/句法/时态/语态/非谓语/综合复习), and limit controls the maximum number returned. This adds substantial meaning beyond the schema, though limit's type and default are only in the schema.
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 states a clear verb and resource: '按关键词检索语法知识点' (retrieve grammar knowledge points by keyword). It distinguishes from siblings like get_knowledge_point (singular retrieval) and list_lectures (a different resource), though it does not explicitly name them. The purpose is specific enough for an agent to know this is a search operation over knowledge points.
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?
Usage is implied by '按关键词检索' (search by keyword), but there is no explicit statement of when to use this tool versus alternatives such as get_knowledge_point or find_by_relation. The parameter descriptions hint at refining searches with category, but no exclusion conditions or preferred scenarios are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statsC
返回知识库统计(讲次/知识点/标志词数量,按类别分布)。
| 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?
With no annotations, the description must carry the full behavioral burden, yet it says nothing about whether results are cached, whether the operation is read-only, its cost, or how the category distribution is structured. For a zero-parameter aggregation endpoint these omissions matter.
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?
A single tight sentence that front-loads the verb and resource, with the enumerated metrics acting as scope. No filler, though it is terse to the point of under-specification.
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 existence of an output schema relieves the description of explaining return shapes, and there are no parameters to document. However, for a statistics endpoint over a complex knowledge base there is no mention of read-only behavior or when it should be preferred, leaving a gap given the absence of annotations.
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?
Parameter count is zero, so there are no parameter semantics to convey and the baseline is 4; the description correctly does not fabricate parameter discussion.
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?
States a specific action (return statistics) and resource (knowledge base) with enumerated sub-metrics (lecture/knowledge point/marker counts, distribution by category). This is clearer than a bare name but does not explicitly differentiate itself from siblings like list_lectures or list_markers, which also enumerate counts of the same entities.
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 on when to use this aggregation tool versus the sibling list_* tools that would return the underlying items. An agent must infer that this is the 'counts-only' option.
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.
7 tool updates
v0.2.0- First observed
find_by_relation - First observed
get_knowledge_point - First observed
get_lecture_markdown - First observed
list_lectures - First observed
list_markers - First observed
search_knowledge_points - First observed
stats
TDQS
Scored across 7 tools
Each tool has a clearly distinct retrieval purpose: search, get by id, get lecture markdown, list lectures, list markers, find by relation, and stats. Overlap between search_knowledge_points and list_markers is minimal because markers are a specific entity type with their own filters.
Most tools follow a consistent verb_noun pattern (search_, get_, list_, find_by_). 'stats' is a minor deviation as a bare noun, but the overall naming remains predictable and readable.
7 tools is well-scoped for a knowledge base retrieval server. Each tool serves a clear function without redundancy, fitting comfortably within the ideal 3-15 range.
Core retrieval operations are covered: search, get by id, get lecture, list lectures, list markers, find by relation, and stats. Minor gaps exist, such as no direct way to list all knowledge points without a search term or to filter markers by lecture, but agents can work around these.
Maintenance
Related MCP Connectors
Search, read, cite, create, and safely update a user's private KeepFlash knowledge library.
Query and audit AppSheet apps in natural language via Knotrik's pre-scanned definitions.
- docs2mcpOAuthcom.docs2mcp
Query your own PDFs and documents from any MCP client. Every answer cites the page it came from.
Read-only semantic search over Vedic scripture verses, commentaries, and recorded lectures.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables storage and retrieval of knowledge in a graph database format, allowing users to create, update, search, and delete entities and relationships in a Neo4j-powered knowledge graph through natural language.5-
- AlicenseNot gradedqualityDmaintenanceEnables intelligent search and question-answering over PDF documents using semantic similarity and keyword search. Supports OCR for scanned PDFs, persistent vector storage with ChromaDB, and maintains source tracking with page numbers.7MIT
- FlicenseCqualityBmaintenanceEnables academic literature management through PDF import, hybrid search, knowledge graph construction, and automated literature review generation. Combines full-text search with semantic vector search for comprehensive paper analysis.55-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and interact with a graph database of markdown notes, extracting entities like wikilinks, mentions, and hashtags.MIT