ios-agent-mcp 2.2.0 → 2.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 +6 -2
- package/data/knowledge.json +1 -1
- package/data/local-library.d.mts +5 -0
- package/data/local-library.mjs +60 -0
- package/dist/knowledge.d.ts +68 -0
- package/dist/knowledge.js +32 -4
- package/dist/knowledge.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/mcp.json +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type LocalFile = {path:string;title:string;kind:string;hash:string;characters:number;headings:{title:string;offset:number}[]};
|
|
2
|
+
export type Library = {schemaVersion:number;files:LocalFile[];blobs:Record<string,string>};
|
|
3
|
+
export function buildLibrary(root:string):Library;
|
|
4
|
+
export function searchLibrary(library:Library,query:string,limit?:number,kind?:string):{path:string;title:string;kind:string;characters:number;score:number}[];
|
|
5
|
+
export function readLibrary(library:Library,path:string,offset?:number,maxChars?:number):object;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, relative, extname, basename } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
|
|
5
|
+
const roots = ['docs', 'patterns', 'checklists', 'templates', 'samples'];
|
|
6
|
+
const excluded = new Set(['.git', '.build', 'node_modules', 'dist', '__pycache__']);
|
|
7
|
+
const extensions = new Set(['.md', '.swift', '.metal', '.h', '.m', '.c', '.cpp', '.plist', '.yml', '.yaml', '.json', '.svg']);
|
|
8
|
+
const generated = new Set(['docs/apple/technologies.json', 'docs/apple/updates.json', 'docs/apple/local-library.json', 'docs/apple/local-library.md']);
|
|
9
|
+
|
|
10
|
+
export function buildLibrary(root) {
|
|
11
|
+
const files = [], blobs = {};
|
|
12
|
+
function visit(directory) {
|
|
13
|
+
for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a,b) => a.name.localeCompare(b.name))) {
|
|
14
|
+
if (entry.isSymbolicLink() || excluded.has(entry.name)) continue;
|
|
15
|
+
const absolute = join(directory, entry.name);
|
|
16
|
+
if (entry.isDirectory()) { visit(absolute); continue; }
|
|
17
|
+
const path = relative(root, absolute).split('\\').join('/');
|
|
18
|
+
if (!entry.isFile() || !extensions.has(extname(path)) || generated.has(path)) continue;
|
|
19
|
+
const content = readFileSync(absolute, 'utf8');
|
|
20
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
21
|
+
blobs[hash] = content;
|
|
22
|
+
const headings = [];
|
|
23
|
+
let offset = 0;
|
|
24
|
+
for (const line of content.split('\n')) {
|
|
25
|
+
if (/^#{1,6} /.test(line)) headings.push({ title: line.replace(/^#+ /,''), offset });
|
|
26
|
+
offset += line.length + 1;
|
|
27
|
+
}
|
|
28
|
+
const kind = extname(path) === '.md' ? 'guide' : 'source';
|
|
29
|
+
files.push({ path, title: headings[0]?.title ?? basename(path), kind, hash, characters: content.length, headings });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const name of roots) visit(join(root, name));
|
|
33
|
+
files.sort((a,b) => a.path.localeCompare(b.path));
|
|
34
|
+
return { schemaVersion: 1, files, blobs };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function searchLibrary(library, query, limit = 8, kind = 'all') {
|
|
38
|
+
const terms = query.toLowerCase().match(/[a-z0-9_]+/g) ?? [];
|
|
39
|
+
if (!terms.length) return [];
|
|
40
|
+
return library.files.filter(f => kind === 'all' || f.kind === kind).map(file => {
|
|
41
|
+
const title = (file.title + ' ' + file.path).toLowerCase();
|
|
42
|
+
const body = library.blobs[file.hash].toLowerCase();
|
|
43
|
+
const score = terms.reduce((total, word) => total + (title.includes(word) ? 20 : body.includes(word) ? 1 : 0), 0);
|
|
44
|
+
const matches = terms.every(word => title.includes(word) || body.includes(word));
|
|
45
|
+
return { file, score, matches };
|
|
46
|
+
}).filter(row => row.matches).sort((a,b) => b.score-a.score || a.file.path.localeCompare(b.file.path)).slice(0,limit)
|
|
47
|
+
.map(({file,score}) => ({ path:file.path, title:file.title, kind:file.kind, characters:file.characters, score }));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function readLibrary(library, path, offset = 0, maxChars = 6000) {
|
|
51
|
+
const file = library.files.find(file => file.path === path);
|
|
52
|
+
if (!file) return { error: 'Unknown local reference. Search first; only indexed repository files can be read.' };
|
|
53
|
+
if (!Number.isInteger(offset) || offset < 0 || offset > file.characters || !Number.isInteger(maxChars) || maxChars < 1 || maxChars > 16000) {
|
|
54
|
+
return { error: 'Use an offset within the file and maxChars between 1 and 16000.' };
|
|
55
|
+
}
|
|
56
|
+
const content = library.blobs[file.hash].slice(offset, offset + maxChars);
|
|
57
|
+
const nextOffset = offset + content.length < file.characters ? offset + content.length : null;
|
|
58
|
+
return { path:file.path, kind:file.kind, hash:file.hash, offset, totalCharacters:file.characters, content, nextOffset,
|
|
59
|
+
evidence: file.kind === 'source' ? 'Repository source; consult the owning sample README for build/test evidence.' : 'Repository guidance; code blocks may include incomplete examples and explicitly labelled anti-patterns.' };
|
|
60
|
+
}
|
package/dist/knowledge.d.ts
CHANGED
|
@@ -40,6 +40,74 @@ export declare function lookupTechnology(id: string): {
|
|
|
40
40
|
deprecated: boolean;
|
|
41
41
|
error?: undefined;
|
|
42
42
|
};
|
|
43
|
+
export declare function searchLocalReferences(query: string, limit?: number, kind?: string): {
|
|
44
|
+
path: string;
|
|
45
|
+
title: string;
|
|
46
|
+
kind: string;
|
|
47
|
+
characters: number;
|
|
48
|
+
score: number;
|
|
49
|
+
}[];
|
|
50
|
+
export declare function readLocalReference(path: string, offset?: number, maxChars?: number): object;
|
|
51
|
+
export declare function referenceOutline(path: string): {
|
|
52
|
+
path: string;
|
|
53
|
+
characters: number;
|
|
54
|
+
headings: {
|
|
55
|
+
title: string;
|
|
56
|
+
offset: number;
|
|
57
|
+
}[];
|
|
58
|
+
error?: undefined;
|
|
59
|
+
} | {
|
|
60
|
+
error: string;
|
|
61
|
+
path?: undefined;
|
|
62
|
+
characters?: undefined;
|
|
63
|
+
headings?: undefined;
|
|
64
|
+
};
|
|
65
|
+
export declare function technologyOverview(id: string): {
|
|
66
|
+
error: string;
|
|
67
|
+
name?: undefined;
|
|
68
|
+
id?: undefined;
|
|
69
|
+
summary?: undefined;
|
|
70
|
+
platforms?: undefined;
|
|
71
|
+
deprecated?: undefined;
|
|
72
|
+
guide?: undefined;
|
|
73
|
+
outline?: undefined;
|
|
74
|
+
localSources?: undefined;
|
|
75
|
+
appleSource?: undefined;
|
|
76
|
+
checkedAt?: undefined;
|
|
77
|
+
evidence?: undefined;
|
|
78
|
+
} | {
|
|
79
|
+
name: string;
|
|
80
|
+
id: string;
|
|
81
|
+
summary: string;
|
|
82
|
+
platforms: unknown[];
|
|
83
|
+
deprecated: boolean;
|
|
84
|
+
guide: string;
|
|
85
|
+
outline: {
|
|
86
|
+
path: string;
|
|
87
|
+
characters: number;
|
|
88
|
+
headings: {
|
|
89
|
+
title: string;
|
|
90
|
+
offset: number;
|
|
91
|
+
}[];
|
|
92
|
+
error?: undefined;
|
|
93
|
+
} | {
|
|
94
|
+
error: string;
|
|
95
|
+
path?: undefined;
|
|
96
|
+
characters?: undefined;
|
|
97
|
+
headings?: undefined;
|
|
98
|
+
};
|
|
99
|
+
localSources: {
|
|
100
|
+
path: string;
|
|
101
|
+
title: string;
|
|
102
|
+
kind: string;
|
|
103
|
+
characters: number;
|
|
104
|
+
score: number;
|
|
105
|
+
}[];
|
|
106
|
+
appleSource: string;
|
|
107
|
+
checkedAt: string;
|
|
108
|
+
evidence: string;
|
|
109
|
+
error?: undefined;
|
|
110
|
+
};
|
|
43
111
|
export declare function lookupUpdates(query: string, limit: number): {
|
|
44
112
|
checkedAt: string;
|
|
45
113
|
results: Update[];
|
package/dist/knowledge.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { searchLibrary, readLibrary } from '../data/local-library.mjs';
|
|
1
2
|
import { readFileSync } from 'node:fs';
|
|
2
3
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
4
|
import { z } from 'zod';
|
|
@@ -17,9 +18,28 @@ export function lookupTechnology(id) {
|
|
|
17
18
|
const t = bundle.catalog.technologies.find(t => t.slug === id || normalize(t.name) === normalize(id));
|
|
18
19
|
if (!t)
|
|
19
20
|
return { error: 'Technology not found. Use search_apple_technologies first.' };
|
|
20
|
-
return { ...t, checkedAt: bundle.catalog.checkedAt, guideText: bundle.
|
|
21
|
+
return { ...t, checkedAt: bundle.catalog.checkedAt, guideText: bundle.library.blobs[bundle.library.files.find(f => f.path === t.guide).hash],
|
|
21
22
|
evidence: 'Source snapshot and authored/reference guidance; not proof of runtime or compilation.' };
|
|
22
23
|
}
|
|
24
|
+
export function searchLocalReferences(query, limit = 8, kind = 'all') {
|
|
25
|
+
return searchLibrary(bundle.library, query, limit, kind);
|
|
26
|
+
}
|
|
27
|
+
export function readLocalReference(path, offset = 0, maxChars = 6000) {
|
|
28
|
+
return readLibrary(bundle.library, path, offset, maxChars);
|
|
29
|
+
}
|
|
30
|
+
export function referenceOutline(path) {
|
|
31
|
+
const file = bundle.library.files.find(f => f.path === path);
|
|
32
|
+
return file ? { path: file.path, characters: file.characters, headings: file.headings } : { error: 'Unknown indexed reference' };
|
|
33
|
+
}
|
|
34
|
+
export function technologyOverview(id) {
|
|
35
|
+
const t = bundle.catalog.technologies.find(t => t.slug === id || normalize(t.name) === normalize(id));
|
|
36
|
+
if (!t)
|
|
37
|
+
return { error: 'Technology not found. Search first.' };
|
|
38
|
+
return { name: t.name, id: t.slug, summary: t.summary, platforms: t.platforms, deprecated: t.deprecated,
|
|
39
|
+
guide: t.guide, outline: referenceOutline(t.guide), localSources: searchLocalReferences(t.name, 5, 'source'),
|
|
40
|
+
appleSource: t.url, checkedAt: bundle.catalog.checkedAt,
|
|
41
|
+
evidence: 'Local guidance and reusable source where available. Directory coverage does not mean every Apple technology has a complete implementation.' };
|
|
42
|
+
}
|
|
23
43
|
export function lookupUpdates(query, limit) {
|
|
24
44
|
const q = query.toLowerCase();
|
|
25
45
|
return { checkedAt: bundle.updates.checkedAt, results: bundle.updates.entries.filter(r => !q || r.title.toLowerCase().includes(q) || r.topics.some(t => t.title.toLowerCase().includes(q))).slice(0, limit),
|
|
@@ -53,17 +73,25 @@ export function iconPlan(appName, concept) {
|
|
|
53
73
|
guidance: bundle.iconGuide };
|
|
54
74
|
}
|
|
55
75
|
export function createKnowledgeServer() {
|
|
56
|
-
const server = new McpServer({ name: 'ios-agent-knowledge', version: VERSION }, { instructions: 'Look up Apple technologies and updates before implementation. This server reads only bundled public reference data; it cannot access local projects, write files, build, or publish apps. Use a local coding agent and CLI for implementation.' });
|
|
76
|
+
const server = new McpServer({ name: 'ios-agent-knowledge', version: VERSION }, { instructions: 'Search local references first, then read only needed file ranges. Use source files for reuse and guides for context; avoid loading the entire library. Look up Apple technologies and updates before implementation. This server reads only bundled public reference data; it cannot access local projects, write files, build, or publish apps. Use a local coding agent and CLI for implementation.' });
|
|
57
77
|
server.registerTool('search_apple_technologies', { title: 'Search Apple technologies', description: 'Find Apple frameworks, tools, services and legacy technologies in the bundled 405-entry source snapshot.',
|
|
58
78
|
inputSchema: { query: z.string().min(1).max(200), limit: z.number().int().min(1).max(30).default(10) }, annotations: hints }, async ({ query, limit }) => result({ checkedAt: bundle.catalog.checkedAt, results: searchTechnologies(query, limit) }));
|
|
59
|
-
server.registerTool('get_apple_technology', { title: 'Read Apple technology guide', description: '
|
|
60
|
-
inputSchema: { id: z.string().min(1).max(200) }, annotations: hints }, async ({ id }) => result(lookupTechnology(id)));
|
|
79
|
+
server.registerTool('get_apple_technology', { title: 'Read Apple technology guide', description: 'Get a compact technology overview and local source routes by default. Use view full only when the entire guide and API topic map are required.',
|
|
80
|
+
inputSchema: { id: z.string().min(1).max(200), view: z.enum(['overview', 'full']).default('overview') }, annotations: hints }, async ({ id, view }) => result(view === 'full' ? lookupTechnology(id) : technologyOverview(id)));
|
|
61
81
|
server.registerTool('get_apple_updates', { title: 'Find Apple updates and release notes', description: 'Search dated Apple update and release-note landing pages with version-specific source links. Does not claim live results.',
|
|
62
82
|
inputSchema: { query: z.string().max(200).default(''), limit: z.number().int().min(1).max(30).default(10) }, annotations: hints }, async ({ query, limit }) => result(lookupUpdates(query, limit)));
|
|
63
83
|
server.registerTool('plan_ios_app', { title: 'Plan an iOS app from a brief', description: 'Return an implementation workflow and safe CLI argument array for a named app. No files are created and no build is claimed.',
|
|
64
84
|
inputSchema: { name: z.string().max(64).refine(validAppName, 'Use a non-reserved Swift-safe app name'), brief: z.string().min(5).max(8000) }, annotations: hints }, async ({ name, brief }) => result(appPlan(name, brief)));
|
|
65
85
|
server.registerTool('plan_app_icon', { title: 'Plan layered Icon Composer artwork', description: 'Return a separate-layer icon specification, Apple workflow and appearance checks. Does not fabricate a native .icon document.',
|
|
66
86
|
inputSchema: { appName: z.string().min(1).max(100), concept: z.string().min(3).max(2000) }, annotations: hints }, async ({ appName, concept }) => result(iconPlan(appName, concept)));
|
|
87
|
+
server.registerTool('search_local_references', { title: 'Search bundled source and guides',
|
|
88
|
+
description: 'Search complete repository guides, Swift source, templates and assets offline. Returns compact file matches without loading bodies. Source files and guide code blocks have different verification status.',
|
|
89
|
+
inputSchema: { query: z.string().min(1).max(200), limit: z.number().int().min(1).max(20).default(8), kind: z.enum(['all', 'source', 'guide']).default('all') }, annotations: hints }, async ({ query, limit, kind }) => result({ results: searchLocalReferences(query, limit, kind) }));
|
|
90
|
+
server.registerTool('read_local_reference', { title: 'Read local source or guide',
|
|
91
|
+
description: 'Read exact bundled file content in bounded character ranges. Use nextOffset to continue without omission; no network or user filesystem access. Offset is a JavaScript UTF-16 string index.',
|
|
92
|
+
inputSchema: { path: z.string().min(1).max(300), offset: z.number().int().min(0).default(0), maxChars: z.number().int().min(1).max(16000).default(6000) }, annotations: hints }, async ({ path, offset, maxChars }) => result(readLocalReference(path, offset, maxChars)));
|
|
93
|
+
server.registerTool('get_reference_outline', { title: 'Outline a local guide', description: 'Get heading offsets so only the relevant section needs to be read.',
|
|
94
|
+
inputSchema: { path: z.string().min(1).max(300) }, annotations: hints }, async ({ path }) => result(referenceOutline(path)));
|
|
67
95
|
return server;
|
|
68
96
|
}
|
|
69
97
|
//# sourceMappingURL=knowledge.js.map
|
package/dist/knowledge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "2.
|
|
1
|
+
export declare const VERSION = "2.3.0";
|
package/dist/version.js
CHANGED
package/mcp.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ios-agent-mcp",
|
|
3
3
|
"displayName": "iOS Agent",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.0",
|
|
5
5
|
"description": "Static analysis for modern iOS/Swift projects — Swift 6 actor isolation, architecture boundaries, SwiftUI, availability guards, and App Store readiness — plus a linter for Agent Skill repositories.",
|
|
6
6
|
"author": "Nagarjuna Reddy",
|
|
7
7
|
"license": "MIT",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ios-agent-mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "MCP server for modern iOS/Swift development — concurrency isolation, architecture boundaries, SwiftUI, and App Store readiness analysis",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "node scripts/sync-version.mjs && node scripts/bundle-knowledge.mjs && tsc",
|
|
23
23
|
"test": "node --test test/*.test.js",
|
|
24
|
-
"typecheck": "node scripts/sync-version.mjs && tsc --noEmit",
|
|
24
|
+
"typecheck": "node scripts/sync-version.mjs && node scripts/bundle-knowledge.mjs && tsc --noEmit",
|
|
25
25
|
"prepublishOnly": "npm run build && npm test",
|
|
26
26
|
"sync-version": "node scripts/sync-version.mjs"
|
|
27
27
|
},
|