
Sosumi
- 963 installs
- 457 repo stars
- Updated July 27, 2026
- nshipster/sosumi.ai
Helps with ai & agent building tasks.
About
sosumi is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- sosumi
- AI & Agent Building
- AI-coding skill
Sosumi by the numbers
- 963 all-time installs (skills.sh)
- +90 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #1,140 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/nshipster/sosumi.ai --skill sosumiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 963 |
|---|---|
| repo stars | ★ 457 |
| Last updated | July 27, 2026 |
| Repository | nshipster/sosumi.ai ↗ |
What it does
Helps with ai & agent building tasks.
Files
Sosumi Skill
Use this skill to reliably fetch Apple docs as Markdown when coding agents need precise API details.
When to Use
Use Sosumi when the request involves any of the following:
- Apple platform APIs (
Swift,SwiftUI,UIKit,AppKit,Foundation, etc.) - API signatures, availability, parameter behavior, or return semantics
- Human Interface Guidelines questions
- WWDC session transcript lookup
- External Swift-DocC documentation (for example, GitHub Pages or Swift Package Index hosts)
Core Workflow
1. If you already have a developer.apple.com URL, replace the host with sosumi.ai and keep the same path. 2. If you do not know the exact page path, search first, then fetch the best match. 3. Prefer specific symbol pages instead of broad top-level pages when answering implementation questions.
Optional CLI Preflight
If the Sosumi CLI is available, quickly verify local access before deeper debugging:
sosumi --versionconfirms the CLI is installed and onPATH.sosumi --helpshows top-level usage.sosumi <command> --helpis the manual for command-specific behavior.
HTTP Usage
Replace developer.apple.com with sosumi.ai:
- Original:
https://developer.apple.com/documentation/swift/array - AI-readable:
https://sosumi.ai/documentation/swift/array
Content Types
Apple API Reference
- Pattern:
https://sosumi.ai/documentation/{framework}/{symbol} - Examples:
https://sosumi.ai/documentation/swift/arrayhttps://sosumi.ai/documentation/swiftui/view
Human Interface Guidelines
- Pattern:
https://sosumi.ai/design/human-interface-guidelines/{topic} - Examples:
https://sosumi.ai/design/human-interface-guidelineshttps://sosumi.ai/design/human-interface-guidelines/foundations/color
Apple Video Transcripts
- Pattern:
https://sosumi.ai/videos/play/{collection}/{id} - Examples:
https://sosumi.ai/videos/play/wwdc2021/10133https://sosumi.ai/videos/play/meet-with-apple/208
External Swift-DocC
- Pattern:
https://sosumi.ai/external/{full-https-url} - Examples:
https://sosumi.ai/external/https://apple.github.io/swift-argument-parser/documentation/argumentparser/https://sosumi.ai/external/https://swiftpackageindex.com/pointfreeco/swift-composable-architecture/1.23.1/documentation/composablearchitecture
MCP Tools Quick Reference
Use these when Sosumi is configured as an MCP server (https://sosumi.ai/mcp):
| Tool | Parameters | Use |
|---|---|---|
searchAppleDocumentation | query: string | Search Apple documentation and return structured results |
fetchAppleDocumentation | path: string | Fetch Apple docs or HIG content by path as Markdown |
fetchAppleVideoTranscript | path: string | Fetch Apple video transcript by /videos/play/... path |
fetchExternalDocumentation | url: string | Fetch external Swift-DocC page by absolute HTTPS URL |
Best Practices
- Search first if the exact path is unknown.
- Fetch targeted symbol pages for coding questions.
- Keep source links in answers so users can verify details quickly.
- Use Sosumi paths directly in responses whenever referencing Apple documentation pages.
Troubleshooting
404 or sparse output
- The path may be incorrect or too broad.
- Run a search query first, then fetch a specific result path.
External page cannot be fetched
- The host may block access via
robots.txtorX-Robots-Tagdirectives. - Try another canonical page URL for the same symbol.
/sosumi.m4a
Cache-Control: public, max-age=31556952, immutable
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<!-- https://www.streamlinehq.com/icons/pixel?icon=ico_girK3NdW2U5HOWO0 -->
<path fill="currentColor"
d="M21.72 4.575V0H10.29v1.14H5.715v1.148H2.287v8.002h-1.14v2.28H0V24h24V4.575zM5.715 22.86H1.148v-6.863h4.567zm0-8.002h-2.28V3.428h2.28zm1.148-12.57h3.427v1.14H8.003v11.43h-1.14zm3.427 2.287v10.282H9.15V4.575zm1.14 18.285H6.863v-6.863h4.567zm11.43 0H12.578v-8.003H11.43V1.14h9.143v3.435h-3.428v1.14h5.715z" />
<path fill="currentColor"
d="M19.433 15.997h1.14v1.148h-1.14zM19.433 13.717h1.14v1.14h-1.14zM17.145 17.145h2.287v1.14h-2.287zM16.005 15.997h1.14v1.148h-1.14zM16.005 13.717h1.14v1.14h-1.14zM16.005 5.715h1.14v2.287h-1.14zM14.857 8.002h1.148v2.288h-1.147zM13.717 10.29h1.14v2.28h-1.14zM13.717 2.287h1.14v1.14h-1.14zM12.578 12.57h1.14v2.287h-1.14zM8.002 18.285h2.288v2.287H8.003zM2.287 18.285h2.288v2.287H2.287z" />
</svg><?xml version="1.0" encoding="UTF-8"?>
<!--Generator: Apple Native CoreSVG 326-->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 23.6475 23.3041">
<g>
<rect height="23.3041" opacity="0" width="23.6475" x="0" y="0" />
<path
d="M15.5591 4.88935L6.08643 4.88935C5.10986 4.88935 4.56299 5.41669 4.56299 6.43232L4.56299 17.5163C4.56299 18.5319 5.10986 19.0495 6.08643 19.0495L17.2095 19.0495C18.186 19.0495 18.7231 18.5319 18.7231 17.5163L18.7231 8.12957L20.2954 6.55445L20.2954 17.5944C20.2954 19.6159 19.27 20.6218 17.229 20.6218L6.05713 20.6218C4.02588 20.6218 2.99072 19.6159 2.99072 17.5944L2.99072 6.34443C2.99072 4.33271 4.02588 3.31708 6.05713 3.31708L17.1313 3.31708Z"
fill="white" fill-opacity="0.85" />
<path
d="M9.61182 14.2936L11.5161 13.4636L20.6372 4.35224L19.2993 3.03388L10.188 12.1452L9.30908 13.9811C9.23096 14.1472 9.42627 14.3718 9.61182 14.2936ZM21.3599 3.63935L22.063 2.91669C22.395 2.56513 22.395 2.09638 22.063 1.77412L21.8384 1.53974C21.5356 1.23701 21.0571 1.27607 20.7349 1.58857L20.022 2.29169Z"
fill="white" fill-opacity="0.85" />
</g>
</svg><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sosumi.ai - Apple Docs for LLMs</title>
<meta name="description"
content="sosumi.ai provides Apple Developer documentation in an AI-readable format by converting JavaScript-rendered pages into Markdown.">
<meta name="author" content="sosumi.ai">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://sosumi.ai/">
<meta property="og:title" content="sosumi.ai - Apple Docs for LLMs">
<meta property="og:description"
content="sosumi.ai provides Apple Developer documentation in an AI-readable format by converting JavaScript-rendered pages into Markdown.">
<meta property="og:url" content="https://sosumi.ai/">
<meta property="og:site_name" content="sosumi.ai">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="sosumi.ai - Apple Docs for LLMs">
<meta name="twitter:description"
content="sosumi.ai provides Apple Developer documentation in an AI-readable format by converting JavaScript-rendered pages into Markdown.">
<meta name="theme-color" content="#d68d6e" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#ec9b7f" media="(prefers-color-scheme: dark)">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="sosumi.ai">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="/favicon.ico">
<link rel="preload" href="/sosumi.m4a" as="audio" type="audio/mp4">
<script src="/webmcp.js" defer></script>
<style>
:root {
color-scheme: light dark;
--font-sans: -apple-system, BlinkMacSystemFont, 'SF Pro Text', sans-serif;
--font-mono: 'SF Mono', monospace;
--text: oklch(15% 0 0);
--text-secondary: oklch(35% 0 0);
--text-tertiary: oklch(55% 0 0);
--surface: oklch(98% 0 0);
--surface-inset: oklch(95% 0.02 70);
--surface-inset-deep: oklch(90% 0.05 70);
--border: oklch(20% 0.1 70);
--link: oklch(65% 0.15 70);
--accent: oklch(78% 0.18 70);
--accent-hover: oklch(85% 0.2 70);
--code-key-color: oklch(60% 0.15 70);
--code-string-color: oklch(55% 0.2 70);
--code-punctuation-color: var(--text-tertiary);
}
@media (prefers-color-scheme: dark) {
:root {
--text: oklch(92% 0.02 70);
--text-secondary: oklch(75% 0.05 70);
--text-tertiary: oklch(55% 0.08 70);
--surface: oklch(18% 0 0);
--surface-inset: oklch(12% 0.02 70);
--surface-inset-deep: oklch(15% 0.05 70);
--border: oklch(25% 0.1 70);
--accent: oklch(85% 0.2 70);
--accent-hover: oklch(92% 0.22 70);
--code-key-color: oklch(75% 0.15 70);
--code-string-color: oklch(70% 0.2 70);
}
}
html {
font-size: 100%;
}
body {
font-family: var(--font-sans);
color: var(--text);
background-color: var(--surface);
max-width: 52rem;
margin: 3rem auto;
padding: 1.5rem;
line-height: 1.6;
}
h1 {
font-size: 3rem;
margin-bottom: 0;
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 0.5rem;
}
h1 a {
color: var(--text) !important;
}
h1 svg {
width: 2rem;
height: 2rem;
color: var(--accent);
cursor: cell;
user-select: none;
}
h2 {
margin-top: 1.5625rem;
margin-bottom: 0.625rem;
color: var(--text-secondary);
}
h3 {
margin-top: 1.5625rem;
margin-bottom: 0.625rem;
color: var(--text-secondary);
}
dl code {
padding: 0;
}
dt {
font-weight: 500;
}
dt code {
padding-left: 0.25rem;
padding-right: 0.25rem;
margin-left: -0.25rem;
}
dd {
margin-left: 0;
}
dd+dt {
margin-top: 0.9375rem;
}
var {
font-style: normal;
font-weight: 500;
font-family: var(--font-mono);
color: var(--accent);
}
.icon {
width: 1rem;
height: 1rem;
vertical-align: middle;
padding-bottom: 0.125rem;
}
.install-button img {
display: inline-block;
border-radius: 0.5rem;
border: 1px solid transparent;
transition: border 0.2s, background 0.2s;
}
.install-button img:hover {
text-decoration: none;
border: 1px solid var(--accent);
}
figure {
margin: 0;
}
code.no-wrap {
white-space: nowrap;
}
#clients {
margin-top: 1.5rem;
}
#mcp ul {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding-left: 1rem;
list-style: none;
}
#mcp ul li {
margin-bottom: 1rem;
}
#mcp dd {
color: var(--text-secondary);
}
#mcp dd strong {
font-weight: 400;
color: var(--text);
display: inline-block;
padding-bottom: 0.5rem;
}
#clients .editor-config {
margin-top: 1.5rem;
}
#clients .config-tabs {
display: flex;
flex-direction: column;
gap: 2rem;
}
#clients .interface-tabs,
#clients .mcp-tabs,
#cli .cli-tabs,
#skill .skill-tabs {
background: var(--surface-inset);
border-radius: 0.5rem;
overflow: hidden;
}
#clients .mcp-tabs .tab-buttons,
#cli .cli-tabs .tab-buttons,
#skill .skill-tabs .tab-buttons {
display: flex;
border-bottom: 1px solid var(--border);
}
#clients .mcp-tabs .tab-button,
#cli .cli-tabs .tab-button,
#skill .skill-tabs .tab-button {
flex: 1;
padding: 1rem 1.5rem;
background: transparent;
border: none;
color: var(--text-secondary);
font-family: var(--font-sans);
font-size: 1rem;
cursor: pointer;
transition: all 0.2s ease;
border-bottom: 2px solid transparent;
}
#clients .mcp-tabs .tab-button:hover,
#cli .cli-tabs .tab-button:hover,
#skill .skill-tabs .tab-button:hover {
color: var(--text);
background: var(--surface-inset-deep);
}
#clients .mcp-tabs .tab-button.active,
#cli .cli-tabs .tab-button.active,
#skill .skill-tabs .tab-button.active {
color: var(--text);
border-bottom-color: var(--accent);
background: var(--surface);
}
#clients .mcp-tabs .tab-content,
#skill .skill-tabs .tab-content {
position: relative;
}
#clients .mcp-tabs .tab-pane,
#cli .cli-tabs .tab-pane,
#skill .skill-tabs .tab-pane {
display: none;
padding: 1.5rem;
}
#clients .mcp-tabs .tab-pane.active,
#cli .cli-tabs .tab-pane.active,
#skill .skill-tabs .tab-pane.active {
display: block;
}
#clients .mcp-tabs .tab-pane h3 {
margin-top: 0;
margin-bottom: 1rem;
color: var(--text);
}
#clients .mcp-tabs .tab-pane h4 {
margin-top: 1.5rem;
margin-bottom: 0.75rem;
color: var(--text-secondary);
font-size: 1rem;
}
#clients .mcp-tabs .tab-pane ol {
margin: 0.75rem 0;
padding-left: 1.5rem;
}
#clients .mcp-tabs .tab-pane li {
margin-bottom: 0.5rem;
}
#clients .mcp-tabs .tab-pane p,
#cli .cli-tabs .tab-pane p,
#skill .skill-tabs .tab-pane p {
margin: 0.75rem 0;
}
#clients .mcp-tabs .tab-pane em {
color: var(--text-secondary);
font-style: italic;
}
#cli .cli-tabs {
margin-top: 1.5rem;
}
@media (max-width: 768px) {
#clients .mcp-tabs .tab-buttons,
#cli .cli-tabs .tab-buttons,
#skill .skill-tabs .tab-buttons {
flex-direction: column;
}
#clients .mcp-tabs .tab-button,
#cli .cli-tabs .tab-button,
#skill .skill-tabs .tab-button {
border-bottom: 1px solid var(--border);
border-right: none;
}
#clients .mcp-tabs .tab-button.active,
#cli .cli-tabs .tab-button.active,
#skill .skill-tabs .tab-button.active {
border-bottom-color: var(--border);
border-right: 2px solid var(--accent);
}
}
.tagline {
color: var(--text-secondary);
font-size: 1.25rem;
margin-bottom: 2.5rem;
line-height: 1.2;
}
.tagline span {
display: inline-block;
}
.tagline em {
font-size: smaller;
opacity: 0.8;
}
code {
background: var(--surface-inset);
padding: 0.125rem;
font-family: var(--font-mono);
word-break: break-all;
overflow-wrap: break-word;
}
pre {
background: var(--surface-inset);
padding: 1.25rem;
border-radius: 0.5rem;
overflow-x: auto;
}
pre code {
background: none;
padding: 0;
word-break: normal;
overflow-wrap: normal;
}
main header {
margin-bottom: 2rem;
}
code a {
word-break: break-word;
overflow-wrap: anywhere;
}
h4 {
margin-top: 1.5625rem;
margin-bottom: 0.625rem;
color: var(--text-secondary);
}
q {
font-style: italic;
}
footer {
margin-top: 3.75rem;
padding-top: 1.25rem;
border-top: 1px solid var(--border);
color: var(--text-tertiary);
font-size: 0.875rem;
display: flex;
flex-direction: row;
gap: 1.25rem;
}
footer #disclaimer {
flex: 1;
}
footer aside {
flex: 1;
}
main>section {
border-top: 1px solid var(--border);
padding-bottom: 1rem;
padding-top: 2rem;
}
section header {
background: var(--surface-inset);
padding: 1.25rem;
}
a {
color: var(--link);
text-decoration: none;
transition: color 0.2s ease;
}
a picture {
cursor: pointer;
}
a:hover {
color: var(--accent);
text-decoration: underline;
}
pre code .key {
color: var(--code-key-color);
}
pre code .string {
color: var(--code-string-color);
}
pre code .punctuation {
color: var(--code-punctuation-color);
}
pre code .comment {
color: var(--text-tertiary);
font-style: italic;
}
pre code .sosumi-entry {
background-color: var(--surface-inset-deep);
display: block;
border-radius: 0.5rem;
}
pre code .dimmed {
opacity: 0.6;
}
section header> :first-child {
margin-top: 0;
}
#disclaimer {
color: var(--text-secondary);
}
#haiku {
display: flex;
justify-content: center;
align-items: start;
flex-wrap: wrap;
position: relative;
flex-direction: row-reverse;
font-size: 1.25rem;
line-height: 1.8;
letter-spacing: 0.1em;
}
#haiku span {
writing-mode: vertical-rl;
}
#haiku figcaption {
writing-mode: vertical-rl;
text-orientation: mixed;
font-weight: bold;
font-size: 1.5rem;
position: absolute;
right: 0;
top: 0;
display: flex;
align-items: center;
}
#haiku figcaption ruby {
line-height: 1;
}
#haiku figcaption rt {
font-size: 1rem;
}
@media (max-width: 768px) {
footer {
display: block;
}
#haiku {
font-size: 1.5rem;
padding-top: 2rem;
margin: 1rem auto;
}
#haiku figcaption {
position: static;
margin-right: 1rem;
height: auto;
}
}
/* Custom text selection colors */
::selection {
background-color: var(--accent);
color: var(--surface);
}
::-moz-selection {
background-color: var(--accent);
color: var(--surface);
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
const logo = document.querySelector('.logo');
const audio = new Audio('./sosumi.m4a');
logo.addEventListener('click', function () {
audio.currentTime = 0; // Reset to beginning
audio.play().catch(function (error) {
console.log('Audio playback failed:', error);
});
});
document.querySelectorAll('.mcp-tabs, .cli-tabs, .skill-tabs').forEach(tabGroup => {
const buttons = tabGroup.querySelectorAll('.tab-button');
const panes = tabGroup.querySelectorAll('.tab-pane');
buttons.forEach(button => {
button.addEventListener('click', function () {
const targetTab = this.getAttribute('data-tab');
buttons.forEach(btn => btn.classList.remove('active'));
panes.forEach(pane => pane.classList.remove('active'));
this.classList.add('active');
document.getElementById(targetTab + '-tab').classList.add('active');
});
});
});
});
</script>
</head>
<body>
<header>
<h1>
<a href="/" accesskey="1">sosumi.ai</a>
<svg class="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img"
aria-label="sosumi.ai logo" title="You couldn't sue a face like this, right?">
<!-- https://www.streamlinehq.com/icons/pixel?icon=ico_girK3NdW2U5HOWO0 -->
<path fill="currentColor"
d="M21.72 4.575V0H10.29v1.14H5.715v1.148H2.287v8.002h-1.14v2.28H0V24h24V4.575zM5.715 22.86H1.148v-6.863h4.567zm0-8.002h-2.28V3.428h2.28zm1.148-12.57h3.427v1.14H8.003v11.43h-1.14zm3.427 2.287v10.282H9.15V4.575zm1.14 18.285H6.863v-6.863h4.567zm11.43 0H12.578v-8.003H11.43V1.14h9.143v3.435h-3.428v1.14h5.715z" />
<path fill="currentColor"
d="M19.433 15.997h1.14v1.148h-1.14zM19.433 13.717h1.14v1.14h-1.14zM17.145 17.145h2.287v1.14h-2.287zM16.005 15.997h1.14v1.148h-1.14zM16.005 13.717h1.14v1.14h-1.14zM16.005 5.715h1.14v2.287h-1.14zM14.857 8.002h1.148v2.288h-1.147zM13.717 10.29h1.14v2.28h-1.14zM13.717 2.287h1.14v1.14h-1.14zM12.578 12.57h1.14v2.287h-1.14zM8.002 18.285h2.288v2.287H8.003zM2.287 18.285h2.288v2.287H2.287z" />
</svg>
</h1>
<p class="tagline">
<span>Making Apple docs AI-readable.</span>
<wbr />
<span>So sue me.</span>
<br />
<em>(Please don't actually sue me)</em>
</p>
</header>
<main>
<header>
<p>Ever notice Claude struggling to write Swift code? It might not be their fault!</p>
<p>
Apple Developer docs are locked behind JavaScript,
making them invisible to most LLMs.
If they try to fetch it, all they see is
<q>This page requires JavaScript. Please turn on JavaScript in your browser and refresh the page to view
its content.</q>
<br />
</p>
<p>
This service translates Apple Developer documentation, Human Interface Guidelines, WWDC sessions, and external Swift-DocC sites into AI-friendly Markdown.
</p>
<p>
Access it in your <a href="#http">browser</a>, over <a href="#mcp">MCP</a>, from the <a href="#cli">command line</a>, as an <a href="#skill">AI skill</a>, or with an unofficial <a href="https://chromewebstore.google.com/detail/donffakeimppgoehccpfhlchmbfdmfpj" rel="noopener noreferrer">Chrome extension</a>.
</p>
</header>
<section id="http">
<header>
<h2>HTTP Usage</h2>
<p>Replace <code>developer.apple.com</code> with <code>sosumi.ai</code>:</p>
<dl>
<dt>Original</dt>
<dd>
<code><a href="https://developer.apple.com/documentation/swift/array"
rel="noopener noreferrer">https://​developer.apple.com​/​documentation​/​swift​/​array</a></code>
</dd>
<dt>AI-readable</dt>
<dd>
<code><a
href="https://sosumi.ai/documentation/swift/array">https://​sosumi.ai​/​documentation​/​swift​/​array</a></code>
</dd>
</dl>
</header>
<section class="examples">
<h2>Examples</h2>
<ul>
<li><a href="/documentation/swift">Swift</a></li>
<li><a href="/documentation/swiftui">SwiftUI</a></li>
<li><a href="/design/human-interface-guidelines/">Human Interface Guidelines</a></li>
<li><a href="/videos/play/wwdc2021/10133">WWDC21: Protect mutable state with Swift actors</a></li>
<li><a
href="/external/https://apple.github.io/swift-argument-parser/documentation/argumentparser/">Swift
Argument Parser (hosted on GitHub Pages)</a></li>
<li><a
href="/external/https://swiftpackageindex.com/pointfreeco/swift-composable-architecture/1.23.1/documentation/composablearchitecture">The
Composable Architecture (hosted on Swift Package Index)</a></li>
</ul>
</section>
</section>
<section id="mcp">
<header>
<h2>MCP Usage</h2>
<p>
Connect your <abbr title="Model Context Protocol">MCP</abbr> client to
<code class="no-wrap">https://sosumi.ai/mcp</code>.
</p>
<figure id="clients">
<div class="mcp-tabs">
<div class="tab-buttons">
<button class="tab-button active" data-tab="copilot-xcode">GitHub Copilot for Xcode</button>
<button class="tab-button" data-tab="cursor">Cursor</button>
<button class="tab-button" data-tab="vscode">VSCode</button>
<button class="tab-button" data-tab="claude-desktop">Claude Desktop</button>
<button class="tab-button" data-tab="claude-code">Claude Code</button>
<button class="tab-button" data-tab="other">Other</button>
</div>
<div class="tab-content">
<div class="tab-pane active" id="copilot-xcode-tab">
<h3>GitHub Copilot for Xcode</h3>
<ol>
<li>Open <strong>GitHub Copilot for Xcode</strong> and go to
<strong>Settings…</strong>
</li>
<li>Select the <strong>MCP</strong> tab</li>
<li>Click <span>
<img class="icon" src="/icons/square.and.pencil.svg" alt="Edit Config"
width="16" height="16" />
Edit Config
</span></li>
<li>Enter the following configuration:</li>
</ol>
<pre><code class="mcp-config"><span class="dimmed"><span class="punctuation">{</span></span>
<span class="dimmed"> <span class="key">"servers"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span> <span class="sosumi-entry"> <span class="key">"sosumi"</span><span class="punctuation">:</span> <span class="punctuation">{</span>
<span class="key">"type"</span><span class="punctuation">:</span> <span class="string">"http"</span><span class="punctuation">,</span>
<span class="key">"url"</span><span class="punctuation">:</span> <span class="string">"https://sosumi.ai/mcp"</span>
<span class="punctuation">}</span></span><span class="dimmed"> <span class="punctuation">}</span></span>
<span class="dimmed"><span class="punctuation">}</span></span></code></pre>
<p>For more information, see the <a href="https://github.com/github/CopilotForXcode"
rel="noopener noreferrer">GitHub Copilot for Xcode README</a>.</p>
</div>
<div class="tab-pane" id="cursor-tab">
<h3>Cursor</h3>
<p>Click the button below to automatically install the sosumi MCP server:</p>
<a class="install-button"
href="cursor://anysphere.cursor-deeplink/mcp/install?name=sosumi&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vc29zdW1pLmFpL21jcCJ9">
<picture>
<source srcset="https://cursor.com/deeplink/mcp-install-light.svg"
media="(prefers-color-scheme: light)">
<source srcset="https://cursor.com/deeplink/mcp-install-dark.svg"
media="(prefers-color-scheme: dark)">
<img src="https://cursor.com/deeplink/mcp-install-dark.svg"
alt="Add sosumi MCP server to Cursor" height="32" />
</picture>
</a>
<p>For more information, see the <a href="https://www.cursor.com/docs/install-mcp"
rel="noopener noreferrer">Cursor documentation</a>.</p>
</div>
<div class="tab-pane" id="vscode-tab">
<h3>VSCode</h3>
<p>Create a <code>.vscode/mcp.json</code> file in your workspace and enter the following
configuration:</p>
<pre><code class="mcp-config"><span class="dimmed"><span class="punctuation">{</span></span>
<span class="dimmed"> <span class="key">"servers"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span> <span class="sosumi-entry"> <span class="key">"sosumi"</span><span class="punctuation">:</span> <span class="punctuation">{</span>
<span class="key">"type"</span><span class="punctuation">:</span> <span class="string">"http"</span><span class="punctuation">,</span>
<span class="key">"url"</span><span class="punctuation">:</span> <span class="string">"https://sosumi.ai/mcp"</span>
<span class="punctuation">}</span></span><span class="dimmed"> <span class="punctuation">}</span></span>
<span class="dimmed"><span class="punctuation">}</span></span></code></pre>
<p>For more information, see the <a
href="https://code.visualstudio.com/docs/copilot/customization/mcp-servers"
rel="noopener noreferrer">VSCode documentation</a>.</p>
</div>
<div class="tab-pane" id="claude-desktop-tab">
<h3>Claude Desktop</h3>
<ol>
<li>Open <strong>Claude Desktop</strong></li>
<li>Go to <strong>Settings → Connectors</strong></li>
<li>Click <strong>"Add custom connector"</strong></li>
<li>Set <strong>"Name"</strong> to <var>sosumi</var></li>
<li>Set <strong>"Remote MCP server URL"</strong> to
<var>https://sosumi.ai/mcp</var>
</li>
<li>Click "Add"</li>
</ol>
<p>See the <a
href="https://support.anthropic.com/en/articles/11725091-when-to-use-desktop-and-web-connectors"
rel="noopener noreferrer">Claude Desktop documentation</a> for more information.
</p>
</div>
<div class="tab-pane" id="claude-code-tab">
<h3>Claude Code</h3>
<p>Run the following command in your terminal:</p>
<pre><code>claude mcp add --transport http sosumi https://sosumi.ai/mcp</code></pre>
<p>For more information, see the
<a href="https://docs.anthropic.com/en/docs/claude-code/mcp"
rel="noopener noreferrer">Claude Code MCP documentation</a>.
</p>
</div>
<div class="tab-pane" id="other-tab">
<h3>Other MCP Clients</h3>
<p>Sosumi's MCP server supports Streamable HTTP and Server-Sent Events (SSE) transport.
If your client supports either of these,
configure it to connect directly to <code>https://sosumi.ai/mcp</code>.</p>
<p>Otherwise,
you can run this command to proxy over stdio:</p>
<pre><code class="mcp-config"><span class="dimmed"><span class="punctuation">{</span></span>
<span class="dimmed"> <span class="key">"mcpServers"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span>
<span class="sosumi-entry"> <span class="key">"sosumi"</span><span class="punctuation">:</span> <span class="punctuation">{</span>
<span class="key">"command"</span><span class="punctuation">:</span> <span class="string">"npx"</span><span class="punctuation">,</span>
<span class="key">"args"</span><span class="punctuation">:</span> <span class="punctuation">[</span>
<span class="string">"-y"</span><span class="punctuation">,</span>
<span class="string">"mcp-remote"</span><span class="punctuation">,</span>
<span class="string">"https://sosumi.ai/mcp"</span>
<span class="punctuation">]</span>
<span class="punctuation">}</span></span><span class="dimmed"> <span class="punctuation">}</span></span>
<span class="dimmed"><span class="punctuation">}</span></span></code></pre>
</div>
</div>
</div>
</figure>
</header>
<div class="tools">
<h3>Available Tools</h3>
<ul>
<li>
<dl>
<dt><code>searchAppleDocumentation</code></dt>
<dd><strong>Searches Apple Developer documentation</strong>
<br>Parameters: <code>query</code> (string)
<br><em>Returns structured results with titles, URLs, descriptions, breadcrumbs, and
tags</em>
</dd>
</dl>
</li>
<li>
<dl>
<dt><code>fetchAppleDocumentation</code></dt>
<dd><strong>Fetches Apple Developer documentation and Human Interface Guidelines by path</strong>
<br>Parameters: <code>path</code> (string) - Documentation path (e.g., '/documentation/swift', '/documentation/swiftui/view', '/design/human-interface-guidelines/foundations/color')
<br><em>Returns content as Markdown</em>
</dd>
</dl>
</li>
<li>
<dl>
<dt><code>fetchAppleVideoTranscript</code></dt>
<dd><strong>Fetches video transcripts, including WWDC sessions, by video path</strong>
<br>Parameters: <code>path</code> (string) - video path (e.g., '/videos/play/wwdc2021/10133', '/videos/play/meet-with-apple/208')
<br><em>Returns content as Markdown</em>
</dd>
</dl>
</li>
<li>
<dl>
<dt><code>fetchExternalDocumentation</code></dt>
<dd><strong>Fetches external Swift-DocC documentation by absolute HTTPS URL</strong>
<br>Parameters: <code>url</code> (string) - External URL (e.g., 'https://apple.github.io/swift-argument-parser/documentation/argumentparser')
<br><em>Returns content as Markdown</em>
</dd>
</dl>
</li>
</ul>
</div>
<div class="troubleshooting">
<h3>Troubleshooting</h3>
<p>
If you're experiencing connection timeouts or network issues with the MCP server,
you may need to configure a proxy.
This is particularly common in corporate environments
or regions with restricted internet access.
</p>
<p>
Configure your MCP client to use a proxy by adding environment variables:
</p>
<pre><code class="mcp-config"><span class="dimmed"><span class="punctuation">{</span></span>
<span class="dimmed"> <span class="key">"mcpServers"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span>
<span class="sosumi-entry"> <span class="key">"sosumi"</span><span class="punctuation">:</span> <span class="punctuation">{</span>
<span class="key">"command"</span><span class="punctuation">:</span> <span class="string">"npx"</span><span class="punctuation">,</span>
<span class="key">"args"</span><span class="punctuation">:</span> <span class="punctuation">[</span>
<span class="string">"-y"</span><span class="punctuation">,</span>
<span class="string">"mcp-remote"</span><span class="punctuation">,</span>
<span class="string">"https://sosumi.ai/mcp"</span>
<span class="punctuation">]</span><span class="punctuation">,</span>
<span class="key">"env"</span><span class="punctuation">:</span> <span class="punctuation">{</span>
<span class="key">"HTTP_PROXY"</span><span class="punctuation">:</span> <span class="string">"http://proxy.example.com:8080"</span><span class="punctuation">,</span>
<span class="key">"HTTPS_PROXY"</span><span class="punctuation">:</span> <span class="string">"http://proxy.example.com:8080"</span>
<span class="punctuation">}</span>
<span class="punctuation">}</span></span><span class="dimmed"> <span class="punctuation">}</span></span>
<span class="dimmed"><span class="punctuation">}</span></span></code></pre>
<p>
Replace <code>proxy.example.com:8080</code> with your actual proxy server details.
For authenticated proxies, use the format:
<code>http://username:password@proxy.example.com:8080</code>
</p>
</div>
</section>
<section id="cli">
<header>
<h2>CLI Usage</h2>
<p>
Sosumi also provides a CLI that complements MCP.
</p>
</header>
<div class="cli-tabs">
<div class="tab-buttons">
<button class="tab-button active" data-tab="rt-node">Node.js</button>
<button class="tab-button" data-tab="rt-bun">Bun</button>
<button class="tab-button" data-tab="rt-deno">Deno</button>
</div>
<div class="tab-pane active" id="rt-node-tab">
<p>Run directly with <a href="https://docs.npmjs.com/cli/commands/npx" rel="noopener noreferrer"><code>npx</code></a>
(included with <a href="https://nodejs.org/" rel="noopener noreferrer">Node.js</a>):</p>
<pre><code>npx @nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array</code></pre>
<p>If you use it regularly, install it once:</p>
<pre><code>npm i -g @nshipster/sosumi</code></pre>
</div>
<div class="tab-pane" id="rt-bun-tab">
<p>Run directly with <a href="https://bun.sh/docs/cli/bunx" rel="noopener noreferrer"><code>bunx</code></a>
(included with <a href="https://bun.sh/" rel="noopener noreferrer">Bun</a>):</p>
<pre><code>bunx @nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array</code></pre>
<p>If you use it regularly, install it once:</p>
<pre><code>bun i -g @nshipster/sosumi</code></pre>
</div>
<div class="tab-pane" id="rt-deno-tab">
<p>Run directly with <a href="https://docs.deno.com/runtime/reference/cli/run/" rel="noopener noreferrer"><code>deno run</code></a>:</p>
<pre><code>deno run -A npm:@nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array</code></pre>
<p>If you use it regularly, install it once:</p>
<pre><code>deno install -g -A npm:@nshipster/sosumi</code></pre>
</div>
</div>
<h3>Fetching Documentation</h3>
<p>
Fetch any content type supported by the MCP tools —
API docs, Human Interface Guidelines, WWDC sessions, and external Swift-DocC pages:
</p>
<pre><code>sosumi fetch /documentation/swift/array
sosumi fetch /design/human-interface-guidelines/color
sosumi fetch /videos/play/wwdc2021/10133
sosumi fetch https://apple.github.io/swift-argument-parser/documentation/argumentparser</code></pre>
<h3>Searching</h3>
<p>Search Apple Developer documentation:</p>
<pre><code>sosumi search "SwiftData"</code></pre>
<h3>JSON Output</h3>
<p>
By default, output is plain text / Markdown.
Add <code>--json</code> for scripts:
</p>
<pre><code>sosumi fetch /documentation/swift/array --json
sosumi search "SwiftData" --json</code></pre>
<h3>Local Server</h3>
<p>Run a local instance of the server from the published package:</p>
<pre><code>sosumi serve
sosumi serve --port 8787</code></pre>
</section>
<section id="skill">
<header>
<h2>AI Agent Skill</h2>
<p>
Teach your coding assistant to use Sosumi consistently with:
<code class="no-wrap"><a href="https://sosumi.ai/SKILL.md">https://sosumi.ai/SKILL.md</a></code>
</p>
<p>
Spec-compliant clients can also discover the skill from this domain:
</p>
<pre><code>npx skills add https://sosumi.ai</code></pre>
</header>
<div class="skill-tabs">
<div class="tab-buttons">
<button class="tab-button active" data-tab="skill-claude-code">Claude Code</button>
<button class="tab-button" data-tab="skill-codex">Codex</button>
<button class="tab-button" data-tab="skill-cursor">Cursor</button>
<button class="tab-button" data-tab="skill-agents">Other</button>
</div>
<div class="tab-content">
<div class="tab-pane active" id="skill-claude-code-tab">
<p>Install as a reusable skill (personal or project-level):</p>
<pre><code><span class="comment"># Personal skill (all your projects)</span>
mkdir -p ~/.claude/skills/sosumi
curl -o ~/.claude/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
<span class="comment"># Project skill (just this project)</span>
mkdir -p .claude/skills/sosumi
curl -o .claude/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md</code></pre>
</div>
<div class="tab-pane" id="skill-codex-tab">
<p>Install globally:</p>
<pre><code><span class="comment"># Global instructions (all your projects)</span>
mkdir -p ~/.agents/skills/sosumi
curl -o ~/.agents/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md</code></pre>
</div>
<div class="tab-pane" id="skill-cursor-tab">
<p>Install as a Cursor skill (global or project-level):</p>
<pre><code><span class="comment"># Personal skill (all your projects)</span>
mkdir -p ~/.cursor/skills/sosumi
curl -o ~/.cursor/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
<span class="comment"># Project skill (just this project)</span>
mkdir -p .cursor/skills/sosumi
curl -o .cursor/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md</code></pre>
</div>
<div class="tab-pane" id="skill-agents-tab">
<p>For AGENTS-compatible tools, install as a reusable skill:</p>
<pre><code>mkdir -p ~/.agents/skills/sosumi
curl -o ~/.agents/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md</code></pre>
</div>
</div>
</div>
</section>
</main>
<footer>
<div id="disclaimer">
<p>
<strong>Disclaimer:</strong>
This is an unofficial, independent project
and is not affiliated with or endorsed by Apple Inc.
"Apple", "Xcode", and related marks are trademarks of Apple Inc.
</p>
<p>
This project is open source and available on
<a href="https://github.com/NSHipster/sosumi.ai" rel="noopener noreferrer">GitHub</a>.
</p>
<p>
This service is an accessibility-first, on-demand renderer.
It converts a single Apple Developer page to Markdown only when requested by a user.
It does not crawl, spider, or bulk download;
it does not attempt to bypass authentication or security;
and it implements rate limiting to avoid imposing unreasonable load.
</p>
<p>
Content is fetched transiently and may be cached briefly to improve performance.
No permanent archives are maintained.
All copyrights and other rights in the underlying content remain with Apple Inc.
Each page links back to the original source.
</p>
<p>
Your use of this service must comply with Apple's Terms of Use and applicable law.
You are solely responsible for how you access and use Apple's content through this tool.
Do not use this service to circumvent technical measures or for redistribution.
</p>
<p id="bot">
Fetches are made with the user agent
<code class="no-wrap">sosumi-ai/1.0 (+https://sosumi.ai/#bot)</code>.
For external Swift-DocC hosts, sosumi honors
<code class="no-wrap">robots.txt</code> rules and opt-out response directives such as
<code class="no-wrap">X-Robots-Tag: noai</code>.
</p>
<p>
<strong>Contact:</strong> <a href="mailto:info@sosumi.ai">info@sosumi.ai</a>
</p>
</div>
<aside>
<figure id="haiku" lang="ja"
title="Sosumi: With plain ink I write / Apple's wisdom to machines— / Bridge-building autumn">
<span>素墨で書く</span>
<span>林檎の知恵を機械へ</span>
<span>橋渡す秋</span>
<figcaption>
<ruby>素墨<rt>そすみ</rt></ruby>
</figcaption>
</figure>
</aside>
</footer>
</body>
</html># sosumi.ai - Apple Docs for LLMs
Ever notice Claude struggling to write Swift code?
It might not be their fault!
Apple Developer docs are locked behind JavaScript,
making them invisible to most LLMs.
If they try to fetch it, all they see is:
> This page requires JavaScript.
> Please turn on JavaScript in your browser and refresh the page to view its content.
This service translates Apple Developer documentation,
Human Interface Guidelines, WWDC sessions,
and external Swift-DocC sites into AI-friendly Markdown.
Access it in your browser, over MCP, from the command line, as an AI skill,
or with an unofficial [Chrome extension](https://chromewebstore.google.com/detail/donffakeimppgoehccpfhlchmbfdmfpj).
## HTTP Usage
Replace `developer.apple.com` with `sosumi.ai`:
**Original:**
<https://developer.apple.com/documentation/swift/array>
**AI-readable:**
<https://sosumi.ai/documentation/swift/array>
### Examples
- Swift: <https://sosumi.ai/documentation/swift>
- SwiftUI: <https://sosumi.ai/documentation/swiftui>
- Human Interface Guidelines: <https://sosumi.ai/design/human-interface-guidelines>
- WWDC21 — Protect mutable state with Swift actors: <https://sosumi.ai/videos/play/wwdc2021/10133>
- Swift Argument Parser (GitHub Pages): <https://sosumi.ai/external/https://apple.github.io/swift-argument-parser/documentation/argumentparser/>
- The Composable Architecture (Swift Package Index): <https://sosumi.ai/external/https://swiftpackageindex.com/pointfreeco/swift-composable-architecture/1.23.1/documentation/composablearchitecture>
## MCP Usage
Connect your MCP client to `https://sosumi.ai/mcp`.
### GitHub Copilot for Xcode
1. Open **GitHub Copilot for Xcode** and go to **Settings…**
2. Select the **MCP** tab
3. Click **Edit Config**
4. Enter the following configuration:
```json
{
"servers": {
"sosumi": {
"type": "http",
"url": "https://sosumi.ai/mcp"
}
}
}
```
### Cursor
Open this deep link to automatically install the sosumi MCP server:
[Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=sosumi&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vc29zdW1pLmFpL21jcCJ9)
### VSCode
Create a `.vscode/mcp.json` file in your workspace and enter the following configuration:
```json
{
"servers": {
"sosumi": {
"type": "http",
"url": "https://sosumi.ai/mcp"
}
}
}
```
### Claude Desktop
1. Open **Claude Desktop**
2. Go to **Settings → Connectors**
3. Click **"Add custom connector"**
4. Set **"Name"** to `"sosumi"`
5. Set **"Remote MCP server URL"** to `"https://sosumi.ai/mcp"`
6. Click "Add"
### Claude Code
Run the following command in your terminal:
```shell
claude mcp add --transport http sosumi https://sosumi.ai/mcp
```
### Other MCP Clients
Sosumi's MCP server supports Streamable HTTP and Server-Sent Events (SSE) transport.
**If your client supports either of these,
configure it to connect directly to `https://sosumi.ai/mcp`.**
Otherwise,
you can run this command to proxy over stdio:
```json
{
"mcpServers": {
"sosumi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://sosumi.ai/mcp"]
}
}
}
```
### Available Tools
- `searchAppleDocumentation` - Searches Apple Developer documentation
- Parameters: `query` (string)
- Returns structured results with titles, URLs, descriptions, breadcrumbs, and tags
- `fetchAppleDocumentation` - Fetches Apple Developer documentation and Human Interface Guidelines by path
- Parameters: `path` (string) - Documentation path (e.g., '/documentation/swift', '/documentation/swiftui/view', '/design/human-interface-guidelines/foundations/color')
- Returns content as Markdown
- `fetchAppleVideoTranscript` - Fetches video transcripts, including WWDC sessions, by video path
- Parameters: `path` (string) - video path (e.g., '/videos/play/wwdc2021/10133', '/videos/play/meet-with-apple/208')
- Returns content as Markdown
- `fetchExternalDocumentation` - Fetches external Swift-DocC documentation by absolute HTTPS URL
- Parameters: `url` (string) - External URL (e.g., '<https://apple.github.io/swift-argument-parser/documentation/argumentparser>')
- Returns content as Markdown
### Troubleshooting
If you're experiencing connection timeouts or network issues with the MCP server,
you may need to configure a proxy.
This is particularly common in corporate environments
or regions with restricted internet access.
Configure your MCP client to use a proxy by adding environment variables:
```json
{
"mcpServers": {
"sosumi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://sosumi.ai/mcp"],
"env": {
"HTTP_PROXY": "http://proxy.example.com:8080",
"HTTPS_PROXY": "http://proxy.example.com:8080"
}
}
}
}
```
Replace `proxy.example.com:8080` with your actual proxy server details.
For authenticated proxies, use the format:
`http://username:password@proxy.example.com:8080`
## CLI Usage
Sosumi also provides a CLI that complements MCP.
### Node.js
Run directly with [`npx`](https://docs.npmjs.com/cli/commands/npx)
(included with [Node.js](https://nodejs.org/)):
```shell
npx @nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array
```
If you use it regularly, install it once:
```shell
npm i -g @nshipster/sosumi
```
### Bun
Run directly with [`bunx`](https://bun.sh/docs/cli/bunx)
(included with [Bun](https://bun.sh/)):
```shell
bunx @nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array
```
If you use it regularly, install it once:
```shell
bun i -g @nshipster/sosumi
```
### Deno
Run directly with [`deno run`](https://docs.deno.com/runtime/reference/cli/run/):
```shell
deno run -A npm:@nshipster/sosumi fetch https://developer.apple.com/documentation/swift/array
```
If you use it regularly, install it once:
```shell
deno install -g -A npm:@nshipster/sosumi
```
### Fetching Documentation
Fetch any content type supported by the MCP tools —
API docs, Human Interface Guidelines, WWDC sessions, and external Swift-DocC pages:
```shell
sosumi fetch /documentation/swift/array
sosumi fetch /design/human-interface-guidelines/color
sosumi fetch /videos/play/wwdc2021/10133
sosumi fetch https://apple.github.io/swift-argument-parser/documentation/argumentparser
```
### Searching
Search Apple Developer documentation:
```shell
sosumi search "SwiftData"
```
### JSON Output
By default, output is plain text / Markdown.
Add `--json` for scripts:
```shell
sosumi fetch /documentation/swift/array --json
sosumi search "SwiftData" --json
```
### Local Server
Run a local instance of the server from the published package:
```shell
sosumi serve
sosumi serve --port 8787
```
## AI Agent Skill
Teach your coding assistant to use Sosumi consistently with:
`https://sosumi.ai/SKILL.md`
Spec-compliant clients can also discover and install it from this domain:
```bash
npx skills add https://sosumi.ai
```
### Claude Code
Install as a reusable skill (personal or project-level):
```bash
# Personal skill (all your projects)
mkdir -p ~/.claude/skills/sosumi
curl -o ~/.claude/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
# Project skill (just this project)
mkdir -p .claude/skills/sosumi
curl -o .claude/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
```
### Codex
Install globally:
```bash
# Global instructions (all your projects)
mkdir -p ~/.agents/skills/sosumi
curl -o ~/.agents/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
```
### Cursor
Install as a Cursor skill (global or project-level):
```bash
# Personal skill (all your projects)
mkdir -p ~/.cursor/skills/sosumi
curl -o ~/.cursor/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
# Project skill (just this project)
mkdir -p .cursor/skills/sosumi
curl -o .cursor/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
```
### Other
For AGENTS-compatible tools, install as a reusable skill:
```bash
mkdir -p ~/.agents/skills/sosumi
curl -o ~/.agents/skills/sosumi/SKILL.md https://sosumi.ai/SKILL.md
```
Use this together with Sosumi MCP at `https://sosumi.ai/mcp`.
## Legal
This is an unofficial, independent project
and is not affiliated with or endorsed by Apple Inc.
"Apple", "Xcode", and related marks are trademarks of Apple Inc.
This project is open source and available on
[GitHub](https://github.com/NSHipster/sosumi.ai).
This service is an accessibility-first, on-demand renderer.
It converts a single Apple Developer page to Markdown only when requested by a user.
It does not crawl, spider, or bulk download;
it does not attempt to bypass authentication or security;
and it implements rate limiting to avoid imposing unreasonable load.
Content is fetched transiently and may be cached briefly to improve performance.
No permanent archives are maintained.
All copyrights and other rights in the underlying content remain with Apple Inc.
Each page links back to the original source.
Your use of this service must comply with Apple's Terms of Use and applicable law.
You are solely responsible for how you access and use Apple's content through this tool.
Do not use this service to circumvent technical measures or for redistribution.
Fetches are made with the user agent `sosumi-ai/1.0 (+https://sosumi.ai/#bot)`.
For external Swift-DocC hosts, sosumi honors `robots.txt` rules
and opt-out response directives such as `X-Robots-Tag: noai`.
**Contact:** <info@sosumi.ai>
User-agent: *
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
Disallow: /documentation/
Disallow: /external/
Disallow: /design/human-interface-guidelines
Disallow: /videos/play/
Sitemap: https://sosumi.ai/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://sosumi.ai/</loc>
</url>
</urlset>
ftypM4A M4A isomiso2freeV�mdat�Lavc61.19.101BU�����K`�ߵ5��+���t��$T��RI�ǔ@dx�l|FkS
�a��+� �)�;*1�O�T��_�>w&Mu��a0��^S�v;����!�3u�R��;�i��>9U���9G�;�����Śc��W�<.�f�;}CX��eJ w$\��z_(��,e}V!�������
��"���}2�r�6���U����eX���J��ZE��P�sI�����c(NQ�g�[�RE��V���ޱ]��c��8�"�|^�M!Ll���|@�i��4'.�bI������{��{������}��3�������T����3�_�*U��;��\p�P{wj`���R\�c��G��<K��w�Y��JMw_+A�g�n�ǖ��EB���ϻ�Բq)$�s�_��}�����5��o[��@�ǯ�'����$��Ics�lp���������D�J���aKT� t��ӿy��+��r[VM���v�iq�س\SL��:U#q�ͨ_���]C�v�w�&��ƪ*��H��(�y����EA����D�������O���;�<�q��T�ev�d�WrlR��Y��������T�l��L>����j�Λ9��(��(-[����6 b<���_�����8����o^~�������������3�מ*;�����0C�3�{����Vn��1)�j�C�,����u��r�`$B�� xf����nR��[W�!L��Ǽq�������m�`��j��몭~��W�^~3��|�����'���ӟQ�Ƨy]�Tm0wU;&~��DǬؿӓ2Ô�c/c��c)��mi�����������&�kپ�7,��
,���004���%�M��NA?x �Nj��|�A�t���LrS��h��kV4�:�?�k�}l鹲.��۠|��L�`����g����+?��rc,s�v�\��I([�=���.�;^��UlkR�ڗ���r��pES����?��u�
��_�{{g�:����������@;���u\��j�i��`�QE�mX�9ŀ9Dw��2Q��vC��r�oOm��1o
4 <�Cqў[7t|KD�-,���p!L�����@�d4%�z�_1/���~��Z�����9����X������a�bwb����B�F�C8-�1yrqsD �>,O}�;.?�pL2�χ��BL�d��8!q��~����q��Z��o����4<����$5iLF|`8y?�����HB��a>�#M��1RZ�>*����#T�y(�h���-���$�@�C�S�R��]u��=�Z�,+�m��8����I|�W��+&��x֖x� �T8%2z�^ǯo�~��^o��y�\W��ŀ����\��Q.{�[��c�Ѣ"rF���9���Ѫ��g���a��Lp!z����p� �:���o�������\f��1v���=�I����}Pk�u������x�r4t��ĺj�eJw��"װ�0��L9�]4��[�t�"�]��8M���[M��f_O���[2�u^Ӫ���#�%�����h�4�����c��T+8C��r(��xC.W|!�B�PR�d��� >�"��=Y�b[�M�`��:�����߯>+��9��$���n}���W5� AL�B.����q��k�F1z�}�6��b-0�<�/[dC%ntc���Nr�6��(,��n�!*�����u��5�B�sL��^~>�kճ���n��$�M{��!�[��s�ߺ���'�OV�'D~��<�O�'�91����,fY�����"�n��
!��K�^V�/*�oFR�q��
�� ��~?��/�c�7��6n������ɱ�$pWu<������5B��?'g{f�� 4���7���]�%{r�)���Qr�'�" V\�S���M!��k��q{�g�1�B4����ߟ?_�gi2���U������g�}��'�Q2��9h, �#t�����(Ζ���V�lj�ŕaRyQ;���ca���HaW�J��&�УH�] z��@�����m�p!L��Ǽm��I�jPM�L�^g��TB����%�kW�~��^����ߎ�?����_m{
l_D�-��ֳ�����A��p��Og�~���<j���4���TL��_/�D_/�QE��|�E�����"S6Fl��ĝ$���?�}�仇���*��N�H�k���p�]�8&1��,)F9��3�{����vvvsd��#J�AP&��$���Unx��,*�{:�&R)~=��������^}�kY�B���Ni�Zd�馛�O�Bsw�g �/�bF������:���k~߷��%�h?G�/������W��s������(�~��Wq@�L ���*���a�`��yӳ3"��H Z��������8��� ڏ%p!z�ou�n���z��n{�����ۍ��R"�2I$�9':��x�U������X�٪q��:+��E�R>���m�i�w��z�S`��w�OeXkU�/3|
��hɫ�n�f����fǯ�0�&`BgN=x��^;�4�̀�[����w��9��۾��||N�+=1#Ր�^����?_�Ƿ���k8�C�H�"|j�A
X�Tߦ�E�\JR�6`���#�^?ocrO.P~��yvJ{4�a��c:���pD�:�JS�����y0�}�������>w���>Y;��330=xwa��t�8̜!�����p��ZbD�L/\=�?�����+��T����_��7����I� �;-�.��M��f��H�������$a�/v��6����)
},� ��q?��vȧ�4��s�X�k��=��6�ev�������?�� ds�!�2��%��d���q�B Cy����ӆtΞ����0+���I��A��>!��~�{�����_�8Ԯ*��}MK���0h���q��GSuN�{:����M�sS��Fau�����;rl�����P �\M�8��O�hʊ�z�^��,�Մ����i�85v� �,j)����W��z.<�B�V�$���u��J!��ߞ�o� �d- B!�@" ��{��?Ϸ����R��U��ֽ���~B�x�1X�I�Z�sT�JG�O����(��6M�y��ŧDp�aY�{��I�"6�7�|����.d��&c�OB.ujՑ~,zg_�j��d�s��H Y��$y�P�E�&�-2�I,&U�DRe ���)�x��4{,狄DЈt~�C��_������������˪���ۅ�w@�?�ܪ���=,2��L(2�֥&D�s���M���V���
ԭL3ϪPɿ�w�R�l��g���Â%n��7��"ڝd\�7_PhF8����R��������AM[�9��u�
A��?*�+Bq�!���Z�t�iD ��ퟧ��no��ׯ��j�W��?;�ag���DĎ��ᨅ���+�L�/S"���
R0�AD��#��Y;��dy]����L�9}�Uf��9_n��O��u��H�onV���c������"Ҫ��yY�I��B�&h�<��t��[8 \!M��)e��"�q���d�!x^���������ܿ9�6���ּ��+A�y�zx� �{Կt��b(���J4lI��t\i
�+�l�g�T�ud���kaݗ&���W�����7{��28� xU��+�u1�E�0���N�sA�+S{U*���e�"���-Ne�r.^�`��`�!������U�۾�}�]�K\��=u�
2���Wƿ���IH*���ty'��Jj�,~fL�/F�+��&������ˠ��f���
�+�<|-S+���U��LJ1]AM�Z�HԯP�7T;�7&�8in�]�����^���#&�m��L�@ D��D�r��Ȥ������e����]3}j��y��
�!��<�F�l(4�YUQ\��np���5�X�n�ٴ�l+ܐy�g�]+�O�kifc|�x
���0a����G�y�f�*o���t6�e��B�}���&��Y;~~���e��Pj�*�PS��"���|#RN�$Sqy��>(�d�w!ʑ�[�!���������Zo˩f�~q8��EKJ�v>�*>���98]x3ج����!}2Dǧ❝n�a�I���b┻=��02� �k�GZ�>��0f�Y�{��h�?�7|����c�mP\��az�θ�����\�6�Z9F� cPS�4@�̏�ԮSLY��1���l�����M�u2�w�����6����Ԁ����A���!���MJ.���:�USs�7w�T@�l�s��0B��L鴃;���\�����í�+��<�=��"v��)
��1��Kʯ�*̮V��uz��)��O�b|/�F��fhOQ���z�ߛ"��2��\!�A�k����[_����q���+�jf����^Er Tn�0_�!]��7����8��$�$t�H>�*�ĘM�bۭ��yvQ�TS7s�{����w�3sN+dܹF��ԕ�~�k�)-s����[z��O}�_�9xX 5��k��_���k(Ri`JD'<�9�NvUF��{���i�5a�w'J��퇾@�p�0���5����}kϿ�N&jJ����8��e @[]�S')�����c]Iű�I8���<���?�В2U'pt�L��3�?uW�j���?`�r\}�2h�A?�ʓ��S1���lc�Rp+1�R���V4I1�[
�0�J�ˌ�?I��u� ���!�K>��XC�螸�>����ehU>+\%��O��pSۡ�<�K
�0�m����{�y�G[���ќ�'2�.��7���1��95��|����Ә��n:��w��/^�����7�T �^�~4cwA�.��x:AB�EuR^ע�1T�q��N�������������מ�����7�T�4?�A�Uo��>�R�͕����p+uW��Id6y��|�k����D�6�b�C�x�V�r����/�^�yۇ�� !�-�������r��?l�ڣ��{�^!�_RkV���\z������� V��$���Vt�!����*3�n����>����=Mjn�7�p_=�>�f��'([�
Dž��gQ?�7X�eC��/�y��U(�w���5�d��Ka�^ȷ��:�U�3�.l�w_W�/������J�^�r���'~�����}-{[Tc���i_&B���~A4�<r��X�`;����� ([�!ѽ_���O<��ּ{8���c1p
+�^��\;��
�/�Z�\
_#���^���W�[��G��캝zeȠ~�?~w�Ch���) �aë\���S�-����_y�+�Uy���(B���]��]�`K��G���aE*��u�l?se�#�9��!��wj�B��o�_���?�k�jW����L�@�R�C>�l���x��}QJ��7N�j���\*�yU�lh���HԀ�:�q���_��?n�U��MLY����� R3�~
gj�I�h=]z�[���~�ܳ*>Z/�ecp��o�v��OW��|S��o�!��r;�N��+�nT} �5��ߟ�������[��]8S��� AMd_jh���$�_k�����.�!)���
�]���T9$5���QDZ��sc�շT�N3͑��bࡤ}ް5��D��sY�~�.�������Z�����>Ght�c�]�DV�[�j�U�����* ��R���!J�����4f���>?>|�_R���Sm݊B|C��Egp;�Tw�cg���~σ����yc�
V�(�zv2�S
Y`�Gh.�������f�<�v��8��s&��hY�X�q_yX�O��=ݗ'�p_��Z'.� jN�˃Ia��_����� �����!T��4ϏB���Z Ab�7v��|x�?m}-�\ם�m��u��8Kt��rd�)�.������U�#�Pdl�w
�#(pOB���3&�R��@A�$8�œ�!{~��[r��%����*W�9�}�}({H\~��ֱ�i&�^��U)���������a��*����-,[���륂[$�$���m~hA�!�)v!�!N%n��ntV��^���9��Y'��ѼKM�&���.��_?��|n�����C&���u�����Cu�7�0D�i�4ag�x�یtE�l��V�}��!�Z7K�=������rvL��Yt,&�OK��ɳ�>�2I��(`��IQ���j
H+���c�]��lY�yçK�Ρ��ER���>�����=�������߇����Qó���#:[�f�
�C�����
ՊT"�Ƕ���x�B̫�v���ުLc�]%7Rk�k�[�3��Nk�'5F�vW��Y��ـ���[t�O�W�9m�2��8Sw�Y(N$���C�qs��0� �ɲU� ��!IM��.�!"U���ۻ��x�����oy�<�:����~�����öO�M?6�OY��JőjB�X\�Ɩx=
��Ċ_�lm���^K�~'7�9A�����>���m��ڡ�k���I�`�6�����6�ŷ�~�Ĺ�1ݛ6�H,�:?�>_��{д6
�%���� 0%@�`ٞ~7��F+ΓE�I;� $z�|{������+��{�A#���O ��B ���2N |U �FYp�/��[�E���ɲ���e�L|��G��D��n�=��$u�tUr��q��h�y�뚏0�-,tz�"=�oM��,l��zjW��.������T�^#�2I��W٠�z+��.��`l�?��!OU��n�#u���[��+u��˙�����a8#�^�����,�\%9�:��f���u[��#�ʯ�e�5�+֟���ꌻ����U�I��@=!b �/�24����JY�Xi_�9�@v�d��8����JI���0|�'�_Ϯjᘭ�Z�6m����IZ�I�u�����ۯ��w�7Ywy[�A�R�3���;�=>�@�o�de0�}[i�f6�������f����aUx����u�<÷b��+�ep��+��3��T�
�Ek�)�Ob���1*�f�t�\x��K�#�%����.jKYC2�)��|��S��_U?i�!H)jw�n�##\�}���?y��Ĺ%�_z���ߖ�H��iP?0ΡFɡ��X��S
�)!���ݟ{'3g�vE�B`��}�@'�י����(D.}w��<ך9S�����!ÿ��}��j���yʼ��"ޙKL3��4fʌ�4�B6v�ķYwt�����jG��o�mq��j�ۻF{�����}���[�z��1s��N][DdR�p�2lYT��g`�,�*�%���T|s���g�y��|s��ұ�n��ܹ
0lF<��&���&���?s�ԏ��,��x�(ǽ��`�e9�c;��t�H�B%4��#VԡdQ����
n�A��!�����&G�Sx���s<ײI[��o:��K��ѽ��B����I�V�fTs��L>�O�s�*���f='�����+��d��Ñ�0�#��S���U-�T�m�9�]iM�؍�Q���ŅF�����v+��GyB����Ə�.��z*�mma��FƁTd{���55�=���U���k(��M�������5���Ʒ8_ %o3A^�B��Ȍ>����Ф��n�T����ӹN��
��z������J�U0=�ĩ�p�����7�9LX���|
*��:��w�-P�9��tЂ��V �<��j��^:SiZ�� �㻨�AT��M�7.���x5"S�L��[%���lX�!�/���B6������~>�����MZ��X��89*ay��s7�qz����
�����.��H_�eT�!z?����4�.X��ǻ�7�؞�f�/�6���F0�d�iז߱��1�������'U�gA=C�c�!��d���Y
���+�;��{B�*�H�m����w��^�m���z��N�~���/�qc C�~wF�x{�p݀G�W��Z�[��~]jD�'%��4�_���繰�DQ*��~�i8���9 ������6n(�E��XF^U����q��u�^���k���%#ߎN��WRK��������1�b��Y���sx��wn+5準!�_6]�B ��}�n���]��ML�nDž$D*6�8����V��2�m
jm��E��.~}��ֹ�S����+���$�.��;�ljX���2l�=Z����te�} `_S����?URo��D�-�6��ߤ����M��UROOh5�ӪҲ^J��&�,�e҆�����u7>&�j���M�o��`���D���V���ș�\�A��`D���oh�<}�m�S��:���9ؤ]u�� ��N)�����%4i.���2h�E�6W���d�G:���
���$��;ME�
����,ϫ�Lڞ���3���a�a���{�!��?q��Dmn�Ǿg��u��^�j�n��u���vO�t�<W���% [w�(�DR��M���A��!7Q����s��Ru��3��
��Q�D��tu}���IdRȹ�d�y!�����6��M�zG��:�6����/�u��B�xq:�7Ft��} ��ϑ-&6-[��>��KTU���!�=N~ٚ��w�w�j�n��m��+��x��oo��,��5E����x�:�W����"e��c��Z��;ݵ��� o<��Ć?�%b��o�:`��x=k�|�rk�>�no�R�z�\t��Ʊ;i��]mыM�i�͌n����VUv\6lhqza0��/���� [�!�Ol���Mҽ}������7-���}ñE���,��H<�Y�c��>:J^�g �>�'�"��bG�l�p��1�$�9��T��w-A�&̑���n;���Q�$�'�+��J3xhܨ��'��O����+��l�V��[=�'��@m�^�������$���'�AB!�5,�wa����ߞ���_��e��n?I����u�r�N���g�KDq�Z'��(��n�u9:��-w;��r��*����mbq�s����5�(i�U%�Dmǀ�����pG{�\���:���{���0>32�0ђ
�;���8T}"�zz�@�28KkT!�������!�w�m��H@��w��I����y�a�^��<�Q����i��c{f�AWs�w�@D�S����Č��G��@�`�h�J����O#z���:2P%��b�ʁ�S�����;��͞�!�U;?"F];=yZ�T�x&e��*Z��f
�k����]����)�d�s��Ho��Pj���1���Ǚ5.����_�+ �D���/�OF� ���*fA��1gASu�{T$w?,K�ʧ��SAFv^V�ߚB��{6�@D%�٬n�W}��������>z牍�l�n�Ga�[t���rze3�YX1a�*�q�av��c�z�ytu0��LJ�6+ɝ!e\!�H��n��� �ϗ��qǷ���.����ɀ���]}+��d�����Y��J�5�f�"�~(���6�IY]%�?���&J���)u����Ʉ�P��9��z�v%�|���̈Dzc�t�H�5�3�tj[��*��K��R��{þ���[���vֶ�k����N̍�v
����o�����~x��i�`����8� u7��!�{��G����B��E�>����g���U�H������&��V��
�D+����3����'�D��:����Q�6��%(�Ѷ�t�Mi�N�s�����)��Sͱƌ��Sj�]�M��ȓ-`�e������!�$�Lj��D@����}j��Z�o\3�!�1�\�k{��Z�]�����X.�PJ������D����WXŨ!����Ƞ&�n:��n���SY ��[J��@|�����'��y��~���#Dd^��O[}���P3fa�ئ�ּ�T�!���I���w��[���-����k+��1G��]�$6+;��\_������뇽s�k�X� ��Y?9��Wv���5L$�K\+��۴�� ���,����;�|�f�����t|��H
u�y����i:l���7���S��|���P� �:ܳ�5�n��B@?����;�鏛����0@�x����X��ĵ�t-�A�!���n���.z��|�u�x�+���Ц�o?�2%���2D��ݨsNL��G#w.�U�:sqd#���~�#�.7�4,z�1��c�LCv��^c�tP>*�����a&q��������Y��,S1a����*1f�V�E�ӗ���4��ý���Q�)�iZ�v�D`�_�_W�k��y�u�!7ɠ��C��>��6�?�LO���P
�$$H����b������e�;���Q:�����<�BB���ʥ�a�9���o6����T�W����p�
{��n��>���%�X�m~�r;:z��4D���Oo��x�yaa����KFQ���R��c�!���~�w@���s���{��<q��u~���?���>��A�xk�h���n��q}�r?�x�<���U.��3�q䜨���G��}x��"�m�O*�����{f]��@�v�i�����C&�?�%�k�>�:7��� $(��~]
�|y\t�c�9k�uT���X�O�
̋�:OUkl�w@��]W���|_�'Y��u~��×�ܿ���;W̃��l`"Y�]QX�����4�*k���a��GԵ�H c�qk�U�H���LA!$)])lXR�:KŽ6\�_���s��N��|�n�(c�
on�q"�$o$�9��T6u�mq�T�_U��5�6$���p!�8��w!W|��9����}�8�q���F?A8�9Tu19i҃k��<�2��ȑ�+�H�\CU�����0��)��� r�d��\#=��[t��@����:\Ois��r)�lf�c����^��Okgܥ��?w����9�ը�n/@�ˡ�J
ڇE��t�Dž�3$�����[9��:X�wA��w�'�w^�\N��{�C,���2j�_Hᲂ��PN��߶�
���r���u� �s��r`(g�aVz��L�;w�����H2ud���e�\�)�����A�������1��y��{����u(<?c`J$A�D8�k�����o���lN�!�o4���.�ه!L�؝��uY��]5��>�\nk�����b�kI�A0��������m8:�l���Lt�>i��K�x�D���;U(-c�
9<*���/�}�R�
l�T�Q�C�Y�#?��PJ'��i��鏲wZ��M����� gN|�?�e�}��~�)��j�+><v��O4ӽ��qs�]/E�S��w@�_�ι��{O��7�K�^�A3����u�#�L���v���E�!*���G�%ny�"]��L�bP�I��Ak&�uy�P��*JA�lu������l�)�w����R�˂����A@�=5������p��jlҭ���k��.7̰o����@j�9�6�i�S �HJ�!NIǑ�� �㎿?��o>�mN+����!��4�h:�]NgBf����1�՝I�6��&ͺ�u���s:B"�Ϧ�,�2X�B�Q�&��o���aq�XV����q
I����__h���H�xL�����9*{��JF����eP����f��ձ��x����LM�
�?�^-wt��������+J⽽����l���a T�4�-C��Uhɠ�"��:���#1HjDӉ���'���8��UvGT�C�&���RA�e��^�~�ƿi�|P������&��J��Y�tDK���,^U :�W[�<��1S�"cƒz��ss£���Fth"~Y�!IC^������5���x�j����~C|}�\*�۾W��
$Iv
��� ��?yq��蓤��DN�2Yc���Oܐ#VE���WQ'��M�L�V�ݥ�2��o\X����VC�:�{�>�����%5d�B2]��+�w�p2>'�j7P>>������z!R>c膫��t�g���Ʃ�ߛ����y��YV���|���[]C�VD���5�����@��W�N���u)3$��H��G���%���8̱�X���Dd|��R�/�������A|�s��-�����c��f��\3;}�]�98vqm�'�&��%�<};�c�Ok�0���1��Q���!M��y��A�ʟ������Z�������|��~��2wm���j85%>�$@��$-��E�kbx-��L��.�>p�C̚��eǗ�d�zFL�\���Opn����}ޱ.��Әr�ۧ��F=�
��"`��98�n@�����]�Ia�
1�R٘�2�Ú����N}�x϶q���Z�8�����s�!7�i�˟�;L�%r�Te�L�������:��,K�#_�����m@L�X�I �t����۸V��9Da�c�\g��~��~���ְ����6ޭ�I�+��yy��Rd3�ɰu��3����VNK�&E"Q(�^E�u�a���! ��[M��5����8�d�����~C��q�N��k��RvNVp��!��Di�[��U�~�o�P[�&$V֥l����܁|�fo/Qhϴ7Q:�~��伥��vCƌ�h��G�\J2�Иv@\�/���C'�t��R��'��:�����J�����+�6���S�[���Q��A�������X������>A�eyS�;��\]��*��X��y�5�vɒ,A{J�ƥZ��ᥒ*�#ɔ�ƈm�2f�ۤ\4����MY0��`H�������V�d<����s!!�o��'i���̂���SJ���8*$��%OH�fiU���.�o����y���_! D.�]܂�7����/���/_��x+R��@�����"��2 �d�\���r�� >����d�bm)���$ʘ�[�(�+�翸�# ��ꬃmk�Kf5tS��%�:�)��1��ޒʇIdbˢ��㒧L�x?f�E5��$�px)�c�JTt�p}c��<��W��}���������k����]��+�,h�c�:.���9IgY�D�ġa��D�<^ŷ�;�!G���{���j��/t0��mVq$�ŐG��wOVJ&�hj��������ikB+a3�Ԅx���ʺN"�T[袢���2mp�Bh�qI��z������u��X��!{Uق!o���C����^���_�_��:���s�A~KÛ�T�$M�&�d��$eR���lI$5;�,���';t����1ɳŝ�(�I&�Y�Mp į?�����S�{^�I�������+��?��7uc��
�
M[�H�y�-m�M�"�96�%�J�m��R�
�3����W�����5���МiE�w���s��p����C
�{V��rU�d�fvz���M�D��u�-(D�h����*���� ��P���o�<U����!�)��������$�Lj�<ρ��-O��Z݈�%��
��!5�b�� ���!�N�U��c ���{���̜i��������v�5���֧2�*�3��jN̝
ڻ�Q�e*����wT�%X�һ{个:��#*V��A���$��!��^�eϨ\��٤���d�>Y��VEl&��q�3P�b`�F�d�e3�Y��w;���_������j��o�����z��7ZjQy!^�'�iH�p�0%���=����rR_[�#RQ��n�ruaE�\�굨���H�U(��6�9�-����%� M�8}�6K������.�$��� �1>/[C��Ey k����!���}܂��g����uz����/�=�4�C�\��|V�AD��`y�!���&���Z��(�^`יXvt"2�QC%QՆ�D��:��,�3|�^h.2F}�K
n"q��C��d-�y�[�
lۤ/��R�d�Dq����d7 ���N(��-����ү�M�p
��;������G������
��T�H�ϣ�U������T�n���和:֡
6H�L�Z�I��v��z���3LE� �C� 2` �Y���bd�Dg}�����f<t��,��-R��#���6A1�q�.��t�u��i 0Ö��)����d x!������5&�)�p���/�����Q�eŰ~^1��͙��=�LY*Do���ɉ��`Xs�T���=�d
�x�����-���S�������lw� ��+��P/�zݵ��.d"6�&R������%!YV "��M"��2�A���ړ�����|��������`�����8���;�Oe�dԎ���+3�#�"X�'��
�����uE.^W�����D����ʐ$�3�7��%:� ��ar��)Rݚ�H��|� u��;�pe�B�C�t�����2��Õ��)���\!�1cUقAJ�~���s��N5����aYB!�g�t��5��giѕc��T���{���
%W)�ˬF~n�7I0diB�3]�Y�:���� q}�4:{>��#�3�c6��V�늗���j̀ך���Z�&�@�D9Pю[v���5�U��ܕ�o����s��������y<3d�싩2����B����Lru�N=2�p�����i9yh��T�S�%��^�K��D��]B"��i�����&͵��\K/OZ7�s�iXd-g��D9���%��}H�N�DN>
n�Ƌ�-�-��� �!�B����??_����{g��O�߯��%%7J�H�a�P�V�E�{�:+q���ˬd/Ǣ�Y��}�u4����y
q<�%v��������y�ϑ�^yZ������p�v$�S۫�#��7P�?'b:e
�
���r����'���?_���|�O��+���l�S9\Y؋"�&t�!�uZ���ݣ��|� 3��Q.�A�.�A�a-��u�����s9g�## �6yE���"�Bf��=%4ff$� _23c��]#)7� bV1IL) ��H����pbV� ��뤋N!��z�ۋāo��>�������֫{�������T#
nJ'vEj�_T�2�3�.��� 5��$L:`4}�:d������Pť�[.���X��:K�<
��]T��4��gӆ�Z5��Y~��[t~�L��jI��I*w�I z����mقן�O���~�my�}���}���=3�[��Y|��:.My k�I���g�����ɂꋮ�\�x��)��K�|s2�ԤyT��! �iyRJ*�~��S��X�T��@��֜�L�A�2�'/2P�Τ�B4�\Xq8�!�H��[�ā~/�_S����Z>�&�Ϸ����1��Q�'ED�i��q��Z�t�B(�e֡���RH�R���D��s�*Q ��c�n�D!`H�ł���dE�q�{�m�G/�ۄ�P`��B
F t\�@@�]�Ik�� 2����?�0����ı0Lj����~���>�� ��y�*��+;$��j=�Eآ$g�(�V|=�YP�jt�7f�?Q��0�U�K�F�]�#�8�9��ov���o���8v���^�� (��E�+��:(�,�됃�e~�� ��I���!�����
������֧����_�ȺS(��w�"��K�� 2�Wp�L&|�J��L��K�V�d�ׅ8�O$#���+���hp�,�
��7� ��E3d�ÏL* �x�Wu
f�||����D�J��@ �Cn��K�0j�1,Hs������J���n'��u��M"'i~�P3�� ��"�Oї]�B��pd�����n�8�5����)B}�xHyK&�!�����%�{��u������ �P�J�;���N/L�3mҋv
�2��T�G�JC6���!�A���
��b@���o���ʞ_�����C2 ��o�s+ˤDI�NI� JCd�M!��Ğ]��")���@��~� ��&?�3��ڝ�@�o�A�������1?T��%K@]��D�>��#j<��i.�t��{���B
���5��ı G����}�~����o����<�^Sz��Ydm��ـ��@`�N�E�%%�4��z#c��d}����$E��� Bq�$��G�{IJh&eư^�����v%V��t1�|~��H2����,���@��� ȋ��5�!����ā~��>�o������_�5��y�ᡙ"6 AZ]2I%��9�����}R �� �4*z��O�}�&�m,)M���V[�m���=ME�{C55=i6�$���]����� �'kG�*�W�0 q� 0,�]���pA��/��g����=�k������V�\ ^�:Dc�+ V��y
H`q��#�<����T�D �X�(Ð�d�IX@빶
���f�+��[���Tr�TB`}�1H��-����r�j�5lk�D
�0�X�!���ű0\֣����5;�}����C2IlAkk�!�U��ϑq�|�`��D�����?��[�8�}��ʀd%
����w�APq�����p3PCx�
�����0�y��@ڌ'5��S�J�x�4�:��.�-������v�S�W����� ����U����Gx� 6]KR�$����:�Q��
�����W�2����*�(C�8$o��:6�
M]E@��׆��?��v҄�g�j%���Y�$���k�kh=�!�A����Aq��������}�i����p��u�@�
��@�l���=.S���EB|9<
���-������m k�S;!R�mkM������G��ȿل��-DUDL ��o2��y얓GS�g8��CJK ��ۏ���n�1,H�ۯ~�Uw%����Ɔd"@��5��ųx%�]9ZA����HaȾ�[���测����Q��'xX�_"TC'D��|,�bE��� ��T2:���쏂�j0��7&LH�_�撍��81� ql �[�N!���;{ā}��|O�����:���V�dI��f�FȱH*����jjR�c�v�����_2�0� �`��`wUL���p�X�$��l��9���x���F�4���y%���?�ր�@Bt<�d�ؤ(l��Q3���%��債�M�zc`�����^x���>�����H�_֩YQ����U¥��տ��A�#+G��O�4� �+pS(Z�?Kg�7�)��X<��Ғ��0�1c�>��]���lunBxL(���m�����H�i��! ;O{����^s���w\�����s��u4& ��
�T���W�d��>C\��C�'�T�"<|�g��~�WZ�M�}�c��_�m�*B��~���?���!���D�ȤWT�� shO6�Gk]b?�7��?O��ï��O���H�D6��U�teŢL@"����O�\M��Y�����8\ԅ�]軶|
P`R���A,�����?t��u�/�w �=!�'o+�a��Q>w?���!�E��+��A|u�}�}�Z��f��?����̄I!� ��Ǫ��Dz�Y�e���=�,�Rg��� VIoue"q�BW���U�e���t��9�v�{��X��
Iϓ�_�7���m�2�wc��gM#D2-%������%��5U��ޅ� ^o/W��ۊ�u�y�����;:��!C�-����B}��ㆶ�*���$R�!#���9���$H�ӎm����_sY~$YMR��f�����6��g!B�
�|#�������qD���{��!Π/����A}z��5����xeο������3{3�"î��bn�T����
a���v��Q�_������A�kv��
h�d���ˡ�=��z ���#�^C�K�!*ڭL�
+��ޅ�0_W�����w���.u�����3$�Hf� ~F������� h������$�F�$&��:�鎥���&�k�eQw~�k��-�;ɪؼ��U2;/7Gמ�t��ڷ�Q}�����>_�f�qj+8!ck��ԅ��{�����on��'�u�������A����y��vui�� d+bn��d�r&]��Z>:B��HJ�SǛPu��ؾEW�f�㹕��}6>�/�`s��8F�C� h��ń��Gb<���}��n7�����Z!�I Cd�@�1?;:�N��r}9iY1�=��%7�glG�����
�t1�2'B��l,�}�:8ꥸ��A/����u�:~��'�!*�%��#:CUf�!
�H���D6!�ϋ�<�������!�^����O'�ǀ��XE�0|���G?T ��O�1S�k�8�%�������1e���zD��mY:��̳?�#{����+�b �_�>~����o��O���n�e;��o
�q.@�r�N$9���D����^��Y�����#�Jگ�sWD������Q���8���+�}&O-�I��J��`}�%��^^�ݫ���!�X�s�C��D��Wކq�:�����`����ą��F��4L�,�ס����"����BHZ����E,�bd��e�C��������C�#28�D�'���P���j��19wg��ŵ�iqD
�DO������g������`"g���\ե7'j��|���s+��:n-�V��s�F����
��t�nd�cR�@ؒH�X����L#�7n~�!H����Kj@ǿY�������R�����?�߆�d���c�?U�ka]N���9��:^���CW�$j�f_f<*8]Rtc
VH��xʠS�0�NB��X�ķY�q+��Țaq����CX�iQDv#.}̶�y�<������nk��wL���>[Ǡ�
����d��l�r�lxY:�U��o����w*�C�<��ѽ��뛪�idI`���'��Ax��gl�i��4�߀!���ޥ�A�"
�����g^ޫ��K��O���A�O�����H�h��˩��#�~=��'�JNr��8V
Y��r�f��ښr-��[�N1<�E�C�0|l�)�;{��&� �����x�z�uR��������s�M˱;D��&��l�)o;~���S\BÅJ%>8m¶��_�W
�<�s�^�%��rI�pr���� W�N���;Tg!�Q[����H��y��YU��������� �^(�1�^M|�����W!���������
H���ừ
9(�_Ɛ�O#�x<�4�*Đ�b[�aԡ�]X���b!>9_~�=g��q����oA}�]�Hۿ��S�'���rj�F�9��
�5I���Okhy
�4Y��Ѩ��o>à��
^+*��C-:��\���-dF�l:x!���䅴��"�ā�����Wy��'������V���)�=��'�H$���g㫨�┩��=D�@\����f�r�mU֞����ɟed��M#-d���aBU"̱
RC��rRY��������T����O����Y�0M݃�f?���țFM�^.���mg���Ḋ�܉�@F���ڗU^���'H2e|1�3,O�'���/e��dx!�7[�
0
�DX̀1�s�������k^�������
{�����q�^���^���3��W�(��]�H+,g���:t�1������ċ��8�B����k��"C�O�����>�@�����fk���T���5�o���ߍ�S|� ��ݟ!<����I�T�'
8�Y��c�cNQ�J��|c1rs��2O#�&�d�0H�)��x&���5���� !����
�%��b� !%��{L����������ߊ�Ī���T��i��w@��gpK'�Xb�.�>f,�B��$��q�c�{_Zl�i��,� �F��2c�|�Y���{�c,�ޥ�)@J+��}�}�]�����;|�Vn����б���6̉�5�e����W�Z��W�`��"�k�b�KQ�w��\1`H�.����%�G&ˊÀ!O�ٽKf���V!����}�꾾�u�������+7�["����d�� �%�:ӏ(�t�����a+[�߀���*r�!����o�OK�%��͐��G�l���
W7�l�@
ģj��گ�~x�:�����xس%+ͧD�����v�z�gS��Ȳ#�w��ѱ�ف��w����y���WۧI՞� ,�8J�")6{Y�pa)3+���!��c��Y�`#%�Db���=�3�ֵ�������L�I"�$r���S�'��hB����&��oC��w�"�1���)����'.�Y;��F���3�$�T��8<�ѝ8k�����BG�^��y�ּ{{�ן���x�Jܷ�a��?�L�͉@>��t�G�ɣ���Fx�{%���7')��4'j�))�����`��.�$$�8^"��H�!!�6�� 8�"�0D 1~�I�^;�������g��=�-ֶ.�6S'��ban
��g�!߮��m�G����/�9?yE[���S�K<�ZIĬD'6�;
*���h�!Y�`#�DY_������������Ͽa�N����k�����8DiËE���dӕ�y�:�b��4h��bzb�hHi�Ɯ���Q|�8]x���i��"��!�ڣ��"Y��!��A5u'Ӻ�ǜ�~������L�J��]O��L�
*�#TLˤx5 1��A����w�W��Ͼ�Xb($"|5�YV%��#+��F��GdN@-��1ؘ"7�����x�T����������,���+��ұU�N�_�Ю�S�3Z�y(`&����*�q��($�����ʯ�Xݕ����8!Z��7D +9
!��������9������a5��Q�y��8���8^�:��@��#Ҿ'�O�����'����$����RD�?6��T8�l�
�C� D`
i/�����<_���O���y��阅!�<��%Eؤ��TD$��6z�cÙ��|�z�I�J�<'�����%�ǐ�prwvd����:u�!_ғ ���!�����"�e�V$�";�Ϸ^8��o����of�l� y:�̬i�$�C�T䔢��
��p>-�?�r�!�����"p4kq�1H92�UI,��H�Zk�V����*@���V$�!�]e����<\��������S��FܖӤ��yF��]�P�����}d%��!gF�hG&b1�W|?� �ᅡĹ.� ^F�!������gD6A(B��x���ϊ����o���{�Pig'��������j���'0�c/,�[��S`|�;ɟF&���6�b6{���Ia7
HV��=�=���|����� dA�D %����.:���%n��o�����`E��}�܀5&���7K�t��0N�xn��,�����rE#e͞%R�e�#��Kd�N�pg�������?�!���
�"�F!X�"0���W��8�������뚡����!b<0��ؐ���L�O4`��{��H�A��]Y?%лL�0J%��G�rbY͙,~��!,�R;�HL�7.��
呀7�H�AD!X�"0"��|s���������:d�`��~$a��$bI1�f���g�Cm����g�!6a j��4�H]�J���A�!�*R5��p"moovlmvhd�@Mtrak\tkhd@$edtselst�mdia mdhd��$�U�-hdlrsounSoundHandlerpminfsmhd$dinfdrefurl 4stbljstsdZmp4a��6esds���%���@��d����V���� sttsI�stscJ<stszJ*��]$^�Bbf^WR]TTN`PeT\O^L_XSS_VS[WVWN[OV,D*9.! �����������������stco,sgpdroll��sbgprollJaudtaYmeta!hdlrmdirappl,ilst$�toodataLavf61.7.100(function () {
const ctx =
(typeof navigator !== "undefined" && navigator.modelContext) || document.modelContext
if (!ctx) return
if (typeof ctx.registerTool !== "function" && typeof ctx.provideContext !== "function") return
async function runHttpTool(http, input) {
let pathname = http.path
if (http.pathFrom) {
const value = String(input[http.pathFrom] ?? "")
if (http.pathPrefix) {
pathname = http.pathPrefix + value.replace(/^\//, "")
} else {
pathname = value.startsWith("/") ? value : "/" + value
}
}
const url = new URL(pathname, location.origin)
if (http.query) {
for (const [param, key] of Object.entries(http.query)) {
url.searchParams.set(param, String(input[key] ?? ""))
}
}
const response = await fetch(url, { headers: { Accept: "application/json" } })
const body = await response.text()
let data
try {
data = JSON.parse(body)
} catch {
data = body
}
const text =
data && typeof data === "object" && data !== null && "content" in data
? String(data.content)
: typeof data === "string"
? data
: JSON.stringify(data, null, 2)
return { content: [{ type: "text", text }] }
}
function registerTool(tool) {
const registration = {
name: tool.name,
title: tool.title,
description: tool.description,
inputSchema: tool.inputSchema,
annotations: { readOnlyHint: tool.readOnly },
execute: (input) => runHttpTool(tool.http, input),
}
try {
if (typeof ctx.registerTool === "function") {
ctx.registerTool(registration)
} else if (typeof ctx.provideContext === "function") {
ctx.provideContext({ tools: [registration] })
}
} catch {
// Ignore duplicate or unsupported registrations.
}
}
fetch("/webmcp/manifest.json")
.then((response) => {
if (!response.ok) throw new Error("Failed to load WebMCP manifest")
return response.json()
})
.then((tools) => {
for (const tool of tools) {
registerTool(tool)
}
})
.catch(() => {})
})()