mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-03 18:23:47 +10:00
53 lines
2.1 KiB
TypeScript
53 lines
2.1 KiB
TypeScript
import type { RouterClient } from "@orpc/server";
|
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { onError } from "@orpc/client";
|
|
import { createRouterClient } from "@orpc/server";
|
|
import router from "@reactive-resume/api/routers";
|
|
import {
|
|
buildMcpServerInfo,
|
|
MCP_TOOL_NAME,
|
|
registerPrompts,
|
|
registerResources,
|
|
registerTools,
|
|
} from "@reactive-resume/mcp";
|
|
import { appVersion } from "../app-version";
|
|
import { getRequestLocale } from "../rpc/locale";
|
|
|
|
function createRequestClient(request: Request): RouterClient<typeof router> {
|
|
return createRouterClient(router, {
|
|
interceptors: [
|
|
onError((error) => {
|
|
console.error("[MCP oRPC]", error);
|
|
}),
|
|
],
|
|
context: () => ({
|
|
locale: getRequestLocale(request),
|
|
reqHeaders: request.headers,
|
|
resHeaders: new Headers(),
|
|
}),
|
|
});
|
|
}
|
|
|
|
export function createMcpServer(request: Request) {
|
|
const server = new McpServer(buildMcpServerInfo(appVersion), {
|
|
instructions: [
|
|
"You are connected to Reactive Resume over MCP.",
|
|
"Authenticate with OAuth (recommended) or an API key (`x-api-key`).",
|
|
`Discover resume IDs with \`${MCP_TOOL_NAME.listResumes}\` (not \`resources/list\`).`,
|
|
`List distinct tags with \`${MCP_TOOL_NAME.listResumeTags}\`.`,
|
|
`Read schema at \`resume://_meta/schema\`; read resume JSON via \`resume://{id}\` or \`${MCP_TOOL_NAME.getResume}\`.`,
|
|
`Apply body edits with JSON Patch through \`${MCP_TOOL_NAME.patchResume}\`.`,
|
|
`Change name, slug, tags, or public visibility with \`${MCP_TOOL_NAME.updateResume}\` (returns canonical share URL; anonymous access only when \`isPublic\` is true; passwords are managed in the web app only).`,
|
|
`Create short-lived authenticated PDF download URLs with \`${MCP_TOOL_NAME.downloadResumePdf}\`; set target to \`cover-letter\` to export a visible cover letter separately.`,
|
|
`Import full ResumeData JSON with \`${MCP_TOOL_NAME.importResume}\`.`,
|
|
].join(" "),
|
|
});
|
|
|
|
const client = createRequestClient(request);
|
|
registerResources(server, client);
|
|
registerTools(server, client, request.headers);
|
|
registerPrompts(server);
|
|
|
|
return server;
|
|
}
|