Files
mcp_web_dev_server/dist/tools/docs/searchLaravelDocs.js
T
2026-07-31 13:12:54 -04:00

45 lines
2.1 KiB
JavaScript

import { z } from 'zod';
import { config } from '../../config.js';
import { detectProject } from '../../lib/frameworks/detect.js';
import { readComposerJson } from '../../lib/frameworks/composer.js';
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
function extractMajorMinor(versionConstraint) {
if (!versionConstraint)
return '11.x';
const match = versionConstraint.match(/(\d+)\.(\d+)/);
if (!match)
return '11.x';
const [, major, minor] = match;
return `${major}.${minor}`;
}
export function registerSearchLaravelDocsTool(server) {
server.registerTool('search_laravel_docs', {
title: 'Search Laravel Docs',
description: 'Return a deep link to the Laravel documentation for a topic, version-matched to the laravel/framework constraint in composer.json.',
inputSchema: {
topic: z.string().min(1).describe('Documentation topic, e.g. "eloquent" or "validation".'),
version: z.string().optional().describe('Override the version segment, e.g. "11.x". Auto-detected by default.'),
},
}, async ({ topic, version }) => {
try {
const detected = detectProject(config.workspaceRoot);
const laravelRoot = detected.backend?.kind === 'laravel' ? detected.backend.root : config.workspaceRoot;
const composerJson = readComposerJson(laravelRoot);
const constraint = composerJson?.require?.['laravel/framework'];
const docsVersion = version ?? extractMajorMinor(constraint) + '.x';
const slug = topic.toLowerCase().replace(/\s+/g, '-');
const url = `https://laravel.com/docs/${docsVersion}/${slug}`;
return jsonResult({
topic,
version: docsVersion,
composerConstraint: constraint ?? null,
url,
note: 'This is a best-effort documentation link. If the topic page does not exist, MDN/search engines may help refine the query.',
});
}
catch (error) {
return errorResult(toErrorMessage(error));
}
});
}
//# sourceMappingURL=searchLaravelDocs.js.map