Skip to main content
Glama
james-livefront

Poetry MCP Server

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 principles

Personal 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 tools

Requirements

  • 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 -v

Code 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 definitions

Configuration

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.log

MCP 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.json

  • Config location (Windows): %APPDATA%\Claude\claude_desktop_config.json

  • After 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:

  1. Restart the client application

  2. Start a new conversation/session

  3. Check that poetry-mcp tools are available

  4. Try: "What poetry tools are available?"

  5. Try: "Get catalog stats" - should show your poem count

Troubleshooting

Server won't start:

  • Verify POETRY_VAULT_PATH points to correct directory

  • Check the vault has a catalog/ subdirectory

  • Review client logs for error messages

No poems found:

  • Run sync_catalog tool first to index poems

  • Verify 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 uv or python is 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.server

Example 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 loaded

To 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.0

Features:

  • 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:

  1. Save changes → File watcher detects change

  2. Waits 2 seconds (Obsidian may save multiple files)

  3. Reloads changed BASE files

  4. Updates Pydantic models in memory

  5. 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 tools
find_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()
```
ParametersJSON Schema
NameRequiredDescriptionDefault
poem_idYes
max_suggestionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

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 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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYes
match_modeNoall
statesNo
limitNo

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?

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/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 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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
formsNoForm nexuses (structural patterns)
motifsNoMotif nexuses (compositional patterns)
themesNoThematic nexuses (imagery systems, subjects)
total_countYesTotal number of nexuses across all categories

TDQS

A4.2/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 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
by_formYesCount of poems by form
by_stateYesCount of poems by state
last_syncNoTimestamp of last catalog sync
newest_poemYesTitle of most recently created poem
oldest_poemYesTitle of oldest poem
total_poemsYesTotal number of poems in catalog
avg_word_countYesAverage word count per poem
total_word_countYesTotal words across all poems
poems_without_tagsYesNumber of poems with no tags
poems_missing_frontmatterNoNumber of poems with incomplete frontmatter

TDQS

C2.9/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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes
include_contentNo

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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/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 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.

Purpose4/5

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.

Usage Guidelines2/5

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()
```
ParametersJSON Schema
NameRequiredDescriptionDefault
poem_idsNo
max_poemsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/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 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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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
```
ParametersJSON Schema
NameRequiredDescriptionDefault
poem_idYes
dimensionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYes
sort_byNotitle
limitNo

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 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.

Conciseness5/5

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.

Completeness3/5

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.

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 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.

Purpose4/5

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.

Usage Guidelines2/5

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']}")

ParametersJSON Schema
NameRequiredDescriptionDefault
poem_idYes
new_stateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
statesNo
formsNo
tagsNo
limitNo
include_contentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
poemsYesList of poems matching search criteria
query_time_msYesTime taken to execute query in milliseconds
total_matchesYesTotal number of poems matching query (may be > len(poems) if limited)

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
force_rescanNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
warningsNoList of warning messages encountered during sync
new_poemsYesNumber of new poems discovered in this sync
total_poemsYesTotal number of poems in catalog after sync
skipped_poemsNoNumber of poems skipped due to parse errors
updated_poemsYesNumber of existing poems with updated metadata
duration_secondsYesTime taken for sync operation

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

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 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.

Purpose5/5

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.

Usage Guidelines5/5

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']}")

ParametersJSON Schema
NameRequiredDescriptionDefault
poem_idYes
directionNoboth

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 14 tool updatesv1.0.0
    • First observedfind_nexuses_for_poem
    • First observedfind_poems_by_tag
    • First observedget_all_nexuses
    • First observedget_catalog_stats
    • First observedget_poem
    • First observedget_poems_for_enrichment
    • First observedget_server_info
    • First observedgrade_poem_quality
    • First observedlink_poem_to_nexus
    • First observedlist_poems_by_state
    • First observedmove_poem_to_state
    • First observedsearch_poems
    • First observedsync_catalog
    • First observedsync_nexus_tags

TDQS

A3.8/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

Latest Blog Posts

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