import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { generateDNA } from "./tools/generateDNA.js";
import { generateProtein } from "./tools/generateProtein.js";
import { mutateSequence } from "./tools/mutateSequence.js";
import { evolveSequence } from "./tools/evolveSequence.js";
import { simulatePhylogeny } from "./tools/simulatePhylogeny.js";
import { simulateFastq } from "./tools/simulateFastq.js";
const server = new Server(
{
name: "mcp-sequence-simulation",
version: "0.1.0",
},
{
capabilities: {
tools: {},
},
}
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
generateDNA.definition,
generateProtein.definition,
mutateSequence.definition,
evolveSequence.definition,
simulatePhylogeny.definition,
simulateFastq.definition,
],
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
if (!args) {
throw new Error("Tool arguments are required");
}
switch (name) {
case "generate_dna_sequence":
return await generateDNA.handler(args as {
length: number;
gcContent?: number;
count?: number;
seed?: number;
model?: string;
outputFormat?: string;
});
case "generate_protein_sequence":
return await generateProtein.handler(args as {
length: number;
count?: number;
seed?: number;
model?: string;
composition?: Record<string, number>;
outputFormat?: string;
});
case "mutate_sequence":
return await mutateSequence.handler(args as {
sequence: string;
sequenceType: string;
substitutionRate?: number;
insertionRate?: number;
deletionRate?: number;
transitionBias?: number;
iterations?: number;
seed?: number;
outputFormat?: string;
});
case "evolve_sequence":
return await evolveSequence.handler(args as {
sequence: string;
generations: number;
populationSize: number;
mutationRate: number;
selectionPressure?: number;
fitnessFunction?: string;
targetValue?: number;
seed?: number;
trackLineages?: boolean;
outputFormat?: string;
});
case "simulate_phylogeny":
return await simulatePhylogeny.handler(args as {
rootSequence: string;
treeStructure?: string;
numTaxa?: number;
mutationRate?: number;
branchLengthVariation?: number;
molecularClock?: boolean;
substitutionModel?: string;
seed?: number;
outputFormat?: string;
});
case "simulate_fastq_file":
return await simulateFastq.handler(args as {
referenceSequence: string;
readLength: number;
coverage: number;
readType?: string;
insertSize?: number;
insertSizeStd?: number;
errorRate?: number;
qualityModel?: string;
mutationRate?: number;
seed?: number;
outputFormat?: string;
});
default:
throw new Error(`Unknown tool: ${name}`);
}
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);