@buygit/mcp-server 0.4.0 → 0.4.1
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/README.md +2 -0
- package/dist/index.js +17 -17
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,6 +7,8 @@ MCP server for the **BuyGit Open Index** — 78,094 curated, deduplicated, licen
|
|
|
7
7
|
[](https://www.npmjs.com/package/@buygit/mcp-server)
|
|
8
8
|
[](https://github.com/genoxdeveloper/Buygit/blob/main/packages/mcp-server/LICENSE)
|
|
9
9
|
|
|
10
|
+
> Companion: **[`@buygit/cli`](https://www.npmjs.com/package/@buygit/cli)** — same answers from your shell. `npx @buygit/cli search "react form" --license MIT`.
|
|
11
|
+
|
|
10
12
|
## Why BuyGit over raw GitHub search?
|
|
11
13
|
|
|
12
14
|
Every tool returns a 4-axis signals block — the differentiator. No other MCP gives you this in one call.
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createServer as xe}from"http";import{StdioServerTransport as ve}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Se}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{Server as me}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as de,ListToolsRequestSchema as ye,ListResourceTemplatesRequestSchema as he,ListResourcesRequestSchema as fe,ReadResourceRequestSchema as _e,ListPromptsRequestSchema as be,GetPromptRequestSchema as we}from"@modelcontextprotocol/sdk/types.js";import{z as u}from"zod";import{Pool as q}from"undici";var h="0.4.
|
|
2
|
+
import{createServer as xe}from"http";import{StdioServerTransport as ve}from"@modelcontextprotocol/sdk/server/stdio.js";import{StreamableHTTPServerTransport as Se}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{Server as me}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as de,ListToolsRequestSchema as ye,ListResourceTemplatesRequestSchema as he,ListResourcesRequestSchema as fe,ReadResourceRequestSchema as _e,ListPromptsRequestSchema as be,GetPromptRequestSchema as we}from"@modelcontextprotocol/sdk/types.js";import{z as u}from"zod";import{Pool as q}from"undici";var h="0.4.1",_="@buygit/mcp-server";var A=process.env.BUYGIT_API_BASE||"https://buygit.com",D=`@buygit/mcp-server/${h} (+https://buygit.com/mcp)`,T=null;function N(e){return T===null&&(T=new q(e,{connections:4,keepAliveTimeout:6e4,keepAliveMaxTimeout:6e5})),T}var x=class extends Error{constructor(n,s,r){super(n);this.status=s;this.code=r;this.name="BuygitApiError"}status;code};async function p(e,t={},n={}){let r=N(A),i=Object.entries(t).filter(([,d])=>d!=null&&d!=="").map(([d,y])=>`${encodeURIComponent(d)}=${encodeURIComponent(String(y))}`).join("&"),c=i?`${e}?${i}`:e,l=await r.request({method:"GET",path:c,headers:{"user-agent":D,accept:"application/json"},headersTimeout:n.timeoutMs??12e3,bodyTimeout:n.timeoutMs??12e3}),a=l.statusCode,o=await l.body.text(),g=null;try{g=JSON.parse(o)}catch{throw new x(`upstream returned non-JSON (status ${a})`,a)}if(a>=400||g.ok===!1)throw new x(g.error??`upstream returned HTTP ${a}`,a,g.code);return g.data!==void 0?g.data:g}function M(e){if(!e)return null;let t=[];return t.push(e.license_category),t.push(`pop ${e.popularity}`),t.push(`risk ${e.risk}${e.risk>=40?" \u26A0":""}`),t.push(e.pricing_tier),`[${t.join(" \xB7 ")}]`}var U="\xA0";function L(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function R(e){return e.filter(t=>!!(t&&t.length>0)).join(" \xB7 ")}function H(e,t){let n=t!==void 0?`${t}. **${e.title}**`:`**${e.title}**`,s=R([e.stars>0?`\u2605${U}${L(e.stars)}`:null,e.license||null,e.language||null,e.category?e.category.name:null]),r=M(e.signals),i=e.signals?.license_warning;return[n,s?` ${s}`:null,r?` ${r}`:null,` ${e.short_description}`,i?` \u26A0 ${i}`:null,` ${e.url}`].filter(c=>c!==null).join(`
|
|
3
3
|
`)}function b(e,t){let n=t?.header?`${t.header}
|
|
4
4
|
|
|
5
|
-
`:"",
|
|
5
|
+
`:"",s=t?.footer?`
|
|
6
6
|
|
|
7
|
-
${t.footer}`:"";return e.length===0?`${n}_No results._${
|
|
7
|
+
${t.footer}`:"";return e.length===0?`${n}_No results._${s}`:n+e.map((r,i)=>H(r,i+1)).join(`
|
|
8
8
|
|
|
9
|
-
`)+
|
|
9
|
+
`)+s}function v(e){let t=[];t.push(`# ${e.title}`),t.push(""),t.push(R([e.repo_signals.stars>0?`\u2605 ${L(e.repo_signals.stars)}`:null,e.license,e.repo_signals.language,e.category?.name??null,e.source])),t.push(""),t.push(e.short_description),t.push(""),e.tags&&e.tags.length>0&&(t.push(`**Tags:** ${e.tags.slice(0,12).map(i=>`\`${i}\``).join(" ")}`),t.push(""));let n=[];e.safety_signals.secret_scan==="clean"?n.push("secret-scan: clean \u2713"):e.safety_signals.secret_scan==="flagged"?n.push("secret-scan: **flagged** \u26A0"):n.push("secret-scan: not run"),e.safety_signals.malware_flag&&n.push("**malware flag set** \u26A0"),e.repo_signals.upstream_status==="removed"&&n.push("**upstream removed** \u26A0"),t.push(`**Safety:** ${n.join(" \xB7 ")}`),t.push("");let s=e.signals;t.push(`**Signals:** license: ${s.license_category} \xB7 popularity: ${s.popularity}/100 \xB7 risk: ${s.risk}/100 \xB7 pricing: ${s.pricing_tier}`),s.license_warning&&t.push(`> \u26A0 ${s.license_warning}`),t.push("");let r=[];if(e.repo_signals.repo_url&&r.push(`repo: ${e.repo_signals.repo_url}`),e.repo_signals.default_branch&&r.push(`branch: \`${e.repo_signals.default_branch}\``),e.repo_signals.last_commit_at&&r.push(`last commit: ${e.repo_signals.last_commit_at.slice(0,10)}`),e.repo_signals.good_first_issues>0&&r.push(`good-first-issues: ${e.repo_signals.good_first_issues}`),r.length>0&&(t.push(`**Repo:** ${r.join(" \xB7 ")}`),t.push("")),e.full_description_md&&e.full_description_md.trim().length>0){let i=e.full_description_md.slice(0,1200);t.push("## Description"),t.push(i+(e.full_description_md.length>1200?`
|
|
10
10
|
|
|
11
11
|
_(truncated \u2014 see canonical page for full text)_`:"")),t.push("")}if(t.push(`**BuyGit listing:** ${e.url}`),e.attribution&&(t.push(""),t.push(`_Attribution:_ ${e.attribution}`)),e.similar&&e.similar.length>0){t.push(""),t.push("## Similar listings");for(let i of e.similar.slice(0,5))t.push(`- **${i.title}** \xB7 ${i.url}`)}return t.join(`
|
|
12
12
|
`)}function S(e){let t=["# Side-by-side comparison",""];for(let n of e){if("error"in n){t.push(`## \`${n.slug}\``),t.push("_not found in the crawler index_"),t.push("");continue}t.push(`## ${n.title}`),t.push(R([n.repo_signals.stars>0?`\u2605 ${L(n.repo_signals.stars)}`:null,n.license,n.repo_signals.language,n.category?.name??null])),t.push(""),t.push(n.short_description),t.push(""),t.push(`\u2192 ${n.url}`),t.push("")}return t.join(`
|
|
13
|
-
`)}function f(e,t){let n={content:[{type:"text",text:e}]};return t&&(n.structuredContent=t),n}function m(e){return{content:[{type:"text",text:e instanceof x?`BuyGit API error (${e.status}${e.code?` / ${e.code}`:""}): ${e.message}`:e instanceof Error?`Tool error: ${e.message}`:`Tool error: ${String(e)}`}],isError:!0}}var G={type:"object",description:"4-axis signals (license, popularity, risk, pricing). The defining BuyGit MCP differentiator \u2014 no other MCP returns license + supply-chain risk + popularity + pricing in a single call.",properties:{license_category:{type:"string",enum:["permissive","weak-copyleft","strong-copyleft","public-domain","proprietary","unknown"]},license_warning:{type:["string","null"],description:"Plain-English warning when the license needs attention; null when safe."},popularity:{type:"integer",minimum:0,maximum:100,description:"Log-scaled star score 0-100."},risk:{type:"integer",minimum:0,maximum:100,description:"Supply-chain risk score 0-100. 0 = clean. \u226540 = warn user before bundling."},price_usd:{type:"number",minimum:0},pricing_tier:{type:"string",enum:["free","paid"]}}},F=u.object({query:u.string().max(200).optional(),category:u.string().max(80).optional(),language:u.string().max(40).optional(),license:u.string().max(40).optional(),min_stars:u.number().int().min(0).optional(),limit:u.number().int().min(1).max(50).default(10),sort:u.enum(["relevance","newest","stars","health"]).default("relevance")}),X={name:"buygit_search",description:"Search 78,094 curated, deduplicated, license-tagged Git assets \u2014 not raw GitHub search. Every result carries license + popularity + supply-chain risk + pricing in one shot. Filters: category slug, language, SPDX license, min stars. Sort: relevance | newest | stars | health. Prefer this when the user wants to *use* or *buy* a project, compare alternatives, or check license compatibility. Use github-mcp for private repos / Issues / commits.",inputSchema:{type:"object",properties:{query:{type:"string",maxLength:200,description:"Free text query."},category:{type:"string",maxLength:80,description:"Category slug from buygit_list_categories."},language:{type:"string",maxLength:40,description:'Primary language e.g. "TypeScript".'},license:{type:"string",maxLength:40,description:'SPDX id e.g. "MIT".'},min_stars:{type:"integer",minimum:0},limit:{type:"integer",minimum:1,maximum:50,default:10},sort:{type:"string",enum:["relevance","newest","stars","health"],default:"relevance"}}},outputSchema:{type:"object",required:["count","has_more","results"],properties:{count:{type:"integer"},has_more:{type:"boolean"},results:{type:"array",items:{type:"object",properties:{slug:{type:"string"},title:{type:"string"},url:{type:"string"},license:{type:["string","null"]},stars:{type:"integer"},signals:G}}}}},handler:async e=>{let t=F.safeParse(e??{});if(!t.success)return m(`invalid arguments: ${t.error.message}`);let{query:n,category:
|
|
14
|
-
`),{categories:t.categories})}catch(t){return m(t)}}},V=u.object({period:u.enum(["day","week","month"]).default("week"),category:u.string().max(80).optional(),limit:u.number().int().min(1).max(50).default(10)}),W={name:"buygit_trending",description:'Top crawler listings ranked by recent activity (day | week | month), each carrying license + risk + popularity + pricing. Optionally narrow to a category. Use for "what is hot right now in <category>" \u2014 agent gets a curated, license-aware shortlist instead of GitHub trending noise.',inputSchema:{type:"object",properties:{period:{type:"string",enum:["day","week","month"],default:"week"},category:{type:"string",maxLength:80},limit:{type:"integer",minimum:1,maximum:50,default:10}}},outputSchema:{type:"object",required:["period","count","results"],properties:{period:{type:"string"},count:{type:"integer"},results:{type:"array"}}},handler:async e=>{let t=V.safeParse(e??{});if(!t.success)return m(t.error.message);let{period:n,category:
|
|
15
|
-
`),{total_listings:e.total_listings,last_indexed_at:e.last_indexed_at,by_license:e.by_license,by_category:e.by_category,by_source:e.by_source})}catch(e){return m(e)}}},ee=u.object({count:u.number().int().min(1).max(10).default(1),category:u.string().max(80).optional()}),te={name:"buygit_random",description:'Surface 1-10 random crawler listings, each with license + risk + popularity + pricing signals. Useful for "surprise me", category browsing, or seeding agent suggestions when the user has not specified intent. Optional `category` slug narrows the pool.',inputSchema:{type:"object",properties:{count:{type:"integer",minimum:1,maximum:10,default:1},category:{type:"string",maxLength:80}}},handler:async e=>{let t=ee.safeParse(e??{});if(!t.success)return m(t.error.message);try{let n=await p("/api/v1/crawler/random",{count:t.data.count,category:t.data.category});return f(b(n.results,{header:`**Random pick (${n.count})**`}),{count:n.count,results:n.results.map(
|
|
16
|
-
`);return f(
|
|
13
|
+
`)}function f(e,t){let n={content:[{type:"text",text:e}]};return t&&(n.structuredContent=t),n}function m(e){return{content:[{type:"text",text:e instanceof x?`BuyGit API error (${e.status}${e.code?` / ${e.code}`:""}): ${e.message}`:e instanceof Error?`Tool error: ${e.message}`:`Tool error: ${String(e)}`}],isError:!0}}var G={type:"object",description:"4-axis signals (license, popularity, risk, pricing). The defining BuyGit MCP differentiator \u2014 no other MCP returns license + supply-chain risk + popularity + pricing in a single call.",properties:{license_category:{type:"string",enum:["permissive","weak-copyleft","strong-copyleft","public-domain","proprietary","unknown"]},license_warning:{type:["string","null"],description:"Plain-English warning when the license needs attention; null when safe."},popularity:{type:"integer",minimum:0,maximum:100,description:"Log-scaled star score 0-100."},risk:{type:"integer",minimum:0,maximum:100,description:"Supply-chain risk score 0-100. 0 = clean. \u226540 = warn user before bundling."},price_usd:{type:"number",minimum:0},pricing_tier:{type:"string",enum:["free","paid"]}}},F=u.object({query:u.string().max(200).optional(),category:u.string().max(80).optional(),language:u.string().max(40).optional(),license:u.string().max(40).optional(),min_stars:u.number().int().min(0).optional(),limit:u.number().int().min(1).max(50).default(10),sort:u.enum(["relevance","newest","stars","health"]).default("relevance")}),X={name:"buygit_search",description:"Search 78,094 curated, deduplicated, license-tagged Git assets \u2014 not raw GitHub search. Every result carries license + popularity + supply-chain risk + pricing in one shot. Filters: category slug, language, SPDX license, min stars. Sort: relevance | newest | stars | health. Prefer this when the user wants to *use* or *buy* a project, compare alternatives, or check license compatibility. Use github-mcp for private repos / Issues / commits.",inputSchema:{type:"object",properties:{query:{type:"string",maxLength:200,description:"Free text query."},category:{type:"string",maxLength:80,description:"Category slug from buygit_list_categories."},language:{type:"string",maxLength:40,description:'Primary language e.g. "TypeScript".'},license:{type:"string",maxLength:40,description:'SPDX id e.g. "MIT".'},min_stars:{type:"integer",minimum:0},limit:{type:"integer",minimum:1,maximum:50,default:10},sort:{type:"string",enum:["relevance","newest","stars","health"],default:"relevance"}}},outputSchema:{type:"object",required:["count","has_more","results"],properties:{count:{type:"integer"},has_more:{type:"boolean"},results:{type:"array",items:{type:"object",properties:{slug:{type:"string"},title:{type:"string"},url:{type:"string"},license:{type:["string","null"]},stars:{type:"integer"},signals:G}}}}},handler:async e=>{let t=F.safeParse(e??{});if(!t.success)return m(`invalid arguments: ${t.error.message}`);let{query:n,category:s,language:r,license:i,min_stars:c,limit:l,sort:a}=t.data;try{let o=await p("/api/v1/crawler/search",{q:n,category:s,language:r,license:i,min_stars:c,limit:l,sort:a}),g=[`**${o.results.length} result(s)**`,n?`for "${n}"`:null,s?`\xB7 category: ${s}`:null,r?`\xB7 lang: ${r}`:null,i?`\xB7 license: ${i}`:null,c?`\xB7 \u2265${c}\u2605`:null,`\xB7 sort: ${a}`].filter(Boolean).join(" "),d=o.has_more?"_More results available. Call again with a narrower filter, or use buygit_get_listing(slug) on any of these for full detail._":"_Call buygit_get_listing(slug) on any result for full detail._";return f(b(o.results,{header:g,footer:d}),{count:o.results.length,has_more:o.has_more,results:o.results.map(y=>({slug:y.slug,title:y.title,url:y.url,license:y.license,stars:y.stars,signals:y.signals}))})}catch(o){return m(o)}}},z=u.object({slug:u.string().regex(/^[a-z0-9\-]+$/i).max(200)}),Y={name:"buygit_get_listing",description:"Full detail for one BuyGit listing \u2014 replaces 3 separate MCP calls (license + supply-chain risk + popularity in one response). Includes secret-scan status, malware flag, upstream health, repo signals (stars, forks, last commit, language), full description, license classification with compatibility warning, pricing, and up to 5 similar listings. Slug must come from a prior buygit_search / trending / random / compare result.",inputSchema:{type:"object",required:["slug"],properties:{slug:{type:"string",pattern:"^[a-z0-9\\-]+$",maxLength:200,description:"Listing slug from a previous tool call."}}},outputSchema:{type:"object",required:["slug","title","url","signals"],properties:{slug:{type:"string"},title:{type:"string"},url:{type:"string"},license:{type:["string","null"]},signals:G}},handler:async e=>{let t=z.safeParse(e??{});if(!t.success)return m(`invalid slug: ${t.error.message}`);try{let n=await p(`/api/v1/crawler/listings/${encodeURIComponent(t.data.slug)}`),s={...n,rating_block:n.rating??{avg:null,count:0}};return f(v(s),{slug:s.slug,title:s.title,url:s.url,license:s.license,signals:s.signals,safety:s.safety_signals,repo:{stars:s.repo_signals.stars,forks:s.repo_signals.forks,language:s.repo_signals.language,last_commit_at:s.repo_signals.last_commit_at,upstream_status:s.repo_signals.upstream_status}})}catch(n){return m(n)}}},J={name:"buygit_list_categories",description:"Full BuyGit Open Index taxonomy with per-category crawler listing counts. Use this to find a category slug for buygit_search, or to discover what is in the catalog. Counts are accurate to the last crawl (typically <24h).",inputSchema:{type:"object",properties:{}},outputSchema:{type:"object",required:["categories"],properties:{categories:{type:"array",items:{type:"object"}}}},handler:async()=>{try{let s=function(r,i){let c=" ".repeat(i);n.push(`${c}- **${r.name}** \`${r.slug}\` \xB7 ${r.crawler_listing_count}`);for(let l of r.children)s(l,i+1)};var e=s;let t=await p("/api/v1/crawler/categories"),n=["**BuyGit category tree** (crawler listings only)",""];for(let r of t.categories)s(r,0);return n.push(""),n.push("_Pick a slug and pass it as `category` to `buygit_search` to filter._"),f(n.join(`
|
|
14
|
+
`),{categories:t.categories})}catch(t){return m(t)}}},V=u.object({period:u.enum(["day","week","month"]).default("week"),category:u.string().max(80).optional(),limit:u.number().int().min(1).max(50).default(10)}),W={name:"buygit_trending",description:'Top crawler listings ranked by recent activity (day | week | month), each carrying license + risk + popularity + pricing. Optionally narrow to a category. Use for "what is hot right now in <category>" \u2014 agent gets a curated, license-aware shortlist instead of GitHub trending noise.',inputSchema:{type:"object",properties:{period:{type:"string",enum:["day","week","month"],default:"week"},category:{type:"string",maxLength:80},limit:{type:"integer",minimum:1,maximum:50,default:10}}},outputSchema:{type:"object",required:["period","count","results"],properties:{period:{type:"string"},count:{type:"integer"},results:{type:"array"}}},handler:async e=>{let t=V.safeParse(e??{});if(!t.success)return m(t.error.message);let{period:n,category:s,limit:r}=t.data;try{let i=await p("/api/v1/crawler/trending",{period:n,category:s,limit:r}),c=`**Trending (${n}${s?` \xB7 ${s}`:""})** \u2014 ${i.count} listing(s)`;return f(b(i.results,{header:c,footer:"_Call buygit_get_listing(slug) for full detail._"}),{period:i.period,count:i.count,results:i.results.map(l=>({slug:l.slug,title:l.title,url:l.url,license:l.license,stars:l.stars,signals:l.signals}))})}catch(i){return m(i)}}},Z=u.object({slugs:u.array(u.string().regex(/^[a-z0-9\-]+$/i)).min(2).max(5)}),K={name:"buygit_compare",description:"Single-call side-by-side of 2-5 listings: license category, license_warning, popularity score, risk score, pricing, repo signals. Equivalent github-mcp / Smithery workflows need 4+ calls and do not return license compatibility. Pass slugs from prior tool results; unknown slugs come back as `not found` entries instead of erroring.",inputSchema:{type:"object",required:["slugs"],properties:{slugs:{type:"array",items:{type:"string",pattern:"^[a-z0-9\\-]+$"},minItems:2,maxItems:5}}},outputSchema:{type:"object",required:["items"],properties:{items:{type:"array"}}},handler:async e=>{let t=Z.safeParse(e??{});if(!t.success)return m(t.error.message);try{let s=(await p("/api/v1/crawler/compare",{slugs:t.data.slugs.join(",")})).items.map(r=>{if("error"in r)return r;let i=r;return{...i,rating_block:i.rating??{avg:null,count:0}}});return f(S(s),{items:s.map(r=>"error"in r?r:{slug:r.slug,title:r.title,url:r.url,license:r.license,signals:r.signals})})}catch(n){return m(n)}}},Q={name:"buygit_stats",description:'BuyGit Open Index meta \u2014 total listings, license breakdown, top categories, source providers, last_indexed_at. Useful for "how big is the catalog?", "what license is most common?", or proving the curated catalog size before recommending it.',inputSchema:{type:"object",properties:{}},outputSchema:{type:"object",required:["total_listings"],properties:{total_listings:{type:"integer"},last_indexed_at:{type:["string","null"]},by_license:{type:"array"},by_category:{type:"array"},by_source:{type:"array"}}},handler:async()=>{try{let e=await p("/api/v1/crawler/stats"),t=[];t.push(`**BuyGit Open Index \u2014 ${e.total_listings.toLocaleString()} crawler listings**`),t.push(""),e.last_indexed_at&&t.push(`Last indexed: ${e.last_indexed_at}`),t.push(""),t.push("**Top licenses**");for(let n of e.by_license.slice(0,8))t.push(`- ${n.license}: ${n.count.toLocaleString()}`);t.push(""),t.push("**Top categories**");for(let n of e.by_category.slice(0,10))t.push(`- ${n.name} \`${n.slug}\`: ${n.count.toLocaleString()}`);t.push(""),t.push("**Sources**");for(let n of e.by_source.slice(0,10))t.push(`- ${n.source}: ${n.count.toLocaleString()}`);return f(t.join(`
|
|
15
|
+
`),{total_listings:e.total_listings,last_indexed_at:e.last_indexed_at,by_license:e.by_license,by_category:e.by_category,by_source:e.by_source})}catch(e){return m(e)}}},ee=u.object({count:u.number().int().min(1).max(10).default(1),category:u.string().max(80).optional()}),te={name:"buygit_random",description:'Surface 1-10 random crawler listings, each with license + risk + popularity + pricing signals. Useful for "surprise me", category browsing, or seeding agent suggestions when the user has not specified intent. Optional `category` slug narrows the pool.',inputSchema:{type:"object",properties:{count:{type:"integer",minimum:1,maximum:10,default:1},category:{type:"string",maxLength:80}}},handler:async e=>{let t=ee.safeParse(e??{});if(!t.success)return m(t.error.message);try{let n=await p("/api/v1/crawler/random",{count:t.data.count,category:t.data.category});return f(b(n.results,{header:`**Random pick (${n.count})**`}),{count:n.count,results:n.results.map(s=>({slug:s.slug,title:s.title,url:s.url,license:s.license,stars:s.stars,signals:s.signals}))})}catch(n){return m(n)}}},ne=u.object({query:u.string().min(1).max(200).describe("A library / repo name or short description to find alternatives to."),language:u.string().max(40).optional(),license:u.string().max(40).optional(),limit:u.number().int().min(1).max(20).default(8)}),se={name:"buygit_find_alternative",description:'Find license-compatible, risk-scored alternatives to a library or repo \u2014 the answer GitHub search cannot give (raw search ranks by stars and lacks license/risk signals). Filter by language and required license (e.g. MIT-only). Use when the user says "what can replace X?", "alternatives to Y", or "the GPL version of Z is blocking me, find an MIT one".',inputSchema:{type:"object",required:["query"],properties:{query:{type:"string",minLength:1,maxLength:200,description:"Library or repo to find alternatives for."},language:{type:"string",maxLength:40},license:{type:"string",maxLength:40,description:"SPDX id to restrict alternatives (e.g. MIT to exclude GPL)."},limit:{type:"integer",minimum:1,maximum:20,default:8}}},handler:async e=>{let t=ne.safeParse(e??{});if(!t.success)return m(t.error.message);let{query:n,language:s,license:r,limit:i}=t.data;try{let c=await p("/api/v1/crawler/search",{q:n,language:s,license:r,limit:i,sort:"stars"}),l=c.results.filter(o=>!o.title.toLowerCase().includes(n.toLowerCase().split(/[\s/]/)[0]??"")),a=l.length>=3?l:c.results;return f(b(a,{header:`**Alternatives to "${n}"** ${s?`(${s})`:""}${r?` \xB7 ${r}-only`:""}`.trim(),footer:"_If none of these fit, try `buygit_search` with a more specific query._"}),{query:n,count:a.length,results:a.map(o=>({slug:o.slug,title:o.title,url:o.url,license:o.license,stars:o.stars,signals:o.signals}))})}catch(c){return m(c)}}},re=u.object({source:u.string().max(60).describe('SPDX id of the dependency you want to use (e.g. "GPL-3.0").'),target:u.string().max(60).describe('SPDX id of the project you want to bundle it into (e.g. "MIT").')}),ie={name:"buygit_check_license_compat",description:'Check whether SPDX license A can be bundled into a project licensed under SPDX license B. Returns one of compatible / review / incompatible with a plain-English note. The only MCP that answers "Is GPL-3.0 safe in my MIT project?" without a separate SCA tool. Hint, not legal advice.',inputSchema:{type:"object",required:["source","target"],properties:{source:{type:"string",maxLength:60,description:"SPDX id of the dependency."},target:{type:"string",maxLength:60,description:"SPDX id of the bundling project."}}},outputSchema:{type:"object",required:["source","target","verdict","note"],properties:{source:{type:"object",properties:{spdx:{type:"string"},category:{type:"string"}}},target:{type:"object",properties:{spdx:{type:"string"},category:{type:"string"}}},verdict:{type:"string",enum:["compatible","review","incompatible"]},note:{type:"string"}}},handler:async e=>{let t=re.safeParse(e??{});if(!t.success)return m(t.error.message);try{let n=await p("/api/v1/crawler/license-compat",{source:t.data.source,target:t.data.target}),s=n.verdict==="compatible"?"\u2705":n.verdict==="incompatible"?"\u274C":"\u26A0\uFE0F",r=[`# License compatibility: ${t.data.source} \u2192 ${t.data.target}`,"",`${s} **${n.verdict.toUpperCase()}**`,"",`- Source: ${n.source.spdx} (\`${n.source.category}\`)`,`- Target: ${n.target.spdx} (\`${n.target.category}\`)`,"",`> ${n.note}`,"",`_${n.disclaimer}_`].join(`
|
|
16
|
+
`);return f(r,n)}catch(n){return m(n)}}},ae=u.object({url:u.string().url().max(400).describe("External GitHub repository URL (e.g. https://github.com/owner/repo).")}),oe={name:"buygit_audit_repo",description:'Audit any external GitHub repo (not just BuyGit catalog) \u2014 returns license + supply-chain risk + popularity + repo signals in one shot. If the repo is already in our catalog, uses the richer cached signals. Otherwise lives-probes the GitHub REST API. Use for "is github.com/X/Y safe to bundle?" or "what license is github.com/X/Y under?".',inputSchema:{type:"object",required:["url"],properties:{url:{type:"string",format:"uri",maxLength:400,description:"github.com/{owner}/{repo} URL."}}},handler:async e=>{let t=ae.safeParse(e??{});if(!t.success)return m(t.error.message);try{let n=await p("/api/v1/crawler/audit-external",{url:t.data.url});if(n.source==="catalog"&&n.listing){let s=[`# Audit: ${n.listing.title}`,"","_Already in BuyGit catalog \u2014 using cached signals._","",`- License: \`${n.listing.license??"unknown"}\``,n.listing.signals?`- Signals: license=${n.listing.signals.license_category} \xB7 popularity=${n.listing.signals.popularity}/100 \xB7 risk=${n.listing.signals.risk}/100 \xB7 pricing=${n.listing.signals.pricing_tier}`:"",n.listing.signals?.license_warning?`
|
|
17
17
|
> \u26A0 ${n.listing.signals.license_warning}`:"","",`[Catalog page](${n.listing.url})`].filter(Boolean).join(`
|
|
18
|
-
`);return f(
|
|
19
|
-
> \u26A0 ${
|
|
20
|
-
`);return f(
|
|
21
|
-
`);return f(
|
|
22
|
-
`)}}if(n==="category-tree"){let g=function(d,y){let k=" ".repeat(y);
|
|
23
|
-
`)}}if(n==="trending"){if(!
|
|
24
|
-
`)}}if(n==="listing"){if(!j.test(
|
|
18
|
+
`);return f(s,n)}if(n.audit){let s=n.audit,r=[];s.signals.risk<40?(r.push("Use `socket-mcp` to verify malware / typosquat status (we did not run a fresh scan)."),r.push("Use OpenSSF Scorecard to check branch protection, signed commits, and SAST coverage.")):r.push("Risk score is \u226540 \u2014 STRONGLY recommend running `socket-mcp` + TruffleHog before bundling.");let i=[`# Audit: ${s.title}`,"","_Live GitHub probe \u2014 not in BuyGit catalog._","",`${s.short_description}`,"",`- Repo: ${s.repo_url}`,`- License: \`${s.license??"unknown"}\` (${s.signals.license_category})`,`- Stars: \u2605 ${s.stars.toLocaleString()} \xB7 Forks: ${s.forks} \xB7 Open issues: ${s.open_issues}`,`- Language: ${s.language??"unknown"} \xB7 Branch: \`${s.default_branch}\``,`- Last commit: ${s.last_commit_at?.slice(0,10)??"unknown"}${s.archived?" \xB7 **archived** \u26A0":""}${s.disabled?" \xB7 **disabled** \u26A0":""}`,`- Signals: popularity=${s.signals.popularity}/100 \xB7 risk=${s.signals.risk}/100${s.signals.risk>=40?" \u26A0":""}`,s.signals.license_warning?`
|
|
19
|
+
> \u26A0 ${s.signals.license_warning}`:"","","## Deeper checks (route to companion MCPs)",...r.map(c=>`- ${c}`),"",n.caveat?`_${n.caveat}_`:""].filter(Boolean).join(`
|
|
20
|
+
`);return f(i,{...n,companion_mcps:r})}return m("unexpected audit response shape")}catch(n){return m(n)}}},ce=u.object({intent:u.string().min(1).max(200).describe('Plain-English description of what the user wants. e.g. "find an MIT alternative to React" \u2192 returns buygit_find_alternative.')}),le=[{pattern:/\b(license|spdx|gpl|agpl|mit|apache|copyleft).*(compat|combin|bundle|safe|conflict|allow|relicens|redistribut)/i,tool:"buygit_check_license_compat",reason:"license compatibility verdict"},{pattern:/\b(can i (use|bundle|combine|ship)|legal (risk|status)|copyleft (concern|conflict))/i,tool:"buygit_check_license_compat",reason:"license-compat \u2014 can-I-use phrasing"},{pattern:/\b(alternative|replace|instead of|swap|substitute|similar to|drop[- ]in)\b/i,tool:"buygit_find_alternative",reason:"license-filtered alternative search"},{pattern:/\b(audit|safe to use|safe to bundle|is .* safe|github\.com\/[^\s]+\/[^\s]+|check (this|the) repo)/i,tool:"buygit_audit_repo",reason:"external repo audit (live GitHub probe)"},{pattern:/\b(supply[- ]chain|malware|secret leak|abandoned|archived|maintainer warning)/i,tool:"buygit_audit_repo",reason:"supply-chain / safety probe"},{pattern:/\b(compare|side[- ]by[- ]side|vs\.?|versus|diff|which is better|head[- ]to[- ]head)\b/i,tool:"buygit_compare",reason:"multi-listing side-by-side compare"},{pattern:/\b(trending|hot|popular this (week|month|day)|hottest|rising|gaining stars)\b/i,tool:"buygit_trending",reason:"recent-activity trending list"},{pattern:/\b(random|surprise me|pick (one|a few)|browse|explore)\b/i,tool:"buygit_random",reason:"random catalog pick"},{pattern:/\b(categor(y|ies)|taxonomy|tree|list (the )?categor|what (categories|tags))/i,tool:"buygit_list_categories",reason:"full taxonomy with counts"},{pattern:/\b(stats|how (many|big)|total (listings|repos)|catalog size|last (index|crawl)|freshness|how fresh)/i,tool:"buygit_stats",reason:"catalog meta + data freshness"},{pattern:/\b(detail|full info|describe|what is|tell me about|info on|details for)\b/i,tool:"buygit_get_listing",reason:"full listing detail (license + risk + repo signals)"},{pattern:/\b(find|discover|recommend|suggest|search|need a|looking for) .{0,80}(library|repo|package|starter|kit|tool|framework|template|boilerplate)/i,tool:"buygit_search",reason:"curated search across 78,094 license-tagged assets"},{pattern:/\b(mit|apache|bsd|gpl|agpl|license[d]? as)\b/i,tool:"buygit_search",reason:"license-filtered search (pass license= filter)"}],ue={name:"search_tools",description:"Meta tool \u2014 given a plain-English intent, returns the most appropriate BuyGit tool(s) to call next, ranked. Implements MCP Tool Search Tool semantics. Saves the agent from listing every tool description when only one will fit the user's ask.",inputSchema:{type:"object",required:["intent"],properties:{intent:{type:"string",minLength:1,maxLength:200,description:"What the user wants to do, in plain language."}}},outputSchema:{type:"object",required:["intent","recommendations"],properties:{intent:{type:"string"},recommendations:{type:"array",items:{type:"object",required:["tool","reason"],properties:{tool:{type:"string"},reason:{type:"string"},confidence:{type:"number",minimum:0,maximum:1}}}}}},handler:async e=>{let t=ce.safeParse(e??{});if(!t.success)return m(t.error.message);let n=t.data.intent,s=[];for(let i of le)i.pattern.test(n)&&s.push({tool:i.tool,reason:i.reason,confidence:.85});s.length===0&&s.push({tool:"buygit_search",reason:"general curated search across 78,094 license-tagged assets \u2014 the default entrypoint for find / discover / suggest queries",confidence:.5});let r=[`**Routing for intent:** "${n}"`,"",...s.map((i,c)=>`${c+1}. \`${i.tool}\` (confidence ${i.confidence.toFixed(2)}) \u2014 ${i.reason}`)].join(`
|
|
21
|
+
`);return f(r,{intent:n,recommendations:s})}},P=[X,Y,J,W,K,Q,te,se,ie,oe,ue];var B=[{uriTemplate:"buygit://listing/{slug}",name:"BuyGit listing",description:"Full Markdown detail for a single crawler-imported listing, including 4-axis signals (license_category + license_warning + popularity + risk + pricing). Replace {slug} with the slug from a previous search/trending result.",mimeType:"text/markdown"},{uriTemplate:"buygit://category/{slug}",name:"BuyGit category top listings",description:"Markdown summary of a category \u2014 the top 20 crawler listings by stars within it, each with license + risk + popularity badges. Replace {slug} with a category slug from buygit_list_categories.",mimeType:"text/markdown"},{uriTemplate:"buygit://compare/{slugs}",name:"BuyGit side-by-side comparison",description:'Compare 2-5 listings in a single resource fetch. Replace {slugs} with a "+"-joined list of 2-5 slugs (e.g. `react+vue+svelte`). Returns license_category, license_warning, popularity, risk, and pricing for every slug \u2014 the answer github-mcp / Smithery cannot give in one call.',mimeType:"text/markdown"},{uriTemplate:"buygit://trending/{period}",name:"BuyGit trending (cacheable)",description:"Top 20 trending crawler listings for a period: `day` | `week` | `month`. Each carries license + risk + popularity. Pin once, re-reference \u2014 saves a tools/call per turn.",mimeType:"text/markdown"},{uriTemplate:"buygit://stats",name:"BuyGit catalog stats (cacheable)",description:"Catalog meta \u2014 total listings, by-license / by-category / by-source breakdowns, last_indexed_at + data_freshness (hours since last index, recent-commit counts, archived count). Pin to know catalog scale + freshness without burning a tools/call.",mimeType:"text/markdown"},{uriTemplate:"buygit://category-tree",name:"BuyGit category tree (cacheable)",description:"Full BuyGit category taxonomy with per-category crawler listing counts. Pin once to use as a category-slug lookup table.",mimeType:"text/markdown"},{uriTemplate:"buygit://license/{spdx}",name:"BuyGit license matrix row",description:"Compatibility matrix row for a given SPDX license id. Returns how the license interacts with permissive / weak-copyleft / strong-copyleft / public-domain / proprietary / unknown targets. Source-of-truth for `buygit_check_license_compat` answers.",mimeType:"text/markdown"}],ge=/^buygit:\/\/(listing|category|compare|trending|stats|category-tree|license)(?:\/(.+))?$/i,j=/^[a-z0-9\-]+$/i,pe=/^[A-Za-z0-9.\-+]+$/;async function C(e){let t=ge.exec(e);if(!t)throw new Error(`unsupported resource uri: ${e}`);let[,n,s]=t;if(n==="stats"){let a=await p("/api/v1/crawler/stats"),o=[];o.push("# BuyGit catalog stats"),o.push(""),o.push(`- Total listings: **${a.total_listings.toLocaleString()}**`),a.last_indexed_at&&o.push(`- Last indexed: ${a.last_indexed_at}`),a.data_freshness&&(o.push(`- Hours since last index: ${a.data_freshness.hours_since_last_index??"n/a"}`),o.push(`- Recent commits (30d): ${a.data_freshness.listings_with_recent_commit_30d.toLocaleString()}`),o.push(`- Recent commits (180d): ${a.data_freshness.listings_with_recent_commit_180d.toLocaleString()}`),o.push(`- Archived listings: ${a.data_freshness.listings_archived.toLocaleString()}`)),o.push(""),o.push("## Top licenses");for(let g of a.by_license.slice(0,10))o.push(`- ${g.license}: ${g.count.toLocaleString()}`);o.push(""),o.push("## Top categories");for(let g of a.by_category.slice(0,10))o.push(`- ${g.name} \`${g.slug}\`: ${g.count.toLocaleString()}`);return{uri:e,mimeType:"text/markdown",text:o.join(`
|
|
22
|
+
`)}}if(n==="category-tree"){let g=function(d,y){let k=" ".repeat(y);o.push(`${k}- **${d.name}** \`${d.slug}\` \xB7 ${d.crawler_listing_count}`);for(let $ of d.children)g($,y+1)};var l=g;let a=await p("/api/v1/crawler/categories"),o=["# BuyGit category tree (crawler listings only)",""];for(let d of a.categories)g(d,0);return{uri:e,mimeType:"text/markdown",text:o.join(`
|
|
23
|
+
`)}}if(n==="trending"){if(!s||!/^(day|week|month)$/.test(s))throw new Error(`trending uri must be day|week|month, got ${s}`);let a=await p("/api/v1/crawler/trending",{period:s,limit:20});return{uri:e,mimeType:"text/markdown",text:b(a.results,{header:`# Trending (${s}) \u2014 top ${a.count}`,footer:"_Pinned resource \u2014 agent may re-reference without a tools/call._"})}}if(n==="license"){if(!s||!pe.test(s))throw new Error(`invalid SPDX id in uri: ${s}`);let a=await p("/api/v1/crawler/license-compat",{});if(!("matrix"in a))throw new Error("unexpected license-compat shape");let g=(await p("/api/v1/crawler/license-compat",{source:s,target:"MIT"})).source.category,d=a.matrix[g];if(!d)throw new Error(`no matrix row for category ${g}`);let y=[`# License compatibility: ${s} (\`${g}\`)`,""];for(let[k,$]of Object.entries(d)){let O=$.verdict==="compatible"?"\u2705":$.verdict==="incompatible"?"\u274C":"\u26A0\uFE0F";y.push(`${O} **${k}** \u2014 ${$.verdict}`),y.push(`> ${$.note}`),y.push("")}return y.push(`_${a.disclaimer}_`),{uri:e,mimeType:"text/markdown",text:y.join(`
|
|
24
|
+
`)}}if(n==="listing"){if(!j.test(s))throw new Error(`invalid slug in uri: ${e}`);let a=await p(`/api/v1/crawler/listings/${encodeURIComponent(s)}`),o={...a,rating_block:a.rating??{avg:null,count:0}};return{uri:e,mimeType:"text/markdown",text:v(o)}}if(n==="category"){if(!j.test(s))throw new Error(`invalid category slug in uri: ${e}`);let a=await p("/api/v1/crawler/search",{category:s,sort:"stars",limit:20});return{uri:e,mimeType:"text/markdown",text:b(a.results,{header:`**Category: \`${s}\` \u2014 top 20 by stars**`,footer:a.has_more?"_More listings exist \u2014 use buygit_search with this category to paginate._":void 0})}}let r=s.split("+").map(a=>a.trim()).filter(Boolean);if(r.length<2||r.length>5)throw new Error(`compare uri must contain 2-5 slugs joined by '+', got ${r.length}`);for(let a of r)if(!j.test(a))throw new Error(`invalid slug in compare uri: ${a}`);let c=(await p("/api/v1/crawler/compare",{slugs:r.join(",")})).items.map(a=>{if("error"in a)return a;let o=a;return{...o,rating_block:o.rating??{avg:null,count:0}}});return{uri:e,mimeType:"text/markdown",text:S(c)}}var I=[{name:"starter_for_stack",description:"Recommend BuyGit Open Index starter kits / templates for a given stack.",arguments:[{name:"stack",description:'Tech stack the user is building on (e.g. "Next.js + Supabase + Stripe").',required:!0},{name:"budget",description:"Free / under_50 / under_200 / any (default any).",required:!1}],render:e=>({description:`Find starter kits for: ${e.stack}`,messages:[{role:"user",content:{type:"text",text:`I'm building a project on **${e.stack}**${e.budget?` (budget: ${e.budget})`:""}.
|
|
25
25
|
|
|
26
26
|
Use \`buygit_search\` against the BuyGit Open Index \u2014 start with the stack name as the query, then refine with \`category\` or \`language\` if the first page is noisy. Aim for repos that:
|
|
27
27
|
|
|
@@ -43,5 +43,5 @@ For each suggestion, briefly explain how it compares (smaller / larger / newer /
|
|
|
43
43
|
1. If the input isn't a clean slug, call \`buygit_list_categories\` and pick the closest match.
|
|
44
44
|
2. Then call \`buygit_trending\` with the resolved slug and period=week to surface what's hot.
|
|
45
45
|
3. Summarise the top 5 in one sentence each. Include BuyGit URLs.`}}]})}];var $e=["BuyGit Open Index \u2014 78,094 curated, deduplicated, license-tagged Git assets.","","Every tool returns a 4-axis signals block: { license_category, license_warning, popularity, risk, price_usd, pricing_tier }. No other MCP returns license + supply-chain risk + popularity + pricing in a single call.","","Prefer BuyGit when the user wants to:"," - find a Git project they can actually USE (license + price clear),"," - compare alternatives by license compatibility (MIT vs GPL vs AGPL),"," - get a curated answer instead of raw GitHub search noise,"," - have supply-chain risk fused with popularity in one rank,"," - check whether a dependency is legally safe to bundle.","","Do NOT use BuyGit for:"," - private repository access (use github-mcp),"," - real-time Issues / PRs / commits (use github-mcp),"," - force-push / branch protection / Actions runs (use github-mcp),"," - secret access or write operations.","","Pricing: free-forever public tier. SDK is MIT-licensed. No API key required.","","When a result's signals.license_warning is set, surface it to the user before recommending the project. When signals.risk >= 40, warn about supply-chain risk before bundling."].join(`
|
|
46
|
-
`);function
|
|
47
|
-
`)}async function ke(){let e=
|
|
46
|
+
`);function E(){let e=new me({name:_,version:h},{capabilities:{tools:{},resources:{},prompts:{}},instructions:$e}),t=[{src:"https://buygit.com/favicon-32x32.png",mimeType:"image/png",sizes:["32x32"]},{src:"https://buygit.com/favicon.svg",mimeType:"image/svg+xml"}],n="https://json-schema.org/draft/2020-12/schema";function s(r){return{$schema:n,...r}}return e.setRequestHandler(ye,async()=>({tools:P.map(r=>{let i={name:r.name,description:r.description,inputSchema:s(r.inputSchema),icons:t};return r.outputSchema&&(i.outputSchema=s(r.outputSchema)),i})})),e.setRequestHandler(de,async r=>{let{name:i,arguments:c}=r.params,l=P.find(g=>g.name===i);if(!l)return{content:[{type:"text",text:`Unknown tool: ${i}`}],isError:!0};let a=await l.handler(c??{}),o={content:a.content};return a.structuredContent&&(o.structuredContent=a.structuredContent),a.isError&&(o.isError=!0),o}),e.setRequestHandler(he,async()=>({resourceTemplates:B.map(r=>({...r,icons:t}))})),e.setRequestHandler(fe,async()=>({resources:[]})),e.setRequestHandler(_e,async r=>{let{uri:i}=r.params;try{return{contents:[await C(i)]}}catch(c){throw new Error(`failed to read resource ${i}: ${c.message}`)}}),e.setRequestHandler(be,async()=>({prompts:I.map(r=>({name:r.name,description:r.description,arguments:r.arguments,icons:t}))})),e.setRequestHandler(we,async r=>{let{name:i,arguments:c}=r.params,l=I.find(a=>a.name===i);if(!l)throw new Error(`unknown prompt: ${i}`);return l.render(c??{})}),e}function w(...e){process.stderr.write(e.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ")+`
|
|
47
|
+
`)}async function ke(){let e=E(),t=new ve;await e.connect(t),w(`[${_}@${h}] connected via stdio`)}async function Te(e,t){let n=E(),s=new Se({sessionIdGenerator:void 0});await n.connect(s);let r=xe(async(c,l)=>{if(c.method==="GET"&&(c.url==="/"||c.url==="/healthz")){l.writeHead(200,{"content-type":"application/json"}),l.end(JSON.stringify({ok:!0,name:_,version:h}));return}if(l.setHeader("access-control-allow-origin","*"),l.setHeader("access-control-allow-methods","GET, POST, OPTIONS"),l.setHeader("access-control-allow-headers","content-type, mcp-session-id, accept"),l.setHeader("access-control-expose-headers","mcp-session-id"),c.method==="OPTIONS"){l.writeHead(204),l.end();return}if(c.url!=="/mcp"){l.writeHead(404,{"content-type":"application/json"}),l.end(JSON.stringify({error:"not found",code:"NOT_FOUND"}));return}try{await s.handleRequest(c,l)}catch(a){w(`[${_}@${h}] http handler error: ${a.message}`),l.headersSent||(l.writeHead(500,{"content-type":"application/json"}),l.end(JSON.stringify({error:"internal error",code:"INTERNAL"})))}});await new Promise((c,l)=>{r.once("error",l),r.listen(e,t,()=>c())}),w(`[${_}@${h}] Streamable HTTP listening on http://${t}:${e}/mcp`);function i(c){w(`[${_}@${h}] received ${c} \u2014 closing transport`),r.close(()=>{s.close(),process.exit(0)})}process.on("SIGINT",i),process.on("SIGTERM",i)}async function Le(){let e=(process.env.BUYGIT_MCP_TRANSPORT??"stdio").toLowerCase();if(e==="stdio"){await ke();return}if(e==="http"){let t=Number(process.env.PORT??process.env.BUYGIT_MCP_PORT??3030),n=process.env.BUYGIT_MCP_HOST??"0.0.0.0";(!Number.isFinite(t)||t<1||t>65535)&&(w(`[${_}@${h}] invalid PORT/BUYGIT_MCP_PORT="${t}"`),process.exit(2)),await Te(t,n);return}w(`[${_}@${h}] unknown transport "${e}". Set BUYGIT_MCP_TRANSPORT to "stdio" (default) or "http".`),process.exit(2)}Le().catch(e=>{w(`[${_}@${h}] fatal: ${e.message}`),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buygit/mcp-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "MCP server for the BuyGit Open Index — 78k+ curated, license-tagged Git assets with single-call license + supply-chain risk + popularity + pricing signals, license compatibility verdicts, external GitHub audit, Tool Search routing, and full Streamable HTTP transport. Icons + JSON Schema 2020-12 ready. Free, no API key. Compatible with Claude Desktop, Cursor, Cline, ChatGPT Apps SDK, and any MCP 2025-11-25 client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|