oroute-mcp 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.
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @oroute/mcp — O'Route MCP Server
4
+ *
5
+ * Exposes 13 AI models to any MCP-compatible tool (Claude Code, etc.)
6
+ * via three tools: oroute_message, oroute_explain, oroute_status
7
+ * and one resource: oroute://models
8
+ *
9
+ * Environment:
10
+ * OROUTE_API_KEY — required
11
+ * OROUTE_API_URL — optional (default: https://api.oroute.itshin.com)
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/index.js ADDED
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @oroute/mcp — O'Route MCP Server
4
+ *
5
+ * Exposes 13 AI models to any MCP-compatible tool (Claude Code, etc.)
6
+ * via three tools: oroute_message, oroute_explain, oroute_status
7
+ * and one resource: oroute://models
8
+ *
9
+ * Environment:
10
+ * OROUTE_API_KEY — required
11
+ * OROUTE_API_URL — optional (default: https://api.oroute.itshin.com)
12
+ */
13
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
14
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
15
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Configuration
18
+ // ---------------------------------------------------------------------------
19
+ const API_KEY = process.env['OROUTE_API_KEY'] ?? '';
20
+ const API_URL = (process.env['OROUTE_API_URL'] ?? 'https://api.oroute.itshin.com').replace(/\/+$/, '');
21
+ if (!API_KEY) {
22
+ console.error('Error: OROUTE_API_KEY environment variable is required.');
23
+ console.error('Get your key at https://oroute.itshin.com/dashboard');
24
+ process.exit(1);
25
+ }
26
+ async function apiRequest(method, path, body) {
27
+ const url = `${API_URL}${path}`;
28
+ const headers = {
29
+ Authorization: `Bearer ${API_KEY}`,
30
+ Accept: 'application/json',
31
+ };
32
+ if (body !== undefined) {
33
+ headers['Content-Type'] = 'application/json';
34
+ }
35
+ const response = await fetch(url, {
36
+ method,
37
+ headers,
38
+ body: body !== undefined ? JSON.stringify(body) : undefined,
39
+ });
40
+ const text = await response.text();
41
+ let data;
42
+ try {
43
+ data = JSON.parse(text);
44
+ }
45
+ catch {
46
+ data = text;
47
+ }
48
+ return { ok: response.ok, status: response.status, data };
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Model catalog (static — matches PRD)
52
+ // ---------------------------------------------------------------------------
53
+ const MODEL_CATALOG = [
54
+ { id: 'anthropic/claude-sonnet-4-20250514', vendor: 'Anthropic', strengths: 'Balanced coding, analysis, creative writing', inputPrice: 3.0, outputPrice: 15.0, context: 200000 },
55
+ { id: 'anthropic/claude-opus-4-20250514', vendor: 'Anthropic', strengths: 'Most capable — complex reasoning, architecture', inputPrice: 15.0, outputPrice: 75.0, context: 200000 },
56
+ { id: 'anthropic/claude-haiku-3.5', vendor: 'Anthropic', strengths: 'Fast, cost-efficient for simple tasks', inputPrice: 0.8, outputPrice: 4.0, context: 200000 },
57
+ { id: 'openai/gpt-4o', vendor: 'OpenAI', strengths: 'Multimodal, balanced reasoning', inputPrice: 2.5, outputPrice: 10.0, context: 128000 },
58
+ { id: 'openai/gpt-4o-mini', vendor: 'OpenAI', strengths: 'Fast, affordable general purpose', inputPrice: 0.15, outputPrice: 0.6, context: 128000 },
59
+ { id: 'openai/o3', vendor: 'OpenAI', strengths: 'Deep reasoning, math, science', inputPrice: 10.0, outputPrice: 40.0, context: 200000 },
60
+ { id: 'openai/o4-mini', vendor: 'OpenAI', strengths: 'Efficient reasoning tasks', inputPrice: 1.1, outputPrice: 4.4, context: 200000 },
61
+ { id: 'google/gemini-2.5-pro', vendor: 'Google', strengths: 'Long context, multimodal, research', inputPrice: 1.25, outputPrice: 10.0, context: 1000000 },
62
+ { id: 'google/gemini-2.5-flash', vendor: 'Google', strengths: 'Fast, cost-efficient multimodal', inputPrice: 0.15, outputPrice: 0.6, context: 1000000 },
63
+ { id: 'qwen/qwen3-235b-a22b', vendor: 'Qwen', strengths: 'Multilingual, large MoE model', inputPrice: 0.3, outputPrice: 1.2, context: 131072 },
64
+ { id: 'qwen/qwen3-30b-a3b', vendor: 'Qwen', strengths: 'Efficient multilingual tasks', inputPrice: 0.1, outputPrice: 0.5, context: 131072 },
65
+ { id: 'deepseek/deepseek-v3-0324', vendor: 'DeepSeek', strengths: 'Strong coding, reasoning at low cost', inputPrice: 0.27, outputPrice: 1.1, context: 65536 },
66
+ { id: 'deepseek/deepseek-r1', vendor: 'DeepSeek', strengths: 'Deep reasoning, chain-of-thought', inputPrice: 0.55, outputPrice: 2.19, context: 65536 },
67
+ ];
68
+ // ---------------------------------------------------------------------------
69
+ // Tool handlers
70
+ // ---------------------------------------------------------------------------
71
+ async function handleMessage(input) {
72
+ const body = {
73
+ model: 'auto',
74
+ max_tokens: input.max_tokens ?? 1024,
75
+ messages: [{ role: 'user', content: input.prompt }],
76
+ };
77
+ if (input.mode)
78
+ body['mode'] = input.mode;
79
+ if (input.system)
80
+ body['system'] = input.system;
81
+ const result = await apiRequest('POST', '/v1/messages', body);
82
+ if (!result.ok) {
83
+ return `Error (${result.status}): ${JSON.stringify(result.data)}`;
84
+ }
85
+ const data = result.data;
86
+ const textContent = data.content
87
+ ?.filter((b) => b.type === 'text')
88
+ .map((b) => b.text)
89
+ .join('') ?? '';
90
+ const meta = data.oroute;
91
+ const metaLines = meta
92
+ ? [
93
+ '',
94
+ '---',
95
+ `Model: ${meta.actual_model ?? data.model ?? 'unknown'}`,
96
+ `Mode: ${meta.routing_mode ?? 'balanced'}`,
97
+ `Complexity: ${meta.complexity ?? 'unknown'}`,
98
+ `Latency: ${meta.latency_ms ?? '?'}ms`,
99
+ `Cost: $${meta.estimated_cost_usd?.toFixed(6) ?? '?'}`,
100
+ `Tokens: ${data.usage?.input_tokens ?? '?'} in / ${data.usage?.output_tokens ?? '?'} out`,
101
+ ]
102
+ : [];
103
+ return textContent + metaLines.join('\n');
104
+ }
105
+ async function handleExplain(input) {
106
+ const body = { prompt: input.prompt };
107
+ if (input.mode)
108
+ body['mode'] = input.mode;
109
+ const result = await apiRequest('POST', '/v1/routing/explain', body);
110
+ if (!result.ok) {
111
+ return `Error (${result.status}): ${JSON.stringify(result.data)}`;
112
+ }
113
+ const data = result.data;
114
+ const lines = [
115
+ `Complexity: ${data.complexity ?? 'unknown'}`,
116
+ `Selected Model: ${data.selected_model ?? 'unknown'}`,
117
+ `Reasoning: ${data.reasoning ?? ''}`,
118
+ `Estimated Cost: $${data.estimated_cost_usd?.toFixed(6) ?? '?'}`,
119
+ ];
120
+ if (data.scores && data.scores.length > 0) {
121
+ lines.push('', 'Model Scores:');
122
+ for (const s of data.scores) {
123
+ lines.push(` ${s.model}: ${s.composite_score.toFixed(3)} (Q:${s.quality.toFixed(2)} S:${s.speed.toFixed(2)} C:${s.cost.toFixed(2)})`);
124
+ }
125
+ }
126
+ return lines.join('\n');
127
+ }
128
+ async function handleStatus() {
129
+ const result = await apiRequest('GET', '/v1/providers/status');
130
+ if (!result.ok) {
131
+ return `Error (${result.status}): ${JSON.stringify(result.data)}`;
132
+ }
133
+ const data = result.data;
134
+ if (!data.providers || data.providers.length === 0) {
135
+ return 'No provider status data available.';
136
+ }
137
+ const lines = ['Provider Status:', ''];
138
+ for (const p of data.providers) {
139
+ const status = p.isUp ? 'UP' : 'DOWN';
140
+ const latency = p.p50LatencyMs !== undefined ? `${p.p50LatencyMs}ms` : '?';
141
+ const errorRate = p.errorRateLast5m !== undefined ? `${(p.errorRateLast5m * 100).toFixed(1)}%` : '?';
142
+ lines.push(` [${status}] ${p.id} — latency: ${latency}, errors: ${errorRate}`);
143
+ }
144
+ return lines.join('\n');
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Server setup
148
+ // ---------------------------------------------------------------------------
149
+ const server = new Server({
150
+ name: 'oroute-mcp',
151
+ version: '0.1.0',
152
+ }, {
153
+ capabilities: {
154
+ tools: {},
155
+ resources: {},
156
+ },
157
+ });
158
+ // --- List Tools ---
159
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
160
+ tools: [
161
+ {
162
+ name: 'oroute_message',
163
+ description: 'Route a message to the optimal AI model among 13 models (Claude, GPT, Gemini, Qwen, DeepSeek). ' +
164
+ 'O\'Route automatically selects the best model based on task complexity and your chosen optimization mode.',
165
+ inputSchema: {
166
+ type: 'object',
167
+ properties: {
168
+ prompt: {
169
+ type: 'string',
170
+ description: 'The message/prompt to send to the AI model',
171
+ },
172
+ mode: {
173
+ type: 'string',
174
+ enum: ['balanced', 'speed_first', 'quality_first', 'cost_first'],
175
+ description: 'Routing optimization mode. balanced (default): best mix of quality, speed, cost. ' +
176
+ 'speed_first: fastest response. quality_first: best model. cost_first: cheapest option.',
177
+ },
178
+ max_tokens: {
179
+ type: 'number',
180
+ description: 'Maximum tokens in the response (default: 1024)',
181
+ },
182
+ system: {
183
+ type: 'string',
184
+ description: 'System prompt to set context/behavior for the AI model',
185
+ },
186
+ },
187
+ required: ['prompt'],
188
+ },
189
+ },
190
+ {
191
+ name: 'oroute_explain',
192
+ description: 'Explain which AI model would be selected for a given prompt and why, without making an actual API call. ' +
193
+ 'Shows complexity analysis, model scores, and routing reasoning.',
194
+ inputSchema: {
195
+ type: 'object',
196
+ properties: {
197
+ prompt: {
198
+ type: 'string',
199
+ description: 'The prompt to analyze for routing',
200
+ },
201
+ mode: {
202
+ type: 'string',
203
+ enum: ['balanced', 'speed_first', 'quality_first', 'cost_first'],
204
+ description: 'Routing optimization mode to simulate',
205
+ },
206
+ },
207
+ required: ['prompt'],
208
+ },
209
+ },
210
+ {
211
+ name: 'oroute_status',
212
+ description: 'Get real-time performance status of all 13 AI providers. ' +
213
+ 'Shows uptime, latency, and error rates for each model.',
214
+ inputSchema: {
215
+ type: 'object',
216
+ properties: {},
217
+ required: [],
218
+ },
219
+ },
220
+ ],
221
+ }));
222
+ // --- Call Tool ---
223
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
224
+ const { name } = request.params;
225
+ const args = (request.params.arguments ?? {});
226
+ try {
227
+ let text;
228
+ switch (name) {
229
+ case 'oroute_message':
230
+ text = await handleMessage({
231
+ prompt: String(args['prompt'] ?? ''),
232
+ mode: args['mode'],
233
+ max_tokens: args['max_tokens'],
234
+ system: args['system'],
235
+ });
236
+ break;
237
+ case 'oroute_explain':
238
+ text = await handleExplain({
239
+ prompt: String(args['prompt'] ?? ''),
240
+ mode: args['mode'],
241
+ });
242
+ break;
243
+ case 'oroute_status':
244
+ text = await handleStatus();
245
+ break;
246
+ default:
247
+ text = `Unknown tool: ${name}`;
248
+ }
249
+ return { content: [{ type: 'text', text }] };
250
+ }
251
+ catch (error) {
252
+ const message = error instanceof Error ? error.message : String(error);
253
+ return {
254
+ content: [{ type: 'text', text: `Error: ${message}` }],
255
+ isError: true,
256
+ };
257
+ }
258
+ });
259
+ // --- List Resources ---
260
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
261
+ resources: [
262
+ {
263
+ uri: 'oroute://models',
264
+ name: 'O\'Route Model Catalog',
265
+ description: 'All 13 AI models with pricing, strengths, and context window sizes',
266
+ mimeType: 'application/json',
267
+ },
268
+ ],
269
+ }));
270
+ // --- Read Resource ---
271
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
272
+ const { uri } = request.params;
273
+ if (uri === 'oroute://models') {
274
+ const models = MODEL_CATALOG.map((m) => ({
275
+ id: m.id,
276
+ vendor: m.vendor,
277
+ strengths: m.strengths,
278
+ pricing: {
279
+ input_per_1m_tokens_usd: m.inputPrice,
280
+ output_per_1m_tokens_usd: m.outputPrice,
281
+ },
282
+ context_window: m.context,
283
+ }));
284
+ return {
285
+ contents: [
286
+ {
287
+ uri,
288
+ mimeType: 'application/json',
289
+ text: JSON.stringify({ models, total: models.length }, null, 2),
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ throw new Error(`Unknown resource: ${uri}`);
295
+ });
296
+ // ---------------------------------------------------------------------------
297
+ // Start
298
+ // ---------------------------------------------------------------------------
299
+ async function main() {
300
+ const transport = new StdioServerTransport();
301
+ await server.connect(transport);
302
+ }
303
+ main().catch((error) => {
304
+ console.error('Fatal error:', error);
305
+ process.exit(1);
306
+ });
307
+ //# 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/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "oroute-mcp",
3
+ "version": "0.1.0",
4
+ "description": "O'Route MCP Server — use 13 AI models from Claude Code, Cursor, or any MCP tool",
5
+ "type": "module",
6
+ "bin": {
7
+ "oroute-mcp": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": ["dist/**/*"],
11
+ "keywords": [
12
+ "mcp", "ai", "llm", "routing", "claude-code", "cursor",
13
+ "claude", "gpt", "gemini", "deepseek", "qwen", "model-context-protocol"
14
+ ],
15
+ "author": "O'Route <netclaus@gmail.com>",
16
+ "license": "MIT",
17
+ "homepage": "https://oroute.itshin.com/developers",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/netclaus/oroute"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsx src/index.ts",
25
+ "typecheck": "tsc --noEmit",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.0.0",
33
+ "tsx": "^4.21.0",
34
+ "typescript": "^5.7.0"
35
+ }
36
+ }