Add Prettier as a dev dependency with .prettierrc.json config and .prettierignore. Hook added via mirrors-prettier in pre-commit config. All TypeScript, JSON, Markdown, and YAML files auto-formatted. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
/**
|
|
* Freerouting autoroute tools for KiCAD MCP server
|
|
*
|
|
* Provides autorouting via Freerouting (Specctra DSN/SES workflow).
|
|
*/
|
|
|
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
import { z } from "zod";
|
|
|
|
export function registerFreeroutingTools(server: McpServer, callKicadScript: Function) {
|
|
// Full autoroute: export DSN -> run Freerouting -> import SES
|
|
server.tool(
|
|
"autoroute",
|
|
"Run Freerouting autorouter on the current PCB. Exports to Specctra DSN, runs Freerouting CLI, and imports the routed SES result. Requires Java 11+ and freerouting.jar (see check_freerouting).",
|
|
{
|
|
boardPath: z.string().optional().describe("Path to .kicad_pcb file (default: current board)"),
|
|
freeroutingJar: z
|
|
.string()
|
|
.optional()
|
|
.describe(
|
|
"Path to freerouting.jar (default: ~/.kicad-mcp/freerouting.jar or FREEROUTING_JAR env)",
|
|
),
|
|
maxPasses: z.number().optional().describe("Maximum routing passes (default: 20)"),
|
|
timeout: z.number().optional().describe("Timeout in seconds (default: 300)"),
|
|
},
|
|
async (args: any) => {
|
|
const result = await callKicadScript("autoroute", args);
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
);
|
|
|
|
// Export DSN only
|
|
server.tool(
|
|
"export_dsn",
|
|
"Export the current PCB to Specctra DSN format. Useful for manual Freerouting workflow or external autorouters.",
|
|
{
|
|
boardPath: z.string().optional().describe("Path to .kicad_pcb file (default: current board)"),
|
|
outputPath: z
|
|
.string()
|
|
.optional()
|
|
.describe("Output DSN file path (default: same dir as board)"),
|
|
},
|
|
async (args: any) => {
|
|
const result = await callKicadScript("export_dsn", args);
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
);
|
|
|
|
// Import SES
|
|
server.tool(
|
|
"import_ses",
|
|
"Import a Specctra SES (session) file into the current PCB. Use after running Freerouting externally.",
|
|
{
|
|
sesPath: z.string().describe("Path to the .ses file to import"),
|
|
boardPath: z.string().optional().describe("Path to .kicad_pcb file (default: current board)"),
|
|
},
|
|
async (args: any) => {
|
|
const result = await callKicadScript("import_ses", args);
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
);
|
|
|
|
// Check Freerouting dependencies
|
|
server.tool(
|
|
"check_freerouting",
|
|
"Check if Java and Freerouting JAR are available on the system. Run this before autoroute to verify prerequisites.",
|
|
{
|
|
freeroutingJar: z.string().optional().describe("Path to freerouting.jar to check"),
|
|
},
|
|
async (args: any) => {
|
|
const result = await callKicadScript("check_freerouting", args);
|
|
return {
|
|
content: [
|
|
{
|
|
type: "text",
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
);
|
|
}
|