@super_studio/ecforce-ai-agent-server 1.4.1 → 1.4.3

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
@@ -425,7 +425,7 @@ import { generateText } from "ai";
425
425
  import { spst } from "@super_studio/ecforce-ai-agent-server/provider";
426
426
 
427
427
  const result = await generateText({
428
- model: spst("google/gemini-3.1-pro-preview-customtools"),
428
+ model: spst("google/gemini-3.5-flash"),
429
429
  prompt: "今日の生成AI関連ニュースを3件まとめて",
430
430
  tools: {
431
431
  google_search: vertex.tools.googleSearch({}),
package/dist/mcp-auth.cjs CHANGED
@@ -37,9 +37,20 @@ async function decodeMCPToken(token, options) {
37
37
  secret,
38
38
  salt
39
39
  });
40
- if (!decoded) throw new Error("Invalid token");
40
+ if (!isMCPTokenPayload(decoded)) throw new Error("Invalid token");
41
41
  return decoded;
42
42
  }
43
+ function isMCPTokenPayload(value) {
44
+ if (!isRecord(value) || !isNonEmptyString(value.source)) return false;
45
+ const { user } = value;
46
+ return isRecord(user) && isNonEmptyString(user.id) && isNonEmptyString(user.name) && isNonEmptyString(user.email) && isNonEmptyString(user.projectId);
47
+ }
48
+ function isRecord(value) {
49
+ return typeof value === "object" && value !== null && !Array.isArray(value);
50
+ }
51
+ function isNonEmptyString(value) {
52
+ return typeof value === "string" && value.trim().length > 0;
53
+ }
43
54
  function getMcpToken(req) {
44
55
  const mcpToken = req.headers.get("X-MCP-Token");
45
56
  if (!mcpToken || typeof mcpToken !== "string") throw new Error("Unauthorized");
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-auth.d.cts","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":[],"mappings":";;AAMA;AAiBA;;KAjBY,eAAA;EAuBT,MAAA,EAAA,MAAA;EAAA,IAAA,EAAA;IAwBmB,EAAA,EAAA,MAAA;IAuBN,IAAA,EAAA,MAAW;;;;;;;;;iBArDL,cAAA,UACX;;;;IAKR;;;;;;;;iBAwBmB,cAAA;;;IAMnB,QAAQ;iBAiBK,WAAA,MAAiB"}
1
+ {"version":3,"file":"mcp-auth.d.cts","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":[],"mappings":";;AAMA;AAiBA;;KAjBY,eAAA;EAuBT,MAAA,EAAA,MAAA;EAAA,IAAA,EAAA;IAwBmB,EAAA,EAAA,MAAA;IA6CN,IAAA,EAAA,MAAW;;;;;;;;;iBA3EL,cAAA,UACX;;;;IAKR;;;;;;;;iBAwBmB,cAAA;;;IAMnB,QAAQ;iBAuCK,WAAA,MAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-auth.d.mts","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":[],"mappings":";;AAMA;AAiBA;;KAjBY,eAAA;EAuBT,MAAA,EAAA,MAAA;EAAA,IAAA,EAAA;IAwBmB,EAAA,EAAA,MAAA;IAuBN,IAAA,EAAA,MAAW;;;;;;;;;iBArDL,cAAA,UACX;;;;IAKR;;;;;;;;iBAwBmB,cAAA;;;IAMnB,QAAQ;iBAiBK,WAAA,MAAiB"}
1
+ {"version":3,"file":"mcp-auth.d.mts","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":[],"mappings":";;AAMA;AAiBA;;KAjBY,eAAA;EAuBT,MAAA,EAAA,MAAA;EAAA,IAAA,EAAA;IAwBmB,EAAA,EAAA,MAAA;IA6CN,IAAA,EAAA,MAAW;;;;;;;;;iBA3EL,cAAA,UACX;;;;IAKR;;;;;;;;iBAwBmB,cAAA;;;IAMnB,QAAQ;iBAuCK,WAAA,MAAiB"}
package/dist/mcp-auth.mjs CHANGED
@@ -37,9 +37,20 @@ async function decodeMCPToken(token, options) {
37
37
  secret,
38
38
  salt
39
39
  });
40
- if (!decoded) throw new Error("Invalid token");
40
+ if (!isMCPTokenPayload(decoded)) throw new Error("Invalid token");
41
41
  return decoded;
42
42
  }
