@coldbirds/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.js +1 -0
- package/dist/index.js +3 -0
- package/dist/json-schema-to-zod.js +1 -0
- package/dist/manifest.js +2 -0
- package/dist/mcp.fallback.json +3018 -0
- package/dist/tools.js +1 -0
- package/package.json +64 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ColdBirdsClient=exports.ApiError=void 0,exports.createClientFromEnv=createClientFromEnv;const axios_1=__importDefault(require("axios"));class ApiError extends Error{status;code;constructor(t,e){super(e.error),this.name="ApiError",this.status=t,this.code=e.code}}exports.ApiError=ApiError;function cleanParams(s){const t={};for(const[e,r]of Object.entries(s))r!==void 0&&(t[e]=r);return t}function toApiError(s){if(axios_1.default.isAxiosError(s)){const t=s,e=t.response?.status??0,r=t.response?.data;return new ApiError(e,{error:r?.error??t.message,code:r?.code})}return new ApiError(0,{error:s instanceof Error?s.message:String(s)})}class ColdBirdsClient{http;constructor(t){this.http=axios_1.default.create({baseURL:t.baseUrl.replace(/\/$/,""),headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json",Accept:"application/json"},validateStatus:e=>e>=200&&e<300})}async get(t,e){try{const r=await this.http.get(t,e?{params:cleanParams(e)}:void 0);return r.status===204?void 0:r.data}catch(r){throw toApiError(r)}}async post(t,e){try{const r=await this.http.post(t,e);return r.status===204?void 0:r.data}catch(r){throw toApiError(r)}}async patch(t,e){try{const r=await this.http.patch(t,e);return r.status===204?void 0:r.data}catch(r){throw toApiError(r)}}async delete(t){try{const e=await this.http.delete(t);return e.status===204?void 0:e.data}catch(e){throw toApiError(e)}}}exports.ColdBirdsClient=ColdBirdsClient;function createClientFromEnv(){const s=process.env.COLDBIRDS_API_KEY;if(!s)throw new Error("COLDBIRDS_API_KEY environment variable is required. Get your key from Settings \u2192 API Keys.");const t=process.env.COLDBIRDS_API_URL??"https://sequencer.coldbirds.com";return new ColdBirdsClient({apiKey:s,baseUrl:t})}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const mcp_js_1=require("@modelcontextprotocol/sdk/server/mcp.js"),stdio_js_1=require("@modelcontextprotocol/sdk/server/stdio.js"),client_1=require("./client"),manifest_1=require("./manifest"),tools_1=require("./tools"),pkg=require("../package.json"),DEFAULT_BASE_URL="https://sequencer.coldbirds.com";async function main(){const e=process.env.COLDBIRDS_API_URL??DEFAULT_BASE_URL,t=(0,client_1.createClientFromEnv)(),o=await(0,manifest_1.loadManifest)(e),s=new mcp_js_1.McpServer({name:pkg.name??"@coldbirds/mcp-server",version:pkg.version??"0.0.1"},{capabilities:{tools:{}}});(0,tools_1.registerTools)(s,t,o);const r=new stdio_js_1.StdioServerTransport;await s.connect(r)}main().catch(e=>{process.stderr.write(`Fatal: ${e instanceof Error?e.message:String(e)}
|
|
3
|
+
`),process.exit(1)});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.jsonSchemaToZod=jsonSchemaToZod;const v3_1=require("zod/v3"),STRING_FORMATS=new Set(["email","date-time","uri"]);function splitNullable(e){let t=e.nullable===!0,n;if(Array.isArray(e.type)){const r=e.type.filter(u=>u!=="null");if(e.type.includes("null")&&(t=!0),r.length!==1)throw new Error(`Unsupported type union: ${JSON.stringify(e.type)} (only [T, "null"] is allowed)`);n=r[0]}else n=e.type;return{baseType:n,nullable:t}}function buildString(e){if(e.format!==void 0&&!STRING_FORMATS.has(e.format))throw new Error(`Unsupported string format: ${e.format}`);let t=v3_1.z.string();return e.format==="email"?t=t.email():e.format==="date-time"?t=t.datetime({offset:!0}):e.format==="uri"&&(t=t.url()),typeof e.minLength=="number"&&(t=t.min(e.minLength)),typeof e.maxLength=="number"&&(t=t.max(e.maxLength)),t}function buildInteger(e){let t=v3_1.z.number().int();return typeof e.minimum=="number"&&(t=t.min(e.minimum)),typeof e.maximum=="number"&&(t=t.max(e.maximum)),t}function buildArray(e){if(!e.items)throw new Error("Array schema must declare `items`");let t=v3_1.z.array(jsonSchemaToZod(e.items));return typeof e.minItems=="number"&&(t=t.min(e.minItems)),typeof e.maxItems=="number"&&(t=t.max(e.maxItems)),t}function buildObject(e){const t=new Set(e.required??[]),n=e.properties??{},r={};for(const[l,i]of Object.entries(n)){const o=jsonSchemaToZod(i);r[l]=t.has(l)?o:o.optional()}const u=v3_1.z.object(r);return e.additionalProperties===!0?u.passthrough():u.strict()}function buildEnum(e){if(e.length===0)throw new Error("Enum must have at least one value");if(e.every(i=>typeof i=="string")){const[i,...o]=e;if(i===void 0)throw new Error("Enum first value missing");return v3_1.z.enum([i,...o])}const n=e.map(i=>{if(typeof i=="string"||typeof i=="number"||typeof i=="boolean")return v3_1.z.literal(i);throw new Error(`Unsupported enum literal type: ${typeof i}`)});if(n.length===1)return n[0];const[r,u,...l]=n;if(!r||!u)throw new Error("Enum union requires at least two literals");return v3_1.z.union([r,u,...l])}function applyModifiers(e,t,n){let r=e;return n&&(r=r.nullable()),t.default!==void 0&&(r=r.default(t.default)),t.description&&(r=r.describe(t.description)),r}function jsonSchemaToZod(e){if(e.enum&&e.enum.length>0){const{nullable:u}=splitNullable(e);return applyModifiers(buildEnum(e.enum),e,u)}const{baseType:t,nullable:n}=splitNullable(e);let r;switch(t){case"object":r=buildObject(e);break;case"string":r=buildString(e);break;case"integer":r=buildInteger(e);break;case"boolean":r=v3_1.z.boolean();break;case"array":r=buildArray(e);break;case void 0:throw new Error("Schema node missing `type` (and no `enum` provided)");default:throw new Error(`Unsupported JSON-Schema type: ${t}`)}return applyModifiers(r,e,n)}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadManifest=loadManifest,exports.loadBundledManifest=loadBundledManifest;const axios_1=__importDefault(require("axios")),v3_1=require("zod/v3"),mcp_fallback_json_1=__importDefault(require("./mcp.fallback.json")),HTTP_METHOD=v3_1.z.enum(["GET","POST","PATCH","DELETE"]),ToolSchema=v3_1.z.object({name:v3_1.z.string().min(1),title:v3_1.z.string().optional(),description:v3_1.z.string().min(1),inputSchema:v3_1.z.unknown(),outputSchema:v3_1.z.unknown().optional(),annotations:v3_1.z.unknown().optional(),_http:v3_1.z.object({method:HTTP_METHOD,path:v3_1.z.string().regex(/^\//,"_http.path must start with '/'")})}).passthrough(),ManifestSchema=v3_1.z.object({name:v3_1.z.string().optional(),version:v3_1.z.string().optional(),tools:v3_1.z.array(ToolSchema).min(1)}).passthrough(),FETCH_TIMEOUT_MS=5e3;async function loadManifest(t){const o=`${t.replace(/\/$/,"")}/mcp.json`;try{const e=await axios_1.default.get(o,{timeout:FETCH_TIMEOUT_MS,validateStatus:n=>n>=200&&n<300,headers:{Accept:"application/json"}});return ManifestSchema.parse(e.data)}catch(e){const n=e instanceof Error?e.message:String(e);return process.stderr.write(`[coldbirds-mcp] Falling back to bundled manifest (${n})
|
|
2
|
+
`),ManifestSchema.parse(mcp_fallback_json_1.default)}}function loadBundledManifest(){return ManifestSchema.parse(mcp_fallback_json_1.default)}
|