Skip to main content
Glama
kingcool0072000

grammar-kb-mcp

grammar-kb

A monorepo for English grammar teaching handouts — knowledge base + learning frontend — in two layers:

  • grammar_kb/ (Python backend): cleans and structures PDF textbooks/handouts into a searchable, traceable knowledge-point database — automatically removes watermarks, restores tables, splits knowledge points, extracts keywords and relations, stores them in local SQLite (FTS5 full-text search), and provides CLI, HTTP API, and MCP services.

  • web/ (Vite frontend): a student-facing learning interface — browse handouts by course / vocabulary / knowledge system, plus homework score records (CRUD, persisted on iCloud Drive, synced across devices).

Works with any teaching/technical PDF that has a "relatively uniform layout, header/footer watermarks, and tables".

Features

  • 🧹 Watermark removal: removes header/footer/slanted background watermarks by font + text direction (including PDF subset font prefixes)

  • 📊 Table restoration: automatically detects ruled tables and restores them as GFM Markdown tables

  • 🧩 Knowledge-point splitting: splits into independently searchable units by heading level (chapter/section/subsection/sub-item/example sentence/exercise)

  • 🏷️ Classification & relations: classifies by topic, extracts keywords/marker words and relations between knowledge points (e.g. "main-clause future, subordinate-clause present", "sequence of tenses")

  • 🎯 Exam signals: each knowledge point is tagged with exam dimensions (tense/voice/spelling/subordinate clause…), and supports "reverse lookup of knowledge points by exam signal"

  • 📖 Word list: generates a word list from the handout corpus (definition/part of speech/inflection/source traceability)

  • 🔍 Traceable: each knowledge point carries 讲次 · 节路径 · 页码 and can be located back to the original text

  • 🗄️ No truncation: body text is stored in SQLite TEXT (no length limit); FTS is used only for matching

  • 🌐 HTTP API: built-in REST service (FastAPI, with /docs interactive documentation)

  • 🔌 MCP ready: built-in MCP service; clients like Claude can query directly

Related MCP server: PDF RAG MCP Server

Quick Start

uv sync                          # 安装依赖(含开发依赖)
uv run grammar-kb ingest ./pdfs  # 导入一个 PDF 目录(全量重建,id 可复现)
uv run grammar-kb stats          # 查看统计

Haven't installed uv? Run curl -LsSf https://astral.sh/uv/install.sh | sh

Common Commands

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)

The default database is data/grammar.db in the run directory; you can override it with --db or the GRAMMAR_KB_DB environment variable.

Use a Prebuilt Dataset Directly (Optional)

If you don't want to ingest it yourself, download the matching grammar.db from GitHub Releases, place it at data/grammar.db (or specify a path with GRAMMAR_KB_DB) and query directly. The dataset version is indicated by the release tag (e.g. data-v1); the meta table in the database also records the version and generation time.

Architecture

PDF ──► pdf_parser   去水印(字体+方向过滤)+ 重排行 + 还原表格
      └─► structure    文本 → 大纲树 → 知识点切分(分类 + 关键词 + 关系)
                      └─► db          SQLite(lecture / knowledge_point / marker / relation / block + FTS5)
                                      └─► query  查询 API(CLI 与 MCP 共用)

Module

Responsibility

pdf_parser.py

fitz extracts spans (font/position/direction) → filters watermarks → reorders lines; pdfplumber restores tables on the filtered characters

structure.py

line classification (section/subsection/sub-item/example/exercise) → knowledge-point splitting

classify.py

classification rules, keyword dictionary, relation detection, exam signals (pure functions)

vocabulary.py

corpus-based word list (definition/part of speech/inflection)

markdown.py

tables → GFM, rendering of knowledge points and full lectures

db.py

schema + CRUD + FTS5(trigram, external-content), no truncation

query.py

call-oriented query API

ingest.py

PDF → database (directory import = full rebuild, reproducible ids)

exam_store.py

separate SQLite store for homework scores (CRUD; defaults to iCloud Drive)

cli.py

command line

server.py

HTTP service (optional extra)

mcp_server.py

MCP service (optional extra)

web/

learning frontend (Vite, see "Web Learning Frontend" below and web/README.md)


Database Schema (Summary)

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');

Customize Your Dataset

The tool is tuned by default for "uniformly formatted teaching handouts". When switching datasets, you usually only need to change three places (all in grammar_kb/):

  • Watermark fonts — WATERMARK_FONTS in pdf_parser.py: add your header/watermark font names. Quick script to diagnose fonts in a new PDF:

    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)"
  • Classification rules — _TITLE_RULES in classify.py: maps topic categories by title keywords.

  • Keyword dictionary — TENSE_MARKERS in classify.py (or a custom dictionary of the same kind).

  • Layout regexes — structure.py: if your heading levels use different markers (e.g. 一、 / (一)), adjust the corresponding regexes.

As an HTTP Service

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 8000

After starting, visit http://127.0.0.1:8000/docs to view the interactive API documentation. Endpoints:

Method

Path

Description

GET

/stats

Statistics and dataset metadata

GET

/lectures

Lecture list

GET

/lectures/{number}?format=markdown|html

Lecture content (with tables restored)

GET

/kp/{id}?format=markdown|html

A knowledge point

GET

/search?q=...&category=...&limit=...

Full-text search

GET

/markers?category=时态&tense=...

Marker words

GET

/relation?type=主将从现

Query by relation

GET

/exam-signals

All exam-signal dimensions

GET

/exam-signal?signal=时态

Reverse lookup of knowledge points by exam signal

GET

/vocabulary?limit=300&min_freq=2

Word list (definition/part of speech/inflection)

