◆ wport | pm_48

WPORT MCP Server + Claude Connector + TS/JS SDK(pm_48)PRD

WPORT MCP + Claude Connector + SDK

來源 doc/feature/pm_48/wport-mcp-connector-prd.md

WPORT MCP Server + Claude Connector + TS/JS SDK(pm_48)PRD

PRD 代號pm_48
延續pm_37(Enterprise REST + wpk_live_)、pm_41@wport/cli 企業線)、pm_47(求職者 OAuth/CLI,求職者 MCP 解鎖閘門)
產品原則:CLI 能做什麼,MCP/SDK/Connector 就做什麼,也因為cli已經做完,因此補上AI friendly的最後一哩路,mcp與sdk,claude connector雖然也是mcp但要另外加工,目的是讓大家覺得我們也擁抱主流ai agent;BR-040 核彈 deny list 永久排除;BR-039 通道寫入必標 source絕不開後門提高額度。
本 PRD 無 dashboard mockup:屬 API/Agent 整合產品。Storybook = 無。Claude Connector listing 文案對齊 @wport/cli npm。OAuth 同意頁(求職者)沿用 pm_47,不另開。


1. 文件資訊

  • 文件類型:MCP + Claude Connector + SDK 需求規格書
  • 適用對象:後端、CLI/SDK 工程、產品、QA、資安、AI Agent 整合
  • 最後更新:2026/08/17
  • 版本:1.1.0
  • 對應 Storybook:無(CLI/API/MCP 產品,無 mockup)
  • Storybook(local-prd):N/A
  • Storybook(online):N/A
  • 建立日期:2026/07/17
  • 對應 Coda rowIdi-S6oB4_3Q2D
  • Coda backlog 名稱:WPORT MCP Server + Claude Connector
  • PRD 識別(backlog PRD 欄)pm_48

2. 開發進度與設計來源

開發進度

  • MCP/SDK PR #:SDK 線 ✅ 已出貨(2026/08/17)——wport-cli repo PR #16(monorepo 轉型+@wport/core@wport/sdk)、#18(發布素材)、#19(cli 0.9.1)、#20(0.1.1 exports 修正,已 merge 未發)。npm:@wport/sdk@0.1.0@wport/core@0.1.0@wport/cli@0.9.1。MCP 未動工。
  • 後端(audit source/MCP gateway)PR #:audit source 進行中(2026/08/17 已 dispatch talent 分支 crazysYao/pm48-delivery-a-source-audit,需求對齊中);MCP gateway 未動工
  • Claude Directory 送審:[TBD](🚨 組織權限為 PM blocker;官方認證模式已查證,見 DR-2 回寫)

設計來源


3. 功能摘要(Feature Summary)

3.1 功能概述

  • 功能名稱:WPORT MCP Server + Claude Connector + TypeScript/JS SDK
  • 主要使用者角色
    • 企業 HR/Managerwpk_live_):v1 主打可出貨
    • 公開/未登入:jobs search/view
    • 求職者(pm_47 OAuth):v1 介面預留 + Mock/Staging;prod 解鎖閘門 = pm_47 Ready
  • 核心目標
    • 為「不想用 CLI、但要用 AI Agent」補一條路徑(Cursor custom connector + Claude Connector)
    • 讓 WPORT 進入 Claude Connectors Directory 生態
    • 官方 TS/JS SDK 與 MCP/CLI 共用同一 REST 語意與錯誤碼(實作結構由 RD 選)

3.2 範圍界定

✅ v1 包含(P0 可上 Directory/Cursor)

