{"_id":"@agent-web-portal/aws-lambda","_rev":"2-8afdecbecc1bf26ef3ce65ab9988b408","name":"@agent-web-portal/aws-lambda","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@agent-web-portal/aws-lambda","version":"0.1.0","keywords":["mcp","ai-agent","agent-web-portal","awp","aws","lambda","serverless"],"author":{"name":"Agent Web Portal Contributors"},"license":"MIT","_id":"@agent-web-portal/aws-lambda@0.1.0","maintainers":[{"name":"shazhou.ww","email":"shazhou.ww@gmail.com"}],"homepage":"https://github.com/anthropics/agent-web-portal#readme","bugs":{"url":"https://github.com/anthropics/agent-web-portal/issues"},"dist":{"shasum":"3795102cf931382324586d272a2b7a3f394c681b","tarball":"https://registry.npmjs.org/@agent-web-portal/aws-lambda/-/aws-lambda-0.1.0.tgz","fileCount":7,"integrity":"sha512-Pi3DCmdBpMlq4TS/H3Q31kn5eTb9aCPWzCX3RGMPvLRoe2Rel33JZz/xmRmRYifzfFq1oLA6odJYdXDg2CX/4g==","signatures":[{"sig":"MEYCIQCXeea6LeL7wUr3YU3sQeNYMrLxX3zeMVY1LSlR9TDJDQIhALtuBI8VOU+Vc+Wq5D5mgK+8tz0vXauclkJm0pNEQ3Hh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28076},"main":"src/index.ts","type":"module","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"775a13ba357a3164925dac6fd943f64188b54dd4","scripts":{"lint":"biome check .","check":"tsc --noEmit && biome check .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit"},"_npmUser":{"name":"shazhou.ww","email":"shazhou.ww@gmail.com"},"repository":{"url":"git+https://github.com/anthropics/agent-web-portal.git","type":"git","directory":"packages/aws-lambda"},"_npmVersion":"11.6.2","description":"AWS Lambda adapter for Agent Web Portal","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.24.1","yaml":"^2.7.0","jsonata":"^2.0.5","@aws-sdk/client-s3":"^3.700.0","@agent-web-portal/core":"^0.1.0","@aws-sdk/s3-request-presigner":"^3.700.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.10.5","@types/aws-lambda":"^8.10.147"},"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/aws-lambda_0.1.0_1769099677168_0.31635859274544953","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@agent-web-portal/aws-lambda","version":"0.2.0","description":"AWS Lambda adapter for Agent Web Portal","license":"MIT","author":{"name":"Agent Web Portal Contributors"},"repository":{"type":"git","url":"git+https://github.com/anthropics/agent-web-portal.git","directory":"packages/aws-lambda"},"homepage":"https://github.com/anthropics/agent-web-portal#readme","bugs":{"url":"https://github.com/anthropics/agent-web-portal/issues"},"publishConfig":{"access":"public"},"keywords":["mcp","ai-agent","agent-web-portal","awp","aws","lambda","serverless"],"type":"module","main":"src/index.ts","types":"src/index.ts","exports":{".":{"import":"./src/index.ts","types":"./src/index.ts"}},"scripts":{"clean":"rimraf .turbo dist","typecheck":"tsc --noEmit","lint":"biome check .","lint:fix":"biome check --write .","check":"tsc --noEmit && biome check ."},"dependencies":{"@agent-web-portal/auth":"^0.2.0","@agent-web-portal/core":"^0.2.0","@aws-sdk/client-dynamodb":"^3.700.0","@aws-sdk/client-s3":"^3.700.0","@aws-sdk/s3-request-presigner":"^3.700.0","jsonata":"^2.0.5","yaml":"^2.7.0","zod":"^3.24.1"},"devDependencies":{"@types/aws-lambda":"^8.10.147","@types/node":"^22.10.5"},"peerDependencies":{"typescript":"^5"},"gitHead":"ee9e9127b046b65772299a166ae6c03eb8009ea9","_id":"@agent-web-portal/aws-lambda@0.2.0","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-84PDuypsZg+HBQkkI6uBahRL9rpLE6weRKY8fgXmDuc/KYNZoRfhvy8R1JthaTbDZviTZgsbjvjkl0KaLYs+zQ==","shasum":"09ec091d491470693293bd76b6030b4b203792ce","tarball":"https://registry.npmjs.org/@agent-web-portal/aws-lambda/-/aws-lambda-0.2.0.tgz","fileCount":10,"unpackedSize":45891,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCQsCKODsVqUa03CWhNmbrTJ7vRyMXMeo00YMxvzzPVdwIgbLnVOaAL+L+kJWO5WaFq5Ke6dd8XnRMoG7ThK3iwmpY="}]},"_npmUser":{"name":"shazhou.ww","email":"shazhou.ww@gmail.com"},"directories":{},"maintainers":[{"name":"shazhou.ww","email":"shazhou.ww@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aws-lambda_0.2.0_1769334904516_0.35371760864632096"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-22T16:34:37.080Z","modified":"2026-01-25T09:55:04.821Z","0.1.0":"2026-01-22T16:34:37.374Z","0.2.0":"2026-01-25T09:55:04.702Z"},"bugs":{"url":"https://github.com/anthropics/agent-web-portal/issues"},"author":{"name":"Agent Web Portal Contributors"},"license":"MIT","homepage":"https://github.com/anthropics/agent-web-portal#readme","keywords":["mcp","ai-agent","agent-web-portal","awp","aws","lambda","serverless"],"repository":{"type":"git","url":"git+https://github.com/anthropics/agent-web-portal.git","directory":"packages/aws-lambda"},"description":"AWS Lambda adapter for Agent Web Portal","maintainers":[{"name":"shazhou.ww","email":"shazhou.ww@gmail.com"}],"readme":"# @agent-web-portal/aws-lambda\n\nAgent Web Portal 的 AWS Lambda 适配器。\n\n## 概述\n\n`@agent-web-portal/aws-lambda` 提供：\n\n- **Lambda Handler Builder** - 流式构建 Lambda 函数\n- **API Gateway 集成** - 自动处理请求/响应转换\n- **Skills 配置** - S3 Skills 加载支持\n- **CORS 支持** - 自动处理跨域请求\n- **OAuth Metadata** - 自动暴露 well-known 端点\n\n## 安装\n\n```bash\nbun add @agent-web-portal/aws-lambda\n```\n\n## 快速开始\n\n```typescript\nimport { createAgentWebPortalHandler } from \"@agent-web-portal/aws-lambda\";\nimport { z } from \"zod\";\n\nexport const handler = createAgentWebPortalHandler({ name: \"my-portal\" })\n  .registerTool(\"greet\", {\n    inputSchema: z.object({ name: z.string() }),\n    outputSchema: z.object({ message: z.string() }),\n    handler: async ({ name }) => ({ message: `Hello, ${name}!` }),\n  })\n  .build();\n```\n\n## Skills 配置\n\n从 S3 加载 Skills：\n\n```typescript\nexport const handler = createAgentWebPortalHandler({ name: \"my-portal\" })\n  .registerTool(\"search\", { ... })\n  .withSkillsConfig({\n    bucket: process.env.SKILLS_BUCKET!,\n    prefix: \"skills/\",\n    skills: [\n      {\n        name: \"search-skill\",\n        s3Key: \"search-skill.zip\",\n        frontmatter: {\n          name: \"Search Skill\",\n          \"allowed-tools\": [\"search\"],\n        },\n      },\n    ],\n  })\n  .build();\n```\n\n## API\n\n### `createAgentWebPortalHandler(options)`\n\n创建 Lambda Handler Builder。\n\n```typescript\nconst builder = createAgentWebPortalHandler({\n  name: \"my-portal\",\n  version: \"1.0.0\",\n  description: \"My AWP Lambda\",\n});\n```\n\n### `.registerTool(name, options)`\n\n注册 Tool（同 core 包）。\n\n### `.withSkillsConfig(config)`\n\n配置 Skills 加载。\n\n```typescript\ninterface SkillsConfig {\n  bucket: string;              // S3 bucket 名称\n  prefix?: string;             // S3 key 前缀\n  skills: SkillConfig[];       // Skills 列表\n}\n\ninterface SkillConfig {\n  name: string;                // Skill 名称\n  s3Key: string;               // S3 中的文件 key\n  frontmatter: SkillFrontmatter;\n}\n```\n\n### `.withMiddleware(middleware)`\n\n添加认证中间件。\n\n```typescript\nimport { createAwpAuthMiddleware } from \"@agent-web-portal/auth\";\n\nconst authMiddleware = createAwpAuthMiddleware({\n  pendingAuthStore,\n  pubkeyStore,\n});\n\nbuilder.withMiddleware(authMiddleware);\n```\n\n### `.withAwpAuth(config)`\n\n配置 AWP ECDSA P-256 认证。自动处理 `/auth/init` 和 `/auth/status` 端点。\n\n```typescript\nimport { DynamoDBPendingAuthStore, DynamoDBPubkeyStore } from \"@agent-web-portal/aws-lambda\";\n\nconst pendingAuthStore = new DynamoDBPendingAuthStore({ tableName: \"awp-auth\" });\nconst pubkeyStore = new DynamoDBPubkeyStore({ tableName: \"awp-auth\" });\n\nbuilder.withAwpAuth({\n  pendingAuthStore,\n  pubkeyStore,\n  authInitPath: \"/auth/init\",      // 可选，默认 \"/auth/init\"\n  authStatusPath: \"/auth/status\",  // 可选，默认 \"/auth/status\"\n  authPagePath: \"/auth\",           // 可选，默认 \"/auth\"\n});\n```\n\n**注意：** `/auth/complete` 端点需要应用自己实现，因为需要验证用户会话。使用 `.withRoutes()` 添加：\n\n```typescript\nimport { completeAuthorization } from \"@agent-web-portal/auth\";\n\nbuilder.withRoutes(async (request) => {\n  const url = new URL(request.url);\n  if (url.pathname === \"/auth/complete\" && request.method === \"POST\") {\n    const userId = await getUserFromSession(request); // 应用特定的会话验证\n    if (!userId) {\n      return new Response(JSON.stringify({ error: \"Unauthorized\" }), { status: 401 });\n    }\n    const body = JSON.parse(await request.text());\n    const result = await completeAuthorization(\n      body.pubkey,\n      body.verification_code,\n      userId,\n      { pendingAuthStore, pubkeyStore }\n    );\n    return new Response(JSON.stringify(result), {\n      status: result.success ? 200 : 400,\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n  }\n  return null;\n});\n```\n\n### `.withRoutes(handler)`\n\n添加自定义路由处理器。返回 `Response` 表示已处理，返回 `null` 继续到下一个处理器。\n\n```typescript\nbuilder.withRoutes(async (request) => {\n  const url = new URL(request.url);\n  if (url.pathname === \"/health\") {\n    return new Response(JSON.stringify({ status: \"ok\" }), {\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n  }\n  return null;\n});\n\n### `.build()`\n\n构建 Lambda Handler。\n\n## 路由\n\n默认路由：\n\n| Path | Method | 功能 |\n|------|--------|------|\n| `/mcp` 或 `/` | POST | MCP 端点 |\n| `/auth/init` | POST | AWP 认证初始化（需配置 `withAwpAuth`） |\n| `/auth/status` | GET | AWP 认证状态查询（需配置 `withAwpAuth`） |\n| `/skills/:name` | GET | Skill 下载（重定向到 S3 presigned URL） |\n| 任意路径 | OPTIONS | CORS 预检 |\n\n## 环境变量\n\n| 变量 | 说明 |\n|------|------|\n| `SKILLS_BUCKET` | Skills S3 bucket |\n| `AWS_REGION` | AWS 区域 |\n\n## SAM 模板示例\n\n```yaml\nAWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\n\nResources:\n  MyPortalFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: handler.handler\n      Runtime: nodejs20.x\n      MemorySize: 256\n      Timeout: 30\n      Environment:\n        Variables:\n          SKILLS_BUCKET: !Ref SkillsBucket\n      Events:\n        McpEndpoint:\n          Type: Api\n          Properties:\n            Path: /mcp\n            Method: POST\n\n  SkillsBucket:\n    Type: AWS::S3::Bucket\n```\n\n## 低级 API\n\n直接使用 `createLambdaHandler`：\n\n```typescript\nimport { createLambdaHandler } from \"@agent-web-portal/aws-lambda\";\n\nconst portal = createAgentWebPortal({ name: \"my-portal\" })\n  .registerTool(...)\n  .build();\n\nexport const handler = createLambdaHandler(portal, {\n  basePath: \"/api\",\n  corsOrigins: [\"https://example.com\"],\n});\n```\n\n## 类型导出\n\n- `LambdaHandlerBuilder` - Builder 类\n- `LambdaHandler` - Lambda Handler 类型\n- `APIGatewayProxyEvent` - API Gateway 事件\n- `APIGatewayProxyResult` - API Gateway 响应\n- `SkillsConfig` - Skills 配置\n- `LambdaAuthMiddleware` - 认证中间件类型\n- `AwpAuthLambdaConfig` - AWP 认证配置\n- `DynamoDBPendingAuthStore` - DynamoDB 待授权存储\n- `DynamoDBPubkeyStore` - DynamoDB 公钥存储\n\n## License\n\nMIT\n","readmeFilename":"README.md"}