UNPKG

@codewithdan/dc-comics-mcp

Version:

DC Comics APIs MCP Server using Comic Vine API

30 lines (29 loc) 1.97 kB
import { markdownInstructions } from "../../instructions.js"; import { CharactersResponseSchema } from "../schemas.js"; import { GetCharactersForIssueSchema } from "./schemas.js"; import { createEmptyResponse, createStandardResponse, DEFAULT_FIELD_LISTS, formatResourceId, performDcComicsSearch } from "../../utils.js"; export const get_characters_for_issue = { description: `Fetch DC Comics characters for a given issue/comic. ${markdownInstructions}`, schema: GetCharactersForIssueSchema, handler: async (args) => { const { issueId, ...rest } = GetCharactersForIssueSchema.parse(args); // Format issue ID with the proper prefix const formattedId = formatResourceId('ISSUE', issueId); // First fetch the issue to get character credits using search functionality const issueSearchResults = await performDcComicsSearch(formattedId, 'issue', 'id,name,character_credits'); // Check if issue was found if (!issueSearchResults.results || issueSearchResults.results.length === 0) { return createEmptyResponse(CharactersResponseSchema, rest.limit, rest.offset); } const issueResults = issueSearchResults.results[0]; // Check if the issue has character_credits if (!issueResults.character_credits || !Array.isArray(issueResults.character_credits) || issueResults.character_credits.length === 0) { return createEmptyResponse(CharactersResponseSchema, rest.limit, rest.offset); } // Extract character names to search for const characterNames = issueResults.character_credits.map((char) => char.name).join(' OR '); // Use search to find the characters const characterSearchResults = await performDcComicsSearch(characterNames, 'character', rest.field_list || DEFAULT_FIELD_LISTS.CHARACTER, rest.limit, rest.offset); return createStandardResponse(CharactersResponseSchema, characterSearchResults); } };