區塊內容
Remote MCP公開 jobs.* + 企業線 CLI 全開 parity(jobs/talents/campaigns/company/usage/keys 等,對齊 pm_41)
Lazy auth公開 tool 可先用;寫入/企業 tool 才要求 Bearer key
認證(企業)Authorization: Bearer wpk_live_...(與 REST/CLI 同)
寫入安全兩階段 confirm + tool titlereadOnlyHintdestructiveHint(BR-040)
Batch三端統一 partial success回寫(定案):實際 wire=後端 batch 端點回 207 data = { succeeded:[{index, enc_id}], failed:[{index, error_path}] }(CLI/SDK 皆原樣透傳;SDK 不 throw、CLI 有 failed 則 exit 3)。PRD 原文 success_count/failed_items[] 為 hint 名,以此為準
SDKTypeScript/JS only:公開 + 企業能力對齊。回寫(2026/08/17)@wport/sdk@0.1.x 已出貨=公開 jobs.* 全開+企業 enterprise.jobs.*(create/update/delete/list/bulkCreate);企業 talents/campaigns/company/usage/keys 尚未含(CLI parity 缺口,SDK 後續版本補齊);personal.* 佔位擲 PersonalNotEnabledError
Audit寫入進 同一套 Enterprise audit,必標 source(BR-039)
Connector listing文案/定位對齊 npm @wport/cli;隱私 URL = https://wport.me/privacy(或站上現行隱私頁正式路徑)
送審資產文件 URL、icon、企業 Demo key+測試帳(PM+設計);Directory 組織權限(PM)
託管RD 選:Cloudflare Workers AWS 輕量 serverless(限 serverless)
傳輸/包名/內部架構RD 選(見 §3.4 DR)

🔲 v1 預留/Staging(不 block P0 上線)

區塊內容
求職者 tools程式介面預留(personal.*);Mock 或僅 Staging;prod 回「未啟用/依賴 pm_47」
求職者 OAuth同意頁 沿用 pm_47;Connector 完整 OAuth 待 pm_47 Ready 後 P1 一鍵解鎖

❌ 排除範圍

項目理由
MCP Apps 互動 UI(widget/carousel 送審)非本階段;純 tools connector
Webhook另案
第二套 API Key沿用 pm_41/BR-API-CLI-004
核彈行為BR-040/pm_41 §3.5
人才庫/履歷 bulk dumpBR-017/BR-020/BR-040
雙身分同連線(企業 key + 個人 OAuth)延後
Python SDKv1 不做
提高任何 BR/quota 後門明確禁止

3.3 成功條件(KPI,上線後 3 個月)

KPI目標
Claude Directory 審核通過(或明確排程中的正式提交)通過/已提交且無 blocker
活躍 MCP/Connector 連線(企業+公開合計)≥ 10
經 MCP 建立職缺≥ 50
經 MCP 公開履歷≥ 50(求職者線解鎖後才認真計)
寫入缺 source 的 audit 事件0
核彈/越權經 MCP/SDK 成功0

3.4 設計決策依據(Design Rationale)

DR-1:通道 = CLI parity,情境不新開

  • CLI(pm_41/47)已覆蓋北極星(建職缺、上架履歷等)。本 PRD 只補通道,不發明新業務流程。

DR-2:企業認證 v1 = Bearer API key;OAuth 不鎖死

  • 採用Authorization: Bearer wpk_live_...,與 REST/CLI 一致。
  • Claude Directory:可先以 request header(static_headers,beta)送審;若審核要求 OAuth,RD 可改選企業 OAuth/雙軌(利弊見附錄 A)。PM 不假裝已完全權衡所有 Directory 認證細節。
  • 回寫(2026/08/17,官方文件查證):認證模式官方支援度=none(無認證)正式支援static_headers Beta、custom_connection 需與 mcp-review 協調、OAuth 三式(DCR/CIMD/anthropic_creds)。含義:純公開線 connector 可用 none 直上 Directory,零 OAuth 工程;企業線 v1 走 static_headers 與本 DR 原判一致。組織前置=Team/Enterprise + Owner(或 Enterprise 自訂 Directory 角色)。Anthropic egress 160.79.104.0/21。來源:claude.com/docs/connectors/building/{submission,authentication}。

DR-3:求職者線不 block 企業 Directory

  • pm_47 OAuth 尚未達第三方 Connector 託管完備 → v1 企業主打;求職者 Mock/Staging。

DR-4:Batch = partial(三端統一)

  • 捨棄 MCP all-or-nothing。對齊 CLI/API partial;回傳結構化失敗項,利於 Agent 對使用者解釋單筆失敗(如 quota)。

DR-5:寫入安全 = confirm + annotations(方案 C)

  • MCP:兩階段 confirmToken + hints;SDK:顯式 confirm;CLI:既有 --confirm

