@po-ui/mcp 21.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ export declare function fetchLlmsTxt(): Promise<string>;
2
+ export declare function fetchLlmsFullTxt(): Promise<string>;
3
+ export declare function fetchComponentDoc(slug: string): Promise<string>;
4
+ export declare function fetchGuide(name: string): Promise<string>;
package/docs-client.js ADDED
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchLlmsTxt = fetchLlmsTxt;
4
+ exports.fetchLlmsFullTxt = fetchLlmsFullTxt;
5
+ exports.fetchComponentDoc = fetchComponentDoc;
6
+ exports.fetchGuide = fetchGuide;
7
+ const https = require("node:https");
8
+ const http = require("node:http");
9
+ const BASE_URL = 'https://po-ui.io';
10
+ const GITHUB_RAW = 'https://raw.githubusercontent.com/po-ui/po-angular/master';
11
+ const FETCH_TIMEOUT_MS = 10_000;
12
+ function fetchUrl(url) {
13
+ return new Promise(resolve => {
14
+ const client = url.startsWith('https') ? https : http;
15
+ const req = client.get(url, { timeout: FETCH_TIMEOUT_MS }, res => {
16
+ // Follow redirects (301/302)
17
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
18
+ resolve(fetchUrl(res.headers.location));
19
+ return;
20
+ }
21
+ const chunks = [];
22
+ res.on('data', (chunk) => chunks.push(chunk));
23
+ res.on('end', () => {
24
+ const text = Buffer.concat(chunks).toString('utf-8');
25
+ resolve({
26
+ ok: res.statusCode !== undefined && res.statusCode >= 200 && res.statusCode < 300,
27
+ statusCode: res.statusCode,
28
+ text
29
+ });
30
+ });
31
+ res.on('error', () => resolve({ ok: false, text: '' }));
32
+ });
33
+ req.on('timeout', () => {
34
+ req.destroy();
35
+ resolve({ ok: false, text: 'Request timed out' });
36
+ });
37
+ req.on('error', (err) => resolve({ ok: false, text: err.message }));
38
+ });
39
+ }
40
+ async function fetchLlmsTxt() {
41
+ const result = await fetchUrl(`${BASE_URL}/llms.txt`);
42
+ if (result.ok)
43
+ return result.text;
44
+ throw new Error(`Falha ao buscar llms.txt (HTTP ${result.statusCode ?? 'desconhecido'})`);
45
+ }
46
+ async function fetchLlmsFullTxt() {
47
+ const result = await fetchUrl(`${BASE_URL}/llms-full.txt`);
48
+ if (result.ok)
49
+ return result.text;
50
+ throw new Error(`Falha ao buscar llms-full.txt (HTTP ${result.statusCode ?? 'desconhecido'})`);
51
+ }
52
+ async function fetchComponentDoc(slug) {
53
+ const primaryUrl = `${BASE_URL}/llms-generated/${slug}.md`;
54
+ const primary = await fetchUrl(primaryUrl);
55
+ if (primary.ok)
56
+ return primary.text;
57
+ // Fallback: GitHub raw
58
+ const fallbackUrl = `${GITHUB_RAW}/projects/portal/src/llms-generated/${slug}.md`;
59
+ const fallback = await fetchUrl(fallbackUrl);
60
+ if (fallback.ok)
61
+ return fallback.text;
62
+ throw new Error(`Documentação não encontrada para o slug "${slug}".\n` +
63
+ `Tentativas:\n` +
64
+ ` - ${primaryUrl} (HTTP ${primary.statusCode ?? 'erro'})\n` +
65
+ ` - ${fallbackUrl} (HTTP ${fallback.statusCode ?? 'erro'})`);
66
+ }
67
+ async function fetchGuide(name) {
68
+ const guideName = name.endsWith('.md') ? name.slice(0, -3) : name;
69
+ const url = `${GITHUB_RAW}/docs/guides/${guideName}.md`;
70
+ const result = await fetchUrl(url);
71
+ if (result.ok)
72
+ return result.text;
73
+ throw new Error(`Guia "${guideName}" não encontrado (HTTP ${result.statusCode ?? 'desconhecido'}).\n` + `URL tentada: ${url}`);
74
+ }
75
+ //# sourceMappingURL=docs-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-client.js","sourceRoot":"","sources":["../../projects/mcp/src/docs-client.ts"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @po-ui/mcp — MCP Server para documentação do PO UI
3
+ *
4
+ * Configuração (claude_desktop_config.json / cursor settings):
5
+ * {
6
+ * "mcpServers": {
7
+ * "po-ui": {
8
+ * "command": "npx",
9
+ * "args": ["-y", "@po-ui/mcp"]
10
+ * }
11
+ * }
12
+ * }
13
+ */
14
+ export {};
package/index.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * @po-ui/mcp — MCP Server para documentação do PO UI
5
+ *
6
+ * Configuração (claude_desktop_config.json / cursor settings):
7
+ * {
8
+ * "mcpServers": {
9
+ * "po-ui": {
10
+ * "command": "npx",
11
+ * "args": ["-y", "@po-ui/mcp"]
12
+ * }
13
+ * }
14
+ * }
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
18
+ const server_1 = require("./server");
19
+ async function main() {
20
+ const server = (0, server_1.createServer)();
21
+ const transport = new stdio_js_1.StdioServerTransport();
22
+ await server.connect(transport);
23
+ }
24
+ main().catch(err => {
25
+ process.stderr.write(`[po-ui-mcp] Erro fatal: ${err instanceof Error ? err.message : String(err)}\n`);
26
+ process.exit(1);
27
+ });
28
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../projects/mcp/src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAEH,wEAAiF;AACjF,qCAAwC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface LlmsEntry {
2
+ name: string;
3
+ slug: string;
4
+ url: string;
5
+ description: string;
6
+ section: string;
7
+ }
8
+ export declare function parseLlmsTxt(text: string): LlmsEntry[];
package/llms-parser.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseLlmsTxt = parseLlmsTxt;
4
+ const SECTION_MAP = {
5
+ 'componentes e diretivas': 'components',
6
+ 'serviços': 'services',
7
+ 'interfaces e modelos': 'interfaces',
8
+ 'enums': 'enums',
9
+ 'guias': 'guides'
10
+ };
11
+ // Matches: - [Name](URL): description OR - [Name](URL)
12
+ const ENTRY_RE = /^- \[([^\]]+)\]\(([^)]+)\)(?::(.*))?$/;
13
+ function parseLlmsTxt(text) {
14
+ const entries = [];
15
+ let currentSection = 'unknown';
16
+ for (const rawLine of text.split('\n')) {
17
+ const line = rawLine.trim();
18
+ if (line.startsWith('## ')) {
19
+ const label = line.slice(3).toLowerCase().trim();
20
+ currentSection = SECTION_MAP[label] ?? label;
21
+ continue;
22
+ }
23
+ const match = ENTRY_RE.exec(line);
24
+ if (!match)
25
+ continue;
26
+ const [, name, url, description = ''] = match;
27
+ // Extract slug from URL path:
28
+ // https://po-ui.io/llms-generated/po-button.md → po-button
29
+ // https://po-ui.io/guides/getting-started → getting-started
30
+ const lastSegment = url.split('/').pop() ?? '';
31
+ const slug = lastSegment.endsWith('.md') ? lastSegment.slice(0, -3) : lastSegment;
32
+ entries.push({
33
+ name,
34
+ slug,
35
+ url,
36
+ description: description.trim(),
37
+ section: currentSection
38
+ });
39
+ }
40
+ return entries;
41
+ }
42
+ //# sourceMappingURL=llms-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-parser.js","sourceRoot":"","sources":["../../projects/mcp/src/llms-parser.ts"],"names":[],"mappings":";;AAmBA,oCAkCC;AA7CD,MAAM,WAAW,GAA2B;IAC1C,yBAAyB,EAAE,YAAY;IACvC,UAAU,EAAE,UAAU;IACtB,sBAAsB,EAAE,YAAY;IACpC,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,yDAAyD;AACzD,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AAEzD,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,cAAc,GAAG,SAAS,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YACjD,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;QAE9C,8BAA8B;QAC9B,4DAA4D;QAC5D,mEAAmE;QACnE,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAElF,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@po-ui/mcp",
3
+ "version": "21.8.0",
4
+ "description": "MCP Server para documentação do PO UI — acessa componentes, guias e busca via Model Context Protocol",
5
+ "main": "./index.js",
6
+ "bin": {
7
+ "po-ui-mcp": "./index.js"
8
+ },
9
+ "keywords": [
10
+ "po-ui",
11
+ "mcp",
12
+ "model-context-protocol",
13
+ "angular",
14
+ "components",
15
+ "documentation",
16
+ "ai"
17
+ ],
18
+ "author": "PO UI",
19
+ "license": "MIT",
20
+ "homepage": "https://po-ui.io",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/po-ui/po-angular"
24
+ },
25
+ "engines": {
26
+ "node": ">=18.0.0"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.12.1",
30
+ "zod": "^3.23.0"
31
+ }
32
+ }
package/server.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /** Convert a user-supplied identifier to a slug.
3
+ * Handles: "po-button", "<po-button>", "PoButtonComponent", "PoDialogService"
4
+ */
5
+ export declare function normaliseSlug(input: string): string;
6
+ interface SearchResult {
7
+ componentName: string;
8
+ context: string;
9
+ }
10
+ /** Extract the heading text from the first `# ...` line, or fallback. */
11
+ export declare function extractHeading(lines: string[]): string;
12
+ /** Return indexes of lines that contain the query (case-insensitive). */
13
+ export declare function findMatchingLineIndexes(lines: string[], lowerQuery: string): number[];
14
+ /** Build a context snippet with ±2 lines around each of the first 3 matches. */
15
+ export declare function buildContextSnippet(lines: string[], matchingIndexes: number[]): string;
16
+ /**
17
+ * Split llms-full.txt into sections by "---" separator,
18
+ * then find sections matching the query and extract context snippets.
19
+ */
20
+ export declare function searchFullText(fullText: string, query: string, maxResults: number): SearchResult[];
21
+ export declare function createServer(): McpServer;
22
+ export {};
package/server.js ADDED
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normaliseSlug = normaliseSlug;
4
+ exports.extractHeading = extractHeading;
5
+ exports.findMatchingLineIndexes = findMatchingLineIndexes;
6
+ exports.buildContextSnippet = buildContextSnippet;
7
+ exports.searchFullText = searchFullText;
8
+ exports.createServer = createServer;
9
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
10
+ const zod_1 = require("zod");
11
+ const docs_client_1 = require("./docs-client");
12
+ const llms_parser_1 = require("./llms-parser");
13
+ // Session-scoped cache for the llms.txt index
14
+ let cachedEntries = null;
15
+ async function getLlmsEntries() {
16
+ if (!cachedEntries) {
17
+ const text = await (0, docs_client_1.fetchLlmsTxt)();
18
+ cachedEntries = (0, llms_parser_1.parseLlmsTxt)(text);
19
+ }
20
+ return cachedEntries;
21
+ }
22
+ const SECTION_LABELS = {
23
+ components: 'Componentes e Diretivas',
24
+ services: 'Serviços',
25
+ interfaces: 'Interfaces e Modelos',
26
+ enums: 'Enums',
27
+ guides: 'Guias'
28
+ };
29
+ /** Convert a user-supplied identifier to a slug.
30
+ * Handles: "po-button", "<po-button>", "PoButtonComponent", "PoDialogService"
31
+ */
32
+ function normaliseSlug(input) {
33
+ let s = input.trim();
34
+ // Strip angle brackets: <po-button> → po-button
35
+ if (s.startsWith('<') && s.endsWith('>')) {
36
+ s = s.slice(1, -1);
37
+ }
38
+ // Convert CamelCase class names to kebab-case
39
+ if (/^[A-Z]/.test(s)) {
40
+ s = s
41
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
42
+ .replace(/(?<=[A-Z])(?=[A-Z][a-z])/g, '-')
43
+ .toLowerCase();
44
+ // Remove trailing "-component" suffix (components use selector as slug, not class name)
45
+ s = s.replace(/-component$/, '');
46
+ }
47
+ return s;
48
+ }
49
+ /** Extract the heading text from the first `# ...` line, or fallback. */
50
+ function extractHeading(lines) {
51
+ return (lines
52
+ .find(l => l.startsWith('# '))
53
+ ?.slice(2)
54
+ .trim() ?? 'Desconhecido');
55
+ }
56
+ /** Return indexes of lines that contain the query (case-insensitive). */
57
+ function findMatchingLineIndexes(lines, lowerQuery) {
58
+ const indexes = [];
59
+ for (let i = 0; i < lines.length; i++) {
60
+ if (lines[i].toLowerCase().includes(lowerQuery)) {
61
+ indexes.push(i);
62
+ }
63
+ }
64
+ return indexes;
65
+ }
66
+ /** Build a context snippet with ±2 lines around each of the first 3 matches. */
67
+ function buildContextSnippet(lines, matchingIndexes) {
68
+ const contextParts = [];
69
+ const seen = new Set();
70
+ for (const idx of matchingIndexes.slice(0, 3)) {
71
+ const start = Math.max(0, idx - 2);
72
+ const end = Math.min(lines.length - 1, idx + 2);
73
+ for (let i = start; i <= end; i++) {
74
+ if (!seen.has(i)) {
75
+ seen.add(i);
76
+ contextParts.push(lines[i]);
77
+ }
78
+ }
79
+ contextParts.push('...');
80
+ }
81
+ return contextParts.join('\n').trim();
82
+ }
83
+ /**
84
+ * Split llms-full.txt into sections by "---" separator,
85
+ * then find sections matching the query and extract context snippets.
86
+ */
87
+ function searchFullText(fullText, query, maxResults) {
88
+ const lowerQuery = query.toLowerCase();
89
+ const sections = fullText.split(/\n\n---\n\n/);
90
+ const results = [];
91
+ for (const section of sections) {
92
+ if (!section.toLowerCase().includes(lowerQuery))
93
+ continue;
94
+ const lines = section.split('\n');
95
+ const matchingIndexes = findMatchingLineIndexes(lines, lowerQuery);
96
+ if (matchingIndexes.length === 0)
97
+ continue;
98
+ results.push({
99
+ componentName: extractHeading(lines),
100
+ context: buildContextSnippet(lines, matchingIndexes)
101
+ });
102
+ if (results.length >= maxResults)
103
+ break;
104
+ }
105
+ return results;
106
+ }
107
+ function createServer() {
108
+ const server = new mcp_js_1.McpServer({
109
+ name: 'po-ui',
110
+ version: '1.0.0'
111
+ });
112
+ // ── list_components ─────────────────────────────────────────────────────────
113
+ // @ts-ignore — TS2589: limitação de inferência genérica do @modelcontextprotocol/sdk com zod
114
+ server.registerTool('list_components', {
115
+ description: 'Lista todos os componentes, diretivas, serviços, interfaces e enums do PO UI com descrições resumidas. ' +
116
+ 'Use para descobrir quais APIs existem antes de buscar detalhes.',
117
+ inputSchema: {
118
+ section: zod_1.z
119
+ .enum(['components', 'services', 'interfaces', 'enums', 'guides', 'all'])
120
+ .optional()
121
+ .describe('Filtrar por seção: "components", "services", "interfaces", "enums", "guides" ou "all" (padrão).'),
122
+ filter: zod_1.z.string().optional().describe('Filtro de texto livre no nome ou descrição (case-insensitive).')
123
+ }
124
+ }, async ({ section, filter }) => {
125
+ const resolvedSection = section ?? 'all';
126
+ let entries;
127
+ try {
128
+ entries = await getLlmsEntries();
129
+ }
130
+ catch (err) {
131
+ const msg = err instanceof Error ? err.message : String(err);
132
+ return { content: [{ type: 'text', text: `Erro ao carregar índice: ${msg}` }] };
133
+ }
134
+ let results = resolvedSection === 'all' ? entries : entries.filter(e => e.section === resolvedSection);
135
+ if (filter) {
136
+ const q = filter.toLowerCase();
137
+ results = results.filter(e => e.name.toLowerCase().includes(q) || e.description.toLowerCase().includes(q));
138
+ }
139
+ if (results.length === 0) {
140
+ return { content: [{ type: 'text', text: 'Nenhum resultado encontrado.' }] };
141
+ }
142
+ // Group by section
143
+ const grouped = new Map();
144
+ for (const e of results) {
145
+ const arr = grouped.get(e.section) ?? [];
146
+ arr.push(e);
147
+ grouped.set(e.section, arr);
148
+ }
149
+ const lines = [];
150
+ for (const [sec, items] of grouped) {
151
+ lines.push(`## ${SECTION_LABELS[sec] ?? sec}`);
152
+ lines.push('');
153
+ for (const e of items) {
154
+ lines.push(`- **${e.name}** (\`${e.slug}\`): ${e.description}`);
155
+ }
156
+ lines.push('');
157
+ }
158
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
159
+ });
160
+ // ── get_component_docs ───────────────────────────────────────────────────────
161
+ server.registerTool('get_component_docs', {
162
+ description: 'Retorna a documentação completa em Markdown para um componente, serviço, interface ou enum do PO UI. ' +
163
+ 'Inclui descrição, tabelas de inputs/outputs/propriedades, tipos e exemplos de uso.',
164
+ inputSchema: {
165
+ slug: zod_1.z
166
+ .string()
167
+ .describe('Slug do componente. Exemplos: "po-button", "po-table", "po-dialog-service", "po-table-column". ' +
168
+ 'Aceita também nomes de classe ("PoButtonComponent") e seletores HTML ("<po-button>"). ' +
169
+ 'Use list_components para descobrir slugs disponíveis.')
170
+ }
171
+ }, async ({ slug }) => {
172
+ const normalised = normaliseSlug(slug);
173
+ try {
174
+ const markdown = await (0, docs_client_1.fetchComponentDoc)(normalised);
175
+ return { content: [{ type: 'text', text: markdown }] };
176
+ }
177
+ catch {
178
+ // If normalised slug failed, try the original input as-is
179
+ if (normalised !== slug) {
180
+ try {
181
+ const markdown = await (0, docs_client_1.fetchComponentDoc)(slug);
182
+ return { content: [{ type: 'text', text: markdown }] };
183
+ }
184
+ catch {
185
+ // Fall through to error with suggestions
186
+ }
187
+ }
188
+ // Provide helpful suggestions from the index
189
+ try {
190
+ const entries = await getLlmsEntries();
191
+ const q = normalised.toLowerCase();
192
+ const suggestions = entries
193
+ .filter(e => e.slug.includes(q) || q.includes(e.slug.split('-')[0] ?? ''))
194
+ .slice(0, 5)
195
+ .map(e => `- ${e.name} (\`${e.slug}\`)`)
196
+ .join('\n');
197
+ return {
198
+ content: [
199
+ {
200
+ type: 'text',
201
+ text: `Componente "${slug}" não encontrado.\n\n` +
202
+ (suggestions
203
+ ? `Sugestões:\n${suggestions}\n\nUse list_components para ver todos.`
204
+ : 'Use list_components para ver todos os slugs disponíveis.')
205
+ }
206
+ ]
207
+ };
208
+ }
209
+ catch {
210
+ return {
211
+ content: [
212
+ {
213
+ type: 'text',
214
+ text: `Componente "${slug}" não encontrado. Use list_components para ver os slugs disponíveis.`
215
+ }
216
+ ]
217
+ };
218
+ }
219
+ }
220
+ });
221
+ // ── search_docs ──────────────────────────────────────────────────────────────
222
+ // @ts-ignore — TS2589: limitação de inferência genérica do @modelcontextprotocol/sdk com zod
223
+ server.registerTool('search_docs', {
224
+ description: 'Busca texto em toda a documentação do PO UI. Útil para encontrar componentes que suportem ' +
225
+ 'uma propriedade específica, um comportamento ou um padrão de uso.',
226
+ inputSchema: {
227
+ query: zod_1.z
228
+ .string()
229
+ .min(2)
230
+ .describe('Texto a buscar (case-insensitive). Ex: "upload de arquivo", "p-loading", "lazy load".'),
231
+ max_results: zod_1.z
232
+ .number()
233
+ .int()
234
+ .min(1)
235
+ .max(50)
236
+ .optional()
237
+ .describe('Número máximo de resultados (padrão: 10, máximo: 50).')
238
+ }
239
+ }, async ({ query, max_results }) => {
240
+ const limit = max_results ?? 10;
241
+ let fullText;
242
+ try {
243
+ fullText = await (0, docs_client_1.fetchLlmsFullTxt)();
244
+ }
245
+ catch (err) {
246
+ const msg = err instanceof Error ? err.message : String(err);
247
+ return { content: [{ type: 'text', text: `Erro ao carregar documentação completa: ${msg}` }] };
248
+ }
249
+ const results = searchFullText(fullText, query, limit);
250
+ if (results.length === 0) {
251
+ return {
252
+ content: [{ type: 'text', text: `Nenhum resultado encontrado para "${query}".` }]
253
+ };
254
+ }
255
+ const output = [
256
+ `Encontrados ${results.length} resultado(s) para "${query}":\n`,
257
+ ...results.map((r, i) => `### Resultado ${i + 1}: ${r.componentName}\n\`\`\`\n${r.context}\n\`\`\``)
258
+ ].join('\n\n');
259
+ return { content: [{ type: 'text', text: output }] };
260
+ });
261
+ // ── get_guide ────────────────────────────────────────────────────────────────
262
+ server.registerTool('get_guide', {
263
+ description: 'Retorna o conteúdo completo de um guia de documentação do PO UI (ex: getting-started, schematics, theme-service). ' +
264
+ 'Use list_components com section="guides" para ver os guias disponíveis.',
265
+ inputSchema: {
266
+ guide: zod_1.z
267
+ .string()
268
+ .describe('Nome do guia sem extensão. Exemplos: "getting-started", "schematics", "browser-support", "llms". ' +
269
+ 'Aceita também com extensão: "getting-started.md".')
270
+ }
271
+ }, async ({ guide }) => {
272
+ try {
273
+ const content = await (0, docs_client_1.fetchGuide)(guide);
274
+ return { content: [{ type: 'text', text: content }] };
275
+ }
276
+ catch (err) {
277
+ const msg = err instanceof Error ? err.message : String(err);
278
+ // Build helpful error with guide list from the index
279
+ try {
280
+ const entries = await getLlmsEntries();
281
+ const guideList = entries
282
+ .filter(e => e.section === 'guides')
283
+ .map(e => `- ${e.name} (\`${e.slug}\`)`)
284
+ .join('\n');
285
+ return {
286
+ content: [
287
+ {
288
+ type: 'text',
289
+ text: `Erro: ${msg}\n\nGuias disponíveis:\n${guideList || 'Nenhum guia no índice.'}`
290
+ }
291
+ ]
292
+ };
293
+ }
294
+ catch {
295
+ return { content: [{ type: 'text', text: `Erro: ${msg}` }] };
296
+ }
297
+ }
298
+ });
299
+ return server;
300
+ }
301
+ //# sourceMappingURL=server.js.map
package/server.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../projects/mcp/src/server.ts"],"names":[],"mappings":"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"}