lexic-mcp 0.1.11 → 0.1.12

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.
Files changed (2) hide show
  1. package/dist/bundle.cjs +1 -1
  2. package/package.json +3 -2
package/dist/bundle.cjs CHANGED
@@ -460,7 +460,7 @@ ${t}
460
460
 
461
461
  You can set LEXIC_SUPABASE_URL and LEXIC_SUPABASE_ANON_KEY environment variables to configure manually.`,"network_error",r)}}async function Ib(t={}){let e=await hH(t),r=e.timeout??dH,{codeVerifier:n,codeChallenge:i}=hb(),o=gb(),a=e.port??await OP(),s=`http://127.0.0.1:${a}/callback`;return $.debug("Starting OAuth flow",{port:a,redirectUri:s}),new Promise((u,c)=>{let l=null,p=null,d=()=>{p&&(clearTimeout(p),p=null),l&&(l.close(),l=null)};p=setTimeout(()=>{d(),c(new Gt("Login timed out. Please try again.","timeout"))},r),l=(0,zb.createServer)(async(f,m)=>{let h=new Eb.URL(f.url||"/",`http://127.0.0.1:${a}`);if(h.pathname==="/callback"){let g=h.searchParams.get("code"),b=h.searchParams.get("state"),_=h.searchParams.get("error"),w=h.searchParams.get("error_description");if(_){$.warn("OAuth error received",{error:_,errorDescription:w}),_==="access_denied"?(m.writeHead(200,{"Content-Type":"text/html"}),m.end($b())):(m.writeHead(200,{"Content-Type":"text/html"}),m.end(Io(_,w||void 0))),d(),c(new Gt(w||_,_==="access_denied"?"access_denied":"server_error",_));return}if(b!==o){$.error("Invalid state parameter",{expected:o,received:b}),m.writeHead(200,{"Content-Type":"text/html"}),m.end(Io("Invalid state","The authentication request may have been tampered with.")),d(),c(new Gt("Invalid state parameter - possible CSRF attack","invalid_state"));return}if(!g){m.writeHead(200,{"Content-Type":"text/html"}),m.end(Io("Missing code","No authorization code received.")),d(),c(new Gt("No authorization code received","server_error"));return}try{let k=await mH(e,g,n,s);xb(e.supabaseUrl,{access_token:k.access_token,refresh_token:k.refresh_token,token_type:k.token_type,expires_in:k.expires_in},{user_id:k.user?.id,email:k.user?.email}),m.writeHead(200,{"Content-Type":"text/html"}),m.end(wb()),$.info("OAuth flow completed successfully",{userId:k.user?.id,email:k.user?.email}),d(),u({accessToken:k.access_token,refreshToken:k.refresh_token,expiresAt:k.expires_in?Math.floor(Date.now()/1e3)+k.expires_in:void 0,userId:k.user?.id,email:k.user?.email})}catch(k){$.error("Token exchange failed",{error:k instanceof Error?k.message:String(k)}),m.writeHead(200,{"Content-Type":"text/html"}),m.end(Io("Token exchange failed",k instanceof Error?k.message:"Unknown error")),d(),c(k)}return}m.writeHead(404),m.end("Not found")}),l.on("error",f=>{$.error("Callback server error",{error:f.message}),d(),c(new Gt("Failed to start callback server","server_error",f.message))}),l.listen(a,"127.0.0.1",async()=>{$.debug("Callback server listening",{port:a});let f=jv(),m=new Eb.URL(f.authorizationUrl);m.searchParams.set("redirect_uri",s),m.searchParams.set("state",o),m.searchParams.set("code_challenge",i),m.searchParams.set("code_challenge_method","S256"),e.provider&&m.searchParams.set("provider",e.provider);let h=m.toString();$.debug("Authorization URL",{url:h}),e.skipBrowserOpen||(console.error(`
462
462
  Opening browser for authentication...`),console.error(`If the browser doesn't open, visit: ${h}
