@ayatec/ai-gateway-mcp-server 0.1.0 → 0.2.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/README.md CHANGED
@@ -133,17 +133,39 @@ claude mcp add ai-gateway npx @ayatec/ai-gateway-mcp-server -e AI_GATEWAY_API_KE
133
133
 
134
134
  #### ローカルビルドで使う場合
135
135
 
136
+ 開発中のバージョンを使いたい場合や、ソースを修正して使いたい場合はこちら。
137
+
136
138
  ```bash
137
139
  git clone https://github.com/ayatec/ai-gateway-mcp-server.git
138
140
  cd ai-gateway-mcp-server
141
+ cp .env.example .env
142
+ # .env を編集して API キーを設定
139
143
  pnpm install
140
144
  pnpm build
141
145
  ```
142
146
 
147
+ ##### Claude Code
148
+
143
149
  ```bash
144
150
  claude mcp add ai-gateway node /path/to/ai-gateway-mcp-server/dist/index.js -e AI_GATEWAY_API_KEY=your-key
145
151
  ```
146
152
 
153
+ ##### Claude Desktop / その他の MCP クライアント
154
+
155
+ ```json
156
+ {
157
+ "mcpServers": {
158
+ "ai-gateway": {
159
+ "command": "node",
160
+ "args": ["/path/to/ai-gateway-mcp-server/dist/index.js"],
161
+ "env": {
162
+ "AI_GATEWAY_API_KEY": "your-key"
163
+ }
164
+ }
165
+ }
166
+ }
167
+ ```
168
+
147
169
  ## 開発
148
170
 