43
+ function isMCPTokenPayload(value) {
44
+ if (!isRecord(value) || !isNonEmptyString(value.source)) return false;
45
+ const { user } = value;
46
+ return isRecord(user) && isNonEmptyString(user.id) && isNonEmptyString(user.name) && isNonEmptyString(user.email) && isNonEmptyString(user.projectId);
47
+ }
48
+ function isRecord(value) {
49
+ return typeof value === "object" && value !== null && !Array.isArray(value);
50
+ }
51
+ function isNonEmptyString(value) {
52
+ return typeof value === "string" && value.trim().length > 0;
53
+ }
43
54
  function getMcpToken(req) {
44
55
  const mcpToken = req.headers.get("X-MCP-Token");
45
56
  if (!mcpToken || typeof mcpToken !== "string") throw new Error("Unauthorized");
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-auth.mjs","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":["import { decode, encode } from \"./lib/jwt\";\n\n/**\n * 共通のMCPトークンのペイロード。\n * すべてのapps(aidp, ma, bi)はこのトークンの形になります。\n */\nexport type MCPTokenPayload = {\n source: string;\n user: {\n id: string;\n name: string;\n email: string;\n projectId: string;\n };\n};\n\nconst DEFAULT_MAX_AGE = 60 * 10; // 10 minutes\nconst DEFAULT_SALT = process.env.STAGE === \"local\" ? \"dev\" : process.env.STAGE;\n\n/**\n * Uses Auth.js JWT encoding/decoding.\n * @see https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/jwt.ts\n */\nexport async function createMCPToken(\n payload: MCPTokenPayload,\n options?: {\n secret?: string;\n salt?: string;\n maxAge?: number;\n },\n) {\n const maxAge = options?.maxAge ?? DEFAULT_MAX_AGE;\n const secret = options?.secret ?? process.env.MCP_TOKEN_SECRET;\n const salt = options?.salt ?? DEFAULT_SALT;\n if (!secret || !salt) {\n throw new Error(\"Secret or salt is not set\");\n }\n const token = await encode<MCPTokenPayload>({\n token: payload,\n secret,\n salt,\n maxAge,\n });\n return {\n token,\n expiresAt: new Date(Date.now() + maxAge * 1000),\n };\n}\n\n/**\n * Uses Auth.js JWT encoding/decoding.\n * @see https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/jwt.ts\n */\nexport async function decodeMCPToken(\n token: string,\n options?: {\n secret?: string;\n salt?: string;\n },\n): Promise<MCPTokenPayload> {\n const secret = options?.secret ?? process.env.MCP_TOKEN_SECRET;\n const salt = options?.salt ?? DEFAULT_SALT;\n if (!secret || !salt) {\n throw new Error(\"Secret or salt is not set\");\n }\n const decoded = await decode<MCPTokenPayload>({\n token,\n secret,\n salt,\n });\n if (!decoded) {\n throw new Error(\"Invalid token\");\n }\n return decoded;\n}\n\nexport function getMcpToken(req: Request) {\n const mcpToken = req.headers.get(\"X-MCP-Token\");\n if (!mcpToken || typeof mcpToken !== \"string\") {\n throw new Error(\"Unauthorized\");\n }\n return mcpToken;\n}\n"],"mappings":";;;AAgBA,MAAM,kBAAkB;AACxB,MAAM,eAAe,QAAQ,IAAI,UAAU,UAAU,QAAQ,QAAQ,IAAI;;;;;AAMzE,eAAsB,eACpB,SACA,SAKA;;CACA,MAAM,8EAAS,QAAS,mEAAU;CAClC,MAAM,8EAAS,QAAS,mEAAU,QAAQ,IAAI;CAC9C,MAAM,0EAAO,QAAS,6DAAQ;AAC9B,KAAI,CAAC,UAAU,CAAC,KACd,OAAM,IAAI,MAAM,4BAA4B;AAQ9C,QAAO;EACL,OAPY,MAAM,OAAwB;GAC1C,OAAO;GACP;GACA;GACA;GACD,CAAC;EAGA,WAAW,IAAI,KAAK,KAAK,KAAK,GAAG,SAAS,IAAK;EAChD;;;;;;AAOH,eAAsB,eACpB,OACA,SAI0B;;CAC1B,MAAM,+EAAS,QAAS,qEAAU,QAAQ,IAAI;CAC9C,MAAM,2EAAO,QAAS,+DAAQ;AAC9B,KAAI,CAAC,UAAU,CAAC,KACd,OAAM,IAAI,MAAM,4BAA4B;CAE9C,MAAM,UAAU,MAAM,OAAwB;EAC5C;EACA;EACA;EACD,CAAC;AACF,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,gBAAgB;AAElC,QAAO;;AAGT,SAAgB,YAAY,KAAc;CACxC,MAAM,WAAW,IAAI,QAAQ,IAAI,cAAc;AAC/C,KAAI,CAAC,YAAY,OAAO,aAAa,SACnC,OAAM,IAAI,MAAM,eAAe;AAEjC,QAAO"}
1
+ {"version":3,"file":"mcp-auth.mjs","names":[],"sources":["../src/mcp-auth.ts"],"sourcesContent":["import { decode, encode } from \"./lib/jwt\";\n\n/**\n * 共通のMCPトークンのペイロード。\n * すべてのapps(aidp, ma, bi)はこのトークンの形になります。\n */\nexport type MCPTokenPayload = {\n source: string;\n user: {\n id: string;\n name: string;\n email: string;\n projectId: string;\n };\n};\n\nconst DEFAULT_MAX_AGE = 60 * 10; // 10 minutes\nconst DEFAULT_SALT = process.env.STAGE === \"local\" ? \"dev\" : process.env.STAGE;\n\n/**\n * Uses Auth.js JWT encoding/decoding.\n * @see https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/jwt.ts\n */\nexport async function createMCPToken(\n payload: MCPTokenPayload,\n options?: {\n secret?: string;\n salt?: string;\n maxAge?: number;\n },\n) {\n const maxAge = options?.maxAge ?? DEFAULT_MAX_AGE;\n const secret = options?.secret ?? process.env.MCP_TOKEN_SECRET;\n const salt = options?.salt ?? DEFAULT_SALT;\n if (!secret || !salt) {\n throw new Error(\"Secret or salt is not set\");\n }\n const token = await encode<MCPTokenPayload>({\n token: payload,\n secret,\n salt,\n maxAge,\n });\n return {\n token,\n expiresAt: new Date(Date.now() + maxAge * 1000),\n };\n}\n\n/**\n * Uses Auth.js JWT encoding/decoding.\n * @see https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/jwt.ts\n */\nexport async function decodeMCPToken(\n token: string,\n options?: {\n secret?: string;\n salt?: string;\n },\n): Promise<MCPTokenPayload> {\n const secret = options?.secret ?? process.env.MCP_TOKEN_SECRET;\n const salt = options?.salt ?? DEFAULT_SALT;\n if (!secret || !salt) {\n throw new Error(\"Secret or salt is not set\");\n }\n const decoded = await decode<unknown>({\n token,\n secret,\n salt,\n });\n if (!isMCPTokenPayload(decoded)) {\n throw new Error(\"Invalid token\");\n }\n return decoded;\n}\n\nfunction isMCPTokenPayload(value: unknown): value is MCPTokenPayload {\n if (!isRecord(value) || !isNonEmptyString(value.source)) {\n return false;\n }\n const { user } = value;\n return (\n isRecord(user) &&\n isNonEmptyString(user.id) &&\n isNonEmptyString(user.name) &&\n isNonEmptyString(user.email) &&\n isNonEmptyString(user.projectId)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function getMcpToken(req: Request) {\n const mcpToken = req.headers.get(\"X-MCP-Token\");\n if (!mcpToken || typeof mcpToken !== \"string\") {\n throw new Error(\"Unauthorized\");\n }\n return mcpToken;\n}\n"],"mappings":";;;AAgBA,MAAM,kBAAkB;AACxB,MAAM,eAAe,QAAQ,IAAI,UAAU,UAAU,QAAQ,QAAQ,IAAI;;;;;AAMzE,eAAsB,eACpB,SACA,SAKA;;CACA,MAAM,8EAAS,QAAS,mEAAU;CAClC,MAAM,8EAAS,QAAS,mEAAU,QAAQ,IAAI;CAC9C,MAAM,0EAAO,QAAS,6DAAQ;AAC9B,KAAI,CAAC,UAAU,CAAC,KACd,OAAM,IAAI,MAAM,4BAA4B;AAQ9C,QAAO;EACL,OAPY,MAAM,OAAwB;GAC1C,OAAO;GACP;GACA;GACA;GACD,CAAC;EAGA,WAAW,IAAI,KAAK,KAAK,KAAK,GAAG,SAAS,IAAK;EAChD;;;;;;AAOH,eAAsB,eACpB,OACA,SAI0B;;CAC1B,MAAM,+EAAS,QAAS,qEAAU,QAAQ,IAAI;CAC9C,MAAM,2EAAO,QAAS,+DAAQ;AAC9B,KAAI,CAAC,UAAU,CAAC,KACd,OAAM,IAAI,MAAM,4BAA4B;CAE9C,MAAM,UAAU,MAAM,OAAgB;EACpC;EACA;EACA;EACD,CAAC;AACF,KAAI,CAAC,kBAAkB,QAAQ,CAC7B,OAAM,IAAI,MAAM,gBAAgB;AAElC,QAAO;;AAGT,SAAS,kBAAkB,OAA0C;AACnE,KAAI,CAAC,SAAS,MAAM,IAAI,CAAC,iBAAiB,MAAM,OAAO,CACrD,QAAO;CAET,MAAM,EAAE,SAAS;AACjB,QACE,SAAS,KAAK,IACd,iBAAiB,KAAK,GAAG,IACzB,iBAAiB,KAAK,KAAK,IAC3B,iBAAiB,KAAK,MAAM,IAC5B,iBAAiB,KAAK,UAAU;;AAIpC,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,iBAAiB,OAAiC;AACzD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,SAAS;;AAG5D,SAAgB,YAAY,KAAc;CACxC,MAAM,WAAW,IAAI,QAAQ,IAAI,cAAc;AAC/C,KAAI,CAAC,YAAY,OAAO,aAAa,SACnC,OAAM,IAAI,MAAM,eAAe;AAEjC,QAAO"}
package/package.json CHANGED
@@ -1,9 +1,19 @@
1
1
  {
2
2
  "name": "@super_studio/ecforce-ai-agent-server",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.cts",
7
+ "typesVersions": {
8
+ "*": {
9
+ "mcp-auth": [
10
+ "dist/mcp-auth.d.cts"
11
+ ],
12
+ "provider": [
13
+ "dist/provider.d.cts"
14
+ ]
15
+ }
16
+ },
7
17
  "sideEffects": false,
8
18
  "files": [
9
19
  "dist",
package/src/mcp-auth.ts CHANGED
@@ -63,17 +63,39 @@ export async function decodeMCPToken(
63
63
  if (!secret || !salt) {
64
64
  throw new Error("Secret or salt is not set");
65
65
  }
66
- const decoded = await decode<MCPTokenPayload>({
66
+ const decoded = await decode<unknown>({
67
67
  token,
68
68
  secret,
69
69
  salt,
70
70
  });
71
- if (!decoded) {
71
+ if (!isMCPTokenPayload(decoded)) {
72
72
  throw new Error("Invalid token");
73
73
  }
74
74
  return decoded;
75
75
  }
76
76
 
77
+ function isMCPTokenPayload(value: unknown): value is MCPTokenPayload {
78
+ if (!isRecord(value) || !isNonEmptyString(value.source)) {
79
+ return false;
80
+ }
81
+ const { user } = value;
82
+ return (
83
+ isRecord(user) &&
84
+ isNonEmptyString(user.id) &&
85
+ isNonEmptyString(user.name) &&
86
+ isNonEmptyString(user.email) &&
87
+ isNonEmptyString(user.projectId)
88
+ );
89
+ }
90
+
91
+ function isRecord(value: unknown): value is Record<string, unknown> {
92
+ return typeof value === "object" && value !== null && !Array.isArray(value);
93
+ }
94
+
95
+ function isNonEmptyString(value: unknown): value is string {
96
+ return typeof value === "string" && value.trim().length > 0;
97
+ }
98
+
77
99
  export function getMcpToken(req: Request) {
78
100
  const mcpToken = req.headers.get("X-MCP-Token");
79
101
  if (!mcpToken || typeof mcpToken !== "string") {