@aibtc/mcp-server 1.0.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.
Files changed (178) hide show
  1. package/README.md +340 -0
  2. package/dist/api.d.ts +9 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +79 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/config/contracts.d.ts +169 -0
  7. package/dist/config/contracts.d.ts.map +1 -0
  8. package/dist/config/contracts.js +250 -0
  9. package/dist/config/contracts.js.map +1 -0
  10. package/dist/config/index.d.ts +3 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +3 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/networks.d.ts +11 -0
  15. package/dist/config/networks.d.ts.map +1 -0
  16. package/dist/config/networks.js +21 -0
  17. package/dist/config/networks.js.map +1 -0
  18. package/dist/endpoints/index.d.ts +2 -0
  19. package/dist/endpoints/index.d.ts.map +1 -0
  20. package/dist/endpoints/index.js +2 -0
  21. package/dist/endpoints/index.js.map +1 -0
  22. package/dist/endpoints/registry.d.ts +38 -0
  23. package/dist/endpoints/registry.d.ts.map +1 -0
  24. package/dist/endpoints/registry.js +935 -0
  25. package/dist/endpoints/registry.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +79 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/services/bitflow.service.d.ts +159 -0
  31. package/dist/services/bitflow.service.d.ts.map +1 -0
  32. package/dist/services/bitflow.service.js +325 -0
  33. package/dist/services/bitflow.service.js.map +1 -0
  34. package/dist/services/bns.service.d.ts +87 -0
  35. package/dist/services/bns.service.d.ts.map +1 -0
  36. package/dist/services/bns.service.js +312 -0
  37. package/dist/services/bns.service.js.map +1 -0
  38. package/dist/services/defi.service.d.ts +146 -0
  39. package/dist/services/defi.service.d.ts.map +1 -0
  40. package/dist/services/defi.service.js +461 -0
  41. package/dist/services/defi.service.js.map +1 -0
  42. package/dist/services/hiro-api.d.ts +438 -0
  43. package/dist/services/hiro-api.d.ts.map +1 -0
  44. package/dist/services/hiro-api.js +376 -0
  45. package/dist/services/hiro-api.js.map +1 -0
  46. package/dist/services/nft.service.d.ts +70 -0
  47. package/dist/services/nft.service.d.ts.map +1 -0
  48. package/dist/services/nft.service.js +148 -0
  49. package/dist/services/nft.service.js.map +1 -0
  50. package/dist/services/sbtc.service.d.ts +44 -0
  51. package/dist/services/sbtc.service.d.ts.map +1 -0
  52. package/dist/services/sbtc.service.js +100 -0
  53. package/dist/services/sbtc.service.js.map +1 -0
  54. package/dist/services/scaffold.service.d.ts +41 -0
  55. package/dist/services/scaffold.service.d.ts.map +1 -0
  56. package/dist/services/scaffold.service.js +1055 -0
  57. package/dist/services/scaffold.service.js.map +1 -0
  58. package/dist/services/stacking.service.d.ts +58 -0
  59. package/dist/services/stacking.service.d.ts.map +1 -0
  60. package/dist/services/stacking.service.js +153 -0
  61. package/dist/services/stacking.service.js.map +1 -0
  62. package/dist/services/tokens.service.d.ts +62 -0
  63. package/dist/services/tokens.service.d.ts.map +1 -0
  64. package/dist/services/tokens.service.js +119 -0
  65. package/dist/services/tokens.service.js.map +1 -0
  66. package/dist/services/wallet-manager.d.ts +107 -0
  67. package/dist/services/wallet-manager.d.ts.map +1 -0
  68. package/dist/services/wallet-manager.js +389 -0
  69. package/dist/services/wallet-manager.js.map +1 -0
  70. package/dist/services/x402.service.d.ts +26 -0
  71. package/dist/services/x402.service.d.ts.map +1 -0
  72. package/dist/services/x402.service.js +125 -0
  73. package/dist/services/x402.service.js.map +1 -0
  74. package/dist/tools/bitflow.tools.d.ts +3 -0
  75. package/dist/tools/bitflow.tools.d.ts.map +1 -0
  76. package/dist/tools/bitflow.tools.js +501 -0
  77. package/dist/tools/bitflow.tools.js.map +1 -0
  78. package/dist/tools/bns.tools.d.ts +3 -0
  79. package/dist/tools/bns.tools.d.ts.map +1 -0
  80. package/dist/tools/bns.tools.js +164 -0
  81. package/dist/tools/bns.tools.js.map +1 -0
  82. package/dist/tools/contract.tools.d.ts +3 -0
  83. package/dist/tools/contract.tools.d.ts.map +1 -0
  84. package/dist/tools/contract.tools.js +126 -0
  85. package/dist/tools/contract.tools.js.map +1 -0
  86. package/dist/tools/defi.tools.d.ts +3 -0
  87. package/dist/tools/defi.tools.d.ts.map +1 -0
  88. package/dist/tools/defi.tools.js +425 -0
  89. package/dist/tools/defi.tools.js.map +1 -0
  90. package/dist/tools/endpoint.tools.d.ts +3 -0
  91. package/dist/tools/endpoint.tools.d.ts.map +1 -0
  92. package/dist/tools/endpoint.tools.js +157 -0
  93. package/dist/tools/endpoint.tools.js.map +1 -0
  94. package/dist/tools/index.d.ts +6 -0
  95. package/dist/tools/index.d.ts.map +1 -0
  96. package/dist/tools/index.js +52 -0
  97. package/dist/tools/index.js.map +1 -0
  98. package/dist/tools/nft.tools.d.ts +3 -0
  99. package/dist/tools/nft.tools.d.ts.map +1 -0
  100. package/dist/tools/nft.tools.js +154 -0
  101. package/dist/tools/nft.tools.js.map +1 -0
  102. package/dist/tools/openrouter.tools.d.ts +3 -0
  103. package/dist/tools/openrouter.tools.d.ts.map +1 -0
  104. package/dist/tools/openrouter.tools.js +664 -0
  105. package/dist/tools/openrouter.tools.js.map +1 -0
  106. package/dist/tools/query.tools.d.ts +3 -0
  107. package/dist/tools/query.tools.d.ts.map +1 -0
  108. package/dist/tools/query.tools.js +209 -0
  109. package/dist/tools/query.tools.js.map +1 -0
  110. package/dist/tools/sbtc.tools.d.ts +3 -0
  111. package/dist/tools/sbtc.tools.d.ts.map +1 -0
  112. package/dist/tools/sbtc.tools.js +103 -0
  113. package/dist/tools/sbtc.tools.js.map +1 -0
  114. package/dist/tools/scaffold.tools.d.ts +3 -0
  115. package/dist/tools/scaffold.tools.d.ts.map +1 -0
  116. package/dist/tools/scaffold.tools.js +216 -0
  117. package/dist/tools/scaffold.tools.js.map +1 -0
  118. package/dist/tools/stacking.tools.d.ts +3 -0
  119. package/dist/tools/stacking.tools.d.ts.map +1 -0
  120. package/dist/tools/stacking.tools.js +112 -0
  121. package/dist/tools/stacking.tools.js.map +1 -0
  122. package/dist/tools/tokens.tools.d.ts +3 -0
  123. package/dist/tools/tokens.tools.d.ts.map +1 -0
  124. package/dist/tools/tokens.tools.js +154 -0
  125. package/dist/tools/tokens.tools.js.map +1 -0
  126. package/dist/tools/transfer.tools.d.ts +3 -0
  127. package/dist/tools/transfer.tools.d.ts.map +1 -0
  128. package/dist/tools/transfer.tools.js +62 -0
  129. package/dist/tools/transfer.tools.js.map +1 -0
  130. package/dist/tools/wallet-management.tools.d.ts +6 -0
  131. package/dist/tools/wallet-management.tools.d.ts.map +1 -0
  132. package/dist/tools/wallet-management.tools.js +390 -0
  133. package/dist/tools/wallet-management.tools.js.map +1 -0
  134. package/dist/tools/wallet.tools.d.ts +3 -0
  135. package/dist/tools/wallet.tools.d.ts.map +1 -0
  136. package/dist/tools/wallet.tools.js +105 -0
  137. package/dist/tools/wallet.tools.js.map +1 -0
  138. package/dist/transactions/builder.d.ts +56 -0
  139. package/dist/transactions/builder.d.ts.map +1 -0
  140. package/dist/transactions/builder.js +134 -0
  141. package/dist/transactions/builder.js.map +1 -0
  142. package/dist/transactions/clarity-values.d.ts +67 -0
  143. package/dist/transactions/clarity-values.d.ts.map +1 -0
  144. package/dist/transactions/clarity-values.js +169 -0
  145. package/dist/transactions/clarity-values.js.map +1 -0
  146. package/dist/transactions/post-conditions.d.ts +27 -0
  147. package/dist/transactions/post-conditions.d.ts.map +1 -0
  148. package/dist/transactions/post-conditions.js +101 -0
  149. package/dist/transactions/post-conditions.js.map +1 -0
  150. package/dist/utils/encryption.d.ts +33 -0
  151. package/dist/utils/encryption.d.ts.map +1 -0
  152. package/dist/utils/encryption.js +110 -0
  153. package/dist/utils/encryption.js.map +1 -0
  154. package/dist/utils/errors.d.ts +84 -0
  155. package/dist/utils/errors.d.ts.map +1 -0
  156. package/dist/utils/errors.js +132 -0
  157. package/dist/utils/errors.js.map +1 -0
  158. package/dist/utils/formatting.d.ts +51 -0
  159. package/dist/utils/formatting.d.ts.map +1 -0
  160. package/dist/utils/formatting.js +114 -0
  161. package/dist/utils/formatting.js.map +1 -0
  162. package/dist/utils/index.d.ts +6 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +6 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/storage.d.ts +90 -0
  167. package/dist/utils/storage.d.ts.map +1 -0
  168. package/dist/utils/storage.js +196 -0
  169. package/dist/utils/storage.js.map +1 -0
  170. package/dist/utils/validation.d.ts +67 -0
  171. package/dist/utils/validation.d.ts.map +1 -0
  172. package/dist/utils/validation.js +74 -0
  173. package/dist/utils/validation.js.map +1 -0
  174. package/dist/wallet.d.ts +86 -0
  175. package/dist/wallet.d.ts.map +1 -0
  176. package/dist/wallet.js +279 -0
  177. package/dist/wallet.js.map +1 -0
  178. package/package.json +58 -0
