@heznpc/imcp 1.2.0 → 1.3.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/README.md +20 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/semantic/embeddings.d.ts +10 -0
- package/dist/semantic/embeddings.js +112 -0
- package/dist/semantic/embeddings.js.map +1 -0
- package/dist/semantic/store.d.ts +47 -0
- package/dist/semantic/store.js +101 -0
- package/dist/semantic/store.js.map +1 -0
- package/dist/semantic/tools.d.ts +7 -0
- package/dist/semantic/tools.js +287 -0
- package/dist/semantic/tools.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ Checks Node.js version, config files, Claude Desktop setup, macOS permissions, a
|
|
|
44
44
|
|
|
45
45
|
## What Can It Do?
|
|
46
46
|
|
|
47
|
-
**
|
|
47
|
+
**122 tools** across 14 Apple app modules + semantic search, **9 MCP resources**, and **20 prompts**:
|
|
48
48
|
|
|
49
49
|
| Module | What it does | Tools |
|
|
50
50
|
|--------|-------------|-------|
|
|
@@ -62,6 +62,7 @@ Checks Node.js version, config files, Claude Desktop setup, macOS permissions, a
|
|
|
62
62
|
| **Shortcuts** | Run Siri Shortcuts from AI | 4 |
|
|
63
63
|
| **Intelligence** | On-device summarize, rewrite, proofread (macOS 26+) | 3 |
|
|
64
64
|
| **TV** | Browse library, control playback, search content | 6 |
|
|
65
|
+
| **Semantic** | On-device cross-app semantic search (Swift bridge) | 4 |
|
|
65
66
|
|
|
66
67
|
All tools include MCP annotations (`readOnlyHint`, `destructiveHint`, `openWorldHint`) for client-side safety UI.
|
|
67
68
|
|
|
@@ -139,6 +140,7 @@ node dist/index.js
|
|
|
139
140
|
| `IMCP_ALLOW_SEND_MAIL` | `true` | Allow sending emails |
|
|
140
141
|
| `IMCP_FULL` | `false` | Enable all modules (ignores preset) |
|
|
141
142
|
| `IMCP_DISABLE_{MODULE}` | — | Disable a specific module (e.g. `IMCP_DISABLE_MUSIC=true`) |
|
|
143
|
+
| `GEMINI_API_KEY` | — | Google Gemini API key for higher-quality embeddings (optional) |
|
|
142
144
|
|
|
143
145
|
### Config File
|
|
144
146
|
|
|
@@ -190,9 +192,25 @@ A native SwiftUI companion app for server status monitoring and permission setup
|
|
|
190
192
|
cd app && swift build -c release
|
|
191
193
|
```
|
|
192
194
|
|
|
195
|
+
### Semantic Search (Optional)
|
|
196
|
+
|
|
197
|
+
On-device cross-app semantic search powered by Apple's NLContextualEmbedding. Find related notes, events, reminders, and emails by meaning — not just keywords.
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
npm run swift-build # Build the Swift bridge first
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Then use the tools:
|
|
204
|
+
1. `semantic_index` — Index data from enabled Apple apps into a local vector store
|
|
205
|
+
2. `semantic_search` — Search by meaning across all indexed data
|
|
206
|
+
3. `find_related` — Find items related to a specific note/event/reminder
|
|
207
|
+
4. `semantic_status` — Check index status
|
|
208
|
+
|
|
209
|
+
Supports Korean, English, Japanese, Chinese with automatic language detection. Optionally set `GEMINI_API_KEY` for higher-quality Google Gemini embeddings.
|
|
210
|
+
|
|
193
211
|
### Swift Bridge (Optional)
|
|
194
212
|
|
|
195
|
-
For recurring events/reminders (EventKit), photo import/delete (PhotoKit), and Apple Intelligence — requires macOS 26+:
|
|
213
|
+
For semantic search, recurring events/reminders (EventKit), photo import/delete (PhotoKit), and Apple Intelligence — requires macOS 26+:
|
|
196
214
|
|
|
197
215
|
```bash
|
|
198
216
|
npm run swift-build
|
package/dist/index.js
CHANGED
|
@@ -33,6 +33,7 @@ import { registerIntelligenceTools } from "./intelligence/tools.js";
|
|
|
33
33
|
import { registerTvTools } from "./tv/tools.js";
|
|
34
34
|
import { registerCrossPrompts } from "./cross/prompts.js";
|
|
35
35
|
import { registerCrossTools } from "./cross/tools.js";
|
|
36
|
+
import { registerSemanticTools } from "./semantic/tools.js";
|
|
36
37
|
import { registerResources } from "./shared/resources.js";
|
|
37
38
|
import { registerSetupTools } from "./shared/setup.js";
|
|
38
39
|
import { parseConfig, isModuleEnabled, MODULE_NAMES } from "./shared/config.js";
|
|
@@ -61,7 +62,7 @@ process.on("SIGTERM", () => { onExit(); process.exit(0); });
|
|
|
61
62
|
function createServer() {
|
|
62
63
|
const server = new McpServer({
|
|
63
64
|
name: "imcp",
|
|
64
|
-
version: "1.
|
|
65
|
+
version: "1.3.0",
|
|
65
66
|
});
|
|
66
67
|
// Install HITL guard before any tool registrations
|
|
67
68
|
if (hitlClient && config.hitl.level !== "off") {
|
|
@@ -133,6 +134,8 @@ function createServer() {
|
|
|
133
134
|
// Cross-module workflows
|
|
134
135
|
registerCrossPrompts(server);
|
|
135
136
|
registerCrossTools(server, config);
|
|
137
|
+
// Semantic search (on-device embeddings via Swift bridge)
|
|
138
|
+
registerSemanticTools(server, config);
|
|
136
139
|
// MCP Resources
|
|
137
140
|
registerResources(server, config);
|
|
138
141
|
// Setup & diagnostics
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Check if any embedding backend is available. */
|
|
2
|
+
export declare function isEmbeddingAvailable(): Promise<boolean>;
|
|
3
|
+
/** Get the current embedding provider name. */
|
|
4
|
+
export declare function getProvider(): Promise<string>;
|
|
5
|
+
/** Embed a single text. Uses Gemini if GEMINI_API_KEY is set, otherwise Swift bridge. */
|
|
6
|
+
export declare function embedText(text: string, language?: string): Promise<number[]>;
|
|
7
|
+
/** Embed multiple texts. Uses Gemini batch API if available, otherwise Swift bridge. */
|
|
8
|
+
export declare function embedBatch(texts: string[], language?: string): Promise<number[][]>;
|
|
9
|
+
/** Cosine similarity between two vectors. */
|
|
10
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { runSwift, checkSwiftBridge } from "../shared/swift.js";
|
|
2
|
+
let _provider = null;
|
|
3
|
+
async function detectProvider() {
|
|
4
|
+
if (_provider !== null)
|
|
5
|
+
return _provider;
|
|
6
|
+
if (process.env.GEMINI_API_KEY) {
|
|
7
|
+
_provider = "gemini";
|
|
8
|
+
return _provider;
|
|
9
|
+
}
|
|
10
|
+
const err = await checkSwiftBridge();
|
|
11
|
+
_provider = err === null ? "swift" : "none";
|
|
12
|
+
return _provider;
|
|
13
|
+
}
|
|
14
|
+
/** Check if any embedding backend is available. */
|
|
15
|
+
export async function isEmbeddingAvailable() {
|
|
16
|
+
return (await detectProvider()) !== "none";
|
|
17
|
+
}
|
|
18
|
+
/** Get the current embedding provider name. */
|
|
19
|
+
export async function getProvider() {
|
|
20
|
+
return detectProvider();
|
|
21
|
+
}
|
|
22
|
+
// ── Gemini Embedding API ──
|
|
23
|
+
const GEMINI_EMBED_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent";
|
|
24
|
+
const GEMINI_BATCH_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:batchEmbedContents";
|
|
25
|
+
const GEMINI_DIMENSION = 768; // good balance of quality vs storage
|
|
26
|
+
async function geminiEmbed(text) {
|
|
27
|
+
const apiKey = process.env.GEMINI_API_KEY;
|
|
28
|
+
const res = await fetch(`${GEMINI_EMBED_URL}?key=${apiKey}`, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/json" },
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
content: { parts: [{ text }] },
|
|
33
|
+
taskType: "SEMANTIC_SIMILARITY",
|
|
34
|
+
outputDimensionality: GEMINI_DIMENSION,
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
const body = await res.text();
|
|
39
|
+
throw new Error(`Gemini API error ${res.status}: ${body}`);
|
|
40
|
+
}
|
|
41
|
+
const data = (await res.json());
|
|
42
|
+
return data.embedding.values;
|
|
43
|
+
}
|
|
44
|
+
async function geminiBatchEmbed(texts) {
|
|
45
|
+
const apiKey = process.env.GEMINI_API_KEY;
|
|
46
|
+
// Gemini batch API: max 100 per request
|
|
47
|
+
const chunks = [];
|
|
48
|
+
for (let i = 0; i < texts.length; i += 100) {
|
|
49
|
+
chunks.push(texts.slice(i, i + 100));
|
|
50
|
+
}
|
|
51
|
+
const allVectors = [];
|
|
52
|
+
for (const chunk of chunks) {
|
|
53
|
+
const res = await fetch(`${GEMINI_BATCH_URL}?key=${apiKey}`, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/json" },
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
requests: chunk.map((text) => ({
|
|
58
|
+
model: "models/gemini-embedding-001",
|
|
59
|
+
content: { parts: [{ text }] },
|
|
60
|
+
taskType: "SEMANTIC_SIMILARITY",
|
|
61
|
+
outputDimensionality: GEMINI_DIMENSION,
|
|
62
|
+
})),
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok) {
|
|
66
|
+
const body = await res.text();
|
|
67
|
+
throw new Error(`Gemini batch API error ${res.status}: ${body}`);
|
|
68
|
+
}
|
|
69
|
+
const data = (await res.json());
|
|
70
|
+
allVectors.push(...data.embeddings.map((e) => e.values));
|
|
71
|
+
}
|
|
72
|
+
return allVectors;
|
|
73
|
+
}
|
|
74
|
+
// ── Public API (auto-selects provider) ──
|
|
75
|
+
/** Embed a single text. Uses Gemini if GEMINI_API_KEY is set, otherwise Swift bridge. */
|
|
76
|
+
export async function embedText(text, language) {
|
|
77
|
+
const provider = await detectProvider();
|
|
78
|
+
if (provider === "gemini") {
|
|
79
|
+
return geminiEmbed(text);
|
|
80
|
+
}
|
|
81
|
+
if (provider === "swift") {
|
|
82
|
+
const result = await runSwift("embed-text", JSON.stringify({ text, language }));
|
|
83
|
+
return result.vector;
|
|
84
|
+
}
|
|
85
|
+
throw new Error("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
|
|
86
|
+
}
|
|
87
|
+
/** Embed multiple texts. Uses Gemini batch API if available, otherwise Swift bridge. */
|
|
88
|
+
export async function embedBatch(texts, language) {
|
|
89
|
+
const provider = await detectProvider();
|
|
90
|
+
if (provider === "gemini") {
|
|
91
|
+
return geminiBatchEmbed(texts);
|
|
92
|
+
}
|
|
93
|
+
if (provider === "swift") {
|
|
94
|
+
const result = await runSwift("embed-batch", JSON.stringify({ texts, language }));
|
|
95
|
+
return result.vectors;
|
|
96
|
+
}
|
|
97
|
+
throw new Error("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
|
|
98
|
+
}
|
|
99
|
+
/** Cosine similarity between two vectors. */
|
|
100
|
+
export function cosineSimilarity(a, b) {
|
|
101
|
+
let dot = 0;
|
|
102
|
+
let magA = 0;
|
|
103
|
+
let magB = 0;
|
|
104
|
+
for (let i = 0; i < a.length; i++) {
|
|
105
|
+
dot += a[i] * b[i];
|
|
106
|
+
magA += a[i] * a[i];
|
|
107
|
+
magB += b[i] * b[i];
|
|
108
|
+
}
|
|
109
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
110
|
+
return denom === 0 ? 0 : dot / denom;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/semantic/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface VectorEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
source: string;
|
|
4
|
+
title: string;
|
|
5
|
+
text: string;
|
|
6
|
+
vector: number[];
|
|
7
|
+
updatedAt: string;
|
|
8
|
+
}
|
|
9
|
+
interface VectorStore {
|
|
10
|
+
version: number;
|
|
11
|
+
indexedAt?: string;
|
|
12
|
+
entries: Record<string, VectorEntry>;
|
|
13
|
+
}
|
|
14
|
+
export interface SearchResult {
|
|
15
|
+
id: string;
|
|
16
|
+
source: string;
|
|
17
|
+
title: string;
|
|
18
|
+
similarity: number;
|
|
19
|
+
}
|
|
20
|
+
/** Upsert one or more entries into the vector store. */
|
|
21
|
+
export declare function upsertEntries(entries: VectorEntry[]): Promise<number>;
|
|
22
|
+
/** Check if the index is empty or stale (older than STALE_MS). */
|
|
23
|
+
export declare function isIndexStale(): Promise<boolean>;
|
|
24
|
+
/** Remove entries by ID prefix (e.g. "note:" removes all notes). */
|
|
25
|
+
export declare function removeByPrefix(prefix: string): Promise<number>;
|
|
26
|
+
/** Search the store by cosine similarity to a query vector. */
|
|
27
|
+
export declare function search(store: VectorStore, queryVector: number[], opts?: {
|
|
28
|
+
topK?: number;
|
|
29
|
+
threshold?: number;
|
|
30
|
+
sources?: string[];
|
|
31
|
+
}): SearchResult[];
|
|
32
|
+
/** Search by query vector against the persisted store. */
|
|
33
|
+
export declare function searchStore(queryVector: number[], opts?: {
|
|
34
|
+
topK?: number;
|
|
35
|
+
threshold?: number;
|
|
36
|
+
sources?: string[];
|
|
37
|
+
}): Promise<SearchResult[]>;
|
|
38
|
+
/** Get store stats. */
|
|
39
|
+
export declare function getStoreStats(): Promise<{
|
|
40
|
+
total: number;
|
|
41
|
+
bySource: Record<string, number>;
|
|
42
|
+
indexedAt: string | null;
|
|
43
|
+
stale: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
/** Find entry by ID. */
|
|
46
|
+
export declare function getEntry(id: string): Promise<VectorEntry | null>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { cosineSimilarity } from "./embeddings.js";
|
|
5
|
+
const STALE_MS = 30 * 60 * 1000; // 30 minutes
|
|
6
|
+
const STORE_DIR = join(homedir(), ".imcp");
|
|
7
|
+
const STORE_PATH = join(STORE_DIR, "vectors.json");
|
|
8
|
+
let cache = null;
|
|
9
|
+
async function loadStore() {
|
|
10
|
+
if (cache)
|
|
11
|
+
return cache;
|
|
12
|
+
try {
|
|
13
|
+
const data = await readFile(STORE_PATH, "utf-8");
|
|
14
|
+
cache = JSON.parse(data);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
cache = { version: 1, entries: {} };
|
|
18
|
+
}
|
|
19
|
+
return cache;
|
|
20
|
+
}
|
|
21
|
+
async function saveStore(store) {
|
|
22
|
+
await mkdir(STORE_DIR, { recursive: true });
|
|
23
|
+
await writeFile(STORE_PATH, JSON.stringify(store), "utf-8");
|
|
24
|
+
cache = store;
|
|
25
|
+
}
|
|
26
|
+
/** Upsert one or more entries into the vector store. */
|
|
27
|
+
export async function upsertEntries(entries) {
|
|
28
|
+
const store = await loadStore();
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
store.entries[entry.id] = entry;
|
|
31
|
+
}
|
|
32
|
+
store.indexedAt = new Date().toISOString();
|
|
33
|
+
await saveStore(store);
|
|
34
|
+
return entries.length;
|
|
35
|
+
}
|
|
36
|
+
/** Check if the index is empty or stale (older than STALE_MS). */
|
|
37
|
+
export async function isIndexStale() {
|
|
38
|
+
const store = await loadStore();
|
|
39
|
+
if (Object.keys(store.entries).length === 0)
|
|
40
|
+
return true;
|
|
41
|
+
if (!store.indexedAt)
|
|
42
|
+
return true;
|
|
43
|
+
return Date.now() - new Date(store.indexedAt).getTime() > STALE_MS;
|
|
44
|
+
}
|
|
45
|
+
/** Remove entries by ID prefix (e.g. "note:" removes all notes). */
|
|
46
|
+
export async function removeByPrefix(prefix) {
|
|
47
|
+
const store = await loadStore();
|
|
48
|
+
let removed = 0;
|
|
49
|
+
for (const key of Object.keys(store.entries)) {
|
|
50
|
+
if (key.startsWith(prefix)) {
|
|
51
|
+
delete store.entries[key];
|
|
52
|
+
removed++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (removed > 0)
|
|
56
|
+
await saveStore(store);
|
|
57
|
+
return removed;
|
|
58
|
+
}
|
|
59
|
+
/** Search the store by cosine similarity to a query vector. */
|
|
60
|
+
export function search(store, queryVector, opts = {}) {
|
|
61
|
+
const { topK = 10, threshold = 0.5, sources } = opts;
|
|
62
|
+
const results = [];
|
|
63
|
+
for (const entry of Object.values(store.entries)) {
|
|
64
|
+
if (sources && !sources.includes(entry.source))
|
|
65
|
+
continue;
|
|
66
|
+
if (entry.vector.length !== queryVector.length)
|
|
67
|
+
continue;
|
|
68
|
+
const sim = cosineSimilarity(queryVector, entry.vector);
|
|
69
|
+
if (sim >= threshold) {
|
|
70
|
+
results.push({
|
|
71
|
+
id: entry.id,
|
|
72
|
+
source: entry.source,
|
|
73
|
+
title: entry.title,
|
|
74
|
+
similarity: Math.round(sim * 1000) / 1000,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
results.sort((a, b) => b.similarity - a.similarity);
|
|
79
|
+
return results.slice(0, topK);
|
|
80
|
+
}
|
|
81
|
+
/** Search by query vector against the persisted store. */
|
|
82
|
+
export async function searchStore(queryVector, opts) {
|
|
83
|
+
const store = await loadStore();
|
|
84
|
+
return search(store, queryVector, opts);
|
|
85
|
+
}
|
|
86
|
+
/** Get store stats. */
|
|
87
|
+
export async function getStoreStats() {
|
|
88
|
+
const store = await loadStore();
|
|
89
|
+
const bySource = {};
|
|
90
|
+
for (const entry of Object.values(store.entries)) {
|
|
91
|
+
bySource[entry.source] = (bySource[entry.source] || 0) + 1;
|
|
92
|
+
}
|
|
93
|
+
const stale = await isIndexStale();
|
|
94
|
+
return { total: Object.keys(store.entries).length, bySource, indexedAt: store.indexedAt ?? null, stale };
|
|
95
|
+
}
|
|
96
|
+
/** Find entry by ID. */
|
|
97
|
+
export async function getEntry(id) {
|
|
98
|
+
const store = await loadStore();
|
|
99
|
+
return store.entries[id] ?? null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/semantic/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { ImcpConfig } from "../shared/config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Semantic search tools — on-device NLContextualEmbedding via Swift bridge.
|
|
5
|
+
* Requires `npm run swift-build` for the Swift bridge binary.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerSemanticTools(server: McpServer, config: ImcpConfig): void;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ok, err } from "../shared/result.js";
|
|
3
|
+
import { isModuleEnabled } from "../shared/config.js";
|
|
4
|
+
import { isEmbeddingAvailable, embedText, embedBatch, getProvider } from "./embeddings.js";
|
|
5
|
+
import { upsertEntries, searchStore, getStoreStats, getEntry, isIndexStale } from "./store.js";
|
|
6
|
+
import { runJxa } from "../shared/jxa.js";
|
|
7
|
+
import { listRemindersScript } from "../reminders/scripts.js";
|
|
8
|
+
/**
|
|
9
|
+
* Semantic search tools — on-device NLContextualEmbedding via Swift bridge.
|
|
10
|
+
* Requires `npm run swift-build` for the Swift bridge binary.
|
|
11
|
+
*/
|
|
12
|
+
export function registerSemanticTools(server, config) {
|
|
13
|
+
const enabled = (mod) => isModuleEnabled(config, mod);
|
|
14
|
+
// ── Index: build/rebuild the vector store from Apple app data ──
|
|
15
|
+
server.registerTool("semantic_index", {
|
|
16
|
+
title: "Build Semantic Index",
|
|
17
|
+
description: "Index data from enabled Apple apps (Notes, Calendar, Reminders, Mail) into the local vector store " +
|
|
18
|
+
"for semantic search. Run this once, then use semantic_search. Requires Swift bridge (npm run swift-build).",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
sources: z
|
|
21
|
+
.array(z.enum(["notes", "calendar", "reminders", "mail"]))
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Which sources to index. Defaults to all enabled modules."),
|
|
24
|
+
},
|
|
25
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
26
|
+
}, async ({ sources }) => {
|
|
27
|
+
if (!(await isEmbeddingAvailable())) {
|
|
28
|
+
return err("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
|
|
29
|
+
}
|
|
30
|
+
// If specific sources requested, filter enabled check per source
|
|
31
|
+
const enabledFilter = sources
|
|
32
|
+
? (mod) => sources.includes(mod) && enabled(mod)
|
|
33
|
+
: enabled;
|
|
34
|
+
try {
|
|
35
|
+
const { indexed, errors } = await runIndex(enabledFilter);
|
|
36
|
+
if (indexed === 0) {
|
|
37
|
+
return err(`No items to index.${errors.length > 0 ? " Errors: " + errors.join("; ") : ""}`);
|
|
38
|
+
}
|
|
39
|
+
const stats = await getStoreStats();
|
|
40
|
+
return ok({
|
|
41
|
+
indexed,
|
|
42
|
+
store: stats,
|
|
43
|
+
...(errors.length > 0 ? { warnings: errors } : {}),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return err(`Indexing failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// ── Search: semantic search across indexed data ──
|
|
51
|
+
server.registerTool("semantic_search", {
|
|
52
|
+
title: "Semantic Search",
|
|
53
|
+
description: "Search across Apple app data by meaning, not just keywords. " +
|
|
54
|
+
"Finds related notes, events, reminders, and emails even if they use different words. " +
|
|
55
|
+
"Auto-indexes on first use and refreshes every 30 minutes.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
query: z.string().describe("Natural language search query"),
|
|
58
|
+
sources: z
|
|
59
|
+
.array(z.enum(["notes", "calendar", "reminders", "mail"]))
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Filter by source type"),
|
|
62
|
+
limit: z.number().int().min(1).max(50).optional().describe("Max results (default 10)"),
|
|
63
|
+
threshold: z.number().min(0).max(1).optional().describe("Minimum similarity (default 0.5)"),
|
|
64
|
+
},
|
|
65
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
66
|
+
}, async ({ query, sources, limit, threshold }) => {
|
|
67
|
+
if (!(await isEmbeddingAvailable())) {
|
|
68
|
+
return err("No embedding backend available. Set GEMINI_API_KEY or run 'npm run swift-build'.");
|
|
69
|
+
}
|
|
70
|
+
// Auto-index if store is empty or stale
|
|
71
|
+
await ensureIndex(enabled);
|
|
72
|
+
const stats = await getStoreStats();
|
|
73
|
+
if (stats.total === 0) {
|
|
74
|
+
return err("No data to search. Ensure at least one Apple app module is enabled.");
|
|
75
|
+
}
|
|
76
|
+
let queryVector;
|
|
77
|
+
try {
|
|
78
|
+
queryVector = await embedText(query);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
return err(`Failed to embed query: ${e instanceof Error ? e.message : String(e)}`);
|
|
82
|
+
}
|
|
83
|
+
const results = await searchStore(queryVector, {
|
|
84
|
+
topK: limit ?? 10,
|
|
85
|
+
threshold: threshold ?? 0.5,
|
|
86
|
+
sources,
|
|
87
|
+
});
|
|
88
|
+
return ok({ query, results, total: results.length, autoIndexed: stats.stale });
|
|
89
|
+
});
|
|
90
|
+
// ── Find Related: given an item, find semantically related items ──
|
|
91
|
+
server.registerTool("find_related", {
|
|
92
|
+
title: "Find Related Items",
|
|
93
|
+
description: "Given a note, event, reminder, or email ID, find semantically related items across all indexed Apple apps. " +
|
|
94
|
+
"Discovers cross-app connections (e.g., a calendar event related to notes and reminders about the same topic).",
|
|
95
|
+
inputSchema: {
|
|
96
|
+
id: z.string().describe("Item ID (as stored in the vector index)"),
|
|
97
|
+
limit: z.number().int().min(1).max(50).optional().describe("Max results (default 10)"),
|
|
98
|
+
threshold: z.number().min(0).max(1).optional().describe("Minimum similarity (default 0.6)"),
|
|
99
|
+
},
|
|
100
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
101
|
+
}, async ({ id, limit, threshold }) => {
|
|
102
|
+
// Auto-index if stale
|
|
103
|
+
await ensureIndex(enabled);
|
|
104
|
+
const entry = await getEntry(id);
|
|
105
|
+
if (!entry) {
|
|
106
|
+
return err(`Item not found in index: ${id}. Try running semantic_index.`);
|
|
107
|
+
}
|
|
108
|
+
const results = await searchStore(entry.vector, {
|
|
109
|
+
topK: (limit ?? 10) + 1, // +1 to exclude self
|
|
110
|
+
threshold: threshold ?? 0.6,
|
|
111
|
+
});
|
|
112
|
+
// Exclude the item itself
|
|
113
|
+
const filtered = results.filter((r) => r.id !== id).slice(0, limit ?? 10);
|
|
114
|
+
return ok({
|
|
115
|
+
item: { id: entry.id, source: entry.source, title: entry.title },
|
|
116
|
+
related: filtered,
|
|
117
|
+
total: filtered.length,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// ── Stats: vector store status ──
|
|
121
|
+
server.registerTool("semantic_status", {
|
|
122
|
+
title: "Semantic Index Status",
|
|
123
|
+
description: "Show the current state of the semantic vector index — total entries, breakdown by source.",
|
|
124
|
+
inputSchema: {},
|
|
125
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
126
|
+
}, async () => {
|
|
127
|
+
const available = await isEmbeddingAvailable();
|
|
128
|
+
const provider = await getProvider();
|
|
129
|
+
const stats = await getStoreStats();
|
|
130
|
+
return ok({ embeddingAvailable: available, provider, ...stats });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// ── Shared indexing logic ──
|
|
134
|
+
let _indexing = null;
|
|
135
|
+
async function runIndex(enabled) {
|
|
136
|
+
const sources = ["notes", "calendar", "reminders", "mail"].filter((m) => enabled(m));
|
|
137
|
+
const entries = [];
|
|
138
|
+
const errors = [];
|
|
139
|
+
for (const source of sources) {
|
|
140
|
+
try {
|
|
141
|
+
const items = await collectItems(source);
|
|
142
|
+
entries.push(...items);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
errors.push(`${source}: ${e instanceof Error ? e.message : String(e)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (entries.length > 0) {
|
|
149
|
+
const texts = entries.map((e) => e.text);
|
|
150
|
+
const vectors = await embedBatch(texts);
|
|
151
|
+
for (let i = 0; i < entries.length; i++) {
|
|
152
|
+
entries[i].vector = vectors[i];
|
|
153
|
+
}
|
|
154
|
+
await upsertEntries(entries);
|
|
155
|
+
}
|
|
156
|
+
return { indexed: entries.length, errors };
|
|
157
|
+
}
|
|
158
|
+
/** Auto-index if store is empty or stale. Deduplicates concurrent calls. */
|
|
159
|
+
async function ensureIndex(enabled) {
|
|
160
|
+
if (!(await isIndexStale()))
|
|
161
|
+
return;
|
|
162
|
+
if (!(await isEmbeddingAvailable()))
|
|
163
|
+
return;
|
|
164
|
+
if (!_indexing) {
|
|
165
|
+
_indexing = runIndex(enabled).then(() => { _indexing = null; }).catch(() => { _indexing = null; });
|
|
166
|
+
}
|
|
167
|
+
await _indexing;
|
|
168
|
+
}
|
|
169
|
+
async function collectItems(source) {
|
|
170
|
+
const now = new Date().toISOString();
|
|
171
|
+
let items;
|
|
172
|
+
switch (source) {
|
|
173
|
+
case "notes":
|
|
174
|
+
items = await collectNotes();
|
|
175
|
+
break;
|
|
176
|
+
case "calendar":
|
|
177
|
+
items = await collectCalendarEvents();
|
|
178
|
+
break;
|
|
179
|
+
case "reminders":
|
|
180
|
+
items = await collectReminders();
|
|
181
|
+
break;
|
|
182
|
+
case "mail":
|
|
183
|
+
items = await collectMail();
|
|
184
|
+
break;
|
|
185
|
+
default:
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
return items.map((item) => ({
|
|
189
|
+
...item,
|
|
190
|
+
vector: [], // filled later by batch embed
|
|
191
|
+
updatedAt: now,
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
async function collectNotes() {
|
|
195
|
+
return runJxa(`
|
|
196
|
+
const Notes = Application('Notes');
|
|
197
|
+
const names = Notes.notes.name();
|
|
198
|
+
const ids = Notes.notes.id();
|
|
199
|
+
const count = Math.min(names.length, 200);
|
|
200
|
+
const indices = Array.from({length: names.length}, (_, i) => i);
|
|
201
|
+
const modDates = Notes.notes.modificationDate();
|
|
202
|
+
indices.sort((a, b) => modDates[b] - modDates[a]);
|
|
203
|
+
const top = indices.slice(0, count);
|
|
204
|
+
const result = top.map(i => {
|
|
205
|
+
const preview = Notes.notes[i].plaintext().substring(0, 300);
|
|
206
|
+
return {
|
|
207
|
+
id: 'note:' + ids[i],
|
|
208
|
+
source: 'notes',
|
|
209
|
+
title: names[i],
|
|
210
|
+
text: names[i] + ' ' + preview
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
JSON.stringify(result);
|
|
214
|
+
`);
|
|
215
|
+
}
|
|
216
|
+
async function collectCalendarEvents() {
|
|
217
|
+
const now = new Date();
|
|
218
|
+
const start = new Date(now.getTime() - 30 * 86400000).toISOString(); // past 30 days
|
|
219
|
+
const end = new Date(now.getTime() + 30 * 86400000).toISOString(); // next 30 days
|
|
220
|
+
return runJxa(`
|
|
221
|
+
const Calendar = Application('Calendar');
|
|
222
|
+
const start = new Date('${start}');
|
|
223
|
+
const end = new Date('${end}');
|
|
224
|
+
const cals = Calendar.calendars();
|
|
225
|
+
const result = [];
|
|
226
|
+
for (const cal of cals) {
|
|
227
|
+
try {
|
|
228
|
+
const events = cal.events.whose({
|
|
229
|
+
_and: [
|
|
230
|
+
{ startDate: { _greaterThan: start } },
|
|
231
|
+
{ startDate: { _lessThan: end } }
|
|
232
|
+
]
|
|
233
|
+
})();
|
|
234
|
+
for (const ev of events) {
|
|
235
|
+
try {
|
|
236
|
+
const summary = ev.summary();
|
|
237
|
+
const loc = ev.location() || '';
|
|
238
|
+
const desc = (ev.description() || '').substring(0, 200);
|
|
239
|
+
result.push({
|
|
240
|
+
id: 'event:' + ev.uid(),
|
|
241
|
+
source: 'calendar',
|
|
242
|
+
title: summary,
|
|
243
|
+
text: summary + ' ' + loc + ' ' + desc
|
|
244
|
+
});
|
|
245
|
+
} catch(e) {}
|
|
246
|
+
}
|
|
247
|
+
} catch(e) {}
|
|
248
|
+
}
|
|
249
|
+
JSON.stringify(result.slice(0, 200));
|
|
250
|
+
`);
|
|
251
|
+
}
|
|
252
|
+
async function collectReminders() {
|
|
253
|
+
const raw = await runJxa(listRemindersScript(undefined, false));
|
|
254
|
+
return raw.slice(0, 200).map((r) => ({
|
|
255
|
+
id: "reminder:" + r.id,
|
|
256
|
+
source: "reminders",
|
|
257
|
+
title: r.name,
|
|
258
|
+
text: r.name + (r.body ? " " + r.body : ""),
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
async function collectMail() {
|
|
262
|
+
return runJxa(`
|
|
263
|
+
const Mail = Application('Mail');
|
|
264
|
+
const result = [];
|
|
265
|
+
try {
|
|
266
|
+
const inbox = Mail.inbox;
|
|
267
|
+
const msgs = inbox.messages();
|
|
268
|
+
const count = Math.min(msgs.length, 100);
|
|
269
|
+
for (let i = 0; i < count; i++) {
|
|
270
|
+
try {
|
|
271
|
+
const m = msgs[i];
|
|
272
|
+
const subject = m.subject();
|
|
273
|
+
const sender = m.sender();
|
|
274
|
+
const excerpt = (m.content() || '').substring(0, 200);
|
|
275
|
+
result.push({
|
|
276
|
+
id: 'mail:' + m.id(),
|
|
277
|
+
source: 'mail',
|
|
278
|
+
title: subject,
|
|
279
|
+
text: subject + ' ' + sender + ' ' + excerpt
|
|
280
|
+
});
|
|
281
|
+
} catch(e) {}
|
|
282
|
+
}
|
|
283
|
+
} catch(e) {}
|
|
284
|
+
JSON.stringify(result);
|
|
285
|
+
`);
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/semantic/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heznpc/imcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "MCP server for the entire Apple ecosystem — Notes, Reminders, Calendar, Contacts, Mail, Messages, Music, Finder, Safari, Photos, Shortcuts, System, and Apple Intelligence. Connect any AI to your Mac.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|