@cachly-dev/mcp-server 0.10.137 → 0.10.139

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 CHANGED
@@ -128,7 +128,40 @@ moat no first-party tool can build.
128
128
 
129
129
  ---
130
130
 
131
- ## Setup — one command
131
+ ## Setup — pick the shortest path for your editor
132
+
133
+ ### Claude Code — two lines
134
+
135
+ ```
136
+ /plugin marketplace add cachly-dev/cachly-mcp
137
+ /plugin install cachly-brain@cachly
138
+ ```
139
+
140
+ Claude Code declares the MCP server for you; there is no JSON to write and no
141
+ path to set. Paste your brain ID once with `/plugin configure cachly-brain@cachly`
142
+ and you are done. (From v0.10.139 the server sets itself up on first use —
143
+ an anonymous 14-day trial brain, nothing to copy.)
144
+
145
+ Check it worked with `claude mcp list` — you should see
146
+ `plugin:cachly-brain:cachly … ✔ Connected`. Note that `claude plugin details`
147
+ reports `MCP servers (0)` even when the server is running; it does not count
148
+ them.
149
+
150
+ ### VS Code — one click
151
+
152
+ Install the **[cachly Brain](https://marketplace.visualstudio.com/items?itemName=cachly-dev.cachly-brain)**
153
+ extension. It signs you in silently and creates your brain — no account form.
154
+
155
+ ### JetBrains — awaiting marketplace approval
156
+
157
+ The IntelliJ plugin is built and uploaded, but JetBrains has not approved the
158
+ listing yet — so there is no link here, because there is nothing to click.
159
+ The source is at
160
+ [cachly-dev/cachly-intellij](https://github.com/cachly-dev/cachly-intellij);
161
+ until the listing goes live, use the `npx … autopilot` path below, which
162
+ configures JetBrains AI Assistant along with every other editor it finds.
163
+
164
+ ### Anything else — one command
132
165
 
133
166
  ```bash
134
167
  npx @cachly-dev/mcp-server@latest autopilot
@@ -1 +1 @@
1
- import{existsSync as o,mkdirSync as p,writeFileSync as a,renameSync as d,chmodSync as f,readFileSync as i}from"node:fs";import{resolve as s,dirname as y}from"node:path";function m(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function t(e){return typeof e=="string"&&e.length>0?e:void 0}function u(e={}){const n=e.home??m();return s(n,".cachly","credentials.json")}function A(e,n={}){try{const r=u(n);p(y(r),{recursive:!0});const c=`${r}.${process.pid}-${Date.now()}.tmp`;a(c,JSON.stringify({apiKey:e},null,2),"utf8");try{f(c,384)}catch{}d(c,r)}catch{}}function h(e){try{const n=u(e);if(!o(n))return;const r=JSON.parse(i(n,"utf8"));return t(r.apiKey)}catch{return}}function l(e){try{const n=s(e.cwd??process.cwd(),".mcp.json");if(!o(n))return;const r=JSON.parse(i(n,"utf8"));return t(r.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function C(e={}){const n=e.env??process.env;return t(n.CACHLY_JWT)??t(n.CACHLY_API_KEY)??h(e)??l(e)}export{u as credentialsPath,C as resolveApiKey,A as saveApiKey};
1
+ import{existsSync as o,mkdirSync as d,writeFileSync as p,renameSync as a,chmodSync as f,readFileSync as i}from"node:fs";import{resolve as s,dirname as y}from"node:path";function m(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function h(e){return/^\$\{[^}]*\}$/.test(e.trim())}function r(e){if(!(typeof e!="string"||e.length===0))return h(e)?void 0:e}function u(e={}){const n=e.home??m();return s(n,".cachly","credentials.json")}function C(e,n={}){try{const t=u(n);d(y(t),{recursive:!0});const c=`${t}.${process.pid}-${Date.now()}.tmp`;p(c,JSON.stringify({apiKey:e},null,2),"utf8");try{f(c,384)}catch{}a(c,t)}catch{}}function l(e){try{const n=u(e);if(!o(n))return;const t=JSON.parse(i(n,"utf8"));return r(t.apiKey)}catch{return}}function S(e){try{const n=s(e.cwd??process.cwd(),".mcp.json");if(!o(n))return;const t=JSON.parse(i(n,"utf8"));return r(t.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function P(e={}){const n=e.env??process.env;return r(n.CACHLY_JWT)??r(n.CACHLY_API_KEY)??l(e)??S(e)}export{u as credentialsPath,h as istPlatzhalter,P as resolveApiKey,C as saveApiKey};
@@ -1,13 +1,13 @@
1
- const s={apiUrl:process.env.CACHLY_API_URL??"https://api.cachly.dev",jwt:process.env.CACHLY_JWT??"",model:process.env.CACHLY_EMBED_MODEL??""};function f(n){s.jwt=n}const a=Number(process.env.CACHLY_EMBED_TIMEOUT_MS??8e3);function E(){return process.env.CACHLY_JWT?"cachly":process.env.OLLAMA_BASE_URL?"ollama":"none"}const d=(process.env.CACHLY_EMBED_PROVIDER??E()).toLowerCase();async function u(n){switch(d){case"cachly":{if(!s.jwt)throw new Error(`CACHLY_JWT not set.
1
+ const s={apiUrl:process.env.CACHLY_API_URL??"https://api.cachly.dev",jwt:process.env.CACHLY_JWT??"",model:process.env.CACHLY_EMBED_MODEL??""};function y(r){s.jwt=r}const _=Number(process.env.CACHLY_EMBED_TIMEOUT_MS??8e3),u=Number(process.env.CACHLY_EMBED_TIMEOUT_MAX_MS??45e3),p=12;function A(r,n){return n==="kurz"?_:Math.min(u,_+r.length*p)}function h(){return process.env.CACHLY_JWT?"cachly":process.env.OLLAMA_BASE_URL?"ollama":"none"}const d=(process.env.CACHLY_EMBED_PROVIDER??h()).toLowerCase();async function f(r,n){const i=A(r,n);switch(d){case"cachly":{if(!s.jwt)throw new Error(`CACHLY_JWT not set.
2
2
 
3
3
  The "cachly" provider uses server-side embeddings via the Cachly API.
4
4
  Set CACHLY_JWT, or use another provider via CACHLY_EMBED_PROVIDER:
5
5
  openai \u2192 OPENAI_API_KEY
6
6
  gemini \u2192 GEMINI_API_KEY
7
- ollama \u2192 OLLAMA_BASE_URL (local, no key needed)`);const e=`${s.apiUrl}/api/v1/embed`,r={text:n};s.model&&(r.model=s.model);const t=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s.jwt}`},body:JSON.stringify(r),signal:AbortSignal.timeout(a)});if(!t.ok){const i=await t.text();let c=null;const l=Number(t.headers.get("retry-after"));if(Number.isFinite(l)&&l>=0)c=l;else try{const m=JSON.parse(i);typeof m.retry_after=="number"&&m.retry_after>=0&&(c=m.retry_after)}catch{}throw Object.assign(new Error(`Cachly embed API error ${t.status}: ${i.slice(0,200)}`),{status:t.status,retryAfterSek:c})}return(await t.json()).embedding}case"mistral":{const e=process.env.MISTRAL_API_KEY;if(!e)throw new Error("MISTRAL_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"mistral-embed",t=await fetch("https://api.mistral.ai/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,input:[n]}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Mistral embedding error: ${t.statusText}`);const o=await t.json();if(!o.data?.[0]?.embedding)throw new Error("Mistral returned empty embedding response");return o.data[0].embedding}case"cohere":{const e=process.env.COHERE_API_KEY;if(!e)throw new Error("COHERE_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"embed-english-v3.0",t=await fetch("https://api.cohere.com/v2/embed",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,texts:[n],input_type:"search_query",embedding_types:["float"]}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Cohere embedding error: ${t.statusText}`);return(await t.json()).embeddings.float[0]}case"ollama":{const e=process.env.OLLAMA_BASE_URL??"http://localhost:11434",r=s.model!=="text-embedding-3-small"?s.model:"nomic-embed-text",t=await fetch(`${e}/api/embeddings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:n}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Ollama embedding error: ${t.statusText}`);return(await t.json()).embedding}case"gemini":{const e=process.env.GEMINI_API_KEY;if(!e)throw new Error("GEMINI_API_KEY not set");const r=s.model!=="text-embedding-3-small"?s.model:"text-embedding-004",t=await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${r}:embedContent?key=${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`models/${r}`,content:{parts:[{text:n}]}}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`Gemini embedding error: ${t.statusText}`);return(await t.json()).embedding.values}case"openai":{const e=process.env.OPENAI_API_KEY;if(!e)throw new Error(`OPENAI_API_KEY not set.
7
+ ollama \u2192 OLLAMA_BASE_URL (local, no key needed)`);const o=`${s.apiUrl}/api/v1/embed`,t={text:r};s.model&&(t.model=s.model);const e=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s.jwt}`},body:JSON.stringify(t),signal:AbortSignal.timeout(i)});if(!e.ok){const E=await e.text();let c=null;const m=Number(e.headers.get("retry-after"));if(Number.isFinite(m)&&m>=0)c=m;else try{const l=JSON.parse(E);typeof l.retry_after=="number"&&l.retry_after>=0&&(c=l.retry_after)}catch{}throw Object.assign(new Error(`Cachly embed API error ${e.status}: ${E.slice(0,200)}`),{status:e.status,retryAfterSek:c})}return(await e.json()).embedding}case"mistral":{const o=process.env.MISTRAL_API_KEY;if(!o)throw new Error("MISTRAL_API_KEY not set");const t=s.model!=="text-embedding-3-small"?s.model:"mistral-embed",e=await fetch("https://api.mistral.ai/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({model:t,input:[r]}),signal:AbortSignal.timeout(i)});if(!e.ok)throw new Error(`Mistral embedding error: ${e.statusText}`);const a=await e.json();if(!a.data?.[0]?.embedding)throw new Error("Mistral returned empty embedding response");return a.data[0].embedding}case"cohere":{const o=process.env.COHERE_API_KEY;if(!o)throw new Error("COHERE_API_KEY not set");const t=s.model!=="text-embedding-3-small"?s.model:"embed-english-v3.0",e=await fetch("https://api.cohere.com/v2/embed",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({model:t,texts:[r],input_type:"search_query",embedding_types:["float"]}),signal:AbortSignal.timeout(i)});if(!e.ok)throw new Error(`Cohere embedding error: ${e.statusText}`);return(await e.json()).embeddings.float[0]}case"ollama":{const o=process.env.OLLAMA_BASE_URL??"http://localhost:11434",t=s.model!=="text-embedding-3-small"?s.model:"nomic-embed-text",e=await fetch(`${o}/api/embeddings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,prompt:r}),signal:AbortSignal.timeout(i)});if(!e.ok)throw new Error(`Ollama embedding error: ${e.statusText}`);return(await e.json()).embedding}case"gemini":{const o=process.env.GEMINI_API_KEY;if(!o)throw new Error("GEMINI_API_KEY not set");const t=s.model!=="text-embedding-3-small"?s.model:"text-embedding-004",e=await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${t}:embedContent?key=${o}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`models/${t}`,content:{parts:[{text:r}]}}),signal:AbortSignal.timeout(i)});if(!e.ok)throw new Error(`Gemini embedding error: ${e.statusText}`);return(await e.json()).embedding.values}case"openai":{const o=process.env.OPENAI_API_KEY;if(!o)throw new Error(`OPENAI_API_KEY not set.
8
8
 
9
9
  Set OPENAI_API_KEY in your .env, or switch provider:
10
10
  CACHLY_EMBED_PROVIDER=gemini (+ GEMINI_API_KEY)
11
11
  CACHLY_EMBED_PROVIDER=ollama (local, free)
12
- CACHLY_EMBED_PROVIDER=cachly (server-side, no key needed)`);const r=s.model||"text-embedding-3-small",t=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({model:r,input:n}),signal:AbortSignal.timeout(a)});if(!t.ok)throw new Error(`OpenAI embedding error: ${t.statusText}`);const o=await t.json();if(!o.data?.[0]?.embedding)throw new Error("OpenAI returned empty embedding response");return o.data[0].embedding}default:throw new Error(`Unknown CACHLY_EMBED_PROVIDER="${d}".
13
- Supported: cachly (default), openai, mistral, cohere, ollama, gemini`)}}const _=3,p=4;function A(n){const e=n;if(typeof e?.status=="number")return e.status===429||e.status>=500;if(e?.name==="TimeoutError"||e?.name==="AbortError")return!1;if(/fetch failed/i.test(String(e?.message??"")))return!0;const r=e?.cause?.code??"";return["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","UND_ERR_SOCKET"].includes(r)}function h(n,e,r){if(e>=(r==="lang"?p:_)||!A(n))return null;const o=n?.retryAfterSek;if(typeof o=="number"&&Number.isFinite(o)&&o>=0){const i=o*1e3;return r==="kurz"?i<=2e3?i:null:Math.min(i,61e3)}return r==="lang"?Math.min(1e3*2**(e-1),8e3):250*2**(e-1)}async function g(n,e){const r=e?.geduld??"kurz";let t=0;for(;;){t++;try{return await u(n)}catch(o){const i=h(o,t,r);if(i===null)throw o;await new Promise(c=>setTimeout(c,i))}}}function b(){switch(d){case"cachly":return!!s.jwt;case"mistral":return!!process.env.MISTRAL_API_KEY;case"cohere":return!!process.env.COHERE_API_KEY;case"ollama":return!0;case"gemini":return!!process.env.GEMINI_API_KEY;case"openai":return!!process.env.OPENAI_API_KEY;case"none":return!1;default:return!1}}function I(){const n={cachly:"CACHLY_JWT (server-side, no extra key needed)",openai:"OPENAI_API_KEY",mistral:"MISTRAL_API_KEY",cohere:"COHERE_API_KEY",ollama:"OLLAMA_BASE_URL (optional, default: http://localhost:11434)",gemini:"GEMINI_API_KEY"};if(d==="none")return"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or another provider key in .env. Brain works without embedding.";const e=n[d]??"CACHLY_JWT";return`CACHLY_EMBED_PROVIDER=${d} \u2192 requires ${e}`}export{d as EMBED_PROVIDER,g as computeEmbedding,s as embedConfig,I as embedProviderHint,b as hasEmbedProvider,A as istVoruebergehend,f as setEmbedJwt,h as wiederholungMs};
12
+ CACHLY_EMBED_PROVIDER=cachly (server-side, no key needed)`);const t=s.model||"text-embedding-3-small",e=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({model:t,input:r}),signal:AbortSignal.timeout(i)});if(!e.ok)throw new Error(`OpenAI embedding error: ${e.statusText}`);const a=await e.json();if(!a.data?.[0]?.embedding)throw new Error("OpenAI returned empty embedding response");return a.data[0].embedding}default:throw new Error(`Unknown CACHLY_EMBED_PROVIDER="${d}".
13
+ Supported: cachly (default), openai, mistral, cohere, ollama, gemini`)}}const g=3,b=4;function I(r){const n=r;if(typeof n?.status=="number")return n.status===429||n.status>=500;if(n?.name==="TimeoutError"||n?.name==="AbortError")return!1;if(/fetch failed/i.test(String(n?.message??"")))return!0;const i=n?.cause?.code??"";return["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","UND_ERR_SOCKET"].includes(i)}function w(r,n,i){if(n>=(i==="lang"?b:g)||!I(r))return null;const t=r?.retryAfterSek;if(typeof t=="number"&&Number.isFinite(t)&&t>=0){const e=t*1e3;return i==="kurz"?e<=2e3?e:null:Math.min(e,61e3)}return i==="lang"?Math.min(1e3*2**(n-1),8e3):250*2**(n-1)}async function C(r,n){const i=n?.geduld??"kurz";let o=0;for(;;){o++;try{return await f(r,i)}catch(t){const e=w(t,o,i);if(e===null)throw t;await new Promise(a=>setTimeout(a,e))}}}function P(){switch(d){case"cachly":return!!s.jwt;case"mistral":return!!process.env.MISTRAL_API_KEY;case"cohere":return!!process.env.COHERE_API_KEY;case"ollama":return!0;case"gemini":return!!process.env.GEMINI_API_KEY;case"openai":return!!process.env.OPENAI_API_KEY;case"none":return!1;default:return!1}}function O(){const r={cachly:"CACHLY_JWT (server-side, no extra key needed)",openai:"OPENAI_API_KEY",mistral:"MISTRAL_API_KEY",cohere:"COHERE_API_KEY",ollama:"OLLAMA_BASE_URL (optional, default: http://localhost:11434)",gemini:"GEMINI_API_KEY"};if(d==="none")return"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or another provider key in .env. Brain works without embedding.";const n=r[d]??"CACHLY_JWT";return`CACHLY_EMBED_PROVIDER=${d} \u2192 requires ${n}`}export{d as EMBED_PROVIDER,C as computeEmbedding,s as embedConfig,O as embedProviderHint,P as hasEmbedProvider,I as istVoruebergehend,y as setEmbedJwt,w as wiederholungMs,A as zeitlimitMs};