Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/debugswift/xcodebazelmcp/tool-handler-developmentnpx skills add DebugSwift/XcodeBazelMCP --skill tool-handler-developmentgit clone --depth 1 https://github.com/DebugSwift/XcodeBazelMCPWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00037 | $0.00689 |
| Opus 5 | $0.00018 | $0.00345 |
| Sonnet 5 | $0.00007 | $0.00138 |
| Haiku 4.5 | $0.00004 | $0.00069 |
Grade A, and why
tool-handler-development scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 69 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Tool Handler Development
Handler Contract
Every handler file under src/tools/handlers/ must export:
export const definitions: ToolDefinition[] = [...]
export function canHandle(name: string): boolean { ... }
export function handle(name: string, args: Record<string, unknown>): Promise<ToolResult | undefined>
canHandlereturnstruefor tool names this handler owns.handlereturnsundefinedfor unknown tools (not an error).definitionsis an array of tool definitions withname,description,inputSchema, and optionalstartupArgs,streaming,requiredfields.
Adding a New Tool
- Pick the right handler file based on domain (build, simulator, device, etc.) or create a new one.
- Add the tool definition to
definitions. - Add the case to
handle(). - If it's a new handler file, register it in
src/tools/bazel-tools.ts(import + add to the aggregated arrays). - Update the expected tool count in
handlers/handlers.test.ts. - If the tool uses Bazel commands, include
startupArgsin the schema.
Tool Definition Schema
{
name: 'bazel_ios_<action>',
description: 'One-line description of what the tool does',
inputSchema: {
type: 'object',
properties: { ... },
required: ['target'],
},
startupArgs: true, // if tool accepts --startup_arg flags
streaming: true, // if tool supports streaming output
}
Workflow Categories
Tools belong to one of 19 workflows: build, test, simulator, app_lifecycle, capture, ui_automation, deep_links, device, lldb, macos, tvos, watchos, visionos, spm, project, scaffold, session, daemon, update.
Assign the workflow in the handler or the workflow mapping. bazel_list_workflows and bazel_toggle_workflow are always included regardless of filtering.
Common Patterns
- Use
asStringArray(args.configs, 'configs')for array params — don't double-wrap withconfigArgs(). - Use
resolveSimulatorFromArgs(args)for simulator resolution (returns{ sim, warning }). - Use
prependWarning(message, warning)to attach resolution warnings to output. - Wrap
readBundleIdcalls in try/catch — they can throw after a successful build+install. - Escape quotes in
--predicatestrings:.replace(/"/g, '\\"')on interpolated values.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 69 lines · 37 tokens per session scan A 9ae9784fe77f
tool-handler-development is a skill published in the GitHub repository DebugSwift/XcodeBazelMCP (7 stars, last pushed 1mo ago), licensed MIT. It adds 37 tokens to every session and 689 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
test
Run tests. Use after code changes to validate. Arguments: unit (default, no GPU), e2e (with models), filter name, or all.
boutique-store
Create and use Boutique Store for Swift data persistence, including initialization, @Stored controllers, CRUD operations, operation chaining, and granular event monitoring. Use when persisting arrays of items, building data controllers, or working with Boutique's Store type.
boutique-stored-values
Persist individual values with Boutique's @StoredValue (UserDefaults) and @SecurelyStoredValue (Keychain), including set, reset, toggle, bindings, keypath setters, array and dictionary helpers, and async observation. Use when storing preferences, settings, feature flags, or sensitive data like auth tokens.
boutique-swiftui
Integrate Boutique with SwiftUI views using onChange, onStoreDidLoad, bindings, and preview stores. Use when building SwiftUI views that display or react to Boutique-persisted data.
analyze-db-logs
Analyze Drift / SQLite slow-query and super-slow-query logs against this app's known stall patterns (read waves, N+1, transaction scoping, MultiExecutor contention, WAL/OS factors).
review-comments
Fetch PR review comments, address each one in code, and post resolution replies.