@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 +1 -1
- package/dist/mcp-auth.cjs +12 -1
- package/dist/mcp-auth.d.cts.map +1 -1
- package/dist/mcp-auth.d.mts.map +1 -1
- package/dist/mcp-auth.mjs +12 -1
- package/dist/mcp-auth.mjs.map +1 -1
- package/package.json +11 -1
- package/src/mcp-auth.ts +24 -2
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.
|
|
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");
|
package/dist/mcp-auth.d.cts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/mcp-auth.d.mts.map
CHANGED
|
@@ -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;
|
|
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");
|
package/dist/mcp-auth.mjs.map
CHANGED
|
@@ -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<
|
|
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.
|
|
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<
|
|
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") {
|