DR-6:託管/傳輸/包名/是否薄封裝 REST — 全部 RD 選

  • PM 只卡:serverless(CF Workers 或 AWS 輕量)、HTTPS、可被 Claude/Cursor 連、audit source 可注入。
  • 建議(非強制):薄封裝同一 OpenAPI client(對齊 Hypelink);包名建議 @wport/mcp@wport/sdk;傳輸建議 Streamable HTTP——皆可由 RD 改。

DR-7:Listing 文案對齊 npm

  • Connector name/tagline/description 以 @wport/cli 產品定位為 SoT(W101 Talent Search Hub;公開搜尋 + 企業管理;agent/token-friendly)。

4. 商業規則對齊(Business Rules Alignment)

4.1 本功能使用到的業務規則

規則 ID規則摘要是否關鍵在本 PRD 的對應
BR-005未驗證公司不可上架jobs.publish 透傳 403
BR-008職缺發布必填create/publish 驗證
BR-009職缺狀態非法轉換錯誤
BR-010履歷 ≤6personal(P1)
BR-01172h 冷卻personal apply(P1)
BR-012/013/016帳號/公司/權限核彈 deny(BR-040)
BR-017/020資料存取/匯出禁 bulk dump
BR-039通道寫入標 sourceMCP/SDK/CLI/API
BR-040跨通道 deny + confirm + partial本 PRD 核心

4.2 補充說明

  • BR-039/BR-040 已於 2026/07/17 回寫 business-rules.md v1.8.0(本功能提案並經 Eric 確認落地)。
  • 企業金鑰治理仍遵循 pm_41 BR-API-CLI-004010(不另開第二套 key)。

5. 資料實體與欄位(Data Entities & Fields)

Rule 30:描述 WHAT/WHY;JSON 欄位名由 OpenAPI/RD 決定。

5.1 實體列表

實體用途(WHY)必須追蹤的資訊(WHAT)
McpConnectionProfile連線語境(公開/企業/求職者預留)連線模式、憑證類型、過期/撤銷狀態
ToolInvocation單次 tool 呼叫稽核與除錯tool 名、參數摘要、結果、latency、關聯 audit id
ConfirmChallenge破壞性兩階段摘要、confirmToken、TTL、目標操作、是否已消費
BatchWriteResultpartial 語意success_count、failed_items(識別+原因)、已成功項 id
ApiAuditEvent(既有擴充)BR-039既有欄位 + source 枚舉
ConnectorListingAssetsDirectory 送審name、tagline、description、icon、docs URL、privacy URL、demo 帳說明
(業務實體)Job/Talent/Campaign/Company/Usage/ApiKey與 pm_37/41 相同不另建業務模型;MCP/SDK 只是通道

5.2 求職者 Mock(v1)

  • Staging/Mock 可回固定履歷結構;禁止寫入 production 真實個人資料
  • Prod 呼叫未解鎖 personal tool → 明確錯誤(例如 PERSONAL_MCP_NOT_ENABLED),引導依賴 pm_47。

6. 產品表面與資料需求(對應原「畫面區塊」)

無 GUI;以下為 Agent/Connector 表面。

區塊 ID名稱說明
SEC-1Public toolsjobs.searchjobs.view(lazy,可無 key)
SEC-2Enterprise toolspm_41 企業命令樹全開;需 Bearer key
SEC-3Personal tools(預留)pm_47 能力面;v1 mock/staging
SEC-4Confirm gate破壞性/對外發送兩階段
SEC-5SDK surfaceTS/JS:與 tool 語意對齊之 method
SEC-6Connector listingDirectory 公開文案與資產

Connector listing 文案錨點(對齊 npm,送審可微調)

  • Name(≤100):WPORT(W101 Talent Search Hub)
  • Tagline(≤55,建議):Search Taiwan jobs & manage hiring with AI
  • Description 要點:terminal/agent interface to W101;public job search/view without login;enterprise job/talent/campaign management with wpk_live_;token-efficient field projection for agents;see npm @wport/cli for command parity reference.

7. 使用者動作與後端需求(Actions)

