CAT
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Cross AI Tools

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

Seosa

ink.seosa/seosa
27 toolsHTTPregistry active
Summary

If you're building web novel infrastructure with Claude or ChatGPT and need to manage serialized fiction at scale, this gives you structured endpoints for series setup, character databases, episode generation, and quality evaluation workflows. It's Korean-first but the MCP interface is language-agnostic. The remote transport means you don't run anything locally, you just point your client at app.seosa.ink/api/mcp and get access to worldbuilding tools, outline management, and multi-pass editorial feedback loops. Useful if you're prototyping narrative tools or need to maintain consistency across dozens of chapters without rebuilding context each time. The samples show it handles genre conventions (romance, fantasy, wuxia) with attention to pacing and character continuity.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Tools

Public tool metadata for what this MCP can expose to an agent.

27 tools
seosa_list_seriesList the authenticated user's series (most recent first). Returns id, title, genre, language, platform, and creation time.2 params

List the authenticated user's series (most recent first). Returns id, title, genre, language, platform, and creation time.

Parameters* required
limitinteger
Page size (default 50, max 100).
offsetinteger
Offset for pagination (default 0).
seosa_get_seriesGet one series by ID (must be owned by the authenticated user).1 params

Get one series by ID (must be owned by the authenticated user).

Parameters* required
idstring
Series ID.
seosa_create_seriesCreate a new series for the authenticated user. Free of credit charge. Returns the created series object including its assigned id.9 params

Create a new series for the authenticated user. Free of credit charge. Returns the created series object including its assigned id.

Parameters* required
genrestring
titlestring
languagestring
platformstring
synopsisstring
total_partsinteger
system_rulesstring
world_summarystring
total_chaptersinteger
seosa_update_seriesPartial-patch update for an existing series. Provide at least one field beyond `id`. Free of credit charge. Fields: title / genre / language / platform / synopsis / world_summary / system_rules / total_parts / total_chapters / visibility. Changing language/platform/genre also...11 params

Partial-patch update for an existing series. Provide at least one field beyond `id`. Free of credit charge. Fields: title / genre / language / platform / synopsis / world_summary / system_rules / total_parts / total_chapters / visibility. Changing language/platform/genre also...

Parameters* required
idstring
Series ID to update.
genrestring
titlestring
languagestring
platformstring
synopsisstring
visibilitystring
one of private · public
total_partsinteger
system_rulesstring
world_summarystring
total_chaptersinteger
seosa_list_episodesList episodes of a given series in ascending order. Content body is omitted; use seosa_get_episode for full text.3 params

List episodes of a given series in ascending order. Content body is omitted; use seosa_get_episode for full text.

Parameters* required
limitinteger
Page size (default 50, max 100).
offsetinteger
Offset for pagination (default 0).
series_idstring
Series ID.
seosa_get_episodeGet one episode (with full content) by series ID + episode number. Prefer `episode_number`; the legacy `number` alias remains for backward compatibility.3 params

Get one episode (with full content) by series ID + episode number. Prefer `episode_number`; the legacy `number` alias remains for backward compatibility.

Parameters* required
numberinteger
Legacy alias for episode_number. Kept for backward compatibility.
series_idstring
Series ID.
episode_numberinteger
Episode number (1-based). Preferred field name.
seosa_get_episode_statusLightweight status check for an episode: whether the body has been saved, the word count, the quality score (if evaluated), and whether an outline exists. Returns state ∈ { absent, body_ready, evaluated } plus `has_outline: boolean`. Free, read-only. Decision matrix for `state...2 params

Lightweight status check for an episode: whether the body has been saved, the word count, the quality score (if evaluated), and whether an outline exists. Returns state ∈ { absent, body_ready, evaluated } plus `has_outline: boolean`. Free, read-only. Decision matrix for `state...

Parameters* required
series_idstring
Series ID.
episode_numberinteger
Episode number (1-based).
seosa_wait_for_episodeServer-side long-poll that blocks until an episode reaches the target state. Use this AFTER calling seosa_generate_episode (which returns `status: "dispatched"` immediately while the body is written in the background) or seosa_evaluate_episode. Free, read-only. Behavior: - `un...4 params

Server-side long-poll that blocks until an episode reaches the target state. Use this AFTER calling seosa_generate_episode (which returns `status: "dispatched"` immediately while the body is written in the background) or seosa_evaluate_episode. Free, read-only. Behavior: - `un...

