MCP server for China Construction Enterprise Finance & Tax Skills — serves skill files via MCP tools
Server exposes 6 read-only tools with basic descriptions and input schemas. Tool names follow verb_noun convention (list_, get_, search_, find_). Descriptions are present but generic (avg ~80 chars, below 194-char baseline). Input schemas visible with type declarations, but parameter descriptions are minimal. No output schemas documented. No error handling guidance. No tool annotations (readOnlyHint, etc.). Composition is sound, tools are single-purpose and chainable via slug/intent IDs. Security is adequate for read-only operations, but no audit logging or rate limiting visible.
Find relevant skills for a given intent (e.g., 'quick-report', 'entity-diagnosis')
Retrieve the full content of a skill file by slug
Get the dependency tree for a skill (what it depends on, what depends on it)
List all available intents in the intent catalogue
List all available skills, optionally filtered by jurisdiction or category
Search skills by keyword across name, description, and frontmatter fields
No output schemas documented. LLMs cannot plan downstream tool calls or extract fields without knowing response structure.
Descriptions are generic and under 100 chars. E.g., 'List all available skills, optionally filtered by jurisdiction or category' lacks context on WHEN to use this vs search_skills, or what structure is returned.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only but this is not declared in the tool definition, forcing LLMs to infer safety from descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Parameter descriptions are minimal. E.g., 'jurisdiction' is described as 'Filter by jurisdiction (e.g., CN, GLOBAL)', no explanation of what jurisdictions are available or how they map to skills.
No error handling guidance. If a slug is not found, get_skill raises FileNotFoundError. LLMs need actionable recovery hints (e.g., 'Try search_skills() to find the correct slug').