動作 ID動作類型需後端說明
ACT-1公開搜尋/檢視職缺Read對齊 CLI jobs search/view
ACT-2企業建/改/上下架/刪/複製/batch 職缺Writeparity pm_41;delete/batch 需 confirm
ACT-3企業人才 list/view/respondR/W禁 export dump
ACT-4企業 company/campaigns/usage/keysR/Wkeys 治理對齊 pm_41
ACT-5破壞性 confirm 第二步Write驗證 confirmToken
ACT-6SDK 同等呼叫R/Wsource=typescript_sdk
ACT-7求職者履歷上架等WriteStaging/P1v1 prod 不開放真寫入
ACT-8Directory 連線(審查員)AuthDemo 企業 key

8. API Hints(需求,非最終 path)

8.1 Read

  • HINT-GET-1:公開職缺搜尋/單筆 view(既有 public API)
  • HINT-GET-2:企業 jobs/talents/campaigns/company/usage/keys list/view(既有 enterprise API)
  • HINT-GET-3:MCP tools/list 回傳完整 annotations

8.2 Write

  • HINT-MUTATION-1:企業職缺 create/update/publish/unpublish/delete/copy/batch(idempotency 沿用 pm_37)
  • HINT-MUTATION-2:破壞性操作兩階段 confirm(token TTL 由 RD 定,建議短效 ≤10 分鐘)
  • HINT-MUTATION-3:所有寫入 audit 必帶 source(BR-039)
  • HINT-MUTATION-4:personal 寫入僅 staging/P1

8.3 錯誤與契約(不得 TBD)

主題v1 要求
Auth缺/無效 key → 401;權限不足/停權 → 403;錯誤碼與 CLI/API 對齊
Idempotency企業寫入沿用既有 Idempotency-Key 規則(pm_37)
Confirm TTLRD 定數值;過期 → 需重新第一階段
Rate limit沿用既有;429 +(若有)Retry-After
Refresh/重連key 過期或 OAuth refresh 失敗 → 401 + 引導重新連線(非長連線心跳)
Partial batch已定案(2026/08/17):HTTP 207;body data = { succeeded:[{index, enc_id}], failed:[{index, error_path}] }(≤10 筆/批,沿 pm_41 後端 batch 端點;SDK bulkCreate 原樣回傳不 throw)

9. 導航/交付 Map

  • Storybook:無(CLI/API/MCP 產品)
  • PRD(local)file:///Users/Eric/Documents/Github/prd/doc/feature/pm_48/wport-mcp-connector-prd.md
  • npm 參考https://www.npmjs.com/package/@wport/cli
  • 隱私:站上既有隱私頁(填 Directory manifest)
  • OAuth 同意(求職者):pm_47 W-1/W-2(P1)
  • Cursor:custom connector/MCP 設定(RD 文件化)
  • Claude:Directory submission portal(需 Team/Enterprise + Directory management)

10. Flowcharts

10.1 User Flow(Agent/人資連線與建職缺)

flowchart TD
  Start([使用者在 Claude 或 Cursor 新增 WPORT Connector]) --> Lazy{呼叫的 tool 類型}
  Lazy -->|公開 jobs.search/view| Pub[執行公開 API]
  Lazy -->|企業寫入或企業讀取| Auth{已有有效 Bearer wpk_live_?}
  Auth -->|否| Prompt[要求貼上/設定 API key]
  Prompt --> Auth
  Auth -->|是| Scope{權限與公司狀態 OK?}
  Scope -->|否| Err403[回傳 403/停權錯誤]
  Scope -->|是| Dest{是否破壞性或對外發送?}
  Dest -->|否| Exec[執行 REST 等價操作]
  Dest -->|是| Phase1[回傳摘要 + confirmToken]
  Phase1 --> Phase2{第二步帶 confirmToken?}
  Phase2 -->|否| Stop[拒執行]
  Phase2 -->|是| Exec
  Exec --> Audit[寫 audit source=mcp_server]
  Audit --> Partial{是否 batch?}
  Partial -->|是| PartJSON[回傳 success_count + failed_items]
  Partial -->|否| Done[回傳成功或業務錯誤]
  Pub --> Done
  Err403 --> End([結束])
  Stop --> End
  PartJSON --> End
  Done --> End

10.2 System Flow(MCP tool → REST → audit)

