Poetry MCP Server
Manages poetry catalogs stored in Obsidian vaults, providing tools for organizing poems through state-based tracking, thematic connections via nexuses, quality scoring, and submission tracking to literary venues.
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., "@Poetry MCP Servershow me poems with water imagery that are ready to submit"
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.
Poetry MCP Server
A Model Context Protocol (MCP) server for managing poetry catalogs, nexuses, and submissions.
Status: Core functionality complete - Catalog management, enrichment tools, and LLM-powered analysis operational
Overview
Poetry MCP is a specialized MCP server that treats poems as artifacts (not knowledge graph nodes), providing:
State-based catalog tracking (fledgeling → completed)
Thematic connections via "nexuses" (themes, motifs, forms)
Quality scoring on multiple dimensions
Submission tracking to literary venues
Influence lineage tracking
Architecture: No database - BASE files define VIEW DEFINITIONS (queries), actual data lives in markdown frontmatter. On startup, the MCP server scans poem files and loads frontmatter into Pydantic models in memory.
Three Types of Metadata
Poetry MCP uses three complementary ways to evaluate poems:
Type | What It Measures | Example |
Nexus (binary) | What does this poem contain? | Contains water imagery (yes/no) |
Quality (scalar) | What does this poem achieve? | Scores 8/10 on "Surprise" |
Influence (lineage) | Where does this poem come from? | Descended from William Bronk |
8 Universal Quality Dimensions: Detail, Life, Music, Mystery, Sufficient Thought, Surprise, Syntax, Unity. The MCP server provides grade_poem_quality() which returns poem content and quality rubrics for agent-based scoring (0-10 scale with reasoning).
Architectural Philosophy
Poetry workflow requires catalog-based tracking (poems as artifacts with states/metadata) rather than knowledge graph systems (atomic ideas with semantic links).
Why poems aren't notes:
Move through production states (fledgeling → completed)
Connect to thematic/formal nexuses (not logical relationships)
Get scored on quality dimensions (scalar ratings)
Have submission histories (transactions with venues)
Descend from influences (lineage, not logic)
Vault Directory Structure
The Poetry vault organizes poems and metadata across specialized directories:
/Poetry/
├── catalog/ # State-based poem organization (381 poems)
│ ├── catalog.base # View definition for all poems
│ ├── Completed/ # 49 poems
│ ├── Fledgelings/ # 172 poems
│ ├── Needs Research/# 10 poems
│ ├── Risks/ # 22 poems
│ └── Still Cooking/ # 65 poems
├── nexus/ # Thematic/formal connection points
│ ├── nexus.base # Registry of available nexuses
│ ├── themes/ # 17 thematic connections
│ ├── forms/ # 4 structural patterns
│ └── motifs/ # 4 compositional patterns
├── Qualities/ # 8 universal quality dimensions
│ └── qualities.base # Quality definitions and rubrics
├── influences/ # Writer/movement/aesthetic lineage
│ └── influences.base
├── techniques/ # Generative methods and processes
│ └── techniques.base
├── venues/ # Publication venue metadata (22 venues)
│ ├── venues.base # Venue registry (payment, response time, aesthetic)
│ └── [venue files] # Individual venue profiles
├── Submissions/ # Historical submission records
│ ├── Submissions.base # Submission tracking
│ └── [submission files] # Date_PoemTitle_VenueName.md
├── analysis/ # Research documents and comparisons
└── craft-notes/ # Personal aphorisms and principlesPersonal Directories: Users may create additional directories for personal workflow (e.g., journal/, scripts/, transitional poem collections). These are not indexed by the MCP server.
Nexus Taxonomy
Nexuses represent binary connections - a poem either contains a nexus or doesn't. The taxonomy has three categories:
Forms (4): Structural patterns defining how a poem is arranged (American Sentence, Free Verse, Prose Poem, Catalog Poem)
Themes (17): Subject matter and imagery systems (Water-Liquid Imagery, Body-Mouth, etc.)
Motifs (4): Cross-nexus compositional patterns requiring multiple themes (American Grotesque, Failed Transcendence, etc.)
Note: The specific nexuses evolve over time as new patterns emerge in the poetry practice. See nexus/ directory for current instances.
Architecture: Agent-Based Analysis
This MCP server follows the data provider pattern:
Server Responsibilities:
Catalog management (scan, index, search)
Data access (poems, nexuses, quality rubrics)
Data modification (update tags, move files)
Agent (Claude) Responsibilities:
Poetry analysis (theme detection)
Quality assessment (grading dimensions)
Batch processing (multiple poem analysis)
Why This Pattern?
✅ No API keys needed in server
✅ Server stays lightweight and data-focused
✅ Agent uses natural language understanding
✅ Transparent analysis (you see the reasoning)
✅ Flexible - agent can adjust analysis approach
Workflow:
1. Tool call → Server returns poem + analysis context
2. Agent analyzes data using natural language reasoning
3. Agent provides structured results (themes/scores/confidence)
4. User applies results with data modification toolsRequirements
Python 3.10 or higher
FastMCP 0.2.0+
Pydantic 2.0+
Note: No API keys needed! The MCP server provides data, your MCP client (Claude Desktop) performs analysis.
Development Setup
Installation
# Clone repository
git clone <repository-url>
cd poetry-mcp
# Install with dev dependencies
pip install -e ".[dev]"Running Tests
# Run all tests
pytest tests/
# Run with coverage
pytest tests/ --cov=poetry_mcp --cov-report=html
# Run specific test file
pytest tests/test_models.py -vCode Quality
# Format code
black src/ tests/
# Lint code
ruff check src/ tests/
# Type checking
mypy src/Project Structure
src/poetry_mcp/
├── __init__.py # Package metadata
├── server.py # FastMCP server entry point and tool registration
├── config.py # Configuration management
├── errors.py # Custom exceptions
├── models/ # Pydantic data models
│ ├── poem.py # Poem model with frontmatter
│ ├── nexus.py # Nexus and registry models
│ ├── results.py # Search and sync results
│ └── enrichment.py # LLM response models
├── parsers/ # BASE file and frontmatter parsers
│ ├── base_parser.py # Generic BASE file parser
│ ├── nexus_parser.py # Nexus registry loader
│ └── frontmatter.py # YAML frontmatter extraction
├── writers/ # Frontmatter modification tools
│ └── frontmatter_writer.py # Atomic frontmatter updates
├── catalog/ # Catalog management and indexing
│ ├── catalog.py # Main catalog class
│ └── index.py # In-memory search indices
└── tools/ # MCP tool implementations
└── enrichment_tools.py # All enrichment operations
tests/
├── conftest.py # Pytest fixtures
└── fixtures/ # Test data
├── base_files/ # Sample .base files
└── markdown/ # Sample poem files
docs/
├── CANONICAL_TAGS.md # Quick reference for all canonical tags (forms, themes, motifs)
└── FRONTMATTER_SCHEMA.md # Poem frontmatter property definitionsConfiguration
Configuration is loaded from ~/.config/poetry-mcp/config.yaml:
vault:
path: /path/to/Poetry
catalog_dir: catalog
nexus_dir: nexus
search:
default_limit: 20
case_sensitive: false
logging:
level: INFO
file: ~/.config/poetry-mcp/poetry-mcp.logMCP Client Setup
Poetry MCP implements the Model Context Protocol (MCP) standard and can be used with any MCP-compatible client.
Configuration Format
MCP clients typically use JSON configuration to connect to servers. Add this to your MCP client's config:
{
"mcpServers": {
"poetry-mcp": {
"command": "uv",
"args": [
"--directory",
"/path/to/poetry-mcp",
"run",
"poetry-mcp"
],
"env": {
"POETRY_VAULT_PATH": "/path/to/your/Poetry/vault"
}
}
}
}Alternative: Using python directly
If you have the package installed globally:
{
"mcpServers": {
"poetry-mcp": {
"command": "python",
"args": ["-m", "poetry_mcp.server"],
"env": {
"POETRY_VAULT_PATH": "/path/to/your/Poetry/vault"
}
}
}
}Client-Specific Setup
Claude Desktop:
Config location (macOS):
~/Library/Application Support/Claude/claude_desktop_config.jsonConfig location (Windows):
%APPDATA%\Claude\claude_desktop_config.jsonAfter updating config, restart Claude Desktop completely
Other MCP Clients:
Consult your client's documentation for config file location
Use the JSON format above with your specific vault path
Verification
After configuring your MCP client:
Restart the client application
Start a new conversation/session
Check that poetry-mcp tools are available
Try: "What poetry tools are available?"
Try: "Get catalog stats" - should show your poem count
Troubleshooting
Server won't start:
Verify
POETRY_VAULT_PATHpoints to correct directoryCheck the vault has a
catalog/subdirectoryReview client logs for error messages
No poems found:
Run
sync_catalogtool first to index poemsVerify vault path is correct
Check markdown files have proper frontmatter (see FRONTMATTER_SCHEMA.md)
Tools not appearing:
Completely restart your MCP client
Validate JSON config syntax
Verify
uvorpythonis in system PATH
Quick Start
Basic Usage
# Start the server (auto-syncs catalog on startup)
poetry-mcp start
# Or run directly with Python
python -m poetry_mcp.serverExample Workflows
Agent-Based Theme Analysis:
# 1. Server provides poem and theme data
data = await find_nexuses_for_poem("my-poem-id", max_suggestions=3)
# 2. Agent (Claude) analyzes the poem against available themes
# Agent sees:
# - data['poem']: {id, title, content, current_tags}
# - data['available_themes']: [{name, canonical_tag, description}, ...]
# - data['instructions']: Analysis guidance
# 3. Agent identifies matching themes with confidence:
# Example agent response:
# "This poem strongly engages with:
# - Water-Liquid (0.85): 'river flows through ancient stones'
# - Body-Bones (0.67): skeletal imagery in stanza 2"
# 4. User applies suggested tags
await link_poem_to_nexus("my-poem-id", "Water-Liquid", "theme")Batch Theme Discovery:
# 1. Get poems needing enrichment
data = await get_poems_for_enrichment(max_poems=10)
# 2. Agent analyzes data['poems'] against data['available_themes']
# Agent suggests themes for each poem
# 3. User applies high-confidence tags
for poem in analyzed_poems:
await link_poem_to_nexus(poem['id'], suggested_theme, "theme")Agent-Based Quality Grading:
# 1. Server provides poem and quality rubric
data = await grade_poem_quality("my-poem-id")
# 2. Agent grades data['poem'] on data['dimensions']
# Agent sees 8 quality dimensions with descriptions
# Agent provides scores 0-10 with evidence
# Example agent response:
# "Quality Assessment:
# - Detail: 8/10 - Strong sensory imagery ('ancient stones worn smooth')
# - Life: 6/10 - Adequate vitality but some static passages
# - Music: 9/10 - Excellent rhythm and sonic patterns"Maintenance:
# Sync wikilinks with tags
result = await sync_nexus_tags("my-poem-id", direction="both")
print(f"Tags added: {result['tags_added']}")
print(f"Links added: {result['links_added']}")
# Move poem to completed state
result = await move_poem_to_state("my-poem-id", "completed")
print(f"Moved to: {result['new_path']}")Available Tools
Catalog Management
sync_catalog - Scan vault and build in-memory catalog index
get_poem - Retrieve poem by ID or title
search_poems - Search with filters (query, states, forms, tags)
find_poems_by_tag - Find poems by tag combinations
list_poems_by_state - List poems in specific states
get_catalog_stats - Get catalog statistics and health metrics
get_server_info - Server status and configuration
Enrichment Tools
get_all_nexuses - Browse available themes, motifs, and forms
link_poem_to_nexus - Add nexus tags to poem frontmatter
sync_nexus_tags - Sync [[Nexus]] wikilinks with frontmatter tags
move_poem_to_state - Move poems between state directories
Agent Analysis Tools
These tools return data for YOUR (the agent's) analysis
find_nexuses_for_poem - Get poem + themes for agent to analyze and suggest matches
get_poems_for_enrichment - Get batch of poems for agent to analyze and suggest themes
grade_poem_quality - Get poem + quality rubric for agent to grade
Development Roadmap
Phase 0: Project Setup - Dependencies, structure, tooling
Phase 1: Core Data Models - Pydantic models for Poem, Nexus, Quality, etc.
Phase 2: Configuration System - YAML config loading and validation
Phase 3: BASE File Parser - Parse Obsidian YAML files
Phase 4: Catalog Management - Scan filesystem, index poems
Phase 5: MCP Tools Phase 1 - Core catalog/search tools
Phase 6: MCP Server Setup - FastMCP initialization and tool registration
Phase 7 (Sprint 1): Enrichment Foundation - Frontmatter writer, nexus registry
Phase 8 (Sprint 2): LLM Integration - Theme detection, batch enrichment
Phase 9 (Sprint 4): Maintenance Tools - Tag sync, state moves, quality grading
Phase 10 (Sprint 3): Advanced Discovery - Similarity search, cluster analysis
See IMPLEMENTATION_CHECKLIST.md for detailed progress tracking.
Data Synchronization
How BASE File Changes Work
Poetry MCP loads BASE files into memory as Pydantic models on startup. Understanding the sync behavior:
v1 (Current - Phases 0-6):
1. Server starts → Parse BASE files → Create Pydantic models in RAM
2. Models stay in memory during server lifetime
3. Edit BASE file in Obsidian → Models remain unchanged
4. Restart server → Re-parse BASE files → Fresh models loadedTo see your changes: Simply restart the MCP server (< 3 seconds). Claude Desktop will reconnect automatically.
Future Convenience Features (v2+)
Manual Reload Tool
Call from Claude when you've made BASE file changes:
# No server restart needed
reload_catalog()Benefits:
Instant refresh without disconnecting Claude
Selective reloading (only changed files)
Maintains conversation context
Automatic File Watching
Real-time synchronization using the watchdog library:
# config.yaml
performance:
watch_files: true
watch_debounce_seconds: 2.0Features:
Detects BASE file changes automatically
Debouncing (waits for all saves to complete)
Smart reload (only changed files)
Handles concurrent modifications safely
When you edit in Obsidian:
Save changes → File watcher detects change
Waits 2 seconds (Obsidian may save multiple files)
Reloads changed BASE files
Updates Pydantic models in memory
Changes visible in next Claude query
Why Not in v1?
Complexity trade-offs:
File watching adds dependencies (watchdog library)
Requires debouncing logic (multiple rapid saves)
Needs concurrent modification handling
Adds error recovery complexity
Current approach prioritizes:
✅ Simple implementation for Phases 0-6
✅ Fast manual restart (2-3 seconds total)
✅ Reliable data consistency
✅ Easier debugging during development
v2 can add these features based on user feedback.
License
MIT
Available Tools
14 toolsfind_nexuses_for_poemA
Prepare poem and theme data for analysis by the MCP agent.
Returns poem content and available themes for YOU (the agent) to analyze. YOU identify which themes match the poem and provide confidence scores.
Args: poem_id: Poem identifier (ID or title) max_suggestions: Maximum number of theme suggestions requested
Returns: Dictionary with: - poem: Poem data (title, content, current_tags) - available_themes: Theme options with descriptions - instructions: Analysis guidance
Example workflow: ``` # 1. Get data for analysis data = await find_nexuses_for_poem("antlion", max_suggestions=3)
# 2. YOU analyze data['poem'] against data['available_themes']
# 3. YOU identify matching themes with confidence scores
# 4. User applies tags with link_poem_to_nexus()
```| Name | Required | Description | Default |
|---|---|---|---|
| poem_id | Yes | ||
| max_suggestions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns data for analysis (read-only behavior) and outlines the expected workflow, but doesn't mention potential limitations like rate limits, authentication needs, or error conditions. The description adds useful context about the analysis process but lacks comprehensive behavioral details.
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 well-structured with clear sections: purpose statement, returns explanation, args documentation, and example workflow. Every sentence serves a purpose, though the workflow example is somewhat lengthy. The information is front-loaded with the core purpose stated 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?
Given the tool's moderate complexity (2 parameters, analysis preparation purpose) and the presence of an output schema, the description is reasonably complete. It explains the tool's role in the workflow, documents parameters, and describes what the agent should do with the results. The output schema likely covers return structure details, so the description appropriately focuses on usage 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 description coverage is 0%, so the description must compensate. It explains both parameters: 'poem_id' as 'Poem identifier (ID or title)' and 'max_suggestions' as 'Maximum number of theme suggestions requested'. This adds meaningful semantics beyond the bare schema, though it doesn't provide format details or constraints for 'poem_id'.
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 purpose with specific verbs ('prepare poem and theme data for analysis') and resources ('poem content and available themes'). It distinguishes from siblings like 'get_poem' by emphasizing the analysis preparation aspect and explicitly mentions the agent's role in analyzing themes, which sets it apart from simple data retrieval tools.
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 on when to use this tool: to prepare data for theme analysis, with an example workflow showing it's the first step before using 'link_poem_to_nexus'. It doesn't explicitly state when NOT to use it or name alternatives, but the workflow implies it's for analysis preparation rather than direct tagging or retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_poems_by_tagC
Find poems by tags.
Args: tags: List of tags to match match_mode: "all" (poems must have all tags) or "any" (at least one tag) states: Optional filter by states limit: Maximum number of results
Returns: List of matching poems
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | ||
| match_mode | No | all | |
| states | No | ||
| limit | 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 of behavioral disclosure. It mentions the tool 'Returns: List of matching poems' but lacks critical details: whether this is a read-only operation (implied by 'Find' but not explicit), pagination behavior (only 'limit' is mentioned), error handling, or performance characteristics like rate limits. For a tool with 4 parameters and no annotation coverage, this is insufficient.
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 appropriately sized and well-structured: it starts with a clear purpose statement, followed by an 'Args:' section listing parameters with brief semantics, and ends with a 'Returns:' statement. Each sentence earns its place, though the 'Args:' and 'Returns:' labels add minor redundancy. It could be slightly more front-loaded by integrating parameter hints into the opening sentence.
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 moderate complexity (4 parameters, no annotations, but with an output schema), the description is partially complete. The output schema exists, so the description doesn't need to detail return values. However, it lacks behavioral context (e.g., safety, performance) and usage guidelines compared to siblings. With 0% schema description coverage, the parameter explanations help but don't fully compensate for missing behavioral transparency.
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 lists all 4 parameters with brief explanations: 'tags: List of tags to match', 'match_mode: "all" (poems must have all tags) or "any" (at least one tag)', 'states: Optional filter by states', and 'limit: Maximum number of results'. This adds meaning beyond the bare schema (e.g., clarifying match_mode options), but it doesn't explain parameter interactions, constraints (e.g., tag format), or default behaviors beyond what's 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 clearly states the tool's purpose: 'Find poems by tags' specifies both the verb ('Find') and resource ('poems'), with the mechanism ('by tags') providing additional specificity. It distinguishes from siblings like 'list_poems_by_state' (which filters by state rather than tags) and 'search_poems' (which likely uses different search criteria). However, it doesn't explicitly contrast with all siblings, preventing a perfect score.
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 no guidance on when to use this tool versus alternatives. It doesn't mention siblings like 'list_poems_by_state' (for state-based filtering) or 'search_poems' (which might support broader search capabilities), nor does it specify prerequisites or exclusions. The only implied usage is tag-based poem retrieval, but this is already covered in purpose clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_nexusesA
Get all nexuses (themes/motifs/forms) from the registry.
Returns complete registry with all nexus entries, organized by category. Use this to discover available themes, motifs, and forms for tagging poems.
Returns: NexusRegistry with themes, motifs, and forms
Example:
Get all available themes:
registry = await get_all_nexuses() for theme in registry.themes: print(f"{theme.name} → #{theme.canonical_tag}")
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| forms | No | Form nexuses (structural patterns) |
| motifs | No | Motif nexuses (compositional patterns) |
| themes | No | Thematic nexuses (imagery systems, subjects) |
| total_count | Yes | Total number of nexuses across all categories |
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 describes the return structure ('complete registry with all nexus entries, organized by category') and includes an example, but lacks details on potential limitations like rate limits, authentication needs, or error handling. It does not contradict any annotations.
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 purpose, followed by usage guidance, return details, and an example. It is appropriately sized, but the example could be slightly more concise. Most sentences add value, with minimal waste.
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 low complexity (0 parameters, simple read operation), the description provides complete context: purpose, usage, return structure, and an example. The presence of an output schema means return values need not be detailed, and the description adequately covers what's needed for a straightforward registry retrieval 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?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately focuses on output and usage without redundant parameter details, earning a baseline score of 4 for effectively handling a parameter-less tool.
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 verb ('Get') and resource ('all nexuses'), specifies what nexuses are ('themes/motifs/forms'), and distinguishes from siblings by indicating this retrieves the complete registry for discovery purposes, unlike tools like 'find_nexuses_for_poem' or 'link_poem_to_nexus' that focus on specific poems or tagging.
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 explicitly states when to use it ('Use this to discover available themes, motifs, and forms for tagging poems'), providing clear context. However, it does not specify when not to use it or name alternatives among siblings, such as 'find_nexuses_for_poem' for poem-specific queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_catalog_statsC
Get catalog statistics.
Returns: CatalogStats with counts, metrics, and health information
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| by_form | Yes | Count of poems by form |
| by_state | Yes | Count of poems by state |
| last_sync | No | Timestamp of last catalog sync |
| newest_poem | Yes | Title of most recently created poem |
| oldest_poem | Yes | Title of oldest poem |
| total_poems | Yes | Total number of poems in catalog |
| avg_word_count | Yes | Average word count per poem |
| total_word_count | Yes | Total words across all poems |
| poems_without_tags | Yes | Number of poems with no tags |
| poems_missing_frontmatter | No | Number of poems with incomplete frontmatter |
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 mentions the return type 'CatalogStats with counts, metrics, and health information', which adds some behavioral context about output structure. However, it doesn't disclose critical traits like whether this is a read-only operation, performance implications, or error conditions, which are important for a tool with no 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?
The description is appropriately sized with two sentences: one stating the purpose and another detailing the return structure. It's front-loaded with the main action and avoids redundancy, though it could be slightly more structured for clarity.
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 0 parameters, an output schema exists (which covers return values), and no annotations, the description is minimally adequate. It states the purpose and return type, but for a tool in a context with many siblings, it lacks differentiation and behavioral details that would make it more complete for agent use.
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 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description doesn't need to add parameter information, and it doesn't introduce any confusion. Baseline is 4 for zero parameters, as it appropriately avoids unnecessary 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?
The description states the tool 'Get catalog statistics' which is a clear verb+resource combination, but it's vague about what 'catalog statistics' specifically entails compared to siblings like 'get_server_info' or 'sync_catalog'. It doesn't distinguish itself from potential overlaps with other tools that might provide statistical or health information.
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. With siblings like 'get_server_info' and 'sync_catalog' that might offer related information, the description lacks any context about use cases, prerequisites, or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_poemC
Get a poem by ID or title.
Args: identifier: Poem ID or exact title include_content: Whether to include full poem text
Returns: Poem object or None if not found
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | ||
| include_content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that the tool returns 'Poem object or None if not found', which adds some context on error handling. However, it lacks details on permissions, rate limits, side effects, or what the 'Poem object' entails (e.g., structure, fields). For a read operation with zero annotation coverage, this is minimal but not sufficient.
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 appropriately sized and front-loaded: the first sentence states the core purpose, followed by structured sections for args and returns. Each sentence adds value, with no redundant information. It could be slightly more concise by integrating the sections, but overall it's efficient and well-organized.
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 moderate complexity (2 parameters, no annotations, but has an output schema), the description is partially complete. The output schema likely covers return values, so the description doesn't need to detail the 'Poem object'. However, it lacks usage guidelines and full behavioral context, making it adequate but with clear gaps for effective tool selection.
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 that 'identifier' can be 'Poem ID or exact title', adding meaning beyond the schema's string type. For 'include_content', it clarifies 'Whether to include full poem text', which is useful. However, it doesn't cover nuances like case-sensitivity for titles or default behavior, leaving some gaps given the 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 states the tool's purpose: 'Get a poem by ID or title.' It specifies the verb ('Get') and resource ('poem'), and distinguishes it from siblings like 'search_poems' or 'list_poems_by_state' by focusing on retrieval via specific identifier. However, it doesn't explicitly differentiate from 'find_poems_by_tag' or 'get_poems_for_enrichment', which might also retrieve poems, so it's not fully sibling-distinctive.
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 no guidance on when to use this tool versus alternatives. It doesn't mention scenarios like preferring 'search_poems' for fuzzy matching, 'list_poems_by_state' for filtered lists, or 'find_poems_by_tag' for tag-based retrieval. There's no context on prerequisites or exclusions, leaving the agent to infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_poems_for_enrichmentA
Get batch of poems needing theme enrichment for agent analysis.
Returns poems with minimal or no tags for YOU (the agent) to analyze. YOU suggest which themes apply to each poem.
Args: poem_ids: List of poem IDs (None = all untagged/lightly-tagged poems) max_poems: Maximum poems to return (default 50)
Returns: Dictionary with: - poems: List of poem data (id, title, content, current_tags) - available_themes: Theme options with descriptions - instructions: Batch analysis guidance
Example workflow: ``` # 1. Get poems needing enrichment data = await get_poems_for_enrichment(max_poems=10)
# 2. YOU analyze data['poems'] against data['available_themes']
# 3. YOU suggest 1-3 themes for each poem with confidence scores
# 4. User applies high-confidence tags with link_poem_to_nexus()
```| Name | Required | Description | Default |
|---|---|---|---|
| poem_ids | No | ||
| max_poems | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does well: it explains the tool returns poems for agent analysis, specifies the return structure (poems, available_themes, instructions), and mentions the default behavior (max_poems=50). However, it doesn't cover potential rate limits, authentication needs, or error conditions, leaving some behavioral aspects unspecified.
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 well-structured and front-loaded: the first sentence states the purpose, followed by key details (returns, args, returns), and ends with a practical example workflow. Every sentence adds value, with no redundancy or fluff, making it efficient for agent comprehension.
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 complexity (batch retrieval for analysis), no annotations, and an output schema (which covers return values), the description is complete: it explains purpose, usage, parameters, return structure, and provides an example workflow. This adequately guides the agent without needing to repeat output schema 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 fully. It does: it explains poem_ids as 'List of poem IDs (None = all untagged/lightly-tagged poems)' and max_poems as 'Maximum poems to return (default 50)', adding crucial meaning beyond the bare schema. The example workflow further clarifies 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 clearly states the tool's purpose: 'Get batch of poems needing theme enrichment for agent analysis.' It specifies the verb ('Get'), resource ('poems'), and qualifying condition ('needing theme enrichment'), distinguishing it from siblings like get_poem (single poem) or find_poems_by_tag (already tagged).
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 explicitly states when to use this tool: for poems with 'minimal or no tags' that need theme analysis by the agent. It provides an example workflow showing this tool as step 1, followed by agent analysis and linking with link_poem_to_nexus, clearly differentiating it from sibling tools that retrieve already-tagged poems or manage states.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoB
Get server information and status.
Returns: Dictionary with server metadata
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 of behavioral disclosure. It mentions the return type ('Dictionary with server metadata'), which adds some value, but fails to cover critical aspects like whether this is a read-only operation, authentication requirements, rate limits, or error conditions. For a tool with zero annotation coverage, this is a significant gap.
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 appropriately sized with two sentences: the first states the purpose, and the second specifies the return type. It's front-loaded and wastes no words, though the second sentence could be slightly more integrated for perfect structure.
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 (0 parameters, output schema exists), the description is minimally adequate. It explains what the tool does and the return format, but with no annotations and siblings that might overlap, it lacks context on behavioral traits and usage distinctions, leaving room for improvement.
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 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description doesn't need to add parameter semantics, and it appropriately avoids discussing parameters, earning a high baseline score for not introducing unnecessary information.
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 purpose with a specific verb ('Get') and resource ('server information and status'), making it immediately understandable. However, it doesn't differentiate this from sibling tools like 'get_catalog_stats' or 'sync_catalog' that might also provide server-related information, preventing a perfect score.
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 no guidance on when to use this tool versus alternatives. With siblings like 'get_catalog_stats' that might overlap in functionality, there's no explicit or implied context for choosing this tool, leaving the agent without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grade_poem_qualityA
Prepare poem and quality rubric for grading by the MCP agent.
Returns poem content and quality dimension descriptions for YOU (the agent) to grade. YOU provide scores (0-10) and reasoning for each dimension.
8 Quality Dimensions:
Detail: Vividness and specificity of imagery
Life: Living, breathing quality and vitality
Music: Sound quality and rhythmic elements
Mystery: Ambiguity, layers, reader engagement
Sufficient Thought: Intellectual depth and insight
Surprise: Unexpected elements, fresh perspectives
Syntax: Sentence structure and line breaks
Unity: Coherence and wholeness
Args: poem_id: Poem identifier (ID or title) dimensions: Optional list of specific dimensions to grade (default: all 8)
Returns: Dictionary with: - poem: Poem data (title, content) - dimensions: Quality dimensions with descriptions - instructions: Grading guidance
Example workflow: ``` # 1. Get poem and rubric data = await grade_poem_quality("antlion")
# 2. YOU grade data['poem'] on data['dimensions']
# 3. YOU provide scores 0-10 with reasoning for each dimension
# - 0-3: Absent/poor
# - 4-6: Adequate
# - 7-8: Strong
# - 9-10: Exceptional
```| Name | Required | Description | Default |
|---|---|---|---|
| poem_id | Yes | ||
| dimensions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly describes what the tool returns (poem data, dimensions, instructions) and the grading workflow, but doesn't mention potential limitations like error handling, authentication needs, or rate limits. The behavioral information is adequate but not comprehensive.
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 well-structured with clear sections (purpose, dimensions list, args, returns, workflow) but could be more concise. The 8 dimensions list and detailed example workflow are valuable but make it somewhat lengthy. Every sentence serves a purpose, but some information could be more efficiently presented.
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 complexity (preparing grading materials with 8 quality dimensions) and the presence of an output schema, the description provides good context. It explains the grading dimensions, parameters, return structure, and workflow. The output schema means it doesn't need to detail return values, but it still provides helpful context about the grading process.
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?
With 0% schema description coverage, the description must compensate for the schema's lack of parameter documentation. It explains both parameters: 'poem_id' as 'Poem identifier (ID or title)' and 'dimensions' as 'Optional list of specific dimensions to grade (default: all 8)'. It also lists the 8 possible dimensions, providing essential context missing from 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 clearly states the tool's purpose with specific verbs ('prepare poem and quality rubric for grading') and resources ('poem content and quality dimension descriptions'). It distinguishes itself from sibling tools like 'get_poem' by emphasizing the grading preparation aspect rather than just retrieval.
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 explicit guidance on when to use this tool versus alternatives through the example workflow, which shows it's for preparing grading materials. It implicitly distinguishes from siblings like 'get_poem' (which just retrieves poems) and 'search_poems' (which searches without grading context).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_poem_to_nexusA
Link a poem to a nexus by adding the nexus's canonical tag.
Safely updates the poem's tags field in frontmatter, preserving all other fields. Creates a backup before modification. Automatically resyncs catalog after update.
Args: poem_id: Poem identifier (ID or title) nexus_name: Name of nexus to link (e.g., "Water-Liquid", "Childhood") nexus_type: Type of nexus (theme/motif/form), defaults to "theme"
Returns: Dictionary with operation details including success status
Example:
Link a poem to a theme:
result = await link_poem_to_nexus( poem_id="antlion", nexus_name="Water-Liquid", nexus_type="theme" ) print(f"Added tag: {result['tag_added']}")
| Name | Required | Description | Default |
|---|---|---|---|
| poem_id | Yes | ||
| nexus_name | Yes | ||
| nexus_type | No | theme |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 does well by disclosing key behavioral traits: it 'safely updates' and 'preserves all other fields', 'creates a backup before modification', and 'automatically resyncs catalog after update'. This covers safety, mutation effects, and side-effects, though it could mention permissions or error handling.
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 appropriately sized and front-loaded: the first sentence states the purpose, followed by behavioral details, then parameter explanations, return value, and an example. Every sentence adds value with zero waste, making it easy to scan and understand.
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 3 parameters with 0% schema coverage, no annotations, and an output schema (implied by 'Returns' statement), the description is mostly complete. It covers purpose, behavior, parameters, and returns, but could improve by mentioning error cases or linking to sibling tools for context, though the output schema reduces the need for return value 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 adds meaning by explaining 'poem_id' as 'Poem identifier (ID or title)', 'nexus_name' with examples ('Water-Liquid', 'Childhood'), and 'nexus_type' with default and allowed values ('theme/motif/form'). This clarifies beyond the bare schema, though it doesn't detail format constraints for 'poem_id'.
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 specific action ('Link a poem to a nexus by adding the nexus's canonical tag'), identifies the resource ('poem'), and distinguishes it from sibling tools like 'sync_nexus_tags' or 'find_nexuses_for_poem' by focusing on the linking operation rather than synchronization or querying.
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 through the example (linking a poem to a theme) but does not explicitly state when to use this tool versus alternatives like 'sync_nexus_tags' or 'move_poem_to_state'. It provides context but lacks explicit guidance on exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_poems_by_stateB
List poems in a specific state.
Args: state: State to filter by (completed, fledgeling, still_cooking, etc.) sort_by: Field to sort by (title, created_at, updated_at, word_count) limit: Maximum number of results
Returns: List of poems in the specified state
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | ||
| sort_by | No | title | |
| limit | 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 full burden. It mentions the tool 'List poems' but doesn't disclose behavioral traits like whether this is a read-only operation, if it requires authentication, rate limits, pagination behavior, or what happens with invalid states. The description is minimal and lacks critical operational 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 description is efficiently structured with a clear purpose statement followed by organized sections for Args and Returns. Every sentence adds value: the first states the purpose, and the subsequent lines explain parameters and return value without redundancy. It's appropriately sized and front-loaded.
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 3 parameters with 0% schema coverage and no annotations, the description partially compensates by explaining parameter semantics. However, it lacks behavioral transparency details (e.g., read-only nature, error handling). The output schema exists, so return values don't need explanation, but overall completeness is moderate due to missing operational 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 description coverage is 0%, so the description must compensate. It provides semantic meaning for all three parameters: 'state' (filter by state with examples), 'sort_by' (field to sort by with options), and 'limit' (maximum results). This adds valuable context beyond the bare schema, though it doesn't specify format details like state enum values or limit ranges.
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 purpose: 'List poems in a specific state.' It specifies the verb ('List') and resource ('poems') with a filtering condition ('in a specific state'). However, it doesn't explicitly differentiate from siblings like 'find_poems_by_tag' or 'search_poems' beyond the state filtering aspect.
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 no guidance on when to use this tool versus alternatives. With siblings like 'find_poems_by_tag', 'search_poems', and 'get_poems_for_enrichment', there's no indication of when state-based filtering is preferred over other filtering methods or what prerequisites might exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_poem_to_stateA
Move a poem to a different state directory and update frontmatter.
Moves the poem file between state directories (Completed, Fledgelings, etc.) and updates the frontmatter state field. Handles backup files automatically.
Args: poem_id: Poem identifier (ID or title) new_state: Target state (completed, fledgeling, still_cooking, etc.)
Returns: Dictionary with move operation results
Example:
Promote a poem to completed:
result = await move_poem_to_state( poem_id="antlion", new_state="completed" ) print(f"Moved from {result['old_state']} to {result['new_state']}") print(f"New path: {result['new_path']}")
| Name | Required | Description | Default |
|---|---|---|---|
| poem_id | Yes | ||
| new_state | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: it moves files between directories, updates frontmatter, and handles backup files automatically. However, it lacks details on error handling, permissions needed, or rate limits, which would be beneficial for a mutation 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?
The description is well-structured with a clear purpose statement, bullet points for args and returns, and a practical example. It is appropriately sized, though the example could be slightly more concise. Every sentence adds value, with 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 complexity (mutation with file operations), no annotations, and an output schema present, the description is mostly complete. It covers purpose, parameters, and example usage, but could improve by addressing error cases or integration with sibling tools. The output schema reduces the need to detail return values.
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 description coverage is 0%, so the description must compensate fully. It clearly explains both parameters: 'poem_id' as 'Poem identifier (ID or title)' and 'new_state' as 'Target state (completed, fledgeling, still_cooking, etc.)', including examples of state values. This adds essential meaning beyond the bare 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 clearly states the specific action ('Move a poem to a different state directory and update frontmatter'), identifies the resource ('poem file'), and distinguishes it from siblings by focusing on state transitions rather than searching, linking, or grading operations. It explicitly mentions moving between specific state directories like 'Completed' and 'Fledgelings'.
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 context through the example ('Promote a poem to completed') and mentions state directories, but it does not explicitly state when to use this tool versus alternatives like 'list_poems_by_state' or 'get_poem'. No exclusions or prerequisites are provided, leaving some ambiguity about appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_poemsB
Search for poems matching criteria.
Args: query: Text to search for in titles, content, and notes states: Filter by states (e.g., ["completed", "fledgeling"]) forms: Filter by forms (e.g., ["free_verse", "prose_poem"]) tags: Filter by tags (poems must have all specified tags) limit: Maximum number of results to return include_content: Whether to include full poem text in results
Returns: SearchResult with matched poems and query metadata
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| states | No | ||
| forms | No | ||
| tags | No | ||
| limit | No | ||
| include_content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| poems | Yes | List of poems matching search criteria |
| query_time_ms | Yes | Time taken to execute query in milliseconds |
| total_matches | Yes | Total number of poems matching query (may be > len(poems) if limited) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It mentions the return type ('SearchResult') but doesn't disclose pagination, rate limits, authentication needs, error conditions, or whether this is a read-only operation. The description is functional but lacks critical operational 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 description is efficiently structured with a clear purpose statement followed by well-organized Args and Returns sections. Every sentence adds value—no fluff or repetition. It's appropriately sized for a 6-parameter search tool.
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 6 parameters with 0% schema coverage and no annotations, the description does a decent job explaining parameters and mentions the return type. However, for a search tool with many sibling alternatives and no behavioral annotations, it should provide more guidance on usage context and operational limits to be 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 description coverage is 0%, but the description compensates well by explaining all 6 parameters with clear semantics: what each filters, examples for states/forms, tag logic ('must have all'), and purpose of include_content. It adds meaningful context beyond the bare schema types, though some details like exact format expectations remain unspecified.
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 purpose as 'Search for poems matching criteria,' which is a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'find_poems_by_tag' or 'list_poems_by_state,' which appear to offer more specialized search capabilities.
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 no guidance on when to use this tool versus alternatives like 'find_poems_by_tag' or 'list_poems_by_state.' It mentions criteria but doesn't explain trade-offs, prerequisites, or comparative advantages with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_catalogA
Synchronize catalog from filesystem.
Scans all markdown files in catalog/ directory and builds in-memory indices. This should be called before using other catalog tools.
Args: force_rescan: If True, rescan all files even if already loaded
Returns: SyncResult with statistics about the sync operation
| Name | Required | Description | Default |
|---|---|---|---|
| force_rescan | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| warnings | No | List of warning messages encountered during sync |
| new_poems | Yes | Number of new poems discovered in this sync |
| total_poems | Yes | Total number of poems in catalog after sync |
| skipped_poems | No | Number of poems skipped due to parse errors |
| updated_poems | Yes | Number of existing poems with updated metadata |
| duration_seconds | Yes | Time taken for sync operation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the tool's action (scanning files, building indices) and prerequisite nature, though it lacks details on error handling, performance implications, or side effects beyond the sync operation. No contradictions exist.
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 purpose, followed by usage guidelines and parameter/return details in a structured format. Every sentence adds value without redundancy, making it efficient and easy to parse.
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 complexity (prerequisite sync operation), no annotations, and an output schema (implied by 'Returns'), the description is mostly complete. It covers purpose, usage, parameters, and returns, but could benefit from more behavioral context like error scenarios or performance notes.
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 single parameter 'force_rescan' with its effect ('rescan all files even if already loaded'), adding meaningful context beyond the schema's type and default. However, it doesn't cover edge cases or examples.
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 specific action ('Synchronize catalog from filesystem') and resource ('catalog'), distinguishing it from sibling tools like 'get_catalog_stats' or 'sync_nexus_tags'. It explicitly mentions scanning markdown files in the catalog/ directory and building in-memory indices, providing a precise operational 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?
The description explicitly states 'This should be called before using other catalog tools,' providing clear when-to-use guidance. It distinguishes this tool as a prerequisite for operations like 'find_poems_by_tag' or 'search_poems,' with no misleading exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_nexus_tagsA
Synchronize [[Nexus]] links in poem body with frontmatter tags.
Analyzes the poem's content for [[Nexus Name]] wikilinks and syncs them with the frontmatter tags field. Can sync in either direction or both.
Args: poem_id: Poem identifier (ID or title) direction: Sync direction - "links_to_tags", "tags_to_links", or "both"
Returns: Dictionary with sync results and any conflicts found
Example:
Sync wikilinks to tags:
result = await sync_nexus_tags( poem_id="antlion", direction="links_to_tags" ) print(f"Tags added: {result['tags_added']}") print(f"Conflicts: {result['conflicts']}")
| Name | Required | Description | Default |
|---|---|---|---|
| poem_id | Yes | ||
| direction | No | both |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It describes the core synchronization behavior and mentions conflict detection ('any conflicts found'), but doesn't address important behavioral aspects like whether this operation is idempotent, what permissions are required, whether it modifies the original poem file, or what happens with malformed wikilinks. It provides basic operational transparency but misses key implementation details.
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 well-structured and appropriately sized. It begins with a clear purpose statement, follows with parameter explanations, return value description, and a practical example. Every sentence adds value, with no redundant information. The example is particularly helpful for understanding tool usage without being verbose.
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 moderate complexity (bidirectional synchronization with conflict detection), no annotations, and the presence of an output schema (which handles return value documentation), the description provides good contextual coverage. It explains the synchronization logic, parameters, and includes a helpful example. The main gap is lack of behavioral details about file modification, permissions, and error handling that would be important for a mutation 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?
With 0% schema description coverage, the description must fully compensate for the lack of schema documentation. It successfully explains both parameters: 'poem_id' as 'Poem identifier (ID or title)' and 'direction' with its three specific values and default of 'both'. The description adds meaningful context about what these parameters control, though it could provide more detail about poem_id format expectations.
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 specific action ('synchronize'), target resource ('Nexus links in poem body with frontmatter tags'), and mechanism ('analyzes the poem's content for [[Nexus Name]] wikilinks'). It distinguishes this tool from siblings like 'link_poem_to_nexus' (which creates individual links) and 'sync_catalog' (which likely operates at catalog level rather than poem-level synchronization).
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 about when to use this tool ('syncs them with the frontmatter tags field') and mentions three specific direction options, but doesn't explicitly state when to choose each direction or when to use alternatives like 'link_poem_to_nexus' for manual linking versus automated synchronization. It gives operational context but lacks comparative guidance against sibling tools.
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.
14 tool updates
v1.0.0- First observed
find_nexuses_for_poem - First observed
find_poems_by_tag - First observed
get_all_nexuses - First observed
get_catalog_stats - First observed
get_poem - First observed
get_poems_for_enrichment - First observed
get_server_info - First observed
grade_poem_quality - First observed
link_poem_to_nexus - First observed
list_poems_by_state - First observed
move_poem_to_state - First observed
search_poems - First observed
sync_catalog - First observed
sync_nexus_tags
TDQS
Most tools have distinct purposes, but some overlap exists: find_nexuses_for_poem and get_poems_for_enrichment both prepare poems for theme analysis by the agent, differing mainly in single vs. batch processing. Similarly, get_poem and list_poems_by_state both retrieve poems but with different filtering approaches. The descriptions help clarify these distinctions, preventing major confusion.
All tools follow a consistent snake_case verb_noun pattern with clear, descriptive names. Verbs like get, find, list, sync, link, move, grade, and search are used appropriately and predictably throughout the set. There are no deviations in naming conventions, making the tool set highly readable and intuitive.
With 14 tools, the server is well-scoped for managing a poetry catalog, covering CRUD operations (get, search, list), state management (move_poem_to_state), tagging (link_poem_to_nexus, sync_nexus_tags), analysis preparation (find_nexuses_for_poem, grade_poem_quality), and system tasks (sync_catalog, get_server_info). Each tool serves a clear purpose without redundancy, fitting the domain's complexity.
The tool set provides complete coverage for poetry catalog management, including poem retrieval (get_poem, search_poems, list_poems_by_state), state transitions (move_poem_to_state), tagging workflows (link_poem_to_nexus, sync_nexus_tags, get_all_nexuses), analysis support (find_nexuses_for_poem, grade_poem_quality, get_poems_for_enrichment), and system operations (sync_catalog, get_server_info, get_catalog_stats). There are no obvious gaps; agents can perform end-to-end tasks without dead ends.
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
AI-native art catalogue. Catalogue works, parse provenance, and generate signed RAIs.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Versioned artifact review for people and AI agents, with contextual comments and human control.
Portable AI memory shared across models and harnesses - plain markdown you own.
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/james-livefront/poetry-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server