@cachly-dev/mcp-server 0.10.138 → 0.10.140
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 +34 -1
- package/dist/src/credentials.js +1 -1
- package/dist/src/embeddings.js +4 -4
- package/dist/src/index.js +105 -105
- package/dist/src/sofort-test.js +1 -0
- package/dist/src/tools.js +2 -2
- package/dist/src/werkzeug-auswahl.js +2 -0
- package/glama.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
package/README.md
CHANGED
|
@@ -128,7 +128,40 @@ moat no first-party tool can build.
|
|
|
128
128
|
|
|
129
129
|
---
|
|
130
130
|
|
|
131
|
-
## Setup —
|
|
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
|
package/dist/src/credentials.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as o,mkdirSync as
|
|
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};
|
package/dist/src/embeddings.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
13
|
-
Supported: cachly (default), openai, mistral, cohere, ollama, gemini`)}}const
|
|
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};
|