@f2c/mcp 0.0.8 → 0.0.9
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/dist/cli.js +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
@@ -6,5 +6,5 @@
|
|
6
6
|
]`;continue}s+=r[l],r[l]==="\\"?c=!0:a&&r[l]==="]"?a=!1:!a&&r[l]==="["&&(a=!0)}try{new RegExp(s)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return s}function ae(n,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((r,s)=>({...r,[s]:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"properties",s]})??{}}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodString&&n.keyType._def.checks?.length){let{type:r,...s}=se(n.keyType._def,e);return{...t,propertyNames:s}}else{if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodEnum)return{...t,propertyNames:{enum:n.keyType._def.values}};if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodBranded&&n.keyType._def.type._def.typeName===A.ZodFirstPartyTypeKind.ZodString&&n.keyType._def.type._def.checks?.length){let{type:r,...s}=oe(n.keyType._def,e);return{...t,propertyNames:s}}}return t}function ht(n,e){if(e.mapStrategy==="record")return ae(n,e);let t=u(n.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||{},r=u(n.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[t,r],minItems:2,maxItems:2}}}function ft(n){let e=n.values,r=Object.keys(n.values).filter(c=>typeof e[e[c]]!="number").map(c=>e[c]),s=Array.from(new Set(r.map(c=>typeof c)));return{type:s.length===1?s[0]==="string"?"string":"number":["string","number"],enum:r}}function gt(){return{not:{}}}function bt(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var N={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function _t(n,e){if(e.target==="openApi3")return yt(n,e);let t=n.options instanceof Map?Array.from(n.options.values()):n.options;if(t.every(r=>r._def.typeName in N&&(!r._def.checks||!r._def.checks.length))){let r=t.reduce((s,c)=>{let a=N[c._def.typeName];return a&&!s.includes(a)?[...s,a]:s},[]);return{type:r.length>1?r:r[0]}}else if(t.every(r=>r._def.typeName==="ZodLiteral"&&!r.description)){let r=t.reduce((s,c)=>{let a=typeof c._def.value;switch(a){case"string":case"number":case"boolean":return[...s,a];case"bigint":return[...s,"integer"];case"object":if(c._def.value===null)return[...s,"null"];case"symbol":case"undefined":case"function":default:return s}},[]);if(r.length===t.length){let s=r.filter((c,a,i)=>i.indexOf(c)===a);return{type:s.length>1?s:s[0],enum:t.reduce((c,a)=>c.includes(a._def.value)?c:[...c,a._def.value],[])}}}else if(t.every(r=>r._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((r,s)=>[...r,...s._def.values.filter(c=>!r.includes(c))],[])};return yt(n,e)}var yt=(n,e)=>{let t=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((r,s)=>u(r._def,{...e,currentPath:[...e.currentPath,"anyOf",`${s}`]})).filter(r=>!!r&&(!e.strictUnions||typeof r=="object"&&Object.keys(r).length>0));return t.length?{anyOf:t}:void 0};function xt(n,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length))return e.target==="openApi3"?{type:N[n.innerType._def.typeName],nullable:!0}:{type:[N[n.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let r=u(n.innerType._def,{...e,currentPath:[...e.currentPath]});return r&&"$ref"in r?{allOf:[r],nullable:!0}:r&&{...r,nullable:!0}}let t=u(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function vt(n,e){let t={type:"number"};if(!n.checks)return t;for(let r of n.checks)switch(r.kind){case"int":t.type="integer",xe(t,"type",r.message,e);break;case"min":e.target==="jsonSchema7"?r.inclusive?d(t,"minimum",r.value,r.message,e):d(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),d(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?d(t,"maximum",r.value,r.message,e):d(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),d(t,"maximum",r.value,r.message,e));break;case"multipleOf":d(t,"multipleOf",r.value,r.message,e);break}return t}var St=require("zod");function Rt(n,e){let t=e.target==="openAi",r={type:"object",properties:{}},s=[],c=n.shape();for(let i in c){let l=c[i];if(l===void 0||l._def===void 0)continue;let h=Mr(l);h&&t&&(l instanceof St.ZodOptional&&(l=l._def.innerType),l.isNullable()||(l=l.nullable()),h=!1);let f=u(l._def,{...e,currentPath:[...e.currentPath,"properties",i],propertyPath:[...e.currentPath,"properties",i]});f!==void 0&&(r.properties[i]=f,h||s.push(i))}s.length&&(r.required=s);let a=Ir(n,e);return a!==void 0&&(r.additionalProperties=a),r}function Ir(n,e){if(n.catchall._def.typeName!=="ZodNever")return u(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function Mr(n){try{return n.isOptional()}catch{return!0}}var Pt=(n,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return u(n.innerType._def,e);let t=u(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:{}},t]}:{}};var wt=(n,e)=>{if(e.pipeStrategy==="input")return u(n.in._def,e);if(e.pipeStrategy==="output")return u(n.out._def,e);let t=u(n.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),r=u(n.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,r].filter(s=>s!==void 0)}};function Tt(n,e){return u(n.type._def,e)}function Ct(n,e){let r={type:"array",uniqueItems:!0,items:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return n.minSize&&d(r,"minItems",n.minSize.value,n.minSize.message,e),n.maxSize&&d(r,"maxItems",n.maxSize.value,n.maxSize.message,e),r}function Et(n,e){return n.rest?{type:"array",minItems:n.items.length,items:n.items.map((t,r)=>u(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[]),additionalItems:u(n.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((t,r)=>u(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[])}}function kt(){return{not:{}}}function At(){return{}}var jt=(n,e)=>u(n.innerType._def,e);var It=(n,e,t)=>{switch(e){case m.ZodFirstPartyTypeKind.ZodString:return se(n,t);case m.ZodFirstPartyTypeKind.ZodNumber:return vt(n,t);case m.ZodFirstPartyTypeKind.ZodObject:return Rt(n,t);case m.ZodFirstPartyTypeKind.ZodBigInt:return st(n,t);case m.ZodFirstPartyTypeKind.ZodBoolean:return at();case m.ZodFirstPartyTypeKind.ZodDate:return ve(n,t);case m.ZodFirstPartyTypeKind.ZodUndefined:return kt();case m.ZodFirstPartyTypeKind.ZodNull:return bt(t);case m.ZodFirstPartyTypeKind.ZodArray:return ot(n,t);case m.ZodFirstPartyTypeKind.ZodUnion:case m.ZodFirstPartyTypeKind.ZodDiscriminatedUnion:return _t(n,t);case m.ZodFirstPartyTypeKind.ZodIntersection:return ut(n,t);case m.ZodFirstPartyTypeKind.ZodTuple:return Et(n,t);case m.ZodFirstPartyTypeKind.ZodRecord:return ae(n,t);case m.ZodFirstPartyTypeKind.ZodLiteral:return mt(n,t);case m.ZodFirstPartyTypeKind.ZodEnum:return pt(n);case m.ZodFirstPartyTypeKind.ZodNativeEnum:return ft(n);case m.ZodFirstPartyTypeKind.ZodNullable:return xt(n,t);case m.ZodFirstPartyTypeKind.ZodOptional:return Pt(n,t);case m.ZodFirstPartyTypeKind.ZodMap:return ht(n,t);case m.ZodFirstPartyTypeKind.ZodSet:return Ct(n,t);case m.ZodFirstPartyTypeKind.ZodLazy:return()=>n.getter()._def;case m.ZodFirstPartyTypeKind.ZodPromise:return Tt(n,t);case m.ZodFirstPartyTypeKind.ZodNaN:case m.ZodFirstPartyTypeKind.ZodNever:return gt();case m.ZodFirstPartyTypeKind.ZodEffects:return lt(n,t);case m.ZodFirstPartyTypeKind.ZodAny:return rt();case m.ZodFirstPartyTypeKind.ZodUnknown:return At();case m.ZodFirstPartyTypeKind.ZodDefault:return ct(n,t);case m.ZodFirstPartyTypeKind.ZodBranded:return oe(n,t);case m.ZodFirstPartyTypeKind.ZodReadonly:return jt(n,t);case m.ZodFirstPartyTypeKind.ZodCatch:return it(n,t);case m.ZodFirstPartyTypeKind.ZodPipeline:return wt(n,t);case m.ZodFirstPartyTypeKind.ZodFunction:case m.ZodFirstPartyTypeKind.ZodVoid:case m.ZodFirstPartyTypeKind.ZodSymbol:return;default:return(r=>{})(e)}};function u(n,e,t=!1){let r=e.seen.get(n);if(e.override){let i=e.override?.(n,e,r,t);if(i!==Qe)return i}if(r&&!t){let i=Nr(r,e);if(i!==void 0)return i}let s={def:n,path:e.currentPath,jsonSchema:void 0};e.seen.set(n,s);let c=It(n,n.typeName,e),a=typeof c=="function"?u(c(),e):c;if(a&&Lr(n,e,a),e.postProcess){let i=e.postProcess(a,n,e);return s.jsonSchema=a,i}return s.jsonSchema=a,a}var Nr=(n,e)=>{switch(e.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:Or(e.currentPath,n.path)};case"none":case"seen":return n.path.length<e.currentPath.length&&n.path.every((t,r)=>e.currentPath[r]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),{}):e.$refStrategy==="seen"?{}:void 0}},Or=(n,e)=>{let t=0;for(;t<n.length&&t<e.length&&n[t]===e[t];t++);return[(n.length-t).toString(),...e.slice(t)].join("/")},Lr=(n,e,t)=>(n.description&&(t.description=n.description,e.markdownDescription&&(t.markdownDescription=n.description)),t);var Pe=(n,e)=>{let t=tt(e),r=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[h,f])=>({...l,[h]:u(f._def,{...t,currentPath:[...t.basePath,t.definitionPath,h]},!0)??{}}),{}):void 0,s=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,c=u(n._def,s===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,s]},!1)??{},a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(c.title=a);let i=s===void 0?r?{...c,[t.definitionPath]:r}:c:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,s].join("/"),[t.definitionPath]:{...r,[s]:c}};return t.target==="jsonSchema7"?i.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(i.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in i||"oneOf"in i||"allOf"in i||"type"in i&&Array.isArray(i.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),i};var O=require("zod");var Mt=require("zod"),we;(function(n){n.Completable="McpCompletable"})(we||(we={}));var j=class extends Mt.ZodType{_parse(e){let{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}};j.create=(n,e)=>new j({type:n,typeName:we.Completable,complete:e.complete,...$r(e)});function $r(n){if(!n)return{};let{errorMap:e,invalid_type_error:t,required_error:r,description:s}=n;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(a,i)=>{var l,h;let{message:f}=n;return a.code==="invalid_enum_value"?{message:f??i.defaultError}:typeof i.data>"u"?{message:(l=f??r)!==null&&l!==void 0?l:i.defaultError}:a.code!=="invalid_type"?{message:i.defaultError}:{message:(h=f??t)!==null&&h!==void 0?h:i.defaultError}},description:s}}var ce=class{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new ne(e,t)}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Q.shape.method.value),this.server.assertCanSetRequestHandler(ee.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(Q,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,inputSchema:t.inputSchema?Pe(t.inputSchema,{strictUnions:!0}):Dr}))})),this.server.setRequestHandler(ee,async(e,t)=>{let r=this._registeredTools[e.params.name];if(!r)throw new b(g.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Tool ${e.params.name} disabled`);if(r.inputSchema){let s=await r.inputSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new b(g.InvalidParams,`Invalid arguments for tool ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;try{return await Promise.resolve(a(c,t))}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}}else{let s=r.callback;try{return await Promise.resolve(s(t))}catch(c){return{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0}}}}),this._toolHandlersInitialized=!0)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(te.shape.method.value),this.server.setRequestHandler(te,async e=>{switch(e.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return this.handleResourceCompletion(e,e.params.ref);default:throw new b(g.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r=this._registeredPrompts[t.name];if(!r)throw new b(g.InvalidParams,`Prompt ${t.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Prompt ${t.name} disabled`);if(!r.argsSchema)return ie;let s=r.argsSchema.shape[e.params.argument.name];if(!(s instanceof j))return ie;let a=await s._def.complete(e.params.argument.value);return Nt(a)}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return ie;throw new b(g.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let s=r.resourceTemplate.completeCallback(e.params.argument.name);if(!s)return ie;let c=await s(e.params.argument.value);return Nt(c)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(U.shape.method.value),this.server.assertCanSetRequestHandler(J.shape.method.value),this.server.assertCanSetRequestHandler(B.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(U,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([c,a])=>a.enabled).map(([c,a])=>({uri:c,name:a.name,...a.metadata})),s=[];for(let c of Object.values(this._registeredResourceTemplates)){if(!c.resourceTemplate.listCallback)continue;let a=await c.resourceTemplate.listCallback(t);for(let i of a.resources)s.push({...i,...c.metadata})}return{resources:[...r,...s]}}),this.server.setRequestHandler(J,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([t,r])=>({name:t,uriTemplate:r.resourceTemplate.uriTemplate.toString(),...r.metadata}))})),this.server.setRequestHandler(B,async(e,t)=>{let r=new URL(e.params.uri),s=this._registeredResources[r.toString()];if(s){if(!s.enabled)throw new b(g.InvalidParams,`Resource ${r} disabled`);return s.readCallback(r,t)}for(let c of Object.values(this._registeredResourceTemplates)){let a=c.resourceTemplate.uriTemplate.match(r.toString());if(a)return c.readCallback(r,a,t)}throw new b(g.InvalidParams,`Resource ${r} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(G.shape.method.value),this.server.assertCanSetRequestHandler(K.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(G,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,arguments:t.argsSchema?qr(t.argsSchema):void 0}))})),this.server.setRequestHandler(K,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new b(g.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let s=await r.argsSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new b(g.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;return await Promise.resolve(a(c,t))}else{let s=r.callback;return await Promise.resolve(s(t))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0)}resource(e,t,...r){let s;typeof r[0]=="object"&&(s=r.shift());let c=r[0];if(typeof t=="string"){if(this._registeredResources[t])throw new Error(`Resource ${t} is already registered`);let a={name:e,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:i=>{typeof i.uri<"u"&&i.uri!==t&&(delete this._registeredResources[t],i.uri&&(this._registeredResources[i.uri]=a)),typeof i.name<"u"&&(a.name=i.name),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResources[t]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a={resourceTemplate:t,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredResourceTemplates[e],i.name&&(this._registeredResourceTemplates[i.name]=a)),typeof i.template<"u"&&(a.resourceTemplate=i.template),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResourceTemplates[e]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}tool(e,...t){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,inputSchema:s===void 0?void 0:O.z.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredTools[e],i.name&&(this._registeredTools[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.paramsSchema<"u"&&(a.inputSchema=O.z.object(i.paramsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=a,this.setToolRequestHandlers(),this.sendToolListChanged(),a}prompt(e,...t){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,argsSchema:s===void 0?void 0:O.z.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredPrompts[e],i.name&&(this._registeredPrompts[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.argsSchema<"u"&&(a.argsSchema=O.z.object(i.argsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}isConnected(){return this.server.transport!==void 0}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var Dr={type:"object"};function qr(n){return Object.entries(n.shape).map(([e,t])=>({name:e,description:t.description,required:!t.isOptional()}))}function Nt(n){return{completion:{values:n.slice(0,100),total:n.length,hasMore:n.length>100}}}var ie={completion:{values:[],hasMore:!1}};var Te=Jt(require("process"),1);var le=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
7
7
|
`);if(e===-1)return null;let t=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),Hr(t)}clear(){this._buffer=void 0}};function Hr(n){return Fe.parse(JSON.parse(n))}function Ot(n){return JSON.stringify(n)+`
|
8
8
|
`}var pe=class{constructor(e=Te.default.stdin,t=Te.default.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new le,this._started=!1,this._ondata=r=>{this._readBuffer.append(r),this.processReadBuffer()},this._onerror=r=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,r)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(var e,t;;)try{let r=this._readBuffer.readMessage();if(r===null)break;(e=this.onmessage)===null||e===void 0||e.call(this,r)}catch(r){(t=this.onerror)===null||t===void 0||t.call(this,r)}}async close(){var e;this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),(e=this.onclose)===null||e===void 0||e.call(this)}send(e){return new Promise(t=>{let r=Ot(e);this._stdout.write(r)?t():this._stdout.once("drain",t)})}};var L=require("zod");var Ce=process.env.personalToken||""||"";function Lt(n){try{let e=new URL(n),t=e.pathname,[,r]=t.match(/(?:file|design)\/([^/]+)/)||[],s=e.searchParams.get("node-id")||n.match(/node-id=([^&]+)/)||n.match(/#([^:]+:[^:]+)/),c=s?Array.isArray(s)?s[1]:s:"";if(!r)throw new Error("Invalid Figma link: fileKey not found");return{fileKey:r,nodeId:c||""}}catch{throw new Error("Invalid Figma link")}}function $t(n){return n?n.length>214?{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7214\u4E2A\u5B57\u7B26"}:/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(n)?n.toLowerCase()==="node_modules"||n.toLowerCase()==="favicon.ico"?{isValid:!1,message:"\u4E0D\u80FD\u4F7F\u7528\u4FDD\u7559\u540D\u79F0\u4F5C\u4E3A\u9879\u76EE\u540D"}:{isValid:!0}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001-\u3001.\u3001~\uFF0C\u5982\u679C\u4F7F\u7528 scope \u5219\u9700\u8981\u4EE5 @ \u5F00\u5934"}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"}}var ue=new ce({name:"F2C MCP",version:"0.0.1"});_("notification",{message:"MCP server instance created"});ue.tool("figma_to_html","Convert Figma nodes to HTML content",{personalToken:L.z.string().default(Ce).describe("Your Figma personal access token"),figmaUrl:L.z.string().describe("Figma design URL containing fileKey and nodeId")},async({personalToken:n=Ce,figmaUrl:e})=>{_("notification",{message:"Tool call received",params:{figmaUrl:e}});try{let{fileKey:t,nodeId:r}=Lt(e);if(!t)throw new Error("fileKey \u4E0D\u80FD\u4E3A\u7A7A");let s=new URL("https://f2c-figma-api.yy.com/api/nodes");s.searchParams.append("fileKey",t),s.searchParams.append("nodeIds",r),s.searchParams.append("personal_token",n),s.searchParams.append("format","html");let c=await fetch(s.toString());if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);return{content:[{type:"text",text:await c.text()}]}}catch(t){return _("error",{message:`Error: ${t.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${t.message}`}]}}});ue.tool("\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6","\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6\u901A\u8FC7\u7EC4\u4EF6\u540D\u5B57",{componentName:L.z.string().regex(/^[A-Z][a-zA-Z0-9_]*$/,{message:"\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF"}).describe("\u7EC4\u4EF6\u7684\u540D\u5B57")},async({componentName:n})=>{_("notification",{message:"Creating Astro component",params:{componentName:n}});try{if(!n.match(/^[A-Z][a-zA-Z0-9_]*$/))throw new Error("\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF");try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new component ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFA Astro \u7EC4\u4EF6: ${n} , \u5728\u5F53\u524D\u76EE\u5F55\u4E0B: ${process.cwd()}`}]}}catch(e){throw new Error(`\u521B\u5EFA\u7EC4\u4EF6\u5931\u8D25: ${e.message}
|
9
|
-
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});ue.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:L.z.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{_("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=$t(n);if(!e.isValid)throw new Error(e.message);try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\
|
9
|
+
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});ue.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:L.z.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{_("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=$t(n);if(!e.isValid)throw new Error(e.message);try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFAAstro\u9879\u76EE: ${n}\u8DEF\u5F84:${process.cwd()}`}]}}catch(t){throw new Error(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t.message}
|
10
10
|
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});async function Dt(){_("notification",{message:"Starting Figma-to-HTML service"});let n=new pe;_("notification",{message:"Transport layer initialized"}),await ue.connect(n),_("notification",{message:"MCP server connected to stdio"})}Dt().catch(n=>{_("error",{message:`Server startup failed: ${n.message}`,code:-32e3}),process.exit(1)});
|
package/dist/cli.mjs
CHANGED
@@ -6,5 +6,5 @@ function x(n,e){let t={jsonrpc:"2.0",...n==="notification"?{method:e.method||"lo
|
|
6
6
|
]`;continue}s+=r[l],r[l]==="\\"?c=!0:a&&r[l]==="]"?a=!1:!a&&r[l]==="["&&(a=!0)}try{new RegExp(s)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return s}function se(n,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&n.keyType?._def.typeName===N.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((r,s)=>({...r,[s]:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"properties",s]})??{}}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(n.keyType?._def.typeName===N.ZodString&&n.keyType._def.checks?.length){let{type:r,...s}=oe(n.keyType._def,e);return{...t,propertyNames:s}}else{if(n.keyType?._def.typeName===N.ZodEnum)return{...t,propertyNames:{enum:n.keyType._def.values}};if(n.keyType?._def.typeName===N.ZodBranded&&n.keyType._def.type._def.typeName===N.ZodString&&n.keyType._def.type._def.checks?.length){let{type:r,...s}=ne(n.keyType._def,e);return{...t,propertyNames:s}}}return t}function ut(n,e){if(e.mapStrategy==="record")return se(n,e);let t=m(n.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||{},r=m(n.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[t,r],minItems:2,maxItems:2}}}function mt(n){let e=n.values,r=Object.keys(n.values).filter(c=>typeof e[e[c]]!="number").map(c=>e[c]),s=Array.from(new Set(r.map(c=>typeof c)));return{type:s.length===1?s[0]==="string"?"string":"number":["string","number"],enum:r}}function dt(){return{not:{}}}function ht(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var O={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function gt(n,e){if(e.target==="openApi3")return ft(n,e);let t=n.options instanceof Map?Array.from(n.options.values()):n.options;if(t.every(r=>r._def.typeName in O&&(!r._def.checks||!r._def.checks.length))){let r=t.reduce((s,c)=>{let a=O[c._def.typeName];return a&&!s.includes(a)?[...s,a]:s},[]);return{type:r.length>1?r:r[0]}}else if(t.every(r=>r._def.typeName==="ZodLiteral"&&!r.description)){let r=t.reduce((s,c)=>{let a=typeof c._def.value;switch(a){case"string":case"number":case"boolean":return[...s,a];case"bigint":return[...s,"integer"];case"object":if(c._def.value===null)return[...s,"null"];case"symbol":case"undefined":case"function":default:return s}},[]);if(r.length===t.length){let s=r.filter((c,a,i)=>i.indexOf(c)===a);return{type:s.length>1?s:s[0],enum:t.reduce((c,a)=>c.includes(a._def.value)?c:[...c,a._def.value],[])}}}else if(t.every(r=>r._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((r,s)=>[...r,...s._def.values.filter(c=>!r.includes(c))],[])};return ft(n,e)}var ft=(n,e)=>{let t=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((r,s)=>m(r._def,{...e,currentPath:[...e.currentPath,"anyOf",`${s}`]})).filter(r=>!!r&&(!e.strictUnions||typeof r=="object"&&Object.keys(r).length>0));return t.length?{anyOf:t}:void 0};function bt(n,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length))return e.target==="openApi3"?{type:O[n.innerType._def.typeName],nullable:!0}:{type:[O[n.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let r=m(n.innerType._def,{...e,currentPath:[...e.currentPath]});return r&&"$ref"in r?{allOf:[r],nullable:!0}:r&&{...r,nullable:!0}}let t=m(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function yt(n,e){let t={type:"number"};if(!n.checks)return t;for(let r of n.checks)switch(r.kind){case"int":t.type="integer",ve(t,"type",r.message,e);break;case"min":e.target==="jsonSchema7"?r.inclusive?h(t,"minimum",r.value,r.message,e):h(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),h(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?h(t,"maximum",r.value,r.message,e):h(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),h(t,"maximum",r.value,r.message,e));break;case"multipleOf":h(t,"multipleOf",r.value,r.message,e);break}return t}import{ZodOptional as Rr}from"zod";function _t(n,e){let t=e.target==="openAi",r={type:"object",properties:{}},s=[],c=n.shape();for(let i in c){let l=c[i];if(l===void 0||l._def===void 0)continue;let f=wr(l);f&&t&&(l instanceof Rr&&(l=l._def.innerType),l.isNullable()||(l=l.nullable()),f=!1);let g=m(l._def,{...e,currentPath:[...e.currentPath,"properties",i],propertyPath:[...e.currentPath,"properties",i]});g!==void 0&&(r.properties[i]=g,f||s.push(i))}s.length&&(r.required=s);let a=Pr(n,e);return a!==void 0&&(r.additionalProperties=a),r}function Pr(n,e){if(n.catchall._def.typeName!=="ZodNever")return m(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function wr(n){try{return n.isOptional()}catch{return!0}}var xt=(n,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return m(n.innerType._def,e);let t=m(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:{}},t]}:{}};var vt=(n,e)=>{if(e.pipeStrategy==="input")return m(n.in._def,e);if(e.pipeStrategy==="output")return m(n.out._def,e);let t=m(n.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),r=m(n.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,r].filter(s=>s!==void 0)}};function St(n,e){return m(n.type._def,e)}function Rt(n,e){let r={type:"array",uniqueItems:!0,items:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return n.minSize&&h(r,"minItems",n.minSize.value,n.minSize.message,e),n.maxSize&&h(r,"maxItems",n.maxSize.value,n.maxSize.message,e),r}function Pt(n,e){return n.rest?{type:"array",minItems:n.items.length,items:n.items.map((t,r)=>m(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[]),additionalItems:m(n.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((t,r)=>m(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[])}}function wt(){return{not:{}}}function Tt(){return{}}var Ct=(n,e)=>m(n.innerType._def,e);var Et=(n,e,t)=>{switch(e){case d.ZodString:return oe(n,t);case d.ZodNumber:return yt(n,t);case d.ZodObject:return _t(n,t);case d.ZodBigInt:return rt(n,t);case d.ZodBoolean:return nt();case d.ZodDate:return Se(n,t);case d.ZodUndefined:return wt();case d.ZodNull:return ht(t);case d.ZodArray:return tt(n,t);case d.ZodUnion:case d.ZodDiscriminatedUnion:return gt(n,t);case d.ZodIntersection:return ct(n,t);case d.ZodTuple:return Pt(n,t);case d.ZodRecord:return se(n,t);case d.ZodLiteral:return lt(n,t);case d.ZodEnum:return it(n);case d.ZodNativeEnum:return mt(n);case d.ZodNullable:return bt(n,t);case d.ZodOptional:return xt(n,t);case d.ZodMap:return ut(n,t);case d.ZodSet:return Rt(n,t);case d.ZodLazy:return()=>n.getter()._def;case d.ZodPromise:return St(n,t);case d.ZodNaN:case d.ZodNever:return dt();case d.ZodEffects:return at(n,t);case d.ZodAny:return et();case d.ZodUnknown:return Tt();case d.ZodDefault:return st(n,t);case d.ZodBranded:return ne(n,t);case d.ZodReadonly:return Ct(n,t);case d.ZodCatch:return ot(n,t);case d.ZodPipeline:return vt(n,t);case d.ZodFunction:case d.ZodVoid:case d.ZodSymbol:return;default:return(r=>{})(e)}};function m(n,e,t=!1){let r=e.seen.get(n);if(e.override){let i=e.override?.(n,e,r,t);if(i!==Ye)return i}if(r&&!t){let i=Tr(r,e);if(i!==void 0)return i}let s={def:n,path:e.currentPath,jsonSchema:void 0};e.seen.set(n,s);let c=Et(n,n.typeName,e),a=typeof c=="function"?m(c(),e):c;if(a&&Er(n,e,a),e.postProcess){let i=e.postProcess(a,n,e);return s.jsonSchema=a,i}return s.jsonSchema=a,a}var Tr=(n,e)=>{switch(e.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:Cr(e.currentPath,n.path)};case"none":case"seen":return n.path.length<e.currentPath.length&&n.path.every((t,r)=>e.currentPath[r]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),{}):e.$refStrategy==="seen"?{}:void 0}},Cr=(n,e)=>{let t=0;for(;t<n.length&&t<e.length&&n[t]===e[t];t++);return[(n.length-t).toString(),...e.slice(t)].join("/")},Er=(n,e,t)=>(n.description&&(t.description=n.description,e.markdownDescription&&(t.markdownDescription=n.description)),t);var we=(n,e)=>{let t=Qe(e),r=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[f,g])=>({...l,[f]:m(g._def,{...t,currentPath:[...t.basePath,t.definitionPath,f]},!0)??{}}),{}):void 0,s=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,c=m(n._def,s===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,s]},!1)??{},a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(c.title=a);let i=s===void 0?r?{...c,[t.definitionPath]:r}:c:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,s].join("/"),[t.definitionPath]:{...r,[s]:c}};return t.target==="jsonSchema7"?i.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(i.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in i||"oneOf"in i||"allOf"in i||"type"in i&&Array.isArray(i.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),i};import{z as ae}from"zod";import{ZodType as kr}from"zod";var Te;(function(n){n.Completable="McpCompletable"})(Te||(Te={}));var j=class extends kr{_parse(e){let{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}};j.create=(n,e)=>new j({type:n,typeName:Te.Completable,complete:e.complete,...Ar(e)});function Ar(n){if(!n)return{};let{errorMap:e,invalid_type_error:t,required_error:r,description:s}=n;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(a,i)=>{var l,f;let{message:g}=n;return a.code==="invalid_enum_value"?{message:g??i.defaultError}:typeof i.data>"u"?{message:(l=g??r)!==null&&l!==void 0?l:i.defaultError}:a.code!=="invalid_type"?{message:i.defaultError}:{message:(f=g??t)!==null&&f!==void 0?f:i.defaultError}},description:s}}var ce=class{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new re(e,t)}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(W.shape.method.value),this.server.assertCanSetRequestHandler(Q.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(W,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,inputSchema:t.inputSchema?we(t.inputSchema,{strictUnions:!0}):jr}))})),this.server.setRequestHandler(Q,async(e,t)=>{let r=this._registeredTools[e.params.name];if(!r)throw new y(b.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Tool ${e.params.name} disabled`);if(r.inputSchema){let s=await r.inputSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new y(b.InvalidParams,`Invalid arguments for tool ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;try{return await Promise.resolve(a(c,t))}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}}else{let s=r.callback;try{return await Promise.resolve(s(t))}catch(c){return{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0}}}}),this._toolHandlersInitialized=!0)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(ee.shape.method.value),this.server.setRequestHandler(ee,async e=>{switch(e.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return this.handleResourceCompletion(e,e.params.ref);default:throw new y(b.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r=this._registeredPrompts[t.name];if(!r)throw new y(b.InvalidParams,`Prompt ${t.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Prompt ${t.name} disabled`);if(!r.argsSchema)return ie;let s=r.argsSchema.shape[e.params.argument.name];if(!(s instanceof j))return ie;let a=await s._def.complete(e.params.argument.value);return kt(a)}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return ie;throw new y(b.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let s=r.resourceTemplate.completeCallback(e.params.argument.name);if(!s)return ie;let c=await s(e.params.argument.value);return kt(c)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(V.shape.method.value),this.server.assertCanSetRequestHandler(U.shape.method.value),this.server.assertCanSetRequestHandler(J.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(V,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([c,a])=>a.enabled).map(([c,a])=>({uri:c,name:a.name,...a.metadata})),s=[];for(let c of Object.values(this._registeredResourceTemplates)){if(!c.resourceTemplate.listCallback)continue;let a=await c.resourceTemplate.listCallback(t);for(let i of a.resources)s.push({...i,...c.metadata})}return{resources:[...r,...s]}}),this.server.setRequestHandler(U,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([t,r])=>({name:t,uriTemplate:r.resourceTemplate.uriTemplate.toString(),...r.metadata}))})),this.server.setRequestHandler(J,async(e,t)=>{let r=new URL(e.params.uri),s=this._registeredResources[r.toString()];if(s){if(!s.enabled)throw new y(b.InvalidParams,`Resource ${r} disabled`);return s.readCallback(r,t)}for(let c of Object.values(this._registeredResourceTemplates)){let a=c.resourceTemplate.uriTemplate.match(r.toString());if(a)return c.readCallback(r,a,t)}throw new y(b.InvalidParams,`Resource ${r} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(B.shape.method.value),this.server.assertCanSetRequestHandler(G.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(B,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,arguments:t.argsSchema?Ir(t.argsSchema):void 0}))})),this.server.setRequestHandler(G,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new y(b.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let s=await r.argsSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new y(b.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;return await Promise.resolve(a(c,t))}else{let s=r.callback;return await Promise.resolve(s(t))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0)}resource(e,t,...r){let s;typeof r[0]=="object"&&(s=r.shift());let c=r[0];if(typeof t=="string"){if(this._registeredResources[t])throw new Error(`Resource ${t} is already registered`);let a={name:e,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:i=>{typeof i.uri<"u"&&i.uri!==t&&(delete this._registeredResources[t],i.uri&&(this._registeredResources[i.uri]=a)),typeof i.name<"u"&&(a.name=i.name),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResources[t]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a={resourceTemplate:t,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredResourceTemplates[e],i.name&&(this._registeredResourceTemplates[i.name]=a)),typeof i.template<"u"&&(a.resourceTemplate=i.template),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResourceTemplates[e]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}tool(e,...t){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,inputSchema:s===void 0?void 0:ae.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredTools[e],i.name&&(this._registeredTools[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.paramsSchema<"u"&&(a.inputSchema=ae.object(i.paramsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=a,this.setToolRequestHandlers(),this.sendToolListChanged(),a}prompt(e,...t){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,argsSchema:s===void 0?void 0:ae.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredPrompts[e],i.name&&(this._registeredPrompts[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.argsSchema<"u"&&(a.argsSchema=ae.object(i.argsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}isConnected(){return this.server.transport!==void 0}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var jr={type:"object"};function Ir(n){return Object.entries(n.shape).map(([e,t])=>({name:e,description:t.description,required:!t.isOptional()}))}function kt(n){return{completion:{values:n.slice(0,100),total:n.length,hasMore:n.length>100}}}var ie={completion:{values:[],hasMore:!1}};import jt from"node:process";var le=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
7
7
|
`);if(e===-1)return null;let t=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),Mr(t)}clear(){this._buffer=void 0}};function Mr(n){return Ze.parse(JSON.parse(n))}function At(n){return JSON.stringify(n)+`
|
8
8
|
`}var pe=class{constructor(e=jt.stdin,t=jt.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new le,this._started=!1,this._ondata=r=>{this._readBuffer.append(r),this.processReadBuffer()},this._onerror=r=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,r)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(var e,t;;)try{let r=this._readBuffer.readMessage();if(r===null)break;(e=this.onmessage)===null||e===void 0||e.call(this,r)}catch(r){(t=this.onerror)===null||t===void 0||t.call(this,r)}}async close(){var e;this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),(e=this.onclose)===null||e===void 0||e.call(this)}send(e){return new Promise(t=>{let r=At(e);this._stdout.write(r)?t():this._stdout.once("drain",t)})}};import{z as ue}from"zod";var Ce=process.env.personalToken||""||"";function It(n){try{let e=new URL(n),t=e.pathname,[,r]=t.match(/(?:file|design)\/([^/]+)/)||[],s=e.searchParams.get("node-id")||n.match(/node-id=([^&]+)/)||n.match(/#([^:]+:[^:]+)/),c=s?Array.isArray(s)?s[1]:s:"";if(!r)throw new Error("Invalid Figma link: fileKey not found");return{fileKey:r,nodeId:c||""}}catch{throw new Error("Invalid Figma link")}}function Mt(n){return n?n.length>214?{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7214\u4E2A\u5B57\u7B26"}:/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(n)?n.toLowerCase()==="node_modules"||n.toLowerCase()==="favicon.ico"?{isValid:!1,message:"\u4E0D\u80FD\u4F7F\u7528\u4FDD\u7559\u540D\u79F0\u4F5C\u4E3A\u9879\u76EE\u540D"}:{isValid:!0}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001-\u3001.\u3001~\uFF0C\u5982\u679C\u4F7F\u7528 scope \u5219\u9700\u8981\u4EE5 @ \u5F00\u5934"}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"}}var me=new ce({name:"F2C MCP",version:"0.0.1"});x("notification",{message:"MCP server instance created"});me.tool("figma_to_html","Convert Figma nodes to HTML content",{personalToken:ue.string().default(Ce).describe("Your Figma personal access token"),figmaUrl:ue.string().describe("Figma design URL containing fileKey and nodeId")},async({personalToken:n=Ce,figmaUrl:e})=>{x("notification",{message:"Tool call received",params:{figmaUrl:e}});try{let{fileKey:t,nodeId:r}=It(e);if(!t)throw new Error("fileKey \u4E0D\u80FD\u4E3A\u7A7A");let s=new URL("https://f2c-figma-api.yy.com/api/nodes");s.searchParams.append("fileKey",t),s.searchParams.append("nodeIds",r),s.searchParams.append("personal_token",n),s.searchParams.append("format","html");let c=await fetch(s.toString());if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);return{content:[{type:"text",text:await c.text()}]}}catch(t){return x("error",{message:`Error: ${t.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${t.message}`}]}}});me.tool("\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6","\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6\u901A\u8FC7\u7EC4\u4EF6\u540D\u5B57",{componentName:ue.string().regex(/^[A-Z][a-zA-Z0-9_]*$/,{message:"\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF"}).describe("\u7EC4\u4EF6\u7684\u540D\u5B57")},async({componentName:n})=>{x("notification",{message:"Creating Astro component",params:{componentName:n}});try{if(!n.match(/^[A-Z][a-zA-Z0-9_]*$/))throw new Error("\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF");try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new component ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFA Astro \u7EC4\u4EF6: ${n} , \u5728\u5F53\u524D\u76EE\u5F55\u4E0B: ${process.cwd()}`}]}}catch(e){throw new Error(`\u521B\u5EFA\u7EC4\u4EF6\u5931\u8D25: ${e.message}
|
9
|
-
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});me.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:ue.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{x("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=Mt(n);if(!e.isValid)throw new Error(e.message);try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\
|
9
|
+
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});me.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:ue.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{x("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=Mt(n);if(!e.isValid)throw new Error(e.message);try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFAAstro\u9879\u76EE: ${n}\u8DEF\u5F84:${process.cwd()}`}]}}catch(t){throw new Error(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t.message}
|
10
10
|
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});async function Ot(){x("notification",{message:"Starting Figma-to-HTML service"});let n=new pe;x("notification",{message:"Transport layer initialized"}),await me.connect(n),x("notification",{message:"MCP server connected to stdio"})}Ot().catch(n=>{x("error",{message:`Server startup failed: ${n.message}`,code:-32e3}),process.exit(1)});
|
package/dist/index.js
CHANGED
@@ -5,5 +5,5 @@
|
|
5
5
|
]`;continue}s+=r[l],r[l]==="\\"?c=!0:a&&r[l]==="]"?a=!1:!a&&r[l]==="["&&(a=!0)}try{new RegExp(s)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return s}function ae(n,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((r,s)=>({...r,[s]:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"properties",s]})??{}}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodString&&n.keyType._def.checks?.length){let{type:r,...s}=se(n.keyType._def,e);return{...t,propertyNames:s}}else{if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodEnum)return{...t,propertyNames:{enum:n.keyType._def.values}};if(n.keyType?._def.typeName===A.ZodFirstPartyTypeKind.ZodBranded&&n.keyType._def.type._def.typeName===A.ZodFirstPartyTypeKind.ZodString&&n.keyType._def.type._def.checks?.length){let{type:r,...s}=oe(n.keyType._def,e);return{...t,propertyNames:s}}}return t}function ht(n,e){if(e.mapStrategy==="record")return ae(n,e);let t=u(n.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||{},r=u(n.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[t,r],minItems:2,maxItems:2}}}function ft(n){let e=n.values,r=Object.keys(n.values).filter(c=>typeof e[e[c]]!="number").map(c=>e[c]),s=Array.from(new Set(r.map(c=>typeof c)));return{type:s.length===1?s[0]==="string"?"string":"number":["string","number"],enum:r}}function gt(){return{not:{}}}function bt(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var N={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function _t(n,e){if(e.target==="openApi3")return yt(n,e);let t=n.options instanceof Map?Array.from(n.options.values()):n.options;if(t.every(r=>r._def.typeName in N&&(!r._def.checks||!r._def.checks.length))){let r=t.reduce((s,c)=>{let a=N[c._def.typeName];return a&&!s.includes(a)?[...s,a]:s},[]);return{type:r.length>1?r:r[0]}}else if(t.every(r=>r._def.typeName==="ZodLiteral"&&!r.description)){let r=t.reduce((s,c)=>{let a=typeof c._def.value;switch(a){case"string":case"number":case"boolean":return[...s,a];case"bigint":return[...s,"integer"];case"object":if(c._def.value===null)return[...s,"null"];case"symbol":case"undefined":case"function":default:return s}},[]);if(r.length===t.length){let s=r.filter((c,a,i)=>i.indexOf(c)===a);return{type:s.length>1?s:s[0],enum:t.reduce((c,a)=>c.includes(a._def.value)?c:[...c,a._def.value],[])}}}else if(t.every(r=>r._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((r,s)=>[...r,...s._def.values.filter(c=>!r.includes(c))],[])};return yt(n,e)}var yt=(n,e)=>{let t=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((r,s)=>u(r._def,{...e,currentPath:[...e.currentPath,"anyOf",`${s}`]})).filter(r=>!!r&&(!e.strictUnions||typeof r=="object"&&Object.keys(r).length>0));return t.length?{anyOf:t}:void 0};function xt(n,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length))return e.target==="openApi3"?{type:N[n.innerType._def.typeName],nullable:!0}:{type:[N[n.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let r=u(n.innerType._def,{...e,currentPath:[...e.currentPath]});return r&&"$ref"in r?{allOf:[r],nullable:!0}:r&&{...r,nullable:!0}}let t=u(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function vt(n,e){let t={type:"number"};if(!n.checks)return t;for(let r of n.checks)switch(r.kind){case"int":t.type="integer",xe(t,"type",r.message,e);break;case"min":e.target==="jsonSchema7"?r.inclusive?d(t,"minimum",r.value,r.message,e):d(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),d(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?d(t,"maximum",r.value,r.message,e):d(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),d(t,"maximum",r.value,r.message,e));break;case"multipleOf":d(t,"multipleOf",r.value,r.message,e);break}return t}var St=require("zod");function Rt(n,e){let t=e.target==="openAi",r={type:"object",properties:{}},s=[],c=n.shape();for(let i in c){let l=c[i];if(l===void 0||l._def===void 0)continue;let h=Mr(l);h&&t&&(l instanceof St.ZodOptional&&(l=l._def.innerType),l.isNullable()||(l=l.nullable()),h=!1);let f=u(l._def,{...e,currentPath:[...e.currentPath,"properties",i],propertyPath:[...e.currentPath,"properties",i]});f!==void 0&&(r.properties[i]=f,h||s.push(i))}s.length&&(r.required=s);let a=Ir(n,e);return a!==void 0&&(r.additionalProperties=a),r}function Ir(n,e){if(n.catchall._def.typeName!=="ZodNever")return u(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function Mr(n){try{return n.isOptional()}catch{return!0}}var Pt=(n,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return u(n.innerType._def,e);let t=u(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:{}},t]}:{}};var wt=(n,e)=>{if(e.pipeStrategy==="input")return u(n.in._def,e);if(e.pipeStrategy==="output")return u(n.out._def,e);let t=u(n.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),r=u(n.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,r].filter(s=>s!==void 0)}};function Tt(n,e){return u(n.type._def,e)}function Ct(n,e){let r={type:"array",uniqueItems:!0,items:u(n.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return n.minSize&&d(r,"minItems",n.minSize.value,n.minSize.message,e),n.maxSize&&d(r,"maxItems",n.maxSize.value,n.maxSize.message,e),r}function Et(n,e){return n.rest?{type:"array",minItems:n.items.length,items:n.items.map((t,r)=>u(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[]),additionalItems:u(n.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((t,r)=>u(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[])}}function kt(){return{not:{}}}function At(){return{}}var jt=(n,e)=>u(n.innerType._def,e);var It=(n,e,t)=>{switch(e){case m.ZodFirstPartyTypeKind.ZodString:return se(n,t);case m.ZodFirstPartyTypeKind.ZodNumber:return vt(n,t);case m.ZodFirstPartyTypeKind.ZodObject:return Rt(n,t);case m.ZodFirstPartyTypeKind.ZodBigInt:return st(n,t);case m.ZodFirstPartyTypeKind.ZodBoolean:return at();case m.ZodFirstPartyTypeKind.ZodDate:return ve(n,t);case m.ZodFirstPartyTypeKind.ZodUndefined:return kt();case m.ZodFirstPartyTypeKind.ZodNull:return bt(t);case m.ZodFirstPartyTypeKind.ZodArray:return ot(n,t);case m.ZodFirstPartyTypeKind.ZodUnion:case m.ZodFirstPartyTypeKind.ZodDiscriminatedUnion:return _t(n,t);case m.ZodFirstPartyTypeKind.ZodIntersection:return ut(n,t);case m.ZodFirstPartyTypeKind.ZodTuple:return Et(n,t);case m.ZodFirstPartyTypeKind.ZodRecord:return ae(n,t);case m.ZodFirstPartyTypeKind.ZodLiteral:return mt(n,t);case m.ZodFirstPartyTypeKind.ZodEnum:return pt(n);case m.ZodFirstPartyTypeKind.ZodNativeEnum:return ft(n);case m.ZodFirstPartyTypeKind.ZodNullable:return xt(n,t);case m.ZodFirstPartyTypeKind.ZodOptional:return Pt(n,t);case m.ZodFirstPartyTypeKind.ZodMap:return ht(n,t);case m.ZodFirstPartyTypeKind.ZodSet:return Ct(n,t);case m.ZodFirstPartyTypeKind.ZodLazy:return()=>n.getter()._def;case m.ZodFirstPartyTypeKind.ZodPromise:return Tt(n,t);case m.ZodFirstPartyTypeKind.ZodNaN:case m.ZodFirstPartyTypeKind.ZodNever:return gt();case m.ZodFirstPartyTypeKind.ZodEffects:return lt(n,t);case m.ZodFirstPartyTypeKind.ZodAny:return rt();case m.ZodFirstPartyTypeKind.ZodUnknown:return At();case m.ZodFirstPartyTypeKind.ZodDefault:return ct(n,t);case m.ZodFirstPartyTypeKind.ZodBranded:return oe(n,t);case m.ZodFirstPartyTypeKind.ZodReadonly:return jt(n,t);case m.ZodFirstPartyTypeKind.ZodCatch:return it(n,t);case m.ZodFirstPartyTypeKind.ZodPipeline:return wt(n,t);case m.ZodFirstPartyTypeKind.ZodFunction:case m.ZodFirstPartyTypeKind.ZodVoid:case m.ZodFirstPartyTypeKind.ZodSymbol:return;default:return(r=>{})(e)}};function u(n,e,t=!1){let r=e.seen.get(n);if(e.override){let i=e.override?.(n,e,r,t);if(i!==Qe)return i}if(r&&!t){let i=Nr(r,e);if(i!==void 0)return i}let s={def:n,path:e.currentPath,jsonSchema:void 0};e.seen.set(n,s);let c=It(n,n.typeName,e),a=typeof c=="function"?u(c(),e):c;if(a&&Lr(n,e,a),e.postProcess){let i=e.postProcess(a,n,e);return s.jsonSchema=a,i}return s.jsonSchema=a,a}var Nr=(n,e)=>{switch(e.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:Or(e.currentPath,n.path)};case"none":case"seen":return n.path.length<e.currentPath.length&&n.path.every((t,r)=>e.currentPath[r]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),{}):e.$refStrategy==="seen"?{}:void 0}},Or=(n,e)=>{let t=0;for(;t<n.length&&t<e.length&&n[t]===e[t];t++);return[(n.length-t).toString(),...e.slice(t)].join("/")},Lr=(n,e,t)=>(n.description&&(t.description=n.description,e.markdownDescription&&(t.markdownDescription=n.description)),t);var Pe=(n,e)=>{let t=tt(e),r=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[h,f])=>({...l,[h]:u(f._def,{...t,currentPath:[...t.basePath,t.definitionPath,h]},!0)??{}}),{}):void 0,s=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,c=u(n._def,s===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,s]},!1)??{},a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(c.title=a);let i=s===void 0?r?{...c,[t.definitionPath]:r}:c:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,s].join("/"),[t.definitionPath]:{...r,[s]:c}};return t.target==="jsonSchema7"?i.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(i.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in i||"oneOf"in i||"allOf"in i||"type"in i&&Array.isArray(i.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),i};var O=require("zod");var Mt=require("zod"),we;(function(n){n.Completable="McpCompletable"})(we||(we={}));var j=class extends Mt.ZodType{_parse(e){let{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}};j.create=(n,e)=>new j({type:n,typeName:we.Completable,complete:e.complete,...$r(e)});function $r(n){if(!n)return{};let{errorMap:e,invalid_type_error:t,required_error:r,description:s}=n;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(a,i)=>{var l,h;let{message:f}=n;return a.code==="invalid_enum_value"?{message:f??i.defaultError}:typeof i.data>"u"?{message:(l=f??r)!==null&&l!==void 0?l:i.defaultError}:a.code!=="invalid_type"?{message:i.defaultError}:{message:(h=f??t)!==null&&h!==void 0?h:i.defaultError}},description:s}}var ce=class{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new ne(e,t)}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(Q.shape.method.value),this.server.assertCanSetRequestHandler(ee.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(Q,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,inputSchema:t.inputSchema?Pe(t.inputSchema,{strictUnions:!0}):Dr}))})),this.server.setRequestHandler(ee,async(e,t)=>{let r=this._registeredTools[e.params.name];if(!r)throw new b(g.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Tool ${e.params.name} disabled`);if(r.inputSchema){let s=await r.inputSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new b(g.InvalidParams,`Invalid arguments for tool ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;try{return await Promise.resolve(a(c,t))}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}}else{let s=r.callback;try{return await Promise.resolve(s(t))}catch(c){return{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0}}}}),this._toolHandlersInitialized=!0)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(te.shape.method.value),this.server.setRequestHandler(te,async e=>{switch(e.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return this.handleResourceCompletion(e,e.params.ref);default:throw new b(g.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r=this._registeredPrompts[t.name];if(!r)throw new b(g.InvalidParams,`Prompt ${t.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Prompt ${t.name} disabled`);if(!r.argsSchema)return ie;let s=r.argsSchema.shape[e.params.argument.name];if(!(s instanceof j))return ie;let a=await s._def.complete(e.params.argument.value);return Nt(a)}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return ie;throw new b(g.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let s=r.resourceTemplate.completeCallback(e.params.argument.name);if(!s)return ie;let c=await s(e.params.argument.value);return Nt(c)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(U.shape.method.value),this.server.assertCanSetRequestHandler(J.shape.method.value),this.server.assertCanSetRequestHandler(B.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(U,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([c,a])=>a.enabled).map(([c,a])=>({uri:c,name:a.name,...a.metadata})),s=[];for(let c of Object.values(this._registeredResourceTemplates)){if(!c.resourceTemplate.listCallback)continue;let a=await c.resourceTemplate.listCallback(t);for(let i of a.resources)s.push({...i,...c.metadata})}return{resources:[...r,...s]}}),this.server.setRequestHandler(J,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([t,r])=>({name:t,uriTemplate:r.resourceTemplate.uriTemplate.toString(),...r.metadata}))})),this.server.setRequestHandler(B,async(e,t)=>{let r=new URL(e.params.uri),s=this._registeredResources[r.toString()];if(s){if(!s.enabled)throw new b(g.InvalidParams,`Resource ${r} disabled`);return s.readCallback(r,t)}for(let c of Object.values(this._registeredResourceTemplates)){let a=c.resourceTemplate.uriTemplate.match(r.toString());if(a)return c.readCallback(r,a,t)}throw new b(g.InvalidParams,`Resource ${r} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(G.shape.method.value),this.server.assertCanSetRequestHandler(K.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(G,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,arguments:t.argsSchema?qr(t.argsSchema):void 0}))})),this.server.setRequestHandler(K,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new b(g.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new b(g.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let s=await r.argsSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new b(g.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;return await Promise.resolve(a(c,t))}else{let s=r.callback;return await Promise.resolve(s(t))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0)}resource(e,t,...r){let s;typeof r[0]=="object"&&(s=r.shift());let c=r[0];if(typeof t=="string"){if(this._registeredResources[t])throw new Error(`Resource ${t} is already registered`);let a={name:e,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:i=>{typeof i.uri<"u"&&i.uri!==t&&(delete this._registeredResources[t],i.uri&&(this._registeredResources[i.uri]=a)),typeof i.name<"u"&&(a.name=i.name),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResources[t]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a={resourceTemplate:t,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredResourceTemplates[e],i.name&&(this._registeredResourceTemplates[i.name]=a)),typeof i.template<"u"&&(a.resourceTemplate=i.template),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResourceTemplates[e]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}tool(e,...t){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,inputSchema:s===void 0?void 0:O.z.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredTools[e],i.name&&(this._registeredTools[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.paramsSchema<"u"&&(a.inputSchema=O.z.object(i.paramsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=a,this.setToolRequestHandlers(),this.sendToolListChanged(),a}prompt(e,...t){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,argsSchema:s===void 0?void 0:O.z.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredPrompts[e],i.name&&(this._registeredPrompts[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.argsSchema<"u"&&(a.argsSchema=O.z.object(i.argsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}isConnected(){return this.server.transport!==void 0}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var Dr={type:"object"};function qr(n){return Object.entries(n.shape).map(([e,t])=>({name:e,description:t.description,required:!t.isOptional()}))}function Nt(n){return{completion:{values:n.slice(0,100),total:n.length,hasMore:n.length>100}}}var ie={completion:{values:[],hasMore:!1}};var Te=Jt(require("process"),1);var le=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
6
6
|
`);if(e===-1)return null;let t=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),Hr(t)}clear(){this._buffer=void 0}};function Hr(n){return Fe.parse(JSON.parse(n))}function Ot(n){return JSON.stringify(n)+`
|
7
7
|
`}var pe=class{constructor(e=Te.default.stdin,t=Te.default.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new le,this._started=!1,this._ondata=r=>{this._readBuffer.append(r),this.processReadBuffer()},this._onerror=r=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,r)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(var e,t;;)try{let r=this._readBuffer.readMessage();if(r===null)break;(e=this.onmessage)===null||e===void 0||e.call(this,r)}catch(r){(t=this.onerror)===null||t===void 0||t.call(this,r)}}async close(){var e;this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),(e=this.onclose)===null||e===void 0||e.call(this)}send(e){return new Promise(t=>{let r=Ot(e);this._stdout.write(r)?t():this._stdout.once("drain",t)})}};var L=require("zod");var Ce=process.env.personalToken||""||"";function Lt(n){try{let e=new URL(n),t=e.pathname,[,r]=t.match(/(?:file|design)\/([^/]+)/)||[],s=e.searchParams.get("node-id")||n.match(/node-id=([^&]+)/)||n.match(/#([^:]+:[^:]+)/),c=s?Array.isArray(s)?s[1]:s:"";if(!r)throw new Error("Invalid Figma link: fileKey not found");return{fileKey:r,nodeId:c||""}}catch{throw new Error("Invalid Figma link")}}function $t(n){return n?n.length>214?{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7214\u4E2A\u5B57\u7B26"}:/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(n)?n.toLowerCase()==="node_modules"||n.toLowerCase()==="favicon.ico"?{isValid:!1,message:"\u4E0D\u80FD\u4F7F\u7528\u4FDD\u7559\u540D\u79F0\u4F5C\u4E3A\u9879\u76EE\u540D"}:{isValid:!0}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001-\u3001.\u3001~\uFF0C\u5982\u679C\u4F7F\u7528 scope \u5219\u9700\u8981\u4EE5 @ \u5F00\u5934"}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"}}var ue=new ce({name:"F2C MCP",version:"0.0.1"});_("notification",{message:"MCP server instance created"});ue.tool("figma_to_html","Convert Figma nodes to HTML content",{personalToken:L.z.string().default(Ce).describe("Your Figma personal access token"),figmaUrl:L.z.string().describe("Figma design URL containing fileKey and nodeId")},async({personalToken:n=Ce,figmaUrl:e})=>{_("notification",{message:"Tool call received",params:{figmaUrl:e}});try{let{fileKey:t,nodeId:r}=Lt(e);if(!t)throw new Error("fileKey \u4E0D\u80FD\u4E3A\u7A7A");let s=new URL("https://f2c-figma-api.yy.com/api/nodes");s.searchParams.append("fileKey",t),s.searchParams.append("nodeIds",r),s.searchParams.append("personal_token",n),s.searchParams.append("format","html");let c=await fetch(s.toString());if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);return{content:[{type:"text",text:await c.text()}]}}catch(t){return _("error",{message:`Error: ${t.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${t.message}`}]}}});ue.tool("\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6","\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6\u901A\u8FC7\u7EC4\u4EF6\u540D\u5B57",{componentName:L.z.string().regex(/^[A-Z][a-zA-Z0-9_]*$/,{message:"\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF"}).describe("\u7EC4\u4EF6\u7684\u540D\u5B57")},async({componentName:n})=>{_("notification",{message:"Creating Astro component",params:{componentName:n}});try{if(!n.match(/^[A-Z][a-zA-Z0-9_]*$/))throw new Error("\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF");try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new component ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFA Astro \u7EC4\u4EF6: ${n} , \u5728\u5F53\u524D\u76EE\u5F55\u4E0B: ${process.cwd()}`}]}}catch(e){throw new Error(`\u521B\u5EFA\u7EC4\u4EF6\u5931\u8D25: ${e.message}
|
8
|
-
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});ue.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:L.z.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{_("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=$t(n);if(!e.isValid)throw new Error(e.message);try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\
|
8
|
+
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});ue.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:L.z.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{_("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=$t(n);if(!e.isValid)throw new Error(e.message);try{return(0,Ee.execSync)(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFAAstro\u9879\u76EE: ${n}\u8DEF\u5F84:${process.cwd()}`}]}}catch(t){throw new Error(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t.message}
|
9
9
|
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return _("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});async function Dt(){_("notification",{message:"Starting Figma-to-HTML service"});let n=new pe;_("notification",{message:"Transport layer initialized"}),await ue.connect(n),_("notification",{message:"MCP server connected to stdio"})}Dt().catch(n=>{_("error",{message:`Server startup failed: ${n.message}`,code:-32e3}),process.exit(1)});
|
package/dist/index.mjs
CHANGED
@@ -5,5 +5,5 @@ function x(n,e){let t={jsonrpc:"2.0",...n==="notification"?{method:e.method||"lo
|
|
5
5
|
]`;continue}s+=r[l],r[l]==="\\"?c=!0:a&&r[l]==="]"?a=!1:!a&&r[l]==="["&&(a=!0)}try{new RegExp(s)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),n.source}return s}function se(n,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&n.keyType?._def.typeName===N.ZodEnum)return{type:"object",required:n.keyType._def.values,properties:n.keyType._def.values.reduce((r,s)=>({...r,[s]:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"properties",s]})??{}}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(n.keyType?._def.typeName===N.ZodString&&n.keyType._def.checks?.length){let{type:r,...s}=oe(n.keyType._def,e);return{...t,propertyNames:s}}else{if(n.keyType?._def.typeName===N.ZodEnum)return{...t,propertyNames:{enum:n.keyType._def.values}};if(n.keyType?._def.typeName===N.ZodBranded&&n.keyType._def.type._def.typeName===N.ZodString&&n.keyType._def.type._def.checks?.length){let{type:r,...s}=ne(n.keyType._def,e);return{...t,propertyNames:s}}}return t}function ut(n,e){if(e.mapStrategy==="record")return se(n,e);let t=m(n.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||{},r=m(n.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||{};return{type:"array",maxItems:125,items:{type:"array",items:[t,r],minItems:2,maxItems:2}}}function mt(n){let e=n.values,r=Object.keys(n.values).filter(c=>typeof e[e[c]]!="number").map(c=>e[c]),s=Array.from(new Set(r.map(c=>typeof c)));return{type:s.length===1?s[0]==="string"?"string":"number":["string","number"],enum:r}}function dt(){return{not:{}}}function ht(n){return n.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var O={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function gt(n,e){if(e.target==="openApi3")return ft(n,e);let t=n.options instanceof Map?Array.from(n.options.values()):n.options;if(t.every(r=>r._def.typeName in O&&(!r._def.checks||!r._def.checks.length))){let r=t.reduce((s,c)=>{let a=O[c._def.typeName];return a&&!s.includes(a)?[...s,a]:s},[]);return{type:r.length>1?r:r[0]}}else if(t.every(r=>r._def.typeName==="ZodLiteral"&&!r.description)){let r=t.reduce((s,c)=>{let a=typeof c._def.value;switch(a){case"string":case"number":case"boolean":return[...s,a];case"bigint":return[...s,"integer"];case"object":if(c._def.value===null)return[...s,"null"];case"symbol":case"undefined":case"function":default:return s}},[]);if(r.length===t.length){let s=r.filter((c,a,i)=>i.indexOf(c)===a);return{type:s.length>1?s:s[0],enum:t.reduce((c,a)=>c.includes(a._def.value)?c:[...c,a._def.value],[])}}}else if(t.every(r=>r._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((r,s)=>[...r,...s._def.values.filter(c=>!r.includes(c))],[])};return ft(n,e)}var ft=(n,e)=>{let t=(n.options instanceof Map?Array.from(n.options.values()):n.options).map((r,s)=>m(r._def,{...e,currentPath:[...e.currentPath,"anyOf",`${s}`]})).filter(r=>!!r&&(!e.strictUnions||typeof r=="object"&&Object.keys(r).length>0));return t.length?{anyOf:t}:void 0};function bt(n,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(n.innerType._def.typeName)&&(!n.innerType._def.checks||!n.innerType._def.checks.length))return e.target==="openApi3"?{type:O[n.innerType._def.typeName],nullable:!0}:{type:[O[n.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let r=m(n.innerType._def,{...e,currentPath:[...e.currentPath]});return r&&"$ref"in r?{allOf:[r],nullable:!0}:r&&{...r,nullable:!0}}let t=m(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function yt(n,e){let t={type:"number"};if(!n.checks)return t;for(let r of n.checks)switch(r.kind){case"int":t.type="integer",ve(t,"type",r.message,e);break;case"min":e.target==="jsonSchema7"?r.inclusive?h(t,"minimum",r.value,r.message,e):h(t,"exclusiveMinimum",r.value,r.message,e):(r.inclusive||(t.exclusiveMinimum=!0),h(t,"minimum",r.value,r.message,e));break;case"max":e.target==="jsonSchema7"?r.inclusive?h(t,"maximum",r.value,r.message,e):h(t,"exclusiveMaximum",r.value,r.message,e):(r.inclusive||(t.exclusiveMaximum=!0),h(t,"maximum",r.value,r.message,e));break;case"multipleOf":h(t,"multipleOf",r.value,r.message,e);break}return t}import{ZodOptional as Rr}from"zod";function _t(n,e){let t=e.target==="openAi",r={type:"object",properties:{}},s=[],c=n.shape();for(let i in c){let l=c[i];if(l===void 0||l._def===void 0)continue;let f=wr(l);f&&t&&(l instanceof Rr&&(l=l._def.innerType),l.isNullable()||(l=l.nullable()),f=!1);let g=m(l._def,{...e,currentPath:[...e.currentPath,"properties",i],propertyPath:[...e.currentPath,"properties",i]});g!==void 0&&(r.properties[i]=g,f||s.push(i))}s.length&&(r.required=s);let a=Pr(n,e);return a!==void 0&&(r.additionalProperties=a),r}function Pr(n,e){if(n.catchall._def.typeName!=="ZodNever")return m(n.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(n.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function wr(n){try{return n.isOptional()}catch{return!0}}var xt=(n,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return m(n.innerType._def,e);let t=m(n.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:{}},t]}:{}};var vt=(n,e)=>{if(e.pipeStrategy==="input")return m(n.in._def,e);if(e.pipeStrategy==="output")return m(n.out._def,e);let t=m(n.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),r=m(n.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,r].filter(s=>s!==void 0)}};function St(n,e){return m(n.type._def,e)}function Rt(n,e){let r={type:"array",uniqueItems:!0,items:m(n.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return n.minSize&&h(r,"minItems",n.minSize.value,n.minSize.message,e),n.maxSize&&h(r,"maxItems",n.maxSize.value,n.maxSize.message,e),r}function Pt(n,e){return n.rest?{type:"array",minItems:n.items.length,items:n.items.map((t,r)=>m(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[]),additionalItems:m(n.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:n.items.length,maxItems:n.items.length,items:n.items.map((t,r)=>m(t._def,{...e,currentPath:[...e.currentPath,"items",`${r}`]})).reduce((t,r)=>r===void 0?t:[...t,r],[])}}function wt(){return{not:{}}}function Tt(){return{}}var Ct=(n,e)=>m(n.innerType._def,e);var Et=(n,e,t)=>{switch(e){case d.ZodString:return oe(n,t);case d.ZodNumber:return yt(n,t);case d.ZodObject:return _t(n,t);case d.ZodBigInt:return rt(n,t);case d.ZodBoolean:return nt();case d.ZodDate:return Se(n,t);case d.ZodUndefined:return wt();case d.ZodNull:return ht(t);case d.ZodArray:return tt(n,t);case d.ZodUnion:case d.ZodDiscriminatedUnion:return gt(n,t);case d.ZodIntersection:return ct(n,t);case d.ZodTuple:return Pt(n,t);case d.ZodRecord:return se(n,t);case d.ZodLiteral:return lt(n,t);case d.ZodEnum:return it(n);case d.ZodNativeEnum:return mt(n);case d.ZodNullable:return bt(n,t);case d.ZodOptional:return xt(n,t);case d.ZodMap:return ut(n,t);case d.ZodSet:return Rt(n,t);case d.ZodLazy:return()=>n.getter()._def;case d.ZodPromise:return St(n,t);case d.ZodNaN:case d.ZodNever:return dt();case d.ZodEffects:return at(n,t);case d.ZodAny:return et();case d.ZodUnknown:return Tt();case d.ZodDefault:return st(n,t);case d.ZodBranded:return ne(n,t);case d.ZodReadonly:return Ct(n,t);case d.ZodCatch:return ot(n,t);case d.ZodPipeline:return vt(n,t);case d.ZodFunction:case d.ZodVoid:case d.ZodSymbol:return;default:return(r=>{})(e)}};function m(n,e,t=!1){let r=e.seen.get(n);if(e.override){let i=e.override?.(n,e,r,t);if(i!==Ye)return i}if(r&&!t){let i=Tr(r,e);if(i!==void 0)return i}let s={def:n,path:e.currentPath,jsonSchema:void 0};e.seen.set(n,s);let c=Et(n,n.typeName,e),a=typeof c=="function"?m(c(),e):c;if(a&&Er(n,e,a),e.postProcess){let i=e.postProcess(a,n,e);return s.jsonSchema=a,i}return s.jsonSchema=a,a}var Tr=(n,e)=>{switch(e.$refStrategy){case"root":return{$ref:n.path.join("/")};case"relative":return{$ref:Cr(e.currentPath,n.path)};case"none":case"seen":return n.path.length<e.currentPath.length&&n.path.every((t,r)=>e.currentPath[r]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),{}):e.$refStrategy==="seen"?{}:void 0}},Cr=(n,e)=>{let t=0;for(;t<n.length&&t<e.length&&n[t]===e[t];t++);return[(n.length-t).toString(),...e.slice(t)].join("/")},Er=(n,e,t)=>(n.description&&(t.description=n.description,e.markdownDescription&&(t.markdownDescription=n.description)),t);var we=(n,e)=>{let t=Qe(e),r=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[f,g])=>({...l,[f]:m(g._def,{...t,currentPath:[...t.basePath,t.definitionPath,f]},!0)??{}}),{}):void 0,s=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,c=m(n._def,s===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,s]},!1)??{},a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(c.title=a);let i=s===void 0?r?{...c,[t.definitionPath]:r}:c:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,s].join("/"),[t.definitionPath]:{...r,[s]:c}};return t.target==="jsonSchema7"?i.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(i.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in i||"oneOf"in i||"allOf"in i||"type"in i&&Array.isArray(i.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),i};import{z as ae}from"zod";import{ZodType as kr}from"zod";var Te;(function(n){n.Completable="McpCompletable"})(Te||(Te={}));var j=class extends kr{_parse(e){let{ctx:t}=this._processInputParams(e),r=t.data;return this._def.type._parse({data:r,path:t.path,parent:t})}unwrap(){return this._def.type}};j.create=(n,e)=>new j({type:n,typeName:Te.Completable,complete:e.complete,...Ar(e)});function Ar(n){if(!n)return{};let{errorMap:e,invalid_type_error:t,required_error:r,description:s}=n;if(e&&(t||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:s}:{errorMap:(a,i)=>{var l,f;let{message:g}=n;return a.code==="invalid_enum_value"?{message:g??i.defaultError}:typeof i.data>"u"?{message:(l=g??r)!==null&&l!==void 0?l:i.defaultError}:a.code!=="invalid_type"?{message:i.defaultError}:{message:(f=g??t)!==null&&f!==void 0?f:i.defaultError}},description:s}}var ce=class{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new re(e,t)}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(W.shape.method.value),this.server.assertCanSetRequestHandler(Q.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(W,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,inputSchema:t.inputSchema?we(t.inputSchema,{strictUnions:!0}):jr}))})),this.server.setRequestHandler(Q,async(e,t)=>{let r=this._registeredTools[e.params.name];if(!r)throw new y(b.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Tool ${e.params.name} disabled`);if(r.inputSchema){let s=await r.inputSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new y(b.InvalidParams,`Invalid arguments for tool ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;try{return await Promise.resolve(a(c,t))}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}}else{let s=r.callback;try{return await Promise.resolve(s(t))}catch(c){return{content:[{type:"text",text:c instanceof Error?c.message:String(c)}],isError:!0}}}}),this._toolHandlersInitialized=!0)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(ee.shape.method.value),this.server.setRequestHandler(ee,async e=>{switch(e.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return this.handleResourceCompletion(e,e.params.ref);default:throw new y(b.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r=this._registeredPrompts[t.name];if(!r)throw new y(b.InvalidParams,`Prompt ${t.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Prompt ${t.name} disabled`);if(!r.argsSchema)return ie;let s=r.argsSchema.shape[e.params.argument.name];if(!(s instanceof j))return ie;let a=await s._def.complete(e.params.argument.value);return kt(a)}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(a=>a.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return ie;throw new y(b.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let s=r.resourceTemplate.completeCallback(e.params.argument.name);if(!s)return ie;let c=await s(e.params.argument.value);return kt(c)}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(V.shape.method.value),this.server.assertCanSetRequestHandler(U.shape.method.value),this.server.assertCanSetRequestHandler(J.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(V,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([c,a])=>a.enabled).map(([c,a])=>({uri:c,name:a.name,...a.metadata})),s=[];for(let c of Object.values(this._registeredResourceTemplates)){if(!c.resourceTemplate.listCallback)continue;let a=await c.resourceTemplate.listCallback(t);for(let i of a.resources)s.push({...i,...c.metadata})}return{resources:[...r,...s]}}),this.server.setRequestHandler(U,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([t,r])=>({name:t,uriTemplate:r.resourceTemplate.uriTemplate.toString(),...r.metadata}))})),this.server.setRequestHandler(J,async(e,t)=>{let r=new URL(e.params.uri),s=this._registeredResources[r.toString()];if(s){if(!s.enabled)throw new y(b.InvalidParams,`Resource ${r} disabled`);return s.readCallback(r,t)}for(let c of Object.values(this._registeredResourceTemplates)){let a=c.resourceTemplate.uriTemplate.match(r.toString());if(a)return c.readCallback(r,a,t)}throw new y(b.InvalidParams,`Resource ${r} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(B.shape.method.value),this.server.assertCanSetRequestHandler(G.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(B,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>({name:e,description:t.description,arguments:t.argsSchema?Ir(t.argsSchema):void 0}))})),this.server.setRequestHandler(G,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new y(b.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new y(b.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let s=await r.argsSchema.safeParseAsync(e.params.arguments);if(!s.success)throw new y(b.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${s.error.message}`);let c=s.data,a=r.callback;return await Promise.resolve(a(c,t))}else{let s=r.callback;return await Promise.resolve(s(t))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0)}resource(e,t,...r){let s;typeof r[0]=="object"&&(s=r.shift());let c=r[0];if(typeof t=="string"){if(this._registeredResources[t])throw new Error(`Resource ${t} is already registered`);let a={name:e,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({uri:null}),update:i=>{typeof i.uri<"u"&&i.uri!==t&&(delete this._registeredResources[t],i.uri&&(this._registeredResources[i.uri]=a)),typeof i.name<"u"&&(a.name=i.name),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResources[t]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}else{if(this._registeredResourceTemplates[e])throw new Error(`Resource template ${e} is already registered`);let a={resourceTemplate:t,metadata:s,readCallback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredResourceTemplates[e],i.name&&(this._registeredResourceTemplates[i.name]=a)),typeof i.template<"u"&&(a.resourceTemplate=i.template),typeof i.metadata<"u"&&(a.metadata=i.metadata),typeof i.callback<"u"&&(a.readCallback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendResourceListChanged()}};return this._registeredResourceTemplates[e]=a,this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}tool(e,...t){if(this._registeredTools[e])throw new Error(`Tool ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,inputSchema:s===void 0?void 0:ae.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredTools[e],i.name&&(this._registeredTools[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.paramsSchema<"u"&&(a.inputSchema=ae.object(i.paramsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=a,this.setToolRequestHandlers(),this.sendToolListChanged(),a}prompt(e,...t){if(this._registeredPrompts[e])throw new Error(`Prompt ${e} is already registered`);let r;typeof t[0]=="string"&&(r=t.shift());let s;t.length>1&&(s=t.shift());let c=t[0],a={description:r,argsSchema:s===void 0?void 0:ae.object(s),callback:c,enabled:!0,disable:()=>a.update({enabled:!1}),enable:()=>a.update({enabled:!0}),remove:()=>a.update({name:null}),update:i=>{typeof i.name<"u"&&i.name!==e&&(delete this._registeredPrompts[e],i.name&&(this._registeredPrompts[i.name]=a)),typeof i.description<"u"&&(a.description=i.description),typeof i.argsSchema<"u"&&(a.argsSchema=ae.object(i.argsSchema)),typeof i.callback<"u"&&(a.callback=i.callback),typeof i.enabled<"u"&&(a.enabled=i.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=a,this.setPromptRequestHandlers(),this.sendPromptListChanged(),a}isConnected(){return this.server.transport!==void 0}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}};var jr={type:"object"};function Ir(n){return Object.entries(n.shape).map(([e,t])=>({name:e,description:t.description,required:!t.isOptional()}))}function kt(n){return{completion:{values:n.slice(0,100),total:n.length,hasMore:n.length>100}}}var ie={completion:{values:[],hasMore:!1}};import jt from"node:process";var le=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
6
6
|
`);if(e===-1)return null;let t=this._buffer.toString("utf8",0,e).replace(/\r$/,"");return this._buffer=this._buffer.subarray(e+1),Mr(t)}clear(){this._buffer=void 0}};function Mr(n){return Ze.parse(JSON.parse(n))}function At(n){return JSON.stringify(n)+`
|
7
7
|
`}var pe=class{constructor(e=jt.stdin,t=jt.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new le,this._started=!1,this._ondata=r=>{this._readBuffer.append(r),this.processReadBuffer()},this._onerror=r=>{var s;(s=this.onerror)===null||s===void 0||s.call(this,r)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(var e,t;;)try{let r=this._readBuffer.readMessage();if(r===null)break;(e=this.onmessage)===null||e===void 0||e.call(this,r)}catch(r){(t=this.onerror)===null||t===void 0||t.call(this,r)}}async close(){var e;this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),(e=this.onclose)===null||e===void 0||e.call(this)}send(e){return new Promise(t=>{let r=At(e);this._stdout.write(r)?t():this._stdout.once("drain",t)})}};import{z as ue}from"zod";var Ce=process.env.personalToken||""||"";function It(n){try{let e=new URL(n),t=e.pathname,[,r]=t.match(/(?:file|design)\/([^/]+)/)||[],s=e.searchParams.get("node-id")||n.match(/node-id=([^&]+)/)||n.match(/#([^:]+:[^:]+)/),c=s?Array.isArray(s)?s[1]:s:"";if(!r)throw new Error("Invalid Figma link: fileKey not found");return{fileKey:r,nodeId:c||""}}catch{throw new Error("Invalid Figma link")}}function Mt(n){return n?n.length>214?{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u8D85\u8FC7214\u4E2A\u5B57\u7B26"}:/^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(n)?n.toLowerCase()==="node_modules"||n.toLowerCase()==="favicon.ico"?{isValid:!1,message:"\u4E0D\u80FD\u4F7F\u7528\u4FDD\u7559\u540D\u79F0\u4F5C\u4E3A\u9879\u76EE\u540D"}:{isValid:!0}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001-\u3001.\u3001~\uFF0C\u5982\u679C\u4F7F\u7528 scope \u5219\u9700\u8981\u4EE5 @ \u5F00\u5934"}:{isValid:!1,message:"\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"}}var me=new ce({name:"F2C MCP",version:"0.0.1"});x("notification",{message:"MCP server instance created"});me.tool("figma_to_html","Convert Figma nodes to HTML content",{personalToken:ue.string().default(Ce).describe("Your Figma personal access token"),figmaUrl:ue.string().describe("Figma design URL containing fileKey and nodeId")},async({personalToken:n=Ce,figmaUrl:e})=>{x("notification",{message:"Tool call received",params:{figmaUrl:e}});try{let{fileKey:t,nodeId:r}=It(e);if(!t)throw new Error("fileKey \u4E0D\u80FD\u4E3A\u7A7A");let s=new URL("https://f2c-figma-api.yy.com/api/nodes");s.searchParams.append("fileKey",t),s.searchParams.append("nodeIds",r),s.searchParams.append("personal_token",n),s.searchParams.append("format","html");let c=await fetch(s.toString());if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);return{content:[{type:"text",text:await c.text()}]}}catch(t){return x("error",{message:`Error: ${t.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${t.message}`}]}}});me.tool("\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6","\u521B\u5EFA\u6216\u65B0\u589EAstro\u7EC4\u4EF6\u901A\u8FC7\u7EC4\u4EF6\u540D\u5B57",{componentName:ue.string().regex(/^[A-Z][a-zA-Z0-9_]*$/,{message:"\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF"}).describe("\u7EC4\u4EF6\u7684\u540D\u5B57")},async({componentName:n})=>{x("notification",{message:"Creating Astro component",params:{componentName:n}});try{if(!n.match(/^[A-Z][a-zA-Z0-9_]*$/))throw new Error("\u7EC4\u4EF6\u540D\u79F0\u5FC5\u987B\u4EE5\u5927\u5199\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u53EA\u80FD\u5305\u542B\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF");try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new component ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFA Astro \u7EC4\u4EF6: ${n} , \u5728\u5F53\u524D\u76EE\u5F55\u4E0B: ${process.cwd()}`}]}}catch(e){throw new Error(`\u521B\u5EFA\u7EC4\u4EF6\u5931\u8D25: ${e.message}
|
8
|
-
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});me.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:ue.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{x("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=Mt(n);if(!e.isValid)throw new Error(e.message);try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\
|
8
|
+
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});me.tool("\u521B\u5EFAAstro\u9879\u76EE","\u901A\u8FC7\u9879\u76EE\u540D\u79F0\u521B\u5EFA\u65B0\u7684Astro\u9879\u76EE",{projectName:ue.string().describe("\u9879\u76EE\u7684\u540D\u79F0")},async({projectName:n})=>{x("notification",{message:"Creating Astro project",params:{projectName:n}});try{let e=Mt(n);if(!e.isValid)throw new Error(e.message);try{return Nt(`npx --registry=https://npm-registry.yy.com @astro/create-astro new project --name ${n}`,{stdio:"pipe",cwd:process.cwd(),env:process.env}),{content:[{type:"text",text:`\u6210\u529F\u521B\u5EFAAstro\u9879\u76EE: ${n}\u8DEF\u5F84:${process.cwd()}`}]}}catch(t){throw new Error(`\u521B\u5EFA\u9879\u76EE\u5931\u8D25: ${t.message}
|
9
9
|
\u8BF7\u786E\u4FDD\u60A8\u5728YY\u5185\u7F51\u73AF\u5883\u4E0B\u6267\u884C\u6B64\u64CD\u4F5C`)}}catch(e){return x("error",{message:`Error: ${e.message}`,code:-32e3}),{content:[{type:"text",text:`Error: ${e.message}`}]}}});async function Ot(){x("notification",{message:"Starting Figma-to-HTML service"});let n=new pe;x("notification",{message:"Transport layer initialized"}),await me.connect(n),x("notification",{message:"MCP server connected to stdio"})}Ot().catch(n=>{x("error",{message:`Server startup failed: ${n.message}`,code:-32e3}),process.exit(1)});
|