GET

/taxonomy

Knowledge-point topic tree (category → topic)

GET

/dict/{word}

Look up any word (ECDICT full dictionary)

GET/POST

/exams

Homework scores: list / add

PUT/DELETE

/exams/{id}

Homework scores: update / delete

Where Homework Score Data Is Stored

Scores are stored in a separate SQLite database (separate from the handout database data/grammar.db); the path is resolved in order:

  1. The GRAMMAR_KB_EXAM_DB environment variable

  2. iCloud Drive: ~/Library/Mobile Documents/com~apple~CloudDocs/grammar-kb/exam.db (when on macOS and iCloud is available) — the data is small, so it lives in the cloud and is synced across devices by iCloud

  3. Fallback data/exam.db

The database deliberately does not use WAL mode (a single self-contained file is more reliable for iCloud whole-file sync); after setting up this repo on another device and signing into the same iCloud account, starting the service reads the same scores.

Example:

curl "http://127.0.0.1:8000/search?q=现在完成时&limit=3"
curl "http://127.0.0.1:8000/lectures/25?format=html"

Unified response format: all endpoints return {code, message, data}.

// 成功(HTTP 200)
{ "code": 0, "message": "ok", "data": { "knowledge_points": 359, ... } }
// 错误(HTTP 与 code 一致)
{ "code": 404, "message": "第 99 讲不存在", "data": null }

CORS: all origins are allowed by default (Access-Control-Allow-Origin: *), so the frontend can make cross-origin calls directly. To tighten the whitelist: GRAMMAR_KB_CORS_ORIGINS=https://a.com,https://b.com grammar-kb-server.

As an MCP Service

uv sync --extra mcp
uv run grammar-kb-mcp

Exposed tools: search_knowledge_points, get_knowledge_point, get_lecture_markdown, list_lectures, list_markers, find_by_relation, stats. Each tool is a thin wrapper around Query.

Example Claude Desktop configuration:

{
  "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" }
    }
  }
}

Web Learning Frontend (web/)

A student-facing learning interface that depends on a locally running backend service (default http://127.0.0.1:8000``; during development, Vite proxies /api/*` to it).

# 终端 1:先起后端
uv sync --extra server && uv run grammar-kb-server

# 终端 2:再起前端
cd web && npm install && npm run dev     # http://localhost:5180

Features:

  • Browse by course: 48 lectures grouped by grammar system (morphology/tense/voice/non-finite verbs/syntax/comprehensive review); click to view the full lecture

  • Vocabulary: 600+ high-frequency words (definition/part of speech/inflection/source in handouts), filter by part of speech, search, sort

  • Knowledge system: 359 scattered knowledge points aggregated into a two-level tree of "grammar category → topic", with a fixed-collocation quick-reference table

  • 🎯 Exam signals (bidirectional): bidirectional jumps between knowledge points ↔ marker words/tenses — "seeing this word tells you which knowledge points are being tested"

  • 📝 Homework scores: one homework sheet per lecture (35 questions, full score 100). Click a question number to mark right/wrong, and the score is calculated automatically; all attempts are kept, editable and deletable; the mistake notebook aggregates error counts by "lecture + question number"; data is stored to iCloud via the backend /exams (see above), survives across browsers/devices, and old localStorage records are automatically migrated on first open

Tech stack: Vite + native ES Modules · marked (Markdown rendering), no framework dependencies. See web/README.md for more details.

Testing

uv run pytest                           # 全部(含真实 PDF 集成)
uv run pytest -m "not integration"      # 仅纯单测(无需 PDF,秒级)

Coverage: watermark filtering / line reordering / table restoration / knowledge-point splitting / classification / keyword extraction / DB no-truncation round-trip / FTS Chinese-English search / cascade cleanup / reproducible id rebuild / querying / end-to-end integration.

Integration tests require a PDF directory, specified via the GRAMMAR_TEST_PDF_DIR environment variable; if it is not set or does not exist, they are skipped automatically.

Design Trade-offs and Known Limitations

  • Borderless tables: only ruled tables that pdfplumber can detect via borders are restored; a few borderless multi-column comparisons are kept as body paragraphs (no information is lost). A fallback detection based on "column whitespace alignment" can be added later.

  • Knowledge-point splitting: heuristic based on uniform layout; unusual layouts may merge/split slightly differently, and you can double-check with search + kp.

  • Directory import rebuilds: ingest <目录> clears and rebuilds the database (ids start at 1 and are reproducible); importing a single PDF only updates that lecture.

Available Tools

7 tools
find_by_relationB

按关系类型查知识点,如 relation_type="主将从现"、"时态呼应"。

ParametersJSON Schema
NameRequiredDescriptionDefault
relation_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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(含解释、例句、表格、溯源)。

ParametersJSON Schema
NameRequiredDescriptionDefault
kp_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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。

ParametersJSON Schema
NameRequiredDescriptionDefault
numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

列出已导入的全部讲次(讲号、标题、分类)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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="现在完成时"。

ParametersJSON Schema
NameRequiredDescriptionDefault
tenseNo
categoryNo时态

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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: 最多返回条数。 返回:知识点列表(标题、所在讲次、分类、标签)。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

返回知识库统计(讲次/知识点/标志词数量,按类别分布)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

  1. 7 tool updatesv0.2.0
    • First observedfind_by_relation
    • First observedget_knowledge_point
    • First observedget_lecture_markdown
    • First observedlist_lectures
    • First observedlist_markers
    • First observedsearch_knowledge_points
    • First observedstats

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    7
    MIT
  • F
    license
    C
    quality
    B
    maintenance
    Enables 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
    -