@@ -0,0 +1,664 @@
1
+ import { z } from "zod";
2
+ import { createJsonResponse } from "../utils/index.js";
3
+ export function registerOpenRouterTools(server) {
4
+ server.registerTool("openrouter_integration_guide", {
5
+ description: `Get OpenRouter integration examples and code patterns for implementing AI features.
6
+
7
+ Use this tool when you need to add AI capabilities to any project. Returns:
8
+ - Code examples for different environments (Node.js, Cloudflare Workers, browser)
9
+ - API patterns and best practices
10
+ - Model recommendations
11
+ - Error handling patterns
12
+
13
+ This is a reference tool - use the returned code as a template for implementation.`,
14
+ inputSchema: {
15
+ environment: z
16
+ .enum(["nodejs", "cloudflare-worker", "browser", "all"])
17
+ .optional()
18
+ .default("all")
19
+ .describe("Target environment for the integration"),
20
+ feature: z
21
+ .enum(["chat", "completion", "streaming", "function-calling", "all"])
22
+ .optional()
23
+ .default("all")
24
+ .describe("Specific AI feature to implement"),
25
+ },
26
+ }, async ({ environment, feature }) => {
27
+ const guides = {};
28
+ // Base API info
29
+ guides.apiOverview = `
30
+ # OpenRouter API Overview
31
+
32
+ Base URL: https://openrouter.ai/api/v1
33
+ Auth: Bearer token in Authorization header
34
+ API Key: Get from https://openrouter.ai/keys
35
+
36
+ ## Request Format
37
+ POST /chat/completions
38
+ {
39
+ "model": "anthropic/claude-3-haiku",
40
+ "messages": [
41
+ { "role": "system", "content": "You are helpful" },
42
+ { "role": "user", "content": "Hello" }
43
+ ],
44
+ "max_tokens": 1024,
45
+ "temperature": 0.7
46
+ }
47
+
48
+ ## Required Headers
49
+ - Authorization: Bearer YOUR_API_KEY
50
+ - Content-Type: application/json
51
+ - HTTP-Referer: your-site.com (for rankings)
52
+ - X-Title: Your App Name (for rankings)
53
+ `;
54
+ guides.popularModels = `
55
+ # Popular Models
56
+
57
+ ## Fast & Affordable
58
+ - anthropic/claude-3.5-haiku - Fast, cheap, 200K context
59
+ - openai/gpt-4o-mini - Very fast, 128K context
60
+ - meta-llama/llama-3.3-70b-instruct - Great value, 131K context
61
+ - google/gemini-2.5-flash - 1M context, very cheap
62
+ - mistralai/mistral-nemo - Ultra cheap, 131K context
63
+
64
+ ## High Quality (Frontier)
65
+ - anthropic/claude-sonnet-4.5 - Best overall, 1M context
66
+ - anthropic/claude-opus-4.5 - Most capable, 200K context
67
+ - openai/gpt-4.1 - 1M context, multimodal
68
+ - openai/gpt-4o - Solid all-rounder, 128K context
69
+ - google/gemini-2.5-pro - 1M context, great reasoning
70
+ - x-ai/grok-4 - xAI flagship, 256K context
71
+
72
+ ## Code & Reasoning
73
+ - deepseek/deepseek-r1 - Excellent reasoning, 163K context
74
+ - deepseek/deepseek-v3.2 - Fast coding, very cheap
75
+ - mistralai/mistral-large-2411 - Strong coder, 131K context
76
+
77
+ ## Long Context
78
+ - x-ai/grok-4.1-fast - 2M context (!), very cheap
79
+ - google/gemini-2.5-pro - 1M context
80
+ - anthropic/claude-sonnet-4.5 - 1M context
81
+
82
+ ## Open Source
83
+ - meta-llama/llama-3.1-405b-instruct - Largest open model
84
+ - meta-llama/llama-3.3-70b-instruct - Best open value
85
+ - qwen/qwen3-235b - Strong multilingual
86
+ `;
87
+ // Environment-specific examples
88
+ if (environment === "nodejs" || environment === "all") {
89
+ guides.nodejs = `
90
+ # Node.js Integration
91
+
92
+ ## Basic Implementation
93
+
94
+ \`\`\`typescript
95
+ // openrouter.ts
96
+ interface ChatMessage {
97
+ role: 'system' | 'user' | 'assistant';
98
+ content: string;
99
+ }
100
+
101
+ interface OpenRouterResponse {
102
+ content: string;
103
+ model: string;
104
+ usage: { promptTokens: number; completionTokens: number; totalTokens: number };
105
+ }
106
+
107
+ export async function chat(
108
+ messages: ChatMessage[],
109
+ model = 'anthropic/claude-3-haiku',
110
+ options: { maxTokens?: number; temperature?: number } = {}
111
+ ): Promise<OpenRouterResponse> {
112
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
113
+ method: 'POST',
114
+ headers: {
115
+ 'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
116
+ 'Content-Type': 'application/json',
117
+ 'HTTP-Referer': 'https://your-site.com',
118
+ 'X-Title': 'Your App',
119
+ },
120
+ body: JSON.stringify({
121
+ model,
122
+ messages,
123
+ max_tokens: options.maxTokens || 1024,
124
+ temperature: options.temperature || 0.7,
125
+ }),
126
+ });
127
+
128
+ if (!response.ok) {
129
+ const error = await response.text();
130
+ throw new Error(\`OpenRouter error: \${response.status} - \${error}\`);
131
+ }
132
+
133
+ const data = await response.json();
134
+ return {
135
+ content: data.choices[0]?.message?.content || '',
136
+ model: data.model,
137
+ usage: {
138
+ promptTokens: data.usage.prompt_tokens,
139
+ completionTokens: data.usage.completion_tokens,
140
+ totalTokens: data.usage.total_tokens,
141
+ },
142
+ };
143
+ }
144
+
145
+ // Usage
146
+ const result = await chat([
147
+ { role: 'system', content: 'You are a helpful assistant.' },
148
+ { role: 'user', content: 'Explain quantum computing' },
149
+ ]);
150
+ console.log(result.content);
151
+ \`\`\`
152
+
153
+ ## With Axios
154
+
155
+ \`\`\`typescript
156
+ import axios from 'axios';
157
+
158
+ const openrouter = axios.create({
159
+ baseURL: 'https://openrouter.ai/api/v1',
160
+ headers: {
161
+ 'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
162
+ 'HTTP-Referer': 'https://your-site.com',
163
+ 'X-Title': 'Your App',
164
+ },
165
+ });
166
+
167
+ export async function chat(messages: ChatMessage[], model = 'anthropic/claude-3-haiku') {
168
+ const { data } = await openrouter.post('/chat/completions', {
169
+ model,
170
+ messages,
171
+ max_tokens: 1024,
172
+ });
173
+ return data.choices[0]?.message?.content || '';
174
+ }
175
+ \`\`\`
176
+ `;
177
+ }
178
+ if (environment === "cloudflare-worker" || environment === "all") {
179
+ guides.cloudflareWorker = `
180
+ # Cloudflare Worker Integration
181
+
182
+ ## With Hono.js
183
+
184
+ \`\`\`typescript
185
+ // src/index.ts
186
+ import { Hono } from 'hono';
187
+
188
+ type Bindings = {
189
+ OPENROUTER_API_KEY: string;
190
+ };
191
+
192
+ const app = new Hono<{ Bindings: Bindings }>();
193
+
194
+ app.post('/api/chat', async (c) => {
195
+ const { messages, model = 'anthropic/claude-3-haiku' } = await c.req.json();
196
+
197
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
198
+ method: 'POST',
199
+ headers: {
200
+ 'Authorization': \`Bearer \${c.env.OPENROUTER_API_KEY}\`,
201
+ 'Content-Type': 'application/json',
202
+ 'HTTP-Referer': 'https://your-worker.workers.dev',
203
+ 'X-Title': 'My Worker',
204
+ },
205
+ body: JSON.stringify({
206
+ model,
207
+ messages,
208
+ max_tokens: 1024,
209
+ }),
210
+ });
211
+
212
+ if (!response.ok) {
213
+ return c.json({ error: 'AI request failed' }, 500);
214
+ }
215
+
216
+ const data = await response.json();
217
+ return c.json({
218
+ content: data.choices[0]?.message?.content,
219
+ model: data.model,
220
+ });
221
+ });
222
+
223
+ export default app;
224
+ \`\`\`
225
+
226
+ ## wrangler.jsonc
227
+
228
+ \`\`\`json
229
+ {
230
+ "name": "my-ai-worker",
231
+ "main": "src/index.ts",
232
+ "compatibility_date": "2024-01-01",
233
+ "compatibility_flags": ["nodejs_compat"]
234
+ }
235
+ \`\`\`
236
+
237
+ ## Set API Key as Secret
238
+
239
+ \`\`\`bash
240
+ wrangler secret put OPENROUTER_API_KEY
241
+ \`\`\`
242
+ `;
243
+ }
244
+ if (environment === "browser" || environment === "all") {
245
+ guides.browser = `
246
+ # Browser Integration
247
+
248
+ ⚠️ IMPORTANT: Never expose API keys in browser code!
249
+ Use a backend proxy to keep your key secure.
250
+
251
+ ## Backend Proxy Pattern
252
+
253
+ \`\`\`typescript
254
+ // Backend (Express/Hono/etc)
255
+ app.post('/api/ai/chat', async (req, res) => {
256
+ const { messages, model } = req.body;
257
+
258
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
259
+ method: 'POST',
260
+ headers: {
261
+ 'Authorization': \`Bearer \${process.env.OPENROUTER_API_KEY}\`,
262
+ 'Content-Type': 'application/json',
263
+ },
264
+ body: JSON.stringify({ model, messages, max_tokens: 1024 }),
265
+ });
266
+
267
+ const data = await response.json();
268
+ res.json({ content: data.choices[0]?.message?.content });
269
+ });
270
+
271
+ // Frontend
272
+ async function chat(message: string) {
273
+ const response = await fetch('/api/ai/chat', {
274
+ method: 'POST',
275
+ headers: { 'Content-Type': 'application/json' },
276
+ body: JSON.stringify({
277
+ model: 'anthropic/claude-3-haiku',
278
+ messages: [{ role: 'user', content: message }],
279
+ }),
280
+ });
281
+ return response.json();
282
+ }
283
+ \`\`\`
284
+ `;
285
+ }
286
+ // Feature-specific examples
287
+ if (feature === "streaming" || feature === "all") {
288
+ guides.streaming = `
289
+ # Streaming Responses
290
+
291
+ ## Server-Sent Events Pattern
292
+
293
+ \`\`\`typescript
294
+ // Request with streaming
295
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
296
+ method: 'POST',
297
+ headers: {
298
+ 'Authorization': \`Bearer \${apiKey}\`,
299
+ 'Content-Type': 'application/json',
300
+ },
301
+ body: JSON.stringify({
302
+ model: 'anthropic/claude-3-haiku',
303
+ messages: [{ role: 'user', content: 'Tell me a story' }],
304
+ stream: true, // Enable streaming
305
+ }),
306
+ });
307
+
308
+ // Process stream
309
+ const reader = response.body?.getReader();
310
+ const decoder = new TextDecoder();
311
+
312
+ while (true) {
313
+ const { done, value } = await reader.read();
314
+ if (done) break;
315
+
316
+ const chunk = decoder.decode(value);
317
+ const lines = chunk.split('\\n').filter(line => line.startsWith('data: '));
318
+
319
+ for (const line of lines) {
320
+ const data = line.slice(6); // Remove 'data: '
321
+ if (data === '[DONE]') continue;
322
+
323
+ const parsed = JSON.parse(data);
324
+ const content = parsed.choices[0]?.delta?.content || '';
325
+ process.stdout.write(content); // Stream to output
326
+ }
327
+ }
328
+ \`\`\`
329
+
330
+ ## Hono Streaming Response
331
+
332
+ \`\`\`typescript
333
+ import { stream } from 'hono/streaming';
334
+
335
+ app.post('/api/chat/stream', async (c) => {
336
+ const { messages } = await c.req.json();
337
+
338
+ return stream(c, async (stream) => {
339
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
340
+ method: 'POST',
341
+ headers: {
342
+ 'Authorization': \`Bearer \${c.env.OPENROUTER_API_KEY}\`,
343
+ 'Content-Type': 'application/json',
344
+ },
345
+ body: JSON.stringify({
346
+ model: 'anthropic/claude-3-haiku',
347
+ messages,
348
+ stream: true,
349
+ }),
350
+ });
351
+
352
+ const reader = response.body?.getReader();
353
+ const decoder = new TextDecoder();
354
+
355
+ while (true) {
356
+ const { done, value } = await reader?.read() || { done: true };
357
+ if (done) break;
358
+ await stream.write(decoder.decode(value));
359
+ }
360
+ });
361
+ });
362
+ \`\`\`
363
+ `;
364
+ }
365
+ if (feature === "function-calling" || feature === "all") {
366
+ guides.functionCalling = `
367
+ # Function Calling (Tool Use)
368
+
369
+ Some models support function calling for structured outputs.
370
+
371
+ \`\`\`typescript
372
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
373
+ method: 'POST',
374
+ headers: {
375
+ 'Authorization': \`Bearer \${apiKey}\`,
376
+ 'Content-Type': 'application/json',
377
+ },
378
+ body: JSON.stringify({
379
+ model: 'openai/gpt-4o', // Supports function calling
380
+ messages: [{ role: 'user', content: 'What is the weather in Tokyo?' }],
381
+ tools: [
382
+ {
383
+ type: 'function',
384
+ function: {
385
+ name: 'get_weather',
386
+ description: 'Get the current weather in a location',
387
+ parameters: {
388
+ type: 'object',
389
+ properties: {
390
+ location: { type: 'string', description: 'City name' },
391
+ unit: { type: 'string', enum: ['celsius', 'fahrenheit'] },
392
+ },
393
+ required: ['location'],
394
+ },
395
+ },
396
+ },
397
+ ],
398
+ tool_choice: 'auto',
399
+ }),
400
+ });
401
+
402
+ const data = await response.json();
403
+ const toolCall = data.choices[0]?.message?.tool_calls?.[0];
404
+
405
+ if (toolCall) {
406
+ const args = JSON.parse(toolCall.function.arguments);
407
+ // Call your actual function: getWeather(args.location, args.unit)
408
+ }
409
+ \`\`\`
410
+
411
+ ## Models with Function Calling Support
412
+ - openai/gpt-4o, gpt-4-turbo
413
+ - anthropic/claude-3.5-sonnet, claude-3-opus
414
+ - mistralai/mistral-large
415
+ `;
416
+ }
417
+ guides.errorHandling = `
418
+ # Error Handling
419
+
420
+ \`\`\`typescript
421
+ async function safeChat(messages: ChatMessage[], model: string) {
422
+ try {
423
+ const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
424
+ method: 'POST',
425
+ headers: {
426
+ 'Authorization': \`Bearer \${apiKey}\`,
427
+ 'Content-Type': 'application/json',
428
+ },
429
+ body: JSON.stringify({ model, messages, max_tokens: 1024 }),
430
+ });
431
+
432
+ if (response.status === 401) {
433
+ throw new Error('Invalid API key');
434
+ }
435
+ if (response.status === 429) {
436
+ throw new Error('Rate limited - try again later');
437
+ }
438
+ if (response.status === 402) {
439
+ throw new Error('Insufficient credits');
440
+ }
441
+ if (!response.ok) {
442
+ const error = await response.text();
443
+ throw new Error(\`API error: \${response.status} - \${error}\`);
444
+ }
445
+
446
+ const data = await response.json();
447
+ return data.choices[0]?.message?.content || '';
448
+ } catch (error) {
449
+ console.error('OpenRouter error:', error);
450
+ throw error;
451
+ }
452
+ }
453
+ \`\`\`
454
+
455
+ ## Common Error Codes
456
+ - 401: Invalid API key
457
+ - 402: Out of credits
458
+ - 429: Rate limited
459
+ - 500: Server error (retry)
460
+ - 503: Model overloaded (retry with backoff)
461
+ `;
462
+ guides.bestPractices = `
463
+ # Best Practices
464
+
465
+ 1. **Store API key securely**
466
+ - Use environment variables
467
+ - Never commit to git
468
+ - Use secrets manager in production
469
+
470
+ 2. **Set reasonable max_tokens**
471
+ - Don't set higher than needed
472
+ - Affects cost and latency
473
+
474
+ 3. **Use appropriate temperature**
475
+ - 0.0-0.3: Factual, deterministic
476
+ - 0.5-0.7: Balanced (default)
477
+ - 0.8-1.0: Creative, varied
478
+
479
+ 4. **Handle rate limits**
480
+ - Implement exponential backoff
481
+ - Cache responses when possible
482
+
483
+ 5. **Choose the right model**
484
+ - Start with claude-3-haiku or gpt-4o-mini
485
+ - Upgrade only if quality insufficient
486
+ `;
487
+ return createJsonResponse({
488
+ environment,
489
+ feature,
490
+ guides,
491
+ tip: "Use these code examples as templates. Replace placeholders with your actual values.",
492
+ });
493
+ });
494
+ // List available models
495
+ server.registerTool("openrouter_models", {
496
+ description: `Get list of popular OpenRouter models with capabilities and context lengths.
497
+
498
+ Use this to choose the right model for your use case. For latest pricing, check openrouter.ai/models`,
499
+ inputSchema: {
500
+ category: z
501
+ .enum(["fast", "quality", "cheap", "code", "long-context", "all"])
502
+ .optional()
503
+ .default("all")
504
+ .describe("Filter by model category"),
505
+ },
506
+ }, async ({ category }) => {
507
+ const allModels = [
508
+ // Anthropic
509
+ {
510
+ id: "anthropic/claude-3.5-haiku",
511
+ name: "Claude 3.5 Haiku",
512
+ category: ["fast", "cheap"],
513
+ contextLength: 200000,
514
+ bestFor: "Fast responses, simple tasks, cost-effective",
515
+ },
516
+ {
517
+ id: "anthropic/claude-sonnet-4.5",
518
+ name: "Claude Sonnet 4.5",
519
+ category: ["quality", "long-context"],
520
+ contextLength: 1000000,
521
+ bestFor: "Best overall, complex reasoning, coding",
522
+ },
523
+ {
524
+ id: "anthropic/claude-opus-4.5",
525
+ name: "Claude Opus 4.5",
526
+ category: ["quality"],
527
+ contextLength: 200000,
528
+ bestFor: "Most capable, research, difficult tasks",
529
+ },
530
+ // OpenAI
531
+ {
532
+ id: "openai/gpt-4o",
533
+ name: "GPT-4o",
534
+ category: ["quality"],
535
+ contextLength: 128000,
536
+ bestFor: "General purpose, multimodal, function calling",
537
+ },
538
+ {
539
+ id: "openai/gpt-4o-mini",
540
+ name: "GPT-4o Mini",
541
+ category: ["fast", "cheap"],
542
+ contextLength: 128000,
543
+ bestFor: "Fast, cheap, good for simple tasks",
544
+ },
545
+ {
546
+ id: "openai/gpt-4.1",
547
+ name: "GPT-4.1",
548
+ category: ["quality", "long-context"],
549
+ contextLength: 1040000,
550
+ bestFor: "Long context, multimodal, latest OpenAI",
551
+ },
552
+ // Meta Llama
553
+ {
554
+ id: "meta-llama/llama-3.3-70b-instruct",
555
+ name: "Llama 3.3 70B",
556
+ category: ["quality", "cheap"],
557
+ contextLength: 131072,
558
+ bestFor: "Best open source value, great quality",
559
+ },
560
+ {
561
+ id: "meta-llama/llama-3.1-405b-instruct",
562
+ name: "Llama 3.1 405B",
563
+ category: ["quality"],
564
+ contextLength: 131072,
565
+ bestFor: "Largest open model, frontier performance",
566
+ },
567
+ {
568
+ id: "meta-llama/llama-3.1-8b-instruct",
569
+ name: "Llama 3.1 8B",
570
+ category: ["fast", "cheap"],
571
+ contextLength: 16384,
572
+ bestFor: "Ultra cheap, fast, simple tasks",
573
+ },
574
+ // Google
575
+ {
576
+ id: "google/gemini-2.5-pro",
577
+ name: "Gemini 2.5 Pro",
578
+ category: ["quality", "long-context"],
579
+ contextLength: 1000000,
580
+ bestFor: "1M context, great reasoning, multimodal",
581
+ },
582
+ {
583
+ id: "google/gemini-2.5-flash",
584
+ name: "Gemini 2.5 Flash",
585
+ category: ["fast", "cheap", "long-context"],
586
+ contextLength: 1000000,
587
+ bestFor: "Fast, 1M context, affordable",
588
+ },
589
+ // xAI Grok
590
+ {
591
+ id: "x-ai/grok-4",
592
+ name: "Grok 4",
593
+ category: ["quality"],
594
+ contextLength: 256000,
595
+ bestFor: "xAI flagship, real-time knowledge",
596
+ },
597
+ {
598
+ id: "x-ai/grok-4.1-fast",
599
+ name: "Grok 4.1 Fast",
600
+ category: ["fast", "long-context"],
601
+ contextLength: 2000000,
602
+ bestFor: "2M context (!), very fast",
603
+ },
604
+ {
605
+ id: "x-ai/grok-3",
606
+ name: "Grok 3",
607
+ category: ["quality"],
608
+ contextLength: 131072,
609
+ bestFor: "Strong reasoning, real-time data",
610
+ },
611
+ // Mistral
612
+ {
613
+ id: "mistralai/mistral-large-2411",
614
+ name: "Mistral Large",
615
+ category: ["quality", "code"],
616
+ contextLength: 131072,
617
+ bestFor: "Coding, reasoning, multilingual",
618
+ },
619
+ {
620
+ id: "mistralai/mistral-nemo",
621
+ name: "Mistral Nemo",
622
+ category: ["fast", "cheap"],
623
+ contextLength: 131072,
624
+ bestFor: "Ultra cheap, 131K context",
625
+ },
626
+ // DeepSeek
627
+ {
628
+ id: "deepseek/deepseek-r1",
629
+ name: "DeepSeek R1",
630
+ category: ["quality", "code"],
631
+ contextLength: 163000,
632
+ bestFor: "Excellent reasoning, chain-of-thought",
633
+ },
634
+ {
635
+ id: "deepseek/deepseek-v3.2",
636
+ name: "DeepSeek V3.2",
637
+ category: ["code", "cheap"],
638
+ contextLength: 163000,
639
+ bestFor: "Fast coding, affordable",
640
+ },
641
+ // Qwen
642
+ {
643
+ id: "qwen/qwen3-235b",
644
+ name: "Qwen3 235B",
645
+ category: ["quality"],
646
+ contextLength: 40000,
647
+ bestFor: "Strong multilingual, great value",
648
+ },
649
+ ];
650
+ let models = allModels;
651
+ if (category && category !== "all") {
652
+ models = allModels.filter((m) => m.category.includes(category));
653
+ }
654
+ return createJsonResponse({
655
+ category,
656
+ count: models.length,
657
+ models,
658
+ recommendation: category === "all"
659
+ ? "Start with claude-3.5-haiku or gpt-4o-mini for most tasks. Use claude-sonnet-4.5 or deepseek-r1 for complex reasoning."
660
+ : undefined,
661
+ });
662
+ });
663
+ }
664
+ //# sourceMappingURL=openrouter.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.tools.js","sourceRoot":"","sources":["../../src/tools/openrouter.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerQueryTools(server: McpServer): void;
3
+ //# sourceMappingURL=query.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.tools.d.ts","sourceRoot":"","sources":["../../src/tools/query.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6O1D"}