Parameters* required
untilstring
Target state to wait for. Default 'body_ready'. Use 'evaluated' after seosa_evaluate_episode to wait for quality_score.one of body_ready · evaluated
series_idstring
Series ID.
episode_numberinteger
Episode number (1-based).
timeout_secondsinteger
Max seconds to wait in this single call. Default 180, max 180. Sized to cover the average body generation (~1m20s) in one call; if a client's HTTP idle timeout is shorter, the surface can simply re-issue the same call to keep waiting.
seosa_update_episodeUpdate episode content, quality score, or publish state. Pass `content` to overwrite the body (the previous body is auto-snapshotted to `episode_version` with source 'mcp_edit' — rollback via `seosa_rollback_episode`). Pass `quality_score` (0-100) and/or `is_public` to update...5 params

Update episode content, quality score, or publish state. Pass `content` to overwrite the body (the previous body is auto-snapshotted to `episode_version` with source 'mcp_edit' — rollback via `seosa_rollback_episode`). Pass `quality_score` (0-100) and/or `is_public` to update...

Parameters* required
contentstring
New episode body. Replaces existing content fully. The previous body is preserved as a version snapshot.
is_publicboolean
Visibility flag. true → episode visible to readers; first true also sets published_at.
series_idstring
Series ID.
quality_scoreinteger
Quality score (0-100). Skips version snapshot.
episode_numberinteger
Episode number (1-based).
seosa_list_episode_versionsList all versions (revision history) of an episode in descending version order. Each item includes `version_num`, `word_count`, `source` ('edit' / 'mcp_edit' / 'api_edit' / 'generation' / 'generation_<provider>' / 'improve' / 'rollback'), and `created_at`. Body content is omit...2 params

List all versions (revision history) of an episode in descending version order. Each item includes `version_num`, `word_count`, `source` ('edit' / 'mcp_edit' / 'api_edit' / 'generation' / 'generation_<provider>' / 'improve' / 'rollback'), and `created_at`. Body content is omit...

Parameters* required
series_idstring
Series ID.
episode_numberinteger
Episode number (1-based).
seosa_rollback_episodeRestore an episode body to a previous version. The current body is preserved as a new snapshot with source 'rollback' before the restore — so a rollback is itself reversible by another rollback. Use `seosa_list_episode_versions` first to find the target `version_num`. Free.3 params

Restore an episode body to a previous version. The current body is preserved as a new snapshot with source 'rollback' before the restore — so a rollback is itself reversible by another rollback. Use `seosa_list_episode_versions` first to find the target `version_num`. Free.

Parameters* required
series_idstring
Series ID.
version_numinteger
Target version number to restore. Obtain from `seosa_list_episode_versions`.
episode_numberinteger
Episode number (1-based).
seosa_check_balanceReturn the authenticated user's credit balance, broken down by bucket, plus the current subscription plan.

Return the authenticated user's credit balance, broken down by bucket, plus the current subscription plan.

No parameter schema in public metadata yet.

seosa_run_wizardGenerate and persist world, characters, relationships, and bible components for a series in one call. Costs up to 8 credits (2 per step, charged only for steps that actually run). Skips steps whose data already exists; pass force:true to re-run all targeted steps. Pass `steps`...3 params

Generate and persist world, characters, relationships, and bible components for a series in one call. Costs up to 8 credits (2 per step, charged only for steps that actually run). Skips steps whose data already exists; pass force:true to re-run all targeted steps. Pass `steps`...

Parameters* required
forceboolean
Force re-run the targeted steps even if data exists. Default false.
stepsarray
Subset of steps to run. Omit to run all 4 (default). Non-listed steps are skipped with reason 'not_requested'. Typical uses: ['characters'] + force:true to re-roll the cast, or ['bible'] to fill in only the bible after a manual bootstrap.
series_idstring
Series ID.
seosa_get_charactersReturn the canonical character list (series.characters jsonb) plus the character_state mirror (character_name / class_name / level / last_updated_episode). Free, read-only.1 params

Return the canonical character list (series.characters jsonb) plus the character_state mirror (character_name / class_name / level / last_updated_episode). Free, read-only.

Parameters* required
series_idstring
Series ID.
seosa_get_bibleReturn bible_component rows (world / system_rules / locations / terminology / themes / etc) for a series. Pass component_name to fetch a single component. Free, read-only.2 params

Return bible_component rows (world / system_rules / locations / terminology / themes / etc) for a series. Pass component_name to fetch a single component. Free, read-only.

Parameters* required
series_idstring
Series ID.
component_namestring
If set, return only the single component with this name.
seosa_get_relationshipsReturn the current relationship graph (narrative_state.relationships) plus the last_updated_episode marker. Set include_snapshots=true to also return per-episode relationship_snapshot rows (newest first). Free, read-only.3 params

Return the current relationship graph (narrative_state.relationships) plus the last_updated_episode marker. Set include_snapshots=true to also return per-episode relationship_snapshot rows (newest first). Free, read-only.