sequenceDiagram
  participant Agent as Claude/Cursor Agent
  participant MCP as WPORT MCP Server
  participant API as Enterprise/Public API
  participant Audit as Audit Log

  Agent->>MCP: tools/call (e.g. enterprise.jobs.create)
  alt missing/invalid key on protected tool
    MCP-->>Agent: 401 + re-auth hint
  else ok
    alt destructive without confirmToken
      MCP-->>Agent: CONFIRM_REQUIRED + summary + token
      Agent->>MCP: tools/call with confirmToken
    end
    MCP->>API: REST equivalent + Idempotency if required
    API->>Audit: write event source=mcp_server
    API-->>MCP: success / partial / error
    MCP-->>Agent: structured JSON (incl. failed_items if batch)
  end

10.3 出貨切分(Navigation of releases)

flowchart LR
  P0[P0: Public + Enterprise MCP/SDK + Directory 送審] --> P05[P0.5: Personal tools Mock/Staging]
  P05 --> P1[P1: pm_47 Ready → Personal prod 解鎖]

10.4 Edge Case Coverage

類別情境系統行為Agent/使用者回饋可重試資料一致性備註
NetworkTimeout中止該次呼叫逾時錯誤Yes無寫入或依 idempotencyRD 定 timeout
Network429回傳 rate limit含 Retry-After(若有)Yes 退避無額外寫入S7
Network斷線無長連線狀態機下次 tool 重試Yes以 server 為準非 WebSocket 常駐
Datavalidation 失敗拒寫欄位級錯誤Yes不寫
Databatch 部分失敗partial JSONsuccess_count + failed_items可針對失敗項成功項保留DR-4
Data職缺/履歷已刪下架404/業務錯明確訊息視操作不破壞他筆S9
Authkey 無效/過期401引導重貼 key/重連Yes不寫S8
Auth權限不足/公司停權403明確 code換 key/解停後不寫S6
Authlazy:公開 OK、寫入需 key寫入前 401要求認證YesDR lazy
Authpersonal prod 未解鎖功能關閉錯誤依賴 pm_47N/A prod禁止真寫S10
Logical無 confirm 的 delete拒執行CONFIRM_REQUIREDYes不寫BR-040
Logical核彈 tool不存在/永久拒不暴露N/ABR-040
Logical雙身分同連線延後out
InterruptionAgent 中途停止已成功 batch 項保留回報已成功數可補失敗項partial
User換裝置重新設定 connector/key重連Yes

11. Mock/Staging Schema(求職者線 v1)

  • 資料來源:Mock 固定 fixture 或 Staging 專用帳;不打 prod 個人寫入。
  • 切換:環境旗標/feature flag(RD);prod 預設 OFF。
  • CRUD:Mock 僅行程式記憶體或 staging DB;不得污染 prod。

12. 實作備註(Implementation Notes)

12.1 禁止事項

  • ❌ 不開高於 BR/Enterprise quota 的後門
  • ❌ 不實作 BR-040 核彈能力
  • ❌ 不以 query string 傳 API key(Claude 文件亦禁止)
  • ❌ 不把本 PRD 當最終 OpenAPI path 定義(Hints only)
  • ❌ v1 prod 不啟用求職者真寫入

12.2 RD 決策清單(本 PRD 明確放權)

項目選項邊界
MCP 傳輸Streamable HTTP 或 SSE
託管CF Workers 或 AWS 輕量 serverless
npm 包名已定@wport/sdk+共用引擎 @wport/core(monorepo 抽出,cli/sdk/未來 mcp 共用);MCP 包名待交付 C
內部架構已定:wport-cli 轉 npm workspaces monorepo,@wport/core=runtime-agnostic 薄 REST client(typed errors/enterprise transport/OpenAPI 型別),SDK 全請求標 X-Source: typescript_sdk(BR-039 客戶端已就緒;CLI 標 cli 待後端就緒後啟用)
企業 OAuthv1 不強制;Directory 打回後可升級(附錄 A)
ConfirmToken TTL/儲存RD 定
Tool 命名細節SDK 已採jobs.*enterprise.jobs.*personal.*(文件=npm README);MCP tool 命名待交付 C

12.3 PM 立即行動(非 RD)

  • 本週申請/升級 Claude Team 或 Enterprise + Directory management
  • 與設計準備 icon、文件頁、Demo 企業 key 帳、(預留)求職者 Demo 帳說明
  • Directory listing 文案定稿(對齊 npm)

