Skip to content

Commit 44c20a5

Browse files
committed
refactor(@angular/cli): add structured output to examples MCP tool
The `find_examples` MCP tool is updated to frame it as a RAG (Retrieval-Augmented Generation) source, focusing on modern and recently updated Angular features. The tool's description is rewritten to guide the AI on when to use this tool versus the documentation search. A structured output schema is also added to make the results more reliable, and the handler is updated to return data in the new format. (cherry picked from commit eece201)
1 parent 9467f8c commit 44c20a5

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

packages/angular/cli/src/commands/mcp/tools/examples.ts

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,39 @@ type FindExampleInput = z.infer<typeof findExampleInputSchema>;
4242
export const FIND_EXAMPLE_TOOL = declareTool({
4343
name: 'find_examples',
4444
title: 'Find Angular Code Examples',
45-
description:
46-
'Before writing or modifying any Angular code including templates, ' +
47-
'**ALWAYS** use this tool to find current best-practice examples. ' +
48-
'This is critical for ensuring code quality and adherence to modern Angular standards. ' +
49-
'This tool searches a curated database of approved Angular code examples and returns the most relevant results for your query. ' +
50-
'Example Use Cases: ' +
51-
"1) Creating new components, directives, or services (e.g., query: 'standalone component' or 'signal input'). " +
52-
"2) Implementing core features (e.g., query: 'lazy load route', 'httpinterceptor', or 'route guard'). " +
53-
"3) Refactoring existing code to use modern patterns (e.g., query: 'ngfor trackby' or 'form validation').",
45+
description: `
46+
<Purpose>
47+
Augments your knowledge base with a curated database of official, best-practice code examples,
48+
focusing on **modern, new, and recently updated** Angular features. This tool acts as a RAG
49+
(Retrieval-Augmented Generation) source, providing ground-truth information on the latest Angular
50+
APIs and patterns. You **MUST** use it to understand and apply current standards when working with
51+
new or evolving features.
52+
</Purpose>
53+
<Use Cases>
54+
* **Knowledge Augmentation:** Learning about new or updated Angular features (e.g., query: 'signal input' or 'deferrable views').
55+
* **Modern Implementation:** Finding the correct modern syntax for features
56+
(e.g., query: 'functional route guard' or 'http client with fetch').
57+
* **Refactoring to Modern Patterns:** Upgrading older code by finding examples of new syntax
58+
(e.g., query: 'built-in control flow' to replace "*ngIf').
59+
</Use Cases>
60+
<Operational Notes>
61+
* **Tool Selection:** This database primarily contains examples for new and recently updated Angular
62+
features. For established, core features, the main documentation (via the
63+
\`search_documentation\` tool) may be a better source of information.
64+
* The examples in this database are the single source of truth for modern Angular coding patterns.
65+
* The search query uses a powerful full-text search syntax (FTS5). Refer to the 'query'
66+
parameter description for detailed syntax rules and examples.
67+
</Operational Notes>`,
5468
inputSchema: findExampleInputSchema.shape,
69+
outputSchema: {
70+
examples: z.array(
71+
z.object({
72+
content: z
73+
.string()
74+
.describe('A complete, self-contained Angular code example in Markdown format.'),
75+
}),
76+
),
77+
},
5578
isReadOnly: true,
5679
isLocalOnly: true,
5780
shouldRegister: ({ logger }) => {
@@ -96,14 +119,18 @@ async function createFindExampleHandler({ exampleDatabasePath }: McpToolContext)
96119

97120
const sanitizedQuery = escapeSearchQuery(query);
98121

99-
// Query database and return results as text content
100-
const content = [];
122+
// Query database and return results
123+
const examples = [];
124+
const textContent = [];
101125
for (const exampleRecord of queryStatement.all(sanitizedQuery)) {
102-
content.push({ type: 'text' as const, text: exampleRecord['content'] as string });
126+
const exampleContent = exampleRecord['content'] as string;
127+
examples.push({ content: exampleContent });
128+
textContent.push({ type: 'text' as const, text: exampleContent });
103129
}
104130

105131
return {
106-
content,
132+
content: textContent,
133+
structuredContent: { examples },
107134
};
108135
};
109136
}

0 commit comments

Comments
 (0)