Parameters* required
series_idstring
Series ID.
max_snapshotsinteger
Max snapshots to return (default 20). Honored only when include_snapshots=true.
include_snapshotsboolean
Include per-episode snapshots. Default false.
seosa_update_bible_componentUpsert one bible_component (world / system_rules / locations / terminology / timeline / foreshadowing / themes / voice_profiles / scene_inventory) for a series. If no row exists for the given component_name it is created; if one exists it is fully replaced (no partial merge —...5 params

Upsert one bible_component (world / system_rules / locations / terminology / timeline / foreshadowing / themes / voice_profiles / scene_inventory) for a series. If no row exists for the given component_name it is created; if one exists it is fully replaced (no partial merge —...

Parameters* required
dataobject
Full replacement data object for this component.
series_idstring
Series ID.
change_reasonstring
Optional reason recorded in history (default: manual_edit).
component_namestring
Bible component name (e.g. 'locations', 'terminology').
episode_contextinteger
Optional episode number the edit relates to.
seosa_update_relationshipsUpsert the canonical character relationship graph (narrative_state.relationships) for a series. Replaces the entire graph — for partial edits, read with seosa_get_relationships first, modify, then write back. Free, no credit charge. Persists in the same shape as seosa_run_wiza...3 params

Upsert the canonical character relationship graph (narrative_state.relationships) for a series. Replaces the entire graph — for partial edits, read with seosa_get_relationships first, modify, then write back. Free, no credit charge. Persists in the same shape as seosa_run_wiza...

Parameters* required
series_idstring
Series ID.
relationshipsarray
Full new relationship graph. Pass an empty array to clear the graph.
episode_contextinteger
Episode number this graph applies to (sets last_updated_episode). Default 0 — matches the wizard's 'initial setup' marker.
seosa_create_charactersManually create one or more canonical characters for a series, WITHOUT running seosa_run_wizard. Idempotent: characters whose name already exists in series.characters are skipped. Free, no credit charge. Persists to both `series.characters` (jsonb cast list) and the `character...2 params

Manually create one or more canonical characters for a series, WITHOUT running seosa_run_wizard. Idempotent: characters whose name already exists in series.characters are skipped. Free, no credit charge. Persists to both `series.characters` (jsonb cast list) and the `character...

Parameters* required
series_idstring
Series ID.
charactersarray
Characters to create. Existing names (already in series.characters) are skipped silently.
seosa_update_characterPartially update a character_state row identified by canonical character_name. Only fields explicitly passed (class_name / level / stats / skills / fragments) are written; the rest are preserved. 404 if no character_state row exists with that name — create it via seosa_create_...7 params

Partially update a character_state row identified by canonical character_name. Only fields explicitly passed (class_name / level / stats / skills / fragments) are written; the rest are preserved. 404 if no character_state row exists with that name — create it via seosa_create_...

Parameters* required
levelinteger
New skill / power level. Omit to keep existing.
statsobject
New stats object. Omit to keep existing.
skillsarray
New skills array. Omit to keep existing.
fragmentsarray
New fragments array. Omit to keep existing.
series_idstring
Series ID.
class_namestring
New role / title / class. Omit to keep existing value.
character_namestring
Canonical character_name as stored (e.g. '소용(蘇龍)'). Use seosa_get_characters to list available names.
seosa_generate_outlineGenerate a draft outline for the next episode of the given series. Costs 2 credits. Returns title, emotional_tone, hook, key_events, character_focus plus a `conflicts` array (bible/narrative consistency warnings). May early-terminate with character proposals if the series need...6 params

Generate a draft outline for the next episode of the given series. Costs 2 credits. Returns title, emotional_tone, hook, key_events, character_focus plus a `conflicts` array (bible/narrative consistency warnings). May early-terminate with character proposals if the series need...

Parameters* required
series_idstring
Series ID.
instructionstring
Optional natural-language hint for the outline.
skip_castingboolean
Skip the casting proposal gate (advanced). Default false — recommended only when you have already accepted/rejected casting in a prior call.
episode_numberinteger
Episode number to outline (1-based).
accepted_charactersarray
Characters from a previous call's casting proposal that you accept. They are persisted to series.characters + character_state before the outline is generated, so subsequent calls reuse the same canonical names instead of the LLM re-inventing them. Typical flow: 1st call returns status='proposed_characters' → echo the proposal back here with skip_casting:true to commit and generate the outline in one call. If the call returns a transport timeout, do NOT retry — call seosa_get_outline(series_id, episode_number) to check whether the outline was already persisted on the server side.
auto_accept_proposedboolean
If true and the first generation cycle returns proposed_characters, automatically echo the proposal back as accepted_characters + skip_casting:true and run the outline cycle a second time in the same call. Saves a round-trip when you trust the LLM's casting suggestion. Credit accounting is unchanged (proposal cycle is refunded as usual, the second cycle confirms 2 credits). Default false (manual review).
seosa_update_outlinePartial-patch update for an existing episode outline. Free (0 credits). Use this AFTER seeing `conflicts` from seosa_generate_outline to fix the exact field at issue (e.g. tweak one `key_events` line) without paying for a new LLM call. Provide at least one of: title, emotional...8 params

Partial-patch update for an existing episode outline. Free (0 credits). Use this AFTER seeing `conflicts` from seosa_generate_outline to fix the exact field at issue (e.g. tweak one `key_events` line) without paying for a new LLM call. Provide at least one of: title, emotional...

Parameters* required
hookstring
titlestring
series_idstring
Series ID.
key_eventsarray
emotional_tonestring
episode_numberinteger
Episode number (1-based). Outline must already exist.
character_focusarray
recheck_conflictsboolean
Re-run bible/narrative consistency detection after patching. Default false.
seosa_regenerate_outlineRe-roll an existing episode outline by feeding the current outline plus fix hints (typically the `conflicts` from a previous generate_outline call) back into the LLM. Costs 2 credits. Skips the casting gate (existing series characters are reused as-is). Overwrites the existing...4 params

Re-roll an existing episode outline by feeding the current outline plus fix hints (typically the `conflicts` from a previous generate_outline call) back into the LLM. Costs 2 credits. Skips the casting gate (existing series characters are reused as-is). Overwrites the existing...

Parameters* required
series_idstring
Series ID.
instructionstring
Optional extra natural-language hint.
fix_conflictsarray
Conflicts from a previous generate_outline call. Each `message` is embedded as a explicit avoidance hint in the LLM prompt.
episode_numberinteger
Episode number (1-based). Outline must already exist.
seosa_get_outlineReturn a single episode_outline row for a given series + episode number (title / emotional_tone / hook / key_events / character_focus). 404 if the outline has not been generated yet. Free, read-only.2 params

Return a single episode_outline row for a given series + episode number (title / emotional_tone / hook / key_events / character_focus). 404 if the outline has not been generated yet. Free, read-only.

Parameters* required
series_idstring
Series ID.
episode_numberinteger
Episode number (1-based).
seosa_generate_episodeDispatch full-body generation for an episode. Costs 30 credits. Returns IMMEDIATELY with `status: "dispatched"` — there is NO transport timeout to handle. The actual writing runs in the background (typically 1m20s, up to 3 minutes). **Always follow this with `seosa_wait_for_ep...3 params

Dispatch full-body generation for an episode. Costs 30 credits. Returns IMMEDIATELY with `status: "dispatched"` — there is NO transport timeout to handle. The actual writing runs in the background (typically 1m20s, up to 3 minutes). **Always follow this with `seosa_wait_for_ep...

Parameters* required
polishboolean
Run an additional polish pass after the draft. Improves quality but doubles AI cost (counted within the 30cr hold).
series_idstring
Series ID.
episode_numberinteger
Episode number to generate (1-based). Outline required.
seosa_rewrite_episode_selectionGenerate 3 alternative rewrites for a selected passage of an episode body. **Does NOT modify the episode** — returns `alternatives` array; the caller must pick one and apply it via `seosa_update_episode` with the new full content. Provide either a `preset` (vivid/concise/tensi...6 params

Generate 3 alternative rewrites for a selected passage of an episode body. **Does NOT modify the episode** — returns `alternatives` array; the caller must pick one and apply it via `seosa_update_episode` with the new full content. Provide either a `preset` (vivid/concise/tensi...

Parameters* required
presetstring
Curated rewrite style. Overrides `instruction` if both provided.one of vivid · concise · tension · emotional · dialogue · expand
contextstring
Surrounding text (paragraphs before/after the selection) for tone continuity.
series_idstring
Series ID.
instructionstring
Free-form rewrite direction. Ignored if `preset` is also set.
selected_textstring
The exact passage to rewrite. Must be a contiguous substring of the episode body.
episode_numberinteger
Episode number (1-based).
seosa_evaluate_episodeEvaluate the quality of an existing episode from 3 perspectives: writer/reader/editor. Costs 5 credits. Returns IMMEDIATELY with `status: "dispatched"` — evaluation runs in the background (typically ~30s). Follow with `seosa_wait_for_episode` using `until: "evaluated"` to awai...2 params

Evaluate the quality of an existing episode from 3 perspectives: writer/reader/editor. Costs 5 credits. Returns IMMEDIATELY with `status: "dispatched"` — evaluation runs in the background (typically ~30s). Follow with `seosa_wait_for_episode` using `until: "evaluated"` to awai...

Parameters* required
series_idstring
Series ID.
episode_numberinteger
Episode number to evaluate (1-based). Episode must exist with content.
Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Registryactive
TransportHTTP
UpdatedMay 30, 2026
Open website