Search Swiss Case Law
search_case_lawSearch and retrieve Swiss court decisions using a structured query. Access legal documents from Swiss jurisdictions for analysis or reference, with options for pagination and result size.
Instructions
Search for Swiss court decisions using Entscheidsuche database
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | Starting position for pagination | |
| query | Yes | Search query for legal cases | |
| size | No | Number of results to return (max 50) |
Implementation Reference
- src/index.ts:220-269 (handler)The handler function that executes the 'search_case_law' tool logic. It limits the result size, calls the client's searchCases method, formats the results into a structured output, and handles errors.
async ({ query, size = 10, from = 0 }) => { try { // Limit size to prevent abuse const limitedSize = Math.min(size, 50); const results = await client.searchCases(query, limitedSize, from); const formattedResults = results.hits.hits.map(hit => { const source = hit._source; return { signature: hit._id, court: source.hierarchy[1] || source.canton, language: source.attachment.language, date: source.date, case_number: source.reference[0] || '', title_de: source.title.de, title_fr: source.title.fr, title_it: source.title.it, abstract_de: source.abstract?.de || '', abstract_fr: source.abstract?.fr || '', abstract_it: source.abstract?.it || '', has_html: !!source.attachment.content_url, has_pdf: false, // PDF availability not indicated in new structure document_url: source.attachment.content_url, scrapedate: source.scrapedate }; }); const summary = `Found ${results.hits.total.value} total cases matching "${query}". Showing ${formattedResults.length} results starting from position ${from}.`; return { content: [ { type: "text", text: `${summary}\n\n${JSON.stringify(formattedResults, null, 2)}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error searching case law: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } - src/index.ts:214-218 (schema)Input schema for the 'search_case_law' tool using Zod, defining parameters query, size, and from.
inputSchema: { query: z.string().describe("Search query for legal cases"), size: z.number().optional().default(10).describe("Number of results to return (max 50)"), from: z.number().optional().default(0).describe("Starting position for pagination") } - src/index.ts:210-270 (registration)Registration of the 'search_case_law' tool with the MCP server, specifying the tool name, metadata, input schema, and handler function.
"search_case_law", { title: "Search Swiss Case Law", description: "Search for Swiss court decisions using Entscheidsuche database", inputSchema: { query: z.string().describe("Search query for legal cases"), size: z.number().optional().default(10).describe("Number of results to return (max 50)"), from: z.number().optional().default(0).describe("Starting position for pagination") } }, async ({ query, size = 10, from = 0 }) => { try { // Limit size to prevent abuse const limitedSize = Math.min(size, 50); const results = await client.searchCases(query, limitedSize, from); const formattedResults = results.hits.hits.map(hit => { const source = hit._source; return { signature: hit._id, court: source.hierarchy[1] || source.canton, language: source.attachment.language, date: source.date, case_number: source.reference[0] || '', title_de: source.title.de, title_fr: source.title.fr, title_it: source.title.it, abstract_de: source.abstract?.de || '', abstract_fr: source.abstract?.fr || '', abstract_it: source.abstract?.it || '', has_html: !!source.attachment.content_url, has_pdf: false, // PDF availability not indicated in new structure document_url: source.attachment.content_url, scrapedate: source.scrapedate }; }); const summary = `Found ${results.hits.total.value} total cases matching "${query}". Showing ${formattedResults.length} results starting from position ${from}.`; return { content: [ { type: "text", text: `${summary}\n\n${JSON.stringify(formattedResults, null, 2)}` } ] }; } catch (error) { return { content: [ { type: "text", text: `Error searching case law: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } } ); - src/index.ts:72-98 (helper)Supporting method in EntscheidungsucheClient that performs the actual API search to the Entscheidsuche endpoint, used by the tool handler.
async searchCases(query: string, size: number = 10, from: number = 0): Promise<SearchResult> { const searchBody = { query: { simple_query_string: { query: query, default_operator: "and" } }, size, from, sort: [{ date: { order: "desc" } }] }; const response = await fetch(this.searchEndpoint, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(searchBody) }); if (!response.ok) { throw new Error(`Search failed: ${response.status} ${response.statusText}`); } return await response.json(); }