eul:search
Search EU legislation like directives and regulations using EUR-Lex. Find CELEX numbers, titles, and dates for German legal research.
Instructions
Search EU legislation (directives, regulations, treaties) via EUR-Lex SPARQL endpoint. Returns CELEX numbers, titles, and dates.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term in title (e.g., "Urheberrecht", "Datenschutz", "Verbraucherschutz") | |
| resource_type | Yes | Filter by type (default: any) | any |
| language | Yes | Language code (default: DE) | DE |
| limit | Yes | Maximum results (default: 10) |
Implementation Reference
- src/providers/eul/provider.ts:43-79 (handler)The handleSearch method within EulProvider executes the SPARQL query against the EUR-Lex endpoint to implement eul:search.
private async handleSearch(args: Record<string, unknown>): Promise<ToolResult> { const { query, resource_type = 'any', language = 'DE', limit = 10 } = args as { query: string; resource_type?: string; language?: string; limit?: number; }; const lang3 = LANG_MAP[language.toUpperCase()] || 'DEU'; let typeFilter = ''; if (resource_type !== 'any' && RESOURCE_TYPES[resource_type]) { typeFilter = `?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/${RESOURCE_TYPES[resource_type]}> .`; } const sparql = `PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> SELECT DISTINCT ?celex ?title WHERE { ?work cdm:resource_legal_id_celex ?celex . ${typeFilter} ?expr cdm:expression_belongs_to_work ?work . ?expr cdm:expression_uses_language <http://publications.europa.eu/resource/authority/language/${lang3}> . ?expr cdm:expression_title ?title . FILTER(CONTAINS(LCASE(?title), LCASE("${query.replace(/"/g, '\\"')}"))) } LIMIT ${limit}`; logger.info('Searching EUR-Lex', { query, resource_type }); const response = await axios.get(SPARQL_URL, { params: { query: sparql }, headers: { 'Accept': 'application/sparql-results+json' }, }); const bindings = response.data.results?.bindings || []; const markdown = bindings.map((b: Record<string, { value: string }>, i: number) => `${i + 1}. **${b.celex.value}**\n ${b.title.value.slice(0, 200)}${b.title.value.length > 200 ? '…' : ''}` ).join('\n\n'); return { content: [{ type: 'text', text: `Found ${bindings.length} results:\n\n${markdown}` }], }; } - The input schema definition and tool description for eul:search.
{ name: 'eul:search', description: 'Search EU legislation (directives, regulations, treaties) via EUR-Lex SPARQL endpoint. ' + 'Returns CELEX numbers, titles, and dates.', inputSchema: z.object({ query: z.string().describe('Search term in title (e.g., "Urheberrecht", "Datenschutz", "Verbraucherschutz")'), resource_type: z.enum(['any', 'directive', 'regulation', 'decision', 'treaty']).optional().default('any') .describe('Filter by type (default: any)'), language: z.string().optional().default('DE').describe('Language code (default: DE)'), limit: z.number().optional().default(10).describe('Maximum results (default: 10)'), }), }, - src/providers/eul/provider.ts:34-34 (registration)The dispatch logic within handleToolCall that routes 'eul:search' to its handler.
if (toolName === 'eul:search') return this.handleSearch(args);