149
171
  ### コマンド
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ayatec/ai-gateway-mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for multi-model AI access via Vercel AI Gateway",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,2 +0,0 @@
1
- export declare const anthropic: import("@ai-sdk/anthropic").AnthropicProvider;
2
- //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,+CAGpB,CAAC"}
@@ -1,7 +0,0 @@
1
- import { createAnthropic } from '@ai-sdk/anthropic';
2
- import { config } from '../config.js';
3
- export const anthropic = createAnthropic({
4
- apiKey: config.gatewayApiKey,
5
- baseURL: config.gatewayBaseUrl,
6
- });
7
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,cAAc;CAC/B,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const google: import("@ai-sdk/openai").OpenAIProvider;
2
- //# sourceMappingURL=google.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM,yCAIjB,CAAC"}
@@ -1,9 +0,0 @@
1
- import { createOpenAI } from '@ai-sdk/openai';
2
- import { config } from '../config.js';
3
- // Google は独自API形式のため Gateway の OpenAI互換エンドポイント経由で接続
4
- export const google = createOpenAI({
5
- apiKey: config.gatewayApiKey,
6
- baseURL: config.gatewayBaseUrl,
7
- name: 'google',
8
- });
9
- //# sourceMappingURL=google.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,oDAAoD;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,cAAc;IAC9B,IAAI,EAAE,QAAQ;CACf,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const openai: import("@ai-sdk/openai").OpenAIProvider;
2
- //# sourceMappingURL=openai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,yCAGjB,CAAC"}
@@ -1,7 +0,0 @@
1
- import { createOpenAI } from '@ai-sdk/openai';
2
- import { config } from '../config.js';
3
- export const openai = createOpenAI({
4
- apiKey: config.gatewayApiKey,
5
- baseURL: config.gatewayBaseUrl,
6
- });
7
- //# sourceMappingURL=openai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,cAAc;CAC/B,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const perplexity: import("@ai-sdk/openai").OpenAIProvider;
2
- //# sourceMappingURL=perplexity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"perplexity.d.ts","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,yCAIrB,CAAC"}
@@ -1,9 +0,0 @@
1
- import { createOpenAI } from '@ai-sdk/openai';
2
- import { config } from '../config.js';
3
- // Perplexity は OpenAI互換APIとして Gateway 経由で接続
4
- export const perplexity = createOpenAI({
5
- apiKey: config.gatewayApiKey,
6
- baseURL: config.gatewayBaseUrl,
7
- name: 'perplexity',
8
- });
9
- //# sourceMappingURL=perplexity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"perplexity.js","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,cAAc;IAC9B,IAAI,EAAE,YAAY;CACnB,CAAC,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { ModelDefinition } from '../types/index.js';
2
- /** 推定コストを計算(入力・出力トークン数ベース) */
3
- export declare function estimateCost(model: ModelDefinition, inputTokens: number, outputTokens: number): {
4
- inputCost: number;
5
- outputCost: number;
6
- total: number;
7
- };
8
- /** 価格をフォーマット */
9
- export declare function formatCost(dollars: number): string;
10
- //# sourceMappingURL=cost.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/utils/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,8BAA8B;AAC9B,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQ1D;AAED,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD"}
@@ -1,18 +0,0 @@
1
- /** 推定コストを計算(入力・出力トークン数ベース) */
2
- export function estimateCost(model, inputTokens, outputTokens) {
3
- const inputCost = (inputTokens / 1_000_000) * model.pricing.input;
4
- const outputCost = (outputTokens / 1_000_000) * model.pricing.output;
5
- return {
6
- inputCost,
7
- outputCost,
8
- total: inputCost + outputCost,
9
- };
10
- }
11
- /** 価格をフォーマット */
12
- export function formatCost(dollars) {
13
- if (dollars < 0.01) {
14
- return `$${dollars.toFixed(4)}`;
15
- }
16
- return `$${dollars.toFixed(2)}`;
17
- }
18
- //# sourceMappingURL=cost.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/utils/cost.ts"],"names":[],"mappings":"AAEA,8BAA8B;AAC9B,MAAM,UAAU,YAAY,CAC1B,KAAsB,EACtB,WAAmB,EACnB,YAAoB;IAEpB,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAClE,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACrE,OAAO;QACL,SAAS;QACT,UAAU;QACV,KAAK,EAAE,SAAS,GAAG,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC"}
@@ -1,5 +0,0 @@
1
- /** 数値を読みやすいトークン数にフォーマット */
2
- export declare function formatTokenCount(tokens: number): string;
3
- /** ミリ秒を読みやすいレイテンシにフォーマット */
4
- export declare function formatLatency(ms: number): string;
5
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKhD"}
@@ -1,18 +0,0 @@
1
- /** 数値を読みやすいトークン数にフォーマット */
2
- export function formatTokenCount(tokens) {
3
- if (tokens >= 1_000_000) {
4
- return `${(tokens / 1_000_000).toFixed(1)}M`;
5
- }
6
- if (tokens >= 1_000) {
7
- return `${(tokens / 1_000).toFixed(0)}K`;
8
- }
9
- return tokens.toString();
10
- }
11
- /** ミリ秒を読みやすいレイテンシにフォーマット */
12
- export function formatLatency(ms) {
13
- if (ms >= 1000) {
14
- return `${(ms / 1000).toFixed(1)}s`;
15
- }
16
- return `${ms}ms`;
17
- }
18
- //# sourceMappingURL=format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,EAAE,IAAI,CAAC;AACnB,CAAC"}
@@ -1,12 +0,0 @@
1
- interface LogEntry {
2
- timestamp: string;
3
- tool: string;
4
- modelId: string;
5
- durationMs: number;
6
- input: Record<string, unknown>;
7
- error?: string;
8
- }
9
- /** ツール呼び出しをログファイルに記録 */
10
- export declare function logToolCall(entry: LogEntry): Promise<void>;
11
- export {};
12
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAIA,UAAU,QAAQ;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAwB;AACxB,wBAAsB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
@@ -1,20 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { config } from '../config.js';
4
- /** ツール呼び出しをログファイルに記録 */
5
- export async function logToolCall(entry) {
6
- try {
7
- const logDir = config.logDir;
8
- if (!fs.existsSync(logDir)) {
9
- fs.mkdirSync(logDir, { recursive: true });
10
- }
11
- const date = new Date().toISOString().split('T')[0];
12
- const logFile = path.join(logDir, `${date}.jsonl`);
13
- fs.appendFileSync(logFile, JSON.stringify(entry) + '\n');
14
- }
15
- catch (error) {
16
- // ログ記録の失敗はサーバー動作に影響させない
17
- console.error('[logger] ログ記録失敗:', error);
18
- }
19
- }
20
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAWtC,wBAAwB;AACxB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAe;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAEnD,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wBAAwB;QACxB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}