/**
* get_user MCP Tool
*/
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
import { HNError } from '../lib/errors.js';
import type { HNClient } from '../lib/hn-client.js';
import { createChildLogger } from '../lib/logger.js';
export function registerGetUser(server: McpServer, hnClient: HNClient): void {
server.registerTool(
'get_user',
{
title: 'Get User Profile',
description: 'Retrieve a user profile by username. Returns karma, account creation date, and bio.',
inputSchema: {
username: z
.string()
.regex(/^[a-zA-Z0-9_-]+$/)
.describe('Hacker News username'),
},
outputSchema: { username: z.string(), karma: z.number(), about: z.string().nullable() },
},
async ({ username }) => {
const correlationId = crypto.randomUUID();
const toolLogger = createChildLogger({ correlationId, tool: 'get_user', username });
try {
toolLogger.info({ username }, 'Getting user');
const result = await hnClient.getUser(username);
toolLogger.info('Retrieved user');
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result as unknown as Record<string, unknown>,
};
} catch (error) {
toolLogger.error({ error }, 'Failed to get user');
if (error instanceof HNError) {
const errorContent = { error: error.message };
return {
content: [{ type: 'text', text: JSON.stringify(errorContent) }],
isError: true,
};
}
throw error;
}
}
);
}