@rotifer/mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cloud.d.ts +60 -0
- package/dist/cloud.js +154 -0
- package/dist/cloud.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/tools.d.ts +33 -0
- package/dist/tools.js +50 -0
- package/dist/tools.js.map +1 -0
- package/package.json +43 -0
package/dist/cloud.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
interface CloudConfig {
|
|
2
|
+
endpoint: string;
|
|
3
|
+
anonKey: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function loadCloudConfig(): CloudConfig;
|
|
6
|
+
export interface Gene {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
owner: string;
|
|
10
|
+
domain: string;
|
|
11
|
+
version: string;
|
|
12
|
+
fidelity: string;
|
|
13
|
+
description: string;
|
|
14
|
+
wasm_size: number;
|
|
15
|
+
downloads: number;
|
|
16
|
+
reputation_score: number | null;
|
|
17
|
+
created_at: string;
|
|
18
|
+
updated_at: string;
|
|
19
|
+
phenotype?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface GeneListResult {
|
|
22
|
+
genes: Gene[];
|
|
23
|
+
total: number;
|
|
24
|
+
page: number;
|
|
25
|
+
per_page: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function listGenes(options: {
|
|
28
|
+
domain?: string;
|
|
29
|
+
query?: string;
|
|
30
|
+
fidelity?: string;
|
|
31
|
+
page?: number;
|
|
32
|
+
perPage?: number;
|
|
33
|
+
}): Promise<GeneListResult>;
|
|
34
|
+
export declare function getGene(id: string): Promise<Gene & {
|
|
35
|
+
phenotype: Record<string, unknown>;
|
|
36
|
+
}>;
|
|
37
|
+
export interface ArenaEntry {
|
|
38
|
+
rank: number;
|
|
39
|
+
gene_id: string;
|
|
40
|
+
gene_name: string;
|
|
41
|
+
owner: string;
|
|
42
|
+
domain: string;
|
|
43
|
+
fidelity: string;
|
|
44
|
+
fitness: number;
|
|
45
|
+
safety: number;
|
|
46
|
+
reputation_score: number | null;
|
|
47
|
+
total_calls: number;
|
|
48
|
+
last_evaluated: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ArenaRankingsResult {
|
|
51
|
+
rankings: ArenaEntry[];
|
|
52
|
+
total: number;
|
|
53
|
+
domain: string | null;
|
|
54
|
+
}
|
|
55
|
+
export declare function getArenaRankings(options: {
|
|
56
|
+
domain?: string;
|
|
57
|
+
page?: number;
|
|
58
|
+
perPage?: number;
|
|
59
|
+
}): Promise<ArenaRankingsResult>;
|
|
60
|
+
export {};
|
package/dist/cloud.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const ROTIFER_HOME = join(process.env.HOME || process.env.USERPROFILE || "/tmp", ".rotifer");
|
|
4
|
+
const DEFAULT_ANON_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZpaGJtcHVxbGFtaHhibWFoY2plIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzE4MjUxMTQsImV4cCI6MjA4NzQwMTExNH0.t77n7TZ2jV04lya2sWuv4AYAcXnsc49jcfVIJr0heYQ";
|
|
5
|
+
let _cachedConfig = null;
|
|
6
|
+
export function loadCloudConfig() {
|
|
7
|
+
if (_cachedConfig)
|
|
8
|
+
return _cachedConfig;
|
|
9
|
+
const configPath = join(ROTIFER_HOME, "cloud.json");
|
|
10
|
+
if (existsSync(configPath)) {
|
|
11
|
+
try {
|
|
12
|
+
const file = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
13
|
+
_cachedConfig = {
|
|
14
|
+
endpoint: file.endpoint || process.env.ROTIFER_CLOUD_ENDPOINT || "https://cloud.rotifer.dev",
|
|
15
|
+
anonKey: file.anonKey || process.env.ROTIFER_CLOUD_ANON_KEY || DEFAULT_ANON_KEY,
|
|
16
|
+
};
|
|
17
|
+
return _cachedConfig;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// fall through
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
_cachedConfig = {
|
|
24
|
+
endpoint: process.env.ROTIFER_CLOUD_ENDPOINT || "https://cloud.rotifer.dev",
|
|
25
|
+
anonKey: process.env.ROTIFER_CLOUD_ANON_KEY || DEFAULT_ANON_KEY,
|
|
26
|
+
};
|
|
27
|
+
return _cachedConfig;
|
|
28
|
+
}
|
|
29
|
+
function apiUrl(path) {
|
|
30
|
+
const config = loadCloudConfig();
|
|
31
|
+
return `${config.endpoint.replace(/\/+$/, "")}/rest/v1${path}`;
|
|
32
|
+
}
|
|
33
|
+
function headers() {
|
|
34
|
+
const config = loadCloudConfig();
|
|
35
|
+
return {
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
apikey: config.anonKey,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function handleResponse(res) {
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
const body = await res.text();
|
|
43
|
+
let msg;
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(body);
|
|
46
|
+
msg = parsed.message || parsed.error?.message || body;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
msg = body;
|
|
50
|
+
}
|
|
51
|
+
if (res.status === 0 || msg.includes("ENOTFOUND") || msg.includes("ECONNREFUSED")) {
|
|
52
|
+
throw new Error(`Cannot reach Rotifer Cloud API (${loadCloudConfig().endpoint}). ` +
|
|
53
|
+
"The service may be temporarily unavailable. Check https://rotifer.dev for status.");
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Cloud API error (${res.status}): ${msg}`);
|
|
56
|
+
}
|
|
57
|
+
return res.json();
|
|
58
|
+
}
|
|
59
|
+
export async function listGenes(options) {
|
|
60
|
+
const params = new URLSearchParams();
|
|
61
|
+
params.set("published", "eq.true");
|
|
62
|
+
params.set("select", "id,name,domain,version,fidelity,description,wasm_size,downloads,reputation_score,created_at,updated_at,profiles(username)");
|
|
63
|
+
params.set("order", "created_at.desc");
|
|
64
|
+
if (options.domain)
|
|
65
|
+
params.set("domain", `eq.${options.domain}`);
|
|
66
|
+
if (options.fidelity)
|
|
67
|
+
params.set("fidelity", `eq.${options.fidelity}`);
|
|
68
|
+
if (options.query) {
|
|
69
|
+
const q = options.query.replace(/[%_\\().,*]/g, "");
|
|
70
|
+
if (q.length > 0) {
|
|
71
|
+
params.set("or", `(name.ilike.*${q}*,description.ilike.*${q}*)`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const limit = Math.min(options.perPage || 20, 50);
|
|
75
|
+
const offset = ((options.page || 1) - 1) * limit;
|
|
76
|
+
params.set("limit", String(limit));
|
|
77
|
+
params.set("offset", String(offset));
|
|
78
|
+
const res = await fetch(apiUrl(`/genes?${params}`), {
|
|
79
|
+
headers: { ...headers(), Prefer: "count=exact" },
|
|
80
|
+
});
|
|
81
|
+
const total = parseInt(res.headers.get("content-range")?.split("/")[1] || "0", 10);
|
|
82
|
+
const data = await handleResponse(res);
|
|
83
|
+
const genes = data.map((row) => ({
|
|
84
|
+
id: row.id,
|
|
85
|
+
name: row.name,
|
|
86
|
+
owner: row.profiles?.username || "unknown",
|
|
87
|
+
domain: row.domain,
|
|
88
|
+
version: row.version,
|
|
89
|
+
fidelity: row.fidelity,
|
|
90
|
+
description: row.description,
|
|
91
|
+
wasm_size: row.wasm_size || 0,
|
|
92
|
+
downloads: row.downloads || 0,
|
|
93
|
+
reputation_score: row.reputation_score ?? null,
|
|
94
|
+
created_at: row.created_at,
|
|
95
|
+
updated_at: row.updated_at,
|
|
96
|
+
}));
|
|
97
|
+
return { genes, total, page: options.page || 1, per_page: limit };
|
|
98
|
+
}
|
|
99
|
+
export async function getGene(id) {
|
|
100
|
+
const params = new URLSearchParams();
|
|
101
|
+
params.set("id", `eq.${id}`);
|
|
102
|
+
params.set("select", "*, profiles(username)");
|
|
103
|
+
const res = await fetch(apiUrl(`/genes?${params}`), { headers: headers() });
|
|
104
|
+
const data = await handleResponse(res);
|
|
105
|
+
if (data.length === 0)
|
|
106
|
+
throw new Error(`Gene '${id}' not found`);
|
|
107
|
+
const row = data[0];
|
|
108
|
+
return {
|
|
109
|
+
id: row.id,
|
|
110
|
+
name: row.name,
|
|
111
|
+
owner: row.profiles?.username || "unknown",
|
|
112
|
+
domain: row.domain,
|
|
113
|
+
version: row.version,
|
|
114
|
+
fidelity: row.fidelity,
|
|
115
|
+
description: row.description,
|
|
116
|
+
phenotype: row.phenotype || {},
|
|
117
|
+
wasm_size: row.wasm_size || 0,
|
|
118
|
+
downloads: row.downloads || 0,
|
|
119
|
+
reputation_score: row.reputation_score ?? null,
|
|
120
|
+
created_at: row.created_at,
|
|
121
|
+
updated_at: row.updated_at,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export async function getArenaRankings(options) {
|
|
125
|
+
const params = new URLSearchParams();
|
|
126
|
+
params.set("select", "fitness_value,safety_score,total_calls,last_evaluated,domain,genes(id,name,fidelity,reputation_score,profiles(username))");
|
|
127
|
+
params.set("order", "fitness_value.desc");
|
|
128
|
+
if (options.domain)
|
|
129
|
+
params.set("domain", `eq.${options.domain}`);
|
|
130
|
+
const limit = Math.min(options.perPage || 20, 50);
|
|
131
|
+
const offset = ((options.page || 1) - 1) * limit;
|
|
132
|
+
params.set("limit", String(limit));
|
|
133
|
+
params.set("offset", String(offset));
|
|
134
|
+
const res = await fetch(apiUrl(`/arena_entries?${params}`), {
|
|
135
|
+
headers: { ...headers(), Prefer: "count=exact" },
|
|
136
|
+
});
|
|
137
|
+
const total = parseInt(res.headers.get("content-range")?.split("/")[1] || "0", 10);
|
|
138
|
+
const data = await handleResponse(res);
|
|
139
|
+
const rankings = data.map((row, i) => ({
|
|
140
|
+
rank: offset + i + 1,
|
|
141
|
+
gene_id: row.genes?.id || "",
|
|
142
|
+
gene_name: row.genes?.name || "unknown",
|
|
143
|
+
owner: row.genes?.profiles?.username || "unknown",
|
|
144
|
+
domain: row.domain,
|
|
145
|
+
fidelity: row.genes?.fidelity || "Wrapped",
|
|
146
|
+
fitness: row.fitness_value,
|
|
147
|
+
safety: row.safety_score,
|
|
148
|
+
reputation_score: row.genes?.reputation_score ?? null,
|
|
149
|
+
total_calls: row.total_calls || 0,
|
|
150
|
+
last_evaluated: row.last_evaluated,
|
|
151
|
+
}));
|
|
152
|
+
return { rankings, total, domain: options.domain || null };
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { searchGenes, getGeneDetail, arenaRankings, compareGenes } from "./tools.js";
|
|
6
|
+
const server = new Server({ name: "rotifer", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
7
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
8
|
+
tools: [
|
|
9
|
+
{
|
|
10
|
+
name: "search_genes",
|
|
11
|
+
description: "Search the Rotifer Gene ecosystem. Returns a list of Genes matching the query, filterable by domain and fidelity.",
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
query: { type: "string", description: "Free-text search by gene name or description" },
|
|
16
|
+
domain: { type: "string", description: "Filter by capability domain (e.g. search.web, code.format)" },
|
|
17
|
+
fidelity: { type: "string", enum: ["Wrapped", "Hybrid", "Native", "Unknown"], description: "Filter by gene fidelity type" },
|
|
18
|
+
page: { type: "number", description: "Page number (default 1)" },
|
|
19
|
+
perPage: { type: "number", description: "Results per page (default 20, max 50)" },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "get_gene_detail",
|
|
25
|
+
description: "Get detailed information about a specific Gene by its ID, including phenotype, fitness, and metadata.",
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
id: { type: "string", description: "Gene UUID" },
|
|
30
|
+
},
|
|
31
|
+
required: ["id"],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "get_arena_rankings",
|
|
36
|
+
description: "Get Arena rankings for a domain. Genes are sorted by F(g) fitness score. Use this to find the best Gene for a capability.",
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: "object",
|
|
39
|
+
properties: {
|
|
40
|
+
domain: { type: "string", description: "Capability domain (e.g. search.web)" },
|
|
41
|
+
page: { type: "number", description: "Page number (default 1)" },
|
|
42
|
+
perPage: { type: "number", description: "Results per page (default 20)" },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "compare_genes",
|
|
48
|
+
description: "Compare two or more Genes by their F(g) fitness metrics. Returns side-by-side fitness breakdown.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
gene_ids: {
|
|
53
|
+
type: "array",
|
|
54
|
+
items: { type: "string" },
|
|
55
|
+
description: "Array of Gene UUIDs to compare (2-5)",
|
|
56
|
+
minItems: 2,
|
|
57
|
+
maxItems: 5,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
required: ["gene_ids"],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
}));
|
|
65
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
66
|
+
const { name, arguments: args } = request.params;
|
|
67
|
+
try {
|
|
68
|
+
switch (name) {
|
|
69
|
+
case "search_genes":
|
|
70
|
+
return { content: [{ type: "text", text: JSON.stringify(await searchGenes(args), null, 2) }] };
|
|
71
|
+
case "get_gene_detail":
|
|
72
|
+
return { content: [{ type: "text", text: JSON.stringify(await getGeneDetail(args), null, 2) }] };
|
|
73
|
+
case "get_arena_rankings":
|
|
74
|
+
return { content: [{ type: "text", text: JSON.stringify(await arenaRankings(args), null, 2) }] };
|
|
75
|
+
case "compare_genes":
|
|
76
|
+
return { content: [{ type: "text", text: JSON.stringify(await compareGenes(args), null, 2) }] };
|
|
77
|
+
default:
|
|
78
|
+
return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return { content: [{ type: "text", text: `Error: ${error.message}` }], isError: true };
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
async function main() {
|
|
86
|
+
const transport = new StdioServerTransport();
|
|
87
|
+
await server.connect(transport);
|
|
88
|
+
}
|
|
89
|
+
main().catch((err) => {
|
|
90
|
+
console.error("Fatal:", err);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Gene, type GeneListResult, type ArenaRankingsResult } from "./cloud.js";
|
|
2
|
+
export declare function searchGenes(args: {
|
|
3
|
+
query?: string;
|
|
4
|
+
domain?: string;
|
|
5
|
+
fidelity?: string;
|
|
6
|
+
page?: number;
|
|
7
|
+
perPage?: number;
|
|
8
|
+
}): Promise<GeneListResult>;
|
|
9
|
+
export declare function getGeneDetail(args: {
|
|
10
|
+
id: string;
|
|
11
|
+
}): Promise<Gene & {
|
|
12
|
+
phenotype: Record<string, unknown>;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function arenaRankings(args: {
|
|
15
|
+
domain?: string;
|
|
16
|
+
page?: number;
|
|
17
|
+
perPage?: number;
|
|
18
|
+
}): Promise<ArenaRankingsResult>;
|
|
19
|
+
export declare function compareGenes(args: {
|
|
20
|
+
gene_ids: string[];
|
|
21
|
+
}): Promise<{
|
|
22
|
+
comparison: Array<{
|
|
23
|
+
gene_id: string;
|
|
24
|
+
gene_name: string;
|
|
25
|
+
domain: string;
|
|
26
|
+
fidelity: string;
|
|
27
|
+
fitness: number | null;
|
|
28
|
+
safety: number | null;
|
|
29
|
+
reputation_score: number | null;
|
|
30
|
+
downloads: number;
|
|
31
|
+
}>;
|
|
32
|
+
recommendation: string;
|
|
33
|
+
}>;
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { listGenes, getGene, getArenaRankings, } from "./cloud.js";
|
|
2
|
+
export async function searchGenes(args) {
|
|
3
|
+
return listGenes({
|
|
4
|
+
query: args.query,
|
|
5
|
+
domain: args.domain,
|
|
6
|
+
fidelity: args.fidelity,
|
|
7
|
+
page: args.page || 1,
|
|
8
|
+
perPage: Math.min(args.perPage || 20, 50),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export async function getGeneDetail(args) {
|
|
12
|
+
if (!args.id)
|
|
13
|
+
throw new Error("Gene id is required");
|
|
14
|
+
return getGene(args.id);
|
|
15
|
+
}
|
|
16
|
+
export async function arenaRankings(args) {
|
|
17
|
+
return getArenaRankings({
|
|
18
|
+
domain: args.domain,
|
|
19
|
+
page: args.page || 1,
|
|
20
|
+
perPage: Math.min(args.perPage || 20, 50),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function compareGenes(args) {
|
|
24
|
+
if (!args.gene_ids || args.gene_ids.length < 2) {
|
|
25
|
+
throw new Error("At least 2 gene_ids required for comparison");
|
|
26
|
+
}
|
|
27
|
+
if (args.gene_ids.length > 5) {
|
|
28
|
+
throw new Error("Maximum 5 genes can be compared at once");
|
|
29
|
+
}
|
|
30
|
+
const genes = await Promise.all(args.gene_ids.map((id) => getGene(id)));
|
|
31
|
+
const comparison = genes.map((g) => ({
|
|
32
|
+
gene_id: g.id,
|
|
33
|
+
gene_name: g.name,
|
|
34
|
+
domain: g.domain,
|
|
35
|
+
fidelity: g.fidelity,
|
|
36
|
+
fitness: g.reputation_score,
|
|
37
|
+
safety: null,
|
|
38
|
+
reputation_score: g.reputation_score,
|
|
39
|
+
downloads: g.downloads,
|
|
40
|
+
}));
|
|
41
|
+
const sorted = [...comparison].sort((a, b) => (b.reputation_score || 0) - (a.reputation_score || 0));
|
|
42
|
+
const best = sorted[0];
|
|
43
|
+
return {
|
|
44
|
+
comparison,
|
|
45
|
+
recommendation: best
|
|
46
|
+
? `Based on available metrics, "${best.gene_name}" has the highest score (${best.reputation_score ?? "N/A"}). Use Arena rankings for authoritative F(g)-based comparison within a domain.`
|
|
47
|
+
: "Insufficient data for recommendation.",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACC,OAAO,SAAS,CAAC;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAoB;IACtD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAInC;IACC,OAAO,gBAAgB,CAAC;QACtB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAElC;IAaC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC,CAAC,EAAE;QACb,SAAS,EAAE,CAAC,CAAC,IAAI;QACjB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,gBAAgB;QAC3B,MAAM,EAAE,IAAqB;QAC7B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAChE,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEvB,OAAO;QACL,UAAU;QACV,cAAc,EAAE,IAAI;YAClB,CAAC,CAAC,gCAAgC,IAAI,CAAC,SAAS,4BAA4B,IAAI,CAAC,gBAAgB,IAAI,KAAK,gFAAgF;YAC1L,CAAC,CAAC,uCAAuC;KAC5C,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rotifer/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Rotifer Protocol MCP Server — search, run, and compare Genes via Model Context Protocol",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"rotifer-mcp-server": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"rotifer",
|
|
21
|
+
"mcp",
|
|
22
|
+
"ai-agent",
|
|
23
|
+
"gene",
|
|
24
|
+
"evolution"
|
|
25
|
+
],
|
|
26
|
+
"license": "Apache-2.0",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://gitlab.com/rotifer-protocol/rotifer-mcp-server"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://rotifer.dev/docs/guides/mcp-setup",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^25.5.0",
|
|
37
|
+
"tsx": "^4.0.0",
|
|
38
|
+
"typescript": "^5.4.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20"
|
|
42
|
+
}
|
|
43
|
+
}
|