12.4 遷移/相容

  • 既有 CLI/API 使用者:無破壞性變更;僅 audit 新增/強制 source(既有呼叫應標 enterprise_apicli)。
  • 回滾:feature flag 關閉 MCP 路由即可;不影響 GUI。

12.5 Sync-fix 清單

項目OwnerBlocking?
BR-039/040 已入 business-rules v1.8.0PM ✅No
pm_41 §3.5 標題已指 BR-040PM ✅No
OpenAPI/audit source 實作RDYes for 合規(客戶端 ✅ SDK 已標;後端記錄進行中 2026/08/17)
MCP server + SDKRDYes(SDK ✅ 0.1.x 已上 npm 2026/08/17;MCP 未動工)
Claude org/Directory 權限PMYes for 送審
Demo 帳/icon/docsPM+DesignYes for 送審
pm_47 Ready → personal 解鎖RD+PMP1 only
exec-wport-cli/新 MCP skill 文件PM/DocsNo(上線後)
Coda PRD=pm_48i-S6oB4_3Q2DPM ✅No

13. 一致性表與版本凍結(Stage 5–6)

13.1 欄位/語意對照

概念SoT版本
企業認證Bearer wpk_live_ = RESTv1
求職者認證pm_47 OAuthv1 mock/P1 prod
Batch 語意partial(pm_37/41)v1
Deny listBR-040/pm_41 §3.5v1
Audit sourceBR-039v1
Listing 文案npm @wport/cliv1
隱私 URL站上既有 privacyv1

13.2 Constants

常數SoT版本
Batch 上限≤100(企業 jobs batch)pm_37/41v1
履歷上限6BR-010P1
投遞冷卻72hBR-011P1
Confirm兩階段必做(破壞性)BR-040v1
MCP Apps UI不做本 PRDv1

13.3 Event dictionary

事件觸發Payload 語意SoT
mcp.tool.invokedtool 呼叫tool、result、source本 PRD
audit.write任何通道寫入含 sourceBR-039
mcp.confirm.issued破壞性第一階段token TTLBR-040
mcp.confirm.consumed第二階段成功BR-040

13.4 術語 dictionary

術語定義勿混淆
MCP Server對 Agent 暴露 tools 的服務≠ MCP Apps UI
Claude Connector在 Claude 連到本 MCP 的包裝/上架形態≠ CLI
Lazy auth公開 tool 可先用,受保護 tool 再認證≠ 無安全
Partial success批次部分成功並回報失敗項≠ all-or-nothing
sourceaudit 通道標記≠ OAuth scope

13.5 Version freeze

Itemv1/v2Blocking?ReasonDecision makerDate
企業 MCP/SDK/Directory 送審準備v1Yes核心出貨Eric2026/07/17
求職者 prod MCPv1 mock/P1No for P0pm_47 閘門Eric2026/07/17
企業 OAuthv1 可選升級NoRD/審核RD
雙身分同連線延後NoEric2026/07/17
MCP Apps UIoutNoEric2026/07/17
Python SDKoutNoEric2026/07/17

13.6 PRD 問題清單

#PRD sectionIssueSuggested fixCategoryImpactSoT

(若 Claude Directory 組織權限本週未取得,視為交付 blocker,非 PRD 規格缺陷。)


14. 下一步(Next Steps)

  1. Stage 8:使用者確認本 PRD 後 → Stage 9 commit/push(Coda 已有 pm_48
  2. RD:開 MCP/SDK/audit source 實作;填 RD 決策清單
  3. PM:Claude org+Directory;Demo 帳與 listing 資產
  4. 可選:gen-trello-project-setup 建 goal+delivery 卡(無 Storybook 欄位填「無」)
  5. P1:pm_47 Ready → 解鎖 personal tools

附錄 A:企業 API key vs OAuth(供 RD/送審參考,v1 不強制)

API key(v1 採用)另做企業 OAuth
與 CLI/REST 一致、快Directory 原生偏好、人同意可撤銷
static_headers 仍 beta、org 共用 key 風險多 AS/consent、與 CLI 體驗分叉
建議工具層繼續打同一 REST若審核要求再升級;可雙軌

附錄 B:Stage 2 情境 ID 對照

S1–S12 見對話 Stage 2;已納入 §10.1/§10.4。


文件結束