463
- `),await AP(h))})})}var jp=Re(require("readline"),1),RP="0.1.11";async function CP(t,e,r){let n=new Map,i=c=>{let l=e[c];return l?ul(l):void 0},o=Lk(t,{description:i("knowledge_query")}),a=Zk(t,{description:i("knowledge_store")}),s=Fk(t,{description:i("knowledge_get_context")});if(n.set(o.name,o),n.set(a.name,a),n.set(s.name,s),$.debug("Registered core tools",{tools:[o.name,a.name,s.name]}),t.isUserScoped()){let c=Vk(t,{description:i("lexic_create_project")}),l=Bk(t,{description:i("lexic_list_projects")}),p=Hk(t,{description:i("lexic_get_project_info")});n.set(c.name,c),n.set(l.name,l),n.set(p.name,p),$.debug("Registered admin tools",{tools:[c.name,l.name,p.name]})}else $.debug("Skipping admin tools (PAT is lexicon-scoped)");let u=Cv(r,e,t);for(let c of u)n.set(c.name,c);return $.debug("Registered domain tools",{count:u.length,tools:u.map(c=>c.name)}),n}async function gH(){let t=Uk();$.setLevel(t.logLevel),$.info("Starting Lexic MCP Server (stdio transport)");let e=Mk(t),r=await e.validateConnection();if(r.valid||($.error("Failed to connect to Lexic",{error:r.error}),process.exit(1)),$.info("Connected to Lexic",{lexiconId:r.lexiconId,isUserScoped:r.isUserScoped}),r.expiresAt){let u=new Date,c=Math.ceil((r.expiresAt.getTime()-u.getTime())/(1e3*60*60*24)),l=r.expiresAt.toISOString(),p=c===1?"day":"days";switch(!0){case c<=0:$.error("PAT has expired",{expiresAt:l});break;case c<=3:$.warn(`PAT expires in ${c} ${p}`,{expiresAt:l});break;case c<=7:$.info(`PAT expires in ${c} ${p}`,{expiresAt:l});break}}let{domains:n,triggers:i}=await NP(e),o=await CP(e,i,n),a=new to({name:"lexic-mcp",version:RP},{capabilities:{tools:{}}});a.setRequestHandler(La,async()=>({tools:Array.from(o.values()).map(u=>({name:u.name,description:u.description,inputSchema:u.inputSchema}))})),a.setRequestHandler(Nn,async u=>{let{name:c,arguments:l}=u.params,p=o.get(c);if(!p)return{content:[{type:"text",text:`Unknown tool: ${c}`}],isError:!0};try{$.debug("Executing tool",{name:c,args:l});let d=await p.handler(l||{});return $.debug("Tool executed successfully",{name:c}),{content:[{type:"text",text:typeof d=="string"?d:JSON.stringify(d,null,2)}]}}catch(d){let f=d instanceof Error?d.message:String(d);return $.error("Tool execution failed",{name:c,error:f}),{content:[{type:"text",text:`Error: ${f}`}],isError:!0}}});let s=new cl;await a.connect(s),$.info("Lexic MCP Server running (stdio)",{toolCount:o.size,tools:Array.from(o.keys())})}async function vH(){let t=zv();if(!Iv(t))throw new Error("OAuth configuration required for HTTP transport");$.setLevel(t.logLevel),$.info("Starting Lexic MCP Server (HTTP transport with OAuth)");let e=Rv({apiUrl:t.apiUrl,auth:{type:"oauth",token:t.oauthConfig.supabaseAnonKey}}),r={},n={};try{let a=await NP(e);r=a.domains,n=a.triggers}catch(a){$.warn("Could not load configuration during bootstrap, will use defaults",{error:a instanceof Error?a.message:String(a)})}let i=await CP(e,n,r),o=xP({oauthConfig:t.oauthConfig,tools:i,serverName:"lexic-mcp",serverVersion:"0.1.0"});process.on("SIGTERM",async()=>{$.info("Received SIGTERM, shutting down..."),await o.stop(),process.exit(0)}),process.on("SIGINT",async()=>{$.info("Received SIGINT, shutting down..."),await o.stop(),process.exit(0)}),await o.start(),$.info("Lexic MCP Server running (HTTP with OAuth)",{toolCount:i.size,tools:Array.from(i.keys()),port:t.oauthConfig.httpPort})}async function NP(t){$.info("Loading domains and triggers...");let e={},r={},n=!1;try{[e,r]=await Promise.all([mb(t),_P(t)]),$.info("Loaded configuration",{domains:Object.keys(e).length,triggers:Object.keys(r).length})}catch(i){n=!0,$.warn("Failed to load dynamic configuration, starting in degraded mode",{error:i instanceof Error?i.message:String(i)});try{e=await mb(t),$.info("Loaded domains only (triggers unavailable)",{domains:Object.keys(e).length})}catch(o){$.error("Failed to load domains - will use defaults",{error:o instanceof Error?o.message:String(o)})}}return n&&$.warn("Running in DEGRADED MODE - tool descriptions may be less helpful"),{domains:e,triggers:r}}var ui=[{value:"google",label:"Google"},{value:"github",label:"GitHub"},{value:"azure",label:"Microsoft (Azure AD)"}];async function yH(){return new Promise(t=>{let e=0,r=jp.createInterface({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),jp.emitKeypressEvents(process.stdin);let n=()=>{e>=0&&(process.stdout.write(`\x1B[${ui.length+1}A`),process.stdout.write("\x1B[0J")),console.log("Select an OAuth provider:"),ui.forEach((a,s)=>{let u=s===e?"> ":" ",c=s===e?"\x1B[36m":"",l=s===e?"\x1B[0m":"";console.log(`${u}${c}${a.label}${l}`)})};console.log("Select an OAuth provider:"),ui.forEach((a,s)=>{let u=s===e?"> ":" ",c=s===e?"\x1B[36m":"",l=s===e?"\x1B[0m":"";console.log(`${u}${c}${a.label}${l}`)});let i=()=>{process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.removeListener("keypress",o),r.close()},o=(a,s)=>{s.name==="up"?(e=(e-1+ui.length)%ui.length,n()):s.name==="down"?(e=(e+1)%ui.length,n()):s.name==="return"?(i(),console.log(""),t(ui[e].value)):(s.name==="escape"||s.ctrl&&s.name==="c")&&(i(),console.log(`
463
+ `),await AP(h))})})}var jp=Re(require("readline"),1),RP="0.1.12";async function CP(t,e,r){let n=new Map,i=c=>{let l=e[c];return l?ul(l):void 0},o=Lk(t,{description:i("knowledge_query")}),a=Zk(t,{description:i("knowledge_store")}),s=Fk(t,{description:i("knowledge_get_context")});if(n.set(o.name,o),n.set(a.name,a),n.set(s.name,s),$.debug("Registered core tools",{tools:[o.name,a.name,s.name]}),t.isUserScoped()){let c=Vk(t,{description:i("lexic_create_project")}),l=Bk(t,{description:i("lexic_list_projects")}),p=Hk(t,{description:i("lexic_get_project_info")});n.set(c.name,c),n.set(l.name,l),n.set(p.name,p),$.debug("Registered admin tools",{tools:[c.name,l.name,p.name]})}else $.debug("Skipping admin tools (PAT is lexicon-scoped)");let u=Cv(r,e,t);for(let c of u)n.set(c.name,c);return $.debug("Registered domain tools",{count:u.length,tools:u.map(c=>c.name)}),n}async function gH(){let t=Uk();$.setLevel(t.logLevel),$.info("Starting Lexic MCP Server (stdio transport)");let e=Mk(t),r=await e.validateConnection();if(r.valid||($.error("Failed to connect to Lexic",{error:r.error}),process.exit(1)),$.info("Connected to Lexic",{lexiconId:r.lexiconId,isUserScoped:r.isUserScoped}),r.expiresAt){let u=new Date,c=Math.ceil((r.expiresAt.getTime()-u.getTime())/(1e3*60*60*24)),l=r.expiresAt.toISOString(),p=c===1?"day":"days";switch(!0){case c<=0:$.error("PAT has expired",{expiresAt:l});break;case c<=3:$.warn(`PAT expires in ${c} ${p}`,{expiresAt:l});break;case c<=7:$.info(`PAT expires in ${c} ${p}`,{expiresAt:l});break}}let{domains:n,triggers:i}=await NP(e),o=await CP(e,i,n),a=new to({name:"lexic-mcp",version:RP},{capabilities:{tools:{}}});a.setRequestHandler(La,async()=>({tools:Array.from(o.values()).map(u=>({name:u.name,description:u.description,inputSchema:u.inputSchema}))})),a.setRequestHandler(Nn,async u=>{let{name:c,arguments:l}=u.params,p=o.get(c);if(!p)return{content:[{type:"text",text:`Unknown tool: ${c}`}],isError:!0};try{$.debug("Executing tool",{name:c,args:l});let d=await p.handler(l||{});return $.debug("Tool executed successfully",{name:c}),{content:[{type:"text",text:typeof d=="string"?d:JSON.stringify(d,null,2)}]}}catch(d){let f=d instanceof Error?d.message:String(d);return $.error("Tool execution failed",{name:c,error:f}),{content:[{type:"text",text:`Error: ${f}`}],isError:!0}}});let s=new cl;await a.connect(s),$.info("Lexic MCP Server running (stdio)",{toolCount:o.size,tools:Array.from(o.keys())})}async function vH(){let t=zv();if(!Iv(t))throw new Error("OAuth configuration required for HTTP transport");$.setLevel(t.logLevel),$.info("Starting Lexic MCP Server (HTTP transport with OAuth)");let e=Rv({apiUrl:t.apiUrl,auth:{type:"oauth",token:t.oauthConfig.supabaseAnonKey}}),r={},n={};try{let a=await NP(e);r=a.domains,n=a.triggers}catch(a){$.warn("Could not load configuration during bootstrap, will use defaults",{error:a instanceof Error?a.message:String(a)})}let i=await CP(e,n,r),o=xP({oauthConfig:t.oauthConfig,tools:i,serverName:"lexic-mcp",serverVersion:"0.1.0"});process.on("SIGTERM",async()=>{$.info("Received SIGTERM, shutting down..."),await o.stop(),process.exit(0)}),process.on("SIGINT",async()=>{$.info("Received SIGINT, shutting down..."),await o.stop(),process.exit(0)}),await o.start(),$.info("Lexic MCP Server running (HTTP with OAuth)",{toolCount:i.size,tools:Array.from(i.keys()),port:t.oauthConfig.httpPort})}async function NP(t){$.info("Loading domains and triggers...");let e={},r={},n=!1;try{[e,r]=await Promise.all([mb(t),_P(t)]),$.info("Loaded configuration",{domains:Object.keys(e).length,triggers:Object.keys(r).length})}catch(i){n=!0,$.warn("Failed to load dynamic configuration, starting in degraded mode",{error:i instanceof Error?i.message:String(i)});try{e=await mb(t),$.info("Loaded domains only (triggers unavailable)",{domains:Object.keys(e).length})}catch(o){$.error("Failed to load domains - will use defaults",{error:o instanceof Error?o.message:String(o)})}}return n&&$.warn("Running in DEGRADED MODE - tool descriptions may be less helpful"),{domains:e,triggers:r}}var ui=[{value:"google",label:"Google"},{value:"github",label:"GitHub"},{value:"azure",label:"Microsoft (Azure AD)"}];async function yH(){return new Promise(t=>{let e=0,r=jp.createInterface({input:process.stdin,output:process.stdout});process.stdin.isTTY&&process.stdin.setRawMode(!0),jp.emitKeypressEvents(process.stdin);let n=()=>{e>=0&&(process.stdout.write(`\x1B[${ui.length+1}A`),process.stdout.write("\x1B[0J")),console.log("Select an OAuth provider:"),ui.forEach((a,s)=>{let u=s===e?"> ":" ",c=s===e?"\x1B[36m":"",l=s===e?"\x1B[0m":"";console.log(`${u}${c}${a.label}${l}`)})};console.log("Select an OAuth provider:"),ui.forEach((a,s)=>{let u=s===e?"> ":" ",c=s===e?"\x1B[36m":"",l=s===e?"\x1B[0m":"";console.log(`${u}${c}${a.label}${l}`)});let i=()=>{process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.removeListener("keypress",o),r.close()},o=(a,s)=>{s.name==="up"?(e=(e-1+ui.length)%ui.length,n()):s.name==="down"?(e=(e+1)%ui.length,n()):s.name==="return"?(i(),console.log(""),t(ui[e].value)):(s.name==="escape"||s.ctrl&&s.name==="c")&&(i(),console.log(`
464
464
  Login cancelled.`),process.exit(0))};process.stdin.on("keypress",o)})}function xH(t){let e=t.toLowerCase();if(e==="google"||e==="github"||e==="azure")return e}function bH(){console.log(`
465
465
  Lexic MCP Server - Knowledge management for AI-assisted development
466
466
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lexic-mcp",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "MCP server connecting Claude Code to Lexic knowledge management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -50,6 +50,7 @@
50
50
  "node": ">=18.0.0"
51
51
  },
52
52
  "files": [
53
- "dist/bundle.cjs"
53
+ "dist/bundle.cjs",
54
+ "README.md"
54
55
  ]
55
56
  }