UNPKG

xmcp

Version:

The TypeScript MCP framework

1 lines • 4.87 kB
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var s=t();for(var o in s)("object"==typeof exports?exports:e)[o]=s[o]}}(this,()=>(()=>{"use strict";var e={};e.d=(t,s)=>{for(var o in s)e.o(s,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:s[o]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var t={};e.r(t),e.d(t,{SIZE_CHANGED_METHOD:()=>p,HOST_CONTEXT_CHANGED_METHOD:()=>c,UI_MESSAGE_METHOD:()=>l,RESOURCES_READ_METHOD:()=>u,UPDATE_MODEL_CONTEXT_METHOD:()=>a,MCP_APPS_PROTOCOL_VERSION:()=>s,createMcpHostBridge:()=>h,INITIALIZE_METHOD:()=>o,LOG_MESSAGE_METHOD:()=>d,INITIALIZED_METHOD:()=>i,OPEN_LINK_METHOD:()=>r,REQUEST_DISPLAY_MODE_METHOD:()=>n});let s="2026-01-26",o="ui/initialize",i="ui/notifications/initialized",n="ui/request-display-mode",r="ui/open-link",a="ui/update-model-context",l="ui/message",d="notifications/message",u="resources/read",c="ui/notifications/host-context-changed",p="ui/notifications/size-changed";function C(e){return!!e&&"object"==typeof e}function f(e,t){return e instanceof Error&&e.message?e.message:t}function h(e={}){let t=e.targetWindow??("undefined"==typeof window?null:window),s=e.requestTimeoutMs??15e3,o=e.connectionTimeoutMs??2e3,i=100,m=!1,E=!1,b={isConnected:!!t&&t.parent!==t,hostContext:null,hostCapabilities:null},y=new Set,M=new Map,g=e=>{if(e.isConnected!==b.isConnected||e.hostContext!==b.hostContext||e.hostCapabilities!==b.hostCapabilities)for(let t of(b=e,y))t(b)},T=e=>{var t,s;let o;g({isConnected:!0,hostContext:e.hostContext?(t=b.hostContext,s=e.hostContext,o={...t??{},...s},(t?.safeAreaInsets||s.safeAreaInsets)&&(o.safeAreaInsets={...t?.safeAreaInsets??{},...s.safeAreaInsets??{}}),(t?.containerDimensions||s.containerDimensions)&&(o.containerDimensions={...t?.containerDimensions??{},...s.containerDimensions??{}}),(t?.styles||s.styles)&&(o.styles={...t?.styles??{},...s.styles??{},variables:t?.styles?.variables||s.styles?.variables?{...t?.styles?.variables??{},...s.styles?.variables??{}}:void 0,css:t?.styles?.css||s.styles?.css?{...t?.styles?.css??{},...s.styles?.css??{}}:void 0}),o):b.hostContext,hostCapabilities:e.hostCapabilities?{...b.hostCapabilities??{},...e.hostCapabilities}:b.hostCapabilities})},O=e=>{if(!t||e.source!==t.parent||!C(e.data))return;E=!0,b.isConnected||g({...b,isConnected:!0});let s=e.data;if("id"in s&&null!=s.id&&"number"==typeof s.id){let e=M.get(s.id);e&&(clearTimeout(e.timeoutId),M.delete(s.id),C(s.error)?e.reject(Error("string"==typeof s.error.message?s.error.message:"MCP request failed")):e.resolve(s.result))}1===s.id&&C(s.result)&&T({hostContext:C(s.result.hostContext)?s.result.hostContext:void 0,hostCapabilities:C(s.result.hostCapabilities)?s.result.hostCapabilities:void 0}),s.method===c&&C(s.params)&&T({hostContext:s.params}),"ui/hostContextChanged"===s.method&&C(s.params)&&C(s.params.hostContext)&&T({hostContext:s.params.hostContext})};t&&(t.addEventListener("message",O),t.parent!==t&&setTimeout(()=>{m||E||b.hostContext||g({...b,isConnected:!1})},o));let _=()=>{if(m)throw Error("MCP host bridge has been disposed");if(!t)throw Error("MCP host bridge requires a browser window");return t},w=(e,t)=>{_().parent.postMessage({jsonrpc:"2.0",method:e,params:t},"*")},x=(e,t={})=>{let o=_();return new Promise((n,r)=>{let a=i++,l=setTimeout(()=>{M.has(a)&&(M.delete(a),r(Error(`MCP request timed out: ${e}`)))},s);M.set(a,{resolve:n,reject:r,timeoutId:l}),o.parent.postMessage({jsonrpc:"2.0",id:a,method:e,params:t},"*")})},D=async(e,t)=>{let s;for(let o of e)try{return await x(o,t)}catch(t){s=t;let e=f(t,"MCP request failed");if(!/method not found|unknown method/i.test(e))throw t}throw s instanceof Error?s:Error("MCP request failed")},v=async e=>{if(t?.open)return void t.open(e,"_blank","noopener,noreferrer");throw Error("Unable to open link without a browser window")};return{callTool:(e,t)=>x("tools/call",{name:e,arguments:t??{}}),requestDisplayMode:e=>D([n,"ui/requestDisplayMode"],{mode:e}),async openLink(e){try{await D([r,"ui/openLink"],{url:e})}catch(s){if(!b.isConnected||!t)return void await v(e);throw Error(f(s,"Failed to open link"))}},readResource:e=>x(u,{uri:e}),sendMessage:e=>x(l,e),updateModelContext:e=>x(a,e),async logMessage(e){w(d,e)},async notifySizeChanged(e){w(p,e)},getState:()=>b,getHostContext:()=>b.hostContext,getHostCapabilities:()=>b.hostCapabilities,isConnected:()=>b.isConnected,subscribe:e=>(y.add(e),()=>{y.delete(e)}),dispose(){if(!m){for(let[e,s]of(m=!0,t&&t.removeEventListener("message",O),M.entries()))clearTimeout(s.timeoutId),s.reject(Error("MCP host bridge has been disposed")),M.delete(e);y.clear()}}}}return t})());