Model Context Protocol (MCP) server for narrative and character development with FastAgent integration for interactive narrative development using LLMs
Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
This is a STDIO-only server with 25 tools spanning narrative and character development. While tool definitions are present with names, descriptions, and input schemas, the quality is inconsistent and often superficial. Most tool descriptions are generic and lack specificity about when to use them vs. similar tools, which parameters are required vs. optional, or what the agent should expect from the output. Input schemas are visible but frequently lack granularity, many string parameters have no format constraints, no enums for fixed sets of values, and no guidance on valid ranges or patterns. Output schemas are almost entirely absent from the code provided, making it impossible for LLMs to plan downstream calls. Error handling and recovery guidance are not visible in the tool definitions. Security considerations (e.g., input validation, permission checks) are not evident. The 25 tools show some naming consistency (verb_noun pattern), but several tools are vaguely named (e.g., 'apply_symbolic_theme', 'find_symbolic_connections') and lack clarity on what distinguishes them from related tools. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. The server attempts to be comprehensive for a creative writing domain but sacrifices clarity and precision for breadth.
Tools (25)
analyze_narrativeread onlysource verified68/100
Analyze a narrative against a pattern with flexible adherence.
Output schemas completely absent. Not a single tool documents what fields it returns, making it impossible for LLMs to plan downstream calls or extract required data for chaining.
Add documented output schemas to every tool. For 'create_writing_project', document: {project_id: string, name: string, description: string, project_type: string, created_at: ISO8601}. For 'list_patterns', document: {patterns: [{name: string, description: string}], total_count: number}. This enables LLMs to plan chaining.
Convert free-form string parameters to enums where values are fixed. E.g., 'project_type' in 'create_writing_project' should be enum: ['story', 'novel', 'article', 'script']. Add enums for 'format' in 'compile_narrative' (enum: ['markdown', 'html', 'text']), 'script_type' in 'create_agent_script' (enum: ['agent', 'workflow', 'chain', 'router']).
Expand tool descriptions to 100-200 characters with WHAT, WHEN, and RETURN context. Example: 'Create a narrative pattern defining a story structure. Use this to define a custom arc that will be used by generate_outline and analyze_narrative. Returns pattern_id, stages, and psychological_functions for downstream tool calls.'
Add parameter descriptions that specify format and constraints. E.g., for 'pattern_name' in 'get_pattern_details': 'Name of the pattern to retrieve (e.g., "heroes_journey", "transformation"). Valid patterns can be discovered via list_patterns. Case-sensitive. 2-50 characters.'
Add tool annotations (readOnlyHint, destructiveHint, idempotentHint) to every tool. Mark 'get_writing_project', 'list_patterns', 'get_pattern_details', 'list_archetypes', 'get_archetype_details', 'find_symbolic_connections', 'list_outputs', 'list_agent_scripts', 'check_fastagent_status' as readOnly: true. Mark 'close_agent_session' as destructive: true.
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Score history
Overall score trend
↑ 21 points across a rubric change (v1 → v2)
53/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
D
53
<=2025-11-25
v2
2026-03-09
F
32
-
v1
write
source verified
57/100
Create a custom character archetype.
create_custom_patternwritesource verified57/100
Create a custom narrative pattern.
create_custom_symbolswritesource verified57/100
Create custom symbolic connections for a theme.
create_hybrid_patternwritesource verified57/100
Create a hybrid pattern from multiple existing patterns.
create_writing_projectwritesource verified63/100
Create a new project with hierarchical structure.
develop_character_arcwritesource verified62/100
Develop a character arc within a narrative pattern.
Get detailed information about a character archetype.
get_pattern_detailsread onlysource verified67/100
Get detailed information about a specific narrative pattern.
get_writing_projectread onlysource verified65/100
Get detailed information about a specific writing project.
list_agent_scriptsread onlysource verified65/100
List available FastAgent scripts.
list_archetypesread onlysource verified63/100
List available character archetypes.
list_outputsread onlysource verified62/100
List all available outputs across projects.
list_patternsread onlysource verified63/100
List available narrative patterns.
run_agentwritesource verified62/100
Run an agent with a prompt.
send_agent_messagewritesource verified58/100
Send a message to an active agent.
No input parameter validation constraints or enums. Tools like 'create_writing_project' accept 'project_type' as a free-form string (claimed options: 'story, novel, article, script') but do not use JSON Schema enums, allowing LLMs to hallucinate invalid values. Similarly, parameters across the server lack min/max bounds, regex patterns, or allowed-value lists.
Generic and uninformative descriptions. Many tools have descriptions under 100 characters that lack context on when to use them vs. similar tools. Examples: 'find_symbolic_connections' (56 chars), 'apply_symbolic_theme' (50 chars), 'list_outputs' (45 chars). Descriptions do not explain prerequisites, expected return types, or how the tool fits into a workflow.
Missing parameter descriptions. Many parameters have descriptions of 1-3 words (e.g., 'Pattern name', 'Project ID') with no context on valid format, required format, or what distinguishes this parameter from others in the same tool.
No tool annotations for side effects. No tools are marked as readOnly (e.g., list_patterns, get_writing_project) or destructive (e.g., delete operations if they exist, or even close_agent_session). LLMs cannot determine which tools are safe to retry or have irreversible consequences.
Vague tool naming for symbolic tools. 'find_symbolic_connections' vs. 'create_custom_symbols' vs. 'apply_symbolic_theme' are three tools operating on similar concepts but lack clear distinction in names. LLMs will struggle to pick the right one without deep description reading. Names should clearly distinguish their responsibilities (e.g., 'discover_symbolic_themes', 'define_theme_symbols', 'assign_theme_to_narrative').
No pagination or result limiting documented. Tools like 'list_patterns', 'list_archetypes', 'list_outputs', 'list_agent_scripts' have no documented page/offset/limit parameters and no guidance on result set size. Without pagination, large results could exhaust context windows.
Missing error recovery guidance. No tool descriptions mention error conditions, retryability, or what an LLM should do if a call fails. For example, 'run_agent' may fail if the agent is unavailable, but there is no guidance on whether to retry, what the error codes might be, or what alternative tools to try.
No parameter type validation documented. Many parameters are typed as 'string' with no guidance on expected format. E.g., 'pattern_name' in 'get_pattern_details' is a string but no regex pattern, length limit, or case sensitivity rule is provided.
Optional parameters not clearly marked. The 'Optional' type is used in some parameters (e.g., 'secondary_archetypes', 'model'), but the input schema provided does not explicitly distinguish required from optional in JSON Schema (no 'required' array visible). LLMs may incorrectly assume all parameters are required.
Add pagination support to list tools. 'list_patterns' should accept optional 'page' (int, default 1) and 'limit' (int, default 20, max 100) parameters, and return 'total_count' and 'has_more' in the response.
For tools that modify or create resources (create_writing_project, create_character, run_agent), document what the LLM should do on failure. E.g., 'run_agent' description: 'Run an agent script with a prompt. Returns session_id and initial_response. If the agent is unavailable, check_fastagent_status first. If the script does not exist, list_agent_scripts to see available scripts.'
Add mutual exclusivity notes for parameters where applicable. E.g., in 'create_character', document: 'Either primary_archetype is required, or both secondary_archetypes must be provided. Do not leave both undefined.'
Rename vague symbolic tools for clarity: 'find_symbolic_connections' → 'discover_narrative_symbols', 'create_custom_symbols' → 'define_theme_symbols', 'apply_symbolic_theme' → 'assign_theme_to_project'. Clarify in descriptions: 'discover_narrative_symbols finds existing symbols for a theme; define_theme_symbols creates custom symbol-meaning mappings; assign_theme_to_project applies a theme to a narrative.'
Document which tools accept 'project_id' as optional and how it affects behavior. E.g., 'analyze_narrative' with project_id saves the analysis to the project; without it, the analysis is returned but not persisted. Design for agent clarity: 'Provide project_id if you want to save the analysis; omit it for a one-off analysis.'
Add error classification to tool descriptions (retryable, user-fixable, fatal). E.g., 'run_agent' description: 'Returns session_id on success. If the script is not found, the error is user-fixable: check available scripts with list_agent_scripts. If the agent backend is unavailable, the error is retryable; check_fastagent_status before retrying.'
For tools that accept array parameters (secondary_archetypes, tools, elements, custom_stages), document cardinality. E.g., 'secondary_archetypes: Optional list of 0-5 additional archetypes to blend with the primary. If provided, each must be a valid archetype discoverable via list_archetypes.'
Add examples in tool descriptions (in text, not parameter values). E.g., 'generate_outline' description: 'Generate a story outline based on a pattern. Example: use pattern "heroes_journey" with premise "A teen discovers a magical gift and must defeat an ancient evil." Returns outline, key_scenes, and character_roles for downstream generation.'
Document when tools are idempotent. E.g., 'create_custom_pattern' with the same name/description/stages should return the same pattern_id, enabling safe retries. Mark as idempotent: true in tool annotations.