@sonordev/site-kit 4.2.3 → 4.3.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/agent-manifest.json +11 -1
- package/dist/AnalyticsProvider-WRAJE62B.js +31 -0
- package/dist/{AnalyticsProvider-VSTTYP4W.js.map → AnalyticsProvider-WRAJE62B.js.map} +1 -1
- package/dist/AnalyticsProvider-YZAOPVAY.mjs +10 -0
- package/dist/{AnalyticsProvider-NW3UZYL5.mjs.map → AnalyticsProvider-YZAOPVAY.mjs.map} +1 -1
- package/dist/ChatWidget-NMZGPP7A.js +20 -0
- package/dist/{ChatWidget-BJOE2OSI.js.map → ChatWidget-NMZGPP7A.js.map} +1 -1
- package/dist/ChatWidget-ZI34F7JU.mjs +11 -0
- package/dist/{ChatWidget-EWQ7LRD4.mjs.map → ChatWidget-ZI34F7JU.mjs.map} +1 -1
- package/dist/EngageWidget-2U4EN7OP.js +18 -0
- package/dist/{EngageWidget-CZMNLFWI.js.map → EngageWidget-2U4EN7OP.js.map} +1 -1
- package/dist/EngageWidget-NI2BN6GO.mjs +9 -0
- package/dist/{EngageWidget-F427CI6Y.mjs.map → EngageWidget-NI2BN6GO.mjs.map} +1 -1
- package/dist/{FileField-5RVBU3Z4.mjs → FileField-I4UICUJF.mjs} +5 -5
- package/dist/{FileField-5RVBU3Z4.mjs.map → FileField-I4UICUJF.mjs.map} +1 -1
- package/dist/{FileField-Y4ZA7DST.js → FileField-UI6DAB3K.js} +6 -6
- package/dist/{FileField-Y4ZA7DST.js.map → FileField-UI6DAB3K.js.map} +1 -1
- package/dist/{FormSpotlight-MAEV6SZK.js → FormSpotlight-LO4BU6FY.js} +15 -15
- package/dist/{FormSpotlight-MAEV6SZK.js.map → FormSpotlight-LO4BU6FY.js.map} +1 -1
- package/dist/{FormSpotlight-CJPI2MRJ.mjs → FormSpotlight-RGFZMYPT.mjs} +3 -3
- package/dist/{FormSpotlight-CJPI2MRJ.mjs.map → FormSpotlight-RGFZMYPT.mjs.map} +1 -1
- package/dist/{FormStage-D42NAHSN.js → FormStage-NT5ZAH5Y.js} +13 -13
- package/dist/{FormStage-D42NAHSN.js.map → FormStage-NT5ZAH5Y.js.map} +1 -1
- package/dist/{FormStage-Z7WW3DNA.mjs → FormStage-RBXMNWM3.mjs} +3 -3
- package/dist/{FormStage-Z7WW3DNA.mjs.map → FormStage-RBXMNWM3.mjs.map} +1 -1
- package/dist/ManagedForm-CJOFGQK6.mjs +14 -0
- package/dist/{ManagedForm-A7BROQIN.mjs.map → ManagedForm-CJOFGQK6.mjs.map} +1 -1
- package/dist/ManagedForm-MKV5RM54.js +23 -0
- package/dist/{ManagedForm-Z3Z5Z6OL.js.map → ManagedForm-MKV5RM54.js.map} +1 -1
- package/dist/{SignalCore-77UH6PZ4.mjs → SignalCore-B2ZSLEXI.mjs} +5 -5
- package/dist/{SignalCore-77UH6PZ4.mjs.map → SignalCore-B2ZSLEXI.mjs.map} +1 -1
- package/dist/{SignalCore-NA6TJFVE.js → SignalCore-IX4L2TYS.js} +11 -11
- package/dist/{SignalCore-NA6TJFVE.js.map → SignalCore-IX4L2TYS.js.map} +1 -1
- package/dist/SitemapSync-2LLNO24P.mjs +8 -0
- package/dist/{SitemapSync-EY33A6P4.mjs.map → SitemapSync-2LLNO24P.mjs.map} +1 -1
- package/dist/SitemapSync-B2CY2JYM.js +17 -0
- package/dist/{SitemapSync-62F6HVAW.js.map → SitemapSync-B2CY2JYM.js.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +4 -4
- package/dist/{chunk-NEIUWAAL.js → chunk-2EA4DC2G.js} +5 -5
- package/dist/{chunk-NEIUWAAL.js.map → chunk-2EA4DC2G.js.map} +1 -1
- package/dist/chunk-2X5ZB5D7.mjs +6 -0
- package/dist/{chunk-XCFCG46K.mjs.map → chunk-2X5ZB5D7.mjs.map} +1 -1
- package/dist/{chunk-RDISSFEH.js → chunk-3AAFSXFC.js} +15 -15
- package/dist/{chunk-RDISSFEH.js.map → chunk-3AAFSXFC.js.map} +1 -1
- package/dist/{chunk-KL4MV6HK.mjs → chunk-3DFYFDGC.mjs} +3 -3
- package/dist/{chunk-KL4MV6HK.mjs.map → chunk-3DFYFDGC.mjs.map} +1 -1
- package/dist/{chunk-HVDKAR77.js → chunk-3KVG2PSJ.js} +7 -7
- package/dist/{chunk-HVDKAR77.js.map → chunk-3KVG2PSJ.js.map} +1 -1
- package/dist/{chunk-FZAAQE4Y.mjs → chunk-3ZD2XCLE.mjs} +4 -4
- package/dist/{chunk-FZAAQE4Y.mjs.map → chunk-3ZD2XCLE.mjs.map} +1 -1
- package/dist/{chunk-RRR6Y6Y5.mjs → chunk-5PBJ42NC.mjs} +4 -4
- package/dist/{chunk-RRR6Y6Y5.mjs.map → chunk-5PBJ42NC.mjs.map} +1 -1
- package/dist/{chunk-3P4HJAZA.mjs → chunk-5S735BSH.mjs} +4 -4
- package/dist/{chunk-3P4HJAZA.mjs.map → chunk-5S735BSH.mjs.map} +1 -1
- package/dist/{chunk-535HXGDU.mjs → chunk-6SN3ABID.mjs} +3 -3
- package/dist/{chunk-535HXGDU.mjs.map → chunk-6SN3ABID.mjs.map} +1 -1
- package/dist/{chunk-OHA43BNK.js → chunk-7X4LKAYJ.js} +14 -14
- package/dist/{chunk-OHA43BNK.js.map → chunk-7X4LKAYJ.js.map} +1 -1
- package/dist/{chunk-RCRDDMUO.mjs → chunk-ACL5FDJI.mjs} +3 -3
- package/dist/{chunk-RCRDDMUO.mjs.map → chunk-ACL5FDJI.mjs.map} +1 -1
- package/dist/{chunk-SL6ZGJVN.mjs → chunk-ANJBOE46.mjs} +4 -4
- package/dist/{chunk-SL6ZGJVN.mjs.map → chunk-ANJBOE46.mjs.map} +1 -1
- package/dist/{chunk-BN4AL7XB.js → chunk-BGIT5M27.js} +4 -4
- package/dist/{chunk-BN4AL7XB.js.map → chunk-BGIT5M27.js.map} +1 -1
- package/dist/{chunk-TFAYDIWM.mjs → chunk-DYDJ6NCM.mjs} +3 -3
- package/dist/{chunk-TFAYDIWM.mjs.map → chunk-DYDJ6NCM.mjs.map} +1 -1
- package/dist/{chunk-M2SEYO5J.js → chunk-F3MOVBEE.js} +7 -7
- package/dist/{chunk-M2SEYO5J.js.map → chunk-F3MOVBEE.js.map} +1 -1
- package/dist/{chunk-XA7RBHKT.js → chunk-FIVPS4Z6.js} +4 -4
- package/dist/{chunk-XA7RBHKT.js.map → chunk-FIVPS4Z6.js.map} +1 -1
- package/dist/{chunk-TKVADZFD.mjs → chunk-G5EETWKH.mjs} +4 -4
- package/dist/{chunk-TKVADZFD.mjs.map → chunk-G5EETWKH.mjs.map} +1 -1
- package/dist/{chunk-BX6FFL2Y.js → chunk-HXHDOIV6.js} +5 -5
- package/dist/{chunk-BX6FFL2Y.js.map → chunk-HXHDOIV6.js.map} +1 -1
- package/dist/{chunk-UDNXM6RB.mjs → chunk-IDSTSLMM.mjs} +3 -3
- package/dist/{chunk-UDNXM6RB.mjs.map → chunk-IDSTSLMM.mjs.map} +1 -1
- package/dist/{chunk-DZUOLOYS.mjs → chunk-IT76CWZ2.mjs} +3 -3
- package/dist/{chunk-DZUOLOYS.mjs.map → chunk-IT76CWZ2.mjs.map} +1 -1
- package/dist/{chunk-7BVZLSUJ.js → chunk-IW6S62NR.js} +8 -8
- package/dist/{chunk-7BVZLSUJ.js.map → chunk-IW6S62NR.js.map} +1 -1
- package/dist/{chunk-EHNUPEFY.mjs → chunk-IWFQPGA2.mjs} +7 -7
- package/dist/{chunk-EHNUPEFY.mjs.map → chunk-IWFQPGA2.mjs.map} +1 -1
- package/dist/{chunk-S5UATBC7.js → chunk-IWV72YOE.js} +14 -14
- package/dist/{chunk-S5UATBC7.js.map → chunk-IWV72YOE.js.map} +1 -1
- package/dist/{chunk-WCTOQFAN.js → chunk-IZVV36RT.js} +14 -14
- package/dist/{chunk-WCTOQFAN.js.map → chunk-IZVV36RT.js.map} +1 -1
- package/dist/{chunk-T3HGONNE.mjs → chunk-JBX6KV46.mjs} +4 -4
- package/dist/{chunk-T3HGONNE.mjs.map → chunk-JBX6KV46.mjs.map} +1 -1
- package/dist/{chunk-J6HWSJT7.mjs → chunk-JJTCVH4Q.mjs} +3 -3
- package/dist/{chunk-J6HWSJT7.mjs.map → chunk-JJTCVH4Q.mjs.map} +1 -1
- package/dist/{chunk-GDMOAGVS.js → chunk-K7QBRZLN.js} +18 -18
- package/dist/{chunk-GDMOAGVS.js.map → chunk-K7QBRZLN.js.map} +1 -1
- package/dist/{chunk-6D3HZKTZ.mjs → chunk-L4FHGCQ2.mjs} +3 -3
- package/dist/{chunk-6D3HZKTZ.mjs.map → chunk-L4FHGCQ2.mjs.map} +1 -1
- package/dist/{chunk-N5RTJNMN.js → chunk-LTALFZX7.js} +6 -6
- package/dist/{chunk-N5RTJNMN.js.map → chunk-LTALFZX7.js.map} +1 -1
- package/dist/{chunk-ZASFY4NR.mjs → chunk-LVMPYAOQ.mjs} +4 -4
- package/dist/{chunk-ZASFY4NR.mjs.map → chunk-LVMPYAOQ.mjs.map} +1 -1
- package/dist/{chunk-XOJYGBYF.js → chunk-NGAKS4WG.js} +3 -3
- package/dist/{chunk-XOJYGBYF.js.map → chunk-NGAKS4WG.js.map} +1 -1
- package/dist/{chunk-MP7ZYKMM.js → chunk-O4TMBV54.js} +8 -8
- package/dist/{chunk-MP7ZYKMM.js.map → chunk-O4TMBV54.js.map} +1 -1
- package/dist/{chunk-T6T5IQMN.mjs → chunk-OBRGUSGB.mjs} +3 -3
- package/dist/{chunk-T6T5IQMN.mjs.map → chunk-OBRGUSGB.mjs.map} +1 -1
- package/dist/{chunk-3DSGMX7P.js → chunk-OOBEJZJ5.js} +3 -3
- package/dist/{chunk-3DSGMX7P.js.map → chunk-OOBEJZJ5.js.map} +1 -1
- package/dist/{chunk-JJDY5XXG.js → chunk-PJZHIISA.js} +3 -3
- package/dist/{chunk-JJDY5XXG.js.map → chunk-PJZHIISA.js.map} +1 -1
- package/dist/{chunk-XWFUQMU6.mjs → chunk-QEHPIQYN.mjs} +3 -3
- package/dist/{chunk-XWFUQMU6.mjs.map → chunk-QEHPIQYN.mjs.map} +1 -1
- package/dist/{chunk-QJK2X3UK.js → chunk-R2O5VDNJ.js} +12 -12
- package/dist/{chunk-QJK2X3UK.js.map → chunk-R2O5VDNJ.js.map} +1 -1
- package/dist/{chunk-INA4NW3Y.mjs → chunk-RW76CJBS.mjs} +3 -3
- package/dist/{chunk-INA4NW3Y.mjs.map → chunk-RW76CJBS.mjs.map} +1 -1
- package/dist/{chunk-2XRGCDDG.js → chunk-SABYEM57.js} +9 -9
- package/dist/{chunk-2XRGCDDG.js.map → chunk-SABYEM57.js.map} +1 -1
- package/dist/{chunk-ZAVNGZJZ.js → chunk-SACGTFCK.js} +22 -6
- package/dist/chunk-SACGTFCK.js.map +1 -0
- package/dist/{chunk-SAR473OC.js → chunk-SM27DPML.js} +12 -12
- package/dist/{chunk-SAR473OC.js.map → chunk-SM27DPML.js.map} +1 -1
- package/dist/{chunk-HTLWSCUQ.mjs → chunk-SRJSR6YP.mjs} +22 -6
- package/dist/chunk-SRJSR6YP.mjs.map +1 -0
- package/dist/{chunk-NB4MK2Q5.js → chunk-SWIKKSKL.js} +3 -2
- package/dist/chunk-SWIKKSKL.js.map +1 -0
- package/dist/{chunk-GJKO2TZN.js → chunk-T6YDAJ5F.js} +4 -4
- package/dist/{chunk-GJKO2TZN.js.map → chunk-T6YDAJ5F.js.map} +1 -1
- package/dist/{chunk-MF6XLEX5.js → chunk-TBIWQQVF.js} +15 -15
- package/dist/{chunk-MF6XLEX5.js.map → chunk-TBIWQQVF.js.map} +1 -1
- package/dist/chunk-U3P4WF2A.js +8 -0
- package/dist/{chunk-S5L73KZQ.js.map → chunk-U3P4WF2A.js.map} +1 -1
- package/dist/{chunk-YWXZ4YLU.js → chunk-UDXWBLBH.js} +4 -4
- package/dist/{chunk-YWXZ4YLU.js.map → chunk-UDXWBLBH.js.map} +1 -1
- package/dist/{chunk-I7ORAWYT.mjs → chunk-UFT7IKDN.mjs} +4 -4
- package/dist/{chunk-I7ORAWYT.mjs.map → chunk-UFT7IKDN.mjs.map} +1 -1
- package/dist/{chunk-GU5OTUQS.mjs → chunk-VS67QHNX.mjs} +3 -3
- package/dist/{chunk-GU5OTUQS.mjs.map → chunk-VS67QHNX.mjs.map} +1 -1
- package/dist/{chunk-XR3MDDQT.mjs → chunk-XPNOM353.mjs} +3 -3
- package/dist/{chunk-XR3MDDQT.mjs.map → chunk-XPNOM353.mjs.map} +1 -1
- package/dist/{chunk-PTZB4ES3.mjs → chunk-YSLGMCQH.mjs} +8 -8
- package/dist/{chunk-PTZB4ES3.mjs.map → chunk-YSLGMCQH.mjs.map} +1 -1
- package/dist/{chunk-NI7OY4FW.mjs → chunk-ZN4HBK5C.mjs} +3 -2
- package/dist/chunk-ZN4HBK5C.mjs.map +1 -0
- package/dist/cli/index.js +36 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +29 -16
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.js +5 -5
- package/dist/client/index.mjs +4 -4
- package/dist/commerce/index.js +56 -56
- package/dist/commerce/index.mjs +5 -5
- package/dist/engage/index.js +13 -13
- package/dist/engage/index.mjs +7 -7
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/index.js +21 -21
- package/dist/forms/index.mjs +10 -10
- package/dist/forms/server.js +10 -10
- package/dist/forms/server.mjs +8 -8
- package/dist/forms/static.js +7 -7
- package/dist/forms/static.mjs +6 -6
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +63 -63
- package/dist/index.mjs +9 -9
- package/dist/layout/client.js +9 -9
- package/dist/layout/client.mjs +8 -8
- package/dist/layout/index.js +11 -11
- package/dist/layout/index.mjs +9 -9
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/mcp/WebMcpTools.d.ts +60 -0
- package/dist/mcp/WebMcpTools.d.ts.map +1 -0
- package/dist/mcp/client.d.ts +9 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +132 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/client.mjs +129 -0
- package/dist/mcp/client.mjs.map +1 -0
- package/dist/mcp/declarative.d.ts +77 -0
- package/dist/mcp/declarative.d.ts.map +1 -0
- package/dist/mcp/handlers.d.ts +92 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +29 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +537 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/index.mjs +509 -0
- package/dist/mcp/index.mjs.map +1 -0
- package/dist/mcp/protocol.d.ts +140 -0
- package/dist/mcp/protocol.d.ts.map +1 -0
- package/dist/mcp/protocol.test.d.ts +2 -0
- package/dist/mcp/protocol.test.d.ts.map +1 -0
- package/dist/mcp/serverCard.d.ts +77 -0
- package/dist/mcp/serverCard.d.ts.map +1 -0
- package/dist/mcp/types.d.ts +154 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/og/config.d.ts +11 -1
- package/dist/og/config.d.ts.map +1 -1
- package/dist/og/index.js +5 -5
- package/dist/og/index.mjs +1 -1
- package/dist/og/pages.d.ts.map +1 -1
- package/dist/og/template.d.ts.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +4 -4
- package/dist/seo-pages/contract.js +6 -6
- package/dist/seo-pages/contract.mjs +2 -2
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/build-entries.d.ts +4 -1
- package/dist/shared/build-entries.d.ts.map +1 -1
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sites/contract.js +9 -9
- package/dist/sites/contract.mjs +2 -2
- package/dist/sites/normalize.d.ts +2 -1
- package/dist/sites/normalize.d.ts.map +1 -1
- package/dist/sync/index.js +16 -16
- package/dist/sync/index.mjs +4 -4
- package/package.json +11 -1
- package/dist/AnalyticsProvider-NW3UZYL5.mjs +0 -10
- package/dist/AnalyticsProvider-VSTTYP4W.js +0 -31
- package/dist/ChatWidget-BJOE2OSI.js +0 -20
- package/dist/ChatWidget-EWQ7LRD4.mjs +0 -11
- package/dist/EngageWidget-CZMNLFWI.js +0 -18
- package/dist/EngageWidget-F427CI6Y.mjs +0 -9
- package/dist/ManagedForm-A7BROQIN.mjs +0 -14
- package/dist/ManagedForm-Z3Z5Z6OL.js +0 -23
- package/dist/SitemapSync-62F6HVAW.js +0 -17
- package/dist/SitemapSync-EY33A6P4.mjs +0 -8
- package/dist/chunk-HTLWSCUQ.mjs.map +0 -1
- package/dist/chunk-NB4MK2Q5.js.map +0 -1
- package/dist/chunk-NI7OY4FW.mjs.map +0 -1
- package/dist/chunk-S5L73KZQ.js +0 -8
- package/dist/chunk-XCFCG46K.mjs +0 -6
- package/dist/chunk-ZAVNGZJZ.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @sonordev/site-kit/mcp — Main entry point
|
|
3
|
+
*
|
|
4
|
+
* WebMCP + Model Context Protocol for marketing sites: make a site something
|
|
5
|
+
* an AI agent can *use*, not just read.
|
|
6
|
+
*
|
|
7
|
+
* Three surfaces, one tool definition:
|
|
8
|
+
*
|
|
9
|
+
* 1. Remote MCP endpoint — `createMcpHandler`. Streamable HTTP, dual-era
|
|
10
|
+
* (2026-07-28 modern + the `initialize` handshake older clients speak).
|
|
11
|
+
* 2. Discovery — `createMcpServerCardHandler`, the SEP-2127 card served at
|
|
12
|
+
* `/.well-known/mcp-server-card` and `/.well-known/mcp.json`.
|
|
13
|
+
* 3. In-page WebMCP — `<WebMcpTools>` (imperative) and
|
|
14
|
+
* `declarativeToolForm` (declarative), for browser-driving agents.
|
|
15
|
+
*
|
|
16
|
+
* @see https://modelcontextprotocol.io/specification/2026-07-28
|
|
17
|
+
* @see https://github.com/webmachinelearning/webmcp
|
|
18
|
+
*/
|
|
19
|
+
export type { JsonSchemaNode, JsonSchemaObject, McpContent, McpTextContent, McpResourceLinkContent, McpToolResult, McpToolHandlerResult, McpToolAnnotations, McpToolContext, McpToolHandler, SiteKitMcpTool, McpServerInfo, McpServerIcon, } from './types';
|
|
20
|
+
export { defineMcpTool } from './types';
|
|
21
|
+
export { MCP_PROTOCOL_VERSION_MODERN, MCP_PROTOCOL_VERSIONS_LEGACY, MCP_SUPPORTED_PROTOCOL_VERSIONS, META_PROTOCOL_VERSION, META_CLIENT_INFO, META_SERVER_INFO, MCP_ERROR_HEADER_MISMATCH, MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION, JSONRPC_METHOD_NOT_FOUND, dispatch, toToolResult, toolErrorResult, toToolDescriptor, validateArgs, isSupportedVersion, } from './protocol';
|
|
22
|
+
export type { JsonRpcRequest, JsonRpcResponse, JsonRpcError, DispatchOutcome, DispatchOptions, McpServerDefinition, McpToolDescriptor, } from './protocol';
|
|
23
|
+
export { buildMcpServerCard, validateMcpServerCard, MCP_SERVER_CARD_SCHEMA, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_LEGACY_PATH, SITE_KIT_CARD_META_KEY, } from './serverCard';
|
|
24
|
+
export type { McpServerCard, McpRemote, BuildMcpServerCardOptions, } from './serverCard';
|
|
25
|
+
export { createMcpHandler, createMcpServerCardHandler, decodeHeaderValue, } from './handlers';
|
|
26
|
+
export type { McpHandlerOptions, McpRouteHandlers, McpServerCardHandlerOptions, McpServerCardRouteHandlers, } from './handlers';
|
|
27
|
+
export { declarativeToolForm, declarativeToolField } from './declarative';
|
|
28
|
+
export type { DeclarativeToolFormOptions, DeclarativeToolFormAttributes, DeclarativeToolFieldAttributes, } from './declarative';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAKvC,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,sCAAsC,EACtC,wBAAwB,EACxB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAKnB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,aAAa,EACb,SAAS,EACT,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAKrB,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,YAAY,CAAA;AAKnB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACzE,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('../chunk-SNAQBZPT.js');
|
|
4
|
+
|
|
5
|
+
// src/mcp/types.ts
|
|
6
|
+
function defineMcpTool(tool) {
|
|
7
|
+
return tool;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// src/mcp/protocol.ts
|
|
11
|
+
var MCP_PROTOCOL_VERSION_MODERN = "2026-07-28";
|
|
12
|
+
var MCP_PROTOCOL_VERSIONS_LEGACY = ["2025-11-25", "2025-06-18", "2025-03-26"];
|
|
13
|
+
var MCP_SUPPORTED_PROTOCOL_VERSIONS = [
|
|
14
|
+
MCP_PROTOCOL_VERSION_MODERN,
|
|
15
|
+
...MCP_PROTOCOL_VERSIONS_LEGACY
|
|
16
|
+
];
|
|
17
|
+
var META_PROTOCOL_VERSION = "io.modelcontextprotocol/protocolVersion";
|
|
18
|
+
var META_CLIENT_INFO = "io.modelcontextprotocol/clientInfo";
|
|
19
|
+
var META_SERVER_INFO = "io.modelcontextprotocol/serverInfo";
|
|
20
|
+
var JSONRPC_PARSE_ERROR = -32700;
|
|
21
|
+
var JSONRPC_INVALID_REQUEST = -32600;
|
|
22
|
+
var JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
23
|
+
var JSONRPC_INVALID_PARAMS = -32602;
|
|
24
|
+
var MCP_ERROR_HEADER_MISMATCH = -32020;
|
|
25
|
+
var MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION = -32022;
|
|
26
|
+
var MAX_JSON_TEXT = 6e4;
|
|
27
|
+
function isToolResult(value) {
|
|
28
|
+
return typeof value === "object" && value !== null && Array.isArray(value.content);
|
|
29
|
+
}
|
|
30
|
+
function toToolResult(value) {
|
|
31
|
+
if (isToolResult(value)) return value;
|
|
32
|
+
if (typeof value === "string") {
|
|
33
|
+
return { content: [{ type: "text", text: value }] };
|
|
34
|
+
}
|
|
35
|
+
if (value === void 0 || value === null) {
|
|
36
|
+
return { content: [{ type: "text", text: "(no result)" }] };
|
|
37
|
+
}
|
|
38
|
+
let text;
|
|
39
|
+
try {
|
|
40
|
+
text = JSON.stringify(value, null, 2);
|
|
41
|
+
} catch {
|
|
42
|
+
text = String(value);
|
|
43
|
+
}
|
|
44
|
+
if (text.length > MAX_JSON_TEXT) {
|
|
45
|
+
text = `${text.slice(0, MAX_JSON_TEXT)}
|
|
46
|
+
\u2026 (truncated)`;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: "text", text }],
|
|
50
|
+
structuredContent: value
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function toolErrorResult(message) {
|
|
54
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
55
|
+
}
|
|
56
|
+
function toToolDescriptor(tool) {
|
|
57
|
+
const descriptor = {
|
|
58
|
+
name: tool.name,
|
|
59
|
+
description: tool.description,
|
|
60
|
+
inputSchema: tool.inputSchema
|
|
61
|
+
};
|
|
62
|
+
if (tool.title) descriptor.title = tool.title;
|
|
63
|
+
if (tool.outputSchema) descriptor.outputSchema = tool.outputSchema;
|
|
64
|
+
if (tool.annotations) descriptor.annotations = tool.annotations;
|
|
65
|
+
return descriptor;
|
|
66
|
+
}
|
|
67
|
+
function validateArgs(tool, args) {
|
|
68
|
+
const required = tool.inputSchema.required ?? [];
|
|
69
|
+
const missing = required.filter((key) => {
|
|
70
|
+
const value = args[key];
|
|
71
|
+
return value === void 0 || value === null || value === "";
|
|
72
|
+
});
|
|
73
|
+
if (missing.length > 0) {
|
|
74
|
+
return `Missing required argument${missing.length > 1 ? "s" : ""}: ${missing.join(", ")}.`;
|
|
75
|
+
}
|
|
76
|
+
for (const [key, schema] of Object.entries(tool.inputSchema.properties ?? {})) {
|
|
77
|
+
const value = args[key];
|
|
78
|
+
if (value === void 0 || value === null) continue;
|
|
79
|
+
if (schema.enum && !schema.enum.includes(value)) {
|
|
80
|
+
return `Invalid value for "${key}": ${JSON.stringify(value)}. Expected one of: ${schema.enum.map((v) => JSON.stringify(v)).join(", ")}.`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
function capabilities() {
|
|
86
|
+
return { tools: { listChanged: false } };
|
|
87
|
+
}
|
|
88
|
+
function serverInfoBlock(info) {
|
|
89
|
+
return { name: info.name, version: info.version, ...info.title ? { title: info.title } : {} };
|
|
90
|
+
}
|
|
91
|
+
function isSupportedVersion(version) {
|
|
92
|
+
return MCP_SUPPORTED_PROTOCOL_VERSIONS.includes(version);
|
|
93
|
+
}
|
|
94
|
+
function unsupportedVersionError(id, requested) {
|
|
95
|
+
return {
|
|
96
|
+
status: 400,
|
|
97
|
+
response: {
|
|
98
|
+
jsonrpc: "2.0",
|
|
99
|
+
id,
|
|
100
|
+
error: {
|
|
101
|
+
code: MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION,
|
|
102
|
+
message: "Unsupported protocol version",
|
|
103
|
+
data: { supported: [...MCP_SUPPORTED_PROTOCOL_VERSIONS], requested }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function errorOutcome(id, code, message, status, data) {
|
|
109
|
+
return {
|
|
110
|
+
status,
|
|
111
|
+
response: { jsonrpc: "2.0", id, error: { code, message, ...data ? { data } : {} } }
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async function dispatch(message, options) {
|
|
115
|
+
const { server } = options;
|
|
116
|
+
const id = message.id ?? null;
|
|
117
|
+
const isNotification = message.id === void 0;
|
|
118
|
+
const params = message.params ?? {};
|
|
119
|
+
const meta = params._meta ?? {};
|
|
120
|
+
const bodyVersion = typeof meta[META_PROTOCOL_VERSION] === "string" ? meta[META_PROTOCOL_VERSION] : null;
|
|
121
|
+
const headerVersion = options.headerProtocolVersion || null;
|
|
122
|
+
if (bodyVersion && headerVersion && bodyVersion !== headerVersion) {
|
|
123
|
+
return errorOutcome(
|
|
124
|
+
id,
|
|
125
|
+
MCP_ERROR_HEADER_MISMATCH,
|
|
126
|
+
`Header mismatch: MCP-Protocol-Version header value '${headerVersion}' does not match body value '${bodyVersion}'`,
|
|
127
|
+
400
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
const requestedVersion = bodyVersion || headerVersion;
|
|
131
|
+
if (requestedVersion && !isSupportedVersion(requestedVersion)) {
|
|
132
|
+
return unsupportedVersionError(id, requestedVersion);
|
|
133
|
+
}
|
|
134
|
+
if (options.headerMethod && options.headerMethod !== message.method) {
|
|
135
|
+
return errorOutcome(
|
|
136
|
+
id,
|
|
137
|
+
MCP_ERROR_HEADER_MISMATCH,
|
|
138
|
+
`Header mismatch: Mcp-Method header value '${options.headerMethod}' does not match body value '${message.method}'`,
|
|
139
|
+
400
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (options.headerName) {
|
|
143
|
+
const bodyName = typeof params.name === "string" ? params.name : typeof params.uri === "string" ? params.uri : null;
|
|
144
|
+
if (bodyName && options.headerName !== bodyName) {
|
|
145
|
+
return errorOutcome(
|
|
146
|
+
id,
|
|
147
|
+
MCP_ERROR_HEADER_MISMATCH,
|
|
148
|
+
`Header mismatch: Mcp-Name header value '${options.headerName}' does not match body value '${bodyName}'`,
|
|
149
|
+
400
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (options.strictHeaders && bodyVersion) {
|
|
154
|
+
if (!headerVersion) {
|
|
155
|
+
return errorOutcome(
|
|
156
|
+
id,
|
|
157
|
+
MCP_ERROR_HEADER_MISMATCH,
|
|
158
|
+
"Header mismatch: required MCP-Protocol-Version header is missing",
|
|
159
|
+
400
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
if (!options.headerMethod) {
|
|
163
|
+
return errorOutcome(
|
|
164
|
+
id,
|
|
165
|
+
MCP_ERROR_HEADER_MISMATCH,
|
|
166
|
+
"Header mismatch: required Mcp-Method header is missing",
|
|
167
|
+
400
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const negotiated = requestedVersion || MCP_PROTOCOL_VERSION_MODERN;
|
|
172
|
+
switch (message.method) {
|
|
173
|
+
// ── Modern discovery (MUST implement) ──────────────────────────────────
|
|
174
|
+
case "server/discover": {
|
|
175
|
+
return {
|
|
176
|
+
status: 200,
|
|
177
|
+
response: {
|
|
178
|
+
jsonrpc: "2.0",
|
|
179
|
+
id,
|
|
180
|
+
result: {
|
|
181
|
+
resultType: "complete",
|
|
182
|
+
supportedVersions: [...MCP_SUPPORTED_PROTOCOL_VERSIONS],
|
|
183
|
+
capabilities: capabilities(),
|
|
184
|
+
...server.info.instructions ? { instructions: server.info.instructions } : {},
|
|
185
|
+
ttlMs: server.discoverTtlMs ?? 36e5,
|
|
186
|
+
cacheScope: "public",
|
|
187
|
+
_meta: { [META_SERVER_INFO]: serverInfoBlock(server.info) }
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
// ── Legacy handshake ───────────────────────────────────────────────────
|
|
193
|
+
case "initialize": {
|
|
194
|
+
const asked = typeof params.protocolVersion === "string" ? params.protocolVersion : "";
|
|
195
|
+
const agreed = isSupportedVersion(asked) ? asked : MCP_PROTOCOL_VERSIONS_LEGACY[0];
|
|
196
|
+
return {
|
|
197
|
+
status: 200,
|
|
198
|
+
response: {
|
|
199
|
+
jsonrpc: "2.0",
|
|
200
|
+
id,
|
|
201
|
+
result: {
|
|
202
|
+
protocolVersion: agreed,
|
|
203
|
+
capabilities: capabilities(),
|
|
204
|
+
serverInfo: serverInfoBlock(server.info),
|
|
205
|
+
...server.info.instructions ? { instructions: server.info.instructions } : {}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
case "notifications/initialized":
|
|
211
|
+
case "initialized":
|
|
212
|
+
return { status: 202, response: null };
|
|
213
|
+
case "ping":
|
|
214
|
+
return { status: 200, response: { jsonrpc: "2.0", id, result: {} } };
|
|
215
|
+
// ── Tools ──────────────────────────────────────────────────────────────
|
|
216
|
+
case "tools/list": {
|
|
217
|
+
const tools = server.tools.filter((t) => t.exposeToHttp !== false).map((t) => toToolDescriptor(t));
|
|
218
|
+
return { status: 200, response: { jsonrpc: "2.0", id, result: { tools } } };
|
|
219
|
+
}
|
|
220
|
+
case "tools/call": {
|
|
221
|
+
const name = typeof params.name === "string" ? params.name : "";
|
|
222
|
+
const tool = server.tools.find((t) => t.name === name && t.exposeToHttp !== false);
|
|
223
|
+
if (!tool) {
|
|
224
|
+
return errorOutcome(
|
|
225
|
+
id,
|
|
226
|
+
JSONRPC_INVALID_PARAMS,
|
|
227
|
+
`Unknown tool: ${name || "(none)"}`,
|
|
228
|
+
400,
|
|
229
|
+
{
|
|
230
|
+
available: server.tools.filter((t) => t.exposeToHttp !== false).map((t) => t.name)
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
const args = params.arguments ?? {};
|
|
235
|
+
const invalid = validateArgs(tool, args);
|
|
236
|
+
if (invalid) {
|
|
237
|
+
return {
|
|
238
|
+
status: 200,
|
|
239
|
+
response: { jsonrpc: "2.0", id, result: toolErrorResult(invalid) }
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
const raw = await tool.handler(args, {
|
|
244
|
+
...options.context,
|
|
245
|
+
surface: "http",
|
|
246
|
+
protocolVersion: negotiated
|
|
247
|
+
});
|
|
248
|
+
return { status: 200, response: { jsonrpc: "2.0", id, result: toToolResult(raw) } };
|
|
249
|
+
} catch (error) {
|
|
250
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
251
|
+
return {
|
|
252
|
+
status: 200,
|
|
253
|
+
response: {
|
|
254
|
+
jsonrpc: "2.0",
|
|
255
|
+
id,
|
|
256
|
+
result: toolErrorResult(`Tool "${tool.name}" failed: ${detail}`)
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Declared unsupported rather than left to fall through, so the error names
|
|
262
|
+
// the reason instead of looking like a typo'd method.
|
|
263
|
+
case "resources/list":
|
|
264
|
+
return { status: 200, response: { jsonrpc: "2.0", id, result: { resources: [] } } };
|
|
265
|
+
case "prompts/list":
|
|
266
|
+
return { status: 200, response: { jsonrpc: "2.0", id, result: { prompts: [] } } };
|
|
267
|
+
default: {
|
|
268
|
+
if (isNotification) return { status: 202, response: null };
|
|
269
|
+
return errorOutcome(id, JSONRPC_METHOD_NOT_FOUND, `Method not found: ${message.method}`, 404);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// src/mcp/serverCard.ts
|
|
275
|
+
var MCP_SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
|
|
276
|
+
var MCP_SERVER_CARD_PATH = "/.well-known/mcp-server-card";
|
|
277
|
+
var MCP_SERVER_CARD_LEGACY_PATH = "/.well-known/mcp.json";
|
|
278
|
+
var SITE_KIT_CARD_META_KEY = "io.sonor.site-kit/tools";
|
|
279
|
+
function buildMcpServerCard(options) {
|
|
280
|
+
const base = options.baseUrl.replace(/\/$/, "");
|
|
281
|
+
const path = options.mcpPath ?? "/api/mcp";
|
|
282
|
+
const mcpUrl = `${base}${path.startsWith("/") ? path : `/${path}`}`;
|
|
283
|
+
const card = {
|
|
284
|
+
$schema: MCP_SERVER_CARD_SCHEMA,
|
|
285
|
+
name: options.info.name,
|
|
286
|
+
version: options.info.version,
|
|
287
|
+
description: options.info.description,
|
|
288
|
+
remotes: [
|
|
289
|
+
{
|
|
290
|
+
type: "streamable-http",
|
|
291
|
+
url: mcpUrl,
|
|
292
|
+
supportedProtocolVersions: [...MCP_SUPPORTED_PROTOCOL_VERSIONS]
|
|
293
|
+
},
|
|
294
|
+
...options.additionalRemotes ?? []
|
|
295
|
+
]
|
|
296
|
+
};
|
|
297
|
+
if (options.info.title) card.title = options.info.title;
|
|
298
|
+
if (options.info.websiteUrl || base) card.websiteUrl = options.info.websiteUrl || base;
|
|
299
|
+
if (options.icons?.length) card.icons = options.icons;
|
|
300
|
+
const meta = {};
|
|
301
|
+
if (options.info.instructions) {
|
|
302
|
+
meta["io.sonor.site-kit/instructions"] = options.info.instructions;
|
|
303
|
+
}
|
|
304
|
+
if (options.tools?.length) {
|
|
305
|
+
meta[SITE_KIT_CARD_META_KEY] = options.tools.filter((t) => t.exposeToHttp !== false).map((t) => ({
|
|
306
|
+
name: t.name,
|
|
307
|
+
...t.title ? { title: t.title } : {},
|
|
308
|
+
description: t.description,
|
|
309
|
+
readOnly: t.annotations?.readOnlyHint ?? false
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
if (Object.keys(meta).length > 0) card._meta = meta;
|
|
313
|
+
return card;
|
|
314
|
+
}
|
|
315
|
+
function validateMcpServerCard(card) {
|
|
316
|
+
const problems = [];
|
|
317
|
+
if (card.$schema !== MCP_SERVER_CARD_SCHEMA) {
|
|
318
|
+
problems.push(`$schema should be "${MCP_SERVER_CARD_SCHEMA}"`);
|
|
319
|
+
}
|
|
320
|
+
if (!/^[^/\s]+\/[^/\s]+$/.test(card.name)) {
|
|
321
|
+
problems.push(
|
|
322
|
+
`name "${card.name}" must be reverse-DNS with exactly one forward slash, e.g. "io.example/server"`
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
if (!/^\d+\.\d+\.\d+(?:[-+].+)?$/.test(card.version)) {
|
|
326
|
+
problems.push(`version "${card.version}" should be a concrete semver (no ranges)`);
|
|
327
|
+
}
|
|
328
|
+
if (!card.description?.trim()) problems.push("description is required");
|
|
329
|
+
for (const remote of card.remotes ?? []) {
|
|
330
|
+
if (!/^https:\/\//.test(remote.url) && !/^http:\/\/localhost/.test(remote.url)) {
|
|
331
|
+
problems.push(`remote url "${remote.url}" must be https (http allowed only on localhost)`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return problems;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// src/mcp/handlers.ts
|
|
338
|
+
var MCP_REQUEST_HEADERS = [
|
|
339
|
+
"Content-Type",
|
|
340
|
+
"Accept",
|
|
341
|
+
"Authorization",
|
|
342
|
+
"MCP-Protocol-Version",
|
|
343
|
+
"Mcp-Method",
|
|
344
|
+
"Mcp-Name",
|
|
345
|
+
"Mcp-Session-Id",
|
|
346
|
+
"Last-Event-ID"
|
|
347
|
+
];
|
|
348
|
+
function corsHeaders(origin) {
|
|
349
|
+
return {
|
|
350
|
+
"Access-Control-Allow-Origin": origin,
|
|
351
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
352
|
+
"Access-Control-Allow-Headers": MCP_REQUEST_HEADERS.join(", "),
|
|
353
|
+
"Access-Control-Expose-Headers": "MCP-Protocol-Version",
|
|
354
|
+
"Access-Control-Max-Age": "86400"
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function decodeHeaderValue(value) {
|
|
358
|
+
if (!value) return value;
|
|
359
|
+
const match = /^=\?base64\?(.*)\?=$/.exec(value);
|
|
360
|
+
if (!match) return value;
|
|
361
|
+
try {
|
|
362
|
+
if (typeof atob === "function") {
|
|
363
|
+
const binary = atob(match[1]);
|
|
364
|
+
const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
365
|
+
return new TextDecoder().decode(bytes);
|
|
366
|
+
}
|
|
367
|
+
return Buffer.from(match[1], "base64").toString("utf8");
|
|
368
|
+
} catch {
|
|
369
|
+
return value;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function resolveOrigin(request, allowed) {
|
|
373
|
+
const origin = request.headers.get("origin");
|
|
374
|
+
if (!allowed || allowed === "*") return "*";
|
|
375
|
+
if (!origin) return allowed[0] ?? "*";
|
|
376
|
+
return allowed.includes(origin) ? origin : null;
|
|
377
|
+
}
|
|
378
|
+
function json(body, status, headers) {
|
|
379
|
+
return new Response(JSON.stringify(body), {
|
|
380
|
+
status,
|
|
381
|
+
headers: {
|
|
382
|
+
"Content-Type": "application/json",
|
|
383
|
+
"Cache-Control": "no-store",
|
|
384
|
+
...headers
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
function createMcpHandler(options) {
|
|
389
|
+
const { server } = options;
|
|
390
|
+
async function POST(request) {
|
|
391
|
+
const origin = resolveOrigin(request, options.allowedOrigins);
|
|
392
|
+
if (origin === null) {
|
|
393
|
+
return json(
|
|
394
|
+
{ jsonrpc: "2.0", error: { code: JSONRPC_INVALID_REQUEST, message: "Origin not allowed" } },
|
|
395
|
+
403,
|
|
396
|
+
{}
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
const cors = corsHeaders(origin);
|
|
400
|
+
let payload;
|
|
401
|
+
try {
|
|
402
|
+
payload = await request.json();
|
|
403
|
+
} catch {
|
|
404
|
+
return json(
|
|
405
|
+
{ jsonrpc: "2.0", id: null, error: { code: JSONRPC_PARSE_ERROR, message: "Parse error" } },
|
|
406
|
+
400,
|
|
407
|
+
cors
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
const headerProtocolVersion = request.headers.get("mcp-protocol-version");
|
|
411
|
+
const headerMethod = decodeHeaderValue(request.headers.get("mcp-method"));
|
|
412
|
+
const headerName = decodeHeaderValue(request.headers.get("mcp-name"));
|
|
413
|
+
const dispatchOptions = {
|
|
414
|
+
server,
|
|
415
|
+
context: {
|
|
416
|
+
baseUrl: options.baseUrl,
|
|
417
|
+
request,
|
|
418
|
+
signal: request.signal
|
|
419
|
+
},
|
|
420
|
+
headerProtocolVersion,
|
|
421
|
+
headerMethod,
|
|
422
|
+
headerName,
|
|
423
|
+
strictHeaders: options.strictHeaders
|
|
424
|
+
};
|
|
425
|
+
if (Array.isArray(payload)) {
|
|
426
|
+
const outcomes = await Promise.all(
|
|
427
|
+
payload.map((m) => dispatch(m, dispatchOptions))
|
|
428
|
+
);
|
|
429
|
+
const responses = outcomes.map((o) => o.response).filter(Boolean);
|
|
430
|
+
if (responses.length === 0) return new Response(null, { status: 202, headers: cors });
|
|
431
|
+
return json(responses, 200, {
|
|
432
|
+
...cors,
|
|
433
|
+
"MCP-Protocol-Version": headerProtocolVersion || MCP_PROTOCOL_VERSION_MODERN
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
const message = payload;
|
|
437
|
+
if (!message || typeof message !== "object" || typeof message.method !== "string") {
|
|
438
|
+
const bad = errorOutcome(null, JSONRPC_INVALID_REQUEST, "Invalid Request", 400);
|
|
439
|
+
return json(bad.response, bad.status, cors);
|
|
440
|
+
}
|
|
441
|
+
const outcome = await dispatch(message, dispatchOptions);
|
|
442
|
+
if (outcome.response === null) {
|
|
443
|
+
return new Response(null, { status: 202, headers: cors });
|
|
444
|
+
}
|
|
445
|
+
return json(outcome.response, outcome.status, {
|
|
446
|
+
...cors,
|
|
447
|
+
"MCP-Protocol-Version": headerProtocolVersion || MCP_PROTOCOL_VERSION_MODERN
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
async function methodNotAllowed(request) {
|
|
451
|
+
const origin = resolveOrigin(request, options.allowedOrigins) ?? "*";
|
|
452
|
+
return new Response(
|
|
453
|
+
JSON.stringify({
|
|
454
|
+
jsonrpc: "2.0",
|
|
455
|
+
error: {
|
|
456
|
+
code: JSONRPC_INVALID_REQUEST,
|
|
457
|
+
message: "This MCP endpoint is stateless and accepts POST only. The GET stream and session teardown were removed in protocol revision 2026-07-28."
|
|
458
|
+
}
|
|
459
|
+
}),
|
|
460
|
+
{
|
|
461
|
+
status: 405,
|
|
462
|
+
headers: {
|
|
463
|
+
"Content-Type": "application/json",
|
|
464
|
+
Allow: "POST, OPTIONS",
|
|
465
|
+
...corsHeaders(origin)
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
async function OPTIONS(request) {
|
|
471
|
+
const origin = resolveOrigin(request, options.allowedOrigins);
|
|
472
|
+
if (origin === null) return new Response(null, { status: 403 });
|
|
473
|
+
return new Response(null, { status: 204, headers: corsHeaders(origin) });
|
|
474
|
+
}
|
|
475
|
+
return { POST, GET: methodNotAllowed, DELETE: methodNotAllowed, OPTIONS };
|
|
476
|
+
}
|
|
477
|
+
function createMcpServerCardHandler(options) {
|
|
478
|
+
const card = buildMcpServerCard(options);
|
|
479
|
+
const body = `${JSON.stringify(card, null, 2)}
|
|
480
|
+
`;
|
|
481
|
+
const maxAge = options.maxAge ?? 3600;
|
|
482
|
+
const headers = {
|
|
483
|
+
"Content-Type": "application/json",
|
|
484
|
+
"Cache-Control": `public, max-age=${maxAge}`,
|
|
485
|
+
// The card is a discovery document — it is meant to be fetched by anyone.
|
|
486
|
+
"Access-Control-Allow-Origin": "*",
|
|
487
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
|
488
|
+
"Access-Control-Allow-Headers": "Content-Type"
|
|
489
|
+
};
|
|
490
|
+
return {
|
|
491
|
+
GET: async () => new Response(body, { status: 200, headers }),
|
|
492
|
+
OPTIONS: async () => new Response(null, { status: 204, headers })
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// src/mcp/declarative.ts
|
|
497
|
+
function declarativeToolForm(options) {
|
|
498
|
+
const attributes = {
|
|
499
|
+
toolname: options.name,
|
|
500
|
+
tooldescription: options.description
|
|
501
|
+
};
|
|
502
|
+
if (options.autoSubmit) attributes.toolautosubmit = "";
|
|
503
|
+
return attributes;
|
|
504
|
+
}
|
|
505
|
+
function declarativeToolField(description) {
|
|
506
|
+
return { toolparamdescription: description };
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
exports.JSONRPC_METHOD_NOT_FOUND = JSONRPC_METHOD_NOT_FOUND;
|
|
510
|
+
exports.MCP_ERROR_HEADER_MISMATCH = MCP_ERROR_HEADER_MISMATCH;
|
|
511
|
+
exports.MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION = MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION;
|
|
512
|
+
exports.MCP_PROTOCOL_VERSIONS_LEGACY = MCP_PROTOCOL_VERSIONS_LEGACY;
|
|
513
|
+
exports.MCP_PROTOCOL_VERSION_MODERN = MCP_PROTOCOL_VERSION_MODERN;
|
|
514
|
+
exports.MCP_SERVER_CARD_LEGACY_PATH = MCP_SERVER_CARD_LEGACY_PATH;
|
|
515
|
+
exports.MCP_SERVER_CARD_PATH = MCP_SERVER_CARD_PATH;
|
|
516
|
+
exports.MCP_SERVER_CARD_SCHEMA = MCP_SERVER_CARD_SCHEMA;
|
|
517
|
+
exports.MCP_SUPPORTED_PROTOCOL_VERSIONS = MCP_SUPPORTED_PROTOCOL_VERSIONS;
|
|
518
|
+
exports.META_CLIENT_INFO = META_CLIENT_INFO;
|
|
519
|
+
exports.META_PROTOCOL_VERSION = META_PROTOCOL_VERSION;
|
|
520
|
+
exports.META_SERVER_INFO = META_SERVER_INFO;
|
|
521
|
+
exports.SITE_KIT_CARD_META_KEY = SITE_KIT_CARD_META_KEY;
|
|
522
|
+
exports.buildMcpServerCard = buildMcpServerCard;
|
|
523
|
+
exports.createMcpHandler = createMcpHandler;
|
|
524
|
+
exports.createMcpServerCardHandler = createMcpServerCardHandler;
|
|
525
|
+
exports.declarativeToolField = declarativeToolField;
|
|
526
|
+
exports.declarativeToolForm = declarativeToolForm;
|
|
527
|
+
exports.decodeHeaderValue = decodeHeaderValue;
|
|
528
|
+
exports.defineMcpTool = defineMcpTool;
|
|
529
|
+
exports.dispatch = dispatch;
|
|
530
|
+
exports.isSupportedVersion = isSupportedVersion;
|
|
531
|
+
exports.toToolDescriptor = toToolDescriptor;
|
|
532
|
+
exports.toToolResult = toToolResult;
|
|
533
|
+
exports.toolErrorResult = toolErrorResult;
|
|
534
|
+
exports.validateArgs = validateArgs;
|
|
535
|
+
exports.validateMcpServerCard = validateMcpServerCard;
|
|
536
|
+
//# sourceMappingURL=index.js.map
|
|
537
|
+
//# sourceMappingURL=index.js.map
|