Get Skippr Issue Details
skippr_get_issueRetrieves full details and raw markdown content for a specific Skippr issue. Enables AI agents to access issue data for fixing product problems.
Instructions
Gets full details for a specific Skippr issue including raw markdown content
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project identifier | |
| reviewId | Yes | Review ID | |
| issueId | Yes | Issue ID |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| reviewId | Yes | ||
| title | Yes | ||
| severity | Yes | ||
| resolved | Yes | ||
| category | No | ||
| markdown | Yes |
Implementation Reference
- src/tools/get-issue.ts:43-61 (handler)Main handler function for the skippr_get_issue tool. Validates input (projectId, reviewId, issueId), reads the issue markdown file from .skippr/projects/{projectId}/reviews/{reviewId}/issues/{issueId}.md, parses frontmatter, and returns full issue details including raw markdown content.
export async function getIssue(input: GetIssueInput): Promise<GetIssueOutput> { // Validate input const validated = GetIssueInputSchema.parse(input); const { projectId, reviewId, issueId } = validated; // Read and parse the issue file const { frontmatter, markdown } = await readIssueFile(projectId, reviewId, issueId); return { id: frontmatter.id, reviewId: frontmatter.reviewId, title: frontmatter.title, severity: frontmatter.severity, resolved: frontmatter.resolved, category: frontmatter.category, elementMetadata: frontmatter.elementMetadata, markdown, // Raw markdown for Claude to read }; } - src/tools/get-issue.ts:10-14 (schema)Input schema for skippr_get_issue, requiring projectId (string), reviewId (UUID), and issueId (UUID).
export const GetIssueInputSchema = z.object({ projectId: z.string().describe('Project identifier'), reviewId: z.string().uuid().describe('Review ID'), issueId: z.string().uuid().describe('Issue ID'), }); - src/tools/get-issue.ts:17-31 (schema)Output schema for skippr_get_issue, defining the returned issue details including id, reviewId, title, severity, resolved status, optional category and elementMetadata, plus raw markdown content.
export const GetIssueOutputSchema = z.object({ id: z.string().uuid(), reviewId: z.string().uuid(), title: z.string(), severity: z.string(), resolved: z.boolean(), category: z.string().optional(), elementMetadata: z .object({ selector: z.string(), bounding_box: z.array(z.number()).optional(), }) .optional(), markdown: z.string().describe('Raw markdown content for Claude to read'), }); - src/servers/mcp.ts:53-73 (registration)Registration of the skippr_get_issue tool in the MCP server using mcpServer.registerTool(). Maps to the getIssue handler and passes its input/output schemas.
mcpServer.registerTool( 'skippr_get_issue', { title: 'Get Skippr Issue Details', description: 'Gets full details for a specific Skippr issue including raw markdown content', inputSchema: GetIssueInputSchema.shape, outputSchema: z.object({ id: z.string(), reviewId: z.string(), title: z.string(), severity: z.string(), resolved: z.boolean(), category: z.string().optional(), markdown: z.string() }).shape }, async (args) => { const result = await getIssue(args as GetIssueInput); return createStructuredResponse(result); } ); - src/utils/issues-reader.ts:60-74 (helper)Helper that reads the issue markdown file from the filesystem at .skippr/projects/{projectId}/reviews/{reviewId}/issues/{issueId}.md and returns parsed frontmatter plus raw markdown.
export async function readIssueFile( projectId: string, reviewId: string, issueId: string ): Promise<{ frontmatter: ParsedIssueFrontmatter; markdown: string }> { const filePath = join(getWorkingDirectory(), '.skippr', 'projects', projectId, 'reviews', reviewId, 'issues', `${issueId}.md`); const content = await readFile(filePath, 'utf-8'); const parsed = parseIssueFrontmatter(content); return { frontmatter: parsed.frontmatter, markdown: parsed.content, // Raw markdown for Claude to read }; }